Jump to content

Clein

Members
  • Content Count

    28
  • Joined

  • Last visited

  • Days Won

    1

Reputation Activity

  1. Upvote
    Clein reacted to Kuroko Sempai in Duda sobre mensaje   
    ya esta solucionado eso se edita en el exe o en el parche de nemo.
  2. Upvote
    Clein got a reaction from jaBote in Hercules Plugin Manager (HPM) en Español D=!.   
    En esta segunda parte, os mostrare como gatillar una función antes o después de que ocurra alguna de las funciones del emulador.
    *Les voy a poner todo el código luego iré explicando:
     
    - Este plugin consiste en que cuando mueres, te suelta un cráneo, pero no como el del pk mode que se activa o en todos los mapas, o en mapas pvp, pero no solo cuando mueres entre pk, es siempre que mueres, este esta dedicado solo a si te mata un player.
    /* * Pluing programado por Clein para que cuando un player muera * en modo Pvp suelte un craneo, y solo sea cuando esten dos player * peliando * v 0.1! */#include <stdio.h>#include <stdlib.h>#include <string.h> #include "../common/HPMi.h"#include "../common/malloc.h"#include "../common/mmo.h"#include "../common/socket.h"#include "../common/strlib.h"#include "../map/clif.h"#include "../map/pc.h"#include "../map/guild.h" #include "../common/HPMDataCheck.h" /* should always be the last file included! (if you don't make it last, it'll intentionally break compile time) */ HPExport struct hplugin_info pinfo = { "CraneosPlayer", // Plugin name SERVER_TYPE_MAP,// Which server types this plugin works with? "0.1", // Plugin version HPM_VERSION, // HPM Version (don't change, macro is automatically updated)}; uint16 GetWord(uint32 val, int idx) { switch( idx ) { case 0: return (uint16)( (val & 0x0000FFFF)         ); case 1: return (uint16)( (val & 0xFFFF0000) >> 0x10 ); default: ShowDebug("GetWord: invalid index (idx=%d)n", idx); return 0; }} int dead_event_skull(struct map_session_data *sd,struct block_list *src){ if( !map->list[sd->bl.m].flag.gvg_castle )  { //Vemos si es humano. if(src && src->type == BL_PC) { //Vemos que no sea el mismo struct map_session_data *ssd = (struct map_session_data *)src; if(sd->status.char_id != ssd->status.char_id ) { struct item item_tmp; memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid=ITEMID_SKULL_; item_tmp.identify=1; item_tmp.card[0]=CARD0_CREATE; item_tmp.card[1]=0; item_tmp.card[2]=GetWord(sd->status.char_id,0); // CharId item_tmp.card[3]=GetWord(sd->status.char_id,1); map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); } } } return 1;} HPExport void plugin_init (void) {  /* Para map-> */ map = GET_SYMBOL("map");  /* Se ejecuta antes del evento muerte */ addHookPre("pc->dead",dead_event_skull);}En esta ocasión comenzare de abajo, por el "HPExport void plugin_init (void) {"tomare el simbolo de map para poder verificar el mapa donde esta el player, que este mercado como WoE Map.
     
    Luego le diré con "addHookPre" que PREVIO a que se gatille la función "pc_dead" de pc.c, ejecute la función "dead_event_skull"
    Entonces de esta forma, paso y analizo la funcion "dead_event_skull"
     
    Si se dan cuenta tiene los mismos parametros que la funcion pc_dead de pc.c, ya que requiero de los argumentos.
    - pregunto si esta en mapa marcado como gvg cast "if( !map->list[sd->bl.m].flag.gvg_castle )", 
    - Luego si mato a un humano "if(src && src->type == BL_PC)"
    - Creo una estructura con la persona que muere la llamo ssd, y luego pregunto por sus char_id, en caso que sean distintos prosigo. "struct map_session_data *ssd = (struct map_session_data *)src; if(sd->status.char_id != ssd->status.char_id )"
     
    Ahora, agrege la funcion "GetWord" solo para que el compilador no tirara advertencia de declaración implícita, pero no es 100% requerido (me parece D=! xD)
     
    Bueno eso es todo, la gracia de este plugin es jugar con un evento que se gatilla antes del evento general de la muerte, pueden generar uno antes o después de cualquier función prácticamente.
  3. Upvote
    Clein got a reaction from jaBote in Hercules Plugin Manager (HPM) en Español D=!.   
    Bueno chicos, yo vine a este emulador en exclusiva para esto!!, por lo que voy a hacer una guía a ver si me queda mas clara para los que quieran comenzar con este sistema, que esta genial!. xD
     
    Intro:
    Hercules Plugin Manager (de ahora en adelante como HPM) es un sistema creado en Hercules para poder modificar el código fuente del emulador sin cambiarlo directamente, usando plugins que alteren el funcionamiento pero evitando que actualizaciones del emulador nos den problemas.
     
    La documentación oficial pueden encontrarla en ingles en la wiki:
    http://herc.ws/wiki/Hercules_Plugin_Manager
    Y pueden encontrar plugins ya desarrollado por otros usuarios en la sección del foro "Downloads"
    http://herc.ws/board/files/category/10-plugins/
     
    * OJO!, que de ahora en adelante, YO voy a trabajar en Linux, por lo que la compilación es distinta, para Unix y Windows!
     
    Puntos previos al código puro:
    Antes de comenzar a explicar los duro, voy a dejarles un par de cosas claras, tiene que compilar para que los cambios sean efectuados.
    * compilar el plugin que corresponde a "make plugins" en la carpeta del emulador.
    * Los Plugins se encuentra en la carpeta plugins del src.
    * Para que este sea compilado, tiene que estar anotado el nombre del archivo en src/plugins/Makefile.in en MYPLUGINS, sin .c y separado por espacios entre los que tengas.
    * Para que este sea utilizado por el emulador, tendremos que agregarlo en el archivo conf/plugins.conf, en plugins_list.
     
    Comenzando con nuestra creación:
    ** Estructura general:
    <includes varios><struct de HPExport, con detalles del plugin><Funciones de todo tipo><Sistema de carga del plugins>   
    Para comenzar, como lo dije anteriormente, tenemos que crear nuestro archivo en src/plugins "nombre del archivo.c", es recomendado incluir estos elementos antes de comenzar:
    // Copyright (c) Hercules Dev Team, licensed under GNU GPL.// See the LICENSE file// Sample Hercules Plugin#include <stdio.h>#include <stdlib.h>#include <string.h>#include "../common/HPMi.h"#include "../common/malloc.h"#include "../common/mmo.h"#include "../common/socket.h"#include "../common/strlib.h"#include "../map/clif.h"#include "../map/pc.h"#include "../map/script.h"#include "../common/HPMDataCheck.h" /* should always be the last file included! (if you don't make it last, it'll intentionally break compile time) */ para poder ir trabajando.
     
    Seguido, se suele agregar la descripción del plugin:
    HPExport struct hplugin_info pinfo = { "NOMBRE DEL PLUGIN", // Plugin name SERVER_TYPE_MAP,// Which server types this plugin works with? "0.1", // Plugin version HPM_VERSION, // HPM Version (don't change, macro is automatically updated)}; Ahora puedes poner las funciones que os apetesca (RECUERDA QUE ESTO ES C!, y tienes o tendrías que tener algún conocimiento básico del lenguaje, ya que entre punteros y memoria mal asignada podrías hacer que el emulador se crache!!.
     
    Existen 'funciones' básicas para trabajar (Para este ejemplo trabajare creando un comando, y a medida que pueda ire creando mas ejemplos).
    Por ejemplo "ACMD" que agrega un comando (cuando digo comando, me refiero a lo de los GM @baselvup,@job, etc)
    A esta función se suele poner el comando que deseemos ejecutar como parámetro,  y las versiones mas actuales permiten la sobre carga del comando, si existe en atcommand.c, la ultima cargada sera quien se quede como fija.
     
    Para este ejemplo voy a trabajar con el primer plugin que realice, que consiste en modificar el comando @changegm para evitar que se utilice en medio de WoE.
     
    La función original de este comando es la siguiente:
    /*========================================== * @changegm by durf (changed by Lupus) * Changes Master of your Guild to a specified guild member *------------------------------------------*/ACMD(changegm) { struct guild *g; struct map_session_data *pl_sd; if (sd->status.guild_id == 0 || (g = sd->guild) == NULL || strcmp(g->master,sd->status.name)) { clif->message(fd, msg_txt(1181)); // You need to be a Guild Master to use this command. return false; } if( map->list[sd->bl.m].flag.guildlock || map->list[sd->bl.m].flag.gvg_castle ) { clif->message(fd, msg_txt(1182)); // You cannot change guild leaders in this map. return false; } if( !message[0] ) { clif->message(fd, msg_txt(1183)); // Usage: @changegm <guild_member_name> return false; } if((pl_sd=map->nick2sd((char *) message)) == NULL || pl_sd->status.guild_id != sd->status.guild_id) { clif->message(fd, msg_txt(1184)); // Target character must be online and be a guild member. return false; } guild->gm_change(sd->status.guild_id, pl_sd); return true;} Ahora, lo que yo quiero evitar es que me cambien el Guild Recaller en medio de WoE por lo que:
    if (pc_get_group_level(sd) != 99) { if (map->agit_flag == 1 || map->agit2_flag == 1) { clif->message(fd,"Estamos en WoE!, usted no puede cambiar el lider"); clif->message(fd,"Now is WoE Time!, you can't edit Guild Leader"); return false; } } **Lo dejo para que si no pertenece al grupo 99, no puede cambiar el leader, esto lo agrego a mi nueva función lo que seria:
    /*==========================================* ChangeGM no WoE now...*------------------------------------------*/ACMD(changegm){ struct guild *g; struct map_session_data *pl_sd; //Vanadium Edition if (pc_get_group_level(sd) != 99) { if (map->agit_flag || map->agit2_flag) { clif->message(fd,"Now is WoE Time!, you can't edit Guild Leader"); return false; } } //End Vanadium Edition if (sd->status.guild_id == 0 || (g = sd->guild) == NULL || strcmp(g->master,sd->status.name)) { clif->message(fd, msg_txt(1181)); // You need to be a Guild Master to use this command. return false; } if( map->list[sd->bl.m].flag.guildlock || map->list[sd->bl.m].flag.gvg_castle ) { clif->message(fd, msg_txt(1182)); // You cannot change guild leaders in this map. return false; } if( !message[0] ) { clif->message(fd, msg_txt(1183)); // Usage: @changegm <guild_member_name> return false; } if((pl_sd=map->nick2sd((char *) message)) == NULL || pl_sd->status.guild_id != sd->status.guild_id) { clif->message(fd, msg_txt(1184)); // Target character must be online and be a guild member. return false; } guild->gm_change(sd->status.guild_id, pl_sd); return true;} Ahora hace falta designarle como va a iniciar el plugin, existen 4 formas:
    [*]void plugin_init (void) [*]Se inicia cuando se inicia el server.
    [*]void plugin_final (void)
    [*]Se inicia cuando el server se cierra a si mismo.
    [*]void server_ready (void)
    [*]Se activa cuando el server esta iniciado y online
    [*]void server_post_final (void)
    [*]Antes de que se cierre por completo, los controladores de memoria siguen activos.



    Cada uno de estos puntos tiene sus funciones y dependiendo de lo que quieran hacer es como debe ser implementado.
    Para este caso lo quiero cuando se inicie el server, por lo que, lo dejare de esta forma:
     
    /* run when server starts */HPExport void plugin_init(void) { /* Para map-> */ map = GET_SYMBOL("map"); /* Para clif-> */ clif = GET_SYMBOL("clif"); /* Para para guild-> */ guild = GET_SYMBOL("guild"); /* Para msg_txt() */ atcommand = GET_SYMBOL("atcommand"); /* Agregamos el comando */ addAtcommand("changegm", changegm);} Como ya se habrán dado cuenta, deje 4 variables nuevas, map, clif, guild y atcommand, estas son tomadas de los procesos actuales, para poder usar las estructuras, una forma mas simple de verlo es que en mi codigo del comando, existen momentos en que uso "map->agit_flag" lo que tiene que hacer es llama al simbolo que tiene map, en este caso:
    map = GET_SYMBOL("map"); y así con el resto.
     
    Por ultimo, agregamos el comando, para eso utilizamos "addAtcommand("<comando>", <nombre función ACMD>);
    OJO!, que si el nombre esta repetido lo sobrecarga.
    addAtcommand("changegm", changegm); De esa forma, nuestro primer plugin esta listo:
     



    ** Esta Guia no esta lista, y pretendo ir agregando mas funcionalidades del sistema HPM a medida que yo mismo valla programando y creando lo que requiero.
  4. Upvote
    Clein reacted to Kuroko Sempai in Busco imagen para poder editarla.   
    Me disculpo por el doble post pero es para comentar que encontré la
    imagen con xvid directo del exe acá dejo la info por si a alguien le
    sirve.




    PD1:
    Si la quieren eliminar solo remplacen por 00 todos los números
    correspondiente a las letras sin agregar ni quitar nada para que no les
    de error.

    PD2: Si quieren reemplazar la imagen solo agreguen una
    imagen en formato tga con el nombre que se ve en la imagen en su data
    textureÀ¯ÀúÀÎÅÍÆäÀ̽º

    PD3: Todo esto solo por que me gusta que las imágenes se puedan mover xd al loguear.

    PD4: Pueden cerrar.
  5. Upvote
    Clein reacted to Dragons in (GUIA) Thor Patcher   
    Buenas, les traigo una pequeña guia de como instalar el thor.
    Primero lo que vamos a hacer es descargar el thor patcher
    Descarga: http://thor.aeomin.net
     
    Primer paso:
    Una vez descargado y descomprimido nos vamos a dirigir a la carpeta Tools y vamos a buscar un archivo llamado
    config.ini
    Lo habren y vamos a cambiar los siguientes valores.
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    RootURL='http://yourwebsite.com/patch/'
    (Aqui colocaras la ruta en donde se encontrara la carpeta de thor de la web)

    RemoteConfigFile='main.ini'
    (Se puede cambiar el nombre pero ten encuenta que tendran que cambiarlo el nombre al archivo de igual modo este archivo se encuentra en web)
     
    StatusFile='your.dat'
    (Este archivo es el que el thor va a leer en su carpeta de su server al abrirlo cambienle el nombre)
     
    DefaultGRF='your.grf'
    (Aqui, coloquen el nombre de su Main GRF o el grf que usaran para actualizaciones).
     
    ClientEXE='yourRO.exe'
    (Aqui va el nombre de su cliente)
     
    --------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    Segundo Paso:
     Una vez finalizado la configuracion de nuestro config.ini nos dirigimos a la siguiente carpeta.web
    Una ves ahi, abrimos el archivo main.ini y buscamos la siguiente linea.
     
    Force_Start=false
    (Nos deja ejecutar el cliente sin necesidad de que este actualizado Les recomiendo que lo dejen en false)
     
    file_url=http://domain.com/patch/data/ 
    Aqui va a colocar la direccion en donde se van a encontrar sus path de su servidor.
      ClientSum=   PatcherSum= (Esto no lo toquen mas adelante les explicare para que funciona y como utilizarlo).
     
    PatchList=plist.txt
    (Aqui va ir el nombre de su lista de actualizaciones y este archivo se debe encontrar en la direccion que colocaron en file url de main.ini)
     
    Listo ya tenemos nuestro main.ini configurado.
    --------------------------------------------------------------------------------------------------------------------------------------------------------------
    Tercer Paso:
    Como ya tenemos configurado todo nuestra configuracion nos dirigimos a la siguiente carpeta Tools, y buscaremos 
    ConfigEmbeder.exe

     

     
    1.- Seleccionaremos Browse
    2.- Nos dirigimos a la carpeta del thor Patcher
    3.- Abrimos la carpeta Patcher.
    4.- Seleccionamos el Archivo Thor.exe
    5.- Damos pack.
    (Ya tenemos parcheado nuestro thor.exe)
     
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------
    Cuarto Paso:
    Solo nos falta subir los archivos al web host en este caso seria nuestro main.ini y plist.txt (estos se encuentra en la carpeta Web)
     
    un ejemplo 
    en nuestro config.ini colocamos lo siguiente
    http://yourwebsite.com/patch/ no?
    entonces nuestro archivo main.ini debe encontrarse en ese directorio
     
     
    y en nuestro main.ini colocamos que nuestro plist se encuentra en la carpeta data
    file_url=http://domain.com/patch/data/ 
    ahi debemos colocar nuestro plist.txt
     
    (Nota: en donde se encuentre nuestro plist.txt es donde vamos a subir nuestros archivos el cual va a actualizar nuestro patcher)
     
    ----------------------------------------------------------------------------------------------------------------------------------------------------------
     
    ¿Como declarar un archivo en plist?
    NumRevision  Nombredelarchivo.extencion
    Ejemplo:
    1 update.gpf
    2 update2.rgz
     

    (Construccion disculpen las molestias.)
  6. Upvote
    Clein reacted to jaBote in Costume Item Plugins   
    Name of the compiled plugin is costumeitem, not customeitem. It seems you've screwed since you've made customeitem but the name is costumeitem.
     
    Please check you've named it correctly in your src/plugins folder, makefiles and the conf, then retry.
     
    If still not solved, please check that the plugin gets made in your /plugins directory.
  7. Upvote
    Clein reacted to jaBote in Hercules?... me podrias explicar como va?.   
    ¿De la DB en SQL? Vaya, soy yo el que se ocupaba de eso. Hay un upgrade de eAthena a Hercules (simplemente actualiza la DB de eAthena al máximo, aplicar el upgrade y luego aplicar cada uno de los ficheros de upgrade desde el principio).
     
    Para hacer upgrade de rAthena a Hercules (en verdad es un convertidor, aunque lo he llamado upgrade porque así se llama la carpeta inicial) simplemente tienes que ejecutar los convertidores que hice. No están actualizados, aunque tengo un par de horas de PC ahora mismo y trataré de actualizarlos ya si tengo tiempo.
     
    ¡Voy al lío!
     
    P.D.: En verdad PC tengo, lo que no tengo es Internet de momento y parece que va para largo, tengo que moverme de mi casa a un sitio para poder robar utilizar conexión wifi amablemente cedida por los vecinos
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.