diff options
author | Er_Maqui <er_maqui@darkbolt.net> | 2015-10-21 14:54:40 +0200 |
---|---|---|
committer | Er_Maqui <er_maqui@darkbolt.net> | 2015-10-21 14:54:40 +0200 |
commit | 198aef7133713b47a4c4fadaac6811c9d3812d19 (patch) | |
tree | 84df335dd0ad350c20f8c2a018b2a7096907b636 /src | |
parent | 6977d6d31b58afc5095c0a59e754f21ea1080054 (diff) | |
parent | 8b198db1e0ccc8209b7bcf54b4df62d4747f75b2 (diff) | |
download | hercules-198aef7133713b47a4c4fadaac6811c9d3812d19.tar.gz hercules-198aef7133713b47a4c4fadaac6811c9d3812d19.tar.bz2 hercules-198aef7133713b47a4c4fadaac6811c9d3812d19.tar.xz hercules-198aef7133713b47a4c4fadaac6811c9d3812d19.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src')
76 files changed, 1000 insertions, 445 deletions
diff --git a/src/char/HPMchar.c b/src/char/HPMchar.c index d3150bc11..99e7c598f 100644 --- a/src/char/HPMchar.c +++ b/src/char/HPMchar.c @@ -31,7 +31,7 @@ #include "common/db.h" #include "common/des.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mapindex.h" #include "common/mmo.h" #include "common/nullpo.h" diff --git a/src/char/char.c b/src/char/char.c index 1e0428a3d..7cc6aa91a 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -29,7 +29,7 @@ #include "common/console.h" #include "common/core.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mapindex.h" #include "common/mmo.h" #include "common/nullpo.h" diff --git a/src/char/geoip.c b/src/char/geoip.c index 65bb2bdd4..924c1cd83 100644 --- a/src/char/geoip.c +++ b/src/char/geoip.c @@ -7,7 +7,7 @@ #include "geoip.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/showmsg.h" #include <errno.h> diff --git a/src/char/int_auction.c b/src/char/int_auction.c index 67c83ca22..48bf715f2 100644 --- a/src/char/int_auction.c +++ b/src/char/int_auction.c @@ -12,7 +12,7 @@ #include "char/mapif.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_elemental.c b/src/char/int_elemental.c index e7708179a..3969e5e43 100644 --- a/src/char/int_elemental.c +++ b/src/char/int_elemental.c @@ -9,7 +9,7 @@ #include "char/char.h" #include "char/inter.h" #include "char/mapif.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_guild.c b/src/char/int_guild.c index 54355161d..239e8a296 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -12,7 +12,7 @@ #include "char/mapif.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_homun.c b/src/char/int_homun.c index be72ecd58..78b4dbb61 100644 --- a/src/char/int_homun.c +++ b/src/char/int_homun.c @@ -9,7 +9,7 @@ #include "char/char.h" #include "char/inter.h" #include "char/mapif.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_mail.c b/src/char/int_mail.c index 854fe31b1..933856b14 100644 --- a/src/char/int_mail.c +++ b/src/char/int_mail.c @@ -9,7 +9,7 @@ #include "char/char.h" #include "char/inter.h" #include "char/mapif.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_mercenary.c b/src/char/int_mercenary.c index dd40a0224..fb98161fe 100644 --- a/src/char/int_mercenary.c +++ b/src/char/int_mercenary.c @@ -10,7 +10,7 @@ #include "char/inter.h" #include "char/mapif.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_party.c b/src/char/int_party.c index aedcb8535..d4af67eb3 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -11,7 +11,7 @@ #include "char/mapif.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mapindex.h" #include "common/mmo.h" #include "common/nullpo.h" diff --git a/src/char/int_pet.c b/src/char/int_pet.c index 97b2fb6a4..37e238725 100644 --- a/src/char/int_pet.c +++ b/src/char/int_pet.c @@ -9,7 +9,7 @@ #include "char/char.h" #include "char/inter.h" #include "char/mapif.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_quest.c b/src/char/int_quest.c index fcd56230b..e2ee3401a 100644 --- a/src/char/int_quest.c +++ b/src/char/int_quest.c @@ -10,7 +10,7 @@ #include "char/inter.h" #include "char/mapif.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/int_storage.c b/src/char/int_storage.c index 3a8a6a169..c0cae5300 100644 --- a/src/char/int_storage.c +++ b/src/char/int_storage.c @@ -10,7 +10,7 @@ #include "char/char.h" #include "char/inter.h" #include "char/mapif.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/char/inter.c b/src/char/inter.c index 65048a9f9..1ed29719e 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -21,7 +21,7 @@ #include "char/mapif.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/common/HPM.c b/src/common/HPM.c index 5373c8b6a..7d9a0b104 100644 --- a/src/common/HPM.c +++ b/src/common/HPM.c @@ -11,7 +11,7 @@ #include "common/console.h" #include "common/core.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mapindex.h" #include "common/mmo.h" #include "common/showmsg.h" diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h index 510ea9d4e..923b6ccbf 100644 --- a/src/common/HPMDataCheck.h +++ b/src/common/HPMDataCheck.h @@ -144,16 +144,16 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = { #else #define COMMON_HPMI_H #endif // COMMON_HPMI_H - #ifdef COMMON_MALLOC_H - { "malloc_interface", sizeof(struct malloc_interface), SERVER_TYPE_ALL }, - #else - #define COMMON_MALLOC_H - #endif // COMMON_MALLOC_H #ifdef COMMON_MAPINDEX_H { "mapindex_interface", sizeof(struct mapindex_interface), SERVER_TYPE_CHAR|SERVER_TYPE_MAP }, #else #define COMMON_MAPINDEX_H #endif // COMMON_MAPINDEX_H + #ifdef COMMON_MEMMGR_H + { "malloc_interface", sizeof(struct malloc_interface), SERVER_TYPE_ALL }, + #else + #define COMMON_MEMMGR_H + #endif // COMMON_MEMMGR_H #ifdef COMMON_MMO_H { "auction_data", sizeof(struct auction_data), SERVER_TYPE_ALL }, { "fame_list", sizeof(struct fame_list), SERVER_TYPE_ALL }, diff --git a/src/common/HPMSymbols.inc.h b/src/common/HPMSymbols.inc.h index 3a4c5852c..4c3722b69 100644 --- a/src/common/HPMSymbols.inc.h +++ b/src/common/HPMSymbols.inc.h @@ -125,9 +125,9 @@ struct loginif_interface *loginif; #ifdef MAP_MAIL_H /* mail */ struct mail_interface *mail; #endif // MAP_MAIL_H -#ifdef COMMON_MALLOC_H /* iMalloc */ +#ifdef COMMON_MEMMGR_H /* iMalloc */ struct malloc_interface *iMalloc; -#endif // COMMON_MALLOC_H +#endif // COMMON_MEMMGR_H #ifdef MAP_MAP_H /* map */ struct map_interface *map; #endif // MAP_MAP_H @@ -348,9 +348,9 @@ if ((server_type&(SERVER_TYPE_CHAR)) && !HPM_SYMBOL("loginif", loginif)) return #ifdef MAP_MAIL_H /* mail */ if ((server_type&(SERVER_TYPE_MAP)) && !HPM_SYMBOL("mail", mail)) return "mail"; #endif // MAP_MAIL_H -#ifdef COMMON_MALLOC_H /* iMalloc */ +#ifdef COMMON_MEMMGR_H /* iMalloc */ if ((server_type&(SERVER_TYPE_ALL)) && !HPM_SYMBOL("iMalloc", iMalloc)) return "iMalloc"; -#endif // COMMON_MALLOC_H +#endif // COMMON_MEMMGR_H #ifdef MAP_MAP_H /* map */ if ((server_type&(SERVER_TYPE_MAP)) && !HPM_SYMBOL("map", map)) return "map"; #endif // MAP_MAP_H diff --git a/src/common/Makefile.in b/src/common/Makefile.in index 208d3b111..88e991651 100644 --- a/src/common/Makefile.in +++ b/src/common/Makefile.in @@ -27,12 +27,12 @@ COMMON_SHARED_C = conf.c db.c des.c ers.c grfio.c HPM.c mapindex.c md5calc.c \ COMMON_C = $(COMMON_SHARED_C) COMMON_SHARED_OBJ = $(patsubst %.c,%.o,$(COMMON_SHARED_C)) COMMON_OBJ = $(addprefix obj_all/, $(COMMON_SHARED_OBJ) \ - console.o core.o malloc.o socket.o) + console.o core.o memmgr.o socket.o) COMMON_MINI_OBJ = $(addprefix obj_all/, $(COMMON_SHARED_OBJ) \ - miniconsole.o minicore.o minimalloc.o minisocket.o) -COMMON_C += console.c core.c malloc.c socket.c + miniconsole.o minicore.o minimemmgr.o minisocket.o) +COMMON_C += console.c core.c memmgr.c socket.c COMMON_H = atomic.h cbasetypes.h conf.h console.h core.h db.h des.h ers.h \ - grfio.h hercules.h HPM.h HPMi.h malloc.h mapindex.h md5calc.h \ + grfio.h hercules.h HPM.h HPMi.h memmgr.h mapindex.h md5calc.h \ mmo.h mutex.h nullpo.h random.h showmsg.h socket.h spinlock.h \ sql.h strlib.h sysinfo.h thread.h timer.h utils.h winapi.h diff --git a/src/common/console.c b/src/common/console.c index c8ca4ae87..477141b48 100644 --- a/src/common/console.c +++ b/src/common/console.c @@ -16,7 +16,7 @@ #ifndef MINICORE # include "common/atomic.h" # include "common/ers.h" -# include "common/malloc.h" +# include "common/memmgr.h" # include "common/mutex.h" # include "common/spinlock.h" # include "common/sql.h" @@ -362,7 +362,6 @@ void console_parse_sub(char *line) char *tok; char sublist[CP_CMD_LENGTH * 5]; int i; - unsigned int len = 0; memcpy(bline, line, 200); tok = strtok(line, " "); @@ -375,19 +374,15 @@ void console_parse_sub(char *line) cmd = VECTOR_INDEX(console->input->command_list, i); - len += snprintf(sublist,CP_CMD_LENGTH * 5,"%s", cmd->cmd); + snprintf(sublist, sizeof(sublist), "%s", cmd->cmd); if (cmd->type == CPET_FUNCTION) { - char *r = NULL; - if( (tok = strtok(NULL, " ")) ) { - r = bline; - r += len + 1; - } - cmd->u.func(r); + tok = strtok(NULL, ""); + cmd->u.func(tok); return; } - while (( tok = strtok(NULL, " ") ) != NULL) { + while ((tok = strtok(NULL, " ")) != NULL) { struct CParseEntry *entry = NULL; Assert_retv(cmd->type == CPET_CATEGORY); @@ -409,17 +404,15 @@ void console_parse_sub(char *line) } entry = VECTOR_INDEX(cmd->u.children, i); if (entry->type == CPET_FUNCTION) { - char *r = NULL; - if ((tok = strtok(NULL, " "))) { - r = bline; - r += len + strlen(entry->cmd) + 1; - } - entry->u.func(r); + tok = strtok(NULL, ""); + entry->u.func(tok); return; } cmd = entry; - len += snprintf(sublist + len,(CP_CMD_LENGTH * 5) - len," %s", cmd->cmd); + + if (strlen(sublist) < sizeof(sublist)-1) + snprintf(sublist+strlen(sublist), sizeof(sublist), " %s", cmd->cmd); } ShowError("Is only a category, type '"CL_WHITE"%s help"CL_RESET"' to list its subcommands\n",sublist); } diff --git a/src/common/core.c b/src/common/core.c index 8564b8acc..6f21f526b 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -10,7 +10,7 @@ #include "common/cbasetypes.h" #include "common/console.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/common/db.c b/src/common/db.c index 4df5c08db..0600be2e8 100644 --- a/src/common/db.c +++ b/src/common/db.c @@ -73,7 +73,7 @@ #include "db.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/showmsg.h" #include "common/strlib.h" diff --git a/src/common/ers.c b/src/common/ers.c index 91fc6ccfb..bf17e087d 100644 --- a/src/common/ers.c +++ b/src/common/ers.c @@ -45,7 +45,7 @@ #include "ers.h" #include "common/cbasetypes.h" -#include "common/malloc.h" // CREATE, RECREATE, aMalloc, aFree +#include "common/memmgr.h" // CREATE, RECREATE, aMalloc, aFree #include "common/nullpo.h" #include "common/showmsg.h" // ShowMessage, ShowError, ShowFatalError, CL_BOLD, CL_NORMAL diff --git a/src/common/grfio.c b/src/common/grfio.c index b59c2b63d..46804ea08 100644 --- a/src/common/grfio.c +++ b/src/common/grfio.c @@ -8,7 +8,7 @@ #include "common/cbasetypes.h" #include "common/des.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/strlib.h" diff --git a/src/common/malloc.c b/src/common/memmgr.c index 63de90cb3..0d9305b06 100644 --- a/src/common/malloc.c +++ b/src/common/memmgr.c @@ -4,7 +4,7 @@ #define HERCULES_CORE -#include "malloc.h" +#include "memmgr.h" #include "common/cbasetypes.h" #include "common/core.h" @@ -79,6 +79,26 @@ struct malloc_interface *iMalloc; #endif +#ifndef USE_MEMMGR + +#ifdef __APPLE__ +#include <malloc/malloc.h> +#define BUFFER_SIZE(ptr) malloc_size(ptr) +#elif __FreeBSD__ +#include <malloc_np.h> +#define BUFFER_SIZE(ptr) malloc_usable_size(ptr) +#elif defined __linux__ || defined __linux || defined CYGWIN +#include <malloc.h> +#define BUFFER_SIZE(ptr) malloc_usable_size(ptr) +#elif defined WIN32 +#include <malloc.h> +#define BUFFER_SIZE(ptr) _msize(ptr) +#else +#error Unsupported OS +#endif + +#endif + void* aMalloc_(size_t size, const char *file, int line, const char *func) { void *ret = MALLOC(size, file, line, func); @@ -110,6 +130,34 @@ void* aRealloc_(void *p, size_t size, const char *file, int line, const char *fu } return ret; } + +void* aReallocz_(void *p, size_t size, const char *file, int line, const char *func) +{ + void *ret; + // ShowMessage("%s:%d: in func %s: aReallocz %p %ld\n",file,line,func,p,size); +#ifdef USE_MEMMGR + ret = REALLOC(p, size, file, line, func); +#else + size_t newSize; + if (p) { + size_t oldSize = malloc_usable_size(p); + ret = REALLOC(p, size, file, line, func); + newSize = BUFFER_SIZE(ret); + if (ret && newSize > oldSize) + memset(ret + oldSize, 0, newSize - oldSize); + } else { + ret = REALLOC(p, size, file, line, func); + if (ret) + memset(ret, 0, BUFFER_SIZE(ret)); + } +#endif + if (ret == NULL){ + ShowFatalError("%s:%d: in func %s: aRealloc error out of memory!\n",file,line,func); + exit(EXIT_FAILURE); + } + return ret; +} + char* aStrdup_(const char *p, const char *file, int line, const char *func) { char *ret = STRDUP(p, file, line, func); @@ -888,7 +936,7 @@ void malloc_defaults(void) { iMalloc->malloc = aMalloc_; iMalloc->calloc = aCalloc_; iMalloc->realloc = aRealloc_; - iMalloc->reallocz = aRealloc_;/* not using memory manager huhum o.o perhaps we could still do something about */ + iMalloc->reallocz = aReallocz_;/* not using memory manager huhum o.o perhaps we could still do something about */ iMalloc->astrdup = aStrdup_; iMalloc->free = aFree_; #endif diff --git a/src/common/malloc.h b/src/common/memmgr.h index b194c7cf3..c5a3358db 100644 --- a/src/common/malloc.h +++ b/src/common/memmgr.h @@ -1,8 +1,8 @@ // Copyright (c) Athena Dev Teams - Licensed under GNU GPL // For more information, see LICENCE in the main folder -#ifndef COMMON_MALLOC_H -#define COMMON_MALLOC_H +#ifndef COMMON_MEMMGR_H +#define COMMON_MEMMGR_H #include "common/hercules.h" @@ -86,4 +86,4 @@ void memmgr_report(int extra); HPShared struct malloc_interface *iMalloc; -#endif /* COMMON_MALLOC_H */ +#endif /* COMMON_MEMMGR_H */ diff --git a/src/common/mutex.c b/src/common/mutex.c index 715609628..af1a6d155 100644 --- a/src/common/mutex.c +++ b/src/common/mutex.c @@ -6,7 +6,7 @@ #include "mutex.h" #include "common/cbasetypes.h" // for WIN32 -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/showmsg.h" #include "common/timer.h" diff --git a/src/common/socket.c b/src/common/socket.c index b4b67da40..b418a468f 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -10,7 +10,7 @@ #include "common/HPM.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/common/sql.c b/src/common/sql.c index ee759eb61..4262a10a1 100644 --- a/src/common/sql.c +++ b/src/common/sql.c @@ -7,7 +7,7 @@ #include "sql.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/showmsg.h" #include "common/strlib.h" #include "common/timer.h" diff --git a/src/common/strlib.c b/src/common/strlib.c index fcd1b483b..fefabe52b 100644 --- a/src/common/strlib.c +++ b/src/common/strlib.c @@ -7,7 +7,7 @@ #include "strlib.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/showmsg.h" #include <errno.h> diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c index d218e6e99..1baf33086 100644 --- a/src/common/sysinfo.c +++ b/src/common/sysinfo.c @@ -10,7 +10,7 @@ #include "common/cbasetypes.h" #include "common/core.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/strlib.h" #include <stdio.h> // fopen diff --git a/src/common/thread.c b/src/common/thread.c index d5bbd7f97..d9cd42aa6 100644 --- a/src/common/thread.c +++ b/src/common/thread.c @@ -11,7 +11,7 @@ #include "thread.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/showmsg.h" #include "common/sysinfo.h" // sysinfo->getpagesize() diff --git a/src/common/timer.c b/src/common/timer.c index f6ce00d54..f31ae0ffe 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -8,7 +8,7 @@ #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/showmsg.h" #include "common/utils.h" diff --git a/src/login/HPMlogin.c b/src/login/HPMlogin.c index b900f28fe..5ceb38283 100644 --- a/src/login/HPMlogin.c +++ b/src/login/HPMlogin.c @@ -17,7 +17,7 @@ #include "common/db.h" #include "common/des.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/login/account_sql.c b/src/login/account_sql.c index 37837fc35..4efa73e94 100644 --- a/src/login/account_sql.c +++ b/src/login/account_sql.c @@ -9,7 +9,7 @@ #include "common/cbasetypes.h" #include "common/console.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/login/login.c b/src/login/login.c index 1d8ef489a..3ec60f0aa 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -15,7 +15,7 @@ #include "common/conf.h" #include "common/core.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/md5calc.h" #include "common/nullpo.h" #include "common/random.h" diff --git a/src/map/HPMmap.c b/src/map/HPMmap.c index edbe74039..ade685bf7 100644 --- a/src/map/HPMmap.c +++ b/src/map/HPMmap.c @@ -15,7 +15,7 @@ #include "common/db.h" #include "common/des.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mapindex.h" #include "common/mmo.h" #include "common/nullpo.h" diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 15422a74a..ff88f2c63 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -41,7 +41,7 @@ #include "common/cbasetypes.h" #include "common/conf.h" #include "common/core.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" // MAX_CARTS #include "common/nullpo.h" #include "common/random.h" diff --git a/src/map/battle.c b/src/map/battle.c index 5b147de9c..1f9d75a64 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -26,7 +26,7 @@ #include "common/HPM.h" #include "common/cbasetypes.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/battleground.c b/src/map/battleground.c index be6b7a863..cc5384d21 100644 --- a/src/map/battleground.c +++ b/src/map/battleground.c @@ -21,7 +21,7 @@ #include "common/cbasetypes.h" #include "common/conf.h" #include "common/HPM.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/socket.h" diff --git a/src/map/channel.c b/src/map/channel.c index 196e5f770..023d22c06 100644 --- a/src/map/channel.c +++ b/src/map/channel.c @@ -14,7 +14,7 @@ #include "common/cbasetypes.h" #include "common/conf.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/chat.c b/src/map/chat.c index 976b1ce8e..aaf34a6f9 100644 --- a/src/map/chat.c +++ b/src/map/chat.c @@ -14,7 +14,7 @@ #include "map/pc.h" #include "map/skill.h" // ext_skill_unit_onplace() #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/map/chrif.c b/src/map/chrif.c index a27038ff7..62ef52dbd 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -26,7 +26,7 @@ #include "common/HPM.h" #include "common/cbasetypes.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/socket.h" diff --git a/src/map/clif.c b/src/map/clif.c index 8a9d4beb6..d499cf67f 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -42,7 +42,7 @@ #include "common/conf.h" #include "common/ers.h" #include "common/grfio.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" // NEW_CARTS #include "common/nullpo.h" #include "common/random.h" diff --git a/src/map/elemental.c b/src/map/elemental.c index b629275e5..1ab93f6c5 100644 --- a/src/map/elemental.c +++ b/src/map/elemental.c @@ -26,7 +26,7 @@ #include "map/trade.h" #include "map/unit.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/random.h" diff --git a/src/map/guild.c b/src/map/guild.c index f8798f821..6360e3e1f 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -23,7 +23,7 @@ #include "common/HPM.h" #include "common/cbasetypes.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mapindex.h" #include "common/nullpo.h" #include "common/showmsg.h" diff --git a/src/map/homunculus.c b/src/map/homunculus.c index d0a4f6679..874d26fdb 100644 --- a/src/map/homunculus.c +++ b/src/map/homunculus.c @@ -27,7 +27,7 @@ #include "map/trade.h" #include "map/unit.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/random.h" diff --git a/src/map/instance.c b/src/map/instance.c index 0936a5ace..545ffe1e7 100644 --- a/src/map/instance.c +++ b/src/map/instance.c @@ -17,7 +17,7 @@ #include "common/HPM.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/socket.h" diff --git a/src/map/intif.c b/src/map/intif.c index 1795055c4..1664a8a09 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -22,7 +22,7 @@ #include "map/pet.h" #include "map/quest.h" #include "map/storage.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/socket.h" diff --git a/src/map/irc-bot.c b/src/map/irc-bot.c index f89bd2f1c..164242ff8 100644 --- a/src/map/irc-bot.c +++ b/src/map/irc-bot.c @@ -10,7 +10,7 @@ #include "map/map.h" #include "map/pc.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/random.h" #include "common/showmsg.h" #include "common/socket.h" diff --git a/src/map/itemdb.c b/src/map/itemdb.c index ccfff2246..3afb10bec 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -14,7 +14,7 @@ #include "map/script.h" // item script processing #include "common/HPM.h" #include "common/conf.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/map.c b/src/map/map.c index b142ed1f3..9a7cbe163 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -48,7 +48,7 @@ #include "common/core.h" #include "common/ers.h" #include "common/grfio.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" @@ -5874,7 +5874,7 @@ int do_init(int argc, char *argv[]) map->nick_db = idb_alloc(DB_OPT_BASE); map->charid_db = idb_alloc(DB_OPT_BASE); map->regen_db = idb_alloc(DB_OPT_BASE); // efficient status_natural_heal processing - map->iwall_db = strdb_alloc(DB_OPT_RELEASE_DATA,2*NAME_LENGTH+2+1); // [Zephyrus] Invisible Walls + map->iwall_db = strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA, 2*NAME_LENGTH+2+1); // [Zephyrus] Invisible Walls map->zone_db = strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA, MAP_ZONE_NAME_LENGTH); map->iterator_ers = ers_new(sizeof(struct s_mapiterator),"map.c::map_iterator_ers",ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK); diff --git a/src/map/mapreg_sql.c b/src/map/mapreg_sql.c index 37c830e2e..93ac52f33 100644 --- a/src/map/mapreg_sql.c +++ b/src/map/mapreg_sql.c @@ -11,7 +11,7 @@ #include "common/cbasetypes.h" #include "common/db.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/showmsg.h" #include "common/sql.h" #include "common/strlib.h" diff --git a/src/map/mercenary.c b/src/map/mercenary.c index b26876d39..59a6f7a44 100644 --- a/src/map/mercenary.c +++ b/src/map/mercenary.c @@ -26,7 +26,7 @@ #include "map/trade.h" #include "map/unit.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/random.h" diff --git a/src/map/mob.c b/src/map/mob.c index 01f585b6f..94d68df88 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -32,7 +32,7 @@ #include "common/cbasetypes.h" #include "common/db.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" @@ -3646,77 +3646,382 @@ void item_dropratio_adjust(int nameid, int mob_id, int *rate_adjust) *rate_adjust = item_drop_ratio_db[nameid]->drop_ratio; } } + /* (mob_parse_dbrow)_cap_value */ static inline int mob_parse_dbrow_cap_value(int class_, int min, int max, int value) { if( value > max ) { - ShowError("mob_parse_dbrow: for class '%d', field value '%d' is higher than the maximum '%d'! capping...\n", class_, value, max); + ShowError("mob_parse_dbrow_cap_value: for class '%d', field value '%d' is higher than the maximum '%d'! capping...\n", class_, value, max); return max; } else if ( value < min ) { - ShowError("mob_parse_dbrow: for class '%d', field value '%d' is lower than the minimum '%d'! capping...\n", class_, value, min); + ShowError("mob_parse_dbrow_cap_value: for class '%d', field value '%d' is lower than the minimum '%d'! capping...\n", class_, value, min); return min; } return value; } + +void mob_read_db_stats_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) +{ + int i32; + if (mob->lookup_const(t, "Str", &i32) && i32 >= 0) { + mstatus->str = mob_parse_dbrow_cap_value(class_, UINT16_MIN, UINT16_MAX, i32); + } + if (mob->lookup_const(t, "Agi", &i32) && i32 >= 0) { + mstatus->agi = mob_parse_dbrow_cap_value(class_, UINT16_MIN, UINT16_MAX, i32); + } + if (mob->lookup_const(t, "Vit", &i32) && i32 >= 0) { + mstatus->vit = mob_parse_dbrow_cap_value(class_, UINT16_MIN, UINT16_MAX, i32); + } + if (mob->lookup_const(t, "Int", &i32) && i32 >= 0) { + mstatus->int_ = mob_parse_dbrow_cap_value(class_, UINT16_MIN, UINT16_MAX, i32); + } + if (mob->lookup_const(t, "Dex", &i32) && i32 >= 0) { + mstatus->dex = mob_parse_dbrow_cap_value(class_, UINT16_MIN, UINT16_MAX, i32); + } + if (mob->lookup_const(t, "Luk", &i32) && i32 >= 0) { + mstatus->luk = mob_parse_dbrow_cap_value(class_, UINT16_MIN, UINT16_MAX, i32); + } +} + +int mob_read_db_mode_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) +{ + int mode = 0; + config_setting_t *t2; + + if ((t2 = libconfig->setting_get_member(t, "CanMove"))) + mode |= libconfig->setting_get_bool(t2) ? MD_CANMOVE : 0; + if ((t2 = libconfig->setting_get_member(t, "Looter"))) + mode |= libconfig->setting_get_bool(t2) ? MD_LOOTER : 0; + if ((t2 = libconfig->setting_get_member(t, "Aggressive"))) + mode |= libconfig->setting_get_bool(t2) ? MD_AGGRESSIVE : 0; + if ((t2 = libconfig->setting_get_member(t, "Assist"))) + mode |= libconfig->setting_get_bool(t2) ? MD_ASSIST : 0; + if ((t2 = libconfig->setting_get_member(t, "CastSensorIdle"))) + mode |= libconfig->setting_get_bool(t2) ? MD_CASTSENSOR_IDLE : 0; + if ((t2 = libconfig->setting_get_member(t, "Boss"))) + mode |= libconfig->setting_get_bool(t2) ? MD_BOSS : 0; + if ((t2 = libconfig->setting_get_member(t, "Plant"))) + mode |= libconfig->setting_get_bool(t2) ? MD_PLANT : 0; + if ((t2 = libconfig->setting_get_member(t, "CanAttack"))) + mode |= libconfig->setting_get_bool(t2) ? MD_CANATTACK : 0; + if ((t2 = libconfig->setting_get_member(t, "Detector"))) + mode |= libconfig->setting_get_bool(t2) ? MD_DETECTOR : 0; + if ((t2 = libconfig->setting_get_member(t, "CastSensorChase"))) + mode |= libconfig->setting_get_bool(t2) ? MD_CASTSENSOR_CHASE : 0; + if ((t2 = libconfig->setting_get_member(t, "ChangeChase"))) + mode |= libconfig->setting_get_bool(t2) ? MD_CHANGECHASE : 0; + if ((t2 = libconfig->setting_get_member(t, "Angry"))) + mode |= libconfig->setting_get_bool(t2) ? MD_ANGRY : 0; + if ((t2 = libconfig->setting_get_member(t, "ChangeTargetMelee"))) + mode |= libconfig->setting_get_bool(t2) ? MD_CHANGETARGET_MELEE : 0; + if ((t2 = libconfig->setting_get_member(t, "ChangeTargetChase"))) + mode |= libconfig->setting_get_bool(t2) ? MD_CHANGETARGET_CHASE : 0; + if ((t2 = libconfig->setting_get_member(t, "TargetWeak"))) + mode |= libconfig->setting_get_bool(t2) ? MD_TARGETWEAK : 0; + + return mode; +} + +void mob_read_db_mvpdrops_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) +{ + config_setting_t *drop; + int i = 0; + int idx = 0; + int i32; + + while (idx < MAX_MVP_DROP && (drop = libconfig->setting_get_elem(t, i))) { + const char *name = config_setting_name(drop); + int rate_adjust = battle_config.item_rate_mvp; + struct item_data* id = itemdb->search_name(name); + int value = 0; + if (!id) + { + ShowWarning("mob_read_db: mvp drop item %s not found in monster %d\n", name, class_); + i ++; + continue; + } + if (mob->get_const(drop, &i32) && i32 >= 0) { + value = i32; + } + if (value <= 0) + { + ShowWarning("mob_read_db: wrong drop chance %d for mvp drop item %s in monster %d\n", value, name, class_); + i ++; + continue; + } + entry->mvpitem[idx].nameid = id->nameid; + if (!entry->mvpitem[idx].nameid) { + entry->mvpitem[idx].p = 0; //No item.... + i ++; + continue; + } + mob->item_dropratio_adjust(entry->mvpitem[idx].nameid, class_, &rate_adjust); + entry->mvpitem[idx].p = mob->drop_adjust(value, rate_adjust, battle_config.item_drop_mvp_min, battle_config.item_drop_mvp_max); + + //calculate and store Max available drop chance of the MVP item + if (entry->mvpitem[idx].p) { + if (id->maxchance == -1 || (id->maxchance < entry->mvpitem[idx].p/10 + 1) ) { + //item has bigger drop chance or sold in shops + id->maxchance = entry->mvpitem[idx].p/10 + 1; //reduce MVP drop info to not spoil common drop rate + } + } + i++; + idx++; + } + if (idx == MAX_MVP_DROP && libconfig->setting_get_elem(t, i)) { + ShowWarning("mob_read_db: Too many mvp drops in mob %d\n", class_); + } +} + +void mob_read_db_drops_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) +{ + config_setting_t *drop; + int i = 0; + int idx = 0; + int i32; + int k; + + while (idx < MAX_MOB_DROP && (drop = libconfig->setting_get_elem(t, i))) { + const char *name = config_setting_name(drop); + int rate_adjust, type; + unsigned short ratemin, ratemax; + struct item_data* id = itemdb->search_name(name); + int value = 0; + if (!id) + { + ShowWarning("mob_read_db: drop item %s not found in monster %d\n", name, class_); + i ++; + continue; + } + if (mob->get_const(drop, &i32) && i32 >= 0) { + value = i32; + } + if (value <= 0) + { + ShowWarning("mob_read_db: wrong drop chance %d for drop item %s in monster %d\n", value, name, class_); + i ++; + continue; + } + + entry->dropitem[idx].nameid = id->nameid; + if (!entry->dropitem[idx].nameid) { + entry->dropitem[idx].p = 0; //No drop. + i ++; + continue; + } + type = id->type; + if ((class_ >= 1324 && class_ <= 1363) || (class_ >= 1938 && class_ <= 1946)) { + //Treasure box drop rates [Skotlex] + rate_adjust = battle_config.item_rate_treasure; + ratemin = battle_config.item_drop_treasure_min; + ratemax = battle_config.item_drop_treasure_max; + } + else switch (type) + { // Added support to restrict normal drops of MVP's [Reddozen] + case IT_HEALING: + rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_heal_boss : battle_config.item_rate_heal; + ratemin = battle_config.item_drop_heal_min; + ratemax = battle_config.item_drop_heal_max; + break; + case IT_USABLE: + case IT_CASH: + rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_use_boss : battle_config.item_rate_use; + ratemin = battle_config.item_drop_use_min; + ratemax = battle_config.item_drop_use_max; + break; + case IT_WEAPON: + case IT_ARMOR: + case IT_PETARMOR: + rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_equip_boss : battle_config.item_rate_equip; + ratemin = battle_config.item_drop_equip_min; + ratemax = battle_config.item_drop_equip_max; + break; + case IT_CARD: + rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_card_boss : battle_config.item_rate_card; + ratemin = battle_config.item_drop_card_min; + ratemax = battle_config.item_drop_card_max; + break; + default: + rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_common_boss : battle_config.item_rate_common; + ratemin = battle_config.item_drop_common_min; + ratemax = battle_config.item_drop_common_max; + break; + } + mob->item_dropratio_adjust(id->nameid, class_, &rate_adjust); + entry->dropitem[idx].p = mob->drop_adjust(value, rate_adjust, ratemin, ratemax); + + //calculate and store Max available drop chance of the item + if (entry->dropitem[idx].p && (class_ < 1324 || class_ > 1363) && (class_ < 1938 || class_ > 1946)) + { //Skip treasure chests. + if (id->maxchance == -1 || (id->maxchance < entry->dropitem[idx].p) ) { + id->maxchance = entry->dropitem[idx].p; //item has bigger drop chance or sold in shops + } + for (k = 0; k< MAX_SEARCH; k++) { + if (id->mob[k].chance <= entry->dropitem[idx].p) + break; + } + if (k == MAX_SEARCH) + { + i++; + idx++; + continue; + } + + if (id->mob[k].id != class_ && k != MAX_SEARCH - 1) + memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0])); + id->mob[k].chance = entry->dropitem[idx].p; + id->mob[k].id = class_; + } + i++; + idx++; + } + if (idx == MAX_MOB_DROP && libconfig->setting_get_elem(t, i)) { + ShowWarning("mob_read_db: Too many drops in mob %d\n", class_); + } +} + /*========================================== * processes one mobdb entry *------------------------------------------*/ -bool mob_parse_dbrow(char** str) { - struct mob_db *db, entry; +bool mob_read_db_sub(config_setting_t *mobt, int id, const char *source) +{ + struct mob_db *entry = NULL, tmpEntry; + config_setting_t *t = NULL; + int i32 = 0, value = 0, class_ = 0; struct status_data *mstatus; - int class_, i; - double exp, maxhp; struct mob_data data; - - class_ = atoi(str[0]); + const char *str = NULL; + double maxhp; + double exp; + bool inherit = false; + bool range2Updated = false; + bool range3Updated = false; + bool dmotionUpdated = false; + bool maxhpUpdated = false; + bool maxspUpdated = false; + + entry = &tmpEntry; + if (!libconfig->setting_lookup_int(mobt, "Id", &class_)) { + ShowWarning("mob_read_db_sub: Missing id in \"%s\", entry #%d, skipping.\n", source, class_); + return false; + } if (class_ <= 1000 || class_ > MAX_MOB_DB) { - ShowError("mob_parse_dbrow: Invalid monster ID %d, must be in range %d-%d.\n", class_, 1000, MAX_MOB_DB); + ShowError("mob_read_db_sub: Invalid monster ID %d, must be in range %d-%d.\n", class_, 1000, MAX_MOB_DB); return false; } if (pc->db_checkid(class_)) { - ShowError("mob_parse_dbrow: Invalid monster ID %d, reserved for player classes.\n", class_); + ShowError("mob_read_db_sub: Invalid monster ID %d, reserved for player classes.\n", class_); return false; } if (class_ >= MOB_CLONE_START && class_ < MOB_CLONE_END) { - ShowError("mob_parse_dbrow: Invalid monster ID %d. Range %d-%d is reserved for player clones. Please increase MAX_MOB_DB (%d).\n", class_, MOB_CLONE_START, MOB_CLONE_END-1, MAX_MOB_DB); + ShowError("mob_read_db_sub: Invalid monster ID %d. Range %d-%d is reserved for player clones. Please increase MAX_MOB_DB (%d).\n", class_, MOB_CLONE_START, MOB_CLONE_END-1, MAX_MOB_DB); return false; } - memset(&entry, 0, sizeof(entry)); + if ((t = libconfig->setting_get_member(mobt, "Inherit")) && (inherit = libconfig->setting_get_bool(t))) { + if (!mob->db_data[class_]) { + ShowWarning("mob_read_db_sub: Trying to inherit nonexistent mob %d, default values will be used instead.\n", class_); + inherit = false; + } else { + // Use old entry as default + struct mob_db *old_entry = mob->db_data[class_]; + memcpy(entry, old_entry, sizeof(struct mob_db)); + inherit = true; + } + } + if (!inherit) { + memset(&tmpEntry, 0, sizeof(tmpEntry)); + } - db = &entry; - mstatus = &db->status; + mstatus = &entry->status; - db->vd.class_ = class_; - safestrncpy(db->sprite, str[1], sizeof(db->sprite)); - safestrncpy(db->jname, str[2], sizeof(db->jname)); - safestrncpy(db->name, str[3], sizeof(db->name)); - db->lv = atoi(str[4]); - db->lv = cap_value(db->lv, 1, USHRT_MAX); - mstatus->max_hp = atoi(str[5]); - mstatus->max_sp = atoi(str[6]); + entry->vd.class_ = class_; - exp = (double)atoi(str[7]) * (double)battle_config.base_exp_rate / 100.; - db->base_exp = (unsigned int)cap_value(exp, 0, UINT_MAX); + if (!libconfig->setting_lookup_string(mobt, "SpriteName", &str) || !*str ) { + if (!inherit) { + ShowWarning("mob_read_db_sub: Missing SpriteName in mob %d of \"%s\", skipping.\n", class_, source); + return false; + } + } else { + safestrncpy(entry->sprite, str, sizeof(entry->sprite)); + } - exp = (double)atoi(str[8]) * (double)battle_config.job_exp_rate / 100.; - db->job_exp = (unsigned int)cap_value(exp, 0, UINT_MAX); + if (!libconfig->setting_lookup_string(mobt, "Name", &str) || !*str ) { + if (!inherit) { + ShowWarning("mob_read_db_sub: Missing Name in mob %d of \"%s\", skipping.\n", class_, source); + return false; + } + } else { + safestrncpy(entry->name, str, sizeof(entry->name)); + safestrncpy(entry->jname, str, sizeof(entry->jname)); + } + + if (mob->lookup_const(mobt, "Lv", &i32) && i32 >= 0) { + entry->lv = i32; + entry->lv = cap_value(entry->lv, 1, USHRT_MAX); + } else if (!inherit) { + entry->lv = 1; + } + + if (mob->lookup_const(mobt, "Hp", &i32) && i32 >= 0) { + mstatus->max_hp = i32; + maxhpUpdated = true; + } else if (!inherit) { + mstatus->max_hp = 1; + maxhpUpdated = true; + } + + if (mob->lookup_const(mobt, "Sp", &i32) && i32 >= 0) { + mstatus->max_sp = i32; + maxspUpdated = true; + } else if (!inherit) { + maxspUpdated = true; + } - mstatus->rhw.range = atoi(str[9]); + if (mob->lookup_const(mobt, "Exp", &i32) && i32 >= 0) { + exp = (double)(i32) * (double)battle_config.base_exp_rate / 100.; + entry->base_exp = (unsigned int)cap_value(exp, 0, UINT_MAX); + } - mstatus->rhw.atk = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[10])); - mstatus->rhw.atk2 = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[11])); + if (mob->lookup_const(mobt, "JExp", &i32) && i32 >= 0) { + exp = (double)(i32) * (double)battle_config.job_exp_rate / 100.; + entry->job_exp = (unsigned int)cap_value(exp, 0, UINT_MAX); + } - mstatus->def = mob_parse_dbrow_cap_value(class_,DEFTYPE_MIN,DEFTYPE_MAX,atoi(str[12])); - mstatus->mdef = mob_parse_dbrow_cap_value(class_,DEFTYPE_MIN,DEFTYPE_MAX,atoi(str[13])); + if (mob->lookup_const(mobt, "AttackRange", &i32) && i32 >= 0) { + mstatus->rhw.range = i32; + } else { + mstatus->rhw.range = 1; + } + + if ((t = libconfig->setting_get_member(mobt, "Attack"))) { + if (config_setting_is_aggregate(t)) { + if (libconfig->setting_length(t) >= 2) + mstatus->rhw.atk2 = libconfig->setting_get_int_elem(t, 1); + if (libconfig->setting_length(t) >= 1) + mstatus->rhw.atk = libconfig->setting_get_int_elem(t, 0); + } else if (mob->lookup_const(mobt, "Attack", &i32) && i32 >= 0) { + mstatus->rhw.atk = i32; + mstatus->rhw.atk2 = i32; + } + } - mstatus->str = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[14])); - mstatus->agi = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[15])); - mstatus->vit = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[16])); - mstatus->int_ = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[17])); - mstatus->dex = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[18])); - mstatus->luk = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[19])); + if (mob->lookup_const(mobt, "Def", &i32) && i32 >= 0) { + mstatus->def = mob_parse_dbrow_cap_value(class_, DEFTYPE_MIN, DEFTYPE_MAX, i32); + } + if (mob->lookup_const(mobt, "Mdef", &i32) && i32 >= 0) { + mstatus->mdef = mob_parse_dbrow_cap_value(class_, DEFTYPE_MIN, DEFTYPE_MAX, i32); + } + + if ((t = libconfig->setting_get_member(mobt, "Stats"))) { + if (config_setting_is_group(t)) { + mob->read_db_stats_sub(entry, mstatus, class_, t); + } else if (mob->lookup_const(mobt, "Stats", &i32) && i32 >= 0) { + mstatus->str = mstatus->agi = mstatus->vit = mstatus->int_ = mstatus->dex = mstatus->luk = + mob_parse_dbrow_cap_value(class_, UINT16_MIN, UINT16_MAX, i32); + } + } /* * Disabled for renewal since difference of 0 and 1 still has an impact in the formulas @@ -3733,265 +4038,254 @@ bool mob_parse_dbrow(char** str) { #endif //Tests showed that chase range is effectively 2 cells larger than expected [Playtester] - if (db->range3 > 0) - db->range3 += 2; + if (entry->range3 > 0) + entry->range3 += 2; + + if (mob->lookup_const(mobt, "ViewRange", &i32) && i32 >= 0) { + entry->range2 = i32; + range2Updated = true; + } else if (!inherit) { + entry->range2 = 1; + range2Updated = true; + } + + if (mob->lookup_const(mobt, "ChaseRange", &i32) && i32 >= 0) { + entry->range3 = i32; + range3Updated = true; + } else if (!inherit) { + entry->range3 = 1; + range3Updated = true; + } + if (range2Updated) { + if (battle_config.view_range_rate != 100) { + entry->range2 = entry->range2 * battle_config.view_range_rate / 100; + if (entry->range2 < 1) + entry->range2 = 1; + } + } + if (range3Updated) { + if (battle_config.chase_range_rate != 100) { + entry->range3 = entry->range3 * battle_config.chase_range_rate / 100; + if (entry->range3 < entry->range2) + entry->range3 = entry->range2; + } + } - db->range2 = atoi(str[20]); - db->range3 = atoi(str[21]); - if (battle_config.view_range_rate != 100) { - db->range2 = db->range2 * battle_config.view_range_rate / 100; - if (db->range2 < 1) - db->range2 = 1; + if (mob->lookup_const(mobt, "Size", &i32) && i32 >= 0) { + mstatus->size = i32; + mstatus->size = cap_value(mstatus->size, 0, 2); + } else if (!inherit) { + mstatus->size = 0; } - if (battle_config.chase_range_rate != 100) { - db->range3 = db->range3 * battle_config.chase_range_rate / 100; - if (db->range3 < db->range2) - db->range3 = db->range2; + + if (mob->lookup_const(mobt, "Race", &i32) && i32 >= 0) { + mstatus->race = i32; + mstatus->race = cap_value(mstatus->race, 0, RC_MAX - 1); + } else if (!inherit) { + mstatus->race = 0; } - mstatus->size = atoi(str[22]); - mstatus->race = atoi(str[23]); + if ((t = libconfig->setting_get_member(mobt, "Element")) && config_setting_is_list(t)) { + if (mob->get_const(libconfig->setting_get_elem(t, 0), &i32) && mob->get_const(libconfig->setting_get_elem(t, 1), &value)) { + mstatus->def_ele = i32; + mstatus->ele_lv = value; + } + } else { + if (!inherit) { + ShowError("mob_read_db_sub: Missing element for monster ID %d.\n", class_); + return false; + } + } - i = atoi(str[24]); //Element - mstatus->def_ele = i%10; - mstatus->ele_lv = i/20; if (mstatus->def_ele >= ELE_MAX) { - ShowError("mob_parse_dbrow: Invalid element type %d for monster ID %d (max=%d).\n", mstatus->def_ele, class_, ELE_MAX-1); - return false; + if (!inherit) { + ShowError("mob_read_db_sub: Invalid element type %d for monster ID %d (max=%d).\n", mstatus->def_ele, class_, ELE_MAX-1); + return false; + } } if (mstatus->ele_lv < 1 || mstatus->ele_lv > 4) { - ShowError("mob_parse_dbrow: Invalid element level %d for monster ID %d, must be in range 1-4.\n", mstatus->ele_lv, class_); - return false; + if (!inherit) { + ShowError("mob_read_db_sub: Invalid element level %d for monster ID %d, must be in range 1-4.\n", mstatus->ele_lv, class_); + return false; + } + } + + if ((t = libconfig->setting_get_member(mobt, "Mode"))) { + if (config_setting_is_group(t)) { + mstatus->mode = mob->read_db_mode_sub(entry, mstatus, class_, t); + } else if (mob->lookup_const(mobt, "Mode", &i32) && i32 >= 0) { + mstatus->mode = i32; + } } - mstatus->mode = (int)strtol(str[25], NULL, 0); if (!battle_config.monster_active_enable) mstatus->mode &= ~MD_AGGRESSIVE; - mstatus->speed = atoi(str[26]); + if (mob->lookup_const(mobt, "MoveSpeed", &i32) && i32 >= 0) { + mstatus->speed = i32; + } + mstatus->aspd_rate = 1000; - i = atoi(str[27]); - mstatus->adelay = cap_value(i, battle_config.monster_max_aspd*2, 4000); - i = atoi(str[28]); - mstatus->amotion = cap_value(i, battle_config.monster_max_aspd, 2000); + + if (mob->lookup_const(mobt, "AttackDelay", &i32) && i32 >= 0) { + mstatus->adelay = cap_value(i32, battle_config.monster_max_aspd*2, 4000); + } else if (!inherit) { + mstatus->adelay = 4000; + } + + if (mob->lookup_const(mobt, "AttackMotion", &i32) && i32 >= 0) { + mstatus->amotion = cap_value(i32, battle_config.monster_max_aspd, 2000); + } else if (!inherit) { + mstatus->amotion = 2000; + } + //If the attack animation is longer than the delay, the client crops the attack animation! //On aegis there is no real visible effect of having a recharge-time less than amotion anyway. if (mstatus->adelay < mstatus->amotion) mstatus->adelay = mstatus->amotion; - mstatus->dmotion = atoi(str[29]); - if(battle_config.monster_damage_delay_rate != 100) + + if (mob->lookup_const(mobt, "DamageMotion", &i32) && i32 >= 0) { + mstatus->dmotion = i32; + dmotionUpdated = true; + } else if (!inherit) { + dmotionUpdated = true; + } + + if (dmotionUpdated && battle_config.monster_damage_delay_rate != 100) mstatus->dmotion = mstatus->dmotion * battle_config.monster_damage_delay_rate / 100; // Fill in remaining status data by using a dummy monster. data.bl.type = BL_MOB; - data.level = db->lv; + data.level = entry->lv; memcpy(&data.status, mstatus, sizeof(struct status_data)); - status->calc_misc(&data.bl, mstatus, db->lv); + status->calc_misc(&data.bl, mstatus, entry->lv); // MVP EXP Bonus: MEXP // Some new MVP's MEXP multiple by high exp-rate cause overflow. [LuzZza] - exp = (double)atoi(str[30]) * (double)battle_config.mvp_exp_rate / 100.; - db->mexp = (unsigned int)cap_value(exp, 0, UINT_MAX); - - //Now that we know if it is an mvp or not, apply battle_config modifiers [Skotlex] - maxhp = (double)mstatus->max_hp; - if (db->mexp > 0) { //Mvp - if (battle_config.mvp_hp_rate != 100) - maxhp = maxhp * (double)battle_config.mvp_hp_rate / 100.; - } else //Normal mob - if (battle_config.monster_hp_rate != 100) - maxhp = maxhp * (double)battle_config.monster_hp_rate / 100.; - - mstatus->max_hp = (unsigned int)cap_value(maxhp, 1, UINT_MAX); - if(mstatus->max_sp < 1) mstatus->max_sp = 1; + if (mob->lookup_const(mobt, "MvpExp", &i32) && i32 >= 0) { + exp = (double)i32 * (double)battle_config.mvp_exp_rate / 100.; + entry->mexp = (unsigned int)cap_value(exp, 0, UINT_MAX); + } else if (!inherit) { + exp = 0; + } + + if (maxhpUpdated) { + //Now that we know if it is an mvp or not, apply battle_config modifiers [Skotlex] + maxhp = (double)mstatus->max_hp; + if (entry->mexp > 0) { //Mvp + if (battle_config.mvp_hp_rate != 100) + maxhp = maxhp * (double)battle_config.mvp_hp_rate / 100.; + } else { //Normal mob + if (battle_config.monster_hp_rate != 100) + maxhp = maxhp * (double)battle_config.monster_hp_rate / 100.; + } + mstatus->max_hp = (unsigned int)cap_value(maxhp, 1, UINT_MAX); + } + if (maxspUpdated) { + if(mstatus->max_sp < 1) mstatus->max_sp = 1; + } //Since mobs always respawn with full life... mstatus->hp = mstatus->max_hp; mstatus->sp = mstatus->max_sp; - // MVP Drops: MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per - for(i = 0; i < MAX_MVP_DROP; i++) { - int rate_adjust = battle_config.item_rate_mvp;; - db->mvpitem[i].nameid = atoi(str[31+i*2]); - if (!db->mvpitem[i].nameid) { - db->mvpitem[i].p = 0; //No item.... - continue; - } - mob->item_dropratio_adjust(db->mvpitem[i].nameid, class_, &rate_adjust); - db->mvpitem[i].p = mob->drop_adjust(atoi(str[32+i*2]), rate_adjust, battle_config.item_drop_mvp_min, battle_config.item_drop_mvp_max); - - //calculate and store Max available drop chance of the MVP item - if (db->mvpitem[i].p) { - struct item_data *id; - id = itemdb->search(db->mvpitem[i].nameid); - if (id->maxchance == -1 || (id->maxchance < db->mvpitem[i].p/10 + 1) ) { - //item has bigger drop chance or sold in shops - id->maxchance = db->mvpitem[i].p/10 + 1; //reduce MVP drop info to not spoil common drop rate - } + if ((t = libconfig->setting_get_member(mobt, "MvpDrops"))) { + if (config_setting_is_group(t)) { + mob->read_db_mvpdrops_sub(entry, mstatus, class_, t); } } - for(i = 0; i < MAX_MOB_DROP; i++) { - int rate = 0, rate_adjust, type; - unsigned short ratemin, ratemax; - struct item_data *id; - int k = 31 + MAX_MVP_DROP*2 + i*2; - db->dropitem[i].nameid = atoi(str[k]); - if (!db->dropitem[i].nameid) { - db->dropitem[i].p = 0; //No drop. - continue; - } - id = itemdb->search(db->dropitem[i].nameid); - type = id->type; - rate = atoi(str[k+1]); - if( (class_ >= 1324 && class_ <= 1363) || (class_ >= 1938 && class_ <= 1946) ) { - //Treasure box drop rates [Skotlex] - rate_adjust = battle_config.item_rate_treasure; - ratemin = battle_config.item_drop_treasure_min; - ratemax = battle_config.item_drop_treasure_max; - } - else switch (type) - { // Added support to restrict normal drops of MVP's [Reddozen] - case IT_HEALING: - rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_heal_boss : battle_config.item_rate_heal; - ratemin = battle_config.item_drop_heal_min; - ratemax = battle_config.item_drop_heal_max; - break; - case IT_USABLE: - case IT_CASH: - rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_use_boss : battle_config.item_rate_use; - ratemin = battle_config.item_drop_use_min; - ratemax = battle_config.item_drop_use_max; - break; - case IT_WEAPON: - case IT_ARMOR: - case IT_PETARMOR: - rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_equip_boss : battle_config.item_rate_equip; - ratemin = battle_config.item_drop_equip_min; - ratemax = battle_config.item_drop_equip_max; - break; - case IT_CARD: - rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_card_boss : battle_config.item_rate_card; - ratemin = battle_config.item_drop_card_min; - ratemax = battle_config.item_drop_card_max; - break; - default: - rate_adjust = (mstatus->mode&MD_BOSS) ? battle_config.item_rate_common_boss : battle_config.item_rate_common; - ratemin = battle_config.item_drop_common_min; - ratemax = battle_config.item_drop_common_max; - break; - } - mob->item_dropratio_adjust(id->nameid, class_, &rate_adjust); - db->dropitem[i].p = mob->drop_adjust(rate, rate_adjust, ratemin, ratemax); - - //calculate and store Max available drop chance of the item - if( db->dropitem[i].p && (class_ < 1324 || class_ > 1363) && (class_ < 1938 || class_ > 1946) ) - { //Skip treasure chests. - if (id->maxchance == -1 || (id->maxchance < db->dropitem[i].p) ) { - id->maxchance = db->dropitem[i].p; //item has bigger drop chance or sold in shops - } - for (k = 0; k< MAX_SEARCH; k++) { - if (id->mob[k].chance <= db->dropitem[i].p) - break; - } - if (k == MAX_SEARCH) - continue; - - if (id->mob[k].id != class_ && k != MAX_SEARCH - 1) - memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0])); - id->mob[k].chance = db->dropitem[i].p; - id->mob[k].id = class_; + if ((t = libconfig->setting_get_member(mobt, "Drops"))) { + if (config_setting_is_group(t)) { + mob->read_db_drops_sub(entry, mstatus, class_, t); } } + + mob->read_db_additional_fields(entry, class_, mobt, id, source); // Finally insert monster's data into the database. if (mob->db_data[class_] == NULL) mob->db_data[class_] = (struct mob_db*)aMalloc(sizeof(struct mob_db)); else //Copy over spawn data - memcpy(&db->spawn, mob->db_data[class_]->spawn, sizeof(db->spawn)); + memcpy(&entry->spawn, mob->db_data[class_]->spawn, sizeof(entry->spawn)); - memcpy(mob->db_data[class_], db, sizeof(struct mob_db)); + memcpy(mob->db_data[class_], entry, sizeof(struct mob_db)); return true; } -/*========================================== - * mob_db.txt reading - *------------------------------------------*/ -bool mob_readdb_sub(char* fields[], int columns, int current) { - return mob->parse_dbrow(fields); +void mob_read_db_additional_fields(struct mob_db *entry, int class_, config_setting_t *it, int n, const char *source) +{ + // do nothing. plugins can do own work } -void mob_readdb(void) { - const char* filename[] = { - DBPATH"mob_db.txt", - "mob_db2.txt" }; - int fi; - - for( fi = 0; fi < ARRAYLENGTH(filename); ++fi ) { - if(fi > 0) { - char filepath[256]; - sprintf(filepath, "%s/%s", map->db_path, filename[fi]); - if(!exists(filepath)) { - continue; - } +bool mob_lookup_const(const config_setting_t *it, const char *name, int *value) +{ + if (libconfig->setting_lookup_int(it, name, value)) + { + return true; + } + else + { + const char *str = NULL; + if (libconfig->setting_lookup_string(it, name, &str)) + { + if (*str && script->get_constant(str, value)) + return true; } - - sv->readdb(map->db_path, filename[fi], ',', 31+2*MAX_MVP_DROP+2*MAX_MOB_DROP, 31+2*MAX_MVP_DROP+2*MAX_MOB_DROP, -1, mob->readdb_sub); } - mob->name_constants(); + return false; } -/*========================================== - * mob_db table reading - *------------------------------------------*/ -int mob_read_sqldb(void) { - const char* mob_db_name[] = { - map->mob_db_db, - map->mob_db2_db - }; - int fi; +bool mob_get_const(const config_setting_t *it, int *value) +{ + const char *str = config_setting_get_string(it); + if (str && *str && script->get_constant(str, value)) + return true; - for( fi = 0; fi < ARRAYLENGTH(mob_db_name); ++fi ) { - uint32 lines = 0, count = 0; + *value = libconfig->setting_get_int(it); + return true; +} - // retrieve all rows from the mob database - if( SQL_ERROR == SQL->Query(map->mysql_handle, "SELECT * FROM `%s`", mob_db_name[fi]) ) { - Sql_ShowDebug(map->mysql_handle); - continue; - } +/*========================================== + * mob_db.txt reading + *------------------------------------------*/ +void mob_readdb(void) { + const char* filename[] = { + DBPATH"mob_db.conf", + "mob_db2.conf" }; + int i; - // process rows one by one - while( SQL_SUCCESS == SQL->NextRow(map->mysql_handle) ) { - // wrap the result into a TXT-compatible format - char line[1024]; - char* str[31+2*MAX_MVP_DROP+2*MAX_MOB_DROP]; - char* p; - int i; + for (i = 0; i < ARRAYLENGTH(filename); ++i) { + mob->read_libconfig(filename[i], i > 0 ? true : false); + } + mob->name_constants(); +} - lines++; - for(i = 0, p = line; i < 31+2*MAX_MVP_DROP+2*MAX_MOB_DROP; i++) - { - char* data; - size_t len; - SQL->GetData(map->mysql_handle, i, &data, &len); - strcpy(p, data); - str[i] = p; - p+= len + 1; - } +int mob_read_libconfig(const char *filename, bool ignore_missing) +{ + config_t mob_db_conf; + char filepath[256]; + config_setting_t *mdb; + config_setting_t *t; + int i = 0; - if (!mob->parse_dbrow(str)) - continue; + nullpo_ret(filename); + sprintf(filepath, "%s/%s", map->db_path, filename); - count++; - } + if (ignore_missing && !exists(filepath)) + return 0; - // free the query result - SQL->FreeResult(map->mysql_handle); + if (libconfig->read_file(&mob_db_conf, filepath) || !(mdb = libconfig->setting_get_member(mob_db_conf.root, "mob_db"))) { + ShowError("can't read %s\n", filepath); + return -1; + } - ShowStatus("Done reading '"CL_WHITE"%"PRIu32""CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, mob_db_name[fi]); + while ((t = libconfig->setting_get_elem(mdb, i++))) { + mob->read_db_sub(t, i - 1, filepath); } - mob->name_constants(); + libconfig->destroy(&mob_db_conf); + ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", i, filepath); return 0; } @@ -4630,13 +4924,10 @@ void mob_load(bool minimal) { } sv->readdb(map->db_path, "mob_item_ratio.txt", ',', 2, 2+MAX_ITEMRATIO_MOBS, -1, mob->readdb_itemratio); // must be read before mobdb mob->readchatdb(); - if (map->db_use_sql_mob_db) { - mob->read_sqldb(); - } + mob->readdb(); if (map->db_use_sql_mob_skill_db) { mob->read_sqlskilldb(); } else { - mob->readdb(); mob->readskilldb(); } sv->readdb(map->db_path, "mob_avail.txt", ',', 2, 12, -1, mob->readdb_mobavail); @@ -4847,10 +5138,16 @@ void mob_defaults(void) { mob->clone_delete = mob_clone_delete; mob->drop_adjust = mob_drop_adjust; mob->item_dropratio_adjust = item_dropratio_adjust; - mob->parse_dbrow = mob_parse_dbrow; - mob->readdb_sub = mob_readdb_sub; + mob->lookup_const = mob_lookup_const; + mob->get_const = mob_get_const; mob->readdb = mob_readdb; - mob->read_sqldb = mob_read_sqldb; + mob->read_libconfig = mob_read_libconfig; + mob->read_db_additional_fields = mob_read_db_additional_fields; + mob->read_db_sub = mob_read_db_sub; + mob->read_db_drops_sub = mob_read_db_drops_sub; + mob->read_db_mvpdrops_sub = mob_read_db_mvpdrops_sub; + mob->read_db_mode_sub = mob_read_db_mode_sub; + mob->read_db_stats_sub = mob_read_db_stats_sub; mob->name_constants = mob_name_constants; mob->readdb_mobavail = mob_readdb_mobavail; mob->read_randommonster = mob_read_randommonster; diff --git a/src/map/mob.h b/src/map/mob.h index bb26258c6..cc81c2fc3 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -363,10 +363,16 @@ struct mob_interface { int (*clone_delete) (struct mob_data *md); unsigned int (*drop_adjust) (int baserate, int rate_adjust, unsigned short rate_min, unsigned short rate_max); void (*item_dropratio_adjust) (int nameid, int mob_id, int *rate_adjust); - bool (*parse_dbrow) (char **str); - bool (*readdb_sub) (char *fields[], int columns, int current); void (*readdb) (void); - int (*read_sqldb) (void); + bool (*lookup_const) (const config_setting_t *it, const char *name, int *value); + bool (*get_const) (const config_setting_t *it, int *value); + int (*read_libconfig) (const char *filename, bool ignore_missing); + void (*read_db_additional_fields) (struct mob_db *entry, int class_, config_setting_t *it, int n, const char *source); + bool (*read_db_sub) (config_setting_t *mobt, int id, const char *source); + void (*read_db_drops_sub) (struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t); + void (*read_db_mvpdrops_sub) (struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t); + int (*read_db_mode_sub) (struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t); + void (*read_db_stats_sub) (struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t); void (*name_constants) (void); bool (*readdb_mobavail) (char *str[], int columns, int current); int (*read_randommonster) (void); diff --git a/src/map/npc.c b/src/map/npc.c index 24b22beb3..7044fefcf 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -27,7 +27,7 @@ #include "common/cbasetypes.h" #include "common/db.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/socket.h" diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c index 503dbd845..edcd755bc 100644 --- a/src/map/npc_chat.c +++ b/src/map/npc_chat.c @@ -11,7 +11,7 @@ #include "map/mob.h" // struct mob_data #include "map/pc.h" // struct map_session_data #include "map/script.h" // set_var() -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/strlib.h" diff --git a/src/map/party.c b/src/map/party.c index f7e7d431c..3a0b6d518 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -21,7 +21,7 @@ #include "map/status.h" #include "common/HPM.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/path.c b/src/map/path.c index 29701d445..6d9b48837 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -10,7 +10,7 @@ #include "map/map.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/pc.c b/src/map/pc.c index ffe43ab8f..4d4f41521 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -41,7 +41,7 @@ #include "common/conf.h" #include "common/core.h" // get_svn_revision() #include "common/HPM.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" // NAME_LENGTH, MAX_CARTS, NEW_CARTS #include "common/nullpo.h" #include "common/random.h" @@ -4112,7 +4112,10 @@ bool pc_can_insert_card(struct map_session_data* sd, int idx_card) } /*========================================== - * Append a card to an item ? + * Attempt to insert card into item. + * Return: + * 0 = fail + * 1 = success *------------------------------------------*/ int pc_insert_card(struct map_session_data* sd, int idx_card, int idx_equip) { @@ -4143,6 +4146,7 @@ int pc_insert_card(struct map_session_data* sd, int idx_card, int idx_equip) sd->status.inventory[idx_equip].card[i] = nameid; logs->pick_pc(sd, LOG_TYPE_OTHER, 1, &sd->status.inventory[idx_equip],sd->inventory_data[idx_equip]); clif->insert_card(sd,idx_equip,idx_card,0); + return 1; } return 0; diff --git a/src/map/pc_groups.c b/src/map/pc_groups.c index 7efcd7e26..f9633571c 100644 --- a/src/map/pc_groups.c +++ b/src/map/pc_groups.c @@ -13,7 +13,7 @@ #include "common/cbasetypes.h" #include "common/conf.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/strlib.h" // strcmp diff --git a/src/map/pet.c b/src/map/pet.c index 2865cc901..aed49df63 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -25,7 +25,7 @@ #include "map/unit.h" #include "common/db.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/quest.c b/src/map/quest.c index 4958644ee..790e96253 100644 --- a/src/map/quest.c +++ b/src/map/quest.c @@ -21,7 +21,7 @@ #include "map/unit.h" #include "common/cbasetypes.h" #include "common/conf.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/script.c b/src/map/script.c index 5dbe62df3..006daf7b9 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -39,7 +39,7 @@ #include "map/storage.h" #include "map/unit.h" #include "common/cbasetypes.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/md5calc.h" #include "common/mmo.h" // NEW_CARTS #include "common/nullpo.h" diff --git a/src/map/searchstore.c b/src/map/searchstore.c index 46b102ad5..cdcf51b0e 100644 --- a/src/map/searchstore.c +++ b/src/map/searchstore.c @@ -10,7 +10,7 @@ #include "map/clif.h" // clif-"open_search_store_info, clif-"search_store_info_* #include "map/pc.h" // struct map_session_data #include "common/cbasetypes.h" -#include "common/malloc.h" // aMalloc, aRealloc, aFree +#include "common/memmgr.h" // aMalloc, aRealloc, aFree #include "common/showmsg.h" // ShowError, ShowWarning #include "common/strlib.h" // safestrncpy diff --git a/src/map/skill.c b/src/map/skill.c index a9ebf6998..cdf1c031f 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -31,7 +31,7 @@ #include "map/unit.h" #include "common/cbasetypes.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/map/status.c b/src/map/status.c index 25c7e13dc..7a7a4f415 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -28,7 +28,7 @@ #include "map/vending.h" #include "common/cbasetypes.h" #include "common/ers.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" @@ -12279,64 +12279,83 @@ bool status_readdb_sizefix(char* fields[], int columns, int current) * validation errors. * @return # of the validated entry, or 0 in case of failure. */ -int status_readdb_refine_libconfig_sub(config_setting_t *r, const char *name, const char *source) { +int status_readdb_refine_libconfig_sub(config_setting_t *r, const char *name, const char *source) +{ config_setting_t *rate = NULL; - int i=0, type=0, bonus_per_level=0, rnd_bonus_v=0, rnd_bonus_lv=0; + int type = REFINE_TYPE_ARMOR, bonus_per_level = 0, rnd_bonus_v = 0, rnd_bonus_lv = 0; char lv[4]; + nullpo_ret(r); + nullpo_ret(name); + nullpo_ret(source); - if(!strncmp(name, "Armors", 6)) { - type = 0; - } else if(strncmp(name, "WeaponLevel", 11) || !strspn(&name[strlen(name)-1], "0123456789") || !(type = atoi(strncpy(lv, name+11, 2)))) { + if (strncmp(name, "Armors", 6) == 0) { + type = REFINE_TYPE_ARMOR; + } else if (strncmp(name, "WeaponLevel", 11) != 0 || !strspn(&name[strlen(name)-1], "0123456789") || (type = atoi(strncpy(lv, name+11, 2))) == REFINE_TYPE_ARMOR) { ShowError("status_readdb_refine_libconfig_sub: Invalid key name for entry '%s' in \"%s\", skipping.\n", name, source); return 0; } - if(type < REFINE_TYPE_ARMOR || type >= REFINE_TYPE_MAX) { + if (type < REFINE_TYPE_ARMOR || type >= REFINE_TYPE_MAX) { ShowError("status_readdb_refine_libconfig_sub: Out of range level for entry '%s' in \"%s\", skipping.\n", name, source); return 0; - } else if(!libconfig->setting_lookup_int(r, "StatsPerLevel", &bonus_per_level)) { + } + if (!libconfig->setting_lookup_int(r, "StatsPerLevel", &bonus_per_level)) { ShowWarning("status_readdb_refine_libconfig_sub: Missing StatsPerLevel for entry '%s' in \"%s\", skipping.\n", name, source); return 0; - } else if(!libconfig->setting_lookup_int(r, "RandomBonusStartLevel", &rnd_bonus_lv)) { + } + if (!libconfig->setting_lookup_int(r, "RandomBonusStartLevel", &rnd_bonus_lv)) { ShowWarning("status_readdb_refine_libconfig_sub: Missing RandomBonusStartLevel for entry '%s' in \"%s\", skipping.\n", name, source); return 0; - } else if(!libconfig->setting_lookup_int(r, "RandomBonusValue", &rnd_bonus_v)) { + } + if (!libconfig->setting_lookup_int(r, "RandomBonusValue", &rnd_bonus_v)) { ShowWarning("status_readdb_refine_libconfig_sub: Missing RandomBonusValue for entry '%s' in \"%s\", skipping.\n", name, source); return 0; } - if((rate=libconfig->setting_get_member(r, "Rates")) && config_setting_is_group(rate)) { + if ((rate=libconfig->setting_get_member(r, "Rates")) != NULL && config_setting_is_group(rate)) { config_setting_t *t = NULL; bool duplicate[MAX_REFINE]; - int bonus_[MAX_REFINE], rnd_bonus[MAX_REFINE], chance_[MAX_REFINE]; - - memset(&duplicate,0,sizeof(duplicate)); - memset(&bonus_,0,sizeof(bonus_)); - memset(&rnd_bonus,0,sizeof(rnd_bonus)); - memset(&chance_,0,sizeof(chance_)); - i=0; - while( (t = libconfig->setting_get_elem(rate,i++)) && config_setting_is_group(t) ) { - int level=0, chance=0, bonus=0; + int bonus[MAX_REFINE], rnd_bonus[MAX_REFINE], chance[MAX_REFINE]; + int i; + memset(&duplicate, 0, sizeof(duplicate)); + memset(&bonus, 0, sizeof(bonus)); + memset(&rnd_bonus, 0, sizeof(rnd_bonus)); + + for (i = 0; i < MAX_REFINE; i++) { + chance[i] = 100; + } + i = 0; + while ((t = libconfig->setting_get_elem(rate,i++)) != NULL && config_setting_is_group(t)) { + int level = 0, i32; char *rlvl = config_setting_name(t); - memset(&lv,0, sizeof(lv)); - if(!strspn(&rlvl[strlen(rlvl)-1], "0123456789") || (level = atoi(strncpy(lv, rlvl+2, 3))) <= 0) { + memset(&lv, 0, sizeof(lv)); + if (!strspn(&rlvl[strlen(rlvl)-1], "0123456789") || (level = atoi(strncpy(lv, rlvl+2, 3))) <= 0) { ShowError("status_readdb_refine_libconfig_sub: Invalid refine level format '%s' for entry %s in \"%s\"... skipping.\n", rlvl, name, source); continue; - } else if(level <= 0 || level > MAX_REFINE) { + } + if (level <= 0 || level > MAX_REFINE) { ShowError("status_readdb_refine_libconfig_sub: Out of range refine level '%s' for entry %s in \"%s\"... skipping.\n", rlvl, name, source); continue; - } else if(duplicate[level-1]) { - ShowWarning("status_readdb_refine_libconfig_sub: duplicate rate '%s' for entry %s in \"%s\", overwriting previous entry...\n", rlvl, name, source); - } else duplicate[level-1] = true; + } level--; - chance_[level] = libconfig->setting_lookup_int(t, "Chance", &chance)?chance:100; - bonus_[level] = bonus_per_level + libconfig->setting_lookup_int(t, "Bonus", &bonus)?bonus:0; - if ( level >= rnd_bonus_lv - 1 ) rnd_bonus[level] = rnd_bonus_v * (level - rnd_bonus_lv + 2); - } - for(i=0; i < MAX_REFINE; i++) { - status->dbs->refine_info[type].chance[i] = chance_[i]?chance_[i]:100; + if (duplicate[level]) { + ShowWarning("status_readdb_refine_libconfig_sub: duplicate rate '%s' for entry %s in \"%s\", overwriting previous entry...\n", rlvl, name, source); + } else { + duplicate[level] = true; + } + if (libconfig->setting_lookup_int(t, "Chance", &i32)) + chance[level] = i32; + else + chance[level] = 100; + if (libconfig->setting_lookup_int(t, "Bonus", &i32)) + bonus[level] += i32; + if (level >= rnd_bonus_lv - 1) + rnd_bonus[level] = rnd_bonus_v * (level - rnd_bonus_lv + 2); + } + for (i = 0; i < MAX_REFINE; i++) { + status->dbs->refine_info[type].chance[i] = chance[i]; status->dbs->refine_info[type].randombonus_max[i] = rnd_bonus[i]; - bonus_[i] += i?bonus_[i-1]:0; - status->dbs->refine_info[type].bonus[i] = bonus_[i]?bonus_[i]:0; + bonus[i] += bonus_per_level + (i > 0 ? bonus[i-1] : 0); + status->dbs->refine_info[type].bonus[i] = bonus[i]; } } else { ShowWarning("status_readdb_refine_libconfig_sub: Missing refine rates for entry '%s' in \"%s\", skipping.\n", name, source); diff --git a/src/map/storage.c b/src/map/storage.c index fb6e2ed45..29f44f5e7 100644 --- a/src/map/storage.c +++ b/src/map/storage.c @@ -18,7 +18,7 @@ #include "map/pc.h" #include "common/cbasetypes.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include <stdio.h> diff --git a/src/map/unit.c b/src/map/unit.c index dcb5ec900..7c253c5c2 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -34,7 +34,7 @@ #include "map/vending.h" #include "common/HPM.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/random.h" #include "common/showmsg.h" diff --git a/src/plugins/HPMHooking.c b/src/plugins/HPMHooking.c index e5483da5b..a975c034e 100644 --- a/src/plugins/HPMHooking.c +++ b/src/plugins/HPMHooking.c @@ -4,7 +4,7 @@ #include "common/hercules.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/socket.h" @@ -89,7 +89,7 @@ #include "common/conf.h" #include "common/console.h" #include "common/db.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/showmsg.h" #include "common/socket.h" diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc index f36d91718..b7973cd59 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc @@ -3439,14 +3439,26 @@ struct { struct HPMHookPoint *HP_mob_drop_adjust_post; struct HPMHookPoint *HP_mob_item_dropratio_adjust_pre; struct HPMHookPoint *HP_mob_item_dropratio_adjust_post; - struct HPMHookPoint *HP_mob_parse_dbrow_pre; - struct HPMHookPoint *HP_mob_parse_dbrow_post; - struct HPMHookPoint *HP_mob_readdb_sub_pre; - struct HPMHookPoint *HP_mob_readdb_sub_post; struct HPMHookPoint *HP_mob_readdb_pre; struct HPMHookPoint *HP_mob_readdb_post; - struct HPMHookPoint *HP_mob_read_sqldb_pre; - struct HPMHookPoint *HP_mob_read_sqldb_post; + struct HPMHookPoint *HP_mob_lookup_const_pre; + struct HPMHookPoint *HP_mob_lookup_const_post; + struct HPMHookPoint *HP_mob_get_const_pre; + struct HPMHookPoint *HP_mob_get_const_post; + struct HPMHookPoint *HP_mob_read_libconfig_pre; + struct HPMHookPoint *HP_mob_read_libconfig_post; + struct HPMHookPoint *HP_mob_read_db_additional_fields_pre; + struct HPMHookPoint *HP_mob_read_db_additional_fields_post; + struct HPMHookPoint *HP_mob_read_db_sub_pre; + struct HPMHookPoint *HP_mob_read_db_sub_post; + struct HPMHookPoint *HP_mob_read_db_drops_sub_pre; + struct HPMHookPoint *HP_mob_read_db_drops_sub_post; + struct HPMHookPoint *HP_mob_read_db_mvpdrops_sub_pre; + struct HPMHookPoint *HP_mob_read_db_mvpdrops_sub_post; + struct HPMHookPoint *HP_mob_read_db_mode_sub_pre; + struct HPMHookPoint *HP_mob_read_db_mode_sub_post; + struct HPMHookPoint *HP_mob_read_db_stats_sub_pre; + struct HPMHookPoint *HP_mob_read_db_stats_sub_post; struct HPMHookPoint *HP_mob_name_constants_pre; struct HPMHookPoint *HP_mob_name_constants_post; struct HPMHookPoint *HP_mob_readdb_mobavail_pre; @@ -9198,14 +9210,26 @@ struct { int HP_mob_drop_adjust_post; int HP_mob_item_dropratio_adjust_pre; int HP_mob_item_dropratio_adjust_post; - int HP_mob_parse_dbrow_pre; - int HP_mob_parse_dbrow_post; - int HP_mob_readdb_sub_pre; - int HP_mob_readdb_sub_post; int HP_mob_readdb_pre; int HP_mob_readdb_post; - int HP_mob_read_sqldb_pre; - int HP_mob_read_sqldb_post; + int HP_mob_lookup_const_pre; + int HP_mob_lookup_const_post; + int HP_mob_get_const_pre; + int HP_mob_get_const_post; + int HP_mob_read_libconfig_pre; + int HP_mob_read_libconfig_post; + int HP_mob_read_db_additional_fields_pre; + int HP_mob_read_db_additional_fields_post; + int HP_mob_read_db_sub_pre; + int HP_mob_read_db_sub_post; + int HP_mob_read_db_drops_sub_pre; + int HP_mob_read_db_drops_sub_post; + int HP_mob_read_db_mvpdrops_sub_pre; + int HP_mob_read_db_mvpdrops_sub_post; + int HP_mob_read_db_mode_sub_pre; + int HP_mob_read_db_mode_sub_post; + int HP_mob_read_db_stats_sub_pre; + int HP_mob_read_db_stats_sub_post; int HP_mob_name_constants_pre; int HP_mob_name_constants_post; int HP_mob_readdb_mobavail_pre; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc index dacb51580..3ecb82965 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc @@ -1754,10 +1754,16 @@ struct HookingPointData HookingPoints[] = { { HP_POP(mob->clone_delete, HP_mob_clone_delete) }, { HP_POP(mob->drop_adjust, HP_mob_drop_adjust) }, { HP_POP(mob->item_dropratio_adjust, HP_mob_item_dropratio_adjust) }, - { HP_POP(mob->parse_dbrow, HP_mob_parse_dbrow) }, - { HP_POP(mob->readdb_sub, HP_mob_readdb_sub) }, { HP_POP(mob->readdb, HP_mob_readdb) }, - { HP_POP(mob->read_sqldb, HP_mob_read_sqldb) }, + { HP_POP(mob->lookup_const, HP_mob_lookup_const) }, + { HP_POP(mob->get_const, HP_mob_get_const) }, + { HP_POP(mob->read_libconfig, HP_mob_read_libconfig) }, + { HP_POP(mob->read_db_additional_fields, HP_mob_read_db_additional_fields) }, + { HP_POP(mob->read_db_sub, HP_mob_read_db_sub) }, + { HP_POP(mob->read_db_drops_sub, HP_mob_read_db_drops_sub) }, + { HP_POP(mob->read_db_mvpdrops_sub, HP_mob_read_db_mvpdrops_sub) }, + { HP_POP(mob->read_db_mode_sub, HP_mob_read_db_mode_sub) }, + { HP_POP(mob->read_db_stats_sub, HP_mob_read_db_stats_sub) }, { HP_POP(mob->name_constants, HP_mob_name_constants) }, { HP_POP(mob->readdb_mobavail, HP_mob_readdb_mobavail) }, { HP_POP(mob->read_randommonster, HP_mob_read_randommonster) }, diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc index 7ae0d9d48..645873e13 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc @@ -45921,15 +45921,41 @@ void HP_mob_item_dropratio_adjust(int nameid, int mob_id, int *rate_adjust) { } return; } -bool HP_mob_parse_dbrow(char **str) { +void HP_mob_readdb(void) { + int hIndex = 0; + if( HPMHooks.count.HP_mob_readdb_pre ) { + void (*preHookFunc) (void); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_readdb_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_readdb_pre[hIndex].func; + preHookFunc(); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.mob.readdb(); + } + if( HPMHooks.count.HP_mob_readdb_post ) { + void (*postHookFunc) (void); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_readdb_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_readdb_post[hIndex].func; + postHookFunc(); + } + } + return; +} +bool HP_mob_lookup_const(const config_setting_t *it, const char *name, int *value) { int hIndex = 0; bool retVal___ = false; - if( HPMHooks.count.HP_mob_parse_dbrow_pre ) { - bool (*preHookFunc) (char **str); + if( HPMHooks.count.HP_mob_lookup_const_pre ) { + bool (*preHookFunc) (const config_setting_t *it, const char *name, int *value); *HPMforce_return = false; - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_parse_dbrow_pre; hIndex++ ) { - preHookFunc = HPMHooks.list.HP_mob_parse_dbrow_pre[hIndex].func; - retVal___ = preHookFunc(str); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_lookup_const_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_lookup_const_pre[hIndex].func; + retVal___ = preHookFunc(it, name, value); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -45937,26 +45963,26 @@ bool HP_mob_parse_dbrow(char **str) { } } { - retVal___ = HPMHooks.source.mob.parse_dbrow(str); + retVal___ = HPMHooks.source.mob.lookup_const(it, name, value); } - if( HPMHooks.count.HP_mob_parse_dbrow_post ) { - bool (*postHookFunc) (bool retVal___, char **str); - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_parse_dbrow_post; hIndex++ ) { - postHookFunc = HPMHooks.list.HP_mob_parse_dbrow_post[hIndex].func; - retVal___ = postHookFunc(retVal___, str); + if( HPMHooks.count.HP_mob_lookup_const_post ) { + bool (*postHookFunc) (bool retVal___, const config_setting_t *it, const char *name, int *value); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_lookup_const_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_lookup_const_post[hIndex].func; + retVal___ = postHookFunc(retVal___, it, name, value); } } return retVal___; } -bool HP_mob_readdb_sub(char *fields[], int columns, int current) { +bool HP_mob_get_const(const config_setting_t *it, int *value) { int hIndex = 0; bool retVal___ = false; - if( HPMHooks.count.HP_mob_readdb_sub_pre ) { - bool (*preHookFunc) (char *fields[], int *columns, int *current); + if( HPMHooks.count.HP_mob_get_const_pre ) { + bool (*preHookFunc) (const config_setting_t *it, int *value); *HPMforce_return = false; - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_readdb_sub_pre; hIndex++ ) { - preHookFunc = HPMHooks.list.HP_mob_readdb_sub_pre[hIndex].func; - retVal___ = preHookFunc(fields, &columns, ¤t); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_get_const_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_get_const_pre[hIndex].func; + retVal___ = preHookFunc(it, value); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -45964,25 +45990,52 @@ bool HP_mob_readdb_sub(char *fields[], int columns, int current) { } } { - retVal___ = HPMHooks.source.mob.readdb_sub(fields, columns, current); + retVal___ = HPMHooks.source.mob.get_const(it, value); } - if( HPMHooks.count.HP_mob_readdb_sub_post ) { - bool (*postHookFunc) (bool retVal___, char *fields[], int *columns, int *current); - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_readdb_sub_post; hIndex++ ) { - postHookFunc = HPMHooks.list.HP_mob_readdb_sub_post[hIndex].func; - retVal___ = postHookFunc(retVal___, fields, &columns, ¤t); + if( HPMHooks.count.HP_mob_get_const_post ) { + bool (*postHookFunc) (bool retVal___, const config_setting_t *it, int *value); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_get_const_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_get_const_post[hIndex].func; + retVal___ = postHookFunc(retVal___, it, value); } } return retVal___; } -void HP_mob_readdb(void) { +int HP_mob_read_libconfig(const char *filename, bool ignore_missing) { int hIndex = 0; - if( HPMHooks.count.HP_mob_readdb_pre ) { - void (*preHookFunc) (void); + int retVal___ = 0; + if( HPMHooks.count.HP_mob_read_libconfig_pre ) { + int (*preHookFunc) (const char *filename, bool *ignore_missing); *HPMforce_return = false; - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_readdb_pre; hIndex++ ) { - preHookFunc = HPMHooks.list.HP_mob_readdb_pre[hIndex].func; - preHookFunc(); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_libconfig_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_read_libconfig_pre[hIndex].func; + retVal___ = preHookFunc(filename, &ignore_missing); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.mob.read_libconfig(filename, ignore_missing); + } + if( HPMHooks.count.HP_mob_read_libconfig_post ) { + int (*postHookFunc) (int retVal___, const char *filename, bool *ignore_missing); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_libconfig_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_read_libconfig_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, &ignore_missing); + } + } + return retVal___; +} +void HP_mob_read_db_additional_fields(struct mob_db *entry, int class_, config_setting_t *it, int n, const char *source) { + int hIndex = 0; + if( HPMHooks.count.HP_mob_read_db_additional_fields_pre ) { + void (*preHookFunc) (struct mob_db *entry, int *class_, config_setting_t *it, int *n, const char *source); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_additional_fields_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_read_db_additional_fields_pre[hIndex].func; + preHookFunc(entry, &class_, it, &n, source); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -45990,26 +46043,105 @@ void HP_mob_readdb(void) { } } { - HPMHooks.source.mob.readdb(); + HPMHooks.source.mob.read_db_additional_fields(entry, class_, it, n, source); } - if( HPMHooks.count.HP_mob_readdb_post ) { - void (*postHookFunc) (void); - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_readdb_post; hIndex++ ) { - postHookFunc = HPMHooks.list.HP_mob_readdb_post[hIndex].func; - postHookFunc(); + if( HPMHooks.count.HP_mob_read_db_additional_fields_post ) { + void (*postHookFunc) (struct mob_db *entry, int *class_, config_setting_t *it, int *n, const char *source); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_additional_fields_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_read_db_additional_fields_post[hIndex].func; + postHookFunc(entry, &class_, it, &n, source); + } + } + return; +} +bool HP_mob_read_db_sub(config_setting_t *mobt, int id, const char *source) { + int hIndex = 0; + bool retVal___ = false; + if( HPMHooks.count.HP_mob_read_db_sub_pre ) { + bool (*preHookFunc) (config_setting_t *mobt, int *id, const char *source); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_sub_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_read_db_sub_pre[hIndex].func; + retVal___ = preHookFunc(mobt, &id, source); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.mob.read_db_sub(mobt, id, source); + } + if( HPMHooks.count.HP_mob_read_db_sub_post ) { + bool (*postHookFunc) (bool retVal___, config_setting_t *mobt, int *id, const char *source); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_sub_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_read_db_sub_post[hIndex].func; + retVal___ = postHookFunc(retVal___, mobt, &id, source); + } + } + return retVal___; +} +void HP_mob_read_db_drops_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) { + int hIndex = 0; + if( HPMHooks.count.HP_mob_read_db_drops_sub_pre ) { + void (*preHookFunc) (struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_drops_sub_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_read_db_drops_sub_pre[hIndex].func; + preHookFunc(entry, mstatus, &class_, t); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.mob.read_db_drops_sub(entry, mstatus, class_, t); + } + if( HPMHooks.count.HP_mob_read_db_drops_sub_post ) { + void (*postHookFunc) (struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_drops_sub_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_read_db_drops_sub_post[hIndex].func; + postHookFunc(entry, mstatus, &class_, t); + } + } + return; +} +void HP_mob_read_db_mvpdrops_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) { + int hIndex = 0; + if( HPMHooks.count.HP_mob_read_db_mvpdrops_sub_pre ) { + void (*preHookFunc) (struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_mvpdrops_sub_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_read_db_mvpdrops_sub_pre[hIndex].func; + preHookFunc(entry, mstatus, &class_, t); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.mob.read_db_mvpdrops_sub(entry, mstatus, class_, t); + } + if( HPMHooks.count.HP_mob_read_db_mvpdrops_sub_post ) { + void (*postHookFunc) (struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_mvpdrops_sub_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_read_db_mvpdrops_sub_post[hIndex].func; + postHookFunc(entry, mstatus, &class_, t); } } return; } -int HP_mob_read_sqldb(void) { +int HP_mob_read_db_mode_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) { int hIndex = 0; int retVal___ = 0; - if( HPMHooks.count.HP_mob_read_sqldb_pre ) { - int (*preHookFunc) (void); + if( HPMHooks.count.HP_mob_read_db_mode_sub_pre ) { + int (*preHookFunc) (struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); *HPMforce_return = false; - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_sqldb_pre; hIndex++ ) { - preHookFunc = HPMHooks.list.HP_mob_read_sqldb_pre[hIndex].func; - retVal___ = preHookFunc(); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_mode_sub_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_read_db_mode_sub_pre[hIndex].func; + retVal___ = preHookFunc(entry, mstatus, &class_, t); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -46017,17 +46149,43 @@ int HP_mob_read_sqldb(void) { } } { - retVal___ = HPMHooks.source.mob.read_sqldb(); + retVal___ = HPMHooks.source.mob.read_db_mode_sub(entry, mstatus, class_, t); } - if( HPMHooks.count.HP_mob_read_sqldb_post ) { - int (*postHookFunc) (int retVal___); - for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_sqldb_post; hIndex++ ) { - postHookFunc = HPMHooks.list.HP_mob_read_sqldb_post[hIndex].func; - retVal___ = postHookFunc(retVal___); + if( HPMHooks.count.HP_mob_read_db_mode_sub_post ) { + int (*postHookFunc) (int retVal___, struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_mode_sub_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_read_db_mode_sub_post[hIndex].func; + retVal___ = postHookFunc(retVal___, entry, mstatus, &class_, t); } } return retVal___; } +void HP_mob_read_db_stats_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t) { + int hIndex = 0; + if( HPMHooks.count.HP_mob_read_db_stats_sub_pre ) { + void (*preHookFunc) (struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_stats_sub_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_mob_read_db_stats_sub_pre[hIndex].func; + preHookFunc(entry, mstatus, &class_, t); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.mob.read_db_stats_sub(entry, mstatus, class_, t); + } + if( HPMHooks.count.HP_mob_read_db_stats_sub_post ) { + void (*postHookFunc) (struct mob_db *entry, struct status_data *mstatus, int *class_, config_setting_t *t); + for(hIndex = 0; hIndex < HPMHooks.count.HP_mob_read_db_stats_sub_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_mob_read_db_stats_sub_post[hIndex].func; + postHookFunc(entry, mstatus, &class_, t); + } + } + return; +} void HP_mob_name_constants(void) { int hIndex = 0; if( HPMHooks.count.HP_mob_name_constants_pre ) { diff --git a/src/plugins/db2sql.c b/src/plugins/db2sql.c index 79eda0e5e..50781f319 100644 --- a/src/plugins/db2sql.c +++ b/src/plugins/db2sql.c @@ -6,7 +6,7 @@ #include "common/hercules.h" #include "common/cbasetypes.h" #include "common/conf.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/strlib.h" #include "common/timer.h" diff --git a/src/plugins/sample.c b/src/plugins/sample.c index 275edb129..fea25514b 100644 --- a/src/plugins/sample.c +++ b/src/plugins/sample.c @@ -3,7 +3,7 @@ // Sample Hercules Plugin #include "common/hercules.h" /* Should always be the first Hercules file included! (if you don't make it first, you won't be able to use interfaces) */ -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/socket.h" #include "common/strlib.h" diff --git a/src/tool/mapcache.c b/src/tool/mapcache.c index 72457b73a..6356867e2 100644 --- a/src/tool/mapcache.c +++ b/src/tool/mapcache.c @@ -6,7 +6,7 @@ #include "common/cbasetypes.h" #include "common/core.h" #include "common/grfio.h" -#include "common/malloc.h" +#include "common/memmgr.h" #include "common/mmo.h" #include "common/showmsg.h" #include "common/strlib.h" |