summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEr_Maqui <er_maqui@darkbolt.net>2015-10-21 14:54:40 +0200
committerEr_Maqui <er_maqui@darkbolt.net>2015-10-21 14:54:40 +0200
commit198aef7133713b47a4c4fadaac6811c9d3812d19 (patch)
tree84df335dd0ad350c20f8c2a018b2a7096907b636 /src
parent6977d6d31b58afc5095c0a59e754f21ea1080054 (diff)
parent8b198db1e0ccc8209b7bcf54b4df62d4747f75b2 (diff)
downloadhercules-198aef7133713b47a4c4fadaac6811c9d3812d19.tar.gz
hercules-198aef7133713b47a4c4fadaac6811c9d3812d19.tar.bz2
hercules-198aef7133713b47a4c4fadaac6811c9d3812d19.tar.xz
hercules-198aef7133713b47a4c4fadaac6811c9d3812d19.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src')
-rw-r--r--src/char/HPMchar.c2
-rw-r--r--src/char/char.c2
-rw-r--r--src/char/geoip.c2
-rw-r--r--src/char/int_auction.c2
-rw-r--r--src/char/int_elemental.c2
-rw-r--r--src/char/int_guild.c2
-rw-r--r--src/char/int_homun.c2
-rw-r--r--src/char/int_mail.c2
-rw-r--r--src/char/int_mercenary.c2
-rw-r--r--src/char/int_party.c2
-rw-r--r--src/char/int_pet.c2
-rw-r--r--src/char/int_quest.c2
-rw-r--r--src/char/int_storage.c2
-rw-r--r--src/char/inter.c2
-rw-r--r--src/common/HPM.c2
-rw-r--r--src/common/HPMDataCheck.h10
-rw-r--r--src/common/HPMSymbols.inc.h8
-rw-r--r--src/common/Makefile.in8
-rw-r--r--src/common/console.c27
-rw-r--r--src/common/core.c2
-rw-r--r--src/common/db.c2
-rw-r--r--src/common/ers.c2
-rw-r--r--src/common/grfio.c2
-rw-r--r--src/common/memmgr.c (renamed from src/common/malloc.c)52
-rw-r--r--src/common/memmgr.h (renamed from src/common/malloc.h)6
-rw-r--r--src/common/mutex.c2
-rw-r--r--src/common/socket.c2
-rw-r--r--src/common/sql.c2
-rw-r--r--src/common/strlib.c2
-rw-r--r--src/common/sysinfo.c2
-rw-r--r--src/common/thread.c2
-rw-r--r--src/common/timer.c2
-rw-r--r--src/login/HPMlogin.c2
-rw-r--r--src/login/account_sql.c2
-rw-r--r--src/login/login.c2
-rw-r--r--src/map/HPMmap.c2
-rw-r--r--src/map/atcommand.c2
-rw-r--r--src/map/battle.c2
-rw-r--r--src/map/battleground.c2
-rw-r--r--src/map/channel.c2
-rw-r--r--src/map/chat.c2
-rw-r--r--src/map/chrif.c2
-rw-r--r--src/map/clif.c2
-rw-r--r--src/map/elemental.c2
-rw-r--r--src/map/guild.c2
-rw-r--r--src/map/homunculus.c2
-rw-r--r--src/map/instance.c2
-rw-r--r--src/map/intif.c2
-rw-r--r--src/map/irc-bot.c2
-rw-r--r--src/map/itemdb.c2
-rw-r--r--src/map/map.c4
-rw-r--r--src/map/mapreg_sql.c2
-rw-r--r--src/map/mercenary.c2
-rw-r--r--src/map/mob.c783
-rw-r--r--src/map/mob.h12
-rw-r--r--src/map/npc.c2
-rw-r--r--src/map/npc_chat.c2
-rw-r--r--src/map/party.c2
-rw-r--r--src/map/path.c2
-rw-r--r--src/map/pc.c8
-rw-r--r--src/map/pc_groups.c2
-rw-r--r--src/map/pet.c2
-rw-r--r--src/map/quest.c2
-rw-r--r--src/map/script.c2
-rw-r--r--src/map/searchstore.c2
-rw-r--r--src/map/skill.c2
-rw-r--r--src/map/status.c87
-rw-r--r--src/map/storage.c2
-rw-r--r--src/map/unit.c2
-rw-r--r--src/plugins/HPMHooking.c4
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc48
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc12
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc254
-rw-r--r--src/plugins/db2sql.c2
-rw-r--r--src/plugins/sample.c2
-rw-r--r--src/tool/mapcache.c2
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, &current);
+ 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, &current);
+ 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"