Clein
Members-
Content Count
28 -
Joined
-
Last visited
-
Days Won
1
Content Type
Profiles
Forums
Downloads
Staff Applications
Calendar
Everything posted by Clein
-
[Pedido] Cliente Antiguo Sak, kRO
Clein replied to Kuroko Sempai's question in Soporte y peticiones sobre el Cliente
Wow!, se ve raro hahaha!. -
[Pedido] Cliente Antiguo Sak, kRO
Clein replied to Kuroko Sempai's question in Soporte y peticiones sobre el Cliente
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! ^^ -
Duda / Pedido custom bonus
Clein replied to Kuroko Sempai's question in Soporte y peticiones sobre el Source
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= -
Duda / Pedido custom bonus
Clein replied to Kuroko Sempai's question in Soporte y peticiones sobre el Source
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. -
Sobre la creación del cliente
Clein replied to erijhon's question in Soporte y peticiones sobre el Cliente
wait... dices que no llegas ni siquiera al user y pass y se cierra?. Si eso esta pasando create un exe nuevo... -
Duda / Pedido custom bonus
Clein replied to Kuroko Sempai's question in Soporte y peticiones sobre el Source
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 -
Sobre la creación del cliente
Clein replied to erijhon's question in Soporte y peticiones sobre el Cliente
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 -
Duda / Pedido custom bonus
Clein replied to Kuroko Sempai's question in Soporte y peticiones sobre el Source
Em... Cual es la idea? Que una carta te permita "no gastar flechas"? -
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.
-
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.
-
Sobre la creación del cliente
Clein replied to erijhon's question in Soporte y peticiones sobre el Cliente
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 *.* -
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=!
-
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.
-
item unico en el server
Clein replied to kuspyro's question in Soporte y peticiones sobre Scripts/Bases de Datos
Disculpa pero no alcanzo a entender tu idea, me podrías explicar con mas detalle?, a ver si te puedo ayudar en algo. -
hahahaha loool!, I'm stupid xD. Working!, thx ^^
-
!! is awesome proyect, I try put in my server but... /sob I do not know what I'm doing wrong. - Put "src/plugins/customeitem.c" - Edit Makefile.in "MYPLUGINS = customeitem" - Edit "conf/plugins.conf" - Clear and recompile sql and plugins - No error compilatin MAKE pluginsmake[1]: Entering directory `/home/hercules/Emulador/trunk/src/plugins' CC sample.c CC db2sql.c CC HPMHooking.c CC customeitem.cmake[1]: Leaving directory `/home/hercules/Emulador/trunk/src/plugins'- Run server:[Warning]: HPM:plugin_load: failed to load 'plugins/costumeitem.so', skipping...[Warning]: HPM:plugin_load: failed to load 'plugins/costumeitem.so', skipping...U_U
-
Good Day!, this is my first time posting in the English Area, so I will regard to everyone :3 Well lets go to the point, I am very intresting in Plugins (HPM), the principal reaseon why I am changing the emluator, but now I have some doubts. I need to change some function, but soem in specific: -Asura in the battle.c -Tarot in the Skill.c -Event of the deat in pc.c -Status in Status.c and .h -Commands like @changegm -Event of creating guild in int_guild.c I have all my changes working in rAthena, but clearly I modify the code of each one that require. Now I would like to migrate this to Hercules but to a base of HPM, to make updates easier, and have my modified code appart from the original. How do you recomend me to do this ?, there is any example in where the prinicpal function of the code are modify based in plugins, to see it and learn?. Regards and thx for everyting.
-
... mi rAthena no esta actualizado U_U, por lo que no pude ejecutar el update.<br /><br />Al final ya lo monte y lo corri, cambiando los puertos sin la DB vieja, voy a probar limpio y a ver como me va, a primera vista se ve mas veloz, pero ya veremos, me intereca mucho este proyecto, se ve chori xD.
-
vale, mañana lo pruebo y te comento ^^.
-
hahahahahah, algun link donde este el convertidor upgrade o como quieran llamarlo??. PD: wifi del vecino ruls (?) xD
-
Me salto otra duda... En caso de tener un server montado con eAthena o rAthena, se puede realizar una migración de la DB?, ya que según entiendo son distintas :S.
-
ademas recordar que cada arma y escudo te baja el ASPD-
-
Ajajjajaa siempre encontré que era como el forro el item db y el mob db, comasy comas y comas uff, yo me perdia muy fácil, pero con esto lo veo mucho mas simple. Entonces estoy bien usando un txt si al final todo se carga en memoria como suponía. Ahora yo programe mi propio panel de control bastante distinto a otros, pero de igual forma trabajo conectando la db de items de forma externa porque luego hacer preguntas a la sql del server puede ser mas gastos de los recursos del servidor del server, mejor tengo un servidor distinto para la web. Avería ahora que voy en el metro no recuerdo lo que vi en la mañana pero aver otras dudas que tenga... Bueno creo que ya seria todo, src, npc, y config, cualquier cosa estaré preguntando. Muchas gracias por toda la info y mañana comienzo las pruebas y a ver como anda.
-
, a que te refieres con "La idea principal del Hercules Plugin Manager, que hubiese entendido en su época", ya no se utiliza esto o tu no lo utilizas?, me parece una idea bastante interesante, ya que podria sobrecargar las funciones que me interesa modificar y evitar probelmas de update del emulador a futuro. Por otro lado, la wiki si funciona gracias ^^, ademas, revisando me di cuenta que el item_db.conf esta HERMOSO!, infinitamente mas ordenado que de eAthena lleno de comas que nadie sabe como shit van xD. por sierto, siempre he tenido una duda... que ser mas eficiente?, tener los item por DB o por .conf, porque asumo que el .conf lo que hace es cargar todo en RAM, para hacer lectura mas rapido, pero con la DB tambien no?, o va y consulta cada ves, seria una locura creo :S, y cargarlo en memoria tambien, seria como para ver que este ordenado no?, o tiene otra funcionalidad los item_db.sql quye uno carga en la DB?. Saludos y gracias.
-
en renewal al menos en iRO todas las cosas que dan bonus directyos a atk o matak por alguna razon la gran mayoria no se ve la suma, no se ve el numero, pero si hace el efecto. en cuanto a la bonificacion tienes que hacer los calculos a lo renewal xD, no todo afecta de la misma forma >.< Y ojo!, que con renewal muchas cartas que uno podia sumera 1 + 1 + 1, para lograr un efecto OP, fueron bloqueadas para o no ser stakeables o que solo se sumen 2 de ellas.