Jump to content

  •  

Clein

Member Since 16 Jul 2014
Offline Last Active Sep 25 2014 04:31 PM
-----

Topics I've Started

Hercules Plugin Manager (HPM) en Español D=!.

10 August 2014 - 05:04 PM

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/..._Plugin_Manager
Y pueden encontrar plugins ya desarrollado por otros usuarios en la sección del foro "Downloads"
http://herc.ws/board...ory/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.
      [/list][*]void plugin_final (void)

        [*]Se inicia cuando el server se cierra a si mismo.
        [/list][*]void server_ready (void)

          [*]Se activa cuando el server esta iniciado y online
          [/list][*]void server_post_final (void)

            [*]Antes de que se cierre por completo, los controladores de memoria siguen activos.
            [/list][/list]

            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:
             

            Spoiler


            ** 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.


Emblema transparente guild

10 August 2014 - 05:36 AM

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...99-checkemblem/

donde Ind postea la config que busco, pero esta ya no esta en clinf.conf D=!.

Alguno tiene idea que paso?.

Saludos.

[Question]Edit function and overload with HPM

04 August 2014 - 10:57 PM

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.

Hercules?... me podrias explicar como va?.

16 July 2014 - 11:20 PM

Bueno resulta que hace años que estuve trabajando en pserver y esas cosas, con eAthena, y me retire, y ahora que vuelvo, veo que eAthena ya no corre, osea se esta usando rAthena (por lo que estoy entendiendo), pero tambien existe este proyecto, Hercules.

 

Cuales son las diferencias?, ventajas y desventajas con rAthena por ejemplo?, que otros proyectos existen al respecto y porque se disvolvio eathena?.

Los Script (npc) fabricados en eAthena simplemente no son compatibles con Hercules?, o ahi que ajustarlos?.

 

El codigo en C por lo que estuve viendo tiene una estructura similar a lo que recordaba de eAthena, pero ya tantos años que no sabria decir :S.

 

En terminos de eficiencia, y compativilidad, que opinan ustedes?.

 

Saludos y gracias por las aclaraciones ^^.