Jump to content

Clein

Members
  • Content Count

    28
  • Joined

  • Last visited

  • Days Won

    1

Clein last won the day on August 10 2014

Clein had the most liked content!

About Clein

  • Rank
    Member

Profile Information

  • Github
    sebaturen

Recent Profile Visitors

1882 profile views
  1. Listo O.io un poco tarde, pero me parece que aun hoy en dia vienen todas las img de las skin D=!. PD: que aperrado tu al estar haciendo la skin de nuevo, animo! ^^
  2. Em... Preferiria hacer un plugin de forma completa porque meter eso en el codigo parte por aguatsarlo y segudo te daran problemas las updage D=
  3. Gracias bro pero no es lo que busco, lo otro que digo es un simple bonus similar a bonus2 bNoConsume si lo encuentro lo posteo aqui. bueno eso te sirve para deisgnar una carta cualquiera que tenga el efecto que buscas, al menos con flechas, de resto como gemas y esas cosas no lo vi, no se si tambien andas buscando eso, pero si ahi una funcion integrada cuanto mejor. Saludos1.
  4. wait... dices que no llegas ni siquiera al user y pass y se cierra?. Si eso esta pasando create un exe nuevo...
  5. Lo hice super a la rapida, podría ser mejor y podría estar como bonus de alguna carta pero no he estudiado eso de HPM aun Adjunto archivo, leer documentación y solo editar linea 26. PD: es un HPM por si no sabes D=!, en guias deje una con la info de esto y donde tienes qe ponerlo y como compilarlo, solo para linux la guia, ojo!, para windows es otro leceo. PD: avísanos como te va. consumoItem.c
  6. Como te dije en el post anterior no esoty metido en eso, pero a ver, te preocupaste de que la fecha de tu cliente este agregada en el hemulador para que sean compatibles? En src/common/mmo.h, esta en un define la fecha y tiene que ser la misma. Tambien es importanre la vercion que tienes el clientinfo.xml, y si sigue con problemas vuelve a difiar el exe
  7. Em... Cual es la idea? Que una carta te permita "no gastar flechas"?
  8. 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.
  9. 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.
  10. Buenas! Mira en mi servidor yo me encargo de programar las cosas internas y el otro Admin de hacer los clientes y editar la DATA, pero tengo alguna noción que te podría servir: "1. Si la carpeta Client ya incorpora una carpeta Data, por qué parte de los archivos de YourRO .grf Data Stuff están dentro de system?" Segun entiendo tu pregunta, dices que tiene una carpeta data y un archivo .grf, antaño cuando creabas el exe podias escojer si trabajar con la carpeta o con el .grf, supongo que ahora sera igual, por lo que para evitar que gente borre cosas por error y tener compatibilidad con mas servidores, es mejor tener tu .grf con tus cosas del servidor y etc, la carpeta data es necesaria por archivos .lua, que guarda la config de algunas cosas del juego. "2. El último servidor privado en el que jugué, no utiliza carpeta data, cómo puede ser?" Seguramente usaba un .grf no?, o le cambiaron el nombre o algo, porque tiene que tener alguna forma de conectarse y de implementar sus cosas, excepto que no tocaran nada pero igual requiern de una manera que el cliente conecte a su servidor. "3. Cómo debo configurar el cliente entonces?" Em... pues eso es muy variado, hoy en dia los sistemas para difiar clientes son muchísimo mas avanzado que antaño y tienes mas opciones y mas cosas entretenidas. "4. Una vez configurado todo el cliente, yo debería distribuir toda la carpeta Client a mis usuarios para que puedan jugar en mi server, no? Se puede crear un instalador?" Tiene que distribuir un .exe, un .grf, un .ini (para el orden de lectura de los .grf) y creo que seria eso, igual siempre podrias poner cosas que los usuarios les suele fallara para no estar haciendo soporte a todo el que lo abra. Claro que puedes hacer instaladores, yo utilizo el programa "Inno Setup" googlea y revisa como funciona!. "5. Hay forma de añadir Internal Guard a mi cliente?" Eso si lo desconosco, lo que si se es que existen sistema para encriptar paquetes, eso lo hace muy difícil a la hora de usar bots, inyectores de paquetes y demas, ya que para la persona que quiere inyectar paquetes sin el cliente tiene que generar un algoritmo para desencriptarlos, y la cosa se pone mas dificil . Espero haberte ayudado cualquier cosa comenta *.*
  11. Hahaha yo ponia el post anterior porque Ind informaba la existencia de la conf pero yo no la encontré en mi archivo >.< Voy a tener que buscar con mas cuidado. Saludos y gracias. Hahaha!, ahora que busco claro, ahí esta... ayer tenia mucho sueño al parecer D=!
  12. Consulta, en rAthena tenia una config para el maximo de transparencia del emblema de una guild, acá lo han quitado?, lo cambiaron de lugar?. Googleando cai en este post: http://herc.ws/board/topic/1599-checkemblem/ donde Ind postea la config que busco, pero esta ya no esta en clinf.conf D=!. Alguno tiene idea que paso?. Saludos.
  13. Disculpa pero no alcanzo a entender tu idea, me podrías explicar con mas detalle?, a ver si te puedo ayudar en algo.
  14. hahahaha loool!, I'm stupid xD. Working!, thx ^^
×
×
  • Create New...

Important Information

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