diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/Makefile | 103 | ||||
-rw-r--r-- | src/map/Makefile.in | 148 | ||||
-rw-r--r-- | src/map/atcommand.c | 41 | ||||
-rw-r--r-- | src/map/battle.c | 1 | ||||
-rw-r--r-- | src/map/charcommand.c | 1 | ||||
-rw-r--r-- | src/map/clif.c | 1 | ||||
-rw-r--r-- | src/map/guild.c | 6 | ||||
-rw-r--r-- | src/map/intif.c | 2 | ||||
-rw-r--r-- | src/map/itemdb.c | 496 | ||||
-rw-r--r-- | src/map/log.c | 392 | ||||
-rw-r--r-- | src/map/log.h | 8 | ||||
-rw-r--r-- | src/map/mail.c | 464 | ||||
-rw-r--r-- | src/map/mail.h | 4 | ||||
-rw-r--r-- | src/map/map.c | 138 | ||||
-rw-r--r-- | src/map/map.h | 53 | ||||
-rw-r--r-- | src/map/mob.c | 112 | ||||
-rw-r--r-- | src/map/npc.c | 1 | ||||
-rw-r--r-- | src/map/party.c | 1 | ||||
-rw-r--r-- | src/map/pc.c | 3 | ||||
-rw-r--r-- | src/map/pet.c | 1 | ||||
-rw-r--r-- | src/map/script.c | 372 | ||||
-rw-r--r-- | src/map/skill.c | 1 | ||||
-rw-r--r-- | src/map/status.c | 1 |
23 files changed, 1166 insertions, 1184 deletions
diff --git a/src/map/Makefile b/src/map/Makefile deleted file mode 100644 index dcb14bb3a..000000000 --- a/src/map/Makefile +++ /dev/null @@ -1,103 +0,0 @@ -all txt: txtobj map-server - -sql: sqlobj map-server_sql - -txtobj: - mkdir txtobj - -sqlobj: - mkdir sqlobj - -COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o \ - ../common/obj/db.o ../common/obj/plugins.o ../common/obj/lock.o \ - ../common/obj/nullpo.o ../common/obj/malloc.o ../common/obj/showmsg.o \ - ../common/obj/utils.o ../common/obj/strlib.o ../common/obj/grfio.o \ - ../common/obj/mapindex.o ../common/obj/ers.o - -COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/db.h \ - ../common/plugins.h ../common/lock.h ../common/nullpo.h ../common/malloc.h \ - ../common/showmsg.h ../common/utils.h ../common/strlib.h ../common/grfio.h \ - ../common/mapindex.h - -OBJECTS = obj/map.o obj/chrif.o obj/clif.o obj/pc.o obj/status.o obj/npc.o \ - obj/npc_chat.o obj/chat.o obj/path.o obj/itemdb.o obj/mob.o obj/script.o \ - obj/storage.o obj/skill.o obj/atcommand.o obj/charcommand.o obj/battle.o \ - obj/intif.o obj/trade.o obj/party.o obj/vending.o obj/guild.o obj/pet.o \ - obj/log.o obj/mail.o obj/date.o obj/irc.o obj/unit.o obj/mercenary.o \ - $(COMMON_OBJ) - -map-server: $(OBJECTS:obj/%=txtobj/%) - $(CC) -o ../../$@ $> $(LIBS) $(LIB_S) - -map-server_sql: $(OBJECTS:obj/%=sqlobj/%) - $(CC) -o ../../$@ $> $(LIB_S) - -txtobj/%.o: %.c - $(COMPILE.c) -DTXT_ONLY $(OUTPUT_OPTION) $< - -sqlobj/%.o: %.c - $(COMPILE.c) $(OUTPUT_OPTION) $< - -clean: - rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj GNUmakefile - -# DO NOT DELETE - -txtobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h irc.h $(COMMON_H) -txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h $(COMMON_H) -txtobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h charcommand.h irc.h $(COMMON_H) -txtobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h $(COMMON_H) -txtobj/status.o: status.c pc.h map.h clif.h status.h mob.h itemdb.h battle.h skill.h script.h pet.h guild.h $(COMMON_H) -txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H) -txtobj/npc_chat.o: npc_chat.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H) -txtobj/chat.o: chat.c map.h clif.h pc.h chat.h $(COMMON_H) -txtobj/path.o: path.c map.h battle.h $(COMMON_H) -txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h $(COMMON_H) -txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h date.h irc.h $(COMMON_H) -txtobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h irc.h $(COMMON_H) -txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h $(COMMON_H) -txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h date.h $(COMMON_H) -txtobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H) -txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h $(COMMON_H) -txtobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h $(COMMON_H) -txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h $(COMMON_H) -txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h $(COMMON_H) -txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h irc.h $(COMMON_H) -txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h $(COMMON_H) -txtobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h $(COMMON_H) -txtobj/log.o: log.c log.h map.h $(COMMON_H) -txtobj/charcommand.o: charcommand.c charcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H) -txtobj/date.o: date.c date.h $(COMMON_H) -txtobj/irc.o: irc.c irc.h map.h pc.h $(COMMON_H) -txtobj/unit.o: unit.c unit.h $(COMMON_H) -txtobj/mercenary.o: mercenary.c mercenary.h $(COMMON_H) - -sqlobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h irc.h $(COMMON_H) -sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h $(COMMON_H) -sqlobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h charcommand.h $(COMMON_H) -sqlobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h $(COMMON_H) -sqlobj/status.o: status.c pc.h map.h clif.h status.h mob.h itemdb.h battle.h skill.h script.h pet.h guild.h $(COMMON_H) -sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H) -sqlobj/npc_chat.o: npc_chat.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H) -sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h $(COMMON_H) -sqlobj/path.o: path.c map.h battle.h $(COMMON_H) -sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h $(COMMON_H) -sqlobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h date.h irc.h $(COMMON_H) -sqlobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h irc.h $(COMMON_H) -sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h $(COMMON_H) -sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h date.h $(COMMON_H) -sqlobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H) -sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h $(COMMON_H) -sqlobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h $(COMMON_H) -sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h $(COMMON_H) -sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h $(COMMON_H) -sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h irc.h $(COMMON_H) -sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h irc.h $(COMMON_H) -sqlobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h $(COMMON_H) -sqlobj/mail.o: mail.c mail.h $(COMMON_H) -sqlobj/log.o: log.c log.h map.h $(COMMON_H) -sqlobj/charcommand.o: charcommand.c charcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H) -sqlobj/date.o: date.c date.h $(COMMON_H) -sqlobj/irc.o: irc.c irc.h map.h pc.h $(COMMON_H) -sqlobj/unit.o: unit.c unit.h $(COMMON_H) -sqlobj/mercenary.o: mercenary.c mercenary.h $(COMMON_H) diff --git a/src/map/Makefile.in b/src/map/Makefile.in new file mode 100644 index 000000000..1be112d9a --- /dev/null +++ b/src/map/Makefile.in @@ -0,0 +1,148 @@ + +HAVE_MYSQL=@HAVE_MYSQL@ +ifeq ($(HAVE_MYSQL),yes) + ALL_DEPENDS=txt sql + SQL_DEPENDS=obj_sql map-server_sql +else + ALL_TARGET=txt + SQL_DEPENDS=needs_mysql +endif + +HAVE_PCRE=@HAVE_PCRE@ +ifeq ($(HAVE_PCRE),yes) + PCRE_CFLAGS=-DPCRE_SUPPORT @PCRE_CFLAGS@ +else + PCRE_CFLAGS= +endif + + +##################################################################### +.PHONY : all txt sql clean help + +all: $(ALL_DEPENDS) + +txt: obj_txt map-server + +sql: $(SQL_DEPENDS) + +clean: + rm -rf *.o ../../map-server@EXEEXT@ ../../map-server_sql@EXEEXT@ obj_txt obj_sql + +help: +ifeq ($(HAVE_MYSQL),yes) + @echo "possible targets are 'sql' 'txt' 'all' 'clean' 'help'" + @echo "'sql' - map server (SQL version)" +else + @echo "possible targets are 'txt' 'all' 'clean' 'help'" +endif + @echo "'txt' - map server (TXT version)" + @echo "'all' - builds all above targets" + @echo "'clean' - cleans builds and objects" + @echo "'help' - outputs this message" + +##################################################################### + +needs_mysql: + @echo "MySQL not found or disabled by the configure script" + @exit 1 + +obj_txt: + -mkdir obj_txt + +obj_sql: + -mkdir obj_sql + +COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o \ + ../common/obj/db.o ../common/obj/plugins.o ../common/obj/lock.o \ + ../common/obj/nullpo.o ../common/obj/malloc.o ../common/obj/showmsg.o \ + ../common/obj/utils.o ../common/obj/strlib.o ../common/obj/grfio.o \ + ../common/obj/mapindex.o ../common/obj/ers.o + +COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h \ + ../common/db.h ../common/plugins.h ../common/lock.h \ + ../common/nullpo.h ../common/malloc.h ../common/showmsg.h \ + ../common/utils.h ../common/strlib.h ../common/grfio.h \ + ../common/mapindex.h ../common/ers.h + +COMMON_SQL_OBJ = $(COMMON_OBJ) ../common/obj_sql/sql.o + +COMMON_SQL_H = $(COMMON_H) ../common/sql.h + +MAP_OBJ = obj/map.o obj/chrif.o obj/clif.o obj/pc.o obj/status.o obj/npc.o \ + obj/npc_chat.o obj/chat.o obj/path.o obj/itemdb.o obj/mob.o obj/script.o \ + obj/storage.o obj/skill.o obj/atcommand.o obj/charcommand.o obj/battle.o \ + obj/intif.o obj/trade.o obj/party.o obj/vending.o obj/guild.o obj/pet.o \ + obj/log.o obj/mail.o obj/date.o obj/irc.o obj/unit.o obj/mercenary.o + +map-server: $(MAP_OBJ:obj/%=obj_txt/%) $(COMMON_OBJ) + @CC@ @LDFLAGS@ -o ../../map-server@EXEEXT@ $(MAP_OBJ:obj/%=obj_txt/%) $(COMMON_OBJ) @LIBS@ @PCRE_LIBS@ + +map-server_sql: $(MAP_OBJ:obj/%=obj_sql/%) $(COMMON_SQL_OBJ) + @CC@ @LDFLAGS@ -o ../../map-server_sql@EXEEXT@ $(MAP_OBJ:obj/%=obj_sql/%) $(COMMON_SQL_OBJ) @LIBS@ @PCRE_LIBS@ @MYSQL_LIBS@ + +obj_txt/%.o: %.c + @CC@ @CFLAGS@ $(PCRE_CFLAGS) -DTXT_ONLY @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + +obj_sql/%.o: %.c + @CC@ @CFLAGS@ $(PCRE_CFLAGS) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + +# DO NOT DELETE + +obj_txt/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h irc.h $(COMMON_H) +obj_txt/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h $(COMMON_H) +obj_txt/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h charcommand.h irc.h $(COMMON_H) +obj_txt/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h $(COMMON_H) +obj_txt/status.o: status.c pc.h map.h clif.h status.h mob.h itemdb.h battle.h skill.h script.h pet.h guild.h $(COMMON_H) +obj_txt/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H) +obj_txt/npc_chat.o: npc_chat.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H) +obj_txt/chat.o: chat.c map.h clif.h pc.h chat.h $(COMMON_H) +obj_txt/path.o: path.c map.h battle.h $(COMMON_H) +obj_txt/itemdb.o: itemdb.c map.h battle.h itemdb.h $(COMMON_H) +obj_txt/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h date.h irc.h $(COMMON_H) +obj_txt/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h irc.h $(COMMON_H) +obj_txt/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h $(COMMON_H) +obj_txt/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h date.h $(COMMON_H) +obj_txt/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H) +obj_txt/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h $(COMMON_H) +obj_txt/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h $(COMMON_H) +obj_txt/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h $(COMMON_H) +obj_txt/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h $(COMMON_H) +obj_txt/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h irc.h $(COMMON_H) +obj_txt/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h $(COMMON_H) +obj_txt/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h $(COMMON_H) +obj_txt/log.o: log.c log.h map.h $(COMMON_H) +obj_txt/charcommand.o: charcommand.c charcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H) +obj_txt/date.o: date.c date.h $(COMMON_H) +obj_txt/irc.o: irc.c irc.h map.h pc.h $(COMMON_H) +obj_txt/unit.o: unit.c unit.h $(COMMON_H) +obj_txt/mercenary.o: mercenary.c mercenary.h $(COMMON_H) + +obj_sql/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h irc.h $(COMMON_SQL_H) +obj_sql/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h $(COMMON_SQL_H) +obj_sql/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h charcommand.h $(COMMON_SQL_H) +obj_sql/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h $(COMMON_SQL_H) +obj_sql/status.o: status.c pc.h map.h clif.h status.h mob.h itemdb.h battle.h skill.h script.h pet.h guild.h $(COMMON_SQL_H) +obj_sql/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_SQL_H) +obj_sql/npc_chat.o: npc_chat.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_SQL_H) +obj_sql/chat.o: chat.c map.h clif.h pc.h chat.h $(COMMON_SQL_H) +obj_sql/path.o: path.c map.h battle.h $(COMMON_SQL_H) +obj_sql/itemdb.o: itemdb.c map.h battle.h itemdb.h $(COMMON_SQL_H) +obj_sql/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h date.h irc.h $(COMMON_SQL_H) +obj_sql/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h irc.h $(COMMON_SQL_H) +obj_sql/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h $(COMMON_SQL_H) +obj_sql/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h date.h $(COMMON_SQL_H) +obj_sql/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_SQL_H) +obj_sql/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h $(COMMON_SQL_H) +obj_sql/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h $(COMMON_SQL_H) +obj_sql/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h $(COMMON_SQL_H) +obj_sql/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h $(COMMON_SQL_H) +obj_sql/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h irc.h $(COMMON_SQL_H) +obj_sql/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h irc.h $(COMMON_SQL_H) +obj_sql/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h $(COMMON_SQL_H) +obj_sql/mail.o: mail.c mail.h $(COMMON_SQL_H) +obj_sql/log.o: log.c log.h map.h $(COMMON_SQL_H) +obj_sql/charcommand.o: charcommand.c charcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_SQL_H) +obj_sql/date.o: date.c date.h $(COMMON_SQL_H) +obj_sql/irc.o: irc.c irc.h map.h pc.h $(COMMON_SQL_H) +obj_sql/unit.o: unit.c unit.h $(COMMON_SQL_H) +obj_sql/mercenary.o: mercenary.c mercenary.h $(COMMON_SQL_H) diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 428ff017d..3ddac9a9d 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -10,6 +10,7 @@ #include "../common/malloc.h" #include "../common/socket.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "atcommand.h" #include "log.h" @@ -273,6 +274,7 @@ ACMD_FUNC(checkmail); // [Valaris] ACMD_FUNC(listmail); // [Valaris] ACMD_FUNC(listnewmail); // [Valaris] ACMD_FUNC(readmail); // [Valaris] +ACMD_FUNC(deletemail); // [Valaris] ACMD_FUNC(sendmail); // [Valaris] ACMD_FUNC(sendprioritymail); // [Valaris] ACMD_FUNC(deletemail); // [Valaris] @@ -577,7 +579,7 @@ static AtCommandInfo atcommand_info[] = { { AtCommand_ListMail, "@listmail", 1, atcommand_listmail }, // [Valaris] { AtCommand_ListNewMail, "@listnewmail", 1, atcommand_listmail }, // [Valaris] { AtCommand_ReadMail, "@readmail", 1, atcommand_readmail }, // [Valaris] - { AtCommand_DeleteMail, "@deletemail", 1, atcommand_readmail }, // [Valaris] + { AtCommand_DeleteMail, "@deletemail", 1, atcommand_deletemail }, // [Valaris] { AtCommand_SendMail, "@sendmail", 1, atcommand_sendmail }, // [Valaris] { AtCommand_SendPriorityMail, "@sendprioritymail",80, atcommand_sendmail }, // [Valaris] { AtCommand_RefreshOnline, "@refreshonline", 99, atcommand_refreshonline }, // [Valaris] @@ -7898,11 +7900,11 @@ int atcommand_listmail(const int fd, struct map_session_data* sd, const char* co nullpo_retr(-1, sd); - if(strlen(command)==12) + if(strlen(command)==12) // @listnewmail mail_check(sd,3); - else if(strlen(command)==9) + else if(strlen(command)==9) // @listmail mail_check(sd,2); - else + else // @checkmail mail_check(sd,1); return 0; } @@ -7926,10 +7928,31 @@ int atcommand_readmail(const int fd, struct map_session_data* sd, const char* co return 0; } - if(strlen(command)==11) - mail_delete(sd,index); - else - mail_read(sd,index); + mail_read(sd,index); + + return 0; +} + +int atcommand_deletemail(const int fd, struct map_session_data* sd, const char* command, const char* message) +{ + int index; + if(!mail_server_enable) + return 0; + + nullpo_retr(-1, sd); + + if (!message || !*message) { + clif_displaymessage(sd->fd,"You must specify a message number."); + return 0; + } + + index = atoi(message); + if (index < 1) { + clif_displaymessage(sd->fd,"Message number cannot be negative or zero."); + return 0; + } + + mail_delete(sd,index); return 0; } @@ -7954,7 +7977,7 @@ int atcommand_sendmail(const int fd, struct map_session_data* sd, const char* co return 0; } - if(strlen(command)==17) + if(strlen(command)==17) // @sendprioritymail mail_send(sd,name,text,1); else mail_send(sd,name,text,0); diff --git a/src/map/battle.c b/src/map/battle.c index 9264fbedf..2994dfa6a 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -8,6 +8,7 @@ #include "../common/showmsg.h" #include "../common/ers.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "map.h" #include "pc.h" diff --git a/src/map/charcommand.c b/src/map/charcommand.c index cfd3d59c8..88c32b307 100644 --- a/src/map/charcommand.c +++ b/src/map/charcommand.c @@ -6,6 +6,7 @@ #include "../common/timer.h" #include "../common/nullpo.h" #include "../common/showmsg.h" +#include "../common/utils.h" #include "log.h" #include "clif.h" diff --git a/src/map/clif.c b/src/map/clif.c index 5845ee102..ff6ccb9cf 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -9,6 +9,7 @@ #include "../common/nullpo.h" #include "../common/showmsg.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "map.h" #include "chrif.h" diff --git a/src/map/guild.c b/src/map/guild.c index f9773d440..74cd0261a 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -9,6 +9,7 @@ #include "../common/showmsg.h" #include "../common/ers.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "map.h" #include "guild.h" @@ -1922,12 +1923,11 @@ int guild_save_sub(int tid,unsigned int tick,int id,int data) int guild_agit_break(struct mob_data *md) { // Run One NPC_Event[OnAgitBreak] - char *evname; + char* evname; if(!agit_flag) return 0; // Agit already End - evname=(char *)aMallocA((strlen(md->npc_event) + 1)*sizeof(char)); - strcpy(evname,md->npc_event); + evname = aStrdup(md->npc_event); // Now By User to Run [OnAgitBreak] NPC Event... // It's a little impossible to null point with player disconnect in this! // But Script will be stop, so nothing... diff --git a/src/map/intif.c b/src/map/intif.c index 9e7effef3..b6f457ee1 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -1497,7 +1497,7 @@ int intif_parse(int fd) case 0x3802: intif_parse_WisEnd(fd); break; case 0x3803: mapif_parse_WisToGM(fd); break; case 0x3804: intif_parse_Registers(fd); break; - case 0x3806: intif_parse_ChangeNameOk(fd); break; + case 0x3806: intif_parse_ChangeNameOk(fd); break; case 0x3810: intif_parse_LoadStorage(fd); break; case 0x3811: intif_parse_SaveStorage(fd); break; case 0x3818: intif_parse_LoadGuildStorage(fd); break; diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 1ba86cbc4..4ed47df61 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -615,369 +615,251 @@ static int itemdb_gendercheck(struct item_data *id) if (id->look == W_WHIP && id->type == IT_WEAPON) //Whips are always female-only return 0; - return (battle_config.ignore_items_gender?2:id->sex); + return (battle_config.ignore_items_gender) ? 2 : id->sex; } -#ifndef TXT_ONLY -/*====================================== - * SQL - *======================================*/ -static int itemdb_read_sqldb(void) -{ +/*========================================== + * processes one itemdb entry + *------------------------------------------*/ +static bool itemdb_parse_dbrow(char** str, char* source, int line) +{ + /* + +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+ + | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | + +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+ + | id | name_english | name_japanese | type | price_buy | price_sell | weight | attack | defence | range | slots | equip_jobs | equip_upper | equip_genders | equip_locations | weapon_level | equip_level | refineable | view | script | equip_script | unequip_script | + +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+ + */ unsigned short nameid; - struct item_data *id; - char script[65535 + 2 + 1]; // Maximum length of MySQL TEXT type (65535) + 2 bytes for curly brackets + 1 byte for terminator - char *item_db_name[] = { item_db_db, item_db2_db }; - long unsigned int ln = 0; - int i; - - // ---------- - - for (i = 0; i < 2; i++) { - sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_name[i]); - - // Execute the query; if the query execution succeeded... - if (mysql_query(&mmysql_handle, tmp_sql) == 0) { - sql_res = mysql_store_result(&mmysql_handle); - - // If the storage of the query result succeeded... - if (sql_res) { - // Parse each row in the query result into sql_row - while ((sql_row = mysql_fetch_row(sql_res))) - { /*Table structure is: - 00 id - 01 name_english - 02 name_japanese - 03 type - 04 price_buy - 05 price_sell - 06 weight - 07 attack - 08 defence - 09 range - 10 slots - 11 equip_jobs - 12 equip_upper - 13 equip_genders - 14 equip_locations - 15 weapon_level - 16 equip_level - 17 refineable - 18 view - 19 script - 20 equip_script - 21 unequip_script - */ - nameid = atoi(sql_row[0]); - - // If the identifier is not within the valid range, process the next row - if (nameid == 0) - continue; - - ln++; - - // ---------- - id = itemdb_load(nameid); - - strncpy(id->name, sql_row[1], ITEM_NAME_LENGTH-1); - strncpy(id->jname, sql_row[2], ITEM_NAME_LENGTH-1); - - id->type = atoi(sql_row[3]); - if (id->type == IT_DELAYCONSUME) - { //Items that are consumed upon target confirmation - //(yggdrasil leaf, spells & pet lures) [Skotlex] - id->type = IT_USABLE; - id->flag.delay_consume=1; - } else //In case of an itemdb reload and the item type changed. - id->flag.delay_consume=0; - - // If price_buy is not NULL and price_sell is not NULL... - if ((sql_row[4] != NULL) && (sql_row[5] != NULL)) { - id->value_buy = atoi(sql_row[4]); - id->value_sell = atoi(sql_row[5]); - } - // If price_buy is not NULL and price_sell is NULL... - else if ((sql_row[4] != NULL) && (sql_row[5] == NULL)) { - id->value_buy = atoi(sql_row[4]); - id->value_sell = atoi(sql_row[4]) / 2; - } - // If price_buy is NULL and price_sell is not NULL... - else if ((sql_row[4] == NULL) && (sql_row[5] != NULL)) { - id->value_buy = atoi(sql_row[5]) * 2; - id->value_sell = atoi(sql_row[5]); - } - // If price_buy is NULL and price_sell is NULL... - if ((sql_row[4] == NULL) && (sql_row[5] == NULL)) { - id->value_buy = 0; - id->value_sell = 0; - } - - id->weight = atoi(sql_row[6]); - id->atk = (sql_row[7] != NULL) ? atoi(sql_row[7]) : 0; - id->def = (sql_row[8] != NULL) ? atoi(sql_row[8]) : 0; - id->range = (sql_row[9] != NULL) ? atoi(sql_row[9]) : 0; - id->slot = (sql_row[10] != NULL) ? atoi(sql_row[10]) : 0; - if (id->slot > MAX_SLOTS) - { - ShowWarning("itemdb_read_sqldb: Item %d (%s) specifies %d slots, but the server only supports up to %d\n", nameid, id->jname, id->slot, MAX_SLOTS); - id->slot = MAX_SLOTS; - } - itemdb_jobid2mapid(id->class_base, (sql_row[11] != NULL) ? (unsigned int)strtoul(sql_row[11], NULL, 0) : 0); - id->class_upper= (sql_row[12] != NULL) ? atoi(sql_row[12]) : 0; - id->sex = (sql_row[13] != NULL) ? atoi(sql_row[13]) : 0; - id->equip = (sql_row[14] != NULL) ? atoi(sql_row[14]) : 0; - if (!id->equip && itemdb_isequip2(id)) - { - ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname); - id->type = 3; - } - id->wlv = (sql_row[15] != NULL) ? atoi(sql_row[15]) : 0; - id->elv = (sql_row[16] != NULL) ? atoi(sql_row[16]) : 0; - id->flag.no_refine = (sql_row[17] == NULL || atoi(sql_row[17]) == 1)?0:1; - id->look = (sql_row[18] != NULL) ? atoi(sql_row[18]) : 0; - id->view_id = 0; - id->sex = itemdb_gendercheck(id); //Apply gender filtering. - - // ---------- - - if (id->script) - script_free_code(id->script); - if (sql_row[19] != NULL) { - if (sql_row[19][0] == '{') - id->script = parse_script(sql_row[19],item_db_name[i], ln, 0); - else { - sprintf(script, "{%s}", sql_row[19]); - id->script = parse_script(script, item_db_name[i], ln, 0); - } - } else id->script = NULL; + struct item_data* id; - if (id->equip_script) - script_free_code(id->equip_script); - if (sql_row[20] != NULL) { - if (sql_row[20][0] == '{') - id->equip_script = parse_script(sql_row[20], item_db_name[i], ln, 0); - else { - sprintf(script, "{%s}", sql_row[20]); - id->equip_script = parse_script(script, item_db_name[i], ln, 0); - } - } else id->equip_script = NULL; + nameid = atoi(str[0]); + if(nameid <= 0) + return false; - if (id->unequip_script) - script_free_code(id->unequip_script); - if (sql_row[21] != NULL) { - if (sql_row[21][0] == '{') - id->unequip_script = parse_script(sql_row[21],item_db_name[i], ln, 0); - else { - sprintf(script, "{%s}", sql_row[21]); - id->unequip_script = parse_script(script, item_db_name[i], ln, 0); - } - } else id->unequip_script = NULL; - - // ---------- - - id->flag.available = 1; - id->flag.value_notdc = 0; - id->flag.value_notoc = 0; - } + //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View + id = itemdb_load(nameid); + safestrncpy(id->name, str[1], ITEM_NAME_LENGTH-1); + safestrncpy(id->jname, str[2], ITEM_NAME_LENGTH-1); + + id->type = atoi(str[3]); + if (id->type == IT_DELAYCONSUME) + { //Items that are consumed only after target confirmation + id->type = IT_USABLE; + id->flag.delay_consume = 1; + } else //In case of an itemdb reload and the item type changed. + id->flag.delay_consume = 0; + + id->value_buy = atoi(str[4]); + id->value_sell = atoi(str[5]); + if (id->value_buy < id->value_sell * 2) id->value_buy = id->value_sell * 2; // prevent exploit + if (id->value_buy == 0 && id->value_sell > 0) id->value_buy = id->value_sell * 2; + if (id->value_sell == 0 && id->value_buy > 0) id->value_sell = id->value_buy / 2; + + id->weight = atoi(str[6]); + id->atk = atoi(str[7]); + id->def = atoi(str[8]); + id->range = atoi(str[9]); + id->slot = atoi(str[10]); + + if (id->slot > MAX_SLOTS) + { + ShowWarning("itemdb_parse_dbrow: Item %d (%s) specifies %d slots, but the server only supports up to %d\n", nameid, id->jname, id->slot, MAX_SLOTS); + id->slot = MAX_SLOTS; + } + + itemdb_jobid2mapid(id->class_base, (unsigned int)strtoul(str[11],NULL,0)); + id->class_upper = atoi(str[12]); + id->sex = atoi(str[13]); + id->equip = atoi(str[14]); + + if (!id->equip && itemdb_isequip2(id)) + { + ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname); + id->type = IT_ETC; + } + + id->wlv = atoi(str[15]); + id->elv = atoi(str[16]); + id->flag.no_refine = atoi(str[17]) ? 0 : 1; //FIXME: verify this + id->look = atoi(str[18]); + + id->flag.available = 1; + id->flag.value_notdc = 0; + id->flag.value_notoc = 0; + id->view_id = 0; + id->sex = itemdb_gendercheck(id); //Apply gender filtering. - ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, item_db_name[i]); - ln = 0; - } else { - ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + if (id->script) + script_free_code(id->script); + if (id->equip_script) + script_free_code(id->equip_script); + if (id->unequip_script) + script_free_code(id->unequip_script); - // Free the query result - mysql_free_result(sql_res); - } else { - ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } - } + if (*str[19]) + id->script = parse_script(str[19], source, line, 0); + if (*str[20]) + id->equip_script = parse_script(str[20], source, line, 0); + if (*str[21]) + id->unequip_script = parse_script(str[21], source, line, 0); - return 0; + return true; } -#endif /* not TXT_ONLY */ /*========================================== * アイテムデータベースの読み込み *------------------------------------------*/ static int itemdb_readdb(void) { - FILE *fp; - char line[1024]; - int ln=0,lines=0; - int nameid,j; - char *str[32],*p,*np; - struct item_data *id; - int i=0; - char *filename[]={ "item_db.txt","item_db2.txt" }; - - for(i=0;i<2;i++){ - sprintf(line, "%s/%s", db_path, filename[i]); - fp=fopen(line,"r"); - if(fp==NULL){ - if(i>0) + char* filename[] = { "item_db.txt", "item_db2.txt" }; + int fi; + + for(fi = 0; fi < 2; fi++) + { + uint32 lines = 0, count = 0; + char line[1024]; + + char path[256]; + FILE* fp; + + sprintf(path, "%s/%s", db_path, filename[fi]); + fp = fopen(path, "r"); + if(fp == NULL) { + if(fi > 0) continue; - ShowFatalError("can't read %s\n",line); - exit(1); + return -1; } - lines=0; + // process rows one by one while(fgets(line, sizeof(line), fp)) { - lines++; - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - for(j=0,np=p=line;j<19 && p;j++){ - str[j]=p; - p=strchr(p,','); - if(p){ *p++=0; np=p; } - } - if(str[0]==NULL) - continue; + char *str[32], *p, *np; + int i; - nameid=atoi(str[0]); - if(nameid<=0) - continue; - if (j < 19) - { //Crash-fix on broken item lines. [Skotlex] - ShowWarning("Reading %s: Insufficient fields for item with id %d, skipping.\n", filename[i], nameid); + lines++; + if(line[0] == '/' && line[1] == '/') continue; - } - ln++; - - //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View - id=itemdb_load(nameid); - strncpy(id->name, str[1], ITEM_NAME_LENGTH-1); - strncpy(id->jname, str[2], ITEM_NAME_LENGTH-1); - id->type=atoi(str[3]); - if (id->type == IT_DELAYCONSUME) - { //Items that are consumed upon target confirmation - //(yggdrasil leaf, spells & pet lures) [Skotlex] - id->type = IT_USABLE; - id->flag.delay_consume=1; - } else //In case of an itemdb reload and the item type changed. - id->flag.delay_consume=0; - + memset(str, 0, sizeof(str)); + for(i = 0, np = p = line; i < 19 && p; i++) { - int buy = atoi(str[4]), sell = atoi(str[5]); - // if buying price > selling price * 2 consider it valid and don't change it [celest] - if (buy && sell && buy > sell*2){ - id->value_buy = buy; - id->value_sell = sell; - } else { - // buy≠sell*2 は item_value_db.txt で指定してください。 - if (sell) { // sell値を優先とする - id->value_buy = sell*2; - id->value_sell = sell; - } else { - id->value_buy = buy; - id->value_sell = buy/2; - } + str[i] = p; + if ((p = strchr(p,',')) != NULL) { + *p++ = '\0'; np = p; } - // check for bad prices that can possibly cause exploits - if (id->value_buy*75/100 < id->value_sell*124/100) { - ShowWarning ("Item %s [%d] buying:%d < selling:%d\n", - id->name, id->nameid, id->value_buy*75/100, id->value_sell*124/100); - } - } - id->weight=atoi(str[6]); - id->atk=atoi(str[7]); - id->def=atoi(str[8]); - id->range=atoi(str[9]); - id->slot=atoi(str[10]); - if (id->slot > MAX_SLOTS) - { - ShowWarning("itemdb_readdb: Item %d (%s) specifies %d slots, but the server only supports up to %d\n", nameid, id->jname, id->slot, MAX_SLOTS); - id->slot = MAX_SLOTS; - } - itemdb_jobid2mapid(id->class_base, (unsigned int)strtoul(str[11],NULL,0)); - id->class_upper = atoi(str[12]); - id->sex = atoi(str[13]); - if(id->equip != atoi(str[14])){ - id->equip=atoi(str[14]); - } - if (!id->equip && itemdb_isequip2(id)) - { - ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname); - id->type = 3; - } - id->wlv=atoi(str[15]); - id->elv=atoi(str[16]); - id->flag.no_refine = atoi(str[17])?0:1; //If the refine column is 1, no_refine is 0 - id->look=atoi(str[18]); - id->flag.available=1; - id->flag.value_notdc=0; - id->flag.value_notoc=0; - id->view_id=0; - id->sex = itemdb_gendercheck(id); //Apply gender filtering. - - if (id->script) { - script_free_code(id->script); - id->script=NULL; } - if (id->equip_script) { - script_free_code(id->equip_script); - id->equip_script=NULL; - } - if (id->unequip_script) { - script_free_code(id->unequip_script); - id->unequip_script=NULL; + + if (i < 19) { + ShowWarning("itemdb_readdb: Insufficient columns for item with id %d, skipping.\n", atoi(str[0])); + continue; } - if((p=strchr(np,'{'))==NULL) + if((p=strchr(np,'{')) == NULL) continue; - str[19] = p; //Script np = strchr(p,'}'); - while (np && np[1] && np[1] != ',') np = strchr(np+1,'}'); //Jump close brackets until the next field is found. if (!np || !np[1]) { - //Couldn't find the end of the script field. - id->script = parse_script(str[19],filename[i],lines,0); - continue; + continue; //Couldn't find the end of the script field. } np[1] = '\0'; //Set end of script - id->script = parse_script(str[19],filename[i],lines,0); - np+=2; //Skip to next field + np += 2; //Skip to next field if(!np || (p=strchr(np,'{'))==NULL) continue; - str[20] = p; //Equip Script np = strchr(p,'}'); - while (np && np[1] && np[1] != ',') np = strchr(np+1,'}'); //Jump close brackets until the next field is found. if (!np || !np[1]) { - //Couldn't find the end of the script field. - id->equip_script = parse_script(str[20],filename[i],lines,0); - continue; + continue; //Couldn't find the end of the script field. } - np[1] = '\0'; //Set end of script - id->equip_script = parse_script(str[20],filename[i],lines,0); - np+=2; //Skip comma, to next field + np += 2; //Skip comma, to next field if(!np || (p=strchr(np,'{'))==NULL) continue; - //Unequip script, last column. - id->unequip_script = parse_script(p,filename[i],lines,0); + str[21] = p; //Unequip script, last column. + + if (!itemdb_parse_dbrow(str, filename[fi], lines)) + continue; + + count++; } + fclose(fp); - if (ln > 0) { - ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]); + + ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filename[fi]); + } + + return 0; +} + +#ifndef TXT_ONLY +/*====================================== + * item_db table reading + *======================================*/ +static int itemdb_read_sqldb(void) +{ + char* item_db_name[] = { item_db_db, item_db2_db }; + int fi; + + for (fi = 0; fi < 2; fi++) + { + uint32 lines = 0, count = 0; + + // retrieve all rows from the item database + if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT * FROM `%s`", item_db_name[fi]) ) + { + Sql_ShowDebug(mmysql_handle); + continue; + } + + // process rows one by one + while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) ) + { + // wrap the result into a TXT-compatible format + char line[1024]; + char* str[22]; + char* p; + int i; + + lines++; + for (i = 0, p = line; i < 22; i++) + { + char* data; + size_t len; + Sql_GetData(mmysql_handle, i, &data, &len); + + if (data == NULL) + p[0] = '\0'; + else if (i >= 19 && data[0] != '{') { + sprintf(p, "{ %s }", data); len+= 4; + } else + strcpy(p, data); + str[i] = p; + p+= len + 1; + } + + if (!itemdb_parse_dbrow(str, item_db_name[fi], lines)) + continue; + + count++; } - ln=0; // reset to 0 + + // free the query result + Sql_FreeResult(mmysql_handle); + + ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, item_db_name[fi]); } + return 0; } +#endif /* not TXT_ONLY */ /*==================================== - * Removed item_value_db, don't re-add + * read all item-related databases *------------------------------------*/ static void itemdb_read(void) { diff --git a/src/map/log.c b/src/map/log.c index fdbb4470f..b5c4a3d9c 100644 --- a/src/map/log.c +++ b/src/map/log.c @@ -19,6 +19,8 @@ struct Log_Config log_config; char timestring[255]; time_t curtime; +static int should_log_item(int filter, int nameid, int amount); //log filter check + //FILTER OPTIONS //0 = Don't log //1 = Log any item @@ -58,104 +60,105 @@ int should_log_item(int filter, int nameid, int amount) int log_branch(struct map_session_data *sd) { -#ifndef TXT_ONLY - char t_name[NAME_LENGTH*2]; -#endif - FILE *logfp; - if(!log_config.enable_logs) return 0; + nullpo_retr(0, sd); + #ifndef TXT_ONLY if(log_config.sql_logs > 0) { - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`branch_date`, `account_id`, `char_id`, `char_name`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%s')", - log_config.log_branch_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex)); - if(mysql_query(&logmysql_handle, tmp_sql)) + SqlStmt* stmt; + stmt = SqlStmt_Malloc(logmysql_handle); + if( SQL_SUCCESS != SqlStmt_Prepare(stmt, "INSERT DELAYED INTO `%s` (`branch_date`, `account_id`, `char_id`, `char_name`, `map`) VALUES (NOW(), '%d', '%d', ?, '%s')", log_config.log_branch_db, sd->status.account_id, sd->status.char_id, sd->status.name, mapindex_id2name(sd->mapindex)) + || SQL_SUCCESS != SqlStmt_BindParam(stmt, 0, SQLDT_STRING, sd->status.name, strnlen(sd->status.name, NAME_LENGTH)) + || SQL_SUCCESS != SqlStmt_Execute(stmt) ) { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); return 0; } - return 1; + SqlStmt_Free(stmt); } + else #endif - if((logfp=fopen(log_config.log_branch,"a+")) == NULL) - return 0; - time(&curtime); - strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - fprintf(logfp,"%s - %s[%d:%d]\t%s\n", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, mapindex_id2name(sd->mapindex)); - fclose(logfp); + { + FILE* logfp; + if((logfp = fopen(log_config.log_branch, "a+")) == NULL) + return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + fprintf(logfp,"%s - %s[%d:%d]\t%s\n", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, mapindex_id2name(sd->mapindex)); + fclose(logfp); + } + return 1; } int log_pick_pc(struct map_session_data *sd, const char *type, int nameid, int amount, struct item *itm) { - FILE *logfp; - char *mapname; - nullpo_retr(0, sd); - //Should we log this item? [Lupus] - if (!should_log_item(log_config.filter,nameid, amount)) - return 0; //we skip logging this items set - they doesn't met our logging conditions [Lupus] - mapname = (char*)mapindex_id2name(sd->mapindex); - - if(mapname==NULL) - mapname=""; + if (!should_log_item(log_config.filter, nameid, amount)) + return 0; //we skip logging this item set - it doesn't meet our logging conditions [Lupus] #ifndef TXT_ONLY if(log_config.sql_logs > 0) { - if (itm==NULL) { - //We log common item - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')", - log_config.log_pick_db, sd->status.char_id, type, nameid, amount, mapname); + if (itm == NULL) { + //We log common item + if (SQL_ERROR == Sql_Query(logmysql_handle, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')", + log_config.log_pick_db, sd->status.char_id, type, nameid, amount, mapindex_id2name(sd->mapindex)) ) + { + Sql_ShowDebug(logmysql_handle); + return 0; + } } else { - //We log Extended item - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')", - log_config.log_pick_db, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname); + //We log Extended item + if (SQL_ERROR == Sql_Query(logmysql_handle, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')", + log_config.log_pick_db, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapindex_id2name(sd->mapindex)) ) + { + Sql_ShowDebug(logmysql_handle); + return 0; + } } + } + else +#endif + { + FILE* logfp; - if(mysql_query(&logmysql_handle, tmp_sql)) - { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + if((logfp = fopen(log_config.log_pick, "a+")) == NULL) return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + + if (itm == NULL) { + //We log common item + fprintf(logfp,"%s - %d\t%s\t%d,%d,%s\n", + timestring, sd->status.char_id, type, nameid, amount, mapindex_id2name(sd->mapindex)); + + } else { + //We log Extended item + fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s\n", + timestring, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapindex_id2name(sd->mapindex)); } - return 1; + fclose(logfp); } -#endif - if((logfp=fopen(log_config.log_pick,"a+")) == NULL) - return 0; - time(&curtime); - strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - - if (itm==NULL) { - //We log common item - fprintf(logfp,"%s - %d\t%s\t%d,%d,%s\n", - timestring, sd->status.char_id, type, nameid, amount, mapname); - - } else { - //We log Extended item - fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s\n", - timestring, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname); - } - fclose(logfp); + return 1; //Logged } //Mob picked item int log_pick_mob(struct mob_data *md, const char *type, int nameid, int amount, struct item *itm) { - FILE *logfp; - char *mapname; + char* mapname; nullpo_retr(0, md); - //Should we log this item? [Lupus] - if (!should_log_item(log_config.filter,nameid, amount)) - return 0; //we skip logging this items set - they doesn't met our logging conditions [Lupus] + + if (!should_log_item(log_config.filter, nameid, amount)) + return 0; //we skip logging this item set - it doesn't meet our logging conditions [Lupus] //either PLAYER or MOB (here we get map name and objects ID) mapname = map[md->bl.m].name; @@ -167,180 +170,200 @@ int log_pick_mob(struct mob_data *md, const char *type, int nameid, int amount, { if (itm==NULL) { //We log common item - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')", - log_config.log_pick_db, md->class_, type, nameid, amount, mapname); + if (SQL_ERROR == Sql_Query(logmysql_handle, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')", + log_config.log_pick_db, md->class_, type, nameid, amount, mapname) ) + { + Sql_ShowDebug(logmysql_handle); + return 0; + } } else { //We log Extended item - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')", - log_config.log_pick_db, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname); + if (SQL_ERROR == Sql_Query(logmysql_handle, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')", + log_config.log_pick_db, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname) ) + { + Sql_ShowDebug(logmysql_handle); + return 0; + } } + } + else +#endif + { + FILE *logfp; - if(mysql_query(&logmysql_handle, tmp_sql)) - { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + if((logfp=fopen(log_config.log_pick,"a+")) == NULL) return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + + if (itm==NULL) { + //We log common item + fprintf(logfp,"%s - %d\t%s\t%d,%d,%s\n", + timestring, md->class_, type, nameid, amount, mapname); + + } else { + //We log Extended item + fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s\n", + timestring, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname); } - return 1; - } -#endif - if((logfp=fopen(log_config.log_pick,"a+")) == NULL) - return 0; - time(&curtime); - strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - - if (itm==NULL) { - //We log common item - fprintf(logfp,"%s - %d\t%s\t%d,%d,%s\n", - timestring, md->class_, type, nameid, amount, mapname); - - } else { - //We log Extended item - fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s\n", - timestring, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname); + fclose(logfp); } - fclose(logfp); + return 1; //Logged } int log_zeny(struct map_session_data *sd, char *type, struct map_session_data *src_sd, int amount) { -// FILE *logfp; - if(!log_config.enable_logs || (log_config.zeny!=1 && abs(amount)<log_config.zeny)) + if(!log_config.enable_logs || (log_config.zeny != 1 && abs(amount) < log_config.zeny)) return 0; nullpo_retr(0, sd); + #ifndef TXT_ONLY if(log_config.sql_logs > 0) { - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `src_id`, `type`, `amount`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%s')", - log_config.log_zeny_db, sd->status.char_id, src_sd->status.char_id, type, amount, mapindex_id2name(sd->mapindex)); - if(mysql_query(&logmysql_handle, tmp_sql)) + if (SQL_ERROR == Sql_Query(logmysql_handle, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `src_id`, `type`, `amount`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%s')", + log_config.log_zeny_db, sd->status.char_id, src_sd->status.char_id, type, amount, mapindex_id2name(sd->mapindex)) ) { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + Sql_ShowDebug(logmysql_handle); return 0; } - return 1; } + else #endif -// if((logfp=fopen(log_config.log_zeny,"a+")) == NULL) -// return 0; -// time(&curtime); -// strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); -// fprintf(logfp,"%s - %s[%d]\t%s[%d]\t%d\n", timestring, sd->status.name, sd->status.account_id, target_sd->status.name, target_sd->status.account_id, sd->deal.zeny); -// fclose(logfp); -// return 1; - return 0; + { + FILE* logfp; + if((logfp=fopen(log_config.log_zeny,"a+")) == NULL) + return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + fprintf(logfp, "%s - %s[%d]\t%s[%d]\t%d\t\n", timestring, src_sd->status.name, src_sd->status.account_id, sd->status.name, sd->status.account_id, amount); + fclose(logfp); + } + + return 1; } int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp) { - FILE *logfp; - if(!log_config.enable_logs) return 0; + nullpo_retr(0, sd); + #ifndef TXT_ONLY if(log_config.sql_logs > 0) { - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`mvp_date`, `kill_char_id`, `monster_id`, `prize`, `mvpexp`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%s') ", log_config.log_mvpdrop_db, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], mapindex_id2name(sd->mapindex)); - if(mysql_query(&logmysql_handle, tmp_sql)) + if (SQL_ERROR == Sql_Query(logmysql_handle, "INSERT DELAYED INTO `%s` (`mvp_date`, `kill_char_id`, `monster_id`, `prize`, `mvpexp`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%s') ", + log_config.log_mvpdrop_db, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], mapindex_id2name(sd->mapindex)) ) { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + Sql_ShowDebug(logmysql_handle); return 0; } - return 1; } + else #endif - if((logfp=fopen(log_config.log_mvpdrop,"a+")) == NULL) - return 0; - time(&curtime); - strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d,%d\n", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1]); - fclose(logfp); - return 0; + { + FILE* logfp; + if((logfp=fopen(log_config.log_mvpdrop,"a+")) == NULL) + return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d,%d\n", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1]); + fclose(logfp); + } + + return 1; } -int log_atcommand(struct map_session_data *sd, const char *message) +int log_atcommand(struct map_session_data* sd, const char* message) { - FILE *logfp; -#ifndef TXT_ONLY - char t_name[NAME_LENGTH*2]; - char t_msg[CHAT_SIZE*2+1]; //These are the contents of an @ call, so there shouldn't be overflow danger here? -#endif - if(!log_config.enable_logs) return 0; + nullpo_retr(0, sd); + #ifndef TXT_ONLY if(log_config.sql_logs > 0) { + SqlStmt* stmt; + if (strlen(message) > CHAT_SIZE) { if (battle_config.error_log) - ShowError("log atcommand: Received message too long from player %s (%d:%d)!\n", - sd->status.name, sd->status.account_id, sd->status.char_id); + ShowError("log atcommand: Received message too long from player %s (%d:%d)!\n", sd->status.name, sd->status.account_id, sd->status.char_id); return 0; } - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`atcommand_date`, `account_id`, `char_id`, `char_name`, `map`, `command`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ", - log_config.log_gm_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex), jstrescapecpy(t_msg, (char *)message)); - if(mysql_query(&logmysql_handle, tmp_sql)) + + stmt = SqlStmt_Malloc(logmysql_handle); + if( SQL_SUCCESS != SqlStmt_Prepare(stmt, "INSERT DELAYED INTO `%s` (`atcommand_date`, `account_id`, `char_id`, `char_name`, `map`, `command`) VALUES (NOW(), '%d', '%d', ?, '%s', ?)", log_config.log_gm_db, sd->status.account_id, sd->status.char_id, sd->status.name, mapindex_id2name(sd->mapindex), message) + || SQL_SUCCESS != SqlStmt_BindParam(stmt, 0, SQLDT_STRING, sd->status.name, strnlen(sd->status.name, NAME_LENGTH)) + || SQL_SUCCESS != SqlStmt_BindParam(stmt, 1, SQLDT_STRING, (char*)message, strnlen(message, 255)) + || SQL_SUCCESS != SqlStmt_Execute(stmt) ) { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); return 0; } - return 1; + SqlStmt_Free(stmt); } + else #endif - if((logfp=fopen(log_config.log_gm,"a+")) == NULL) - return 0; - time(&curtime); - strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - fprintf(logfp,"%s - %s[%d]: %s\n",timestring,sd->status.name,sd->status.account_id,message); - fclose(logfp); + { + FILE* logfp; + if((logfp = fopen(log_config.log_gm, "a+")) == NULL) + return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + fprintf(logfp, "%s - %s[%d]: %s\n", timestring, sd->status.name, sd->status.account_id, message); + fclose(logfp); + } + return 1; } -int log_npc(struct map_session_data *sd, const char *message) -{ //[Lupus] - FILE *logfp; -#ifndef TXT_ONLY - char t_name[NAME_LENGTH*2]; - char t_msg[255+1]; //it's 255 chars MAX. -#endif - +int log_npc(struct map_session_data* sd, const char* message) +{ if(!log_config.enable_logs) return 0; + nullpo_retr(0, sd); + #ifndef TXT_ONLY if(log_config.sql_logs > 0) { - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`npc_date`, `account_id`, `char_id`, `char_name`, `map`, `mes`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ", - log_config.log_npc_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex), jstrescapecpy(t_msg, (char *)message)); - if(mysql_query(&logmysql_handle, tmp_sql)) + SqlStmt* stmt; + stmt = SqlStmt_Malloc(logmysql_handle); + if( SQL_SUCCESS != SqlStmt_Prepare(stmt, "INSERT DELAYED INTO `%s` (`npc_date`, `account_id`, `char_id`, `char_name`, `map`, `mes`) VALUES (NOW(), '%d', '%d', ?, '%s', ?)", log_config.log_npc_db, sd->status.account_id, sd->status.char_id, sd->status.name, mapindex_id2name(sd->mapindex), message) + || SQL_SUCCESS != SqlStmt_BindParam(stmt, 0, SQLDT_STRING, sd->status.name, strnlen(sd->status.name, NAME_LENGTH)) + || SQL_SUCCESS != SqlStmt_BindParam(stmt, 1, SQLDT_STRING, (char*)message, strnlen(message, 255)) + || SQL_SUCCESS != SqlStmt_Execute(stmt) ) { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); return 0; } - return 1; + SqlStmt_Free(stmt); } + else #endif - if((logfp=fopen(log_config.log_npc,"a+")) == NULL) - return 0; - time(&curtime); - strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - fprintf(logfp,"%s - %s[%d]: %s\n",timestring,sd->status.name,sd->status.account_id,message); - fclose(logfp); + { + FILE* logfp; + if((logfp = fopen(log_config.log_npc, "a+")) == NULL) + return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + fprintf(logfp, "%s - %s[%d]: %s\n", timestring, sd->status.name, sd->status.account_id, message); + fclose(logfp); + } + return 1; } - int log_chat(const char* type, int type_id, int src_charid, int src_accid, const char* map, int x, int y, const char* dst_charname, const char* message) { + //FIXME: the actual filtering is being done by the calling code instead of in here, why!? + // Log CHAT (Global, Whisper, Party, Guild, Main chat) // LOGGING FILTERS [Lupus] //============================================================= @@ -353,42 +376,45 @@ int log_chat(const char* type, int type_id, int src_charid, int src_accid, const //16 - Log Main chat messages //32 - Don't log anything when WOE is on - FILE *logfp; -#ifndef TXT_ONLY - char t_charname[NAME_LENGTH*2]; - char t_msg[CHAT_SIZE*2+1]; //Chat line fully escaped, with an extra space just in case. -#endif - //Check ON/OFF if(log_config.chat <= 0) return 0; //Deactivated #ifndef TXT_ONLY - if(log_config.sql_logs > 0){ + if(log_config.sql_logs > 0) + { + SqlStmt* stmt; + if (strlen(message) > CHAT_SIZE) { if (battle_config.error_log) - ShowError("log chat: Received message too long from type %d (%d:%d)!\n", - type_id, src_accid, src_charid); + ShowError("log chat: Received message too long from type %d (%d:%d)!\n", type_id, src_accid, src_charid); return 0; } - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `type`, `type_id`, `src_charid`, `src_accountid`, `src_map`, `src_map_x`, `src_map_y`, `dst_charname`, `message`) VALUES (NOW(), '%s', '%d', '%d', '%d', '%s', '%d', '%d', '%s', '%s')", - log_config.log_chat_db, type, type_id, src_charid, src_accid, map, x, y, jstrescapecpy(t_charname, dst_charname), jstrescapecpy(t_msg, message)); - - if(mysql_query(&logmysql_handle, tmp_sql)){ - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - return 0; + + stmt = SqlStmt_Malloc(logmysql_handle); + if( SQL_SUCCESS != SqlStmt_Prepare(stmt, "INSERT DELAYED INTO `%s` (`time`, `type`, `type_id`, `src_charid`, `src_accountid`, `src_map`, `src_map_x`, `src_map_y`, `dst_charname`, `message`) VALUES (NOW(), '%s', '%d', '%d', '%d', '%s', '%d', '%d', ?, ?)", log_config.log_chat_db, type, type_id, src_charid, src_accid, map, x, y) + || SQL_SUCCESS != SqlStmt_BindParam(stmt, 0, SQLDT_STRING, (char*)dst_charname, strnlen(dst_charname, NAME_LENGTH)) + || SQL_SUCCESS != SqlStmt_BindParam(stmt, 1, SQLDT_STRING, (char*)message, strnlen(message, CHAT_SIZE)) + || SQL_SUCCESS != SqlStmt_Execute(stmt) ) + { + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); + return 0; } - return 1; + SqlStmt_Free(stmt); } + else #endif - if((logfp = fopen(log_config.log_chat, "a+")) == NULL) - return 0; - time(&curtime); - strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - fprintf(logfp, "%s - %s,%d,%d,%d,%s,%d,%d,%s,%s\n", - timestring, type, type_id, src_charid, src_accid, map, x, y, dst_charname, message); - fclose(logfp); + { + FILE* logfp; + if((logfp = fopen(log_config.log_chat, "a+")) == NULL) + return 0; + time(&curtime); + strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); + fprintf(logfp, "%s - %s,%d,%d,%d,%s,%d,%d,%s,%s\n", timestring, type, type_id, src_charid, src_accid, map, x, y, dst_charname, message); + fclose(logfp); + } + return 1; } diff --git a/src/map/log.h b/src/map/log.h index ee0b38beb..0065b77c0 100644 --- a/src/map/log.h +++ b/src/map/log.h @@ -9,12 +9,6 @@ struct map_session_data; struct mob_data; struct item; -#ifndef TXT_ONLY - -extern char db_server_logdb[32]; - -#endif //NOT TXT_ONLY - //New logs int log_pick_pc(struct map_session_data *sd, const char *type, int nameid, int amount, struct item *itm); int log_pick_mob(struct mob_data *md, const char *type, int nameid, int amount, struct item *itm); @@ -30,8 +24,6 @@ int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp); int log_config_read(char *cfgName); -int should_log_item(int filter, int nameid, int amount); //log filter check - enum log_what { LOG_ALL = 0xFFF, LOG_TRADES = 0x002, diff --git a/src/map/mail.c b/src/map/mail.c index 8433fbada..6e6dc0a91 100644 --- a/src/map/mail.c +++ b/src/map/mail.c @@ -2,9 +2,6 @@ // For more information, see LICENCE in the main folder #ifndef TXT_ONLY -// Mail System for eAthena SQL -// Created by Valaris -// moved all strings to msg_athena.conf [Lupus] #include "../common/strlib.h" #include "../common/socket.h" @@ -27,318 +24,345 @@ int MAIL_CHECK_TIME = 120000; int mail_timer; -//extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others) -int mail_check(struct map_session_data *sd,int type) +/// type: 0 - mail check at login, silent if there aren't any new messages +/// 1 - @checkmail, just print the number of messages +/// 2 - @listmail, shows both read and unread messages +/// 3 - @listnewmail, shows only unread messages +int mail_check(struct map_session_data* sd, int type) { - int i = 0, new_ = 0, priority = 0; + int i = 0, new_ = 0, priority = 0; // counters char message[80]; nullpo_retr (0, sd); - sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`read_flag`,`priority`,`check_flag` " - "FROM `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id`", mail_db, sd->status.account_id); - - if (mysql_query(&mail_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + // retrieve all existing messages for this player + if( SQL_ERROR == Sql_Query(mail_handle, "SELECT `message_id`,`to_account_id`,`from_char_name`,`read_flag`,`priority`,`check_flag` FROM `%s` WHERE `to_account_id` = %d ORDER by `message_id`", mail_db, sd->status.account_id) ) + { + Sql_ShowDebug(mail_handle); return 0; } - mail_res = mysql_store_result(&mail_handle); - if(mail_res) { - if (mysql_num_rows(mail_res) == 0) { - //clif_displaymessage(sd->fd,"You have no messages."); - clif_displaymessage(sd->fd, msg_txt(516)); + if( Sql_NumRows(mail_handle) == 0) + { + clif_displaymessage(sd->fd, msg_txt(516)); // "You have no messages." + Sql_FreeResult(mail_handle); + return 0; + } - mysql_free_result(mail_res); - return 0; + while( SQL_SUCCESS == Sql_NextRow(mail_handle) ) + { + char* data; + int message_id; + int to_account_id; + char from_char_name[NAME_LENGTH]; + bool read_flag, priority_flag, check_flag; + + Sql_GetData(mail_handle, 0, &data, NULL); message_id = atoi(data); + Sql_GetData(mail_handle, 1, &data, NULL); to_account_id = atoi(data); + Sql_GetData(mail_handle, 2, &data, NULL); safestrncpy(from_char_name, data, sizeof(from_char_name)); + Sql_GetData(mail_handle, 3, &data, NULL); read_flag = (bool) atoi(data); + Sql_GetData(mail_handle, 4, &data, NULL); priority_flag = (bool) atoi(data); + Sql_GetData(mail_handle, 5, &data, NULL); check_flag = (bool) atoi(data); + + i++; + + if( !check_flag ) + { + // mark this message as checked + if( SQL_ERROR == Sql_Query(mail_handle, "UPDATE `%s` SET `check_flag` = 1 WHERE `message_id` = %d", mail_db, message_id) ) + Sql_ShowDebug(mail_handle); } - while ((mail_row = mysql_fetch_row(mail_res))) { - i++; - if(!atoi(mail_row[5])) { - sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0])); - if(mysql_query(&mail_handle, tmp_sql) ) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + if( !read_flag ) + { + new_++; + if(priority_flag) + priority++; + + if( type == 2 || type == 3 ) + { + if( priority_flag ) + { + snprintf(message, 80, msg_txt(511), i, from_char_name); + clif_displaymessage(sd->fd, message); // "%d - From : %s (New - Priority)" } - } - - if(!atoi(mail_row[3])) { - new_++; - if(atoi(mail_row[4])) - priority++; - if(type==2 || type==3) { - if(atoi(mail_row[4])) { - snprintf(message, 80, msg_txt(511), i, mail_row[2]); - clif_displaymessage(sd->fd, message); - } else { - //sprintf(message, "%d - From : %s (New)", i, mail_row[2]); - snprintf(message, 80, msg_txt(512), i, mail_row[2]); - clif_displaymessage(sd->fd, message); - } + else + { + snprintf(message, 80, msg_txt(512), i, from_char_name); + clif_displaymessage(sd->fd, message); // "%d - From : %s (New)" } - } else if(type==2){ - snprintf(message, 80, msg_txt(513), i, mail_row[2]); - clif_displaymessage(sd->fd, message); } } + else if( type == 2 ) + { + snprintf(message, 80, msg_txt(513), i, from_char_name); + clif_displaymessage(sd->fd, message); // "%d - From : %s" + } + } - mysql_free_result(mail_res); - } else { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - return 0; - } - - if(i>0 && new_>0 && type==1) { - //sprintf(message, "You have %d new messages.", new_); + Sql_FreeResult(mail_handle); + + if( new_ > 0 && (type == 0 || type == 1) ) + { sprintf(message, msg_txt(514), new_); - - clif_displaymessage(sd->fd, jstrescape(message)); - } - if(i>0 && new_>0 && priority>0 && type==1) { - //sprintf(message, "You have %d unread priority messages.", priority); - sprintf(message, msg_txt(515), priority); - clif_displaymessage(sd->fd, jstrescape(message)); + clif_displaymessage(sd->fd, message); // "You have %d unread messages." + if (priority > 0) + { + sprintf(message, msg_txt(515), priority); + clif_displaymessage(sd->fd, message); // "You have %d unread priority messages." + } } - if(!new_) { - //clif_displaymessage(sd->fd, "You have no new messages."); - clif_displaymessage(sd->fd, msg_txt(516)); + if( new_ == 0 && type != 0 ) + { + clif_displaymessage(sd->fd, msg_txt(516)); // "You have no unread messages." } return 0; } -int mail_read(struct map_session_data *sd, int message_id) +/// displays the selected message +int mail_read(struct map_session_data* sd, int index) { - + char* data; + int message_id; + char from_char_name[NAME_LENGTH]; char message[80]; + bool read_flag, priority_flag, check_flag; + char output[100]; - nullpo_retr (0, sd); + nullpo_retr(0, sd); - sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`message`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1); + // retrieve the 'index'-th message + if( SQL_ERROR == Sql_Query(mail_handle, "SELECT `message_id`,`from_char_name`,`message`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = %d ORDER by `message_id` LIMIT %d, 1", mail_db, sd->status.account_id, index-1) ) + { + Sql_ShowDebug(mail_handle); + return 0; + } - if (mysql_query(&mail_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + if( 0 == Sql_NumRows(mail_handle) ) + { + clif_displaymessage(sd->fd, msg_txt(517)); // "Message not found." + Sql_FreeResult(mail_handle); return 0; - } - - mail_res = mysql_store_result(&mail_handle); - if(mail_res) { - if (mysql_num_rows(mail_res) == 0) { - mysql_free_result(mail_res); - //clif_displaymessage(sd->fd, "Message not found."); - clif_displaymessage(sd->fd, msg_txt(517)); - return 0; - } + } - if ((mail_row = mysql_fetch_row(mail_res))) { - if(!atoi(mail_row[6])) { - sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0])); - if(mysql_query(&mail_handle, tmp_sql) ) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } - } + if( SQL_ERROR == Sql_NextRow(mail_handle) ) + { + Sql_ShowDebug(mail_handle); + Sql_FreeResult(mail_handle); + return 0; + } - //sprintf(message, "Reading message from %s", mail_row[2]); - sprintf(message, msg_txt(518), mail_row[2]); - clif_displaymessage(sd->fd, jstrescape(message)); + Sql_GetData(mail_handle, 0, &data, NULL); message_id = atoi(data); + Sql_GetData(mail_handle, 1, &data, NULL); safestrncpy(from_char_name, data, sizeof(from_char_name)); + Sql_GetData(mail_handle, 2, &data, NULL); safestrncpy(message, data, sizeof(message)); + Sql_GetData(mail_handle, 3, &data, NULL); read_flag = (bool) atoi(data); + Sql_GetData(mail_handle, 4, &data, NULL); priority_flag = (bool) atoi(data); + Sql_GetData(mail_handle, 5, &data, NULL); check_flag = (bool) atoi(data); - sprintf(message, "%s", mail_row[3]); - clif_displaymessage(sd->fd, jstrescape(message)); + Sql_FreeResult(mail_handle); - sprintf(tmp_sql,"UPDATE `%s` SET `read_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0])); - if(mysql_query(&mail_handle, tmp_sql) ) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } - } + // mark mail as checked + if( !check_flag ) + { + if( SQL_ERROR == Sql_Query(mail_handle, "UPDATE `%s` SET `check_flag` = 1 WHERE `message_id` = %d", mail_db, message_id) ) + Sql_ShowDebug(mail_handle); + } - mysql_free_result(mail_res); + sprintf(output, msg_txt(518), from_char_name); + clif_displaymessage(sd->fd, output); // "Reading message from %s" + clif_displaymessage(sd->fd, message); - } else { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + if( SQL_ERROR == Sql_Query(mail_handle, "UPDATE `%s` SET `read_flag` = 1 WHERE `message_id` = %d", mail_db, message_id) ) + { + Sql_ShowDebug(mail_handle); + } return 0; } -int mail_delete(struct map_session_data *sd, int message_id) +/// message deletion +int mail_delete(struct map_session_data* sd, int index) { + char* data; + int message_id; + bool read_flag, priority_flag, check_flag; + nullpo_retr (0, sd); - sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1); + if( SQL_ERROR == Sql_Query(mail_handle, "SELECT `message_id`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = %d ORDER by `message_id` LIMIT %d, 1", mail_db, sd->status.account_id, index-1) ) + { + Sql_ShowDebug(mail_handle); + return 0; + } - if (mysql_query(&mail_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + if( 0 == Sql_NumRows(mail_handle) ) + { + clif_displaymessage(sd->fd, msg_txt(517)); // "Message not found." + Sql_FreeResult(mail_handle); return 0; - } - - mail_res = mysql_store_result(&mail_handle); - if(mail_res) { - if (mysql_num_rows(mail_res) == 0) { - mysql_free_result(mail_res); - //clif_displaymessage(sd->fd, "Message not found."); - clif_displaymessage(sd->fd, msg_txt(517)); - return 0; - } + } + + if( SQL_ERROR == Sql_NextRow(mail_handle) ) + { + Sql_ShowDebug(mail_handle); + Sql_FreeResult(mail_handle); + return 0; + } - if ((mail_row = mysql_fetch_row(mail_res))) { - if(!atoi(mail_row[2]) && atoi(mail_row[3])) { - mysql_free_result(mail_res); - //clif_displaymessage(sd->fd,"Cannot delete unread priority mail."); - clif_displaymessage(sd->fd,msg_txt(519)); + Sql_GetData(mail_handle, 0, &data, NULL); message_id = atoi(data); + Sql_GetData(mail_handle, 1, &data, NULL); read_flag = (bool)atoi(data); + Sql_GetData(mail_handle, 2, &data, NULL); priority_flag = (bool)atoi(data); + Sql_GetData(mail_handle, 3, &data, NULL); check_flag = (bool)atoi(data); - return 0; - } - if(!atoi(mail_row[4])) { - mysql_free_result(mail_res); - //clif_displaymessage(sd->fd,"You have received new mail, use @listmail before deleting."); - clif_displaymessage(sd->fd,msg_txt(520)); - return 0; - } - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `message_id` = \"%d\"", mail_db, atoi(mail_row[0])); - if(mysql_query(&mail_handle, tmp_sql) ) { - mysql_free_result(mail_res); - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - return 0; - } - //else clif_displaymessage(sd->fd,"Message deleted."); - else clif_displaymessage(sd->fd,msg_txt(521)); - } + Sql_FreeResult(mail_handle); - mysql_free_result(mail_res); + if( !read_flag && priority_flag ) + { + clif_displaymessage(sd->fd,msg_txt(519)); // "Cannot delete unread priority mail." + return 0; + } - } else { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + if( !check_flag ) + { + clif_displaymessage(sd->fd,msg_txt(520)); // "You have received new mail, use @listmail before deleting." + return 0; } + if( SQL_ERROR == Sql_Query(mail_handle, "DELETE FROM `%s` WHERE `message_id` = %d", mail_db, message_id) ) + { + Sql_ShowDebug(mail_handle); + return 0; + } + + clif_displaymessage(sd->fd,msg_txt(521)); // "Message deleted." + return 0; } -int mail_send(struct map_session_data *sd, char *name, char *message, int flag) +/// for sending normal and priority messages +int mail_send(struct map_session_data* sd, char* name, char* message, int flag) { + SqlStmt* stmt; + nullpo_retr (0, sd); - if(pc_isGM(sd) < 80 && sd->mail_counter > 0) { - //clif_displaymessage(sd->fd,"You must wait 10 minutes before sending another message"); - clif_displaymessage(sd->fd,msg_txt(522)); + if( pc_isGM(sd) < 80 && sd->mail_counter > 0 ) + { + clif_displaymessage(sd->fd,msg_txt(522)); // "You must wait 10 minutes before sending another message" + return 0; + } + + if( strcmp(name,"*") == 0 && pc_isGM(sd) < 80 ) + { + clif_displaymessage(sd->fd, msg_txt(523)); // "Access Denied." return 0; } - if(strcmp(name,"*")==0) { - if(pc_isGM(sd) < 80) { - //clif_displaymessage(sd->fd, "Access Denied."); - clif_displaymessage(sd->fd, msg_txt(523)); + if( strcmp(name,"*") == 0 ) + { + if( SQL_ERROR == Sql_Query(mail_handle, "SELECT DISTINCT `account_id` FROM `%s` WHERE `account_id` != '%d' ORDER BY `account_id`", char_db, sd->status.account_id) ) + { + Sql_ShowDebug(mail_handle); return 0; } - else - sprintf(tmp_sql,"SELECT DISTINCT `account_id` FROM `%s` WHERE `account_id` <> '%d' ORDER BY `account_id`", char_db, sd->status.account_id); } else - sprintf(tmp_sql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, jstrescape(name)); - - if (mysql_query(&mail_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - return 0; - } - - mail_res = mysql_store_result(&mail_handle); - if(mail_res) { - if (mysql_num_rows(mail_res) == 0) { - mysql_free_result(mail_res); - //clif_displaymessage(sd->fd,"Character does not exist."); - clif_displaymessage(sd->fd,msg_txt(524)); + { + char name_[2*NAME_LENGTH]; + Sql_EscapeString(mail_handle, name_, name); + if( SQL_ERROR == Sql_Query(mail_handle, "SELECT `account_id` FROM `%s` WHERE `name` = '%s'", char_db, name_) ) + { + Sql_ShowDebug(mail_handle); return 0; } + } - while ((mail_row = mysql_fetch_row(mail_res))) { - if(strcmp(name,"*")==0) { - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`from_account_id`,`from_char_name`,`message`,`priority`)" - " VALUES ('%d', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), sd->status.account_id, sd->status.name, jstrescape(message), flag); - } - else { - sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`)" - " VALUES ('%d', '%s', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), mail_row[1], sd->status.account_id, sd->status.name, jstrescape(message), flag); - if(pc_isGM(sd) < 80) - sd->mail_counter=5; - } + if( 0 == Sql_NumRows(mail_handle) ) + { + clif_displaymessage(sd->fd,msg_txt(524)); // "Character does not exist." + Sql_FreeResult(mail_handle); + return 0; + } - if(mysql_query(&mail_handle, tmp_sql) ) { - mysql_free_result(mail_res); - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - return 0; - } - } + stmt = SqlStmt_Malloc(mail_handle); + SqlStmt_Prepare(stmt, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`) VALUES (?, ?, '%d', ?, ?, '%d')", mail_db, sd->status.account_id, flag); + SqlStmt_BindParam(stmt, 1, SQLDT_STRING, name, strnlen(name, NAME_LENGTH)); + SqlStmt_BindParam(stmt, 2, SQLDT_STRING, sd->status.name, strnlen(sd->status.name, NAME_LENGTH)); + SqlStmt_BindParam(stmt, 3, SQLDT_STRING, message, strnlen(message, 80)); + + while( SQL_SUCCESS == Sql_NextRow(mail_handle) ) + { + int id; + char* data; + Sql_GetData(mail_handle, 0, &data, NULL); id = atoi(data); + SqlStmt_BindParam(stmt, 0, SQLDT_INT, &id, sizeof(id)); + if( SQL_ERROR == SqlStmt_Execute(stmt) ) + SqlStmt_ShowDebug(stmt); } + Sql_FreeResult(mail_handle); + SqlStmt_Free(stmt); - //clif_displaymessage(sd->fd,"Mail has been sent."); - clif_displaymessage(sd->fd,msg_txt(525)); + if(pc_isGM(sd) < 80) + sd->mail_counter = 5; + + clif_displaymessage(sd->fd,msg_txt(525)); // "Mail has been sent." return 0; } -static int mail_check_timer_sub(struct map_session_data *sd, va_list va) +/// invoked every MAIL_CHECK_TIME ms, decreases the send blocking counter +static int mail_check_timer_sub(struct map_session_data* sd, va_list va) { - int id = va_arg(va, int); - if(pc_isGM(sd) < 80 && sd->mail_counter > 0) + if(sd->mail_counter > 0) sd->mail_counter--; - if(sd->status.account_id==id) - clif_displaymessage(sd->fd, msg_txt(526)); //you got new email. return 0; } -int mail_check_timer(int tid,unsigned int tick,int id,int data) +/// periodically checks for new messages and notifies about them +int mail_check_timer(int tid, unsigned int tick, int id, int data) { if(mail_timer != tid) return 0; - sprintf(tmp_sql,"SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db); + mail_timer = add_timer(gettick() + MAIL_CHECK_TIME, mail_check_timer, 0, 0); - if (mysql_query(&mail_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0); + // fetch account ids of people who received new mail since the last iteration + if( SQL_ERROR == Sql_Query(mail_handle, "SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db) ) + { + Sql_ShowDebug(mail_handle); return 0; - } + } - mail_res = mysql_store_result(&mail_handle); + while( SQL_SUCCESS == Sql_NextRow(mail_handle) ) + { + char* id; + struct map_session_data* sd; + Sql_GetData(mail_handle, 0, &id, NULL); + if( (sd = map_id2sd(atoi(id))) != NULL ) + clif_displaymessage(sd->fd, msg_txt(526)); // "You have new mail." + } - if (mail_res) { - if (mysql_num_rows(mail_res) == 0) { - mysql_free_result(mail_res); - mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0); - return 0; - } + Sql_FreeResult(mail_handle); - while ((mail_row = mysql_fetch_row(mail_res))) - clif_foreachclient(mail_check_timer_sub, atoi(mail_row[0])); - } + // decrease the send-blocking counter + clif_foreachclient(mail_check_timer_sub); - sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `check_flag`= '0' ", mail_db); - if(mysql_query(&mail_handle, tmp_sql) ) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + // The 'check_flag' indicates whether the player was informed about the message. + // All online players were notified by the above code, and offline players will get the notice at next login. + // Therefore it is safe to simply set the flag to '1' for all existing mails. + if( SQL_ERROR == Sql_Query(mail_handle, "UPDATE `%s` SET `check_flag` = 1 WHERE `check_flag` = 0", mail_db) ) + Sql_ShowDebug(mail_handle); - mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0); return 0; } int do_init_mail(void) { - add_timer_func_list(mail_check_timer,"mail_check_timer"); - mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0); + add_timer_func_list(mail_check_timer, "mail_check_timer"); + mail_timer = add_timer(gettick() + MAIL_CHECK_TIME, mail_check_timer, 0, 0); + return 0; } diff --git a/src/map/mail.h b/src/map/mail.h index fca124ae4..f753d827b 100644 --- a/src/map/mail.h +++ b/src/map/mail.h @@ -5,8 +5,8 @@ #define _MAIL_H_ int mail_check(struct map_session_data *sd, int type); -int mail_read(struct map_session_data *sd, int message_id); -int mail_delete(struct map_session_data *sd, int message_id); +int mail_read(struct map_session_data *sd, int index); +int mail_delete(struct map_session_data *sd, int index); int mail_send(struct map_session_data *sd, char *name, char *message, int flag); int do_init_mail(void); diff --git a/src/map/map.c b/src/map/map.c index 7c1ba6c4c..2476e0e0e 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -11,6 +11,7 @@ #include "../common/version.h" #include "../common/nullpo.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "map.h" #include "chrif.h" @@ -34,11 +35,8 @@ #include "mercenary.h" //[orn] #include "atcommand.h" #include "charcommand.h" - #include "log.h" - #include "irc.h" - #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -50,10 +48,20 @@ #endif #ifndef TXT_ONLY - #include "mail.h" +#endif -char tmp_sql[65535]=""; +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <math.h> +#ifndef _WIN32 +#include <unistd.h> +#endif + + +#ifndef TXT_ONLY char default_codepage[32] = ""; int map_server_port = 3306; @@ -61,9 +69,7 @@ char map_server_ip[32] = "127.0.0.1"; char map_server_id[32] = "ragnarok"; char map_server_pw[32] = "ragnarok"; char map_server_db[32] = "ragnarok"; -MYSQL mmysql_handle; -MYSQL_RES* sql_res; -MYSQL_ROW sql_row; +Sql* mmysql_handle; int db_use_sqldbs = 0; char item_db_db[32] = "item_db"; @@ -79,9 +85,7 @@ int log_db_port = 3306; char log_db_id[32] = "ragnarok"; char log_db_pw[32] = "ragnarok"; char log_db[32] = "log"; -MYSQL logmysql_handle; -MYSQL_RES* logsql_res; -MYSQL_ROW logsql_row; +Sql* logmysql_handle; // mail system int mail_server_enable = 0; @@ -91,9 +95,7 @@ char mail_server_id[32] = "ragnarok"; char mail_server_pw[32] = "ragnarok"; char mail_server_db[32] = "ragnarok"; char mail_db[32] = "mail"; -MYSQL mail_handle; -MYSQL_RES* mail_res; -MYSQL_ROW mail_row; +Sql* mail_handle; #endif /* not TXT_ONLY */ @@ -1096,7 +1098,7 @@ int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y if (length) { //Adjust final position to fit in the given area. //TODO: Find an alternate method which does not requires a square root calculation. - k = sqrt(magnitude2); + k = (int)sqrt(magnitude2); mx1 = x0 + (x1 - x0)*length/k; my1 = y0 + (y1 - y0)*length/k; len_limit = MAGNITUDE2(x0,y0, mx1,my1); @@ -2951,43 +2953,30 @@ int inter_config_read(char *cfgName) *---------------------------------------*/ int map_sql_init(void) { - mysql_init(&mmysql_handle); + // main db connection + mmysql_handle = Sql_Malloc(); - //DB connection start ShowInfo("Connecting to the Map DB Server....\n"); - if(!mysql_real_connect(&mmysql_handle, map_server_ip, map_server_id, map_server_pw, - map_server_db ,map_server_port, (char *)NULL, 0)) { - //pointer check - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - exit(1); - } - else { - ShowStatus("connect success! (Map Server Connection)\n"); - } + if( SQL_ERROR == Sql_Connect(mmysql_handle, map_server_id, map_server_pw, map_server_ip, map_server_port, map_server_db) ) + exit(1); + ShowStatus("connect success! (Map Server Connection)\n"); - if(mail_server_enable) { // mail system [Valaris] - mysql_init(&mail_handle); - ShowInfo("Connecting to the Mail DB Server....\n"); - if(!mysql_real_connect(&mail_handle, mail_server_ip, mail_server_id, mail_server_pw, - mail_server_db ,mail_server_port, (char *)NULL, 0)) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - exit(1); - } - if( strlen(default_codepage) > 0 ) { - sprintf( tmp_sql, "SET NAMES %s", default_codepage ); - if (mysql_query(&mail_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&mail_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } - } - } + if( strlen(default_codepage) > 0 ) + if ( SQL_ERROR == Sql_SetEncoding(mmysql_handle, default_codepage) ) + Sql_ShowDebug(mmysql_handle); - if( strlen(default_codepage) > 0 ) { - sprintf( tmp_sql, "SET NAMES %s", default_codepage ); - if (mysql_query(&mmysql_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + if(mail_server_enable) + { + // mail system + mail_handle = Sql_Malloc(); + + ShowInfo("Connecting to the Mail DB Server....\n"); + if( SQL_ERROR == Sql_Connect(mail_handle, mail_server_id, mail_server_pw, mail_server_ip, mail_server_port, mail_server_db) ) + exit(1); + + if( strlen(default_codepage) > 0 ) + if ( SQL_ERROR == Sql_SetEncoding(mail_handle, default_codepage) ) + Sql_ShowDebug(mail_handle); } return 0; @@ -2995,13 +2984,15 @@ int map_sql_init(void) int map_sql_close(void) { - mysql_close(&mmysql_handle); ShowStatus("Close Map DB Connection....\n"); + Sql_Free(mmysql_handle); + mmysql_handle = NULL; if (log_config.sql_logs) { - mysql_close(&logmysql_handle); ShowStatus("Close Log DB Connection....\n"); + Sql_Free(logmysql_handle); + logmysql_handle = NULL; } return 0; @@ -3009,25 +3000,18 @@ int map_sql_close(void) int log_sql_init(void) { - mysql_init(&logmysql_handle); + // log db connection + logmysql_handle = Sql_Malloc(); - //DB connection start ShowInfo(""CL_WHITE"[SQL]"CL_RESET": Connecting to the Log Database "CL_WHITE"%s"CL_RESET" At "CL_WHITE"%s"CL_RESET"...\n",log_db,log_db_ip); - if(!mysql_real_connect(&logmysql_handle, log_db_ip, log_db_id, log_db_pw, - log_db ,log_db_port, (char *)NULL, 0)) { - //pointer check - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - exit(1); - } - + if ( SQL_ERROR == Sql_Connect(logmysql_handle, log_db_id, log_db_pw, log_db_ip, log_db_port, log_db) ) + exit(1); ShowStatus(""CL_WHITE"[SQL]"CL_RESET": Successfully '"CL_GREEN"connected"CL_RESET"' to Database '"CL_WHITE"%s"CL_RESET"'.\n", log_db); - if( strlen(default_codepage) > 0 ) { - sprintf( tmp_sql, "SET NAMES %s", default_codepage ); - if (mysql_query(&logmysql_handle, tmp_sql)) { - ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } - } + + if( strlen(default_codepage) > 0 ) + if ( SQL_ERROR == Sql_SetEncoding(logmysql_handle, default_codepage) ) + Sql_ShowDebug(logmysql_handle); + return 0; } @@ -3037,31 +3021,25 @@ int log_sql_init(void) int map_sql_ping(int tid, unsigned int tick, int id, int data) { ShowInfo("Pinging SQL server to keep connection alive...\n"); - mysql_ping(&mmysql_handle); + Sql_Ping(mmysql_handle); if (log_config.sql_logs) - mysql_ping(&logmysql_handle); + Sql_Ping(logmysql_handle); if(mail_server_enable) - mysql_ping(&mail_handle); + Sql_Ping(mail_handle); return 0; } int sql_ping_init(void) { - int connection_timeout, connection_ping_interval; + uint32 connection_timeout, connection_ping_interval; - // set a default value first + // set a default value connection_timeout = 28800; // 8 hours // ask the mysql server for the timeout value - if (!mysql_query(&mmysql_handle, "SHOW VARIABLES LIKE 'wait_timeout'") - && (sql_res = mysql_store_result(&mmysql_handle)) != NULL) { - sql_row = mysql_fetch_row(sql_res); - if (sql_row) - connection_timeout = atoi(sql_row[1]); - if (connection_timeout < 60) - connection_timeout = 60; - mysql_free_result(sql_res); - } + Sql_GetTimeout(mmysql_handle, &connection_timeout); + if (connection_timeout < 60) + connection_timeout = 60; // establish keepalive connection_ping_interval = connection_timeout - 30; // 30-second reserve diff --git a/src/map/map.h b/src/map/map.h index 15a0ece81..cd28f0f14 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -795,7 +795,7 @@ struct map_session_data { char fakename[NAME_LENGTH]; // fake names [Valaris] #ifndef TXT_ONLY - int mail_counter; // mail counter for mail system [Valaris] + int mail_counter; // mail counter for mail system (antiflood protection) #endif int duel_group; // duel vars [LuzZza] @@ -1396,37 +1396,6 @@ extern char *MSG_CONF_NAME; extern char *map_server_dns; -#ifndef TXT_ONLY - -#ifdef WIN32 -#include <winsock2.h> -#endif -#include <mysql.h> - -extern char tmp_sql[65535]; - -extern int db_use_sqldbs; -extern MYSQL mmysql_handle; -extern MYSQL_RES* sql_res ; -extern MYSQL_ROW sql_row ; - -extern MYSQL logmysql_handle; -extern MYSQL_RES* logsql_res ; -extern MYSQL_ROW logsql_row ; - -extern int mail_server_enable; -extern MYSQL mail_handle; -extern MYSQL_RES* mail_res ; -extern MYSQL_ROW mail_row ; - -extern char item_db_db[32]; -extern char item_db2_db[32]; -extern char mob_db_db[32]; -extern char mob_db2_db[32]; -extern char char_db[32]; -extern char mail_db[32]; - -#endif /* not TXT_ONLY */ //Useful typedefs from jA [Skotlex] typedef struct map_session_data TBL_PC; typedef struct npc_data TBL_NPC; @@ -1444,4 +1413,24 @@ typedef struct homun_data TBL_HOM; extern int lowest_gm_level; extern char main_chat_nick[16]; +#ifndef TXT_ONLY + +#include "../common/sql.h" + +extern int db_use_sqldbs; +extern int mail_server_enable; + +extern Sql* mmysql_handle; +extern Sql* logmysql_handle; +extern Sql* mail_handle; + +extern char item_db_db[32]; +extern char item_db2_db[32]; +extern char mob_db_db[32]; +extern char mob_db2_db[32]; +extern char char_db[32]; +extern char mail_db[32]; + +#endif /* not TXT_ONLY */ + #endif /* _MAP_H_ */ diff --git a/src/map/mob.c b/src/map/mob.c index 86d60a152..b5c83413c 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -9,6 +9,7 @@ #include "../common/showmsg.h" #include "../common/ers.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "map.h" #include "clif.h" @@ -3210,7 +3211,10 @@ static unsigned int mob_drop_adjust(int rate, int rate_adjust, unsigned short ra return cap_value(rate,rate_min,rate_max); } -int mob_parse_dbrow(char** str) +/*========================================== + * processes one mobdb entry + *------------------------------------------*/ +static bool mob_parse_dbrow(char** str) { struct mob_db *db; struct status_data *status; @@ -3220,15 +3224,15 @@ int mob_parse_dbrow(char** str) class_ = str[0] ? atoi(str[0]) : 0; if (class_ == 0) - return 0; //Leave blank lines alone... [Skotlex] + return false; //Leave blank lines alone... [Skotlex] if (class_ <= 1000 || class_ > MAX_MOB_DB) { ShowWarning("Mob with ID: %d not loaded. ID must be in range [%d-%d]\n", class_, 1000, MAX_MOB_DB); - return 0; + return false; } if (pcdb_checkid(class_)) { ShowWarning("Mob with ID: %d not loaded. That ID is reserved for player classes.\n"); - return 0; + return false; } if (mob_db_data[class_] == NULL) @@ -3432,7 +3436,7 @@ int mob_parse_dbrow(char** str) } } - return 1; + return true; } /*========================================== @@ -3440,83 +3444,113 @@ int mob_parse_dbrow(char** str) *------------------------------------------*/ static int mob_readdb(void) { - FILE *fp; - char line[1024]; - char *filename[]={ "mob_db.txt","mob_db2.txt" }; - int i, fi; - unsigned int ln = 0; + char* filename[] = { "mob_db.txt", "mob_db2.txt" }; + int fi; - for(fi = 0; fi < 2; fi++) { - sprintf(line, "%s/%s", db_path, filename[fi]); - fp = fopen(line, "r"); + for(fi = 0; fi < 2; fi++) + { + uint32 lines = 0, count = 0; + char line[1024]; + char path[256]; + FILE* fp; + + sprintf(path, "%s/%s", db_path, filename[fi]); + fp = fopen(path, "r"); if(fp == NULL) { if(fi > 0) continue; return -1; } + // process rows one by one while(fgets(line, sizeof(line), fp)) { char *str[38+2*MAX_MOB_DROP], *p, *np; + int i; + lines++; if(line[0] == '/' && line[1] == '/') continue; - for(i = 0, p = line; i < 38 + 2*MAX_MOB_DROP; i++) { + for(i = 0, p = line; i < 38 + 2*MAX_MOB_DROP; i++) + { + str[i] = p; if((np = strchr(p, ',')) != NULL) { - str[i] = p; *np = 0; p = np + 1; - } else - str[i] = p; + *np = '\0'; p = np + 1; + } } if(i < 38 + 2*MAX_MOB_DROP) { - ShowWarning("mob_readdb: Insufficient columns for mob with ID: %d\n", str[0] ? atoi(str[0]) : 0); + ShowWarning("mob_readdb: Insufficient columns for mob with id: %d, skipping.\n", atoi(str[0])); continue; } if (!mob_parse_dbrow(str)) continue; - ln++; // counts the number of correctly parsed entries + count++; } + fclose(fp); - ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, filename[fi]); - ln = 0; + + ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filename[fi]); } + return 0; } #ifndef TXT_ONLY /*========================================== - * SQL reading + * mob_db table reading *------------------------------------------*/ static int mob_read_sqldb(void) { - char *mob_db_name[] = { mob_db_db, mob_db2_db }; + char* mob_db_name[] = { mob_db_db, mob_db2_db }; int fi; - unsigned int ln = 0; - for (fi = 0; fi < 2; fi++) { - sprintf (tmp_sql, "SELECT * FROM `%s`", mob_db_name[fi]); - if (mysql_query(&mmysql_handle, tmp_sql)) { - ShowSQL("DB error (%s) - %s\n", mob_db_name[fi], mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + for (fi = 0; fi < 2; fi++) + { + uint32 lines = 0, count = 0; + + // retrieve all rows from the mob database + if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT * FROM `%s`", mob_db_name[fi]) ) + { + Sql_ShowDebug(mmysql_handle); continue; } - sql_res = mysql_store_result(&mmysql_handle); - if (sql_res) { - while((sql_row = mysql_fetch_row(sql_res))){ - - if (!mob_parse_dbrow(sql_row)) - continue; + + // process rows one by one + while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) ) + { + // wrap the result into a TXT-compatible format + char line[1024]; + char* str[38+2*MAX_MOB_DROP]; + char* p; + int i; + + lines++; + for(i = 0, p = line; i < 38 + 2*MAX_MOB_DROP; i++) + { + char* data; + size_t len; + Sql_GetData(mmysql_handle, i, &data, &len); - ln++; // counts the number of correctly parsed entries + strcpy(p, data); + str[i] = p; + p+= len + 1; } - mysql_free_result(sql_res); - ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, mob_db_name[fi]); - ln = 0; + if (!mob_parse_dbrow(str)) + continue; + + count++; } + + // free the query result + Sql_FreeResult(mmysql_handle); + + ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, mob_db_name[fi]); + count = 0; } return 0; } diff --git a/src/map/npc.c b/src/map/npc.c index 4adf4b946..b469878eb 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -6,6 +6,7 @@ #include "../common/nullpo.h" #include "../common/malloc.h" #include "../common/showmsg.h" +#include "../common/utils.h" #include "../common/ers.h" #include "../common/db.h" #include "map.h" diff --git a/src/map/party.c b/src/map/party.c index e4b960342..284f00a77 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -7,6 +7,7 @@ #include "../common/nullpo.h" #include "../common/malloc.h" #include "../common/showmsg.h" +#include "../common/utils.h" #include "party.h" #include "atcommand.h" //msg_txt() diff --git a/src/map/pc.c b/src/map/pc.c index 3dd2289c3..d6a41db37 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -8,6 +8,7 @@ #include "../common/showmsg.h" #include "../common/socket.h" // RFIFO*() #include "../common/timer.h" +#include "../common/utils.h" #include "atcommand.h" // get_atcommand_level() #include "battle.h" // battle_config @@ -742,7 +743,7 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t #ifndef TXT_ONLY if(mail_server_enable) - mail_check(sd,1); // check mail at login [Valaris] + mail_check(sd,0); // check mail at login [Valaris] #endif // message of the limited time of the account diff --git a/src/map/pet.c b/src/map/pet.c index b593cbdff..9bebf27bc 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -6,6 +6,7 @@ #include "../common/nullpo.h" #include "../common/malloc.h" #include "../common/showmsg.h" +#include "../common/utils.h" #include "../common/ers.h" #include "pc.h" diff --git a/src/map/script.c b/src/map/script.c index d423d433e..0a5b5fbc0 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -226,13 +226,10 @@ int potion_hp=0, potion_per_hp=0, potion_sp=0, potion_per_sp=0; int potion_target=0; #if !defined(TXT_ONLY) && defined(MAPREGSQL) -// [zBuffer] SQL Mapreg Saving/Loading Database Declaration char mapregsql_db[32] = "mapreg"; char mapregsql_db_varname[32] = "varname"; char mapregsql_db_index[32] = "index"; char mapregsql_db_value[32] = "value"; -char tmp_sql[65535]; -// -------------------------------------------------------- #endif int get_com(unsigned char *script,int *pos); @@ -3222,85 +3219,76 @@ void run_script_main(struct script_state *st) /*========================================== * マップ変数の変更 *------------------------------------------*/ -int mapreg_setreg(int num,int val) +int mapreg_setreg(int num, int val) { #if !defined(TXT_ONLY) && defined(MAPREGSQL) - int i=num>>24; - char *name=str_buf+str_data[num&0x00ffffff].str; - char tmp_str[64]; -#endif + int i = num >> 24; + char* name = str_buf + str_data[num&0x00ffffff].str; - if(val!=0) { + if( val != 0 ) { if(idb_put(mapreg_db,num,(void*)val)) ; -#if !defined(TXT_ONLY) && defined(MAPREGSQL) else if(name[1] != '@') { - sprintf(tmp_sql,"INSERT INTO `%s`(`%s`,`%s`,`%s`) VALUES ('%s','%d','%d')",mapregsql_db,mapregsql_db_varname,mapregsql_db_index,mapregsql_db_value,jstrescapecpy(tmp_str,name),i,val); - if(mysql_query(&mmysql_handle,tmp_sql)){ - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + char tmp_str[32*2+1]; + Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32)); + if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`%s`,`%s`,`%s`) VALUES ('%s','%d','%d')", mapregsql_db, mapregsql_db_varname, mapregsql_db_index, mapregsql_db_value, tmp_str, i, val) ) + Sql_ShowDebug(mmysql_handle); } -#endif - } else { // [zBuffer] -#if !defined(TXT_ONLY) && defined(MAPREGSQL) + } else { // val == 0 if(name[1] != '@') { // Remove from database because it is unused. - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `%s`='%s' AND `%s`='%d'",mapregsql_db,mapregsql_db_varname,name,mapregsql_db_index,i); - if(mysql_query(&mmysql_handle,tmp_sql)){ - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `%s`='%s' AND `%s`='%d'", mapregsql_db, mapregsql_db_varname, name, mapregsql_db_index, i) ) + Sql_ShowDebug(mmysql_handle); } -#endif idb_remove(mapreg_db,num); } +#else + if(val != 0) + idb_put(mapreg_db,num,(void*)val); + else + idb_remove(mapreg_db,num); +#endif - mapreg_dirty=1; + mapreg_dirty = 1; return 1; } /*========================================== * 文字列型マップ変数の変更 *------------------------------------------*/ -int mapreg_setregstr(int num,const char *str) +int mapreg_setregstr(int num, const char* str) { - char *p; -#if !defined(TXT_ONLY) && defined(MAPREGSQL) - char tmp_str[64]; - char tmp_str2[512]; - int i=num>>24; // [zBuffer] - char *name=str_buf+str_data[num&0x00ffffff].str; -#endif - - if( str==NULL || *str==0 ){ #if !defined(TXT_ONLY) && defined(MAPREGSQL) + int i = num >> 24; + char* name = str_buf + str_data[num&0x00ffffff].str; + + if( str==NULL || *str==0 ) { if(name[1] != '@') { - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `%s`='%s' AND `%s`='%d'",mapregsql_db,mapregsql_db_varname,name,mapregsql_db_index,i); - if(mysql_query(&mmysql_handle,tmp_sql)){ - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `%s`='%s' AND `%s`='%d'", mapregsql_db, mapregsql_db_varname, name, mapregsql_db_index, i) ) + Sql_ShowDebug(mmysql_handle); } -#endif idb_remove(mapregstr_db,num); - mapreg_dirty=1; + mapreg_dirty = 1; return 1; } - p=(char *)aMallocA((strlen(str)+1)*sizeof(char)); - strcpy(p,str); - if (idb_put(mapregstr_db,num,p)) + if (idb_put(mapregstr_db,num, aStrdup(str))) ; -#if !defined(TXT_ONLY) && defined(MAPREGSQL) - else if(name[1] != '@'){ //put returned null, so we must insert. + else if(name[1] != '@') { //put returned null, so we must insert. // Someone is causing a database size infinite increase here without name[1] != '@' [Lance] - sprintf(tmp_sql,"INSERT INTO `%s`(`%s`,`%s`,`%s`) VALUES ('%s','%d','%s')",mapregsql_db,mapregsql_db_varname,mapregsql_db_index,mapregsql_db_value,jstrescapecpy(tmp_str,name),i,jstrescapecpy(tmp_str2,p)); - if(mysql_query(&mmysql_handle,tmp_sql)){ - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + char tmp_str[32*2+1]; + char tmp_str2[255*2+1]; + Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32)); + Sql_EscapeStringLen(mmysql_handle, tmp_str2, str, strnlen(str, 255)); + if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`%s`,`%s`,`%s`) VALUES ('%s','%d','%s')", mapregsql_db, mapregsql_db_varname, mapregsql_db_index, mapregsql_db_value, tmp_str, i, tmp_str2) ) + Sql_ShowDebug(mmysql_handle); } +#else + if( str==NULL || *str==0 ) + idb_remove(mapregstr_db,num); + else + idb_put(mapregstr_db,num,aStrdup(str)); #endif - mapreg_dirty=1; + + mapreg_dirty = 1; return 1; } @@ -3310,83 +3298,87 @@ int mapreg_setregstr(int num,const char *str) static int script_load_mapreg(void) { #if defined(TXT_ONLY) || !defined(MAPREGSQL) - FILE *fp; + FILE* fp; char line[1024]; - if( (fp=fopen(mapreg_txt,"rt"))==NULL ) + if( (fp=fopen(mapreg_txt,"rt")) == NULL ) return -1; while(fgets(line,sizeof(line),fp)) { - char buf1[256],buf2[1024],*p; + char buf1[256],buf2[1024]; + char* p; int n,v,s,i; if( sscanf(line,"%255[^,],%d\t%n",buf1,&i,&n)!=2 && (i=0,sscanf(line,"%[^\t]\t%n",buf1,&n)!=1) ) continue; - if( buf1[strlen(buf1)-1]=='$' ){ - if( sscanf(line+n,"%[^\n\r]",buf2)!=1 ){ - ShowError("%s: %s broken data !\n",mapreg_txt,buf1); + if( buf1[strlen(buf1)-1] == '$' ) { + if( sscanf(line + n, "%[^\n\r]", buf2) != 1 ) { + ShowError("%s: %s broken data !\n", mapreg_txt, buf1); continue; } - p=(char *)aMallocA((strlen(buf2) + 1)*sizeof(char)); - strcpy(p,buf2); - s= add_str(buf1); - idb_put(mapregstr_db,(i<<24)|s,p); - }else{ - if( sscanf(line+n,"%d",&v)!=1 ){ - ShowError("%s: %s broken data !\n",mapreg_txt,buf1); + p = aStrdup(buf2); + s = add_str(buf1); + idb_put(mapregstr_db, (i<<24)|s, p); + } else { + if( sscanf(line + n, "%d", &v) != 1 ) { + ShowError("%s: %s broken data !\n", mapreg_txt, buf1); continue; } - s= add_str(buf1); - idb_put(mapreg_db,(i<<24)|s,(void*)v); + s = add_str(buf1); + idb_put(mapreg_db, (i<<24)|s, (void*)v); } } fclose(fp); - mapreg_dirty=0; + + mapreg_dirty = 0; return 0; #else - // SQL mapreg code start [zBuffer] /* - 0 1 2 - +-------------------------+ - | varname | index | value | - +-------------------------+ - */ - unsigned int perfomance = (unsigned int)time(NULL); - sprintf(tmp_sql,"SELECT * FROM `%s`",mapregsql_db); - ShowInfo("Querying script_load_mapreg ...\n"); - if(mysql_query(&mmysql_handle, tmp_sql) ) { - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); + 0 1 2 + +-------------------------+ + | varname | index | value | + +-------------------------+ + */ + + SqlStmt* stmt = SqlStmt_Malloc(mmysql_handle); + char varname[32+1]; + int index; + char value[255+1]; + uint32 length; + + if ( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `%s`, `%s`, `%s` FROM `%s`", mapregsql_db_varname, mapregsql_db_index, mapregsql_db_value, mapregsql_db) + || SQL_ERROR == SqlStmt_Execute(stmt) + ) { + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); return -1; } - ShowInfo("Success! Returning results ...\n"); - sql_res = mysql_store_result(&mmysql_handle); - if (sql_res) { - while ((sql_row = mysql_fetch_row(sql_res))) { - char buf1[33], *p = NULL; - int i,v,s; - strcpy(buf1,sql_row[0]); - if( buf1[strlen(buf1)-1]=='$' ){ - i = atoi(sql_row[1]); - p=(char *)aMallocA((strlen(sql_row[2]) + 1)*sizeof(char)); - strcpy(p,sql_row[2]); - s= add_str(buf1); - idb_put(mapregstr_db,(i<<24)|s,p); - }else{ - s= add_str(buf1); - v= atoi(sql_row[2]); - i = atoi(sql_row[1]); - idb_put(mapreg_db,(i<<24)|s,(void *)v); - } - } + + SqlStmt_BindColumn(stmt, 0, SQLDT_STRING, &varname[0], 32, &length, NULL); + SqlStmt_BindColumn(stmt, 1, SQLDT_INT, &index, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 2, SQLDT_STRING, &value[0], 255, NULL, NULL); + + while ( SQL_SUCCESS == SqlStmt_NextRow(stmt) ) + { + if( varname[length-1] == '$' ) { + int s = add_str(varname); + int i = index; + char* p = aStrdup(value); + idb_put(mapregstr_db, (i<<24)|s, p); + } else { + int s = add_str(varname); + int i = index; + int v = atoi(value); + idb_put(mapreg_db, (i<<24)|s, (void *)v); + } } - ShowInfo("Freeing results...\n"); - mysql_free_result(sql_res); - mapreg_dirty=0; - perfomance = (((unsigned int)time(NULL)) - perfomance); - ShowInfo("SQL Mapreg Loading Completed Under %d Seconds.\n",perfomance); + + SqlStmt_Free(stmt); + + mapreg_dirty = 0; return 0; + #endif /* TXT_ONLY */ } /*========================================== @@ -3394,56 +3386,50 @@ static int script_load_mapreg(void) *------------------------------------------*/ static int script_save_mapreg_intsub(DBKey key,void *data,va_list ap) { -#if defined(TXT_ONLY) || !defined(MAPREGSQL) - FILE *fp=va_arg(ap,FILE*); int num=key.i&0x00ffffff, i=key.i>>24; char *name=str_buf+str_data[num].str; - if( name[1]!='@' ){ + +#if defined(TXT_ONLY) || !defined(MAPREGSQL) + FILE *fp=va_arg(ap,FILE*); + if( name[1]!='@' ) { if(i==0) fprintf(fp,"%s\t%d\n", name, (int)data); else fprintf(fp,"%s,%d\t%d\n", name, i, (int)data); } - return 0; #else - int num=key.i&0x00ffffff, i=key.i>>24; // [zBuffer] - char *name=str_buf+str_data[num].str; if ( name[1] != '@') { - sprintf(tmp_sql,"UPDATE `%s` SET `%s`='%d' WHERE `%s`='%s' AND `%s`='%d'",mapregsql_db,mapregsql_db_value,(int)data,mapregsql_db_varname,name,mapregsql_db_index,i); - if(mysql_query(&mmysql_handle, tmp_sql) ) { - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `%s`='%d' WHERE `%s`='%s' AND `%s`='%d'", mapregsql_db, mapregsql_db_value, (int)data, mapregsql_db_varname, name, mapregsql_db_index, i) ) + Sql_ShowDebug(mmysql_handle); } - return 0; #endif + + return 0; } + static int script_save_mapreg_strsub(DBKey key,void *data,va_list ap) { -#if defined(TXT_ONLY) || !defined(MAPREGSQL) - FILE *fp=va_arg(ap,FILE*); int num=key.i&0x00ffffff, i=key.i>>24; char *name=str_buf+str_data[num].str; - if( name[1]!='@' ){ + +#if defined(TXT_ONLY) || !defined(MAPREGSQL) + FILE *fp=va_arg(ap,FILE*); + if( name[1]!='@' ) { if(i==0) fprintf(fp,"%s\t%s\n", name, (char *)data); else fprintf(fp,"%s,%d\t%s\n", name, i, (char *)data); } - return 0; #else - char tmp_str2[512]; - int num=key.i&0x00ffffff, i=key.i>>24; - char *name=str_buf+str_data[num].str; if ( name[1] != '@') { - sprintf(tmp_sql,"UPDATE `%s` SET `%s`='%s' WHERE `%s`='%s' AND `%s`='%d'",mapregsql_db,mapregsql_db_value,jstrescapecpy(tmp_str2,(char *)data),mapregsql_db_varname,name,mapregsql_db_index,i); - if(mysql_query(&mmysql_handle, tmp_sql) ) { - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - } + char tmp_str2[2*255+1]; + Sql_EscapeStringLen(mmysql_handle, tmp_str2, (char*)data, strnlen((char*)data, 255)); + if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `%s`='%s' WHERE `%s`='%s' AND `%s`='%d'", mapregsql_db, mapregsql_db_value, tmp_str2, mapregsql_db_varname, name, mapregsql_db_index, i) ) + Sql_ShowDebug(mmysql_handle); } - return 0; #endif + + return 0; } static int script_save_mapreg(void) { @@ -3459,12 +3445,8 @@ static int script_save_mapreg(void) mapregstr_db->foreach(mapregstr_db,script_save_mapreg_strsub,fp); lock_fclose(fp,mapreg_txt,&lock); #else - unsigned int perfomance = (unsigned int)time(NULL); - mapreg_db->foreach(mapreg_db,script_save_mapreg_intsub); // [zBuffer] + mapreg_db->foreach(mapreg_db,script_save_mapreg_intsub); mapregstr_db->foreach(mapregstr_db,script_save_mapreg_strsub); - perfomance = ((unsigned int)time(NULL) - perfomance); - if(perfomance > 2) - ShowWarning("Slow Query: MapregSQL Saving @ %d second(s).\n", perfomance); #endif mapreg_dirty=0; return 0; @@ -3688,9 +3670,8 @@ int do_init_script() script_load_mapreg(); - add_timer_func_list(script_autosave_mapreg,"script_autosave_mapreg"); - add_timer_interval(gettick()+MAPREG_AUTOSAVE_INTERVAL, - script_autosave_mapreg,0,0,MAPREG_AUTOSAVE_INTERVAL); + add_timer_func_list(script_autosave_mapreg, "script_autosave_mapreg"); + add_timer_interval(gettick() + MAPREG_AUTOSAVE_INTERVAL, script_autosave_mapreg, 0, 0, MAPREG_AUTOSAVE_INTERVAL); return 0; } @@ -12098,6 +12079,7 @@ BUILDIN_FUNC(checkcell) // <--- [zBuffer] List of mathematics commands // [zBuffer] List of dynamic var commands ---> +//FIXME: some other functions are using this private function void setd_sub(struct script_state *st, TBL_PC *sd, char *varname, int elem, void *value, struct linkdb_node **ref) { set_reg(st, sd, add_str(varname)+(elem<<24), varname, value, ref); @@ -12131,80 +12113,78 @@ BUILDIN_FUNC(setd) BUILDIN_FUNC(query_sql) { #ifndef TXT_ONLY - char *name = NULL; - const char *query; - int num, i = 0,j, nb_rows; - struct { char * dst_var_name; char type; } row[32]; - TBL_PC *sd = (st->rid)? script_rid2sd(st) : NULL; + int i, j, nb_rows; + struct { char* dst_var_name; char type; } row[32]; + TBL_PC* sd = (st->rid) ? script_rid2sd(st) : NULL; - query = script_getstr(st,2); - strcpy(tmp_sql, query); - if(mysql_query(&mmysql_handle,tmp_sql)){ - ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); - script_pushint(st,0); + const char* query = script_getstr(st,2); + if (SQL_ERROR == Sql_Query(mmysql_handle, query) ) + { + Sql_ShowDebug(mmysql_handle); + script_pushint(st, 0); return 1; } - // If some data was returned - if((sql_res = mysql_store_result(&mmysql_handle))){ - // Count the number of rows to store - nb_rows = mysql_num_fields(sql_res); + // Count the number of rows to store + nb_rows = Sql_NumColumns(mmysql_handle); + //FIXME: what sick mind would write something like this? - // Can't store more row than variable - if (nb_rows > st->end - (st->start+3)) - nb_rows = st->end - (st->start+3); + // Can't store more row than variable + if (nb_rows > st->end - (st->start+3)) + nb_rows = st->end - (st->start+3); - if (!nb_rows) - { - script_pushint(st,0); - return 0; // Nothing to store - } + if (!nb_rows) + { + script_pushint(st,0); + return 0; // Nothing to store + } - if (nb_rows > 32) - { - ShowWarning("buildin_query_sql: too many rows!\n"); - script_pushint(st,0); - return 1; - } + if (nb_rows > 32) + { + ShowWarning("buildin_query_sql: too many rows!\n"); + script_pushint(st,0); + return 1; + } - memset(row, 0, sizeof(row)); - // Verify argument types - for(j=0; j < nb_rows; j++) - { - if(!data_isreference(script_getdata(st, 3+j))){ - ShowWarning("buildin_query_sql: Parameter %d is not a variable!\n", j); - script_pushint(st,0); - return 0; - } else { - // Store type of variable (string = 0/int = 1) - num=st->stack->stack_data[st->start+3+j].u.num; - name=(char *)(str_buf+str_data[num&0x00ffffff].str); - if(name[strlen(name)-1] != '$') { - row[j].type = 1; - } - row[j].dst_var_name = name; + memset(row, 0, sizeof(row)); + // Verify argument types + for(j=0; j < nb_rows; j++) + { + if(!data_isreference(script_getdata(st, 3+j))){ + ShowWarning("buildin_query_sql: Parameter %d is not a variable!\n", j); + script_pushint(st,0); + return 0; + } else { + // Store type of variable (string = 0/int = 1) + int num = st->stack->stack_data[st->start+3+j].u.num; + char* name = str_buf + str_data[num&0x00ffffff].str; + if(name[strlen(name)-1] != '$') { + row[j].type = 1; } + row[j].dst_var_name = name; } - // Store data - while(i<128 && (sql_row = mysql_fetch_row(sql_res))){ - for(j=0; j < nb_rows; j++) - { - if (row[j].type == 1) - setd_sub(st,sd, row[j].dst_var_name, i, (void *)atoi(sql_row[j]),script_getref(st,3+j)); - else - setd_sub(st,sd, row[j].dst_var_name, i, (void *)sql_row[j],script_getref(st,3+j)); - } - i++; + } + // Store data + for (i = 0; i < 128 && SQL_SUCCESS == Sql_NextRow(mmysql_handle); i++) + { + char* data; + Sql_GetData(mmysql_handle, j, &data, NULL); + for(j = 0; j < nb_rows; j++) { + if (row[j].type == 1) + setd_sub(st,sd, row[j].dst_var_name, i, (void *)atoi(data), script_getref(st,3+j)); + else + setd_sub(st,sd, row[j].dst_var_name, i, (void *)data, script_getref(st,3+j)); } - // Free data - mysql_free_result(sql_res); } + // Free data + Sql_FreeResult(mmysql_handle); + script_pushint(st,i); #else //for TXT version, we always return -1 script_pushint(st,-1); #endif + return 0; } diff --git a/src/map/skill.c b/src/map/skill.c index fc365b7d3..df7564629 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -7,6 +7,7 @@ #include "../common/malloc.h" #include "../common/showmsg.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "../common/ers.h" #include "skill.h" diff --git a/src/map/status.c b/src/map/status.c index b1e2bb1df..b5f0dbfe8 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -6,6 +6,7 @@ #include "../common/nullpo.h" #include "../common/showmsg.h" #include "../common/malloc.h" +#include "../common/utils.h" #include "pc.h" #include "map.h" |