From b14ce328eaf0c82dff32ba156ec440ff1a07ac0d Mon Sep 17 00:00:00 2001 From: amber Date: Mon, 27 Dec 2004 16:29:44 +0000 Subject: update git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@821 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/common/malloc.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/common/malloc.c') diff --git a/src/common/malloc.c b/src/common/malloc.c index eda9bc218..dd1be030f 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -42,3 +42,9 @@ void* aRealloc_( void *p, size_t size, const char *file, int line, const char *f } return ret; } + +void * _bcalloc(size_t size, size_t cnt) { + void *ret = malloc(size * cnt); + memset(ret, 0, size * cnt); + return ret; +} -- cgit v1.2.3-70-g09d2 From 27e211016b4dd484ac0a2ec8038ef60a59a07261 Mon Sep 17 00:00:00 2001 From: mc_cameri Date: Tue, 28 Dec 2004 04:07:07 +0000 Subject: git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@830 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog.txt | 3 +++ src/common/malloc.c | 1 + src/common/timer.c | 2 ++ src/map/map.c | 4 ++-- src/map/map.h | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) (limited to 'src/common/malloc.c') diff --git a/Changelog.txt b/Changelog.txt index 91bcd25b8..c375d4c66 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,8 @@ Date Added 12/27 + * Reinitialized variable 'c' in map_readmap, it's supposed to have a start value. Ex. '-'. [MC Cameri] + * Commented out dump_timer_heap() again... [MC Cameri] + * Added include of string.h in malloc.c, was causing compile errors/warnings [MC Cameri] * Modified the map progress bar to reduce updates (SVN 829) [MouseJstr] * Updated map cache system from jA 1087 - change read_map_from_bitmap to 2 to enable zlib compression [celest] diff --git a/src/common/malloc.c b/src/common/malloc.c index dd1be030f..fad5183d1 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -1,5 +1,6 @@ #include #include +#include #include "malloc.h" void* aMalloc_( size_t size, const char *file, int line, const char *func ) diff --git a/src/common/timer.c b/src/common/timer.c index 49d205619..4c602b51e 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -114,6 +114,7 @@ unsigned int gettick(void) */ // デバッグ用関数群 +/* static void dump_timer_heap(void) { int j; for(j = 1 ; j <= timer_heap[0] ; j++) { @@ -128,6 +129,7 @@ static void dump_timer_heap(void) { printf("%d : %d %d\n",j,timer_heap[j],timer_data[timer_heap[j]].tick); } } +*/ static void push_timer_heap(int index) { diff --git a/src/map/map.c b/src/map/map.c index fc2049724..d6f6d72fa 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1886,13 +1886,13 @@ static int map_readmap(int m,char *fn, char *alias, int *map_cache, int maxmap) unsigned char *gat=""; size_t size; - int i; + int i = 0; int e = 0; char progress[21] = " "; //printf("\rLoading Maps [%d/%d]: %-50s ",m,map_num,fn); if (map_num) { //avoid map-server crashing if there are 0 maps - char c; + char c = '-'; static int lasti = -1; static int last_time = -1; i=m*20/maxmap; diff --git a/src/map/map.h b/src/map/map.h index cb8438352..ccedaacaf 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -10,7 +10,7 @@ #define PC_CLASS_BASE2 (PC_CLASS_BASE + 4001) #define PC_CLASS_BASE3 (PC_CLASS_BASE2 + 22) #define MAX_NPC_PER_MAP 512 -#define BLOCK_SIZE 8 +#define BLOCK_SIZE 8 // Never zero #define AREA_SIZE battle_config.area_size #define LOCAL_REG_NUM 16 #define LIFETIME_FLOORITEM 60 -- cgit v1.2.3-70-g09d2 From 6fd1aaa92666b6097d6e480741490de28795a833 Mon Sep 17 00:00:00 2001 From: amber Date: Wed, 29 Dec 2004 21:16:05 +0000 Subject: update git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@863 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog.txt | 2 ++ src/common/malloc.c | 2 ++ src/common/malloc.h | 12 +++++++++++- src/map/pet.c | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) (limited to 'src/common/malloc.c') diff --git a/Changelog.txt b/Changelog.txt index f7f3dddd7..61404e627 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ Date Added 12/29 + * Fixing a crash if you change the name of a pet you don't have (SVN 862) [MouseJstr] + * Eliminated src/common/malloc.c when not needed [MouseJstr] * Some code cleanup in prep for new debugging malloc (SVN 861) [MouseJstr] * Updated Soul Breaker's damage calculation [celest] * Updated Meteor Assault's cast delay to be not affected by dex [celest] diff --git a/src/common/malloc.c b/src/common/malloc.c index fad5183d1..ed5fb2e44 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -1,3 +1,4 @@ +#if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) #include #include #include @@ -49,3 +50,4 @@ void * _bcalloc(size_t size, size_t cnt) { memset(ret, 0, size * cnt); return ret; } +#endif diff --git a/src/common/malloc.h b/src/common/malloc.h index 7b09d7074..860f8dd7b 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -3,8 +3,18 @@ #include -#if defined(GCOLLECT) +#if defined(DMALLOC) +#include "dmalloc.h" + +#define aMalloc(size) \ + dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 0) +#define aCalloc(count,size) \ + dmalloc_malloc(__FILE__, __LINE__, (count)*(size), DMALLOC_FUNC_CALLOC, 0, 0) +#define aRealloc(ptr,size) \ + dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 0) + +#elif defined(GCOLLECT) #include "gc.h" #define aMalloc(n) GC_MALLOC(n) #define aCalloc(m,n) _bcalloc(m,n) diff --git a/src/map/pet.c b/src/map/pet.c index 3c87a91e5..545cc079f 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -955,7 +955,7 @@ int pet_change_name(struct map_session_data *sd,char *name) nullpo_retr(1, sd); - if(sd->pet.rename_flag == 1 && battle_config.pet_rename == 0) + if((sd->pd == NULL) || (sd->pet.rename_flag == 1 && battle_config.pet_rename == 0)) return 1; for(i=0;i<24 && name[i];i++){ -- cgit v1.2.3-70-g09d2 From 2c5fabbc0b492cb5456e670ce9eb2352a11d5e3b Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@54d463be-8e91-2dee-dedb-b68131a5f0ec> Date: Sun, 23 Jan 2005 20:38:44 +0000 Subject: update git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@968 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog.txt | 138 +++++++ Dev/bugs.txt | 8 +- conf-tmpl/battle_athena.conf | 4 + db/packet_db.txt | 318 ++++++++------- db/skill_cast_db.txt | 2 +- npc/mobs/fields/yuno.txt | 170 +++++--- sql-files/database.sql | 3 - sql-files/mail.sql | 2 - src/char/char.c | 120 +++--- src/char/char.h | 6 +- src/char/int_guild.c | 24 +- src/char/int_party.c | 8 +- src/char/int_pet.c | 8 +- src/char/int_storage.c | 16 +- src/char/inter.c | 12 +- src/char_sql/char.c | 96 ++--- src/char_sql/char.h | 6 +- src/char_sql/int_guild.c | 196 ++++----- src/char_sql/int_party.c | 2 +- src/char_sql/int_pet.c | 2 +- src/char_sql/int_storage.c | 4 +- src/char_sql/inter.c | 4 +- src/char_sql/itemdb.c | 8 +- src/char_sql/itemdb.h | 2 +- src/common/core.c | 1 + src/common/db.c | 6 +- src/common/grfio.c | 68 ++-- src/common/grfio.h | 4 +- src/common/malloc.c | 23 +- src/common/malloc.h | 20 + src/common/mmo.h | 32 +- src/common/showmsg.c | 5 +- src/common/socket.c | 64 +-- src/common/socket.h | 3 +- src/common/strlib.c | 22 +- src/common/strlib.h | 6 +- src/common/timer.c | 10 +- src/common/utils.c | 9 +- src/common/utils.h | 6 + src/ladmin/ladmin.c | 10 +- src/login/login.c | 90 +++-- src/login/login.h | 2 +- src/login_sql/login.c | 26 +- src/login_sql/login.h | 2 +- src/map/atcommand.c | 164 ++++---- src/map/atcommand.h | 10 +- src/map/battle.c | 169 +++++--- src/map/battle.h | 7 +- src/map/charcommand.c | 4 +- src/map/chat.c | 6 +- src/map/clif.c | 388 ++++++++++-------- src/map/clif.h | 14 +- src/map/guild.c | 36 +- src/map/guild.h | 2 +- src/map/intif.c | 10 +- src/map/intif.h | 2 +- src/map/itemdb.c | 14 +- src/map/mail.c | 56 +-- src/map/map.c | 195 ++++----- src/map/map.h | 11 +- src/map/mob.c | 636 +++++++++++++++--------------- src/map/mob.h | 6 +- src/map/npc.c | 226 +++++------ src/map/party.c | 2 +- src/map/pc.c | 246 ++++++++---- src/map/pet.c | 4 +- src/map/script.c | 240 +++++------ src/map/skill.c | 536 ++++++++++++++++++------- src/map/skill.h | 15 +- src/map/storage.c | 12 +- src/map/vending.c | 6 +- src/txt-converter/char/char-converter.c | 106 ++--- src/txt-converter/char/char.h | 6 +- src/txt-converter/common/mmo.h | 10 +- src/txt-converter/login/login-converter.c | 8 +- 75 files changed, 2740 insertions(+), 1975 deletions(-) (limited to 'src/common/malloc.c') diff --git a/Changelog.txt b/Changelog.txt index 6c019b932..4defcf648 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,142 @@ Date Added + +01/23 + * Forgot a couple small changes [SVN 35] [Ajarn] + * Changed map_data.gat and map_data_other_server.gat from unsigned char* + to char* (this might be needed, because of unicode or something, please + correct me if I'm wrong) [SVN 34] [Ajarn] + * Converted decode_zip, enconde_zip, remove_control_chars, mapif_sendall*, + and e_mail_check to use char* instead of unsigned char* (again, please test) + [SVN 34] [Ajarn] + * Modified skill unit group checking in skill_unit_onplace that might have + been causing crashes [celest] + * Updated packet 0x143 length's for version 14 (2004-11-01Sakexe) and version + 16 (2005-01-10Sakexe), thanks to jathena and ice2big [celest] + * Fixed login-server compile error with the "new" -> "new_" changes [celest] + +01/22 + * Fixed an error that was in my last commit (optimising g++ build) [SVN 29] + [Ajarn] + * Made strlib functions char*, instead of unsigned char*. Strings are meant + to be char. (Shouldn't break anyhting, but might, please test this for me) + [SVN 26] [Ajarn] + * Added cast for TXT version [SVN 25] [Ajarn] + * Added cast from allocation calls, from void* to intended type [SVN 24] [Ajarn] + * Changed bool -> bool_. Still need to make convertions between + char* and unsigned char* valid, and some other convertions too. + Also, sizeof is being used wierd in map.c, at least g++ + complains [SVN 22] [Ajarn] + * Changed the rest of the class variable names to class_ and all the new + variable names to new_, for futher g++ support [SVN 21] [Ajarn] + * Update both caster and target's SP after using Soul Change -- thanks to Aalye + / Freya [celest] + * Force a monster to switch attack target when being casted Provoke [celest] + * Corrected description for @enablenpc -- "@npcon" -> "@enablenpc" [celest] + * Since job normalising is still buggy require all 1st class skills to check + for Basic Skill level when calculating the skill tree [celest] + +01/21 + * Updated packet DB configurations : enable_packet_db, packet_db_ver, + -- check the .txt for description [celest] + + Note: For people having connection problems try setting 'enable_packet_db' + to 'no'... and use the latest client (01-10Sakexe) + + * Fixed a small typo in 12-06's packets -- 21b => 21d [celest] + * Updated packet_db.txt to only contain the latest version, like jAthena, + since there's not much point to re-read packets eA already supports + (although if you remove all the //'s it can still read multiple versions) + [celest] + * Added clif_config in clif.c - for keeping packet/client connections related + stuff [celest] + * Send 'Game Exe not latest version' to a client if it hasn't been authentified + yet, but is sending a non-connection-related packet to prevent crashing + -- assume the client is using an unknown exe [celest] + +01/20 + * Fixed compile time problems with the non-GC case [MouseJstr] + * Introduced aMallocA and aCallocA + + These two functions allocate "atomic" memory which means + "memory that does not contain references to other memory". + + This lets the garbage collector ignore these objects when searching + memory for references to other objects dramatically increasing + performance of the GC. + + When in doubt, use aMalloc and aCalloc. It is better to add + a tiny bit of work to the GC then do cause a crash due to memory + being cleaned up when it shouldn't. + [MouseJstr] + * Modified all calls to aMalloc and aCalloc that reference + atomic memory to use aMallocA and aCallocA + [MouseJstr] + * Modified the socket buffer allocator to use "atomic" memory + for the fifo data buffers [MouseJstr] +01/19 + * added support for the Hans-J. Boehm libC garbage collector + (A copy is in http://amber.stormbirds.org/~joshs/gc6.3.tar). + + It is ABSOLUTELY critical for people to use + aFree/aMalloc/aCalloc/aStrdup for this to work. If somebody + has just used free or malloc, this will crash when used with + the garbage collector. + + A amusing environmental variable to set is GC_PRINT_STATS (to 1) + so that you see real time statistics of leaked data being + recovered. + + grab a copy of the gc6.3.tar.. build it .. install it.. + modify the Makefile to have the + + CC = gcc -pipe -DGCOLLECT + GCLIB = -lgc + + lines... and make the sql servers (the txt server doesn't + build using this right now due to stupid Makefile issues) + + [MouseJstr] + * SVN 3 on http://svn.stormbirds.org/svn/eathena will be what + I diff against when I merge back into delta.. if we ever merge + back into delta [MouseJstr] + * Removed 12-06 Sakexe detection, since it doesn't seem to work, and + might be conflicting with 10-25 clients [celest] + * Update the Soul Burn target's SP when it has been successfully reduced to 0, + thanks to Aalye / Freya [celest] + * Moved SC_PRESERVE and SC_BATTLEORDERS's id so they'll display a status icon + when cast, thanks XiaoLin of cAthena [celest] + * Added missing code for Preserve -- i totally forgot to add it ^^; [celest] + +01/18 + * Added some skill bug fixes, thanks to Aalye / Freya [celest] + - stop player attacking if the target goes into hiding + - fixed Sword Reject not working against swords, only daggers + - additional check in case Marionette Control doesn't end properly even + when one of the partners has logged off + * Added stun, bleeding and SP loss effect for Pressure, thanks to DracoRpg + [celest] + * TEST: Fixed more compile warnings in MSVC [celest] + * TEST: Fixed some compile errors in MS Visual C++, thanks to Ser [celest] + +01/17 + * Some rewrites in skill_delayfix [celest] + - If the delay is < 0, add the weapon aspd delay to it + - If the skill is not weapon type, and has 0 delay, add 300ms as default + * Added min_skill_delay_limit as the minimum allowed delay for any skills + [celest] + * Some tidying up in battle_get_ functions [celest] + * Set exp table and job bonus table to 0 before reading - might solve some + memory bugs [celest] + * Updated skill range leniency code - If possible try and move towards the + skill target so that when casting it no longer falls out of range [celest] + +01/15 + * Added effects to enemies for Gospel [celest] + * Added mobs spawn to all Yuno fields (according to 4th Jan patch) [Lupus] + +01/14 + * Added party supporting effects for Gospel [celest] + 01/13 * Added and testing support for 2004-12-06Sakexe [celest] * Removed emblem changing requiring Glory of Guild limited to TXT only [celest] diff --git a/Dev/bugs.txt b/Dev/bugs.txt index bc85d6272..a1108f3a3 100644 --- a/Dev/bugs.txt +++ b/Dev/bugs.txt @@ -221,9 +221,7 @@ Problem: Berzebub, etc cards don't decrease aftercast delays Assigned: N/A Progress: 0% -Problem: Some clients that are able to log into eAthena servers properly are not able to when custom items are used. - I believe Celest may have accidentially "broken" a few things when she was attempting to create new packet - compatibility and removed old ones. +Problem: Older Clients are unable to log into the server, period. + Even if the packet_db is set to use the older clients, they still are unable to connect. Assigned: Celest -Progress: 0% - Celest: What version was the client using? \ No newline at end of file +Progress: 0% \ No newline at end of file diff --git a/conf-tmpl/battle_athena.conf b/conf-tmpl/battle_athena.conf index 9f7bd11a8..35b20f7d9 100644 --- a/conf-tmpl/battle_athena.conf +++ b/conf-tmpl/battle_athena.conf @@ -46,6 +46,10 @@ delay_rate: 100 // Note: On Official servers Dex does NOT affect delay time delay_dependon_dex: no +// Minimum allowed delay for ANY skills after casting (in miliseconds) (Note 1) +// Note: Setting this to anything above 0 can stop speedhacks. +min_skill_delay_limit: 100 + // At what dex does the cast time become zero (instacast) castrate_dex_scale: 150 diff --git a/db/packet_db.txt b/db/packet_db.txt index 28ae52fee..95591eacf 100644 --- a/db/packet_db.txt +++ b/db/packet_db.txt @@ -1,11 +1,23 @@ // The packet database allows you to add support for new clients, -// because packets change every release. -// This only allows 1 type of client at a time, make sure your +// because packets change every release. +// By default this only allows 1 type of client at a time, make sure your // client is the last one in the list // EX: You have client 628 and it goes up to 1021, // delete or comment (use //) till your client is last. -packet_ver: 5 + +// Whether to allow identifying clients via the packet DB +enable_packet_db: yes + +// Main packet version of the DB (default = Auto Detect) +packet_db_ver: default + +// Whether the packet DB takes higher precedence over the hardcoded packet +// length and functions, and whether to overwrite them when reading +prefer_packet_db: yes + + +// packet_ver: 5 0x0064,55 0x0065,17 0x0066,3 @@ -438,182 +450,182 @@ packet_ver: 5 //jROはここまで //2004-07-06kRO -packet_ver: 6 -0x0072,22,wanttoconnection,5:9:13:17:21 -0x0085,8,walktoxy,5 -0x00a7,13,useitem,5:9 -0x0113,15,useskilltoid,4:9:11 -0x0116,15,useskilltopos,4:9:11:13 -0x0190,95,useskilltopos,4:9:11:13:15 +// packet_ver: 6 +// 0x0072,22,wanttoconnection,5:9:13:17:21 +// 0x0085,8,walktoxy,5 +// 0x00a7,13,useitem,5:9 +// 0x0113,15,useskilltoid,4:9:11 +// 0x0116,15,useskilltopos,4:9:11:13 +// 0x0190,95,useskilltopos,4:9:11:13:15 //2004-07-13kRO -packet_ver: 7 -0x0072,39,wanttoconnection,12:22:30:34:38 -0x0085,9,walktoxy,6 -0x009b,13,changedir,5:12 -0x009f,10,takeitem,6 -0x00a7,17,useitem,6:13 -0x0113,19,useskilltoid,7:9:15 -0x0116,19,useskilltopos,7:9:15:17 -0x0190,99,useskilltopos,7:9:15:17:19 +// packet_ver: 7 +// 0x0072,39,wanttoconnection,12:22:30:34:38 +// 0x0085,9,walktoxy,6 +// 0x009b,13,changedir,5:12 +// 0x009f,10,takeitem,6 +// 0x00a7,17,useitem,6:13 +// 0x0113,19,useskilltoid,7:9:15 +// 0x0116,19,useskilltopos,7:9:15:17 +// 0x0190,99,useskilltopos,7:9:15:17:19 //2004-07-26kRO -packet_ver: 8 -0x0072,14,dropitem,5:12 -0x007e,33,wanttoconnection,12:18:24:28:32 -0x0085,20,useskilltoid,7:12:16 -0x0089,15,getcharnamerequest,11 -0x008c,23,useskilltopos,3:6:17:21 -0x0094,10,takeitem,6 -0x009b,6,walktoxy,3 -0x009f,13,changedir,5:12 -0x00a2,103,useskilltopos,3:6:17:21:23 -0x00a7,12,solvecharname,8 -0x00f3,-1,globalmessage,2:4 -0x00f5,17,useitem,6:12 -0x00f7,10,ticksend,6 -0x0113,16,movetokafra,5:12 -0x0116,2,closekafra,0 -0x0190,26,movefromkafra,10:22 -0x0193,9,actionrequest,3:8 +// packet_ver: 8 +// 0x0072,14,dropitem,5:12 +// 0x007e,33,wanttoconnection,12:18:24:28:32 +// 0x0085,20,useskilltoid,7:12:16 +// 0x0089,15,getcharnamerequest,11 +// 0x008c,23,useskilltopos,3:6:17:21 +// 0x0094,10,takeitem,6 +// 0x009b,6,walktoxy,3 +// 0x009f,13,changedir,5:12 +// 0x00a2,103,useskilltopos,3:6:17:21:23 +// 0x00a7,12,solvecharname,8 +// 0x00f3,-1,globalmessage,2:4 +// 0x00f5,17,useitem,6:12 +// 0x00f7,10,ticksend,6 +// 0x0113,16,movetokafra,5:12 +// 0x0116,2,closekafra,0 +// 0x0190,26,movefromkafra,10:22 +// 0x0193,9,actionrequest,3:8 //2004-08-09kRO -packet_ver: 9 -0x0072,17,dropitem,8:15 +// packet_ver: 9 +// 0x0072,17,dropitem,8:15 //9, +12, +7, +4, +4 -0x007e,37,wanttoconnection,9:21:28:32:36 -0x0085,26,useskilltoid,11:18:22 -0x0089,12,getcharnamerequest,8 -0x008c,40,useskilltopos,5:15:29:38 -0x0094,13,takeitem,9 -0x009b,15,walktoxy,12 -0x009f,12,changedir,7:11 -0x00a2,120,useskilltopos,5:15:29:38:40 -0x00a7,11,solvecharname,7 -0x00f5,24,useitem,9:20 -0x00f7,13,ticksend,9 -0x0113,23,movetokafra,5:19 -0x0190,26,movefromkafra,11:22 -0x0193,18,actionrequest,7:17 +// 0x007e,37,wanttoconnection,9:21:28:32:36 +// 0x0085,26,useskilltoid,11:18:22 +// 0x0089,12,getcharnamerequest,8 +// 0x008c,40,useskilltopos,5:15:29:38 +// 0x0094,13,takeitem,9 +// 0x009b,15,walktoxy,12 +// 0x009f,12,changedir,7:11 +// 0x00a2,120,useskilltopos,5:15:29:38:40 +// 0x00a7,11,solvecharname,7 +// 0x00f5,24,useitem,9:20 +// 0x00f7,13,ticksend,9 +// 0x0113,23,movetokafra,5:19 +// 0x0190,26,movefromkafra,11:22 +// 0x0193,18,actionrequest,7:17 //2004-08-16aSakexe -0x020f,0 -0x0210,0 -0x0211,0 -0x0212,26 -0x0213,26 -0x0214,42 +// 0x020f,0 +// 0x0210,0 +// 0x0211,0 +// 0x0212,26 +// 0x0213,26 +// 0x0214,42 //2004-08-17aSakexe -0x020f,10 -0x0210,22 +// 0x020f,10 +// 0x0210,22 //2004-09-06aSakexe -packet_ver: 10 +// packet_ver: 10 //0x0072,20,useitem,9:20 -0x007e,19,movetokafra,3:15 -0x0085,23,actionrequest,9:22 -0x0089,9,walktoxy,6 -0x008c,105,useskilltopos,10:14:18:23:25 -0x0094,17,dropitem,6:15 -0x009b,14,getcharnamerequest,10 -0x009f,-1,globalmessage,2:4 -0x00a2,14,solvecharname,10 -0x00a7,25,useskilltopos,10:14:18:23 -0x00f3,10,changedir,4:9 +// 0x007e,19,movetokafra,3:15 +// 0x0085,23,actionrequest,9:22 +// 0x0089,9,walktoxy,6 +// 0x008c,105,useskilltopos,10:14:18:23:25 +// 0x0094,17,dropitem,6:15 +// 0x009b,14,getcharnamerequest,10 +// 0x009f,-1,globalmessage,2:4 +// 0x00a2,14,solvecharname,10 +// 0x00a7,25,useskilltopos,10:14:18:23 +// 0x00f3,10,changedir,4:9 //7, +7, +10, +4, +6 -0x00f5,34,wanttoconnection,7:15:25:29:33 -0x00f7,2,closekafra,0 -0x0113,11,takeitem,7 -0x0116,11,ticksend,7 -0x0190,22,useskilltoid,9:15:18 -0x0193,17,movefromkafra,3:13 +// 0x00f5,34,wanttoconnection,7:15:25:29:33 +// 0x00f7,2,closekafra,0 +// 0x0113,11,takeitem,7 +// 0x0116,11,ticksend,7 +// 0x0190,22,useskilltoid,9:15:18 +// 0x0193,17,movefromkafra,3:13 //2004-09-21aSakexe by Sara -packet_ver: 11 -0x0072,18,useitem,10:14 -0x007e,25,movetokafra,6:21 -0x0085,9,actionrequest,3:8 -0x0089,14,walktoxy,11 -0x008c,109,useskilltopos,16:20:23:27:29 -0x0094,19,dropitem,12:17 -0x00a2,10,solvecharname,6 -0x00a7,29,useskilltopos,6:20:23:27 -0x00f3,18,changedir,8:17 -0x00f5,32,wanttoconnection,10:17:23:27:31 -0x009b,10,getcharnamerequest,6 -0x0113,14,takeitem,10 -0x0116,14,ticksend,10 -0x0190,14,useskilltoid,4:7:10 -0x0193,12,movefromkafra,4:8 +// packet_ver: 11 +// 0x0072,18,useitem,10:14 +// 0x007e,25,movetokafra,6:21 +// 0x0085,9,actionrequest,3:8 +// 0x0089,14,walktoxy,11 +// 0x008c,109,useskilltopos,16:20:23:27:29 +// 0x0094,19,dropitem,12:17 +// 0x00a2,10,solvecharname,6 +// 0x00a7,29,useskilltopos,6:20:23:27 +// 0x00f3,18,changedir,8:17 +// 0x00f5,32,wanttoconnection,10:17:23:27:31 +// 0x009b,10,getcharnamerequest,6 +// 0x0113,14,takeitem,10 +// 0x0116,14,ticksend,10 +// 0x0190,14,useskilltoid,4:7:10 +// 0x0193,12,movefromkafra,4:8 //2004-10-11aSakexe by Sara -packet_ver: 12 -0x0072,17,useitem,6:13 -0x007e,16,movetokafra,5:12 -0x0089,6,walktoxy,3 -0x008c,103,useskilltopos,2:6:17:21:23 -0x0094,14,dropitem,5:12 -0x009b,15,getcharnamerequest,11 -0x00a2,12,solvecharname,8 -0x00a7,23,useskilltopos,3:6:17:21 -0x00f3,13,changedir,5:12 -0x00f5,33,wanttoconnection,12:18:24:28:32 -0x0113,10,takeitem,6 -0x0116,10,ticksend,6 -0x0190,20,useskilltoid,7:12:16 -0x0193,26,movefromkafra,10:22 +// packet_ver: 12 +// 0x0072,17,useitem,6:13 +// 0x007e,16,movetokafra,5:12 +// 0x0089,6,walktoxy,3 +// 0x008c,103,useskilltopos,2:6:17:21:23 +// 0x0094,14,dropitem,5:12 +// 0x009b,15,getcharnamerequest,11 +// 0x00a2,12,solvecharname,8 +// 0x00a7,23,useskilltopos,3:6:17:21 +// 0x00f3,13,changedir,5:12 +// 0x00f5,33,wanttoconnection,12:18:24:28:32 +// 0x0113,10,takeitem,6 +// 0x0116,10,ticksend,6 +// 0x0190,20,useskilltoid,7:12:16 +// 0x0193,26,movefromkafra,10:22 //2004-10-25aSakexe by Sara -packet_ver: 13 -0x0072,13,useitem,5:9 -0x007e,13,movetokafra,6:9 -0x0085,15,actionrequest,4:14 -0x008c,108,useskilltopos,6:9:23:26:28 -0x0094,12,dropitem,6:10 -0x009b,10,getcharnamerequest,6 -0x00a2,16,solvecharname,12 -0x00a7,28,useskilltopos,6:9:23:26 -0x00f3,15,changedir,6:14 -0x00f5,29,wanttoconnection,5:14:20:24:28 -0x0113,9,takeitem,5 -0x0116,9,ticksend,5 -0x0190,26,useskilltoid,4:10:22 -0x0193,22,movefromkafra,12:18 +// packet_ver: 13 +// 0x0072,13,useitem,5:9 +// 0x007e,13,movetokafra,6:9 +// 0x0085,15,actionrequest,4:14 +// 0x008c,108,useskilltopos,6:9:23:26:28 +// 0x0094,12,dropitem,6:10 +// 0x009b,10,getcharnamerequest,6 +// 0x00a2,16,solvecharname,12 +// 0x00a7,28,useskilltopos,6:9:23:26 +// 0x00f3,15,changedir,6:14 +// 0x00f5,29,wanttoconnection,5:14:20:24:28 +// 0x0113,9,takeitem,5 +// 0x0116,9,ticksend,5 +// 0x0190,26,useskilltoid,4:10:22 +// 0x0193,22,movefromkafra,12:18 //2004-11-01aSakexe by Sara -packet_ver: 14 -0x0215,6 -0x0143,23,npcamountinput,2:6 -0x0145,19 +// packet_ver: 14 +// 0x0215,6 +// 0x0143,23,npcamountinput,2:6 +// 0x0145,19 //0x01f9,6,adopt,5 //2004-12-06aSakexe -packet_ver: 15 -0x0190,15,useitem,3:11 -0x0094,14,movetokafra,4:10 -0x009f,18,actionrequest,6:17 -0x00a7,7,walktoxy,4 -0x007e,30,useskilltopos,4:9:22:28 -0x0116,12,dropitem,4:10 -0x008c,13,getcharnamerequest,9 -0x0085,-1,globalmessage,2:4 -0x00f7,14,solvecharname,10 -0x0113,110,useskilltopos,4:9:22:28:30 -0x00f3,8,changedir,3:7 -0x00f5,29,wanttoconnection,3:10:20:24:28 -0x00a2,7,takeitem,3 -0x0089,7,ticksend,3 -0x0072,22,useskilltoid,8:12:18 -0x0193,21,movefromkafra,4:17 -0x009b,2,closekafra,0 -0x0222,6 -0x0221,-1 -0x021d,6 -0x0223,8 +// packet_ver: 15 +// 0x0190,15,useitem,3:11 +// 0x0094,14,movetokafra,4:10 +// 0x009f,18,actionrequest,6:17 +// 0x00a7,7,walktoxy,4 +// 0x007e,30,useskilltopos,4:9:22:28 +// 0x0116,12,dropitem,4:10 +// 0x008c,13,getcharnamerequest,9 +// 0x0085,-1,globalmessage,2:4 +// 0x00f7,14,solvecharname,10 +// 0x0113,110,useskilltopos,4:9:22:28:30 +// 0x00f3,8,changedir,3:7 +// 0x00f5,29,wanttoconnection,3:10:20:24:28 +// 0x00a2,7,takeitem,3 +// 0x0089,7,ticksend,3 +// 0x0072,22,useskilltoid,8:12:18 +// 0x0193,21,movefromkafra,4:17 +// 0x009b,2,closekafra,0 +// 0x0222,6 +// 0x0221,-1 +// 0x021d,6 +// 0x0223,8 //2005-01-10bSakexe by Sara -packet_ver: 16 +// packet_ver: 16 0x009b,32,wanttoconnection,3:12:23:27:31 0x0089,9,ticksend,5 0x00a7,13,walktoxy,10 @@ -631,5 +643,7 @@ packet_ver: 16 0x0072,26,useskilltoid,8:16:22 0x007e,114,useskilltopos,9:18:22:32:34 0x00a2,11,solvecharname,7 +0x0143,10,npcamountinput,2:6 -packet_ver: 17 \ No newline at end of file +// packet_ver: 17 +// Add new packets here \ No newline at end of file diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt index af93d845d..774ca5aa0 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -32,7 +32,7 @@ 35,0,1000,0,0 //AL_CURE#キュアー# 45,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0 //AC_CONCENTRATION#集中力向上# -46,0,1500,100,0 //AC_DOUBLE +46,0,-300,100,0 //AC_DOUBLE 47,0,1500,100,0 //AC_SHOWER 51,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //TF_HIDING#ハイディング# diff --git a/npc/mobs/fields/yuno.txt b/npc/mobs/fields/yuno.txt index 7b0cbbb27..dd0f67335 100644 --- a/npc/mobs/fields/yuno.txt +++ b/npc/mobs/fields/yuno.txt @@ -3,58 +3,136 @@ //===== By: ================================================== //= Athena (1.0) //===== Current Version: ===================================== -//= 1.1 +//= 1.3 //===== Compatible With: ===================================== //= Any Athena Version //===== Additional Comments: ================================= //= 1.1 fixed tabs, names [Lupus] +//= 1.2 New/Better Spawn [Muad_Dib] +//= 1.3 Fix Up [Darkchild] //============================================================ -//(yuno_fild04.gat)* -yuno_fild04.gat,0,0,0,0 monster Goat 1372,40,0,0,0 -yuno_fild04.gat,0,0,0,0 monster Sleeper 1386,5,0,0,0 -yuno_fild04.gat,0,0,0,0 monster The Paper 1375,3,0,0,0 -yuno_fild04.gat,0,0,0,0 monster Geographer 1368,20,0,0,0 -yuno_fild04.gat,0,0,0,0 monster Driller 1380,10,0,0,0 -yuno_fild04.gat,0,0,0,0 monster Poring 1002,20,0,0,0 +//======================================================================================== +// - Yuno Field 01 +//======================================================================================== + +yuno_fild01.gat,0,0,0,0 monster Poring 1002,55,0,0,0 +yuno_fild01.gat,0,0,0,0 monster Poporing 1031,35,0,0,0 +yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,25,0,0,0 +yuno_fild01.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1 +yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1 +yuno_fild01.gat,0,0,0,0 monster Shining Plant 1083,5,1800000,900000,1 +yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1 + +//======================================================================================== +// - Yuno Field 02 +//======================================================================================== + +yuno_fild02.gat,0,0,0,0 monster Sageworm 1281,5,0,0,0 +yuno_fild02.gat,0,0,0,0 monster Dustiness 1114,15,0,0,0 +yuno_fild02.gat,0,0,0,0 monster Kind of Beetle 1494,15,0,0,0 +yuno_fild02.gat,0,0,0,0 monster Horn 1128,35,0,0,0 +yuno_fild02.gat,0,0,0,0 monster Stainer 1174,25,0,0,0 +yuno_fild02.gat,0,0,0,0 monster Wild Rose 1261,15,0,0,0 +yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1 +yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1 +yuno_fild02.gat,0,0,0,0 monster Green Plant 1080,15,180000,90000,1 + +//======================================================================================== +// - Yuno Field 03 +//======================================================================================== + +yuno_fild03.gat,0,0,0,0 monster Drops 1113,30,0,0,0 +yuno_fild03.gat,0,0,0,0 monster Poring 1002,40,0,0,0 +yuno_fild03.gat,0,0,0,0 monster Sidewinder 1037,5,0,0,0 +yuno_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0 +yuno_fild03.gat,0,0,0,0 monster Marin 1242,20,0,0,0 +yuno_fild03.gat,0,0,0,0 monster Geographer 1368,15,0,0,0 +yuno_fild03.gat,0,0,0,0 monster Archangeling 1388,1,3600000,1800000,1 +yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1 +yuno_fild03.gat,0,0,0,0 monster Green Plant 1080,50,180000,90000,1 +yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1 + +//======================================================================================== +// - Yuno Field 04 +//======================================================================================== + +yuno_fild04.gat,0,0,0,0 monster Poring 1002,50,0,0,0 +yuno_fild04.gat,0,0,0,0 monster Pupa 1008,15,0,0,0 +yuno_fild04.gat,0,0,0,0 monster Drops 1113,30,0,0,0 +yuno_fild04.gat,0,0,0,0 monster Condor 1009,15,0,0,0 +yuno_fild04.gat,0,0,0,0 monster Creamy 1018,10,0,0,0 yuno_fild04.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1 yuno_fild04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1 yuno_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,360000,180000,1 -yuno_fild04.gat,0,0,0,0 monster Harpy 1376,1,0,0,0 - -//(yuno_fild03.gat)* -yuno_fild03.gat,0,0,0,0 monster Goat 1372,60,0,0,0 -yuno_fild03.gat,0,0,0,0 monster Sleeper 1386,30,0,0,0 -yuno_fild03.gat,0,0,0,0 monster The Paper 1375,3,0,0,0 -yuno_fild03.gat,0,0,0,0 monster Geographer 1368,20,0,0,0 -yuno_fild03.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0 -yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1 -yuno_fild03.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1 -yuno_fild03.gat,0,0,0,0 monster Blue Plant 1079,4,360000,180000,1 -yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1 -yuno_fild03.gat,0,0,0,0 monster Harpy 1376,2,0,0,0 - -//(yuno_fild02.gat)* -yuno_fild02.gat,0,0,0,0 monster Sleeper 1386,10,0,0,0 -yuno_fild02.gat,0,0,0,0 monster Grand Peco 1369,70,0,0,0 -yuno_fild02.gat,0,0,0,0 monster The Paper 1375,1,0,0,0 -yuno_fild02.gat,0,0,0,0 monster Geographer 1368,20,0,0,0 -yuno_fild02.gat,0,0,0,0 monster Driller 1380,30,0,0,0 -yuno_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0 -yuno_fild02.gat,0,0,0,0 monster Poring 1002,20,0,0,0 -yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,20,180000,90000,1 -yuno_fild02.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,900000,1 -yuno_fild02.gat,0,0,0,0 monster Blue Plant 1079,3,360000,180000,1 -yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1 -yuno_fild02.gat,0,0,0,0 monster Archangeling 1388,1,3600000,1800000,1 - -//(yuno_fild01.gat)* -yuno_fild01.gat,0,0,0,0 monster Grand Peco 1369,3,0,0,0 -yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0 -yuno_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0 -yuno_fild01.gat,0,0,0,0 monster Poring 1002,20,0,0,0 -yuno_fild01.gat,0,0,0,0 monster Green Plant 1080,20,180000,90000,1 -yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1 -yuno_fild01.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1 -yuno_fild01.gat,0,0,0,0 monster Blue Plant 1079,2,360000,180000,1 -yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,23,360000,180000,1 + +//======================================================================================== +// - Yuno Field 05 +//======================================================================================== + +yuno_fild05.gat,0,0,0,0 monster Geographer 1368,20,0,0,0 +yuno_fild05.gat,0,0,0,0 monster Goat 1372,5,0,0,0 +yuno_fild05.gat,0,0,0,0 monster Demon Pungus 1378,20,0,0,0 +yuno_fild05.gat,0,0,0,0 monster Sleeper 1386,45,0,0,0 +yuno_fild05.gat,0,0,0,0 monster The Paper 1375,15,0,0,0 +yuno_fild05.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1 +yuno_fild05.gat,0,0,0,0 monster Yellow Plant 1081,10,360000,180000,1 +yuno_fild05.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1 + +//======================================================================================== +// - Yuno Field 07 +//======================================================================================== + +yuno_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0 +yuno_fild07.gat,0,0,0,0 monster Goat 1372,60,0,0,0 +yuno_fild07.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1 +yuno_fild07.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1 +yuno_fild07.gat,0,0,0,0 monster Yellow Plant 1081,15,360000,180000,1 + +//======================================================================================== +// - Yuno Field 08 +//======================================================================================== + +yuno_fild08.gat,0,0,0,0 monster Grand Peco 1369,20,0,0,0 +yuno_fild08.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0 +yuno_fild08.gat,0,0,0,0 monster Geographer 1368,20,0,0,0 +yuno_fild08.gat,0,0,0,0 monster Wild Rose 1261,15,0,0,0 +yuno_fild08.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1 +yuno_fild08.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1 +yuno_fild08.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1 + +//======================================================================================== +// - Yuno Field 09 +//======================================================================================== + +yuno_fild09.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Goblin 1122,10,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Goblin 1123,5,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Goblin 1124,10,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Goblin 1125,5,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Goblin 1126,5,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Horn 1128,25,0,0,0 +yuno_fild09.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1 +yuno_fild09.gat,0,0,0,0 monster Yellow Plant 1081,15,360000,180000,1 +yuno_fild09.gat,0,0,0,0 monster Green Plant 1080,15,180000,90000,1 + +//======================================================================================== +// - Yuno Field 11 +//======================================================================================== + +yuno_fild11.gat,0,0,0,0 monster Sleeper 1386,55,0,0,0 +yuno_fild11.gat,0,0,0,0 monster Geographer 1368,20,0,0,0 +yuno_fild11.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1 +yuno_fild11.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1 +yuno_fild11.gat,0,0,0,0 monster Yellow Plant 1081,15,360000,180000,1 + +//======================================================================================== +// - Yuno Field 12 +//======================================================================================== + +yuno_fild12.gat,0,0,0,0 monster Dustiness 1114,35,0,0,0 +yuno_fild12.gat,0,0,0,0 monster Demon Pungus 1378,20,0,0,0 +yuno_fild12.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1 +yuno_fild12.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1 +yuno_fild12.gat,0,0,0,0 monster Yellow Plant 1081,10,360000,180000,1 diff --git a/sql-files/database.sql b/sql-files/database.sql index 9700ddb3a..1c379859f 100644 --- a/sql-files/database.sql +++ b/sql-files/database.sql @@ -1,6 +1,3 @@ -DROP DATABASE erag; -CREATE DATABASE erag; -USE erag; CREATE TABLE `item_db` ( `id` smallint(5) unsigned NOT NULL default '0', `name_english` varchar(24) NOT NULL default '', diff --git a/sql-files/mail.sql b/sql-files/mail.sql index 201142d59..62cc9d65d 100644 --- a/sql-files/mail.sql +++ b/sql-files/mail.sql @@ -1,5 +1,3 @@ -CREATE DATABASE /*!32312 IF NOT EXISTS*/ `ragnarok`; -USE `ragnarok`; CREATE TABLE `mail` ( `message_id` int(11) NOT NULL auto_increment, `to_account_id` int(11) NOT NULL default '0', diff --git a/src/char/char.c b/src/char/char.c index 6aaae27b0..56d070e5d 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -166,7 +166,7 @@ int char_log(char *fmt, ...) { //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { +int remove_control_chars(char *str) { int i; int change = 0; @@ -244,7 +244,7 @@ int mmo_friends_list_data_str(char *str, struct mmo_charstatus *p) { int i; char *str_p = str; str_p += sprintf(str_p, "%d", p->char_id); - + for (i=0;i<20;i++) { str_p += sprintf(str_p, ",%d,%s", p->friend_id[i],p->friend_name[i]); @@ -575,16 +575,16 @@ int parse_friend_txt(struct mmo_charstatus *p) char line[1024]; int i,cid=0,temp[20]; FILE *fp; - + // Open the file and look for the ID fp = fopen(friends_txt, "r"); if(fp == NULL) return 1; - + while(fgets(line, sizeof(line)-1, fp)) { - + if(line[0] == '/' && line[1] == '/') continue; @@ -612,7 +612,7 @@ int parse_friend_txt(struct mmo_charstatus *p) if (cid == p->char_id) break; } - + // No register of friends list if (cid == 0) { fclose(fp); @@ -638,12 +638,12 @@ int mmo_char_init(void) { FILE *fp; char_max = 256; - char_dat = calloc(sizeof(struct mmo_charstatus) * 256, 1); + char_dat = (struct mmo_charstatus*)aCalloc(sizeof(struct mmo_charstatus) * 256, 1); if (!char_dat) { printf("out of memory: mmo_char_init (calloc of char_dat).\n"); exit(1); } - online_chars = calloc(sizeof(struct online_chars) * 256, 1); + online_chars = (struct online_chars*)aCalloc(sizeof(struct online_chars) * 256, 1); if (!online_chars) { printf("out of memory: mmo_char_init (calloc of online_chars).\n"); exit(1); @@ -683,13 +683,13 @@ int mmo_char_init(void) { if (char_num >= char_max) { char_max += 256; - char_dat = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max); + char_dat = (struct mmo_charstatus*)aRealloc(char_dat, sizeof(struct mmo_charstatus) * char_max); if (!char_dat) { printf("Out of memory: mmo_char_init (realloc of char_dat).\n"); char_log("Out of memory: mmo_char_init (realloc of char_dat)." RETCODE); exit(1); } - online_chars = realloc(online_chars, sizeof(struct online_chars) * char_max); + online_chars = (struct online_chars*)aRealloc(online_chars, sizeof(struct online_chars) * char_max); if (!online_chars) { printf("Out of memory: mmo_char_init (realloc of online_chars).\n"); char_log("Out of memory: mmo_char_init (realloc of online_chars)." RETCODE); @@ -703,10 +703,10 @@ int mmo_char_init(void) { } ret = mmo_char_fromstr(line, &char_dat[char_num]); - + // Initialize friends list parse_friend_txt(&char_dat[char_num]); // Grab friends for the character - + if (ret > 0) { // negative value or zero for errors if (char_dat[char_num].char_id >= char_id_count) char_id_count = char_dat[char_num].char_id + 1; @@ -769,7 +769,7 @@ void mmo_char_sync(void) { int i, j, k; int lock; FILE *fp,*f_fp; - int id[char_num]; + int *id = (int *) aMalloc(sizeof(int) * char_num); // Sorting before save (by [Yor]) for(i = 0; i < char_num; i++) { @@ -825,9 +825,11 @@ void mmo_char_sync(void) { mmo_friends_list_data_str(f_line, &char_dat[id[i]]); fprintf(f_fp, "%s" RETCODE, f_line); } - + lock_fclose(f_fp, friends_txt, &lock); - + + aFree(id); + return; } @@ -847,7 +849,7 @@ int make_new_char(int fd, unsigned char *dat) { int i, j; struct char_session_data *sd; - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; // remove control characters from the name dat[23] = '\0'; @@ -921,13 +923,13 @@ int make_new_char(int fd, unsigned char *dat) { if (char_num >= char_max) { char_max += 256; - char_dat = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max); + char_dat = (struct mmo_charstatus*)aRealloc(char_dat, sizeof(struct mmo_charstatus) * char_max); if (!char_dat) { printf("Out of memory: make_new_char (realloc of char_dat).\n"); char_log("Out of memory: make_new_char (realloc of char_dat)." RETCODE); exit(1); } - online_chars = realloc(online_chars, sizeof(struct online_chars) * char_max); + online_chars = (struct online_chars*)aRealloc(online_chars, sizeof(struct online_chars) * char_max); if (!online_chars) { printf("Out of memory: make_new_char (realloc of online_chars).\n"); char_log("Out of memory: make_new_char (realloc of online_chars)." RETCODE); @@ -998,8 +1000,8 @@ int make_new_char(int fd, unsigned char *dat) { //---------------------------------------------------- // This function return the name of the job (by [Yor]) //---------------------------------------------------- -char * job_name(int class) { - switch (class) { +char * job_name(int class_) { + switch (class_) { case 0: return "Novice"; case 1: return "Swordsman"; case 2: return "Mage"; @@ -1550,7 +1552,7 @@ int disconnect_player(int accound_id) { // disconnect player if online on char-server for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { + if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) { if (sd->account_id == accound_id) { session[i]->eof = 1; return 1; @@ -1612,7 +1614,7 @@ int parse_tologin(int fd) { return 0; } - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; while(RFIFOREST(fd) >= 2) { // printf("parse_tologin: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); @@ -1645,7 +1647,7 @@ int parse_tologin(int fd) { return 0; // printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6)); for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) { + if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) { if (RFIFOB(fd,6) != 0) { WFIFOW(i,0) = 0x6c; WFIFOB(i,2) = 0x42; @@ -1683,7 +1685,7 @@ int parse_tologin(int fd) { if (RFIFOREST(fd) < 50) return 0; for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { + if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) { if (sd->account_id == RFIFOL(fd,2)) { memcpy(sd->email, RFIFOP(fd,6), 40); if (e_mail_check(sd->email) == 0) @@ -1891,7 +1893,7 @@ int parse_tologin(int fd) { int j, k; struct char_session_data *sd2; for (j = 0; j < fd_max; j++) { - if (session[j] && (sd2 = session[j]->session_data) && + if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) && sd2->account_id == char_dat[char_num-1].account_id) { for (k = 0; k < 9; k++) { if (sd2->found_char[k] == char_num-1) { @@ -1946,8 +1948,8 @@ int parse_tologin(int fd) { { char buf[32000]; if (gm_account != NULL) - free(gm_account); - gm_account = calloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1); + aFree(gm_account); + gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1); GM_num = 0; for (i = 4; i < RFIFOW(fd,2); i = i + 5) { gm_account[GM_num].account_id = RFIFOL(fd,i); @@ -2158,7 +2160,7 @@ int parse_frommap(int fd) { if (j == online_players_max) { // create 256 new slots online_players_max += 256; - online_chars = realloc(online_chars, sizeof(struct online_chars) * online_players_max); + online_chars = (struct online_chars*)aRealloc(online_chars, sizeof(struct online_chars) * online_players_max); if (!online_chars) { printf("out of memory: parse_frommap - online_chars (realloc).\n"); exit(1); @@ -2515,7 +2517,7 @@ int parse_char(int fd) { return 0; } - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; while (RFIFOREST(fd) >= 2) { cmd = RFIFOW(fd,0); @@ -2539,7 +2541,7 @@ int parse_char(int fd) { // if (sd == NULL && cmd != 0x65 && cmd != 0x20b && cmd != 0x187 && // cmd != 0x2af8 && cmd != 0x7530 && cmd != 0x7532) // cmd = 0xffff; // パケットダンプを表示させる - + switch(cmd){ case 0x20b: //20040622暗号化ragexe対応 if (RFIFOREST(fd) < 19) @@ -2557,7 +2559,7 @@ int parse_char(int fd) { else printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2)); if (sd == NULL) { - sd = session[fd]->session_data = calloc(sizeof(struct char_session_data), 1); + sd = session[fd]->session_data = (struct char_session_data*)aCalloc(sizeof(struct char_session_data), 1); memset(sd, 0, sizeof(struct char_session_data)); memcpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server) @@ -2837,7 +2839,7 @@ int parse_char(int fd) { int j, k; struct char_session_data *sd2; for (j = 0; j < fd_max; j++) { - if (session[j] && (sd2 = session[j]->session_data) && + if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) && sd2->account_id == char_dat[char_num-1].account_id) { for (k = 0; k < 9; k++) { if (sd2->found_char[k] == char_num-1) { @@ -2947,29 +2949,29 @@ int parse_char(int fd) { // Console Command Parser [Wizputer] int parse_console(char *buf) { char *type,*command; - - type = (char *)malloc(64); - command = (char *)malloc(64); - + + type = (char *)aMalloc(64); + command = (char *)aMalloc(64); + memset(type,0,64); memset(command,0,64); - + printf("Console: %s\n",buf); - + if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 ) sscanf(buf,"%[^\n]",type); - + printf("Type of command: %s || Command: %s \n",type,command); - - if(buf) free(buf); - if(type) free(type); - if(command) free(command); - + + if(buf) aFree(buf); + if(type) aFree(type); + if(command) aFree(command); + return 0; } // 全てのMAPサーバーにデータ送信(送信したmap鯖の数を返す) -int mapif_sendall(unsigned char *buf, unsigned int len) { +int mapif_sendall(char *buf, unsigned int len) { int i, c; c = 0; @@ -2985,7 +2987,7 @@ int mapif_sendall(unsigned char *buf, unsigned int len) { } // 自分以外の全てのMAPサーバーにデータ送信(送信したmap鯖の数を返す) -int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { +int mapif_sendallwos(int sfd, char *buf, unsigned int len) { int i, c; c = 0; @@ -3000,7 +3002,7 @@ int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { return c; } // MAPサーバーにデータ送信(map鯖生存確認有り) -int mapif_send(int fd, unsigned char *buf, unsigned int len) { +int mapif_send(int fd, char *buf, unsigned int len) { int i; if (fd >= 0) { @@ -3349,19 +3351,19 @@ void do_final(void) { } create_online_files(); - if(online_chars) free(online_chars); + if(online_chars) aFree(online_chars); mmo_char_sync(); inter_save(); - if(gm_account) free(gm_account); - if(char_dat) free(char_dat); + if(gm_account) aFree(gm_account); + if(char_dat) aFree(char_dat); delete_session(login_fd); delete_session(char_fd); for(i = 0; i < fd_max; i++) - if(session[i] != NULL) free(session[i]); + if(session[i] != NULL) aFree(session[i]); char_log("----End of char-server (normal end with closing of all files)." RETCODE); } @@ -3377,14 +3379,14 @@ int do_init(int argc, char **argv) { // moved behind char_config_read in case we changed the filename [celest] char_log("The char-server starting..." RETCODE); - if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) { + if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) { // The char server should know what IP address it is running on // - MouseJstr int localaddr = ntohl(addr_[0]); unsigned char *ptr = (unsigned char *) &localaddr; char buf[16]; sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);; - if (naddr_ != 1) + if (naddr_ != 1) printf("Multiple interfaces detected.. using %s as our IP address\n", buf); else printf("Defaulting to %s as our IP address\n", buf); @@ -3393,9 +3395,9 @@ int do_init(int argc, char **argv) { if (char_ip_set_ == 0) strcpy(char_ip_str, buf); - if (ptr[0] == 192 && ptr[1] == 168) + if (ptr[0] == 192 && ptr[1] == 168) printf("Firewall detected.. edit lan_support.conf and char_athena.conf\n"); - } + } login_ip = inet_addr(login_ip_str); char_ip = inet_addr(char_ip_str); @@ -3406,7 +3408,7 @@ int do_init(int argc, char **argv) { } online_players_max = 256; - online_chars = calloc(sizeof(struct online_chars) * 256, 1); + online_chars = (struct online_chars*)aCalloc(sizeof(struct online_chars) * 256, 1); if (!online_chars) { printf("out of memory: do_init (calloc).\n"); exit(1); @@ -3432,7 +3434,7 @@ int do_init(int argc, char **argv) { add_timer_func_list(check_connect_login_server, "check_connect_login_server"); add_timer_func_list(send_users_tologin, "send_users_tologin"); add_timer_func_list(mmo_char_sync_timer, "mmo_char_sync_timer"); - + i = add_timer_interval(gettick() + 1000, check_connect_login_server, 0, 0, 10 * 1000); i = add_timer_interval(gettick() + 1000, send_users_tologin, 0, 0, 5 * 1000); i = add_timer_interval(gettick() + autosave_interval, mmo_char_sync_timer, 0, 0, autosave_interval); @@ -3446,12 +3448,12 @@ int do_init(int argc, char **argv) { add_timer_interval(gettick()+10, flush_timer,0,0,flush_time); - + if(anti_freeze_enable > 0) { add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system"); i = add_timer_interval(gettick() + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies } - + if(console) { set_defaultconsoleparse(parse_console); start_console(); diff --git a/src/char/char.h b/src/char/char.h index 3ee2f9f6d..c70facba1 100644 --- a/src/char/char.h +++ b/src/char/char.h @@ -20,9 +20,9 @@ struct mmo_map_server{ int search_character_index(char* character_name); char * search_character_name(int index); -int mapif_sendall(unsigned char *buf, unsigned int len); -int mapif_sendallwos(int fd,unsigned char *buf, unsigned int len); -int mapif_send(int fd,unsigned char *buf, unsigned int len); +int mapif_sendall(char *buf, unsigned int len); +int mapif_sendallwos(int fd,char *buf, unsigned int len); +int mapif_send(int fd,char *buf, unsigned int len); int char_log(char *fmt, ...); diff --git a/src/char/int_guild.c b/src/char/int_guild.c index 0ee4476fc..348008e1d 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -398,7 +398,7 @@ int inter_guild_init() { continue; } - g = calloc(sizeof(struct guild), 1); + g = aCalloc(sizeof(struct guild), 1); if(g == NULL){ printf("int_guild: out of memory!\n"); exit(0); @@ -412,7 +412,7 @@ int inter_guild_init() { guild_calcinfo(g); } else { printf("int_guild: broken data [%s] line %d\n", guild_txt, c); - free(g); + aFree(g); } c++; } @@ -426,7 +426,7 @@ int inter_guild_init() { } while(fgets(line, sizeof(line)-1, fp)) { - gc = calloc(sizeof(struct guild_castle), 1); + gc = aCalloc(sizeof(struct guild_castle), 1); if(gc == NULL){ printf("int_guild: out of memory!\n"); exit(0); @@ -436,7 +436,7 @@ int inter_guild_init() { numdb_insert(castle_db, gc->castle_id, gc); } else { printf("int_guild: broken data [%s] line %d\n", castle_txt, c); - free(gc); + aFree(gc); } c++; } @@ -445,7 +445,7 @@ int inter_guild_init() { printf(" %s - making Default Data...\n", castle_txt); //デフォルトデータを作成 for(i = 0; i < MAX_GUILDCASTLE; i++) { - gc = calloc(sizeof(struct guild_castle), 1); + gc = aCalloc(sizeof(struct guild_castle), 1); if (gc == NULL) { printf("int_guild: out of memory!\n"); exit(0); @@ -577,7 +577,7 @@ int guild_check_empty(struct guild *g) { numdb_erase(guild_db, g->guild_id); inter_guild_storage_delete(g->guild_id); mapif_guild_broken(g->guild_id, 0); - free(g); + aFree(g); return 1; } @@ -765,7 +765,7 @@ int mapif_guild_memberinfoshort(struct guild *g, int idx) { WBUFL(buf, 2) = g->guild_id; WBUFL(buf, 6) = g->member[idx].account_id; WBUFL(buf,10) = g->member[idx].char_id; - WBUFB(buf,14) = g->member[idx].online; + WBUFB(buf,14) = (unsigned char)g->member[idx].online; WBUFW(buf,15) = g->member[idx].lv; WBUFW(buf,17) = g->member[idx].class_; mapif_sendall(buf, 19); @@ -965,7 +965,7 @@ int mapif_parse_CreateGuild(int fd, int account_id, char *name, struct guild_mem mapif_guild_created(fd, account_id, NULL); return 0; } - g = calloc(sizeof(struct guild), 1); + g = aCalloc(sizeof(struct guild), 1); if (g == NULL) { printf("int_guild: CreateGuild: out of memory !\n"); mapif_guild_created(fd, account_id, NULL); @@ -1085,7 +1085,7 @@ int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, in } // オンライン/Lv更新 -int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, int char_id, int online, int lv, int class) { +int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, int char_id, int online, int lv, int class_) { struct guild *g; int i, alv, c; @@ -1101,7 +1101,7 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) { g->member[i].online = online; g->member[i].lv = lv; - g->member[i].class_ = class; + g->member[i].class_ = class_; mapif_guild_memberinfoshort(g, i); } if (g->member[i].account_id > 0) { @@ -1111,7 +1111,7 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, if (g->member[i].online) g->connect_member++; } - + if (c) // 平均レベル g->average_lv = alv / c; @@ -1147,7 +1147,7 @@ int mapif_parse_BreakGuild(int fd, int guild_id) { if(log_inter) inter_log("guild %s (id=%d) broken" RETCODE, g->name, guild_id); - free(g); + aFree(g); return 0; } diff --git a/src/char/int_party.c b/src/char/int_party.c index 194e96707..6b7f4361e 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -94,7 +94,7 @@ int inter_party_init() { continue; } - p = calloc(sizeof(struct party), 1); + p = aCalloc(sizeof(struct party), 1); if (p == NULL){ printf("int_party: out of memory!\n"); exit(0); @@ -107,7 +107,7 @@ int inter_party_init() { party_check_empty(p); } else { printf("int_party: broken data [%s] line %d\n", party_txt, c + 1); - free(p); + aFree(p); } c++; } @@ -199,7 +199,7 @@ int party_check_empty(struct party *p) { // 誰もいないので解散 mapif_party_broken(p->party_id, 0); numdb_erase(party_db, p->party_id); - free(p); + aFree(p); return 1; } @@ -391,7 +391,7 @@ int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char mapif_party_created(fd, account_id, NULL); return 0; } - p = calloc(sizeof(struct party), 1); + p = aCalloc(sizeof(struct party), 1); if (p == NULL) { printf("int_party: out of memory !\n"); mapif_party_created(fd,account_id,NULL); diff --git a/src/char/int_pet.c b/src/char/int_pet.c index c08c4ccf3..0dd334514 100644 --- a/src/char/int_pet.c +++ b/src/char/int_pet.c @@ -88,7 +88,7 @@ int inter_pet_init() if( (fp=fopen(pet_txt,"r"))==NULL ) return 1; while(fgets(line,sizeof(line),fp)){ - p=calloc(sizeof(struct s_pet), 1); + p=aCalloc(sizeof(struct s_pet), 1); if(p==NULL){ printf("int_pet: out of memory!\n"); exit(0); @@ -100,7 +100,7 @@ int inter_pet_init() numdb_insert(pet_db,p->pet_id,p); }else{ printf("int_pet: broken data [%s] line %d\n",pet_txt,c); - free(p); + aFree(p); } c++; } @@ -210,7 +210,7 @@ int mapif_create_pet(int fd,int account_id,int char_id,short pet_class,short pet short pet_equip,short intimate,short hungry,char rename_flag,char incuvate,char *pet_name) { struct s_pet *p; - p=malloc(sizeof(struct s_pet)); + p=aMalloc(sizeof(struct s_pet)); if(p==NULL){ printf("int_pet: out of memory !\n"); mapif_pet_created(fd,account_id,NULL); @@ -282,7 +282,7 @@ int mapif_save_pet(int fd,int account_id,struct s_pet *data) pet_id = data->pet_id; p=numdb_search(pet_db,pet_id); if(p == NULL) { - p=malloc(sizeof(struct s_pet)); + p=aMalloc(sizeof(struct s_pet)); if(p==NULL){ printf("int_pet: out of memory !\n"); mapif_save_pet_ack(fd,account_id,1); diff --git a/src/char/int_storage.c b/src/char/int_storage.c index 7a4022a55..73d50f323 100644 --- a/src/char/int_storage.c +++ b/src/char/int_storage.c @@ -192,7 +192,7 @@ struct storage *account2storage(int account_id) struct storage *s; s=numdb_search(storage_db,account_id); if(s == NULL) { - s = calloc(sizeof(struct storage), 1); + s = aCalloc(sizeof(struct storage), 1); if(s==NULL){ printf("int_storage: out of memory!\n"); exit(0); @@ -210,7 +210,7 @@ struct guild_storage *guild2storage(int guild_id) if(inter_guild_search(guild_id) != NULL) { gs=numdb_search(guild_storage_db,guild_id); if(gs == NULL) { - gs = calloc(sizeof(struct guild_storage), 1); + gs = aCalloc(sizeof(struct guild_storage), 1); if(gs==NULL){ printf("int_storage: out of memory!\n"); exit(0); @@ -242,7 +242,7 @@ int inter_storage_init() } while(fgets(line,65535,fp)){ sscanf(line,"%d",&tmp_int); - s=calloc(sizeof(struct storage), 1); + s=aCalloc(sizeof(struct storage), 1); if(s==NULL){ printf("int_storage: out of memory!\n"); exit(0); @@ -254,7 +254,7 @@ int inter_storage_init() } else{ printf("int_storage: broken data [%s] line %d\n",storage_txt,c); - free(s); + aFree(s); } c++; } @@ -270,7 +270,7 @@ int inter_storage_init() } while(fgets(line,65535,fp)){ sscanf(line,"%d",&tmp_int); - gs=calloc(sizeof(struct guild_storage), 1); + gs=aCalloc(sizeof(struct guild_storage), 1); if(gs==NULL){ printf("int_storage: out of memory!\n"); exit(0); @@ -282,7 +282,7 @@ int inter_storage_init() } else{ printf("int_storage: broken data [%s] line %d\n",guild_storage_txt,c); - free(gs); + aFree(gs); } c++; } @@ -356,7 +356,7 @@ int inter_storage_delete(int account_id) inter_pet_delete(*((long *)(&s->storage[i].card[2]))); } numdb_erase(storage_db,account_id); - free(s); + aFree(s); } return 0; } @@ -372,7 +372,7 @@ int inter_guild_storage_delete(int guild_id) inter_pet_delete(*((long *)(&gs->storage[i].card[2]))); } numdb_erase(guild_storage_db,guild_id); - free(gs); + aFree(gs); } return 0; } diff --git a/src/char/inter.c b/src/char/inter.c index a6e2a4199..f0fe38f60 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -114,7 +114,7 @@ int inter_accreg_init() { while(fgets(line, sizeof(line)-1, fp)){ line[sizeof(line)-1] = '\0'; - reg = calloc(sizeof(struct accreg), 1); + reg = aCalloc(sizeof(struct accreg), 1); if (reg == NULL) { printf("inter: accreg: out of memory!\n"); exit(0); @@ -123,7 +123,7 @@ int inter_accreg_init() { numdb_insert(accreg_db, reg->account_id, reg); } else { printf("inter: accreg: broken data [%s] line %d\n", accreg_txt, c); - free(reg); + aFree(reg); } c++; } @@ -371,7 +371,7 @@ int check_ttl_wisdata() { // removed. not send information after a timeout. Just no answer for the player //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target numdb_erase(wis_db, wd->id); - free(wd); + aFree(wd); } } while(wis_delnum >= WISDELLIST_MAX); @@ -423,7 +423,7 @@ int mapif_parse_WisRequest(int fd) { mapif_send(fd, buf, 27); } else { - wd = (struct WisData *)calloc(sizeof(struct WisData), 1); + wd = (struct WisData *)aCalloc(sizeof(struct WisData), 1); if (wd == NULL){ printf("inter: WisRequest: out of memory !\n"); return 0; @@ -458,7 +458,7 @@ int mapif_parse_WisReply(int fd) { if ((--wd->count) <= 0 || flag != 1) { mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target numdb_erase(wis_db, id); - free(wd); + aFree(wd); } return 0; @@ -481,7 +481,7 @@ int mapif_parse_AccReg(int fd) { struct accreg *reg = numdb_search(accreg_db, RFIFOL(fd,4)); if (reg == NULL) { - if ((reg = calloc(sizeof(struct accreg), 1)) == NULL) { + if ((reg = aCalloc(sizeof(struct accreg), 1)) == NULL) { printf("inter: accreg: out of memory !\n"); exit(0); } diff --git a/src/char_sql/char.c b/src/char_sql/char.c index d7f17515b..876ea991d 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -73,7 +73,7 @@ char login_db_level[32] = "level"; int lowest_gm_level = 1; -unsigned char *SQL_CONF_NAME = "conf/inter_athena.conf"; +char *SQL_CONF_NAME = "conf/inter_athena.conf"; struct mmo_map_server server[MAX_MAP_SERVERS]; int server_fd[MAX_MAP_SERVERS]; @@ -206,9 +206,9 @@ void set_char_offline(int char_id, int account_id) { if ( char_id == 99 ) sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id); else { - cp = numdb_search(char_db_,char_id); + cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id); if (cp != NULL) { - free(cp); + aFree(cp); numdb_erase(char_db_,char_id); } @@ -229,7 +229,7 @@ void set_char_offline(int char_id, int account_id) { //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { +int remove_control_chars(char *str) { int i; int change = 0; @@ -259,7 +259,7 @@ int isGM(int account_id) { void read_gm_account(void) { if (gm_account != NULL) - free(gm_account); + aFree(gm_account); GM_num = 0; sprintf(tmp_lsql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",login_db_account_id,login_db_level,login_db,login_db_level,lowest_gm_level); @@ -268,7 +268,7 @@ void read_gm_account(void) { } lsql_res = mysql_store_result(&lmysql_handle); if (lsql_res) { - gm_account = aCalloc(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1); + gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1); while ((lsql_row = mysql_fetch_row(lsql_res))) { gm_account[GM_num].account_id = atoi(lsql_row[0]); gm_account[GM_num].level = atoi(lsql_row[1]); @@ -329,7 +329,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ if (char_id!=p->char_id) return 0; - cp = numdb_search(char_db_,char_id); + cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id); if (cp == NULL) { cp = (struct mmo_charstatus *) aMalloc(sizeof(struct mmo_charstatus)); @@ -441,7 +441,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ //===================================================================================================== - if ((p->base_exp != cp->base_exp) || (p->class_ != cp->class_) || + if ((p->base_exp != cp->base_exp) || (p->class_ != cp->class_) || (p->base_level != cp->base_level) || (p->job_level != cp->job_level) || (p->job_exp != cp->job_exp) || (p->zeny != cp->zeny) || (p->last_point.x != cp->last_point.x) || (p->last_point.y != cp->last_point.y) || @@ -457,7 +457,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ (p->shield != cp->shield) || (p->head_top != cp->head_top) || (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom) || (p->partner_id != cp->partner_id)) { - + //}//---------------------------test count------------------------------ //check party_exist party_exist=0; @@ -546,7 +546,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ diff = 0; for(i=0;iskill[i].lv != 0) && (p->skill[i].id == 0)) + if ((p->skill[i].lv != 0) && (p->skill[i].id == 0)) p->skill[i].id = i; // Fix skill tree if((p->skill[i].id != cp->skill[i].id) || (p->skill[i].lv != cp->skill[i].lv) || @@ -589,7 +589,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ break; } } - + if (diff) { //printf("- Save global_reg_value data to MySQL!\n"); //`global_reg_value` (`char_id`, `str`, `value`) @@ -603,7 +603,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ if (p->global_reg[i].str) { if(p->global_reg[i].value !=0){ sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')", - reg_db, char_id, jstrescapecpy(temp_str,(unsigned char*)p->global_reg[i].str), p->global_reg[i].value); + reg_db, char_id, jstrescapecpy(temp_str,p->global_reg[i].str), p->global_reg[i].value); if(mysql_query(&mysql_handle, tmp_sql)) { printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle)); } @@ -612,9 +612,9 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ } } - // Friends list + // Friends list // account_id, friend_id0, name0, ... - + tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db); diff = 0; @@ -623,7 +623,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i); tmp_p += sprintf(tmp_p, ") VALUES (NULL, '%d'", char_id); - + for (i=0;i<20;i++) { tmp_p += sprintf(tmp_p, ", '%d', '%s'", p->friend_id[i], p->friend_name[i]); if ((p->friend_id[i] != cp->friend_id[i]) || @@ -633,7 +633,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ tmp_p += sprintf(tmp_p, ")"); - if (diff) + if (diff) mysql_query(&mysql_handle, tmp_sql); printf("saving char is done.\n"); @@ -882,9 +882,9 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){ char *tmp_p = tmp_sql; struct mmo_charstatus *cp; - cp = numdb_search(char_db_,char_id); + cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id); if (cp != NULL) - free(cp); + aFree(cp); memset(p, 0, sizeof(struct mmo_charstatus)); @@ -966,10 +966,10 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){ } else printf("char2 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!? - if (p->last_point.x == 0 || p->last_point.y == 0 || p->last_point.map[0] == '\0') + if (p->last_point.x == 0 || p->last_point.y == 0 || p->last_point.map[0] == '\0') memcpy(&p->last_point, &start_point, sizeof(start_point)); - if (p->save_point.x == 0 || p->save_point.y == 0 || p->save_point.map[0] == '\0') + if (p->save_point.x == 0 || p->save_point.y == 0 || p->save_point.map[0] == '\0') memcpy(&p->save_point, &start_point, sizeof(start_point)); printf("char2 "); @@ -1102,10 +1102,10 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){ sql_row = mysql_fetch_row(sql_res); i=mysql_num_rows(sql_res); - + // debugg //printf("mysql: %d\n",i); - + // Create an entry for the character if it doesnt already have one if(!i) { @@ -1188,15 +1188,15 @@ int mmo_char_sql_init(void) { printf("set char_id_count: %d.......\n",char_id_count); sprintf(tmp_sql , "REPLACE INTO `%s` SET `online`=0", char_db); - if (mysql_query(&mysql_handle, tmp_sql)) + if (mysql_query(&mysql_handle, tmp_sql)) printf("DB server Error - %s\n", mysql_error(&mysql_handle)); sprintf(tmp_sql , "REPLACE INTO `%s` SET `online`=0", guild_member_db); - if (mysql_query(&mysql_handle, tmp_sql)) + if (mysql_query(&mysql_handle, tmp_sql)) printf("DB server Error - %s\n", mysql_error(&mysql_handle)); sprintf(tmp_sql , "REPLACE INTO `%s` SET `connect_member`=0", guild_db); - if (mysql_query(&mysql_handle, tmp_sql)) + if (mysql_query(&mysql_handle, tmp_sql)) printf("DB server Error - %s\n", mysql_error(&mysql_handle)); printf("init end.......\n"); @@ -1212,10 +1212,10 @@ int make_new_char_sql(int fd, unsigned char *dat) { int i; //aphostropy error check! - fixed! - jstrescapecpy(t_name, dat); + jstrescapecpy(t_name, (char*)dat); printf("making new char -"); - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; // Check Authorised letters/symbols in the name of the character if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised @@ -1477,7 +1477,7 @@ int parse_tologin(int fd) { return 0; } - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; // hehe. no need to set user limite on SQL version. :P // but char limitation is good way to maintain server. :D @@ -1513,7 +1513,7 @@ int parse_tologin(int fd) { if(RFIFOREST(fd)<51) return 0; for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) { + if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) { if (RFIFOB(fd,6) != 0) { WFIFOW(i,0) = 0x6c; WFIFOB(i,2) = 0x42; @@ -1546,7 +1546,7 @@ int parse_tologin(int fd) { if (RFIFOREST(fd) < 50) return 0; for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { + if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) { if (sd->account_id == RFIFOL(fd,2)) { sd->connect_until_time = (time_t)RFIFOL(fd,46); break; @@ -1606,22 +1606,22 @@ int parse_tologin(int fd) { sql_res = mysql_store_result(&mysql_handle); if (sql_res) { - int char_id, jobclass, skill_point, class; + int char_id, jobclass, skill_point, class_; sql_row = mysql_fetch_row(sql_res); char_id = atoi(sql_row[0]); jobclass = atoi(sql_row[1]); skill_point = atoi(sql_row[2]); - class = jobclass; + class_ = jobclass; if (jobclass == 19 || jobclass == 20 || jobclass == 4020 || jobclass == 4021 || jobclass == 4042 || jobclass == 4043) { // job modification if (jobclass == 19 || jobclass == 20) { - class = (sex) ? 19 : 20; + class_ = (sex) ? 19 : 20; } else if (jobclass == 4020 || jobclass == 4021) { - class = (sex) ? 4020 : 4021; + class_ = (sex) ? 4020 : 4021; } else if (jobclass == 4042 || jobclass == 4043) { - class = (sex) ? 4042 : 4043; + class_ = (sex) ? 4042 : 4043; } // remove specifical skills of classes 19,20 4020,4021 and 4042,4043 sprintf(tmp_sql, "SELECT `lv` FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id); @@ -1644,7 +1644,7 @@ int parse_tologin(int fd) { if (mysql_query(&mysql_handle, tmp_sql)) { printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); } - sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'",char_db, class, skill_point, char_id); + sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'",char_db, class_, skill_point, char_id); if (mysql_query(&mysql_handle, tmp_sql)) { printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); } @@ -1652,7 +1652,7 @@ int parse_tologin(int fd) { } // disconnect player if online on char-server for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { + if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) { if (sd->account_id == acc) { session[i]->eof = 1; break; @@ -1706,7 +1706,7 @@ int parse_tologin(int fd) { } // disconnect player if online on char-server for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { + if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) { if (sd->account_id == RFIFOL(fd,2)) { session[i]->eof = 1; break; @@ -2296,7 +2296,7 @@ int parse_char(int fd) { struct char_session_data *sd; unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; if(login_fd < 0) session[fd]->eof = 1; @@ -2353,7 +2353,7 @@ int parse_char(int fd) { */ if (sd == NULL) { CREATE(session[fd]->session_data, struct char_session_data, 1); - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server) } sd->account_id = RFIFOL(fd, 2); @@ -2843,15 +2843,15 @@ int parse_console(char *buf) { printf("Type of command: %s || Command: %s \n",type,command); - if(buf) free(buf); - if(type) free(type); - if(command) free(command); + if(buf) aFree(buf); + if(type) aFree(type); + if(command) aFree(command); return 0; } // MAP send all -int mapif_sendall(unsigned char *buf, unsigned int len) { +int mapif_sendall(char *buf, unsigned int len) { int i, c; int fd; @@ -2867,7 +2867,7 @@ int mapif_sendall(unsigned char *buf, unsigned int len) { return c; } -int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { +int mapif_sendallwos(int sfd, char *buf, unsigned int len) { int i, c; int fd; @@ -2883,7 +2883,7 @@ int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { return c; } -int mapif_send(int fd, unsigned char *buf, unsigned int len) { +int mapif_send(int fd, char *buf, unsigned int len) { int i; if (fd >= 0) { @@ -3016,12 +3016,12 @@ void do_final(void) { printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle)); if(gm_account) { - free(gm_account); + aFree(gm_account); gm_account = 0; } if(char_dat) { - free(char_dat); + aFree(char_dat); char_dat = 0; } diff --git a/src/char_sql/char.h b/src/char_sql/char.h index c7261650b..17a938780 100644 --- a/src/char_sql/char.h +++ b/src/char_sql/char.h @@ -41,9 +41,9 @@ struct itemtemp{ struct itemtmp equip[MAX_GUILD_STORAGE],notequip[MAX_GUILD_STORAGE]; }; int memitemdata_to_sql(struct itemtemp mapitem, int eqcount, int noteqcount, int char_id,int tableswitch); -int mapif_sendall(unsigned char *buf,unsigned int len); -int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len); -int mapif_send(int fd,unsigned char *buf,unsigned int len); +int mapif_sendall(char *buf,unsigned int len); +int mapif_sendallwos(int fd,char *buf,unsigned int len); +int mapif_send(int fd,char *buf,unsigned int len); extern int autosave_interval; extern char db_path[]; diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c index 3f9243bfe..e3b8d30a8 100644 --- a/src/char_sql/int_guild.c +++ b/src/char_sql/int_guild.c @@ -46,7 +46,7 @@ static int _erase_guild(void *key, void *data, va_list ap) { int guild = va_arg(ap, int); struct guild_castle * castle = (struct guild_castle *) data; if (castle->guild_id == guild) { - free(castle); + aFree(castle); db_erase(castle_db_, key); } @@ -60,21 +60,21 @@ int inter_guild_tosql(struct guild *g,int flag) // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`) - // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) + // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) // 32 `guild_skill` (`guild_id`,`id`,`lv`) - + char t_name[100],t_master[24],t_mes1[60],t_mes2[240],t_member[24],t_position[24],t_alliance[24]; // temporay storage for str convertion; char t_ename[24],t_emes[40]; char emblem_data[4096]; int i=0; int guild_exist=0,guild_member=0,guild_online_member=0; - + if (g->guild_id<=0) return -1; - + printf("(\033[1;35m%d\033[0m) Request save guild -(flag 0x%x) ",g->guild_id, flag); - + jstrescapecpy(t_name, g->name); - + //printf("- Check if guild %d exists\n",g->guild_id); sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db,g->guild_id); if(mysql_query(&mysql_handle, tmp_sql) ) { @@ -87,7 +87,7 @@ int inter_guild_tosql(struct guild *g,int flag) //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); } mysql_free_result(sql_res) ; //resource free - + if (guild_exist >0){ // Check members in party sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id); @@ -98,13 +98,13 @@ int inter_guild_tosql(struct guild *g,int flag) sql_res = mysql_store_result(&mysql_handle) ; if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { sql_row = mysql_fetch_row(sql_res); - + guild_member = atoi (sql_row[0]); // printf("- Check members in guild %d : %d \n",g->guild_id,guild_member); } mysql_free_result(sql_res) ; //resource free - + // Delete old guild from sql if (flag&1||guild_member==0){ // printf("- Delete guild %d from guild\n",g->guild_id); @@ -164,7 +164,7 @@ int inter_guild_tosql(struct guild *g,int flag) sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, g->guild_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `guild_castle`)- %s\n", mysql_error(&mysql_handle) ); - } + } db_foreach(castle_db_, _erase_guild, g->guild_id); } } @@ -175,14 +175,14 @@ int inter_guild_tosql(struct guild *g,int flag) if (g->member[i].account_id>0) guild_online_member++; i++; } - + // No member in guild , no need to create it in sql if (guild_member <= 0 && guild_online_member <=0) { inter_guild_storage_delete(g->guild_id); printf("No member in guild %d , break it! \n",g->guild_id); return -2; } - + // Insert new guild to sqlserver if (flag&1||guild_member==0){ int len=0; @@ -190,7 +190,7 @@ int inter_guild_tosql(struct guild *g,int flag) for(i=0;iemblem_len;i++){ len+=sprintf(emblem_data+len,"%02x",(unsigned char)(g->emblem_data[i])); //printf("%02x",(unsigned char)(g->emblem_data[i])); - } + } emblem_data[len] = '\0'; //printf("- emblem_len = %d \n",g->emblem_len); sprintf(tmp_sql,"INSERT INTO `%s` " @@ -204,7 +204,7 @@ int inter_guild_tosql(struct guild *g,int flag) printf("DB server Error (insert `guild`)- %s\n", mysql_error(&mysql_handle) ); } } - + if (flag&2||guild_member==0){ struct StringBuf sbuf; struct StringBuf sbuf2; @@ -238,16 +238,16 @@ int inter_guild_tosql(struct guild *g,int flag) } StringBuf_Printf(&sbuf2,")"); - if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf))) + if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf))) printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf2))) + if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf2))) printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); StringBuf_Destroy(&sbuf2); StringBuf_Destroy(&sbuf); } - + if (flag&4||guild_member==0){ //printf("- Insert guild %d to guild_position\n",g->guild_id); for(i=0;i0) { sql_row = mysql_fetch_row(sql_res); if (sql_row==NULL) { mysql_free_result(sql_res); - free(g); + aFree(g); return 0; } - + g->guild_id=atoi(sql_row[0]); strncpy(g->name,sql_row[1],24); strncpy(g->master,sql_row[2],24); @@ -382,7 +382,7 @@ struct guild * inter_guild_fromsql(int guild_id) if(c2>='a' && c2<='f')x2=c2-'a'+10; if(c2>='A' && c2<='F')x2=c2-'A'+10; g->emblem_data[i]=(x1<<4)|x2; - } + } } mysql_free_result(sql_res); @@ -392,7 +392,7 @@ struct guild * inter_guild_fromsql(int guild_id) //printf(" %s\n",tmp_sql); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `guild_member`)- %s\n", mysql_error(&mysql_handle) ); - free(g); + aFree(g); return 0; } sql_res = mysql_store_result(&mysql_handle) ; @@ -415,33 +415,33 @@ struct guild * inter_guild_fromsql(int guild_id) } } mysql_free_result(sql_res); - + //printf("- Read guild_position %d from sql \n",guild_id); sprintf(tmp_sql,"SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id); //printf(" %s\n",tmp_sql); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - free(g); + aFree(g); return 0; } sql_res = mysql_store_result(&mysql_handle) ; if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { int i; for(i=0;((sql_row = mysql_fetch_row(sql_res))&&iposition[position]; - strncpy(p->name,sql_row[2],24); + strncpy(p->name,sql_row[2],24); p->mode=atoi(sql_row[3]); - p->exp_mode=atoi(sql_row[4]); + p->exp_mode=atoi(sql_row[4]); } } - mysql_free_result(sql_res); + mysql_free_result(sql_res); //printf("- Read guild_alliance %d from sql \n",guild_id); sprintf(tmp_sql,"SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, guild_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `guild_alliance`)- %s\n", mysql_error(&mysql_handle) ); - free(g); + aFree(g); return 0; } sql_res = mysql_store_result(&mysql_handle) ; @@ -455,12 +455,12 @@ struct guild * inter_guild_fromsql(int guild_id) } } mysql_free_result(sql_res); - + //printf("- Read guild_expulsion %d from sql \n",guild_id); sprintf(tmp_sql,"SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) ); - free(g); + aFree(g); return 0; } sql_res = mysql_store_result(&mysql_handle) ; @@ -476,16 +476,16 @@ struct guild * inter_guild_fromsql(int guild_id) e->rsv1=atoi(sql_row[5]); e->rsv2=atoi(sql_row[6]); e->rsv3=atoi(sql_row[7]); - + } } mysql_free_result(sql_res); - + //printf("- Read guild_skill %d from sql \n",guild_id); sprintf(tmp_sql,"SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",guild_skill_db, guild_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `guild_skill`)- %s\n", mysql_error(&mysql_handle) ); - free(g); + aFree(g); return 0; } sql_res = mysql_store_result(&mysql_handle) ; @@ -497,7 +497,7 @@ struct guild * inter_guild_fromsql(int guild_id) } } mysql_free_result(sql_res); - + // printf("Successfully retrieve guild information from sql!\n"); numdb_insert(guild_db_, guild_id,g); @@ -542,8 +542,8 @@ int inter_guildcastle_tosql(struct guild_castle *gc) "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`," "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`," "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)" - "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')", - guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime, + "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')", + guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime, gc->createTime, gc->visibleC, gc->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, gc->visibleG5, gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7); //printf(" %s\n",tmp_sql); @@ -558,7 +558,7 @@ int inter_guildcastle_tosql(struct guild_castle *gc) printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); return 0; } - + sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='%d' WHERE `guild_id`='%d'",guild_db, gc->castle_id,gc->guild_id); //printf(" %s\n",tmp_sql); if(mysql_query(&mysql_handle, tmp_sql) ) { @@ -567,7 +567,7 @@ int inter_guildcastle_tosql(struct guild_castle *gc) } db_foreach(guild_db_, _set_guild_castle, gc->castle_id,gc->guild_id); - + return 0; } // Read guild_castle from sql @@ -603,7 +603,7 @@ int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc) mysql_free_result(sql_res); return 0; } - + gc->guild_id = atoi (sql_row[1]); gc->economy = atoi (sql_row[2]); gc->defense = atoi (sql_row[3]); @@ -629,7 +629,7 @@ int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc) gc->Ghp5 = atoi (sql_row[23]); gc->Ghp6 = atoi (sql_row[24]); gc->Ghp7 = atoi (sql_row[25]); - + //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id); } @@ -647,7 +647,7 @@ int inter_guild_readdb() FILE *fp; char line[1024]; for (i=0;i<100;i++) guild_exp[i]=0; - + fp=fopen("db/exp_guild.txt","r"); if(fp==NULL){ printf("can't read db/exp_guild.txt\n"); @@ -676,14 +676,14 @@ int inter_guild_sql_init() guild_expcache_db_=numdb_init(); guild_infoevent_db_=numdb_init(); guild_castleinfoevent_db_=numdb_init(); - + printf("interserver guild memory initialize.... (%d byte)\n",sizeof(struct guild)); guild_pt = aCalloc(sizeof(struct guild), 1); guild_pt2= aCalloc(sizeof(struct guild), 1); guildcastle_pt=aCalloc(sizeof(struct guild_castle), 1); - + inter_guild_readdb(); // Read exp - + sprintf (tmp_sql , "SELECT count(*) FROM `%s`",guild_db); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); @@ -702,13 +702,13 @@ int inter_guild_sql_init() printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); exit(0); } - + sql_res = mysql_store_result(&mysql_handle) ; sql_row = mysql_fetch_row(sql_res); guild_newid = atoi(sql_row[0])+1; mysql_free_result(sql_res); } - + printf("set guild_newid: %d.......\n",guild_newid); return 0; @@ -743,7 +743,7 @@ int guild_check_empty(struct guild *g) return 0; } } - + // 誰もいないので解散 mapif_guild_broken(g->guild_id,0); inter_guild_storage_delete(g->guild_id); @@ -795,7 +795,7 @@ int guild_calcinfo(struct guild *g) nextexp = guild_nextexp(g->guild_lv); } } - + // ギルドの次の経験値 g->next_exp = guild_nextexp(g->guild_lv); @@ -809,13 +809,13 @@ int guild_calcinfo(struct guild *g) if(g->member[i].account_id>0){ g->average_lv+=g->member[i].lv; c++; - + if(g->member[i].online>0) g->connect_member++; } } if(c) g->average_lv/=c; - + // 全データを送る必要がありそう if( g->max_member!=before.max_member || g->guild_lv!=before.guild_lv || @@ -823,7 +823,7 @@ int guild_calcinfo(struct guild *g) mapif_guild_info(-1,g); return 1; } - + return 0; } @@ -906,7 +906,7 @@ int mapif_guild_memberinfoshort(struct guild *g,int idx) WBUFL(buf, 2)=g->guild_id; WBUFL(buf, 6)=g->member[idx].account_id; WBUFL(buf,10)=g->member[idx].char_id; - WBUFB(buf,14)=g->member[idx].online; + WBUFB(buf,14)=(unsigned char)g->member[idx].online; WBUFW(buf,15)=g->member[idx].lv; WBUFW(buf,17)=g->member[idx].class_; mapif_sendall(buf,19); @@ -1121,7 +1121,7 @@ int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member { struct guild *g; int i; - + printf("CreateGuild\n"); g=search_guildname(name); if(g!=NULL&&g->guild_id>0){ @@ -1135,38 +1135,38 @@ int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member memcpy(g->name,name,24); memcpy(g->master,master->name,24); memcpy(&g->member[0],master,sizeof(struct guild_member)); - + g->position[0].mode=0x11; strcpy(g->position[ 0].name,"GuildMaster"); strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie"); for(i=1;iposition[i].name,"Position %d",i+1); - + // Initialize guild property g->max_member=16; g->average_lv=master->lv; g->castle_id=-1; for(i=0;iskill[i].id=i + GD_SKILLBASE; - + // Save to sql printf("Create initialize OK!\n"); i=inter_guild_tosql(g,255); - + if (i<0) { mapif_guild_created(fd,account_id,NULL); return 0; } - + // Report to client mapif_guild_created(fd,account_id,g); mapif_guild_info(fd,g); - + if(log_inter) inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE, name, g->guild_id, master->name, master->account_id ); - - + + return 0; } // Return guild info to client @@ -1191,10 +1191,10 @@ int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m) mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1); return 0; } - + for(i=0;imax_member;i++){ if(g->member[i].account_id==0){ - + memcpy(&g->member[i],m,sizeof(struct guild_member)); mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,0); guild_calcinfo(g); @@ -1211,7 +1211,7 @@ int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m) int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes) { struct guild *g= inter_guild_fromsql(guild_id); - + if(g!=NULL&&g->guild_id>0){ int i; for(i=0;imax_member;i++){ @@ -1219,7 +1219,7 @@ int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int fl g->member[i].char_id==char_id){ printf("%d %d\n",i, (int)(&g->member[i])); printf("%d %s\n",i, g->member[i].name); - + if(flag){ // 追放の場合追放リストに入れる int j; for(j=0;jexplusion[j].name,g->member[i].name,24); memcpy(g->explusion[j].mes,mes,40); } - + mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); printf("%d %d\n",i, (int)(&g->member[i])); printf("%d %s\n",i, (&g->member[i])->name); memset(&g->member[i],0,sizeof(struct guild_member)); - + if( guild_check_empty(g)==0 ) mapif_guild_info(-1,g);// まだ人がいるのでデータ送信 /* @@ -1259,12 +1259,12 @@ int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int fl } /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */ } - + return 0; } // Change member info int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id, - int account_id,int char_id,int online,int lv,int class) + int account_id,int char_id,int online,int lv,int class_) { // Could speed up by manipulating only guild_member struct guild * g= inter_guild_fromsql(guild_id); @@ -1272,18 +1272,18 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id, if(g==NULL||g->guild_id<=0) return 0; - + g->connect_member=0; idx = -1; - + for(i=0,alv=0,c=0;imax_member;i++){ if( g->member[i].account_id==account_id && g->member[i].char_id==char_id){ - + g->member[i].online=online; g->member[i].lv=lv; - g->member[i].class_=class; + g->member[i].class_=class_; mapif_guild_memberinfoshort(g,i); idx = i; } @@ -1300,13 +1300,13 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id, g->average_lv=alv/c; sprintf(tmp_sql, "UPDATE `%s` SET `connect_member`=%d,`average_lv`=%d WHERE `guild_id`='%d'", guild_db, g->connect_member, g->average_lv, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) + if(mysql_query(&mysql_handle, tmp_sql) ) printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) ); sprintf(tmp_sql, "UPDATE `%s` SET `online`=%d,`lv`=%d,`class`=%d WHERE `char_id`=%d", guild_member_db, g->member[idx].online, g->member[idx].lv, g->member[idx].class_, g->member[idx].char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) + if(mysql_query(&mysql_handle, tmp_sql) ) printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) ); - + return 0; } @@ -1316,7 +1316,7 @@ int mapif_parse_BreakGuild(int fd,int guild_id) struct guild *g= inter_guild_fromsql(guild_id); if(g==NULL) return 0; - + // Delete guild from sql //printf("- Delete guild %d from guild\n",guild_id); sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id); @@ -1348,7 +1348,7 @@ int mapif_parse_BreakGuild(int fd,int guild_id) if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) ); } - + //printf("- Delete guild %d from guild_castle\n",guild_id); sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, guild_id); if(mysql_query(&mysql_handle, tmp_sql) ) { @@ -1356,19 +1356,19 @@ int mapif_parse_BreakGuild(int fd,int guild_id) } db_foreach(castle_db_, _erase_guild, guild_id); - + //printf("- Update guild %d of char\n",guild_id); sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, guild_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) ); } - + inter_guild_storage_delete(guild_id); mapif_guild_broken(guild_id,0); - + if(log_inter) inter_log("guild %s (id=%d) broken" RETCODE,g->name,guild_id); - + return 0; } @@ -1416,7 +1416,7 @@ int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int cha struct guild * g = inter_guild_fromsql(guild_id); //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER"); - + if(g==NULL){ return 0; } @@ -1437,7 +1437,7 @@ int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int cha inter_guild_tosql(g,3); // Change guild & guild_member break; } - case GMI_EXP: + case GMI_EXP: { // EXP int exp,oldexp=g->member[i].exp; exp=g->member[i].exp=*((unsigned int *)data); @@ -1447,11 +1447,11 @@ int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int cha mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len); sprintf(tmp_sql, "UPDATE `%s` SET `guild_lv`=%d,`connect_member`=%d,`max_member`=%d,`average_lv`=%d,`exp`=%d,`next_exp`=%d,`skill_point`=%d WHERE `guild_id`='%d'", guild_db, g->guild_lv, g->connect_member, g->max_member, g->average_lv, g->exp, g->next_exp, g->skill_point, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) + if(mysql_query(&mysql_handle, tmp_sql) ) printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) ); sprintf(tmp_sql, "UPDATE `%s` SET `exp`=%d WHERE `char_id`=%d", guild_member_db, g->member[i].exp, g->member[i].char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) + if(mysql_query(&mysql_handle, tmp_sql) ) printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) ); break; } @@ -1488,7 +1488,7 @@ int mapif_parse_GuildSkillUp(int fd,int guild_id,int skill_num,int account_id) if(g == NULL || idx < 0 || idx >= MAX_GUILDSKILL) return 0; //printf("GuildSkillUp\n"); - + if( g->skill_point>0 && g->skill[idx].id>0 && g->skill[idx].lv<10 ){ g->skill[idx].lv++; @@ -1511,10 +1511,10 @@ int mapif_parse_GuildAlliance(int fd,int guild_id1,int guild_id2, int j,i; g[0]= inter_guild_fromsql(guild_id1); g[1]= inter_guild_fromsql(guild_id2); - + if(g[0]==NULL || g[1]==NULL || g[0]->guild_id ==0 || g[1]->guild_id==0) return 0; - + if(!(flag&0x8)){ for(i=0;i<2-(flag&1);i++){ for(j=0;jguild_id<=0) return 0; memcpy(g->mes1,mes1,60); @@ -1557,7 +1557,7 @@ int mapif_parse_GuildNotice(int fd,int guild_id,const char *mes1,const char *mes int mapif_parse_GuildEmblem(int fd,int len,int guild_id,int dummy,const char *data) { struct guild * g= inter_guild_fromsql(guild_id); - + if(g==NULL||g->guild_id<=0) return 0; memcpy(g->emblem_data,data,len); diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c index af3ad7dc3..9ea3a5635 100644 --- a/src/char_sql/int_party.c +++ b/src/char_sql/int_party.c @@ -207,7 +207,7 @@ int inter_party_sql_init(){ //memory alloc printf("interserver party memory initialize.... (%d byte)\n",sizeof(struct party)); - party_pt = calloc(sizeof(struct party), 1); + party_pt = aCalloc(sizeof(struct party), 1); sprintf (tmp_sql , "SELECT count(*) FROM `%s`",party_db); if(mysql_query(&mysql_handle, tmp_sql) ) { diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c index 44151c8e4..18172b066 100644 --- a/src/char_sql/int_pet.c +++ b/src/char_sql/int_pet.c @@ -105,7 +105,7 @@ int inter_pet_sql_init(){ //memory alloc printf("interserver pet memory initialize.... (%d byte)\n",sizeof(struct s_pet)); - pet_pt = calloc(sizeof(struct s_pet), 1); + pet_pt = aCalloc(sizeof(struct s_pet), 1); sprintf (tmp_sql , "SELECT count(*) FROM `%s`", pet_db); if(mysql_query(&mysql_handle, tmp_sql) ) { diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c index 69eaf2469..e2d4010a1 100644 --- a/src/char_sql/int_storage.c +++ b/src/char_sql/int_storage.c @@ -191,8 +191,8 @@ int inter_storage_sql_init(){ //memory alloc printf("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage)); - storage_pt=calloc(sizeof(struct storage), 1); - guild_storage_pt=calloc(sizeof(struct guild_storage), 1); + storage_pt=aCalloc(sizeof(struct storage), 1); + guild_storage_pt=aCalloc(sizeof(struct guild_storage), 1); memset(storage_pt,0,sizeof(struct storage)); memset(guild_storage_pt,0,sizeof(struct guild_storage)); diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c index 52a53f702..92a002898 100644 --- a/src/char_sql/inter.c +++ b/src/char_sql/inter.c @@ -402,7 +402,7 @@ int check_ttl_wisdata() { // removed. not send information after a timeout. Just no answer for the player //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target numdb_erase(wis_db, wd->id); - free(wd); + aFree(wd); } } while(wis_delnum >= WISDELLIST_MAX); @@ -490,7 +490,7 @@ int mapif_parse_WisReply(int fd) { if ((--wd->count) <= 0 || flag != 1) { mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target numdb_erase(wis_db, id); - free(wd); + aFree(wd); } return 0; diff --git a/src/char_sql/itemdb.c b/src/char_sql/itemdb.c index 0bed07c23..efd3df84b 100644 --- a/src/char_sql/itemdb.c +++ b/src/char_sql/itemdb.c @@ -172,7 +172,7 @@ static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map // Insert a new row into the item database /* - id = calloc(sizeof(struct item_data), 1); + id = aCalloc(sizeof(struct item_data), 1); if (id == NULL) { printf("out of memory : itemdb_read_sqldb\n"); @@ -214,10 +214,10 @@ static int itemdb_final(void *key,void *data,va_list ap) id=data; if(id->use_script) - free(id->use_script); + aFree(id->use_script); if(id->equip_script) - free(id->equip_script); - free(id); + aFree(id->equip_script); + aFree(id); return 0; } diff --git a/src/char_sql/itemdb.h b/src/char_sql/itemdb.h index dea835e78..762873c8e 100644 --- a/src/char_sql/itemdb.h +++ b/src/char_sql/itemdb.h @@ -6,7 +6,7 @@ struct item_data { char name[24],jname[24]; int value_buy,value_sell,value_notdc,value_notoc; int type; - int class; + int class_; int sex; int equip; int weight; diff --git a/src/common/core.c b/src/common/core.c index 493aab850..a8c922fc3 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -9,6 +9,7 @@ #include #include +#include "../common/mmo.h" #include "core.h" #include "socket.h" #include "timer.h" diff --git a/src/common/db.c b/src/common/db.c index bc4e8451b..d76b7a44c 100644 --- a/src/common/db.c +++ b/src/common/db.c @@ -424,7 +424,7 @@ void* db_erase(struct dbt *table,void* key) #ifdef MALLOC_DBN free_dbn(p); #else - free(p); + aFree(p); #endif return data; } @@ -497,11 +497,11 @@ void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...) #ifdef MALLOC_DBN free_dbn(p); #else - free(p); + aFree(p); #endif p=pn; } } - free(table); + aFree(table); va_end(ap); } diff --git a/src/common/grfio.c b/src/common/grfio.c index 440c3b2a3..6afd1d668 100644 --- a/src/common/grfio.c +++ b/src/common/grfio.c @@ -25,8 +25,6 @@ #include #include -#include - #include "utils.h" #include "grfio.h" #include "mmo.h" @@ -284,7 +282,7 @@ static void decode_des_etc(BYTE *buf,int len,int type,int cycle) * Grf data decode sub : zip *------------------------------------------ */ -int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen) +int decode_zip(char *dest, unsigned long* destLen, const char* source, unsigned long sourceLen) { z_stream stream; int err; @@ -301,21 +299,21 @@ int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; - err = inflateInit(&stream); + err = zlib_inflateInit(&stream); if (err != Z_OK) return err; - err = inflate(&stream, Z_FINISH); + err = zlib_inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { - inflateEnd(&stream); + zlib_inflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; - err = inflateEnd(&stream); + err = zlib_inflateEnd(&stream); return err; } -int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen) { +int encode_zip(char *dest, unsigned long* destLen, const char* source, unsigned long sourceLen) { z_stream stream; int err; @@ -513,14 +511,14 @@ int grfio_size(char *fname) char lfname[256],*rname,*p; FILELIST lentry; struct stat st; - + if(strcmp(data_dir, "") != 0 && (rname=grfio_resnametable(fname,lfname))!=NULL) { //printf("%s\t",fname); //sprintf(rname,"%s",grfio_resnametable(fname,lfname)); //printf("%s\n",rname); sprintf(lfname,"%s%s",data_dir,rname); //printf("%s\n",lfname); - } + } for(p=&lfname[0];*p!=0;p++) if (*p=='\\') *p = '/'; // * At the time of Unix @@ -557,7 +555,7 @@ void* grfio_reads(char *fname, int *size) strncpy(lfname,fname,255); // i hope this is the correct way =p [celest] - if ((rname=grfio_resnametable(fname,lfname))!=NULL) { + if ((rname=grfio_resnametable(fname,lfname))!=NULL) { char tbuf[255]; //sprintf(rname,"%s",grfio_resnametable(fname,lfname)); sprintf(tbuf,"%s%s",data_dir,rname); @@ -576,7 +574,7 @@ void* grfio_reads(char *fname, int *size) lentry.declen = ftell(in); } fseek(in,0,0); // SEEK_SET - buf2 = (unsigned char *) aCalloc(lentry.declen+1024, 1); + buf2 = (unsigned char *) aCallocA(lentry.declen+1024, 1); if (buf2==NULL) { printf("file read memory allocate error : declen\n"); goto errret; @@ -592,13 +590,13 @@ void* grfio_reads(char *fname, int *size) } else { printf("%s not found (grfio_reads)\n", fname); //goto errret; - free(buf2); + aFree(buf2); return NULL; } } } if (entry!=NULL && entry->gentry>0) { // Archive[GRF] File Read - buf = (unsigned char *) aCalloc(entry->srclen_aligned+1024, 1); + buf = (unsigned char *) aCallocA(entry->srclen_aligned+1024, 1); if (buf==NULL) { printf("file read memory allocate error : srclen_aligned\n"); goto errret; @@ -608,13 +606,13 @@ void* grfio_reads(char *fname, int *size) if(in==NULL) { printf("%s not found (grfio_reads)\n",gfname); //goto errret; - free(buf); + aFree(buf); return NULL; } fseek(in,entry->srcpos,0); fread(buf,1,entry->srclen_aligned,in); fclose(in); - buf2 = (unsigned char *) aCalloc(entry->declen+1024, 1); + buf2 = (unsigned char *) aCallocA(entry->declen+1024, 1); if (buf2==NULL) { printf("file decode memory allocate error\n"); goto errret; @@ -633,14 +631,14 @@ void* grfio_reads(char *fname, int *size) } else { memcpy(buf2,buf,entry->declen); } - free(buf); + aFree(buf); } if (size!=NULL && entry!=NULL) *size = entry->declen; return buf2; errret: - if (buf!=NULL) free(buf); - if (buf2!=NULL) free(buf2); + if (buf!=NULL) aFree(buf); + if (buf2!=NULL) aFree(buf2); if (in!=NULL) fclose(in); return NULL; } @@ -704,7 +702,7 @@ static int grfio_entryread(char *gfname,int gentry) if (grf_version==0x01) { //****** Grf version 01xx ****** list_size = grf_size-ftell(fp); - grf_filelist = (unsigned char *) aCalloc(list_size, 1); + grf_filelist = (unsigned char *) aCallocA(list_size, 1); if(grf_filelist==NULL){ fclose(fp); printf("out of memory : grf_filelist\n"); @@ -727,7 +725,7 @@ static int grfio_entryread(char *gfname,int gentry) fname = decode_filename(grf_filelist+ofs+6,grf_filelist[ofs]-6); if(strlen((const char *) fname)>sizeof(aentry.fn)-1){ printf("file name too long : %s\n",fname); - free(grf_filelist); + aFree(grf_filelist); exit(1); } srclen=0; @@ -762,7 +760,7 @@ static int grfio_entryread(char *gfname,int gentry) } ofs = ofs2 + 17; } - free(grf_filelist); + aFree(grf_filelist); } else if (grf_version==0x02) { //****** Grf version 02xx ****** unsigned char eheader[8]; @@ -779,15 +777,15 @@ static int grfio_entryread(char *gfname,int gentry) return 4; } - rBuf = (unsigned char *) aCalloc( rSize , 1); // Get a Read Size + rBuf = (unsigned char *) aCallocA( rSize , 1); // Get a Read Size if (rBuf==NULL) { fclose(fp); printf("out of memory : grf compress entry table buffer\n"); return 3; } - grf_filelist = (unsigned char *) aCalloc( eSize , 1); // Get a Extend Size + grf_filelist = (unsigned char *) aCallocA( eSize , 1); // Get a Extend Size if (grf_filelist==NULL) { - free(rBuf); + aFree(rBuf); fclose(fp); printf("out of memory : grf extract entry table buffer\n"); return 3; @@ -796,7 +794,7 @@ static int grfio_entryread(char *gfname,int gentry) fclose(fp); decode_zip(grf_filelist,&eSize,rBuf,rSize); // Decode function list_size = eSize; - free(rBuf); + aFree(rBuf); entrys = getlong(grf_header+0x26) - 7; @@ -808,7 +806,7 @@ static int grfio_entryread(char *gfname,int gentry) fname = grf_filelist+ofs; if (strlen((const char *) fname)>sizeof(aentry.fn)-1) { printf("grf : file name too long : %s\n",fname); - free(grf_filelist); + aFree(grf_filelist); exit(1); } ofs2 = ofs+strlen(grf_filelist+ofs)+1; @@ -839,7 +837,7 @@ static int grfio_entryread(char *gfname,int gentry) } ofs = ofs2 + 17; } - free(grf_filelist); + aFree(grf_filelist); } else { //****** Grf Other version ****** fclose(fp); @@ -859,11 +857,11 @@ static int grfio_entryread(char *gfname,int gentry) static void grfio_resourcecheck() { int size; - unsigned char *buf,*ptr; + char *buf,*ptr; char w1[256],w2[256],src[256],dst[256]; FILELIST *entry; - buf=grfio_reads("data\\resnametable.txt",&size); + buf = (char*)grfio_reads("data\\resnametable.txt",&size); buf[size] = 0; for(ptr=buf;ptr-buf #include #include #include "malloc.h" +#if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) + void* aMalloc_( size_t size, const char *file, int line, const char *func ) { void *ret; @@ -45,9 +46,27 @@ void* aRealloc_( void *p, size_t size, const char *file, int line, const char *f return ret; } +#endif + + +#if defined(GCOLLECT) + +void * _bcallocA(size_t size, size_t cnt) { + void *ret = aMallocA(size * cnt); + memset(ret, 0, size * cnt); + return ret; +} + void * _bcalloc(size_t size, size_t cnt) { - void *ret = malloc(size * cnt); + void *ret = aMalloc(size * cnt); memset(ret, 0, size * cnt); return ret; } #endif + +char * _bstrdup(const char *chr) { + int len = strlen(chr); + char *ret = aMalloc(len + 1); + strcpy(ret, chr); + return ret; +} diff --git a/src/common/malloc.h b/src/common/malloc.h index 860f8dd7b..b37c3b799 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -9,23 +9,39 @@ #define aMalloc(size) \ dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 0) +#define aMallocA(size) \ + dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 0) +#define aCallocA(count,size) \ + dmalloc_malloc(__FILE__, __LINE__, (count)*(size), DMALLOC_FUNC_CALLOC, 0, 0) #define aCalloc(count,size) \ dmalloc_malloc(__FILE__, __LINE__, (count)*(size), DMALLOC_FUNC_CALLOC, 0, 0) #define aRealloc(ptr,size) \ dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 0) +#define aFree(ptr) free(ptr) +#define aStrdup(ptr) strdup(ptr) #elif defined(GCOLLECT) #include "gc.h" #define aMalloc(n) GC_MALLOC(n) +#define aMallocA(n) GC_MALLOC_ATOMIC(n) +#define aCallocA(m,n) _bcallocA(m,n) #define aCalloc(m,n) _bcalloc(m,n) #define aRealloc(p,n) GC_REALLOC(p,n) +#define aFree(n) GC_FREE(n) +#define aStrdup(n) _bstrdup(n) extern void * _bcalloc(size_t, size_t); +extern void * _bcallocA(size_t, size_t); +extern char * _bstrdup(const char *); #elif defined(BCHECK) #define aMalloc(n) malloc(n) +#define aMallocA(n) malloc(n) #define aCalloc(m,n) calloc(m,n) +#define aCallocA(m,n) calloc(m,n) #define aRealloc(p,n) realloc(p,n) +#define aFree(n) free(n) +#define aStrdup(n) strdup(n) #else #if __STDC_VERSION__ < 199901L @@ -43,8 +59,12 @@ void* aCalloc_( size_t num, size_t size, const char *file, int line, const char void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func ); #define aMalloc(n) aMalloc_(n,ALC_MARK) +#define aMallocA(n) aMalloc_(n,ALC_MARK) #define aCalloc(m,n) aCalloc_(m,n,ALC_MARK) +#define aCallocA(m,n) aCalloc_(m,n,ALC_MARK) #define aRealloc(p,n) aRealloc_(p,n,ALC_MARK) +#define aFree(ptr) free(ptr) +#define aStrdup(ptr) strdup(ptr) #endif diff --git a/src/common/mmo.h b/src/common/mmo.h index 41598509e..a8722e53e 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -326,19 +326,25 @@ enum { GD_DEVELOPMENT=10014, }; -#ifndef _WIN32 -#ifndef strcmpi -#define strcmpi strcasecmp -#endif -#ifndef stricmp -#define stricmp strcasecmp -#endif -#ifndef strncmpi -#define strncmpi strncasecmp -#endif -#ifndef strnicmp -#define strnicmp strncasecmp -#endif +#ifndef __WIN32 + #ifndef strcmpi + #define strcmpi strcasecmp + #endif + #ifndef stricmp + #define stricmp strcasecmp + #endif + #ifndef strncmpi + #define strncmpi strncasecmp + #endif + #ifndef strnicmp + #define strnicmp strncasecmp + #endif +#else + #define snprintf _snprintf + #define vsnprintf _vsnprintf + #ifndef strncmpi + #define strncmpi strnicmp + #endif #endif #endif // _MMO_H_ diff --git a/src/common/showmsg.c b/src/common/showmsg.c index 857a819bb..ddaae3a52 100644 --- a/src/common/showmsg.c +++ b/src/common/showmsg.c @@ -2,6 +2,7 @@ #include #include #include "showmsg.h" +#include "malloc.h" char tmp_output[1024] = {"\0"}; @@ -47,7 +48,7 @@ int _ShowMessage(const char *string, enum msg_type flag){ // by MC Cameri return 1; } if (!(flag == MSG_DEBUG && !SHOW_DEBUG_MSG)) { - output = (char*)malloc(sizeof(char)*(strlen(prefix)+strlen(string)+2)); // prefix+string+two chars(space and \0) + output = (char*)aMalloc(sizeof(char)*(strlen(prefix)+strlen(string)+2)); // prefix+string+two chars(space and \0) if (output == NULL) { return 1; // exit(1); // Kill server? Deadly @@ -58,7 +59,7 @@ int _ShowMessage(const char *string, enum msg_type flag){ // by MC Cameri strcat(output,string); printf(output); fflush(stdout); - free(output); + aFree(output); } /* if ((core_config.debug_output_level > -1) && (flag >= core_config.debug_output_level)) { diff --git a/src/common/socket.c b/src/common/socket.c index 764d4d821..72e7e3f22 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -3,11 +3,13 @@ #include #include #include +#include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include #include +#include #else #include #include @@ -16,7 +18,6 @@ #include #include #include -#include #ifndef SIOCGIFCONF #include // SIOCGIFCONF on Solaris, maybe others? [Shinomori] @@ -151,11 +152,11 @@ static int send_from_fifo(int fd) return 0; } -void flush_fifos() +void flush_fifos() { int i; for(i=0;ifunc_send == send_from_fifo) send_from_fifo(i); } @@ -177,20 +178,22 @@ static int connect_client(int listen_fd) int fd; struct sockaddr_in client_address; int len; +#ifndef _WIN32 int result; +#endif //printf("connect_client : %d\n",listen_fd); len=sizeof(client_address); - fd=accept(listen_fd,(struct sockaddr*)&client_address,&len); + fd = accept(listen_fd,(struct sockaddr*)&client_address,(socklen_t*)&len); if(fd_max<=fd) fd_max=fd+1; setsocketopts(fd); if(fd==-1) perror("accept"); - else + else FD_SET(fd,&readfds); #ifdef _WIN32 @@ -203,8 +206,8 @@ static int connect_client(int listen_fd) #endif CREATE(session[fd], struct socket_data, 1); - CREATE(session[fd]->rdata, unsigned char, rfifo_size); - CREATE(session[fd]->wdata, unsigned char, wfifo_size); + CREATE_A(session[fd]->rdata, unsigned char, rfifo_size); + CREATE_A(session[fd]->wdata, unsigned char, wfifo_size); session[fd]->max_rdata = rfifo_size; session[fd]->max_wdata = wfifo_size; @@ -240,7 +243,7 @@ int make_listen_port(int port) server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl( INADDR_ANY ); - server_address.sin_port = htons(port); + server_address.sin_port = htons((unsigned short)port); result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address)); if( result == -1 ) { @@ -271,12 +274,13 @@ int make_listen_port(int port) int console_recieve(int i) { int n; char *buf; - - CREATE(buf, char , 64); - + + CREATE_A(buf, char , 64); + memset(buf,0,sizeof(64)); n = read(0, buf , 64); + if ( n < 0 ) printf("Console input read error\n"); else @@ -298,21 +302,21 @@ static int null_console_parse(char *buf) // Console Input [Wizputer] int start_console(void) { FD_SET(0,&readfds); - + CREATE(session[0], struct socket_data, 1); if(session[0]==NULL){ printf("out of memory : start_console\n"); exit(1); } - + memset(session[0],0,sizeof(*session[0])); - + session[0]->func_recv = console_recieve; session[0]->func_console = default_console_parse; - + return 0; -} - +} + int make_connection(long ip,int port) { struct sockaddr_in server_address; @@ -320,14 +324,14 @@ int make_connection(long ip,int port) int result; fd = socket( AF_INET, SOCK_STREAM, 0 ); - if(fd_max<=fd) + if(fd_max<=fd) fd_max=fd+1; setsocketopts(fd); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = ip; - server_address.sin_port = htons(port); + server_address.sin_port = htons((unsigned short)port); #ifdef _WIN32 { @@ -343,8 +347,8 @@ int make_connection(long ip,int port) FD_SET(fd,&readfds); CREATE(session[fd], struct socket_data, 1); - CREATE(session[fd]->rdata, unsigned char, rfifo_size); - CREATE(session[fd]->wdata, unsigned char, wfifo_size); + CREATE_A(session[fd]->rdata, unsigned char, rfifo_size); + CREATE_A(session[fd]->wdata, unsigned char, wfifo_size); session[fd]->max_rdata = rfifo_size; session[fd]->max_wdata = wfifo_size; @@ -363,12 +367,12 @@ int delete_session(int fd) FD_CLR(fd,&readfds); if(session[fd]){ if(session[fd]->rdata) - free(session[fd]->rdata); + aFree(session[fd]->rdata); if(session[fd]->wdata) - free(session[fd]->wdata); + aFree(session[fd]->wdata); if(session[fd]->session_data) - free(session[fd]->session_data); - free(session[fd]); + aFree(session[fd]->session_data); + aFree(session[fd]); } session[fd]=NULL; //printf("delete_session:%d\n",fd); @@ -401,7 +405,7 @@ int WFIFOSET(int fd,int len) } s->wdata_size=(s->wdata_size+(len)+2048 < s->max_wdata) ? s->wdata_size+len : (printf("socket: %d wdata lost !!\n",fd),s->wdata_size); - if (s->wdata_size > (TCP_FRAME_LEN)) + if (s->wdata_size > (TCP_FRAME_LEN)) send_from_fifo(fd); return 0; } @@ -456,7 +460,7 @@ int do_parsepacket(void) for(i=0;irdata_tick != 0) && ((tick_ - session[i]->rdata_tick) > stall_time_)) + if ((session[i]->rdata_tick != 0) && ((tick_ - session[i]->rdata_tick) > stall_time_)) session[i]->eof = 1; if(session[i]->rdata_size==0 && session[i]->eof==0) continue; @@ -500,7 +504,7 @@ int Net_Init(void) unsigned int i; char fullhost[255]; struct hostent* hent; - + /* Start up the windows networking */ WSADATA wsaData; @@ -512,7 +516,7 @@ int Net_Init(void) if(gethostname(fullhost, sizeof(fullhost)) == SOCKET_ERROR) { printf("Ugg.. no hostname defined!\n"); return 0; - } + } // XXX This should look up the local IP addresses in the registry // instead of calling gethostbyname. However, the way IP addresses @@ -545,7 +549,7 @@ int Net_Init(void) return 0; } - for(pos = 0; pos < ic.ifc_len;) + for(pos = 0; pos < ic.ifc_len;) { struct ifreq * ir = (struct ifreq *) (ic.ifc_buf + pos); diff --git a/src/common/socket.h b/src/common/socket.h index 172712d26..68b204862 100644 --- a/src/common/socket.h +++ b/src/common/socket.h @@ -5,8 +5,9 @@ #include -#ifdef _WIN32 +#ifdef __WIN32 #include +#define close(fd) closesocket(fd) #else #include #include diff --git a/src/common/strlib.c b/src/common/strlib.c index 9114c3d03..ca6e38761 100644 --- a/src/common/strlib.c +++ b/src/common/strlib.c @@ -8,15 +8,15 @@ //----------------------------------------------- // string lib. -unsigned char* jstrescape (unsigned char* pt) { +char* jstrescape (char* pt) { //copy from here unsigned char * ptr; int i =0, j=0; - + //copy string to temporary - CREATE(ptr, char, J_MAX_MALLOC_SIZE); + CREATE_A(ptr, char, J_MAX_MALLOC_SIZE); strcpy (ptr,pt); - + while (ptr[i] != '\0') { switch (ptr[i]) { case '\'': @@ -32,14 +32,14 @@ unsigned char* jstrescape (unsigned char* pt) { } } pt[j++] = '\0'; - free (ptr); - return (unsigned char*) &pt[0]; + aFree (ptr); + return &pt[0]; } -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) { +char* jstrescapecpy (char* pt,char* spt) { //copy from here int i =0, j=0; - + while (spt[i] != '\0') { switch (spt[i]) { case '\'': @@ -55,12 +55,12 @@ unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) { } } pt[j++] = '\0'; - return (unsigned char*) &pt[0]; + return &pt[0]; } -int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size) { +int jmemescapecpy (char* pt,char* spt, int size) { //copy from here int i =0, j=0; - + while (i < size) { switch (spt[i]) { case '\'': diff --git a/src/common/strlib.h b/src/common/strlib.h index 6b6169083..54c52cf94 100644 --- a/src/common/strlib.h +++ b/src/common/strlib.h @@ -4,7 +4,7 @@ // String function library. // code by Jioh L. Jung (ziozzang@4wish.net) // This code is under license "BSD" -unsigned char* jstrescape (unsigned char* pt); -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt); -int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size); +char* jstrescape (char* pt); +char* jstrescapecpy (char* pt,char* spt); +int jmemescapecpy (char* pt,char* spt, int size); #endif diff --git a/src/common/timer.c b/src/common/timer.c index 4c602b51e..8b52811b8 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -262,7 +262,7 @@ int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int int j; if (timer_data_max == 0) { timer_data_max = 256; - CREATE(timer_data, struct TimerData, timer_data_max); + CREATE_A(timer_data, struct TimerData, timer_data_max); //timer_data[0] = NULL; } else { timer_data_max += 256; @@ -403,13 +403,13 @@ void timer_final(void) for(tfl = tfl_root; tfl; tfl = tfl_next) { tfl_next = tfl->next; - free(tfl); + aFree(tfl); tfl = NULL; } if(timer_heap) - free(timer_heap); + aFree(timer_heap); if(free_timer_list) - free(free_timer_list); + aFree(free_timer_list); if(timer_data) - free(timer_data); + aFree(timer_data); } diff --git a/src/common/utils.c b/src/common/utils.c index 9a7722478..732b1d366 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -4,6 +4,7 @@ #include #include #include "malloc.h" +#include "mmo.h" void dump(unsigned char *buffer, int num) { @@ -112,7 +113,7 @@ void str_lower(char *name) // Allocate a StringBuf [MouseJstr] struct StringBuf * StringBuf_Malloc() { - struct StringBuf * ret = (struct StringBuf *) malloc(sizeof(struct StringBuf)); + struct StringBuf * ret = (struct StringBuf *) aMallocA(sizeof(struct StringBuf)); StringBuf_Init(ret); return ret; } @@ -120,7 +121,7 @@ struct StringBuf * StringBuf_Malloc() // Initialize a previously allocated StringBuf [MouseJstr] void StringBuf_Init(struct StringBuf * sbuf) { sbuf->max_ = 1024; - sbuf->ptr_ = sbuf->buf_ = (char *) malloc(sbuf->max_ + 1); + sbuf->ptr_ = sbuf->buf_ = (char *) aMallocA(sbuf->max_ + 1); } // printf into a StringBuf, moving the pointer [MouseJstr] @@ -169,7 +170,7 @@ int StringBuf_Append(struct StringBuf *buf1,const struct StringBuf *buf2) // Destroy a StringBuf [MouseJstr] void StringBuf_Destroy(struct StringBuf *sbuf) { - free(sbuf->buf_); + aFree(sbuf->buf_); sbuf->ptr_ = sbuf->buf_ = 0; } @@ -177,7 +178,7 @@ void StringBuf_Destroy(struct StringBuf *sbuf) void StringBuf_Free(struct StringBuf *sbuf) { StringBuf_Destroy(sbuf); - free(sbuf); + aFree(sbuf); } // Return the built string from the StringBuf [MouseJstr] diff --git a/src/common/utils.h b/src/common/utils.h index 0ac880a50..63c3f21ec 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -30,6 +30,12 @@ if (!((result) = (type *) aCalloc ((number), sizeof(type)))) \ { perror("SYSERR: malloc failure"); abort(); } } while(0) +#define CREATE_A(result, type, number) do {\ + if ((number) * sizeof(type) <= 0) \ + printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__); \ + if (!((result) = (type *) aCallocA ((number), sizeof(type)))) \ + { perror("SYSERR: malloc failure"); abort(); } } while(0) + #define RECREATE(result,type,number) do {\ if (!((result) = (type *) aRealloc ((result), sizeof(type) * (number))))\ { printf("SYSERR: realloc failure"); abort(); } } while(0) diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c index c8b0d60f0..66f5b837f 100644 --- a/src/ladmin/ladmin.c +++ b/src/ladmin/ladmin.c @@ -280,7 +280,7 @@ int ladmin_log(char *fmt, ...) { fprintf(logfp, RETCODE); else { gettimeofday(&tv, NULL); - strftime(tmpstr, 24, date_format, localtime(&(tv.tv_sec))); + strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec))); sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, fmt); vfprintf(logfp, tmpstr, ap); } @@ -294,7 +294,7 @@ int ladmin_log(char *fmt, ...) { //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { +int remove_control_chars(char *str) { int i; int change = 0; @@ -381,9 +381,9 @@ int verify_accountname(char* account_name) { //--------------------------------------------------- // E-mail check: return 0 (not correct) or 1 (valid). //--------------------------------------------------- -int e_mail_check(unsigned char *email) { +int e_mail_check(char *email) { char ch; - unsigned char* last_arobas; + char* last_arobas; // athena limits if (strlen(email) < 3 || strlen(email) > 39) @@ -3266,7 +3266,7 @@ int parse_fromlogin(int fd) { } // printf("parse_fromlogin : %d %d %d\n", fd, RFIFOREST(fd), RFIFOW(fd,0)); - sd = session[fd]->session_data; + sd = (struct char_session_data*)session[fd]->session_data; while(RFIFOREST(fd) >= 2) { switch(RFIFOW(fd,0)) { diff --git a/src/login/login.c b/src/login/login.c index 5f8bde598..11c970aca 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -2,7 +2,7 @@ // new version of the login-server by [Yor] #include -#ifdef WIN32 +#ifdef __WIN32 #define WIN32_LEAN_AND_MEAN #include #include @@ -232,12 +232,12 @@ void addGM(int account_id, int level) { } return; } - + // if new account if (i == GM_num && do_add) { if (GM_num >= GM_max) { GM_max += 256; - gm_account_db = realloc(gm_account_db, sizeof(struct gm_account) * GM_max); + gm_account_db = (struct gm_account*)aRealloc(gm_account_db, sizeof(struct gm_account) * GM_max); memset(gm_account_db + (GM_max - 256), 0, sizeof(struct gm_account) * 256); } gm_account_db[GM_num].account_id = account_id; @@ -261,7 +261,7 @@ int read_gm_account() { struct stat file_stat; int start_range = 0, end_range = 0, is_range = 0, current_id = 0; - if(gm_account_db) free(gm_account_db); + if(gm_account_db) aFree(gm_account_db); GM_num = 0; if(GM_max < 0) GM_max = 256; gm_account_db = (struct gm_account*)aCalloc(GM_max, sizeof(struct gm_account)); @@ -302,7 +302,7 @@ int read_gm_account() { printf("read_gm_account: file [%s] invalid range, beginning of range is equal to end of range (line #%d).\n", GM_account_filename, line_counter); else if (start_range>end_range) printf("read_gm_account: file [%s] invalid range, beginning of range must be lower than end of range (line #%d).\n", GM_account_filename, line_counter); - else + else for (current_id = start_range;current_id<=end_range;current_id++) addGM(current_id,level); } else { @@ -620,7 +620,7 @@ int mmo_auth_init(void) { if (auth_num >= auth_max) { auth_max += 256; - auth_dat = realloc(auth_dat, sizeof(struct auth_dat) * auth_max); + auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max); } memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat)); @@ -745,7 +745,7 @@ int mmo_auth_init(void) { if (auth_num >= auth_max) { auth_max += 256; - auth_dat = realloc(auth_dat, sizeof(struct auth_dat) * auth_max); + auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max); } memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat)); @@ -871,7 +871,8 @@ void mmo_auth_sync(void) { FILE *fp; int i, j, k, lock; int account_id; - int id[auth_num]; + //int id[auth_num]; + int *id = (int *)aCalloc(auth_num, sizeof(int)); char line[65536]; // Sorting before save @@ -889,8 +890,10 @@ void mmo_auth_sync(void) { } // Data save - if ((fp = lock_fopen(account_filename, &lock)) == NULL) + if ((fp = lock_fopen(account_filename, &lock)) == NULL) { + if (id) free(id); return; + } fprintf(fp, "// Accounts file: here are saved all information about the accounts.\n"); fprintf(fp, "// Structure: ID, account name, password, last login time, sex, # of logins, state, email, error message for state 7, validity time, last (accepted) login ip, memo field, ban timestamp, repeated(register text, register value)\n"); @@ -921,6 +924,8 @@ void mmo_auth_sync(void) { if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE) auth_before_save_file = AUTH_BEFORE_SAVE_FILE; + if (id) aFree(id); + return; } @@ -1019,7 +1024,7 @@ int mmo_auth_new(struct mmo_account* account, char sex, char* email) { if (auth_num >= auth_max) { auth_max += 256; - auth_dat = realloc(auth_dat, sizeof(struct auth_dat) * auth_max); + auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max); memset(auth_dat, 0, sizeof(struct auth_dat) * auth_max); } @@ -1132,7 +1137,7 @@ int mmo_auth(struct mmo_account* account, int fd) { memcpy(user_password, account->passwd, 25); encpasswdok = 0; #ifdef PASSWORDENC - ld = session[fd]->session_data; + ld = (struct login_session_data*)session[fd]->session_data; if (account->passwdenc > 0) { int j = account->passwdenc; if (!ld) { @@ -1392,7 +1397,7 @@ int parse_fromchar(int fd) { break; // we receive a e-mail creation of an account with a default e-mail (no answer) - case 0x2715: + case 0x2715: if (RFIFOREST(fd) < 46) return 0; { @@ -1701,7 +1706,9 @@ int parse_fromchar(int fd) { acc = RFIFOL(fd,4); for(i = 0; i < auth_num; i++) { if (auth_dat[i].account_id == acc) { - unsigned char buf[RFIFOW(fd,2)+1]; + //unsigned char buf[RFIFOW(fd,2)+1]; + unsigned char *buf; + buf = (unsigned char*)aCalloc(RFIFOW(fd,2)+1, sizeof(unsigned char)); login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." RETCODE, server[id].name, acc, ip); for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) { @@ -1718,6 +1725,7 @@ int parse_fromchar(int fd) { // Save mmo_auth_sync(); // printf("parse_fromchar: receiving (from the char-server) of account_reg2 (account id: %d).\n", acc); + if (buf) free(buf); break; } } @@ -1883,7 +1891,8 @@ int parse_admin(int fd) { return 0; { int st, ed, len; - int id[auth_num]; + //int id[auth_num]; + int *id=(int *)aCalloc(auth_num, sizeof(int)); st = RFIFOL(fd,2); ed = RFIFOL(fd,6); RFIFOSKIP(fd,10); @@ -1927,6 +1936,7 @@ int parse_admin(int fd) { } WFIFOW(fd,2) = len; WFIFOSET(fd,len); + if (id) free(id); } break; @@ -2114,7 +2124,7 @@ int parse_admin(int fd) { memcpy(WFIFOP(fd,4+server_num*32+6), server[i].name, 20); WFIFOW(fd,4+server_num*32+26) = server[i].users; WFIFOW(fd,4+server_num*32+28) = server[i].maintenance; - WFIFOW(fd,4+server_num*32+30) = server[i].new; + WFIFOW(fd,4+server_num*32+30) = server[i].new_; server_num++; } } @@ -2845,7 +2855,7 @@ int parse_login(int fd) { } else printf("parse_login: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); } - + switch(RFIFOW(fd,0)) { case 0x200: // New alive packet: structure: 0x200 .24B. used to verify if client is always alive. if (RFIFOREST(fd) < 26) @@ -2920,7 +2930,7 @@ int parse_login(int fd) { memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20); WFIFOW(fd,47+server_num*32+26) = server[i].users; WFIFOW(fd,47+server_num*32+28) = server[i].maintenance; - WFIFOW(fd,47+server_num*32+30) = server[i].new; + WFIFOW(fd,47+server_num*32+30) = server[i].new_; server_num++; } } @@ -2984,7 +2994,7 @@ int parse_login(int fd) { session[fd]->eof = 1; return 0; } - ld = session[fd]->session_data = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data)); + ld = (struct login_session_data*)session[fd]->session_data = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data)); if (!ld) { printf("login: Request for md5 key: memory allocation failure (malloc)!\n"); session[fd]->eof = 1; @@ -3036,7 +3046,7 @@ int parse_login(int fd) { memcpy(server[account.account_id].name, server_name, 20); server[account.account_id].users = 0; server[account.account_id].maintenance = RFIFOW(fd,82); - server[account.account_id].new = RFIFOW(fd,84); + server[account.account_id].new_ = RFIFOW(fd,84); server_fd[account.account_id] = fd; if(anti_freeze_enable) server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed @@ -3105,7 +3115,7 @@ int parse_login(int fd) { if (!check_ladminip(session[fd]->client_addr.sin_addr.s_addr)) { login_log("'ladmin'-login: Connection in administration mode refused: IP isn't authorised (ladmin_allow, ip: %s)." RETCODE, ip); } else { - struct login_session_data *ld = session[fd]->session_data; + struct login_session_data *ld = (struct login_session_data*)session[fd]->session_data; if (RFIFOW(fd,2) == 0) { // non encrypted password unsigned char* password=""; memcpy(password, RFIFOP(fd,4), 24); @@ -3205,9 +3215,9 @@ int parse_console(char *buf) { char command[256]; memset(command,0,sizeof(command)); - + sscanf(buf, "%[^\n]", command); - + login_log("Console command :%s" RETCODE, command); if(strcmpi("shutdown", command) == 0 || @@ -3372,22 +3382,22 @@ int login_config_read(const char *cfgName) { admin_pass[sizeof(admin_pass)-1] = '\0'; } else if (strcmpi(w1, "ladminallowip") == 0) { if (strcmpi(w2, "clear") == 0) { - if (access_ladmin_allow) - free(access_ladmin_allow); + if (access_ladmin_allow) + aFree(access_ladmin_allow); access_ladmin_allow = NULL; access_ladmin_allownum = 0; } else { if (strcmpi(w2, "all") == 0) { // reset all previous values if (access_ladmin_allow) - free(access_ladmin_allow); + aFree(access_ladmin_allow); // set to all access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char)); access_ladmin_allownum = 1; access_ladmin_allow[0] = '\0'; } else if (w2[0] && !(access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) { // don't add IP if already 'all' if (access_ladmin_allow) - access_ladmin_allow = realloc(access_ladmin_allow, (access_ladmin_allownum+1) * ACO_STRSIZE); + access_ladmin_allow = (char*)aRealloc(access_ladmin_allow, (access_ladmin_allownum+1) * ACO_STRSIZE); else access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char)); strncpy(access_ladmin_allow + (access_ladmin_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE); @@ -3469,21 +3479,21 @@ int login_config_read(const char *cfgName) { } else if (strcmpi(w1, "allow") == 0) { if (strcmpi(w2, "clear") == 0) { if (access_allow) - free(access_allow); + aFree(access_allow); access_allow = NULL; access_allownum = 0; } else { if (strcmpi(w2, "all") == 0) { // reset all previous values if (access_allow) - free(access_allow); + aFree(access_allow); // set to all access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char)); access_allownum = 1; access_allow[0] = '\0'; } else if (w2[0] && !(access_allownum == 1 && access_allow[0] == '\0')) { // don't add IP if already 'all' if (access_allow) - access_allow = realloc(access_allow, (access_allownum+1) * ACO_STRSIZE); + access_allow = (char*)aRealloc(access_allow, (access_allownum+1) * ACO_STRSIZE); else access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char)); strncpy(access_allow + (access_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE); @@ -3493,21 +3503,21 @@ int login_config_read(const char *cfgName) { } else if (strcmpi(w1, "deny") == 0) { if (strcmpi(w2, "clear") == 0) { if (access_deny) - free(access_deny); + aFree(access_deny); access_deny = NULL; access_denynum = 0; } else { if (strcmpi(w2, "all") == 0) { // reset all previous values if (access_deny) - free(access_deny); + aFree(access_deny); // set to all access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char)); access_denynum = 1; access_deny[0] = '\0'; } else if (w2[0] && !(access_denynum == 1 && access_deny[0] == '\0')) { // don't add IP if already 'all' if (access_deny) - access_deny = realloc(access_deny, (access_denynum+1) * ACO_STRSIZE); + access_deny = (char*)aRealloc(access_deny, (access_denynum+1) * ACO_STRSIZE); else access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char)); strncpy(access_deny + (access_denynum++) * ACO_STRSIZE, w2, ACO_STRSIZE); @@ -3877,18 +3887,18 @@ void do_final(void) { fflush(stdout); mmo_auth_sync(); - if(auth_dat) free(auth_dat); - if(gm_account_db) free(gm_account_db); - if(access_ladmin_allow) free(access_ladmin_allow); - if(access_allow) free(access_allow); - if(access_deny) free(access_deny); + if(auth_dat) aFree(auth_dat); + if(gm_account_db) aFree(gm_account_db); + if(access_ladmin_allow) aFree(access_ladmin_allow); + if(access_allow) aFree(access_allow); + if(access_deny) aFree(access_deny); for (i = 0; i < MAX_SERVERS; i++) { if ((fd = server_fd[i]) >= 0) { server_fd[i] = -1; memset(&server[i], 0, sizeof(struct mmo_char_server)); close(fd); delete_session(fd); - if(session[fd]) free(session[fd]); + if(session[fd]) aFree(session[fd]); } } close(login_fd); @@ -3929,7 +3939,7 @@ int do_init(int argc, char **argv) { // set_termfunc(mmo_auth_sync); set_defaultparse(parse_login); login_fd = make_listen_port(login_port); - + if(anti_freeze_enable > 0) { add_timer_func_list(char_anti_freeze_system, "char_anti_freeze_system"); i = add_timer_interval(gettick() + 1000, char_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); @@ -3957,7 +3967,7 @@ int do_init(int argc, char **argv) { set_defaultconsoleparse(parse_console); start_console(); } - + login_log("The login-server is ready (Server is listening on the port %d)." RETCODE, login_port); printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port); diff --git a/src/login/login.h b/src/login/login.h index 7370f5238..4a5b5be0c 100644 --- a/src/login/login.h +++ b/src/login/login.h @@ -33,7 +33,7 @@ struct mmo_char_server { short port; int users; int maintenance; - int new; + int new_; }; extern struct mmo_char_server server[MAX_SERVERS]; diff --git a/src/login_sql/login.c b/src/login_sql/login.c index 25df5310d..302e78b9e 100644 --- a/src/login_sql/login.c +++ b/src/login_sql/login.c @@ -161,7 +161,7 @@ struct dbt *online_db; void add_online_user(int account_id) { int *p; - p = aMalloc(sizeof(int)); + p = (int*)aMalloc(sizeof(int)); if (p == NULL) { printf("add_online_user: memory allocation failure (malloc)!\n"); exit(0); @@ -173,7 +173,7 @@ void add_online_user(int account_id) { int is_user_online(int account_id) { int *p; - p = numdb_search(online_db, account_id); + p = (int*)numdb_search(online_db, account_id); if (p == NULL) return 0; printf("Acccount %d\n",*p); @@ -182,8 +182,8 @@ int is_user_online(int account_id) { void remove_online_user(int account_id) { int *p; - p = numdb_erase(online_db,account_id); - free(p); + p = (int*)numdb_erase(online_db,account_id); + aFree(p); } //----------------------------------------------------- @@ -238,9 +238,9 @@ int remove_control_chars(unsigned char *str) { //--------------------------------------------------- // E-mail check: return 0 (not correct) or 1 (valid). //--------------------------------------------------- -int e_mail_check(unsigned char *email) { +int e_mail_check(char *email) { char ch; - unsigned char* last_arobas; + char* last_arobas; // athena limits if (strlen(email) < 3 || strlen(email) > 39) @@ -394,7 +394,7 @@ int mmo_auth( struct mmo_account* account , int fd){ // auth start : time seed gettimeofday(&tv, NULL); - strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec))); + strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime((const time_t*)&(tv.tv_sec))); sprintf(tmpstr+19, ".%03d", (int)tv.tv_usec/1000); jstrescapecpy(t_uid,account->userid); @@ -1217,7 +1217,7 @@ int parse_login(int fd) { memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20); WFIFOW(fd,47+server_num*32+26) = server[i].users; WFIFOW(fd,47+server_num*32+28) = server[i].maintenance; - WFIFOW(fd,47+server_num*32+30) = server[i].new; + WFIFOW(fd,47+server_num*32+30) = server[i].new_; server_num++; } } @@ -1407,7 +1407,7 @@ int parse_login(int fd) { memcpy(server[account.account_id].name,RFIFOP(fd,60),20); server[account.account_id].users=0; server[account.account_id].maintenance=RFIFOW(fd,82); - server[account.account_id].new=RFIFOW(fd,84); + server[account.account_id].new_=RFIFOW(fd,84); server_fd[account.account_id]=fd; if(anti_freeze_enable) server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed @@ -1480,9 +1480,9 @@ int parse_console(char *buf) { printf("Type of command: %s || Command: %s \n",type,command); - if(buf) free(buf); - if(type) free(type); - if(command) free(command); + if(buf) aFree(buf); + if(type) aFree(type); + if(command) aFree(command); return 0; } @@ -1841,7 +1841,7 @@ int do_init(int argc,char **argv){ } // Online user database init - free(online_db); + aFree(online_db); online_db = numdb_init(); printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port); diff --git a/src/login_sql/login.h b/src/login_sql/login.h index 6335168d7..73892f4ef 100644 --- a/src/login_sql/login.h +++ b/src/login_sql/login.h @@ -34,7 +34,7 @@ struct mmo_char_server { short port; int users; int maintenance; - int new; + int new_; }; diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 4b245fd0b..c1f491910 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -8,6 +8,7 @@ #include "../common/socket.h" #include "../common/timer.h" #include "../common/nullpo.h" +#include "../common/mmo.h" #include "log.h" #include "clif.h" @@ -465,7 +466,7 @@ static AtCommandInfo atcommand_info[] = { { AtCommand_Send, "@send", 60, atcommand_send }, { AtCommand_SetBattleFlag, "@setbattleflag", 60, atcommand_setbattleflag }, { AtCommand_UnMute, "@unmute", 60, atcommand_unmute }, // [Valaris] - { AtCommand_Clearweather, "@clearweather", 99, atcommand_clearweather }, // Dexity + { AtCommand_Clearweather, "@clearweather", 99, atcommand_clearweather }, // Dexity { AtCommand_UpTime, "@uptime", 0, atcommand_uptime }, // by MC Cameri // { AtCommand_ChangeSex, "@changesex", 1, atcommand_changesex }, // by MC Cameri { AtCommand_Mute, "@mute", 99, atcommand_mute }, // [celest] @@ -531,8 +532,8 @@ static AtCommandInfo atcommand_info[] = { * This function return the name of the job (by [Yor]) *---------------------------------------------------- */ -char * job_name(int class) { - switch (class) { +char * job_name(int class_) { + switch (class_) { case 0: return "Novice"; case 1: return "Swordsman"; case 2: return "Mage"; @@ -833,18 +834,18 @@ static int atmobsearch_sub(struct block_list *bl,va_list ap) static int number=0; struct mob_data *md; char output[128]; - + nullpo_retr(0, bl); - + if(!ap){ number=0; return 0; } mob_id = va_arg(ap,int); fd = va_arg(ap,int); - + md = (struct mob_data *)bl; - + if(md && fd && (mob_id==-1 || (md->class_==mob_id))){ snprintf(output, sizeof output, "%2d[%3d:%3d] %s", ++number,bl->x, bl->y,md->name); @@ -894,7 +895,7 @@ void rehash( const int fd, struct map_session_data* sd ) int map_id = 0; int LOADED_MAPS = map_num; - + for (map_id = 0; map_id < LOADED_MAPS;map_id++) { if (map_id > LOADED_MAPS) @@ -1023,7 +1024,7 @@ int atcommand_send( WBUFW(buf,0)=0x18f; case 4: WBUFW(buf,0)=0x190; - } + } } return 0; } @@ -1113,7 +1114,7 @@ int atcommand_where( snprintf(output, sizeof output, "%s %s %d %d", character, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); clif_displaymessage(fd, output); - + return 0; } @@ -1135,7 +1136,7 @@ int atcommand_jumpto( clif_displaymessage(fd, "Please, enter a player name (usage: @jumpto/@warpto/@goto )."); return -1; } - + memset(character, '\0', sizeof character); if (sscanf(message, "%99[^\n]", character) < 1) return -1; @@ -1677,8 +1678,10 @@ int atcommand_whozeny( int i, j, count,c; char match_text[100]; char player_name[24]; - int zeny[clif_countusers()]; - int counted[clif_countusers()]; + //int zeny[clif_countusers()]; + //int counted[clif_countusers()]; + int *zeny = (int *)aCallocA(clif_countusers(), sizeof(int)); + int *counted = (int *)aCallocA(clif_countusers(), sizeof(int)); nullpo_retr(-1, sd); @@ -1732,6 +1735,9 @@ int atcommand_whozeny( clif_displaymessage(fd, output); } + free(zeny); + free(counted); + return 0; } @@ -1749,7 +1755,7 @@ int atcommand_happyhappyjoyjoy( for (i = 0; i < fd_max; i++) { if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { e=rand()%40; - if(e==34) + if(e==34) e = 0; clif_emotion(&pl_sd->bl,e); } @@ -2177,7 +2183,7 @@ int atcommand_alive( clif_resurrection(&sd->bl, 1); clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle! return 0; - } + } return -1; } @@ -2296,8 +2302,8 @@ int atcommand_item( if (pet_id >= 0) { sd->catch_target_class = pet_db[pet_id].class_; intif_create_pet(sd->status.account_id, sd->status.char_id, - pet_db[pet_id].class_, mob_db[pet_db[pet_id].class_].lv, - pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate, + (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv, + (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate, 100, 0, 1, pet_db[pet_id].jname); // if not pet egg } else { @@ -2447,7 +2453,7 @@ int atcommand_baselevelup( clif_displaymessage(fd, msg_table[47]); // Base level can't go any higher. return -1; } // End Addition - if (level > battle_config.maximum_level || level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow + if ((unsigned int)level > battle_config.maximum_level || (unsigned int)level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow level = battle_config.maximum_level - sd->status.base_level; for (i = 1; i <= level; i++) sd->status.status_point += (sd->status.base_level + i + 14) / 5; @@ -2464,7 +2470,7 @@ int atcommand_baselevelup( clif_displaymessage(fd, msg_table[158]); // Base level can't go any lower. return -1; } - if (level < -battle_config.maximum_level || level < (1 - sd->status.base_level)) // fix negativ overflow + if (level < -(int)battle_config.maximum_level || level < (1 - (int)sd->status.base_level)) // fix negativ overflow level = 1 - sd->status.base_level; if (sd->status.status_point > 0) { for (i = 0; i > level; i--) @@ -2491,7 +2497,8 @@ int atcommand_joblevelup( const int fd, struct map_session_data* sd, const char* command, const char* message) { - int up_level = 50, level; + unsigned int up_level = 50; + int level; struct pc_base_job s_class; nullpo_retr(-1, sd); s_class = pc_calc_base_job(sd->status.class_); @@ -2514,7 +2521,7 @@ int atcommand_joblevelup( clif_displaymessage(fd, msg_table[23]); // Job level can't go any higher. return -1; } - if (level > up_level || level > (up_level - sd->status.job_level)) // fix positiv overflow + if ((unsigned int)level > up_level || (unsigned int)level > (up_level - sd->status.job_level)) // fix positiv overflow level = up_level - sd->status.job_level; sd->status.job_level += level; clif_updatestatus(sd, SP_JOBLEVEL); @@ -2529,7 +2536,7 @@ int atcommand_joblevelup( clif_displaymessage(fd, msg_table[159]); // Job level can't go any lower. return -1; } - if (level < -up_level || level < (1 - sd->status.job_level)) // fix negativ overflow + if (level < -(int)up_level || level < (1 - (int)sd->status.job_level)) // fix negativ overflow level = 1 - sd->status.job_level; sd->status.job_level += level; clif_updatestatus(sd, SP_JOBLEVEL); @@ -3117,7 +3124,7 @@ int atcommand_monster( printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y); count = 0; - range = sqrt(number) / 2; + range = (int)sqrt(number) / 2; range = range * 2 + 5; // calculation of an odd number (+ 4 area around) for (i = 0; i < number; i++) { j = 0; @@ -3209,7 +3216,7 @@ int atcommand_spawn( printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y); count = 0; - range = sqrt(number) / 2; + range = (int)sqrt(number) / 2; range = range * 2 + 5; // calculation of an odd number (+ 4 area around) for (i = 0; i < number; i++) { j = 0; @@ -3848,9 +3855,9 @@ int atcommand_param( } new_value = (int)*status[index] + value; - if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow + if (value > 0 && ((unsigned int)value > battle_config.max_parameter || (unsigned int)new_value > battle_config.max_parameter)) // fix positiv overflow new_value = battle_config.max_parameter; - else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow + else if (value < 0 && (value < -(int)battle_config.max_parameter || new_value < 1)) // fix negativ overflow new_value = 1; if (new_value != (int)*status[index]) { @@ -3893,9 +3900,9 @@ int atcommand_stat_all( for (index = 0; index < (int)(sizeof(status) / sizeof(status[0])); index++) { new_value = (int)*status[index] + value; - if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow + if (value > 0 && ((unsigned int)value > battle_config.max_parameter || (unsigned int)new_value > battle_config.max_parameter)) // fix positiv overflow new_value = battle_config.max_parameter; - else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow + else if (value < 0 && (value < -(int)battle_config.max_parameter || new_value < 1)) // fix negativ overflow new_value = 1; if (new_value != (int)*status[index]) { @@ -3993,8 +4000,8 @@ int atcommand_makeegg( sd->catch_target_class = pet_db[pet_id].class_; intif_create_pet( sd->status.account_id, sd->status.char_id, - pet_db[pet_id].class_, mob_db[pet_db[pet_id].class_].lv, - pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate, + (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv, + (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate, 100, 0, 1, pet_db[pet_id].jname); } else { clif_displaymessage(fd, msg_table[180]); // The monter/egg name/id doesn't exist. @@ -4149,14 +4156,14 @@ atcommand_recall( char character[100]; char output[200]; struct map_session_data *pl_sd = NULL; - + nullpo_retr(-1, sd); if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { clif_displaymessage(fd, "Please, enter a player name (usage: @recall )."); return -1; } - + memset(character, '\0', sizeof character); if(sscanf(message, "%99[^\n]", character) < 1) return -1; @@ -4658,7 +4665,7 @@ int atcommand_character_baselevel( clif_displaymessage(fd, msg_table[91]); // Character's base level can't go any higher. return 0; } // End Addition - if (level > battle_config.maximum_level || level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow + if ((unsigned int)level > battle_config.maximum_level || (unsigned int)level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow level = battle_config.maximum_level - pl_sd->status.base_level; for (i = 1; i <= level; i++) pl_sd->status.status_point += (pl_sd->status.base_level + i + 14) / 5; @@ -4675,7 +4682,7 @@ int atcommand_character_baselevel( clif_displaymessage(fd, msg_table[193]); // Character's base level can't go any lower. return -1; } - if (level < -battle_config.maximum_level || level < (1 - pl_sd->status.base_level)) // fix negativ overflow + if (level < -(int)battle_config.maximum_level || level < (1 - (int)pl_sd->status.base_level)) // fix negativ overflow level = 1 - pl_sd->status.base_level; if (pl_sd->status.status_point > 0) { for (i = 0; i > level; i--) @@ -4712,7 +4719,8 @@ int atcommand_character_joblevel( { struct map_session_data *pl_sd; char character[100]; - int max_level = 50, level = 0; + unsigned int max_level = 50; + int level = 0; //転生や養子の場合の元の職業を算出する struct pc_base_job pl_s_class; nullpo_retr(-1, sd); @@ -5195,7 +5203,7 @@ int atcommand_idsearch( { char item_name[100]; char output[200]; - int i, match; + unsigned int i, match; struct item_data *item; nullpo_retr(-1, sd); @@ -5652,7 +5660,7 @@ int atcommand_reloadscript( nullpo_retr(-1, sd); atcommand_broadcast( fd, sd, "@broadcast", "eAthena SQL Server is Rehashing..." ); atcommand_broadcast( fd, sd, "@broadcast", "You will feel a bit of lag at this point !" ); - + rehash( fd, sd ); atcommand_broadcast( fd, sd, "@broadcast", "Reloading NPCs..." ); @@ -6090,7 +6098,7 @@ int atcommand_enablenpc(const int fd, struct map_session_data* sd, memset(NPCname, '\0', sizeof(NPCname)); if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) { - clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcon )."); + clif_displaymessage(fd, "Please, enter a NPC name (usage: @enablenpc )."); return -1; } @@ -6961,7 +6969,7 @@ atcommand_npcmove(const int fd, struct map_session_data* sd, int x = 0, y = 0; struct npc_data *nd = 0; nullpo_retr(-1, sd); - + if (!message || !*message) return -1; @@ -7010,7 +7018,7 @@ atcommand_addwarp(const int fd, struct map_session_data* sd, ret = npc_parse_warp(w1, "warp", w3, w4); - sprintf(output, "New warp NPC => %s",w3); + sprintf(output, "New warp NPC => %s",w3); clif_displaymessage(fd, output); @@ -7063,7 +7071,7 @@ atcommand_dropall(const int fd, struct map_session_data* sd, } /*========================================== * @chardropall by [MouseJstr] - * + * * Throw all the characters possessions on the ground. Normally * done in response to them being disrespectful of a GM *------------------------------------------ @@ -7139,7 +7147,7 @@ atcommand_charstoreall(const int fd, struct map_session_data* sd, if (!message || !*message) return -1; - if((pl_sd=map_nick2sd((char *) message)) == NULL) + if((pl_sd=map_nick2sd((char *) message)) == NULL) return -1; if (storage_storageopen(pl_sd) == 1) { @@ -7254,7 +7262,7 @@ atcommand_skilltree(const int fd, struct map_session_data* sd, clif_displaymessage(fd, "Usage: @skilltree "); return -1; } - if((pl_sd=map_nick2sd(target)) == NULL) + if((pl_sd=map_nick2sd(target)) == NULL) return -1; s_class = pc_calc_base_job(pl_sd->status.class_); @@ -7265,8 +7273,8 @@ atcommand_skilltree(const int fd, struct map_session_data* sd, tbl = job_name(c); - sprintf(output, "Player is using %s %s skill tree (%d basic points)", - s_class.upper ? "upper" : "lower", + sprintf(output, "Player is using %s %s skill tree (%d basic points)", + s_class.upper ? "upper" : "lower", tbl, pc_checkskill(pl_sd, 1)); clif_displaymessage(fd, output); @@ -7276,7 +7284,7 @@ atcommand_skilltree(const int fd, struct map_session_data* sd, break; } } - + if (skillidx == -1) { sprintf(output, "I do not believe the player can use that skill"); clif_displaymessage(fd, output); @@ -7285,19 +7293,19 @@ atcommand_skilltree(const int fd, struct map_session_data* sd, ent = &skill_tree[s][c][skillidx]; - for(j=0;j<5;j++) + for(j=0;j<5;j++) if( ent->need[j].id && - pc_checkskill(sd,ent->need[j].id) < ent->need[j].lv) + pc_checkskill(sd,ent->need[j].id) < ent->need[j].lv) { int idx = 0; char *desc; - while (skill_names[idx].id != 0 && skill_names[idx].id != ent->need[j].id) + while (skill_names[idx].id != 0 && skill_names[idx].id != ent->need[j].id) idx++; if (skill_names[idx].id == 0) desc = "Unknown skill"; else desc = skill_names[idx].desc; - sprintf(output, "player requires level %d of skill %s", + sprintf(output, "player requires level %d of skill %s", ent->need[j].lv, desc); clif_displaymessage(fd, output); meets = 0; @@ -7307,7 +7315,7 @@ atcommand_skilltree(const int fd, struct map_session_data* sd, sprintf(output, "I believe the player meets all the requirements for that skill"); clif_displaymessage(fd, output); } - + return 0; } @@ -7392,7 +7400,7 @@ atcommand_rings(const int fd, struct map_session_data* sd, { struct item item_tmp; int flag; - + memset(&item_tmp, 0, sizeof(item_tmp)); item_tmp.nameid = 2634; @@ -7456,7 +7464,7 @@ atcommand_grind(const int fd, struct map_session_data* sd, clif_displaymessage(fd, "Usage: @grind "); return -1; } - if((pl_sd=map_nick2sd(target)) == NULL) + if((pl_sd=map_nick2sd(target)) == NULL) return -1; for (skillnum = 1; skillnum < 500; skillnum++) { @@ -7512,7 +7520,7 @@ atcommand_rain( } else { map[sd->bl.m].flag.rain=1; clif_specialeffect(&sd->bl,effno,2); - clif_displaymessage(fd, "It is made to rain."); + clif_displaymessage(fd, "It is made to rain."); } return 0; } @@ -7536,7 +7544,7 @@ atcommand_snow( clif_specialeffect(&sd->bl,effno,2); clif_displaymessage(fd, "It is made to snow."); } - + return 0; } @@ -7629,7 +7637,7 @@ atcommand_clearweather( map[sd->bl.m].flag.leaves=0; //clif_specialeffect(&sd->bl,effno,2); // not required. [celest] return 0; -} +} /*=============================================================== * Sound Command - plays a sound for everyone! [Codemaster] @@ -7720,7 +7728,7 @@ atcommand_cleanmap( } /*========================================== - * + * *------------------------------------------ */ int @@ -7735,14 +7743,14 @@ atcommand_summon( int id = 0; struct mob_data *md; unsigned int tick=gettick(); - + nullpo_retr(-1, sd); if (!message || !*message) return -1; if (sscanf(message, "%99s", name) < 1) return -1; - + if ((mob_id = atoi(name)) == 0) mob_id = mobdb_searchname(name); if(mob_id == 0) @@ -7823,7 +7831,7 @@ atcommand_adjgmlvl( return -1; } - if((pl_sd=map_nick2sd((char *) user)) == NULL) + if((pl_sd=map_nick2sd((char *) user)) == NULL) return -1; pc_set_gm_level(pl_sd->status.account_id, newlev); @@ -7837,7 +7845,7 @@ atcommand_adjgmlvl( * * Open a trade window with a remote player * - * If I have to jump to a remote player one more time, I am + * If I have to jump to a remote player one more time, I am * gonna scream! *------------------------------------------ */ @@ -7876,7 +7884,7 @@ atcommand_setbattleflag( return -1; } - if (battle_set_value(flag, value) == 0) + if (battle_set_value(flag, value) == 0) clif_displaymessage(fd, "unknown battle_config flag"); else clif_displaymessage(fd, "battle_config set as requested"); @@ -7901,7 +7909,7 @@ int atcommand_unmute( if((pl_sd=map_nick2sd((char *) message)) != NULL) { if(pl_sd->sc_data[SC_NOCHAT].timer!=-1) { pl_sd->status.manner = 0; // have to set to 0 first [celest] - skill_status_change_end(&pl_sd->bl,SC_NOCHAT,-1); + skill_status_change_end(&pl_sd->bl,SC_NOCHAT,-1); clif_displaymessage(sd->fd,"Player unmuted"); } else @@ -7932,7 +7940,7 @@ atcommand_uptime( seconds -= (seconds/hour>0)?(seconds/hour)*hour:0; minutes = seconds/minute; seconds -= (seconds/minute>0)?(seconds/minute)*minute:0; - + snprintf(output, sizeof(output), msg_table[245], days, hours, minutes, seconds); clif_displaymessage(fd,output); @@ -8013,7 +8021,7 @@ atcommand_petid(const int fd, struct map_session_data* sd, char temp0[100]; char temp1[100]; int cnt = 0, i = 0; - + nullpo_retr(-1, sd); if (!message || !*message) @@ -8066,7 +8074,7 @@ atcommand_identify( } } if (num > 0) { - clif_item_identify_list(sd); + clif_item_identify_list(sd); } else { clif_displaymessage(fd,"There are no items to appraise."); } @@ -8074,7 +8082,7 @@ atcommand_identify( } /*========================================== - * @gmotd (Global MOTD) + * @gmotd (Global MOTD) * by davidsiaw :P *------------------------------------------ */ @@ -8113,7 +8121,7 @@ int atcommand_misceffect( if (sscanf(message, "%d", &effect) < 1) return -1; clif_misceffect(&sd->bl,effect); - + return 0; } @@ -8128,7 +8136,7 @@ int charid2sessionid(int charid) if (pl_sd->status.char_id==charid) { session_id = i; break; } } } - + return session_id; } @@ -8143,7 +8151,7 @@ int accountid2sessionid(int accountid) if (pl_sd->status.account_id==accountid) { session_id = i; break; } } } - + return session_id; } @@ -8696,9 +8704,9 @@ atcommand_charkillableid( { if((pl_sd=session[session_id]->session_data) == NULL) return -1; - + pl_sd->special_state.killable = !pl_sd->special_state.killable; - + if(pl_sd->special_state.killable) clif_displaymessage(fd, "The player is now killable"); else @@ -8737,9 +8745,9 @@ atcommand_charkillableid2( { if((pl_sd=session[session_id]->session_data) == NULL) return -1; - + pl_sd->special_state.killable = !pl_sd->special_state.killable; - + if(pl_sd->special_state.killable) clif_displaymessage(fd, "The player is now killable"); else @@ -8762,7 +8770,7 @@ atcommand_charkillableid2( int atcommand_listmail( const int fd, struct map_session_data* sd, const char* command, const char* message) -{ +{ if(!battle_config.mail_system) return 0; @@ -8772,7 +8780,7 @@ int atcommand_listmail( mail_check(sd,3); else if(strlen(command)==9) mail_check(sd,2); - else + else mail_check(sd,1); return 0; } @@ -8823,7 +8831,7 @@ int atcommand_sendmail( if(strlen(command)==17) mail_send(sd,name,text,1); - else + else mail_send(sd,name,text,0); return 0; @@ -8842,7 +8850,7 @@ int atcommand_refreshonline( nullpo_retr(-1, sd); char_online_check(); - + return 0; } diff --git a/src/map/atcommand.h b/src/map/atcommand.h index f639d8c33..754a741b7 100644 --- a/src/map/atcommand.h +++ b/src/map/atcommand.h @@ -112,9 +112,9 @@ enum AtCommandType { AtCommand_CharSkReset, AtCommand_CharStReset, //by chbrules - AtCommand_CharModel, + AtCommand_CharModel, AtCommand_CharSKPoint, - AtCommand_CharSTPoint, + AtCommand_CharSTPoint, // AtCommand_CharZeny, //now #zeny AtCommand_RecallAll, AtCommand_ReloadItemDB, @@ -198,7 +198,7 @@ enum AtCommandType { AtCommand_CleanMap, // SQL-only commands start -#ifndef TXT_ONLY +#ifndef TXT_ONLY AtCommand_CheckMail, // [Valaris] AtCommand_ListMail, // [Valaris] AtCommand_ListNewMail, // [Valaris] @@ -206,7 +206,7 @@ enum AtCommandType { AtCommand_SendMail, // [Valaris] AtCommand_DeleteMail, // [Valaris] AtCommand_SendPriorityMail, // [Valaris] -// AtCommand_Sound, // [Valaris] +// AtCommand_Sound, // [Valaris] AtCommand_RefreshOnline, // [Valaris] // SQL-only commands end #endif @@ -272,7 +272,7 @@ int msg_config_read(const char *cfgName); char *estr_lower(char *str); -char * job_name(int class); +char * job_name(int class_); int e_mail_check(unsigned char *email); #endif diff --git a/src/map/battle.c b/src/map/battle.c index 3cff73a18..ce691158c 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -179,6 +179,10 @@ int battle_get_max_hp(struct block_list *bl) if(sc_data[SC_APPLEIDUN].timer!=-1) max_hp += ((5+sc_data[SC_APPLEIDUN].val1*2+((sc_data[SC_APPLEIDUN].val2+1)>>1) +sc_data[SC_APPLEIDUN].val3/10) * max_hp)/100; + if(sc_data[SC_GOSPEL].timer!=-1 && + sc_data[SC_GOSPEL].val4 == BCT_PARTY && + sc_data[SC_GOSPEL].val3 == 4) + max_hp += max_hp * 25 / 100; } if(max_hp < 1) max_hp = 1; return max_hp; @@ -429,16 +433,24 @@ int battle_get_flee(struct block_list *bl) else flee=battle_get_agi(bl) + battle_get_lv(bl); - if(sc_data) { - if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC) + if(bl->type != BL_PC && sc_data){ + if(sc_data[SC_WHISTLE].timer!=-1) flee += flee*(sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2 +(sc_data[SC_WHISTLE].val3>>16))/100; - if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC) + if(sc_data[SC_BLIND].timer!=-1) flee -= flee*25/100; - if(sc_data[SC_WINDWALK].timer!=-1 && bl->type != BL_PC) // ウィンドウォーク + if(sc_data[SC_WINDWALK].timer!=-1) // ウィンドウォーク flee += flee*(sc_data[SC_WINDWALK].val2)/100; - if(sc_data[SC_SPIDERWEB].timer!=-1 && bl->type != BL_PC) //スパイダーウェブ + if(sc_data[SC_SPIDERWEB].timer!=-1) //スパイダーウェブ flee -= flee*50/100; + if(sc_data[SC_GOSPEL].timer!=-1) { + if (sc_data[SC_GOSPEL].val4 == BCT_PARTY && + sc_data[SC_GOSPEL].val3 == 13) + flee += flee*5/100; + else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY && + sc_data[SC_GOSPEL].val3 == 7) + flee = 0; + } } if(flee < 1) flee = 1; return flee; @@ -460,16 +472,20 @@ int battle_get_hit(struct block_list *bl) else hit=battle_get_dex(bl) + battle_get_lv(bl); - if(sc_data) { - if(sc_data[SC_HUMMING].timer!=-1 && bl->type != BL_PC) // + if(bl->type != BL_PC && sc_data) { + if(sc_data[SC_HUMMING].timer!=-1) // hit += hit*(sc_data[SC_HUMMING].val1*2+sc_data[SC_HUMMING].val2 +sc_data[SC_HUMMING].val3)/100; - if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC) // 呪い + if(sc_data[SC_BLIND].timer!=-1) // 呪い hit -= hit*25/100; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト + if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト hit += 3*(sc_data[SC_TRUESIGHT].val1); - if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //コンセントレーション + if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション hit += (hit*(10*(sc_data[SC_CONCENTRATION].val1)))/100; + if(sc_data[SC_GOSPEL].timer!=-1 && + sc_data[SC_GOSPEL].val4 == BCT_PARTY && + sc_data[SC_GOSPEL].val3 == 14) + hit += hit*5/100; } if(hit < 1) hit = 1; return hit; @@ -560,7 +576,7 @@ int battle_get_baseatk(struct block_list *bl) if(sc_data[SC_CURSE].timer!=-1 ) //呪われていたら batk -= batk*25/100; //base_atkが25%減少 if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //コンセントレーション - batk += batk*(5*sc_data[SC_CONCENTRATION].val1)/100; + batk += batk*(5*sc_data[SC_CONCENTRATION].val1)/100; } if(batk < 1) batk = 1; //base_atkは最低でも1 return batk; @@ -584,13 +600,22 @@ int battle_get_atk(struct block_list *bl) else if(bl->type==BL_PET && (struct pet_data *)bl) atk = mob_db[((struct pet_data*)bl)->class_].atk1; - if(sc_data) { - if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC) + if(bl->type != BL_PC && sc_data) { + if(sc_data[SC_PROVOKE].timer!=-1) atk = atk*(100+2*sc_data[SC_PROVOKE].val1)/100; - if(sc_data[SC_CURSE].timer!=-1 ) + if(sc_data[SC_CURSE].timer!=-1) atk -= atk*25/100; - if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //コンセントレーション + if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション atk += atk*(5*sc_data[SC_CONCENTRATION].val1)/100; + + if(sc_data[SC_GOSPEL].timer!=-1) { + if (sc_data[SC_GOSPEL].val4 == BCT_PARTY && + sc_data[SC_GOSPEL].val3 == 12) + atk += atk*8/100; + else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY && + sc_data[SC_GOSPEL].val3 == 6) + atk = 0; + } } if(atk < 0) atk = 0; return atk; @@ -605,9 +630,6 @@ int battle_get_atk_(struct block_list *bl) nullpo_retr(0, bl); if(bl->type==BL_PC && (struct map_session_data *)bl){ int atk=((struct map_session_data*)bl)->watk_; - - if(((struct map_session_data *)bl)->sc_data[SC_CURSE].timer!=-1 ) - atk -= atk*25/100; return atk; } else @@ -780,10 +802,19 @@ int battle_get_def(struct block_list *bl) def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2)/100; //永遠の混沌時はDEF0になる if(sc_data[SC_ETERNALCHAOS].timer!=-1) - def = 0; + def = 0; //コンセントレーション時は減算 if( sc_data[SC_CONCENTRATION].timer!=-1) def = (def*(100 - 5*sc_data[SC_CONCENTRATION].val1))/100; + + if(sc_data[SC_GOSPEL].timer!=-1) { + if (sc_data[SC_GOSPEL].val4 == BCT_PARTY && + sc_data[SC_GOSPEL].val3 == 11) + def += def*25/100; + else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY && + sc_data[SC_GOSPEL].val3 == 5) + def = 0; + } } } //詠唱中は詠唱時減算率に基づいて減算 @@ -859,6 +890,15 @@ int battle_get_def2(struct block_list *bl) //コンセントレーション時は減算 if( sc_data[SC_CONCENTRATION].timer!=-1) def2 = def2*(100 - 5*sc_data[SC_CONCENTRATION].val1)/100; + + if(sc_data[SC_GOSPEL].timer!=-1) { + if (sc_data[SC_GOSPEL].val4 == BCT_PARTY && + sc_data[SC_GOSPEL].val3 == 11) + def2 += def2*25/100; + else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY && + sc_data[SC_GOSPEL].val3 == 5) + def2 = 0; + } } if(def2 < 1) def2 = 1; return def2; @@ -942,6 +982,10 @@ int battle_get_speed(struct block_list *bl) speed = speed*150/100; if(sc_data[SC_SPEEDUP0].timer!=-1) speed -= speed*25/100; + if(sc_data[SC_GOSPEL].timer!=-1 && + sc_data[SC_GOSPEL].val4 == BCT_ENEMY && + sc_data[SC_GOSPEL].val3 == 8) + speed = speed*125/100; } if(speed < 1) speed = 1; return speed; @@ -1002,6 +1046,10 @@ int battle_get_adelay(struct block_list *bl) //ディフェンダー時は加算 if(sc_data[SC_DEFENDER].timer != -1) adelay += (1100 - sc_data[SC_DEFENDER].val1*100); + if(sc_data[SC_GOSPEL].timer!=-1 && + sc_data[SC_GOSPEL].val4 == BCT_ENEMY && + sc_data[SC_GOSPEL].val3 == 8) + aspd_rate = aspd_rate*125/100; } if(aspd_rate != 100) adelay = adelay*aspd_rate/100; @@ -1315,7 +1363,7 @@ int battle_delay_damage_sub(int tid,unsigned int tick,int id,int data) struct battle_delay_damage_ *dat=(struct battle_delay_damage_ *)data; if( dat && map_id2bl(id)==dat->src && dat->target->prev!=NULL) battle_damage(dat->src,dat->target,dat->damage,dat->flag); - free(dat); + aFree(dat); return 0; } int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag) @@ -1487,11 +1535,11 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i struct mob_data *md=NULL; struct status_change *sc_data,*sc; short *sc_count; - int class; + int class_; nullpo_retr(0, bl); - class = battle_get_class(bl); + class_ = battle_get_class(bl); if(bl->type==BL_MOB) md=(struct mob_data *)bl; else sd=(struct map_session_data *)bl; @@ -1612,7 +1660,10 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i } // リジェクトソード if(sc_data[SC_REJECTSWORD].timer!=-1 && damage > 0 && flag&BF_WEAPON && - ((src->type==BL_PC && ((struct map_session_data *)src)->status.weapon == (1 || 2 || 3)) || src->type==BL_MOB )){ + // Fixed the condition check [Aalye] + (src->type==BL_MOB || (src->type==BL_PC && (((struct map_session_data *)src)->status.weapon == 1 || + ((struct map_session_data *)src)->status.weapon == 2 || + ((struct map_session_data *)src)->status.weapon == 3)))){ if(rand()%100 < (15*sc_data[SC_REJECTSWORD].val1)){ //反射確率は15*Lv damage = damage*50/100; clif_damage(bl,src,gettick(),0,0,damage,0,0,0); @@ -1630,22 +1681,22 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i damage<<=1; skill_status_change_end(bl, SC_SPIDERWEB, -1); } - + if(sc_data[SC_FOGWALL].timer != -1 && flag&BF_MAGIC) if(rand()%100 < sc_data[SC_FOGWALL].val2) damage = 0; } - if(class == 1288 || class == 1287 || class == 1286 || class == 1285) { -// if(class == 1288) { - if(class == 1288 && flag&BF_SKILL) + if(class_ == 1288 || class_ == 1287 || class_ == 1286 || class_ == 1285) { +// if(class_ == 1288) { + if(class_ == 1288 && flag&BF_SKILL) damage=0; if(src->type == BL_PC) { struct guild *g=guild_search(((struct map_session_data *)src)->status.guild_id); struct guild_castle *gc=guild_mapname2gc(map[bl->m].name); if(!((struct map_session_data *)src)->status.guild_id) damage=0; - if(gc && agit_flag==0 && class != 1288) // guardians cannot be damaged during non-woe [Valaris] + if(gc && agit_flag==0 && class_ != 1288) // guardians cannot be damaged during non-woe [Valaris] damage=0; // end woe check [Valaris] if(g == NULL) damage=0;//ギルド未加入ならダメージ無し @@ -2010,7 +2061,7 @@ static struct Damage battle_calc_pet_weapon_attack( blewcount=0; break; case AS_GRIMTOOTH: - damage = damage*(100+ 20*skill_lv)/100; + damage = damage*(100+ 20*skill_lv)/100; break; case AS_POISONREACT: // celest s_ele = 0; @@ -2208,7 +2259,7 @@ static struct Damage battle_calc_pet_weapon_attack( hitrate -= 50; if (t_sc_data[SC_SLEEP].timer!=-1 || // 睡眠は必中 t_sc_data[SC_STAN].timer!=-1 || // スタンは必中 - t_sc_data[SC_FREEZE].timer!=-1 || + t_sc_data[SC_FREEZE].timer!=-1 || (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // 凍結は必中 hitrate = 1000000; } @@ -2221,7 +2272,7 @@ static struct Damage battle_calc_pet_weapon_attack( dmg_lv = ATK_DEF; } - + if(t_sc_data) { int cardfix=100; if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG) @@ -2507,7 +2558,7 @@ static struct Damage battle_calc_mob_weapon_attack( flag=(flag&~BF_SKILLMASK)|BF_NORMAL; break; case AS_GRIMTOOTH: - damage = damage*(100+ 20*skill_lv)/100; + damage = damage*(100+ 20*skill_lv)/100; break; case AS_POISONREACT: // celest s_ele = 0; @@ -2710,7 +2761,7 @@ static struct Damage battle_calc_mob_weapon_attack( hitrate -= 50; if (t_sc_data[SC_SLEEP].timer!=-1 || // 睡眠は必中 t_sc_data[SC_STAN].timer!=-1 || // スタンは必中 - t_sc_data[SC_FREEZE].timer!=-1 || + t_sc_data[SC_FREEZE].timer!=-1 || (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // 凍結は必中 hitrate = 1000000; } @@ -2762,8 +2813,8 @@ static struct Damage battle_calc_mob_weapon_attack( if(damage < 0) damage = 0; // 属 性の適用 - if (!((battle_config.mob_ghostring_fix == 1) && - (battle_get_elem_type(target) == 8) && + if (!((battle_config.mob_ghostring_fix == 1) && + (battle_get_elem_type(target) == 8) && (target->type==BL_PC))) // [MouseJstr] if(skill_num != 0 || s_ele != 0 || !battle_config.mob_attack_attr_none) damage=battle_attr_fix(damage, s_ele, battle_get_element(target) ); @@ -3506,7 +3557,7 @@ static struct Damage battle_calc_pc_weapon_attack( /* int mdef1=battle_get_mdef(target); int mdef2=battle_get_mdef2(target); int imdef_flag=0; - + damage = ((damage * 5) + (skill_lv * battle_get_int(src) * 5) + rand()%500 + 500) /2; damage2 = ((damage2 * 5) + (skill_lv * battle_get_int(src) * 5) + rand()%500 + 500) /2; damage3 = damage; @@ -3520,7 +3571,7 @@ static struct Damage battle_calc_pc_weapon_attack( // calculate magic part of damage damage3 = skill_lv * battle_get_int(src) * 5; - + // ignores magic defense now [Celest] /*if(sd->ignore_mdef_ele & (1<ignore_mdef_race & (1<status.weapon > 16) {// 二刀流か? int dmg = damage, dmg2 = damage2; @@ -4258,7 +4309,7 @@ struct Damage battle_calc_magic_attack( } else if (target->type == BL_PC) { damage = ((struct map_session_data *)target)->status.sp * 2; matk_flag = 0; // don't consider matk and matk2 - } + } break; } } @@ -4554,6 +4605,7 @@ struct Damage battle_calc_attack( int attack_type, default: if(battle_config.error_log) printf("battle_calc_attack: unknwon attack type ! %d\n",attack_type); + memset(&d,0,sizeof(d)); break; } return d; @@ -4596,7 +4648,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, } if(battle_check_target(src,target,BCT_ENEMY) <= 0 && - !battle_check_range(src,target,0)) + !battle_check_range(src,target,0)) return 0; // 攻撃対象外 race = battle_get_race(target); @@ -4810,8 +4862,8 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, --t_sc_data[SC_POISONREACT].val2; } if (t_sc_data[SC_POISONREACT].val2<=0) - skill_status_change_end(target,SC_POISONREACT,-1); - } + skill_status_change_end(target,SC_POISONREACT,-1); + } } if (t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1 && !(battle_get_mode(src)&0x20)) { // ボスには無効 @@ -4911,7 +4963,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f return -1; if(ss->prev == NULL) return -1; - if(inf2&0x80 && + if(inf2&0x80 && (map[src->m].flag.pvp || pc_iskiller((struct map_session_data *)src, (struct map_session_data *)target)) && // [MouseJstr] !(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target))) return 0; @@ -5037,7 +5089,7 @@ int battle_check_range(struct block_list *src,struct block_list *bl,int range) int dx,dy; struct walkpath_data wpd; int arange; - + nullpo_retr(0, src); nullpo_retr(0, bl); @@ -5182,7 +5234,7 @@ static const struct { { "item_slots_override_grffile", &battle_config.item_slots_override_grffile}, // [Celest] { "indoors_override_grffile", &battle_config.indoors_override_grffile}, // [Celest] { "skill_sp_override_grffile", &battle_config.skill_sp_override_grffile}, // [Celest] - { "cardillust_read_grffile", &battle_config.cardillust_read_grffile}, // [Celest] + { "cardillust_read_grffile", &battle_config.cardillust_read_grffile}, // [Celest] { "arrow_decrement", &battle_config.arrow_decrement }, { "max_aspd", &battle_config.max_aspd }, { "max_hp", &battle_config.max_hp }, @@ -5329,10 +5381,10 @@ static const struct { { "allow_atcommand_when_mute", &battle_config.allow_atcommand_when_mute}, // [celest] { "finding_ore_rate", &battle_config.finding_ore_rate}, // [celest] { "exp_calc_type", &battle_config.exp_calc_type}, // [celest] - { "double_login_system", &battle_config.double_login_system}, // [celest] + { "min_skill_delay_limit", &battle_config.min_skill_delay_limit}, // [celest] //SQL-only options start -#ifndef TXT_ONLY +#ifndef TXT_ONLY { "mail_system", &battle_config.mail_system }, // added by [Valaris] //SQL-only options end #endif @@ -5442,7 +5494,7 @@ void battle_set_defaults() { battle_config.item_slots_override_grffile=0; // [Celest] battle_config.indoors_override_grffile=0; // [Celest] battle_config.skill_sp_override_grffile=0; // [Celest] - battle_config.cardillust_read_grffile=0; // [Celest] + battle_config.cardillust_read_grffile=0; // [Celest] battle_config.arrow_decrement=1; battle_config.max_aspd = 199; battle_config.max_hp = 32500; @@ -5590,10 +5642,10 @@ void battle_set_defaults() { battle_config.castrate_dex_scale = 150; battle_config.area_size = 14; battle_config.exp_calc_type = 1; - battle_config.double_login_system = 0; + battle_config.min_skill_delay_limit = 100; //SQL-only options start -#ifndef TXT_ONLY +#ifndef TXT_ONLY battle_config.mail_system = 0; //SQL-only options end #endif @@ -5710,13 +5762,13 @@ void battle_validate_conf() { // at least 1 client must be accepted if ((battle_config.packet_ver_flag & 127) == 0) // added by [Yor] battle_config.packet_ver_flag = 127; // accept all clients - + if (battle_config.night_darkness_level > 10) // Celest battle_config.night_darkness_level = 10; if (battle_config.skill_range_leniency < 0) // Celest battle_config.skill_range_leniency = 0; - + if (battle_config.motd_type < 0) battle_config.motd_type = 0; else if (battle_config.motd_type > 1) @@ -5728,22 +5780,21 @@ void battle_validate_conf() { if (battle_config.vending_max_value > 10000000 || battle_config.vending_max_value<=0) // Lupus & Kobra_k88 battle_config.vending_max_value = 10000000; - if (battle_config.double_login_system < 0) - battle_config.double_login_system = 0; - + if (battle_config.min_skill_delay_limit < 10) + battle_config.min_skill_delay_limit = 10; // minimum delay of 10ms } /*========================================== * 設定ファイルを読み込む *------------------------------------------ */ -int battle_config_read(const char *cfgName) +int battle_config_read(const char *cfgName) { char line[1024], w1[1024], w2[1024]; FILE *fp; static int count = 0; - if ((count++) == 0) + if ((count++) == 0) battle_set_defaults(); fp = fopen(cfgName,"r"); diff --git a/src/map/battle.h b/src/map/battle.h index 29b537080..d88ea54c1 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -115,6 +115,7 @@ enum { BCT_NOPARTY =0x50000, BCT_ALL =0x20000, BCT_NOONE =0x60000, + BCT_SELF =0x60000, }; int battle_check_undead(int race,int element); @@ -291,7 +292,7 @@ extern struct Battle_Config { int prevent_logout; // Added by RoVeRT int alchemist_summon_reward; // [Valaris] - int maximum_level; + unsigned int maximum_level; int drops_by_luk; int monsters_ignore_gm; int equipment_breaking; @@ -348,7 +349,7 @@ extern struct Battle_Config { int zeny_from_mobs; // [Valaris] int mobs_level_up; // [Valaris] - int pk_min_level; // [celest] + unsigned int pk_min_level; // [celest] int skill_steal_type; // [celest] int skill_steal_rate; // [celest] int night_darkness_level; // [celest] @@ -357,7 +358,7 @@ extern struct Battle_Config { int allow_atcommand_when_mute; // [celest] int finding_ore_rate; // orn int exp_calc_type; - int double_login_system; + int min_skill_delay_limit; #ifndef TXT_ONLY /* SQL-only options */ int mail_system; // [Valaris] diff --git a/src/map/charcommand.c b/src/map/charcommand.c index 1ced08777..5d65c8f01 100644 --- a/src/map/charcommand.c +++ b/src/map/charcommand.c @@ -1063,8 +1063,8 @@ int charcommand_item( if (pet_id >= 0) { sd->catch_target_class = pet_db[pet_id].class_; intif_create_pet(sd->status.account_id, sd->status.char_id, - pet_db[pet_id].class_, mob_db[pet_db[pet_id].class_].lv, - pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate, + (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv, + (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate, 100, 0, 1, pet_db[pet_id].jname); // if not pet egg } else { diff --git a/src/map/chat.c b/src/map/chat.c index c7ec13a5f..cfd2660e0 100644 --- a/src/map/chat.c +++ b/src/map/chat.c @@ -49,7 +49,7 @@ int chat_createchat(struct map_session_data *sd,int limit,int pub,char* pass,cha cd->bl.id = map_addobject(&cd->bl); if(cd->bl.id==0){ clif_createchat(sd,1); - free(cd); + aFree(cd); return 0; } pc_setchatid(sd,cd->bl.id); @@ -82,7 +82,7 @@ int chat_joinchat(struct map_session_data *sd,int chatid,char* pass) clif_joinchatfail(sd,1); return 0; } - if(chatid == sd->chatID) //Double Chat fix by Alex14, thx CHaNGeTe + if(chatid == (int)sd->chatID) //Double Chat fix by Alex14, thx CHaNGeTe { clif_joinchatfail(sd,1); return 0; @@ -290,7 +290,7 @@ int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* t cd->bl.id = map_addobject(&cd->bl); if(cd->bl.id==0){ - free(cd); + aFree(cd); return 0; } nd->chat_id=cd->bl.id; diff --git a/src/map/clif.c b/src/map/clif.c index b72192690..38aa8ab26 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -53,11 +53,15 @@ #define STATE_BLIND 0x10 -int packet_db_ver = -1; // the packet version used by packet_db -int packet_db_connect_cmd = 0xF5; // the default packet used for connecting to the server - +struct Clif_Config clif_config; struct packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB]; +#define USE_PACKET_DB(sd) \ + clif_config.enable_packet_db && sd->packet_ver == clif_config.packet_db_ver + +#define IS_PACKET_DB_VER(cmd) \ + cmd == clif_config.connect_cmd + static const int packet_len_table[MAX_PACKET_DB] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -66,7 +70,7 @@ static const int packet_len_table[MAX_PACKET_DB] = { //#0x0040 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2, + 0, 0, 0, 0, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2, #if PACKETVER < 2 3, 28, 19, 11, 3, -1, 9, 5, 52, 51, 56, 58, 41, 2, 6, 6, #else // 78-7b 亀島以降 lv99エフェクト用 @@ -155,7 +159,7 @@ char talkie_mes[80]; * map鯖のip設定 *------------------------------------------ */ -void clif_setip(char *ip) +void clif_setip(char *ip) { memcpy(map_ip_str, ip, 16); map_ip = inet_addr(map_ip_str); @@ -165,7 +169,7 @@ void clif_setip(char *ip) * map鯖のport設定 *------------------------------------------ */ -void clif_setport(int port) +void clif_setport(int port) { map_port = port; } @@ -174,7 +178,7 @@ void clif_setport(int port) * map鯖のip読み出し *------------------------------------------ */ -in_addr_t clif_getip(void) +in_addr_t clif_getip(void) { return map_ip; } @@ -183,7 +187,7 @@ in_addr_t clif_getip(void) * map鯖のport読み出し *------------------------------------------ */ -int clif_getport(void) +int clif_getport(void) { return map_port; } @@ -192,7 +196,7 @@ int clif_getport(void) * *------------------------------------------ */ -int clif_countusers(void) +int clif_countusers(void) { int users = 0, i; struct map_session_data *sd; @@ -209,7 +213,7 @@ int clif_countusers(void) * 全てのclientに対してfunc()実行 *------------------------------------------ */ -int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...) +int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...) { int i; va_list ap; @@ -228,7 +232,7 @@ int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...) * clif_sendでAREA*指定時用 *------------------------------------------ */ -int clif_send_sub(struct block_list *bl, va_list ap) +int clif_send_sub(struct block_list *bl, va_list ap) { unsigned char *buf; int len; @@ -902,17 +906,17 @@ static int clif_set007b(struct map_session_data *sd,unsigned char *buf) { * クラスチェンジ typeはMobの場合は1で他は0? *------------------------------------------ */ -int clif_class_change(struct block_list *bl,int class,int type) +int clif_class_change(struct block_list *bl,int class_,int type) { char buf[16]; nullpo_retr(0, bl); - if(class >= MAX_PC_CLASS) { + if(class_ >= MAX_PC_CLASS) { WBUFW(buf,0)=0x1b0; WBUFL(buf,2)=bl->id; WBUFB(buf,6)=type; - WBUFL(buf,7)=class; + WBUFL(buf,7)=class_; clif_send(buf,packet_len_table[0x1b0],bl,AREA); } @@ -922,9 +926,9 @@ int clif_class_change(struct block_list *bl,int class,int type) * *------------------------------------------ */ -int clif_mob_class_change(struct mob_data *md, int class) { +int clif_mob_class_change(struct mob_data *md, int class_) { char buf[16]; - int view = mob_get_viewclass(class); + int view = mob_get_viewclass(class_); nullpo_retr(0, md); @@ -961,7 +965,7 @@ int clif_mob_equip(struct mob_data *md, int nameid) { * MOB表示1 *------------------------------------------ */ -static int clif_mob0078(struct mob_data *md, unsigned char *buf) +static int clif_mob0078(struct mob_data *md, unsigned char *buf) { int level; @@ -3730,7 +3734,7 @@ void clif_getareachar_mob(struct map_session_data* sd,struct mob_data* md) int len; nullpo_retv(sd); nullpo_retv(md); - + if (session[sd->fd] == NULL) return; @@ -3749,7 +3753,7 @@ void clif_getareachar_mob(struct map_session_data* sd,struct mob_data* md) clif_specialeffect(&md->bl,423,0); else if(md->size==1) clif_specialeffect(&md->bl,421,0); - + } @@ -4049,8 +4053,8 @@ int clif_moboutsight(struct block_list *bl,va_list ap) nullpo_retr(0, ap); nullpo_retr(0, md=va_arg(ap,struct mob_data*)); - if(bl->type==BL_PC - && ((sd = (struct map_session_data*) bl) != NULL) + if(bl->type==BL_PC + && ((sd = (struct map_session_data*) bl) != NULL) && session[sd->fd] != NULL) { clif_clearchar_id(md->bl.id,0,sd->fd); } @@ -4071,8 +4075,8 @@ int clif_mobinsight(struct block_list *bl,va_list ap) nullpo_retr(0, ap); md=va_arg(ap,struct mob_data*); - if(bl->type==BL_PC - && ((sd = (struct map_session_data*) bl) != NULL) + if(bl->type==BL_PC + && ((sd = (struct map_session_data*) bl) != NULL) && session[sd->fd] != NULL) { clif_getareachar_mob(sd,md); } @@ -4093,8 +4097,8 @@ int clif_petoutsight(struct block_list *bl,va_list ap) nullpo_retr(0, ap); nullpo_retr(0, pd=va_arg(ap,struct pet_data*)); - if(bl->type==BL_PC - && ((sd = (struct map_session_data*) bl) != NULL) + if(bl->type==BL_PC + && ((sd = (struct map_session_data*) bl) != NULL) && session[sd->fd] != NULL) { clif_clearchar_id(pd->bl.id,0,sd->fd); } @@ -4112,8 +4116,8 @@ int clif_npcoutsight(struct block_list *bl,va_list ap) nullpo_retr(0, ap); nullpo_retr(0, nd=va_arg(ap,struct npc_data*)); - if(bl->type==BL_PC - && ((sd = (struct map_session_data*) bl) != NULL) + if(bl->type==BL_PC + && ((sd = (struct map_session_data*) bl) != NULL) && session[sd->fd] != NULL) { clif_clearchar_id(nd->bl.id,0,sd->fd); } @@ -4134,8 +4138,8 @@ int clif_petinsight(struct block_list *bl,va_list ap) nullpo_retr(0, ap); pd=va_arg(ap,struct pet_data*); - if(bl->type==BL_PC - && ((sd = (struct map_session_data*) bl) != NULL) + if(bl->type==BL_PC + && ((sd = (struct map_session_data*) bl) != NULL) && session[sd->fd] != NULL) { clif_getareachar_pet(sd,pd); } @@ -4153,8 +4157,8 @@ int clif_npcinsight(struct block_list *bl,va_list ap) nullpo_retr(0, ap); nd=va_arg(ap,struct npc_data*); - if(bl->type==BL_PC - && ((sd = (struct map_session_data*) bl) != NULL) + if(bl->type==BL_PC + && ((sd = (struct map_session_data*) bl) != NULL) && session[sd->fd] != NULL) { clif_getareachar_npc(sd,nd); } @@ -4701,7 +4705,7 @@ int clif_status_change(struct block_list *bl,int type,int flag) * Send message (modified by [Yor]) *------------------------------------------ */ -int clif_displaymessage(const int fd, char* mes) +int clif_displaymessage(const int fd, char* mes) { //Console [Wizputer] if (fd == 0) @@ -4724,13 +4728,13 @@ int clif_displaymessage(const int fd, char* mes) * 天の声を送信する *------------------------------------------ */ -int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag) +int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag) { unsigned char *buf; int lp; lp = (flag & 0x10) ? 8 : 4; - buf = (unsigned char*)aCalloc(len + lp, sizeof(unsigned char)); + buf = (unsigned char*)aCallocA(len + lp, sizeof(unsigned char)); WBUFW(buf,0) = 0x9a; WBUFW(buf,2) = len + lp; @@ -4743,7 +4747,7 @@ int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag) (flag == 3) ? SELF : ALL_CLIENT); - if(buf) free(buf); + if(buf) aFree(buf); return 0; } @@ -4893,7 +4897,7 @@ int clif_wis_message(int fd, char *nick, char *mes, int mes_len) // R 0097 *------------------------------------------ */ int clif_wis_end(int fd, int flag) // R 0098 .B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target -{ +{ WFIFOW(fd,0) = 0x98; WFIFOW(fd,2) = flag; WFIFOSET(fd,packet_len_table[0x98]); @@ -5794,7 +5798,7 @@ int clif_hpmeter(struct map_session_data *sd) unsigned char buf[16]; unsigned char buf2[16]; int i; - + nullpo_retr(0, sd); WBUFW(buf,0)=0x107; @@ -5809,7 +5813,7 @@ int clif_hpmeter(struct map_session_data *sd) WFIFOSET(i,packet_len_table[0x107]); } } - + WBUFW(buf2,0)=0x106; WBUFL(buf2,2)=sd->status.account_id; WBUFW(buf2,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp; @@ -5821,7 +5825,7 @@ int clif_hpmeter(struct map_session_data *sd) WFIFOSET(i,packet_len_table[0x106]); } } - + return 0; } /*================================================== @@ -5834,7 +5838,7 @@ int clif_update_mobhp(struct mob_data *md) char mobhp[50]; nullpo_retr(0, md); - + WBUFW(buf,0) = 0x95; WBUFL(buf,2) = md->bl.id; @@ -5845,7 +5849,7 @@ int clif_update_mobhp(struct mob_data *md) WBUFL(buf,54) = 0; WBUFL(buf,78) = 0; clif_send(buf,packet_len_table[0x195],&md->bl,AREA); - + return 0; } /*========================================== @@ -6206,7 +6210,7 @@ int clif_combo_delay(struct block_list *bl,int wait) *------------------------------------------ */ int clif_bladestop(struct block_list *src,struct block_list *dst, - int bool) + int _bool) { unsigned char buf[32]; @@ -6216,7 +6220,7 @@ int clif_bladestop(struct block_list *src,struct block_list *dst, WBUFW(buf,0)=0x1d1; WBUFL(buf,2)=src->id; WBUFL(buf,6)=dst->id; - WBUFL(buf,10)=bool; + WBUFL(buf,10)=_bool; clif_send(buf,packet_len_table[0x1d1],src,AREA); @@ -6837,7 +6841,7 @@ int clif_guild_message(struct guild *g,int account_id,const char *mes,int len) struct map_session_data *sd; unsigned char *buf; - buf = (unsigned char*)aCalloc(len + 4, sizeof(unsigned char)); + buf = (unsigned char*)aCallocA(len + 4, sizeof(unsigned char)); WBUFW(buf, 0) = 0x17f; WBUFW(buf, 2) = len + 4; @@ -6846,7 +6850,7 @@ int clif_guild_message(struct guild *g,int account_id,const char *mes,int len) if ((sd = guild_getavailablesd(g)) != NULL) clif_send(buf, WBUFW(buf,2), &sd->bl, GUILD); - if(buf) free(buf); + if(buf) aFree(buf); return 0; } @@ -7043,7 +7047,7 @@ void clif_callpartner(struct map_session_data *sd) * Adopt baby [Celest] *------------------------------------------ */ -void clif_adopt_process(struct map_session_data *sd) +void clif_adopt_process(struct map_session_data *sd) { int fd; nullpo_retv(sd); @@ -7054,7 +7058,7 @@ void clif_adopt_process(struct map_session_data *sd) } /*========================================== - * + * *------------------------------------------ */ void clif_parse_ReqAdopt(int fd, struct map_session_data *sd) { @@ -7067,7 +7071,7 @@ void clif_parse_ReqAdopt(int fd, struct map_session_data *sd) { * 座る *------------------------------------------ */ -void clif_sitting(struct map_session_data *sd) +void clif_sitting(struct map_session_data *sd) { unsigned char buf[64]; @@ -7083,13 +7087,13 @@ void clif_sitting(struct map_session_data *sd) * *------------------------------------------ */ -int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len) +int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len) { unsigned char *buf; nullpo_retr(0, sd); - buf = (unsigned char*)aCalloc(len + 8, sizeof(unsigned char)); + buf = (unsigned char*)aCallocA(len + 8, sizeof(unsigned char)); WBUFW(buf, 0) = 0x17f; WBUFW(buf, 2) = len + 8; @@ -7097,7 +7101,7 @@ int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len) clif_send(buf, WBUFW(buf,2), &sd->bl, SELF); - if(buf) free(buf); + if(buf) aFree(buf); return 0; } @@ -7107,7 +7111,7 @@ int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len) *------------------------------------------ */ -int clif_GM_kickack(struct map_session_data *sd, int id) +int clif_GM_kickack(struct map_session_data *sd, int id) { int fd; @@ -7142,7 +7146,7 @@ int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int ty *------------------------------------------ */ -int clif_timedout(struct map_session_data *sd) +int clif_timedout(struct map_session_data *sd) { nullpo_retr(0, sd); @@ -7247,8 +7251,8 @@ int clif_specialeffect(struct block_list *bl, int type, int flag) { struct map_session_data *pl_sd; int i; for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) != NULL && - pl_sd->state.auth && + if (session[i] && (pl_sd = session[i]->session_data) != NULL && + pl_sd->state.auth && (pc_isGM((struct map_session_data *)&bl) > pc_isGM((struct map_session_data *)&pl_sd->bl))) clif_specialeffect(&pl_sd->bl, type, 1); } @@ -7278,10 +7282,10 @@ int clif_specialeffect(struct block_list *bl, int type, int flag) { * *------------------------------------------ */ -void clif_parse_WantToConnection(int fd, struct map_session_data *sd) +void clif_parse_WantToConnection(int fd, struct map_session_data *sd) { struct map_session_data *old_sd; - int account_id; // account_id in the packet 0x72 or 0x7E + int cmd, account_id; // account_id in the packet 0x72 or 0x7E if (sd) { if (battle_config.error_log) @@ -7289,12 +7293,14 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) return; } + cmd = RFIFOW(fd,0); + // packet DB - if (RFIFOW(fd,0) == packet_db_connect_cmd) { + if (IS_PACKET_DB_VER(cmd)) { //printf("Received bytes %d with packet 0x72.\n", RFIFOREST(fd)); - account_id = RFIFOL(fd,packet_db[packet_db_ver][packet_db_connect_cmd].pos[0]); + account_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[0]); // 0x72 - } else if (RFIFOW(fd,0) == 0x72) { + } else if (cmd == 0x72) { //printf("Received bytes %d with packet 0x72.\n", RFIFOREST(fd)); if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) // 00 = Female, 01 = Male account_id = RFIFOL(fd,12); @@ -7303,14 +7309,14 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) else // old packet version account_id = RFIFOL(fd,2); // 0x7E - } else if (RFIFOW(fd,0) == 0x7E) { + } else if (cmd == 0x7E) { //printf("Received bytes %d with packet 0x7E.\n", RFIFOREST(fd)); if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) // 00 = Female, 01 = Male account_id = RFIFOL(fd,9); else account_id = RFIFOL(fd,12); // 0xF5 - } else if (RFIFOW(fd,0) == 0xF5) { + } else if (cmd == 0xF5) { //printf("Received bytes %d with packet 0xF5.\n", RFIFOREST(fd)); if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) // 00 = Female, 01 = Male account_id = RFIFOL(fd,7); @@ -7319,9 +7325,9 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male account_id = RFIFOL(fd,10); else { // 29 28 28 - if (RFIFOW(fd,1) == 0) // testing ^^; + /*if (RFIFOW(fd,1) == 0) // testing ^^; account_id = RFIFOL(fd,3); - else + else*/ account_id = RFIFOL(fd,5); } // 0x9B @@ -7339,14 +7345,14 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) sd = session[fd]->session_data = (struct map_session_data*)aCalloc(1, sizeof(struct map_session_data)); sd->fd = fd; + if (IS_PACKET_DB_VER(cmd)) { + sd->packet_ver = clif_config.packet_db_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) + pc_setnewpc(sd, account_id, RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[1]), + RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[2]), + RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[3]), + RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[4]), fd); // 0x72 - if (RFIFOW(fd,0) == packet_db_connect_cmd) { - sd->packet_ver = packet_db_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) - pc_setnewpc(sd, account_id, RFIFOL(fd,packet_db[packet_db_ver][packet_db_connect_cmd].pos[1]), - RFIFOL(fd,packet_db[packet_db_ver][packet_db_connect_cmd].pos[2]), - RFIFOL(fd,packet_db[packet_db_ver][packet_db_connect_cmd].pos[3]), - RFIFOL(fd,packet_db[packet_db_ver][packet_db_connect_cmd].pos[4]), fd); - } else if (RFIFOW(fd,0) == 0x72) { + } else if (cmd == 0x72) { if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) { // 00 = Female, 01 = Male sd->packet_ver = 7; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) pc_setnewpc(sd, account_id, RFIFOL(fd,22), RFIFOL(fd,30), RFIFOL(fd,34), RFIFOB(fd,38), fd); @@ -7358,7 +7364,7 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) pc_setnewpc(sd, account_id, RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18), fd); } // 0x7E - } else if (RFIFOW(fd,0) == 0x7E) { + } else if (cmd == 0x7E) { if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) { // 00 = Female, 01 = Male sd->packet_ver = 9; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) pc_setnewpc(sd, account_id, RFIFOL(fd,21), RFIFOL(fd,28), RFIFOL(fd,32), RFIFOB(fd,36), fd); @@ -7367,7 +7373,7 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) pc_setnewpc(sd, account_id, RFIFOL(fd,18), RFIFOL(fd,24), RFIFOL(fd,28), RFIFOB(fd,32), fd); } // 0xF5 - } else if (RFIFOW(fd,0) == 0xF5) { + } else if (cmd == 0xF5) { if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) { // 00 = Female, 01 = Male sd->packet_ver = 10; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) pc_setnewpc(sd, account_id, RFIFOL(fd,15), RFIFOL(fd,25), RFIFOL(fd,29), RFIFOB(fd,33), fd); @@ -7522,7 +7528,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 )) // オートバーサーク発動 skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0); - + // if(time(&timer) < ((weddingtime=pc_readglobalreg(sd,"PC_WEDDING_TIME")) + 3600)) // skill_status_change_start(&sd->bl,SC_WEDDING,0,weddingtime,0,0,36000,0); @@ -7568,9 +7574,9 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) void clif_parse_TickSend(int fd, struct map_session_data *sd) { nullpo_retv(sd); - if (sd->packet_ver == packet_db_ver) { - sd->client_tick=RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); - } else { + if (USE_PACKET_DB(sd)) { + sd->client_tick=RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); + } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 8: sd->client_tick = RFIFOL(fd,6); @@ -7597,7 +7603,7 @@ void clif_parse_TickSend(int fd, struct map_session_data *sd) { case 16: sd->client_tick = RFIFOL(fd,5); break; - + default: // old version by default (and version 6 + 7) sd->client_tick = RFIFOL(fd,2); break; @@ -7614,7 +7620,7 @@ void clif_parse_TickSend(int fd, struct map_session_data *sd) { */ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) { int x, y; - + nullpo_retv(sd); if (pc_isdead(sd)) { @@ -7642,6 +7648,7 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) { sd->sc_data[SC_BLADESTOP].timer !=-1 || //白刃取り sd->sc_data[SC_SPIDERWEB].timer !=-1 || //スパイダーウェッブ (sd->sc_data[SC_DANCING].timer !=-1 && sd->sc_data[SC_DANCING].val4) || //合奏スキル演奏中は動けない + (sd->sc_data[SC_GOSPEL].timer !=-1 && sd->sc_data[SC_GOSPEL].val4 == BCT_SELF) || // cannot move while gospel is in effect sd->sc_data[SC_CONFUSION].timer !=-1) return; if ((sd->status.option & 2) && pc_checkskill(sd, RG_TUNNELDRIVE) <= 0) @@ -7652,10 +7659,12 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) { pc_stopattack(sd); - if (sd->packet_ver == packet_db_ver) { + if (USE_PACKET_DB(sd)) { int cmd = RFIFOW(fd,0); - x = RFIFOB(fd,packet_db[packet_db_ver][cmd].pos[0]) * 4 + (RFIFOB(fd,packet_db[packet_db_ver][cmd].pos[0] + 1) >> 6); - y = ((RFIFOB(fd,packet_db[packet_db_ver][cmd].pos[0]+1) & 0x3f) << 4) + (RFIFOB(fd,packet_db[packet_db_ver][cmd].pos[0] + 2) >> 4); + x = RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0]) * 4 + + (RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0] + 1) >> 6); + y = ((RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0]+1) & 0x3f) << 4) + + (RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0] + 2) >> 4); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 6: @@ -7748,8 +7757,8 @@ void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) { struct block_list *bl; int account_id; - if (sd->packet_ver == packet_db_ver) { - account_id = RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); + if (USE_PACKET_DB(sd)) { + account_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 8: @@ -7785,7 +7794,7 @@ void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) { bl = map_id2bl(account_id); if (bl == NULL) return; - + WFIFOW(fd,0) = 0x95; WFIFOL(fd,2) = account_id; @@ -7881,13 +7890,13 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c < nullpo_retv(sd); if ((is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None) || (is_charcommand(fd, sd, RFIFOP(fd,4),0)!= CharCommand_None) || - (sd->sc_data && + (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 || //バーサーク時は会話も不可 sd->sc_data[SC_NOCHAT].timer != -1 ))) //チャット禁止 return; - message = (char*)aCalloc(RFIFOW(fd,2) + 128, sizeof(char)); - buf = (char*)aCalloc(RFIFOW(fd,2) + 4, sizeof(char)); + message = (char*)aCallocA(RFIFOW(fd,2) + 128, sizeof(char)); + buf = (char*)aCallocA(RFIFOW(fd,2) + 4, sizeof(char)); //printf("clif_parse_GlobalMessage: message: '%s'.\n", RFIFOP(fd,4)); if (strncmp(RFIFOP(fd,4), sd->status.name, strlen(sd->status.name)) != 0) { @@ -7912,9 +7921,9 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c < if (battle_config.ban_spoof_namer > 0) { chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_spoof_namer, 0); // type: 2 - ban (year, month, day, hour, minute, second) clif_setwaitclose(fd); // forced to disconnect because of the hack - - if(message) free(message); - if(buf) free(buf); + + if(message) aFree(message); + if(buf) aFree(buf); return; } @@ -7958,8 +7967,8 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c < } } - if(message) free(message); - if(buf) free(buf); + if(message) aFree(message); + if(buf) aFree(buf); return; } @@ -8038,9 +8047,9 @@ void clif_parse_ChangeDir(int fd, struct map_session_data *sd) { nullpo_retv(sd); - if (sd->packet_ver == packet_db_ver) { - headdir = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); - dir = RFIFOB(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[1]); + if (USE_PACKET_DB(sd)) { + headdir = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); + dir = RFIFOB(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 7: @@ -8152,9 +8161,9 @@ void clif_parse_ActionRequest(int fd, struct map_session_data *sd) { pc_stop_walking(sd, 0); pc_stopattack(sd); - if (sd->packet_ver == packet_db_ver) { - target_id = RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); - action_type = RFIFOB(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[1]); + if (USE_PACKET_DB(sd)) { + target_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); + action_type = RFIFOB(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 8: @@ -8283,20 +8292,20 @@ void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 .w status.name, RFIFOP(fd,28)); if ((is_charcommand(fd, sd, gm_command, 0) != CharCommand_None) || (is_atcommand(fd, sd, gm_command, 0) != AtCommand_None) || - (sd && sd->sc_data && + (sd && sd->sc_data && (sd->sc_data[SC_BERSERK].timer!=-1 || //バーサーク時は会話も不可 sd->sc_data[SC_NOCHAT].timer != -1))) //チャット禁止 { - if(gm_command) free(gm_command); + if(gm_command) aFree(gm_command); return; } - if(gm_command) free(gm_command); + if(gm_command) aFree(gm_command); // searching destination character dstsd = map_nick2sd(RFIFOP(fd,4)); @@ -8360,8 +8369,8 @@ void clif_parse_TakeItem(int fd, struct map_session_data *sd) { nullpo_retv(sd); - if (sd->packet_ver == packet_db_ver) { - map_object_id = RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); + if (USE_PACKET_DB(sd)) { + map_object_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 7: @@ -8436,9 +8445,9 @@ void clif_parse_DropItem(int fd, struct map_session_data *sd) { sd->sc_data[SC_BERSERK].timer != -1)) ) //バーサーク return; - if (sd->packet_ver == packet_db_ver) { - item_index = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0])-2; - item_amount = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[1]); + if (USE_PACKET_DB(sd)) { + item_index = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-2; + item_amount = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 8: @@ -8505,8 +8514,8 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd) { if (sd->invincible_timer != -1) pc_delinvincibletimer(sd); - if (sd->packet_ver == packet_db_ver) { - pc_useitem(sd,RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0])-2); + if (USE_PACKET_DB(sd)) { + pc_useitem(sd,RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-2); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 6: @@ -8888,10 +8897,10 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) { if (sd->chatID || sd->npc_id != 0 || sd->vender_id != 0) return; - if (sd->packet_ver == packet_db_ver) { - skilllv = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); - skillnum = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[1]); - target_id = RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[2]); + if (USE_PACKET_DB(sd)) { + skilllv = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); + skillnum = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]); + target_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[2]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 6: @@ -8972,7 +8981,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) { return; } - if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || + if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 || sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22) return; @@ -9021,11 +9030,11 @@ void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) { if(sd->chatID) return; skillmoreinfo = -1; - if (sd->packet_ver == packet_db_ver) { - skilllv = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); - skillnum = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[1]); - x = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[2]); - y = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[3]); + if (USE_PACKET_DB(sd)) { + skilllv = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); + skillnum = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]); + x = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[2]); + y = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[3]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 6: @@ -9146,7 +9155,7 @@ void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) { return; } - if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || + if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 || sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22) return; @@ -9176,7 +9185,7 @@ void clif_parse_UseSkillMap(int fd,struct map_session_data *sd) if(sd->chatID) return; - if (sd->npc_id!=0 || sd->vender_id != 0 || (sd->sc_data && + if (sd->npc_id!=0 || sd->vender_id != 0 || (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || sd->sc_data[SC_BERSERK].timer!=-1 || sd->sc_data[SC_NOCHAT].timer!=-1 || @@ -9324,8 +9333,8 @@ void clif_parse_InsertCard(int fd,struct map_session_data *sd) void clif_parse_SolveCharName(int fd, struct map_session_data *sd) { int char_id; - if (sd->packet_ver == packet_db_ver) { - char_id = RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0]); + if (USE_PACKET_DB(sd)) { + char_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 8: @@ -9412,9 +9421,9 @@ void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) { if (sd->npc_id != 0 || sd->vender_id != 0) return; - if (sd->packet_ver == packet_db_ver) { - item_index = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0])-2; - item_amount = RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[1]); + if (USE_PACKET_DB(sd)) { + item_index = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-2; + item_amount = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 8: @@ -9478,9 +9487,9 @@ void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd) { nullpo_retv(sd); - if (sd->packet_ver == packet_db_ver) { - item_index = RFIFOW(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[0])-1; - item_amount = RFIFOL(fd,packet_db[packet_db_ver][RFIFOW(fd,0)].pos[1]); + if (USE_PACKET_DB(sd)) { + item_index = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-1; + item_amount = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]); } else { switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) case 8: @@ -9649,7 +9658,7 @@ void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) { void clif_parse_PartyMessage(int fd, struct map_session_data *sd) { nullpo_retv(sd); if (is_charcommand(fd, sd, RFIFOP(fd,4), 0) != CharCommand_None) - return; + return; if (is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None) return; if(sd->sc_data && @@ -10093,7 +10102,7 @@ void clif_parse_PMIgnore(int fd, struct map_session_data *sd) { // Rewritten by WFIFOW(fd,0) = 0x0d1; // R 00d1 .B .B: type: 0: deny, 1: allow, fail: 0: success, 1: fail WFIFOB(fd,2) = RFIFOB(fd,26); // do nothing only if nick can not exist - if (strlen(nick) < 4) { + if (strlen(nick) < 4) { WFIFOB(fd,3) = 1; // fail WFIFOSET(fd, packet_len_table[0x0d1]); if (RFIFOB(fd,26) == 0) // type @@ -10239,7 +10248,7 @@ void clif_parse_sn_doridori(int fd, struct map_session_data *sd) { * スパノビの爆裂波動 *------------------------------------------ */ -void clif_parse_sn_explosionspirits(int fd, struct map_session_data *sd) +void clif_parse_sn_explosionspirits(int fd, struct map_session_data *sd) { if(sd){ int nextbaseexp=pc_nextbaseexp(sd); @@ -10369,9 +10378,6 @@ void clif_parse_debug(int fd,struct map_session_data *sd) { int i, cmd; - if (packet_db_ver < 0) - return; - cmd = RFIFOW(fd,0); printf("packet debug 0x%4X\n",cmd); @@ -10562,11 +10568,12 @@ static int clif_parse(int fd) { packet_ver = sd->packet_ver; // check authentification packet to know packet version else { - // packet DB - if (cmd == packet_db_connect_cmd) { - if (RFIFOREST(fd) >= packet_db[packet_db_ver][cmd].len && - (RFIFOB(fd,packet_db[packet_db_ver][cmd].pos[4]) == 0 || RFIFOB(fd,packet_db[packet_db_ver][cmd].pos[4]) == 1)) {// 00 = Female, 01 = Male - packet_ver = packet_db_ver; + // packet DB + if (IS_PACKET_DB_VER (cmd)) { + if (RFIFOREST(fd) >= packet_db[clif_config.packet_db_ver][cmd].len && + (RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[4]) == 0 || + RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[4]) == 1)) {// 00 = Female, 01 = Male + packet_ver = clif_config.packet_db_ver; } // 0x72 } else if (cmd == 0x72) { @@ -10597,9 +10604,9 @@ static int clif_parse(int fd) { else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male packet_ver = 11; // 11: 21sept04 else if (RFIFOREST(fd) >= 29 && (RFIFOB(fd,28) == 0 || RFIFOB(fd,28) == 1)) { // 00 = Female, 01 = Male - if (RFIFOW(fd,1) == 0) // testing ^^; + /*if (RFIFOW(fd,1) == 0) // testing ^^; packet_ver = 15; - else + else*/ packet_ver = 13; // 13: 25oct04 (by [Yor]) } // -- some way to identify version 14 and 15? -- @@ -10625,7 +10632,9 @@ static int clif_parse(int fd) { (packet_ver == 14 && (battle_config.packet_ver_flag & 16) == 0) || (packet_ver == 15 && (battle_config.packet_ver_flag & 32) == 0) || (packet_ver == 16 && (battle_config.packet_ver_flag & 64) == 0) || - packet_ver > MAX_PACKET_VER) { // no support yet + packet_ver > MAX_PACKET_VER || // no packet version support yet + // identified version, but unknown client? + (!sd && packet_db[packet_ver][cmd].func != clif_parse_WantToConnection)) { WFIFOW(fd,0) = 0x6a; WFIFOB(fd,2) = 5; // 05 = Game's EXE is not the latest version WFIFOSET(fd,23); @@ -10731,8 +10740,8 @@ static int packetdb_readdb(void) FILE *fp; char line[1024]; int ln=0; - int cmd,j,packet_ver = 0; - char *str[32],*p,*str2[32],*p2; + int cmd,j,k,packet_ver; + char *str[32],*p,*str2[32],*p2,w1[24],w2[24]; struct { void (*func)(); @@ -10861,18 +10870,51 @@ static int packetdb_readdb(void) return 1; } - packet_db_ver = MAX_PACKET_VER; - + clif_config.packet_db_ver = MAX_PACKET_VER; + packet_ver = MAX_PACKET_VER; // read into packet_db's version by default + while(fgets(line,1020,fp)){ if(line[0]=='/' && line[1]=='/') continue; - if (sscanf(line,"packet_ver: %d",&packet_ver) == 1) { - memcpy(&packet_db[packet_ver], &packet_db[packet_ver - 1], sizeof(packet_db[0])); // copy into new version and continue - // i hope this isn't the wrong way to do things ^^; - continue; + if (sscanf(line,"%[^:]: %[^\r\n]",w1,w2) == 2) { + if(strcmpi(w1,"packet_ver")==0) { + packet_ver = atoi(w2); + // copy from previous version into new version and continue + // - indicating all following packets should be read into the newer version + // -- on 2nd thought, rereading everything isn't the best thing to do... + // memcpy(&packet_db[packet_ver], &packet_db[packet_ver - 1], sizeof(packet_db[0])); + continue; + } else if(strcmpi(w1,"packet_db_ver")==0) { + // optional: if you do not wish to read multiple versions from the packet_db, + // remove all "packet_ver: ##" lines, and define the packet DB version with this + if(strcmpi(w2,"default")==0) + clif_config.packet_db_ver = MAX_PACKET_VER; + else { + // to manually set the packet DB version + clif_config.packet_db_ver = atoi(w2); + // check for invalid version + if (clif_config.packet_db_ver > MAX_PACKET_VER || + clif_config.packet_db_ver < 0) + clif_config.packet_db_ver = MAX_PACKET_VER; + } + continue; + } else if(strcmpi(w1,"enable_packet_db")==0) { + // whether we want to allow identifying clients via the packet DB + clif_config.enable_packet_db = battle_config_switch(w2); + // if we don't want to read the packet DB, and use hardcoded values only + if (!clif_config.enable_packet_db) + return 0; + continue; + } else if(strcmpi(w1,"prefer_packet_db")==0) { + // whether the packet DB takes higher precedence over the hardcoded one (type 1) + // and whether to overwrite predefined packet length and functions when reading + // from the DB (type 2) + clif_config.prefer_packet_db = battle_config_switch(w2); // not used for now + continue; + } } - memset(str,0,sizeof(str)); + memset(str,0,sizeof(str)); for(j=0,p=line;j<4 && p;j++){ str[j]=p; p=strchr(p,','); @@ -10888,7 +10930,9 @@ static int packetdb_readdb(void) ShowError(tmp_output); continue; } - packet_db[packet_ver][cmd].len = atoi(str[1]); + k = atoi(str[1]); + // if (packet_db[packet_ver][cmd].len != k && clif_config.prefer_packet_db) // not used for now + packet_db[packet_ver][cmd].len = k; if(str[2]==NULL){ ln++; @@ -10897,13 +10941,15 @@ static int packetdb_readdb(void) for(j=0;j 2 /* && packet_db[cmd].pos[0] == 0 */) +// if(packet_db[clif_config.packet_db_ver][cmd].len > 2 /* && packet_db[cmd].pos[0] == 0 */) // printf("packet_db ver %d: %d 0x%x %d %s %p\n",packet_ver,ln,cmd,packet_db[packet_ver][cmd].len,str[2],packet_db[packet_ver][cmd].func); } - + fclose(fp); - sprintf(tmp_output,"Done reading packet version '"CL_WHITE"%d"CL_RESET"' in '"CL_WHITE"%s"CL_RESET"'.\n", packet_db_ver, "db/packet_db.txt"); + sprintf(tmp_output,"Done reading packet version '"CL_WHITE"%d"CL_RESET"' in '"CL_WHITE"%s"CL_RESET"'.\n", clif_config.packet_db_ver, "db/packet_db.txt"); ShowStatus(tmp_output); return 0; @@ -10936,6 +10984,11 @@ static int packetdb_readdb(void) int do_init_clif(void) { int i; + clif_config.enable_packet_db = 1; // whether to use the packet DB for client connection + clif_config.packet_db_ver = -1; // the main packet version of the DB + clif_config.prefer_packet_db = 1; // whether the packet version takes precedence + clif_config.connect_cmd = 0xF5; // the default packet used for connecting to the server + memset(packet_db,0,sizeof(packet_db)); // size of packet version 5 (old) @@ -11163,6 +11216,7 @@ int do_init_clif(void) { packet_db[14][0x21a].len = 282; packet_db[14][0x21b].len = 10; packet_db[14][0x21c].len = 10; +// packet_db[14][0x143].len = 23; // is this required? uncomment if it is // Init packet function calls for packet ver 15 memcpy(packet_db[15], packet_db[14], sizeof(packet_db[0])); packet_db[15][0x072].func = clif_parse_UseSkillToId; @@ -11200,7 +11254,7 @@ int do_init_clif(void) { packet_db[15][0x116].len = 12; packet_db[15][0x190].len = 15; packet_db[15][0x193].len = 21; - packet_db[15][0x21b].len = 6; + packet_db[15][0x21d].len = 6; packet_db[15][0x222].len = 6; packet_db[15][0x221].len = -1; packet_db[15][0x223].len = 8; @@ -11241,12 +11295,14 @@ int do_init_clif(void) { packet_db[16][0x116].len = 20; packet_db[16][0x09f].len = 17; packet_db[16][0x0f7].len = 21; - // Init packet function calls for packet ver 17 (packet db) - memcpy(packet_db[17], packet_db[16], sizeof(packet_db[0])); + packet_db[16][0x143].len = 10; + // Init packet function calls for the packet_db.txt (17) + memcpy(packet_db[MAX_PACKET_VER], packet_db[MAX_PACKET_VER - 1], sizeof(packet_db[0])); #endif - packetdb_readdb(); - + if (clif_config.enable_packet_db) + packetdb_readdb(); + set_defaultparse(clif_parse); #ifdef __WIN32 if (!make_listen_port(map_port)) { diff --git a/src/map/clif.h b/src/map/clif.h index d0cd2e86e..99e0752d1 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -16,7 +16,6 @@ typedef unsigned int in_addr_t; #define MAX_PACKET_DB 0x224 #define MAX_PACKET_VER 17 -extern int packet_db_ver; struct packet_db { short len; void (*func)(); @@ -24,6 +23,13 @@ struct packet_db { }; extern struct packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB]; +extern struct Clif_Config { + int enable_packet_db; + int packet_db_ver; + int prefer_packet_db; + int connect_cmd; +} clif_config; + void clif_setip(char*); void clif_setport(int); @@ -137,8 +143,8 @@ int clif_petinsight(struct block_list *bl,va_list ap); int clif_npcoutsight(struct block_list *bl,va_list ap); int clif_npcinsight(struct block_list *bl,va_list ap); -int clif_class_change(struct block_list *bl,int class,int type); -int clif_mob_class_change(struct mob_data *md,int class); +int clif_class_change(struct block_list *bl,int class_,int type); +int clif_mob_class_change(struct mob_data *md,int class_); int clif_mob_equip(struct mob_data *md,int nameid); // [Valaris] int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range); @@ -177,7 +183,7 @@ int clif_autospell(struct map_session_data *sd,int skilllv); int clif_devotion(struct map_session_data *sd,int target); int clif_spiritball(struct map_session_data *sd); int clif_combo_delay(struct block_list *src,int wait); -int clif_bladestop(struct block_list *src,struct block_list *dst,int bool); +int clif_bladestop(struct block_list *src,struct block_list *dst,int bool_); int clif_changemapcell(int m,int x,int y,int cell_type,int type); int clif_status_change(struct block_list *bl,int type,int flag); diff --git a/src/map/guild.c b/src/map/guild.c index 5f9e31794..8099ac934 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -284,7 +284,7 @@ int guild_payexp_timer_sub(void *key,void *data,va_list ap) c->exp=0; dellist[(*delp)++]=dataid; - free(c); + aFree(c); return 0; } int guild_payexp_timer(int tid,unsigned int tick,int id,int data) @@ -476,7 +476,7 @@ int guild_recv_info(struct guild *sg) // イベントの発生 if( (ev=numdb_search(guild_infoevent_db,sg->guild_id))!=NULL ){ numdb_erase(guild_infoevent_db,sg->guild_id); - for(;ev;ev2=ev->next,free(ev),ev=ev2){ + for(;ev;ev2=ev->next,aFree(ev),ev=ev2){ npc_event_do(ev->name); } } @@ -750,7 +750,7 @@ int guild_send_memberinfoshort(struct map_session_data *sd,int online) return 0; } // ギルドメンバのオンライン状態/Lv更新通知 -int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class) +int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_) { int i,alv,c,idx=0,om=0,oldonline=-1; struct guild *g=guild_search(guild_id); @@ -762,7 +762,7 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin oldonline=m->online; m->online=online; m->lv=lv; - m->class_=class; + m->class_=class_; idx=i; } if(m->account_id>0){ @@ -938,7 +938,7 @@ int guild_payexp(struct map_session_data *sd,int exp) return 0; if( (c=numdb_search(guild_expcache_db,sd->status.char_id))==NULL ){ - c=(struct guild_expcache *)aCalloc(1,sizeof(struct guild_expcache)); + c=(struct guild_expcache *)aCallocA(1,sizeof(struct guild_expcache)); c->guild_id=sd->status.guild_id; c->account_id=sd->status.account_id; c->char_id=sd->status.char_id; @@ -960,9 +960,9 @@ int guild_getexp(struct map_session_data *sd,int exp) if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL ) return 0; - + if( (c=numdb_search(guild_expcache_db,sd->status.char_id))==NULL ){ - c=(struct guild_expcache *)aCalloc(1,sizeof(struct guild_expcache)); + c=(struct guild_expcache *)aCallocA(1,sizeof(struct guild_expcache)); c->guild_id=sd->status.guild_id; c->account_id=sd->status.account_id; c->char_id=sd->status.char_id; @@ -1191,7 +1191,7 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id const char *guild_name[2]; struct map_session_data *sd[2]; int j,i; - + guild_id[0] = guild_id1; guild_id[1] = guild_id2; guild_name[0] = name1; @@ -1300,7 +1300,7 @@ int guild_broken(int guild_id,int flag) numdb_foreach(guild_db,guild_broken_sub,guild_id); numdb_erase(guild_db,guild_id); guild_storage_delete(guild_id); - free(g); + aFree(g); return 0; } @@ -1396,7 +1396,7 @@ int guild_castledataloadack(int castle_id,int index,int value) } if( (ev=numdb_search(guild_castleinfoevent_db,code))!=NULL ){ numdb_erase(guild_castleinfoevent_db,code); - for(;ev;ev2=ev->next,free(ev),ev=ev2){ + for(;ev;ev2=ev->next,aFree(ev),ev=ev2){ npc_event_do(ev->name); } } @@ -1500,7 +1500,7 @@ int guild_agit_end(void) int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data) { // Run One NPC_Event[OnAgitEliminate] size_t len = strlen((const char*)data); - char *evname=(char*)aCalloc(len + 4,sizeof(char)); + char *evname=(char*)aCallocA(len + 4,sizeof(char)); int c=0; if(!agit_flag) return 0; // Agit already End @@ -1517,7 +1517,7 @@ int guild_agit_break(struct mob_data *md) nullpo_retr(0, md); - evname=(char *)aCalloc(strlen(md->npc_event) + 1, sizeof(char)); + evname=(char *)aCallocA(strlen(md->npc_event) + 1, sizeof(char)); strcpy(evname,md->npc_event); // Now By User to Run [OnAgitBreak] NPC Event... @@ -1539,7 +1539,7 @@ int guild_checkcastles(struct guild *g) { for(i=0;iguild_id; - if(g->guild_id==cas_id) + if(g->guild_id==cas_id) nb_cas=nb_cas+1; } //end for return nb_cas; @@ -1570,12 +1570,12 @@ int guild_isallied(struct guild *g, struct guild_castle *gc) return 0; } - + static int guild_db_final(void *key,void *data,va_list ap) { struct guild *g=data; - free(g); + aFree(g); return 0; } @@ -1583,7 +1583,7 @@ static int castle_db_final(void *key,void *data,va_list ap) { struct guild_castle *gc=data; - free(gc); + aFree(gc); return 0; } @@ -1591,7 +1591,7 @@ static int guild_expcache_db_final(void *key,void *data,va_list ap) { struct guild_expcache *c=data; - free(c); + aFree(c); return 0; } @@ -1599,7 +1599,7 @@ static int guild_infoevent_db_final(void *key,void *data,va_list ap) { struct eventlist *ev=data; - free(ev); + aFree(ev); return 0; } diff --git a/src/map/guild.h b/src/map/guild.h index eefdcb04e..8f5243a8c 100644 --- a/src/map/guild.h +++ b/src/map/guild.h @@ -56,7 +56,7 @@ int guild_delalliance(struct map_session_data *sd,int guild_id,int flag); int guild_opposition(struct map_session_data *sd,int char_id); int guild_send_memberinfoshort(struct map_session_data *sd,int online); -int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class); +int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_); int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx); int guild_memberposition_changed(struct guild *g,int idx,int pos); int guild_change_position(struct map_session_data *sd,int idx, diff --git a/src/map/intif.c b/src/map/intif.c index 9ba9b1ebb..3f1bbfe88 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -457,7 +457,7 @@ int intif_guild_leave(int guild_id,int account_id,int char_id,int flag,const cha } // ギルドメンバのオンライン状況/Lv更新要求 int intif_guild_memberinfoshort(int guild_id, - int account_id,int char_id,int online,int lv,int class) + int account_id,int char_id,int online,int lv,int class_) { if (CheckForCharServer()) return 0; @@ -467,7 +467,7 @@ int intif_guild_memberinfoshort(int guild_id, WFIFOL(inter_fd,10) = char_id; WFIFOB(inter_fd,14) = online; WFIFOW(inter_fd,15) = lv; - WFIFOW(inter_fd,17) = class; + WFIFOW(inter_fd,17) = class_; WFIFOSET(inter_fd,19); return 0; } @@ -640,7 +640,7 @@ int intif_parse_WisMessage(int fd) { // rewritten by [Yor] // if(battle_config.etc_log) // printf("intif_parse_wismessage: %d %s %s %s\n",id,RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54) ); - + sd=map_nick2sd(RFIFOP(fd,32)); // 送信先を探す if(sd!=NULL && strcmp(sd->status.name, RFIFOP(fd,32)) == 0){ /* @@ -698,7 +698,7 @@ int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 .w .24B struct map_session_data *pl_sd; char Wisp_name[24]; char mbuf[255]; - char *message = ((RFIFOW(fd,2) - 30) >= sizeof(mbuf)) ? (char *) aMalloc((RFIFOW(fd,2) - 30)) : mbuf; + char *message = ((RFIFOW(fd,2) - 30) >= sizeof(mbuf)) ? (char *) aMallocA((RFIFOW(fd,2) - 30)) : mbuf; min_gm_level = (int)RFIFOW(fd,28); memcpy(Wisp_name, RFIFOP(fd,4), 24); @@ -712,7 +712,7 @@ int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 .w .24B clif_wis_message(i, Wisp_name, message, strlen(message) + 1); if (message != mbuf) - free(message); + aFree(message); return 0; } diff --git a/src/map/intif.h b/src/map/intif.h index 5077dbe18..761c1ea63 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -33,7 +33,7 @@ int intif_guild_create(const char *name, const struct guild_member *master); int intif_guild_request_info(int guild_id); int intif_guild_addmember(int guild_id, struct guild_member *m); int intif_guild_leave(int guild_id, int account_id, int char_id, int flag, const char *mes); -int intif_guild_memberinfoshort(int guild_id, int account_id, int char_id, int online, int lv, int class); +int intif_guild_memberinfoshort(int guild_id, int account_id, int char_id, int online, int lv, int class_); int intif_guild_break(int guild_id); int intif_guild_message(int guild_id, int account_id, char *mes, int len); int intif_guild_checkconflict(int guild_id, int account_id, int char_id); diff --git a/src/map/itemdb.c b/src/map/itemdb.c index e6a997976..dd8de15d4 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -530,7 +530,7 @@ static int itemdb_read_itemnametable(void) if(!p) break; p++; } - free(buf); + aFree(buf); sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\idnum2itemdisplaynametable.txt"); ShowStatus(tmp_output); @@ -566,7 +566,7 @@ static int itemdb_read_cardillustnametable(void) if(!p) break; p++; } - free(buf); + aFree(buf); sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\num2cardillustnametable.txt"); ShowStatus(tmp_output); @@ -604,7 +604,7 @@ static int itemdb_read_itemslottable(void) if(!p) break; p++; } - free(buf); + aFree(buf); sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslottable.txt"); ShowStatus(tmp_output); @@ -636,7 +636,7 @@ static int itemdb_read_itemslotcounttable(void) if(!p) break; p++; } - free(buf); + aFree(buf); sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslotcounttable.txt"); ShowStatus(tmp_output); @@ -896,10 +896,10 @@ static int itemdb_final(void *key,void *data,va_list ap) nullpo_retr(0, id=data); if(id->use_script) - free(id->use_script); + aFree(id->use_script); if(id->equip_script) - free(id->equip_script); - free(id); + aFree(id->equip_script); + aFree(id); return 0; } diff --git a/src/map/mail.c b/src/map/mail.c index 5d63b6f80..74d2bf7c0 100644 --- a/src/map/mail.c +++ b/src/map/mail.c @@ -30,12 +30,12 @@ extern char msg_table[1000][256]; // Server messages (0-499 reserved for GM comm int mail_check(struct map_session_data *sd,int type) { - int i=0,new=0,priority=0; + int i=0,new_=0,priority=0; char message[50]; if(sd==NULL) return 0; - + sprintf(tmp_msql,"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_msql)) { @@ -64,7 +64,7 @@ int mail_check(struct map_session_data *sd,int type) } if(!atoi(mail_row[3])) { - new++; + new_++; if(atoi(mail_row[4])) priority++; if(type==2 || type==3) { @@ -88,28 +88,28 @@ int mail_check(struct map_session_data *sd,int type) sprintf(message, msg_table[513], i, mail_row[2]); clif_displaymessage(sd->fd, jstrescape(message)); } - + } - + mysql_free_result(mail_res); - + } else { printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle)); return 0; } - if(i>0 && new>0 && type==1) { - //sprintf(message, "You have %d new messages.", new); - sprintf(message, msg_table[514], new); + if(i>0 && new_>0 && type==1) { + //sprintf(message, "You have %d new messages.", new_); + sprintf(message, msg_table[514], new_); clif_displaymessage(sd->fd, jstrescape(message)); } - if(i>0 && new>0 && priority>0 && type==1) { + if(i>0 && new_>0 && priority>0 && type==1) { //sprintf(message, "You have %d unread priority messages.", priority); sprintf(message, msg_table[515], priority); clif_displaymessage(sd->fd, jstrescape(message)); } - if(!new) { + if(!new_) { //clif_displaymessage(sd->fd, "You have no new messages."); clif_displaymessage(sd->fd, msg_table[516]); } @@ -124,7 +124,7 @@ int mail_read(struct map_session_data *sd, int message_id) if(sd==NULL) return 0; - + sprintf(tmp_msql,"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); if (mysql_query(&mail_handle, tmp_msql)) { @@ -162,9 +162,9 @@ int mail_read(struct map_session_data *sd, int message_id) printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) ); } } - + mysql_free_result(mail_res); - + } else { printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle)); return 0; @@ -177,7 +177,7 @@ int mail_delete(struct map_session_data *sd, int message_id) { if(sd==NULL) return 0; - + sprintf(tmp_msql,"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 (mysql_query(&mail_handle, tmp_msql)) { @@ -217,9 +217,9 @@ int mail_delete(struct map_session_data *sd, int message_id) //else clif_displaymessage(sd->fd,"Message deleted."); else clif_displaymessage(sd->fd,msg_table[521]); } - + mysql_free_result(mail_res); - + } else { printf("MySQL error (delete query result for %s): %s\n", mail_db, mysql_error(&mail_handle)); return 0; @@ -232,7 +232,7 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag) { if(sd==NULL) return 0; - + 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_table[522]); @@ -254,8 +254,8 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag) if (mysql_query(&mail_handle, tmp_msql)) { printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle)); return 0; - } - + } + mail_res = mysql_store_result(&mail_handle); if(mail_res) { if (mysql_num_rows(mail_res) == 0) { @@ -268,7 +268,7 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag) while ((mail_row = mysql_fetch_row(mail_res))) { if(strcmp(name,"*")==0) { sprintf(tmp_msql, "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); + " 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_msql, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`)" @@ -276,7 +276,7 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag) if(pc_isGM(sd) < 80) sd->mail_counter=5; } - + if(mysql_query(&mail_handle, tmp_msql) ) { mysql_free_result(mail_res); printf("DB server Error (insert `mail_db`)- %s\n", mysql_error(&mail_handle) ); @@ -295,18 +295,18 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag) int mail_check_timer(int tid,unsigned int tick,int id,int data) { struct map_session_data *sd = NULL; - int i; + int i; if(mail_timer != tid) return 0; sprintf(tmp_msql,"SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db); - + if (mysql_query(&mail_handle, tmp_msql)) { printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle)); mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0); return 0; - } + } mail_res = mysql_store_result(&mail_handle); @@ -324,8 +324,8 @@ int mail_check_timer(int tid,unsigned int tick,int id,int data) if(pc_isGM(sd) < 80 && sd->mail_counter > 0) sd->mail_counter--; if(sd->status.account_id==atoi(mail_row[0])) - //clif_displaymessage(sd->fd, "You have new mail."); - clif_displaymessage(sd->fd, msg_table[526]); + //clif_displaymessage(sd->fd, "You have new mail."); + clif_displaymessage(sd->fd, msg_table[526]); } } } @@ -341,7 +341,7 @@ int mail_check_timer(int tid,unsigned int tick,int id,int data) } 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); return 0; diff --git a/src/map/map.c b/src/map/map.c index a591c97a2..55d571767 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -193,7 +193,7 @@ int map_getusers(void) { int map_freeblock( void *bl ) { if(block_free_lock==0){ - free(bl); + aFree(bl); bl = NULL; } else{ @@ -229,7 +229,7 @@ int map_freeblock_unlock(void) { // printf("map_freeblock_unlock: free %d object\n",block_free_count); // } for(i=0;ibl.id = map_addobject(&fitem->bl); if(fitem->bl.id==0){ - free(fitem); + aFree(fitem); return 0; } @@ -894,9 +894,9 @@ void map_addchariddb(int charid, char *name) { struct charid2nick *p=NULL; int req=0; - p=numdb_search(charid_db,charid); + p = (struct charid2nick*)numdb_search(charid_db,charid); if(p==NULL){ // デ?タベ?スにない - p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick)); + p = (struct charid2nick *)aCallocA(1,sizeof(struct charid2nick)); p->req_id=0; }else numdb_erase(charid_db,charid); @@ -921,7 +921,7 @@ int map_reqchariddb(struct map_session_data * sd,int charid) { nullpo_retr(0, sd); - p=numdb_search(charid_db,charid); + p = (struct charid2nick*)numdb_search(charid_db,charid); if(p!=NULL) // デ?タベ?スにすでにある return 0; p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick)); @@ -1005,7 +1005,7 @@ int map_quit(struct map_session_data *sd) { // check if we've been authenticated [celest] if (sd->state.auth) skill_castcancel(&sd->bl,0); // 詠唱を中?する - + skill_stop_dancing(&sd->bl,1);// ダンス/演奏中? if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //バ?サ?ク中の終了はHPを100に @@ -1052,7 +1052,7 @@ int map_quit(struct map_session_data *sd) { storage_storage_save(sd); if( sd->npc_stackbuf && sd->npc_stackbuf != NULL) { - free( sd->npc_stackbuf ); + aFree( sd->npc_stackbuf ); sd->npc_stackbuf = NULL; } @@ -1092,7 +1092,7 @@ struct map_session_data * map_id2sd(int id) { struct map_session_data *sd=NULL; for(i = 0; i < fd_max; i++) - if (session[i] && (sd = session[i]->session_data) && sd->bl.id == id) + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd->bl.id == id) return sd; return NULL; @@ -1103,7 +1103,7 @@ struct map_session_data * map_id2sd(int id) { *------------------------------------------ */ char * map_charid2nick(int id) { - struct charid2nick *p=numdb_search(charid_db,id); + struct charid2nick *p = (struct charid2nick*)numdb_search(charid_db,id); if(p==NULL) return NULL; @@ -1130,7 +1130,7 @@ struct map_session_data * map_nick2sd(char *nick) { nicklen = strlen(nick); for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) + if (session[i] && (pl_sd = (struct map_session_data*)session[i]->session_data) && pl_sd->state.auth) // Without case sensitive check (increase the number of similar character names found) if (strnicmp(pl_sd->status.name, nick, nicklen) == 0) { // Strict comparison (if found, we finish the function immediatly with correct value) @@ -1160,7 +1160,7 @@ struct block_list * map_id2bl(int id) if(idbl); numdb_erase(id_db,map[m].npc[i]->bl.id); if(map[m].npc[i]->bl.subtype==SCRIPT) { -// free(map[m].npc[i]->u.scr.script); -// free(map[m].npc[i]->u.scr.label_list); +// aFree(map[m].npc[i]->u.scr.script); +// aFree(map[m].npc[i]->u.scr.label_list); } - free(map[m].npc[i]); + aFree(map[m].npc[i]); map[m].npc[i] = NULL; n++; } @@ -1238,7 +1238,7 @@ void map_removenpc(void) { int map_mapname2mapid(char *name) { struct map_data *md=NULL; - md=strdb_search(map_db,name); + md = (struct map_data*)strdb_search(map_db,name); #ifdef USE_AFM // If we can't find the .gat map try .afm instead [celest] @@ -1246,7 +1246,7 @@ int map_mapname2mapid(char *name) { char afm_name[16] = ""; strncpy(afm_name, name, strlen(name) - 4); strcat(afm_name, ".afm"); - md = strdb_search(map_db,afm_name); + md = (struct map_data*)strdb_search(map_db,afm_name); } #endif @@ -1262,7 +1262,7 @@ int map_mapname2mapid(char *name) { int map_mapname2ipport(char *name,int *ip,int *port) { struct map_data_other_server *mdos=NULL; - mdos=strdb_search(map_db,name); + mdos = (struct map_data_other_server*)strdb_search(map_db,name); if(mdos==NULL || mdos->gat) return -1; *ip=mdos->ip; @@ -1385,7 +1385,7 @@ int map_getcellp(struct map_data* m,int x,int y,CELL_CHK cellchk) case CELL_CHKTYPE: return m->gat[j]; default: return 0; - } + } return 0; } @@ -1396,7 +1396,7 @@ int map_getcellp(struct map_data* m,int x,int y,CELL_CHK cellchk) int map_setcell(int m,int x,int y,CELL_SET cellset) { int i,j; - + if(x<0 || x>=map[m].xs || y<0 || y>=map[m].ys) return 0; j=x+y*map[m].xs; @@ -1431,7 +1431,7 @@ int map_setipport(char *name,unsigned long ip,int port) { struct map_data *md=NULL; struct map_data_other_server *mdos=NULL; - md=strdb_search(map_db,name); + md = (struct map_data*)strdb_search(map_db,name); if(md==NULL){ // not exist -> add new data mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server)); memcpy(mdos->name,name,24); @@ -1459,7 +1459,7 @@ int map_setipport(char *name,unsigned long ip,int port) { * 水場高さ設定 *------------------------------------------ */ -static struct { +static struct waterlist_ { char mapname[24]; int waterheight; } *waterlist=NULL; @@ -1487,7 +1487,7 @@ static void map_readwater(char *watertxt) { return; } if(waterlist==NULL) - waterlist=aCalloc(MAX_MAP_PER_SERVER,sizeof(*waterlist)); + waterlist = (struct waterlist_*)aCallocA(MAX_MAP_PER_SERVER,sizeof(*waterlist)); while(fgets(line,1020,fp) && n < MAX_MAP_PER_SERVER){ int wh,count; if(line[0] == '/' && line[1] == '/') @@ -1554,7 +1554,7 @@ static int map_cache_open(char *fn) { map_cache.head.filesize == ftell(map_cache.fp) ) { // キャッシュ読み込み成功 - map_cache.map = aMalloc(sizeof(struct MAP_CACHE_INFO) * map_cache.head.nmaps); + map_cache.map = (struct MAP_CACHE_INFO*)aMallocA(sizeof(struct MAP_CACHE_INFO) * map_cache.head.nmaps); fseek(map_cache.fp,sizeof(struct MAP_CACHE_HEAD),SEEK_SET); fread(map_cache.map,sizeof(struct MAP_CACHE_INFO),map_cache.head.nmaps,map_cache.fp); return 1; @@ -1567,7 +1567,7 @@ static int map_cache_open(char *fn) { map_cache.fp = fopen(fn,"wb"); if(map_cache.fp) { memset(&map_cache.head,0,sizeof(struct MAP_CACHE_HEAD)); - map_cache.map = aCalloc(sizeof(struct MAP_CACHE_INFO),MAX_CAHCE_MAX); + map_cache.map = (struct MAP_CACHE_INFO*)aCallocA(sizeof(struct MAP_CACHE_INFO),MAX_CAHCE_MAX); map_cache.head.nmaps = MAX_CAHCE_MAX; map_cache.head.sizeof_header = sizeof(struct MAP_CACHE_HEAD); map_cache.head.sizeof_map = sizeof(struct MAP_CACHE_INFO); @@ -1589,7 +1589,7 @@ static void map_cache_close(void) { fwrite(map_cache.map,map_cache.head.nmaps,sizeof(struct MAP_CACHE_INFO),map_cache.fp); } fclose(map_cache.fp); - free(map_cache.map); + aFree(map_cache.map); map_cache.fp = NULL; return; } @@ -1607,14 +1607,14 @@ int map_cache_read(struct map_data *m) { int size = map_cache.map[i].xs * map_cache.map[i].ys; m->xs = map_cache.map[i].xs; m->ys = map_cache.map[i].ys; - m->gat = (unsigned char *)aCalloc(m->xs * m->ys,sizeof(unsigned char)); + m->gat = (unsigned char *)aCallocA(m->xs * m->ys,sizeof(unsigned char)); fseek(map_cache.fp,map_cache.map[i].pos,SEEK_SET); if(fread(m->gat,1,size,map_cache.fp) == size) { // 成功 return 1; } else { // なぜかファイル後半が欠けてるので読み直し - m->xs = 0; m->ys = 0; m->gat = NULL; free(m->gat); + m->xs = 0; m->ys = 0; m->gat = NULL; aFree(m->gat); return 0; } } else if(map_cache.map[i].compressed == 1) { @@ -1624,14 +1624,14 @@ int map_cache_read(struct map_data *m) { int size_compress = map_cache.map[i].compressed_len; m->xs = map_cache.map[i].xs; m->ys = map_cache.map[i].ys; - m->gat = (unsigned char *)aMalloc(m->xs * m->ys * sizeof(unsigned char)); - buf = (unsigned char*)aMalloc(size_compress); + m->gat = (unsigned char *)aMallocA(m->xs * m->ys * sizeof(unsigned char)); + buf = (unsigned char*)aMallocA(size_compress); fseek(map_cache.fp,map_cache.map[i].pos,SEEK_SET); if(fread(buf,1,size_compress,map_cache.fp) != size_compress) { // なぜかファイル後半が欠けてるので読み直し printf("fread error\n"); m->xs = 0; m->ys = 0; m->gat = NULL; - free(m->gat); free(buf); + aFree(m->gat); aFree(buf); return 0; } dest_len = m->xs * m->ys; @@ -1639,10 +1639,10 @@ int map_cache_read(struct map_data *m) { if(dest_len != map_cache.map[i].xs * map_cache.map[i].ys) { // 正常に解凍が出来てない m->xs = 0; m->ys = 0; m->gat = NULL; - free(m->gat); free(buf); + aFree(m->gat); aFree(buf); return 0; } - free(buf); + aFree(buf); return 1; } } @@ -1669,7 +1669,7 @@ static int map_cache_write(struct map_data *m) { if(map_read_flag >= READ_FROM_BITMAP_COMPRESSED) { // 圧縮保存 // さすがに2倍に膨れる事はないという事で - write_buf = aMalloc(m->xs * m->ys * 2); + write_buf = (char*)aMallocA(m->xs * m->ys * 2); len_new = m->xs * m->ys * 2; encode_zip(write_buf,&len_new,m->gat,m->xs * m->ys); map_cache.map[i].compressed = 1; @@ -1678,7 +1678,7 @@ static int map_cache_write(struct map_data *m) { len_new = m->xs * m->ys; write_buf = m->gat; map_cache.map[i].compressed = 0; - map_cache.map[i].compressed_len = 0; + map_cache.map[i].compressed_len = 0; } if(len_new <= len_old) { // サイズが同じか小さくなったので場所は変わらない @@ -1696,7 +1696,7 @@ static int map_cache_write(struct map_data *m) { map_cache.map[i].water_height = map_waterheight(m->name); map_cache.dirty = 1; if(map_read_flag >= READ_FROM_BITMAP_COMPRESSED) { - free(write_buf); + aFree(write_buf); } return 0; } @@ -1706,7 +1706,7 @@ static int map_cache_write(struct map_data *m) { if(map_cache.map[i].fn[0] == 0) { // 新しい場所に登録 if(map_read_flag >= READ_FROM_BITMAP_COMPRESSED) { - write_buf = aMalloc(m->xs * m->ys * 2); + write_buf = (char*)aMallocA(m->xs * m->ys * 2); len_new = m->xs * m->ys * 2; encode_zip(write_buf,&len_new,m->gat,m->xs * m->ys); map_cache.map[i].compressed = 1; @@ -1727,7 +1727,7 @@ static int map_cache_write(struct map_data *m) { map_cache.head.filesize += len_new; map_cache.dirty = 1; if(map_read_flag >= READ_FROM_BITMAP_COMPRESSED) { - free(write_buf); + aFree(write_buf); } return 0; } @@ -1819,7 +1819,8 @@ static int map_readafm(int m,char *fn) { map[m].m = m; xs = map[m].xs = afm_size[0]; ys = map[m].ys = afm_size[1]; - map[m].gat = aCalloc(s = map[m].xs * map[m].ys, 1); + // check this, unsigned where it might not need to be + map[m].gat = (unsigned char*)aCallocA(s = map[m].xs * map[m].ys, 1); if(map[m].gat==NULL){ printf("out of memory : map_readmap gat\n"); @@ -1842,14 +1843,14 @@ static int map_readafm(int m,char *fn) { map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE; map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE; size = map[m].bxs * map[m].bys * sizeof(struct block_list*); - map[m].block = aCalloc(size, 1); + map[m].block = (struct block_list**)aCalloc(size, 1); if(map[m].block == NULL){ printf("out of memory : map_readmap block\n"); exit(1); } - map[m].block_mob = aCalloc(size, 1); + map[m].block_mob = (struct block_list**)aCalloc(size, 1); if (map[m].block_mob == NULL) { printf("out of memory : map_readmap block_mob\n"); exit(1); @@ -1857,14 +1858,14 @@ static int map_readafm(int m,char *fn) { size = map[m].bxs*map[m].bys*sizeof(int); - map[m].block_count = aCalloc(size, 1); + map[m].block_count = (int*)aCallocA(size, 1); if(map[m].block_count==NULL){ printf("out of memory : map_readmap block\n"); exit(1); } memset(map[m].block_count,0,size); - map[m].block_mob_count=aCalloc(size, 1); + map[m].block_mob_count = (int*)aCallocA(size, 1); if(map[m].block_mob_count==NULL){ printf("out of memory : map_readmap block_mob\n"); exit(1); @@ -1885,9 +1886,9 @@ static int map_readafm(int m,char *fn) { * マップ1枚読み込み * ===================================================*/ static int map_readmap(int m,char *fn, char *alias, int *map_cache, int maxmap) { - unsigned char *gat=""; + char *gat=""; size_t size; - + int i = 0; int e = 0; char progress[21] = " "; @@ -1925,19 +1926,20 @@ static int map_readmap(int m,char *fn, char *alias, int *map_cache, int maxmap) int s; int wh; int x,y,xs,ys; - struct gat_1cell {float high[4]; int type;} *p=NULL; + struct gat_1cell {float high[4]; int type;} *p=NULL; // read & convert fn - gat=grfio_read(fn); + // again, might not need to be unsigned char + gat = grfio_read(fn); if(gat==NULL) { return -1; // さすがにマップが読めないのはまずいので終了する //printf("Can't load map %s\n",fn); //exit(1); } - + xs=map[m].xs=*(int*)(gat+6); ys=map[m].ys=*(int*)(gat+10); - map[m].gat = (unsigned char *)aCalloc(s = map[m].xs * map[m].ys,sizeof(unsigned char)); + map[m].gat = (char *)aCallocA(s = map[m].xs * map[m].ys,sizeof(char)); wh=map_waterheight(map[m].name); for(y=0;y= READ_FROM_BITMAP) { map_cache_open(map_bitmap_filename); @@ -2032,7 +2034,7 @@ int map_readallmap(void) { char buf[64]; *p++ = '\0'; sprintf(buf,"data\\%s", p); - map[i].alias = strdup(buf); + map[i].alias = aStrdup(buf); } else map[i].alias = NULL; @@ -2041,20 +2043,20 @@ int map_readallmap(void) { map_delmap(map[i].name); maps_removed++; i--; - } + } } } - free(waterlist); + aFree(waterlist); printf("\r"); snprintf(tmp_output,sizeof(tmp_output),"Successfully loaded '"CL_WHITE"%d"CL_RESET"' maps.%30s\n",map_num,""); ShowInfo(tmp_output); - + map_cache_close(); if(map_read_flag == CREATE_BITMAP || map_read_flag == CREATE_BITMAP_COMPRESSED) { --map_read_flag; } - + if (maps_removed) { snprintf(tmp_output,sizeof(tmp_output),"Maps Removed: '"CL_WHITE"%d"CL_RESET"'\n",maps_removed); ShowNotice(tmp_output); @@ -2119,15 +2121,15 @@ int parse_console(char *buf) { int m, n; struct map_session_data *sd; - sd = aCalloc(sizeof(*sd), 1); + sd = (struct map_session_data*)aCalloc(sizeof(*sd), 1); sd->fd = 0; strcpy( sd->status.name , "console"); - type = (char *)aMalloc(64); - command = (char *)aMalloc(64); - map = (char *)aMalloc(64); - buf2 = (char *)aMalloc(72); + type = (char *)aMallocA(64); + command = (char *)aMallocA(64); + map = (char *)aMallocA(64); + buf2 = (char *)aMallocA(72); memset(type,0,64); memset(command,0,64); @@ -2184,12 +2186,12 @@ int parse_console(char *buf) { } end: - free(buf); - free(type); - free(command); - free(map); - free(buf2); - free(sd); + aFree(buf); + aFree(type); + aFree(command); + aFree(map); + aFree(buf2); + aFree(sd); return 0; } @@ -2317,7 +2319,7 @@ int inter_config_read(char *cfgName) if(i!=2) continue; if(strcmpi(w1,"stall_time")==0){ - stall_time_ = atoi(w2); + stall_time_ = atoi(w2); #ifndef TXT_ONLY } else if(strcmpi(w1,"item_db_db")==0){ strcpy(item_db_db,w2); @@ -2484,7 +2486,7 @@ void char_online_check(void) chrif_char_reset_offline(); for(i=0;isession_data) && sd && sd->state.auth && + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd && sd->state.auth && !(battle_config.hide_GM_session && pc_isGM(sd))) if(sd->status.char_id) { chrif_char_online(sd); @@ -2523,21 +2525,22 @@ int flush_timer(int tid, unsigned int tick, int id, int data){ int id_db_final(void *k,void *d,va_list ap) { struct mob_data *id; - nullpo_retr(0, id=d); + nullpo_retr(0, id = (struct mob_data*)d); if(id->lootitem) - free(id->lootitem); + aFree(id->lootitem); if(id) - free(id); + aFree(id); return 0; } + int map_db_final(void *k,void *d,va_list ap) { struct map_data *id; - nullpo_retr(0, id=d); + nullpo_retr(0, id = (struct map_data*)d); if(id->gat) - free(id->gat); + aFree(id->gat); if(id) - free(id); + aFree(id); return 0; } int nick_db_final(void *k,void *d,va_list ap){ return 0; } @@ -2607,14 +2610,14 @@ void do_final(void) { do_final_guild(); /* for(i=0;i= (sizeof(mob_db) / sizeof(mob_db[0])) || mob_db[id].name[0] == '\0') return 0; @@ -85,28 +85,28 @@ int mobdb_checkid(const int id) * The minimum data set for MOB spawning *------------------------------------------ */ -int mob_spawn_dataset(struct mob_data *md,const char *mobname,int class) +int mob_spawn_dataset(struct mob_data *md,const char *mobname,int class_) { nullpo_retr(0, md); md->bl.prev=NULL; md->bl.next=NULL; if(strcmp(mobname,"--en--")==0) - memcpy(md->name,mob_db[class].name,24); + memcpy(md->name,mob_db[class_].name,24); else if(strcmp(mobname,"--ja--")==0) - memcpy(md->name,mob_db[class].jname,24); + memcpy(md->name,mob_db[class_].jname,24); else memcpy(md->name,mobname,24); md->n = 0; - md->base_class = md->class_ = class; + md->base_class = md->class_ = class_; md->bl.id= npc_get_new_npc_id(); memset(&md->state,0,sizeof(md->state)); md->timer = -1; md->target_id=0; md->attacked_id=0; - md->speed=mob_db[class].speed; + md->speed=mob_db[class_].speed; return 0; } @@ -117,10 +117,10 @@ int mob_spawn_dataset(struct mob_data *md,const char *mobname,int class) *------------------------------------------ */ int mob_once_spawn(struct map_session_data *sd,char *mapname, - int x,int y,const char *mobname,int class,int amount,const char *event) + int x,int y,const char *mobname,int class_,int amount,const char *event) { struct mob_data *md=NULL; - int m,count,lv=255,r=class; + int m,count,lv=255,r=class_; if( sd ) lv=sd->status.base_level; @@ -130,27 +130,27 @@ int mob_once_spawn(struct map_session_data *sd,char *mapname, else m=map_mapname2mapid(mapname); - if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>6000) // 値が異常なら召喚を止める + if(m<0 || amount<=0 || (class_>=0 && class_<=1000) || class_>MAX_MOB_DB) // 値が異常なら召喚を止める return 0; - if(class<0){ // ランダムに召喚 + if(class_<0){ // ランダムに召喚 int i=0; - int j=-class-1; + int j=-class_-1; int k; if(j>=0 && j=2000){ - class=mob_db[0].summonper[j]; + class_=mob_db[0].summonper[j]; } }else{ return 0; } // if(battle_config.etc_log) -// printf("mobclass=%d try=%d\n",class,i); +// printf("mobclass=%d try=%d\n",class_,i); } if(sd){ if(x<=0) x=sd->bl.x; @@ -163,21 +163,21 @@ int mob_once_spawn(struct map_session_data *sd,char *mapname, md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data)); memset(md, '\0', sizeof *md); - if(class>4000) { // large/tiny mobs [Valaris] + if(class_>4000) { // large/tiny mobs [Valaris] md->size=2; - class-=4000; + class_-=4000; } - else if(class>MAX_MOB_DB) { + else if(class_>MAX_MOB_DB) { md->size=1; - class-=MAX_MOB_DB; + class_-=MAX_MOB_DB; } - if(mob_db[class].mode&0x02) + if(mob_db[class_].mode&0x02) md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); else md->lootitem=NULL; - mob_spawn_dataset(md,mobname,class); + mob_spawn_dataset(md,mobname,class_); md->bl.m=m; md->bl.x=x; md->bl.y=y; @@ -195,15 +195,15 @@ int mob_once_spawn(struct map_session_data *sd,char *mapname, md->bl.type=BL_MOB; map_addiddb(&md->bl); mob_spawn(md->bl.id); - - if(class==1288) { // emperium hp based on defense level [Valaris] + + if(class_==1288) { // emperium hp based on defense level [Valaris] struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name); if(gc) { - mob_db[class].max_hp+=2000*gc->defense; - md->hp=mob_db[class].max_hp; + mob_db[class_].max_hp+=2000*gc->defense; + md->hp=mob_db[class_].max_hp; } } // end addition [Valaris] - + } return (amount>0)?md->bl.id:0; @@ -214,7 +214,7 @@ int mob_once_spawn(struct map_session_data *sd,char *mapname, */ int mob_once_spawn_area(struct map_session_data *sd,char *mapname, int x0,int y0,int x1,int y1, - const char *mobname,int class,int amount,const char *event) + const char *mobname,int class_,int amount,const char *event) { int x,y,i,max,lx=-1,ly=-1,id=0; int m; @@ -227,7 +227,7 @@ int mob_once_spawn_area(struct map_session_data *sd,char *mapname, max=(y1-y0+1)*(x1-x0+1)*3; if(max>1000)max=1000; - if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>6000) // A summon is stopped if a value is unusual + if(m<0 || amount<=0 || (class_>=0 && class_<=1000) || class_>MAX_MOB_DB) // A summon is stopped if a value is unusual return 0; for(i=0;i=0 && class<=1000) || class>MAX_MOB_DB) // Invalid monster classes + if(m<0 || amount<=0 || (class_>=0 && class_<=1000) || class_>MAX_MOB_DB) // Invalid monster classes return 0; - if(class<0) + if(class_<0) return 0; - + if(sd){ if(x<=0) x=sd->bl.x; if(y<=0) y=sd->bl.y; } - + else if(x<=0 || y<=0) printf("mob_spawn_guardian: ??\n"); - + for(count=0;countbl.m=m; md->bl.x=x; md->bl.y=y; @@ -315,7 +315,7 @@ int mob_spawn_guardian(struct map_session_data *sd,char *mapname, gc=guild_mapname2gc(map[md->bl.m].name); if(gc) { - mob_db[class].max_hp+=2000*gc->defense; + mob_db[class_].max_hp+=2000*gc->defense; if(guardian==0) { md->hp=gc->Ghp0; gc->GID0=md->bl.id; } if(guardian==1) { md->hp=gc->Ghp1; gc->GID1=md->bl.id; } if(guardian==2) { md->hp=gc->Ghp2; gc->GID2=md->bl.id; } @@ -324,7 +324,7 @@ int mob_spawn_guardian(struct map_session_data *sd,char *mapname, if(guardian==5) { md->hp=gc->Ghp5; gc->GID5=md->bl.id; } if(guardian==6) { md->hp=gc->Ghp6; gc->GID6=md->bl.id; } if(guardian==7) { md->hp=gc->Ghp7; gc->GID7=md->bl.id; } - + } } @@ -373,49 +373,49 @@ int mob_exclusion_check(struct mob_data *md,struct map_session_data *sd) * Appearance income of mob *------------------------------------------ */ -int mob_get_viewclass(int class) +int mob_get_viewclass(int class_) { - return mob_db[class].view_class; + return mob_db[class_].view_class; } -int mob_get_sex(int class) +int mob_get_sex(int class_) { - return mob_db[class].sex; + return mob_db[class_].sex; } -short mob_get_hair(int class) +short mob_get_hair(int class_) { - return mob_db[class].hair; + return mob_db[class_].hair; } -short mob_get_hair_color(int class) +short mob_get_hair_color(int class_) { - return mob_db[class].hair_color; + return mob_db[class_].hair_color; } -short mob_get_weapon(int class) +short mob_get_weapon(int class_) { - return mob_db[class].weapon; + return mob_db[class_].weapon; } -short mob_get_shield(int class) +short mob_get_shield(int class_) { - return mob_db[class].shield; + return mob_db[class_].shield; } -short mob_get_head_top(int class) +short mob_get_head_top(int class_) { - return mob_db[class].head_top; + return mob_db[class_].head_top; } -short mob_get_head_mid(int class) +short mob_get_head_mid(int class_) { - return mob_db[class].head_mid; + return mob_db[class_].head_mid; } -short mob_get_head_buttom(int class) +short mob_get_head_buttom(int class_) { - return mob_db[class].head_buttom; + return mob_db[class_].head_buttom; } -short mob_get_clothes_color(int class) // Add for player monster dye - Valaris +short mob_get_clothes_color(int class_) // Add for player monster dye - Valaris { - return mob_db[class].clothes_color; // End + return mob_db[class_].clothes_color; // End } -int mob_get_equip(int class) // mob equip [Valaris] +int mob_get_equip(int class_) // mob equip [Valaris] { - return mob_db[class].equip; + return mob_db[class_].equip; } /*========================================== * Is MOB in the state in which the present movement is possible or not? @@ -432,7 +432,7 @@ int mob_can_move(struct mob_data *md) md->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター md->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り md->sc_data[SC_SPIDERWEB].timer != -1 //スパイダーウェッブ - ) + ) return 0; return 1; @@ -536,7 +536,7 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data) if(md->walkpath.path_pos>=md->walkpath.path_len) clif_fixmobpos(md); // とまったときに位置の再送信 - } + } return 0; } @@ -613,7 +613,7 @@ static int mob_attack(struct mob_data *md,unsigned int tick,int data) if(tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || tsd->sc_data[SC_BASILICA].timer != -1 || ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && !((race == 4 || race == 6) && !tsd->perfect_hiding) ) ) ) { md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; + md->state.targettype = NONE_ATTACKABLE; return 0; } @@ -739,7 +739,7 @@ static int mob_timer(int tid,unsigned int tick,int id,int data) if( (bl=map_id2bl(id)) == NULL ){ //攻撃してきた敵がもういないのは正常のようだ return 1; } - + if(!bl || !bl->type || bl->type!=BL_MOB) return 1; @@ -904,7 +904,7 @@ int mob_spawn(int id) if(!md || !md->bl.type || md->bl.type!=BL_MOB) return -1; - + md->last_spawntime=tick; if( md->bl.prev!=NULL ){ // clif_clearchar_area(&md->bl,3); @@ -969,7 +969,7 @@ int mob_spawn(int id) if(gc) md->guild_id = gc->guild_id; } - + md->deletetimer=-1; md->skilltimer=-1; @@ -1042,7 +1042,7 @@ int mob_stop_walking(struct mob_data *md,int type) if(md->state.state == MS_WALK || md->state.state == MS_IDLE) { int dx=0,dy=0; - + md->walkpath.path_len=0; if(type&4){ dx=md->to_x-md->bl.x; @@ -1101,7 +1101,7 @@ int mob_can_reach(struct mob_data *md,struct block_list *bl,int range) if(gc && agit_flag==0) // Guardians will not attack during non-woe time [Valaris] return 0; // end addition [Valaris] - + if(bl && bl->type == BL_PC){ nullpo_retr(0, sd=(struct map_session_data *)bl); if(!gc) @@ -1183,7 +1183,9 @@ int mob_target(struct mob_data *md,struct block_list *bl,int dist) return 0; } // Nothing will be carried out if there is no mind of changing TAGE by TAGE ending. - if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && ( !(mode&0x04) || rand()%100>25) ) + if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && (!(mode&0x04) || rand()%100>25) && + // if the monster was provoked ignore the above rule [celest] + !(md->state.provoke_flag && md->state.provoke_flag == bl->id)) return 0; if(mode&0x20 || // Coercion is exerted if it is MVPMOB. @@ -1197,11 +1199,13 @@ int mob_target(struct mob_data *md,struct block_list *bl,int dist) return 0; } - md->target_id=bl->id; // Since there was no disturbance, it locks on to target. + md->target_id = bl->id; // Since there was no disturbance, it locks on to target. if(bl->type == BL_PC || bl->type == BL_MOB) md->state.targettype = ATTACKABLE; else md->state.targettype = NONE_ATTACKABLE; + if (md->state.provoke_flag) + md->state.provoke_flag = 0; md->min_chase=dist+13; if(md->min_chase>26) md->min_chase=26; @@ -1245,9 +1249,9 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap) race=mob_db[smd->class_].race; //対象がPCの場合 if(tsd && - !pc_isdead(tsd) && - tsd->bl.m == smd->bl.m && - tsd->invincible_timer == -1 && + !pc_isdead(tsd) && + tsd->bl.m == smd->bl.m && + tsd->invincible_timer == -1 && !pc_isinvisible(tsd) && (dist=distance(smd->bl.x,smd->bl.y,tsd->bl.x,tsd->bl.y))<9 ) @@ -1259,7 +1263,7 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap) rand()%1000<1000/(++(*pcc)) ){ // 範囲内PCで等確率にする smd->target_id=tsd->bl.id; smd->state.targettype = ATTACKABLE; - smd->min_chase=13; + smd->min_chase=13; } } } @@ -1298,7 +1302,7 @@ static int mob_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap) mode=mob_db[md->class_].mode; else mode=md->mode; - + if( !md->target_id && mode&0x02){ if(!md->lootitem || (battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) ) @@ -1393,7 +1397,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick) } // Although there is the master, since it is somewhat far, it approaches. - if((!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mob_can_move(md) && + if((!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mob_can_move(md) && (md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_len==0) && md->master_dist<15){ int i=0,dx,dy,ret; if(md->master_dist>4) { @@ -1716,7 +1720,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0); i++; } while(ret && i<5); - + if(ret){ // 移動不可能な所からの攻撃なら2歩下る if(dx<0) dx=2; else if(dx>0) dx=-2; @@ -1969,13 +1973,13 @@ static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data) clif_additem(ditem->first_sd,0,0,flag); map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); } - free(ditem); + aFree(ditem); return 0; } map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); - free(ditem); + aFree(ditem); return 0; } @@ -1995,13 +1999,13 @@ static int mob_delay_item_drop2(int tid,unsigned int tick,int id,int data) clif_additem(ditem->first_sd,0,0,flag); map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); } - free(ditem); + aFree(ditem); return 0; } map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); - free(ditem); + aFree(ditem); return 0; } @@ -2219,71 +2223,71 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) } md->hp-=damage; - + if(md->class_ >= 1285 && md->class_ <=1287) { // guardian hp update [Valaris] struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name); if(gc) { - if(md->bl.id==gc->GID0) { + if(md->bl.id==gc->GID0) { gc->Ghp0=md->hp; if(gc->Ghp0<=0) { guild_castledatasave(gc->castle_id,10,0); guild_castledatasave(gc->castle_id,18,0); } - } - if(md->bl.id==gc->GID1) { + } + if(md->bl.id==gc->GID1) { gc->Ghp1=md->hp; if(gc->Ghp1<=0) { guild_castledatasave(gc->castle_id,11,0); guild_castledatasave(gc->castle_id,19,0); } } - if(md->bl.id==gc->GID2) { + if(md->bl.id==gc->GID2) { gc->Ghp2=md->hp; if(gc->Ghp2<=0) { guild_castledatasave(gc->castle_id,12,0); guild_castledatasave(gc->castle_id,20,0); } } - if(md->bl.id==gc->GID3) { + if(md->bl.id==gc->GID3) { gc->Ghp3=md->hp; if(gc->Ghp3<=0) { guild_castledatasave(gc->castle_id,13,0); guild_castledatasave(gc->castle_id,21,0); } } - if(md->bl.id==gc->GID4) { + if(md->bl.id==gc->GID4) { gc->Ghp4=md->hp; if(gc->Ghp4<=0) { guild_castledatasave(gc->castle_id,14,0); guild_castledatasave(gc->castle_id,22,0); } } - if(md->bl.id==gc->GID5) { + if(md->bl.id==gc->GID5) { gc->Ghp5=md->hp; if(gc->Ghp5<=0) { guild_castledatasave(gc->castle_id,15,0); guild_castledatasave(gc->castle_id,23,0); } } - if(md->bl.id==gc->GID6) { + if(md->bl.id==gc->GID6) { gc->Ghp6=md->hp; if(gc->Ghp6<=0) { guild_castledatasave(gc->castle_id,16,0); guild_castledatasave(gc->castle_id,24,0); } } - if(md->bl.id==gc->GID7) { + if(md->bl.id==gc->GID7) { gc->Ghp7=md->hp; if(gc->Ghp7<=0) { guild_castledatasave(gc->castle_id,17,0); guild_castledatasave(gc->castle_id,25,0); - + } } } } // end addition [Valaris] - + if(md->option&2 ) skill_status_change_end(&md->bl, SC_HIDING, -1); if(md->option&4 ) @@ -2291,7 +2295,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) if(md->state.special_mob_ai == 2){//スフィアーマイン int skillidx=0; - + if((skillidx=mob_skillid2skillidx(md->class_,NPC_SELFDESTRUCTION2))>=0){ md->mode |= 0x1; md->next_walktime=tick; @@ -2403,10 +2407,10 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) job_exp=mob_db[md->class_].job_exp*per/256; if(job_exp < 1) job_exp = 1; } - + if(sd && battle_config.pk_mode && (mob_db[md->class_].lv - sd->status.base_level >= 20)) { base_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris] - } + } if(sd && battle_config.pk_mode && (mob_db[md->class_].lv - sd->status.base_level >= 20)) { job_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris] } @@ -2415,7 +2419,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) job_exp = 0; } else { - if(battle_config.zeny_from_mobs) { + if(battle_config.zeny_from_mobs) { if(md->level > 0) zeny=(md->level+rand()%md->level)*per/256; // zeny calculation moblv + random moblv [Valaris] if(mob_db[md->class_].mexp > 0) zeny*=rand()%250; @@ -2425,7 +2429,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) base_exp+=((md->level-mob_db[md->class_].lv)*mob_db[md->class_].base_exp*.03)*per/256; } } - + if((pid=tmpsd[i]->status.party_id)>0){ // パーティに入っている int j=0; for(j=0;jbl); if(sd->monster_drop_itemid[i] <= 0) continue; - if(sd->monster_drop_race[i] & (1<monster_drop_race[i] & (1<class_].mode & 0x20 && sd->monster_drop_race[i] & 1<<10) || (!(mob_db[md->class_].mode & 0x20) && sd->monster_drop_race[i] & 1<<11) ) { if(sd->monster_drop_itemrate[i] <= rand()%10000) @@ -2572,7 +2576,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) int log_mvp[2] = {0}; int j; int mexp; - temp = ((double)mob_db[md->class_].mexp * (9.+(double)count)/10.); //[Gengar] + temp = ((double)mob_db[md->class_].mexp * (9.+(double)count)/10.); //[Gengar] mexp = (temp > 2147483647.)? 0x7fffffff:(int)temp; if(mexp < 1) mexp = 1; clif_mvp_effect(mvp_sd); // エフェクト @@ -2617,7 +2621,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) if(md->npc_event[0] && strcmp(((md->npc_event)+strlen(md->npc_event)-13),"::OnAgitBreak") == 0) { printf("MOB.C: Run NPC_Event[OnAgitBreak].\n"); if (agit_flag == 1) //Call to Run NPC_Event[OnAgitBreak] - guild_agit_break(md); + guild_agit_break(md); } // SCRIPT実行 @@ -2665,7 +2669,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) int mob_class_change(struct mob_data *md,int *value) { unsigned int tick = gettick(); - int i,c,hp_rate,max_hp,class,count = 0; + int i,c,hp_rate,max_hp,class_,count = 0; nullpo_retr(0, md); nullpo_retr(0, value); @@ -2677,13 +2681,13 @@ int mob_class_change(struct mob_data *md,int *value) while(count < 5 && value[count] > 1000 && value[count] <= MAX_MOB_DB) count++; if(count < 1) return 0; - class = value[rand()%count]; - if(class<=1000 || class>MAX_MOB_DB) return 0; + class_ = value[rand()%count]; + if(class_<=1000 || class_>MAX_MOB_DB) return 0; max_hp = battle_get_max_hp(&md->bl); hp_rate = md->hp*100/max_hp; - clif_mob_class_change(md,class); - md->class_ = class; + clif_mob_class_change(md,class_); + md->class_ = class_; max_hp = battle_get_max_hp(&md->bl); if(battle_config.monster_class_change_full_recover==1) { md->hp = max_hp; @@ -2694,7 +2698,7 @@ int mob_class_change(struct mob_data *md,int *value) if(md->hp > max_hp) md->hp = max_hp; else if(md->hp < 1) md->hp = 1; - memcpy(md->name,mob_db[class].jname,24); + memcpy(md->name,mob_db[class_].jname,24); memset(&md->state,0,sizeof(md->state)); md->attacked_id = 0; md->target_id = 0; @@ -2710,13 +2714,13 @@ int mob_class_change(struct mob_data *md,int *value) md->next_walktime = tick+rand()%50+5000; md->attackabletime = tick; md->canmove_tick = tick; - + for(i=0,c=tick-1000*3600*10;iskilldelay[i] = c; md->skillid=0; md->skilllv=0; - if(md->lootitem == NULL && mob_db[class].mode&0x02) + if(md->lootitem == NULL && mob_db[class_].mode&0x02) md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); skill_clear_unitgroup(&md->bl); @@ -2902,7 +2906,7 @@ int mob_countslave(struct mob_data *md) int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag) { struct mob_data *md; - int bx,by,m,count = 0,class,k,a = amount; + int bx,by,m,count = 0,class_,k,a = amount; nullpo_retr(0, md2); nullpo_retr(0, value); @@ -2918,12 +2922,12 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag) for(k=0;kMAX_MOB_DB) continue; + class_ = value[k]; + if(class_<=1000 || class_>MAX_MOB_DB) continue; for(;amount>0;amount--){ int x=0,y=0,i=0; md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data)); - if(mob_db[class].mode&0x02) + if(mob_db[class_].mode&0x02) md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); else md->lootitem=NULL; @@ -2937,7 +2941,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag) y=by; } - mob_spawn_dataset(md,"--ja--",class); + mob_spawn_dataset(md,"--ja--",class_); md->bl.m=m; md->bl.x=x; md->bl.y=y; @@ -3018,15 +3022,15 @@ int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv) *MOBskillから該当skillidのskillidxを返す *------------------------------------------ */ -int mob_skillid2skillidx(int class,int skillid) +int mob_skillid2skillidx(int class_,int skillid) { int i; - struct mob_skill *ms=mob_db[class].skill; - + struct mob_skill *ms=mob_db[class_].skill; + if(ms==NULL) return -1; - for(i=0;ibl.type!=BL_MOB || md->bl.prev==NULL ) return 0; @@ -3259,7 +3263,7 @@ int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx) nullpo_retr(0, md); nullpo_retr(0, ms=&mob_db[md->class_].skill[skill_idx]); - + if( target==NULL && (target=map_id2bl(md->target_id))==NULL ) return 0; @@ -3692,10 +3696,10 @@ int mobskill_event(struct mob_data *md,int flag) int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl) { struct mob_data *md=NULL; - + nullpo_retr(0,sd); nullpo_retr(0,bl); - + if(bl->type==BL_MOB && (md=(struct mob_data *)bl) && (md->class_ == 1288 || md->class_ == 1287 || md->class_ == 1286 || md->class_ == 1285)) { @@ -3712,7 +3716,7 @@ int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl) return 0;//正規ギルド承認がないとダメージ無し } - + return 1; } /*========================================== @@ -3739,53 +3743,53 @@ int mobskill_deltimer(struct mob_data *md ) * Since un-setting [ mob ] up was used, it is an initial provisional value setup. *------------------------------------------ */ -static int mob_makedummymobdb(int class) +static int mob_makedummymobdb(int class_) { int i; - sprintf(mob_db[class].name,"mob%d",class); - sprintf(mob_db[class].jname,"mob%d",class); - mob_db[class].lv=1; - mob_db[class].max_hp=1000; - mob_db[class].max_sp=1; - mob_db[class].base_exp=2; - mob_db[class].job_exp=1; - mob_db[class].range=1; - mob_db[class].atk1=7; - mob_db[class].atk2=10; - mob_db[class].def=0; - mob_db[class].mdef=0; - mob_db[class].str=1; - mob_db[class].agi=1; - mob_db[class].vit=1; - mob_db[class].int_=1; - mob_db[class].dex=6; - mob_db[class].luk=2; - mob_db[class].range2=10; - mob_db[class].range3=10; - mob_db[class].size=0; - mob_db[class].race=0; - mob_db[class].element=0; - mob_db[class].mode=0; - mob_db[class].speed=300; - mob_db[class].adelay=1000; - mob_db[class].amotion=500; - mob_db[class].dmotion=500; - mob_db[class].dropitem[0].nameid=909; // Jellopy - mob_db[class].dropitem[0].p=1000; + sprintf(mob_db[class_].name,"mob%d",class_); + sprintf(mob_db[class_].jname,"mob%d",class_); + mob_db[class_].lv=1; + mob_db[class_].max_hp=1000; + mob_db[class_].max_sp=1; + mob_db[class_].base_exp=2; + mob_db[class_].job_exp=1; + mob_db[class_].range=1; + mob_db[class_].atk1=7; + mob_db[class_].atk2=10; + mob_db[class_].def=0; + mob_db[class_].mdef=0; + mob_db[class_].str=1; + mob_db[class_].agi=1; + mob_db[class_].vit=1; + mob_db[class_].int_=1; + mob_db[class_].dex=6; + mob_db[class_].luk=2; + mob_db[class_].range2=10; + mob_db[class_].range3=10; + mob_db[class_].size=0; + mob_db[class_].race=0; + mob_db[class_].element=0; + mob_db[class_].mode=0; + mob_db[class_].speed=300; + mob_db[class_].adelay=1000; + mob_db[class_].amotion=500; + mob_db[class_].dmotion=500; + mob_db[class_].dropitem[0].nameid=909; // Jellopy + mob_db[class_].dropitem[0].p=1000; for(i=1;i<8;i++){ - mob_db[class].dropitem[i].nameid=0; - mob_db[class].dropitem[i].p=0; + mob_db[class_].dropitem[i].nameid=0; + mob_db[class_].dropitem[i].p=0; } // Item1,Item2 - mob_db[class].mexp=0; - mob_db[class].mexpper=0; + mob_db[class_].mexp=0; + mob_db[class_].mexpper=0; for(i=0;i<3;i++){ - mob_db[class].mvpitem[i].nameid=0; - mob_db[class].mvpitem[i].p=0; + mob_db[class_].mvpitem[i].nameid=0; + mob_db[class_].mvpitem[i].p=0; } for(i=0;iMAX_MOB_DB) + class_=atoi(str[0]); + if(class_<=1000 || class_>MAX_MOB_DB) continue; - mob_db[class].view_class=class; - memcpy(mob_db[class].name,str[1],24); - memcpy(mob_db[class].jname,str[2],24); - mob_db[class].lv=atoi(str[3]); - mob_db[class].max_hp=atoi(str[4]); - mob_db[class].max_sp=atoi(str[5]); - - mob_db[class].base_exp=atoi(str[6]); - if(mob_db[class].base_exp < 0) - mob_db[class].base_exp = 0; - else if(mob_db[class].base_exp > 0 && (mob_db[class].base_exp*battle_config.base_exp_rate/100 > 1000000000 || - mob_db[class].base_exp*battle_config.base_exp_rate/100 < 0)) - mob_db[class].base_exp=1000000000; - else - mob_db[class].base_exp*= battle_config.base_exp_rate/100; - - mob_db[class].job_exp=atoi(str[7]); - if(mob_db[class].job_exp < 0) - mob_db[class].job_exp = 0; - else if(mob_db[class].job_exp > 0 && (mob_db[class].job_exp*battle_config.job_exp_rate/100 > 1000000000 || - mob_db[class].job_exp*battle_config.job_exp_rate/100 < 0)) - mob_db[class].job_exp=1000000000; - else - mob_db[class].job_exp*=battle_config.job_exp_rate/100; - - mob_db[class].range=atoi(str[8]); - mob_db[class].atk1=atoi(str[9]); - mob_db[class].atk2=atoi(str[10]); - mob_db[class].def=atoi(str[11]); - mob_db[class].mdef=atoi(str[12]); - mob_db[class].str=atoi(str[13]); - mob_db[class].agi=atoi(str[14]); - mob_db[class].vit=atoi(str[15]); - mob_db[class].int_=atoi(str[16]); - mob_db[class].dex=atoi(str[17]); - mob_db[class].luk=atoi(str[18]); - mob_db[class].range2=atoi(str[19]); - mob_db[class].range3=atoi(str[20]); - mob_db[class].size=atoi(str[21]); - mob_db[class].race=atoi(str[22]); - mob_db[class].element=atoi(str[23]); - mob_db[class].mode=atoi(str[24]); - mob_db[class].speed=atoi(str[25]); - mob_db[class].adelay=atoi(str[26]); - mob_db[class].amotion=atoi(str[27]); - mob_db[class].dmotion=atoi(str[28]); + mob_db[class_].view_class=class_; + memcpy(mob_db[class_].name,str[1],24); + memcpy(mob_db[class_].jname,str[2],24); + mob_db[class_].lv=atoi(str[3]); + mob_db[class_].max_hp=atoi(str[4]); + mob_db[class_].max_sp=atoi(str[5]); + + mob_db[class_].base_exp=atoi(str[6]); + if(mob_db[class_].base_exp < 0) + mob_db[class_].base_exp = 0; + else if(mob_db[class_].base_exp > 0 && (mob_db[class_].base_exp*battle_config.base_exp_rate/100 > 1000000000 || + mob_db[class_].base_exp*battle_config.base_exp_rate/100 < 0)) + mob_db[class_].base_exp=1000000000; + else + mob_db[class_].base_exp*= battle_config.base_exp_rate/100; + + mob_db[class_].job_exp=atoi(str[7]); + if(mob_db[class_].job_exp < 0) + mob_db[class_].job_exp = 0; + else if(mob_db[class_].job_exp > 0 && (mob_db[class_].job_exp*battle_config.job_exp_rate/100 > 1000000000 || + mob_db[class_].job_exp*battle_config.job_exp_rate/100 < 0)) + mob_db[class_].job_exp=1000000000; + else + mob_db[class_].job_exp*=battle_config.job_exp_rate/100; + + mob_db[class_].range=atoi(str[8]); + mob_db[class_].atk1=atoi(str[9]); + mob_db[class_].atk2=atoi(str[10]); + mob_db[class_].def=atoi(str[11]); + mob_db[class_].mdef=atoi(str[12]); + mob_db[class_].str=atoi(str[13]); + mob_db[class_].agi=atoi(str[14]); + mob_db[class_].vit=atoi(str[15]); + mob_db[class_].int_=atoi(str[16]); + mob_db[class_].dex=atoi(str[17]); + mob_db[class_].luk=atoi(str[18]); + mob_db[class_].range2=atoi(str[19]); + mob_db[class_].range3=atoi(str[20]); + mob_db[class_].size=atoi(str[21]); + mob_db[class_].race=atoi(str[22]); + mob_db[class_].element=atoi(str[23]); + mob_db[class_].mode=atoi(str[24]); + mob_db[class_].speed=atoi(str[25]); + mob_db[class_].adelay=atoi(str[26]); + mob_db[class_].amotion=atoi(str[27]); + mob_db[class_].dmotion=atoi(str[28]); for(i=0;i<8;i++){ int rate = 0,type,ratemin,ratemax; - mob_db[class].dropitem[i].nameid=atoi(str[29+i*2]); - type = itemdb_type(mob_db[class].dropitem[i].nameid); + mob_db[class_].dropitem[i].nameid=atoi(str[29+i*2]); + type = itemdb_type(mob_db[class_].dropitem[i].nameid); if (type == 0) { // Added [Valaris] rate = battle_config.item_rate_heal; ratemin = battle_config.item_drop_heal_min; @@ -3947,28 +3951,28 @@ static int mob_readdb(void) } rate = rate * atoi(str[30+i*2])/100; rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate; - mob_db[class].dropitem[i].p = rate; + mob_db[class_].dropitem[i].p = rate; } // Item1,Item2 - mob_db[class].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100; - mob_db[class].mexpper=atoi(str[46]); + mob_db[class_].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100; + mob_db[class_].mexpper=atoi(str[46]); for(i=0;i<3;i++){ - mob_db[class].mvpitem[i].nameid=atoi(str[47+i*2]); - mob_db[class].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100; + mob_db[class_].mvpitem[i].nameid=atoi(str[47+i*2]); + mob_db[class_].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100; } for(i=0;iMAX_MOB_DB) // 値が異常なら処理しない。 + if(class_<=1000 || class_>MAX_MOB_DB) // 値が異常なら処理しない。 continue; k=atoi(str[1]); if(k >= 0) - mob_db[class].view_class=k; - - if((mob_db[class].view_class < 24) || (mob_db[class].view_class > 4000)) { - mob_db[class].sex=atoi(str[2]); - mob_db[class].hair=atoi(str[3]); - mob_db[class].hair_color=atoi(str[4]); - mob_db[class].weapon=atoi(str[5]); - mob_db[class].shield=atoi(str[6]); - mob_db[class].head_top=atoi(str[7]); - mob_db[class].head_mid=atoi(str[8]); - mob_db[class].head_buttom=atoi(str[9]); - mob_db[class].option=atoi(str[10])&~0x46; - mob_db[class].clothes_color=atoi(str[11]); // Monster player dye option - Valaris + mob_db[class_].view_class=k; + + if((mob_db[class_].view_class < 24) || (mob_db[class_].view_class > 4000)) { + mob_db[class_].sex=atoi(str[2]); + mob_db[class_].hair=atoi(str[3]); + mob_db[class_].hair_color=atoi(str[4]); + mob_db[class_].weapon=atoi(str[5]); + mob_db[class_].shield=atoi(str[6]); + mob_db[class_].head_top=atoi(str[7]); + mob_db[class_].head_mid=atoi(str[8]); + mob_db[class_].head_buttom=atoi(str[9]); + mob_db[class_].option=atoi(str[10])&~0x46; + mob_db[class_].clothes_color=atoi(str[11]); // Monster player dye option - Valaris } - else if(atoi(str[2]) > 0) mob_db[class].equip=atoi(str[2]); // mob equipment [Valaris] + else if(atoi(str[2]) > 0) mob_db[class_].equip=atoi(str[2]); // mob equipment [Valaris] ln++; } @@ -4066,7 +4070,7 @@ static int mob_read_randommonster(void) return -1; } while(fgets(line,1020,fp)){ - int class,per; + int class_,per; if(line[0] == '/' && line[1] == '/') continue; memset(str,0,sizeof(str)); @@ -4079,10 +4083,10 @@ static int mob_read_randommonster(void) if(str[0]==NULL || str[2]==NULL) continue; - class = atoi(str[0]); + class_ = atoi(str[0]); per=atoi(str[2]); - if((class>1000 && class<=MAX_MOB_DB) || class==0) - mob_db[class].summonper[i]=per; + if((class_>1000 && class_<=MAX_MOB_DB) || class_==0) + mob_db[class_].summonper[i]=per; } fclose(fp); sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n",mobfile[i]); @@ -4267,12 +4271,12 @@ void mob_reload(void) static int mob_read_sqldb(void) { char line[1024]; - int i,class; + int i,class_; long unsigned int ln=0; char *str[55],*p,*np; - + memset(mob_db,0,sizeof(mob_db)); - + sprintf (tmp_sql, "SELECT * FROM `%s`",mob_db_db); if(mysql_query(&mmysql_handle, tmp_sql) ) { printf("DB server Error (select %s to Memory)- %s\n",mob_db_db,mysql_error(&mmysql_handle) ); @@ -4301,53 +4305,53 @@ static int mob_read_sqldb(void) } else str[i]=p; } - - class=atoi(str[0]); - if(class<=1000 || class>MAX_MOB_DB) + + class_=atoi(str[0]); + if(class_<=1000 || class_>MAX_MOB_DB) continue; - + ln++; - - mob_db[class].view_class=class; - memcpy(mob_db[class].name,str[1],24); - memcpy(mob_db[class].jname,str[2],24); - mob_db[class].lv=atoi(str[3]); - mob_db[class].max_hp=atoi(str[4]); - mob_db[class].max_sp=atoi(str[5]); - mob_db[class].base_exp=atoi(str[6])* + + mob_db[class_].view_class=class_; + memcpy(mob_db[class_].name,str[1],24); + memcpy(mob_db[class_].jname,str[2],24); + mob_db[class_].lv=atoi(str[3]); + mob_db[class_].max_hp=atoi(str[4]); + mob_db[class_].max_sp=atoi(str[5]); + mob_db[class_].base_exp=atoi(str[6])* battle_config.base_exp_rate/100; - if(mob_db[class].base_exp <= 0) - mob_db[class].base_exp = 1; - mob_db[class].job_exp=atoi(str[7])* + if(mob_db[class_].base_exp <= 0) + mob_db[class_].base_exp = 1; + mob_db[class_].job_exp=atoi(str[7])* battle_config.job_exp_rate/100; - if(mob_db[class].job_exp <= 0) - mob_db[class].job_exp = 1; - mob_db[class].range=atoi(str[8]); - mob_db[class].atk1=atoi(str[9]); - mob_db[class].atk2=atoi(str[10]); - mob_db[class].def=atoi(str[11]); - mob_db[class].mdef=atoi(str[12]); - mob_db[class].str=atoi(str[13]); - mob_db[class].agi=atoi(str[14]); - mob_db[class].vit=atoi(str[15]); - mob_db[class].int_=atoi(str[16]); - mob_db[class].dex=atoi(str[17]); - mob_db[class].luk=atoi(str[18]); - mob_db[class].range2=atoi(str[19]); - mob_db[class].range3=atoi(str[20]); - mob_db[class].size=atoi(str[21]); - mob_db[class].race=atoi(str[22]); - mob_db[class].element=atoi(str[23]); - mob_db[class].mode=atoi(str[24]); - mob_db[class].speed=atoi(str[25]); - mob_db[class].adelay=atoi(str[26]); - mob_db[class].amotion=atoi(str[27]); - mob_db[class].dmotion=atoi(str[28]); + if(mob_db[class_].job_exp <= 0) + mob_db[class_].job_exp = 1; + mob_db[class_].range=atoi(str[8]); + mob_db[class_].atk1=atoi(str[9]); + mob_db[class_].atk2=atoi(str[10]); + mob_db[class_].def=atoi(str[11]); + mob_db[class_].mdef=atoi(str[12]); + mob_db[class_].str=atoi(str[13]); + mob_db[class_].agi=atoi(str[14]); + mob_db[class_].vit=atoi(str[15]); + mob_db[class_].int_=atoi(str[16]); + mob_db[class_].dex=atoi(str[17]); + mob_db[class_].luk=atoi(str[18]); + mob_db[class_].range2=atoi(str[19]); + mob_db[class_].range3=atoi(str[20]); + mob_db[class_].size=atoi(str[21]); + mob_db[class_].race=atoi(str[22]); + mob_db[class_].element=atoi(str[23]); + mob_db[class_].mode=atoi(str[24]); + mob_db[class_].speed=atoi(str[25]); + mob_db[class_].adelay=atoi(str[26]); + mob_db[class_].amotion=atoi(str[27]); + mob_db[class_].dmotion=atoi(str[28]); for(i=0;i<8;i++){ int rate = 0,type,ratemin,ratemax; - mob_db[class].dropitem[i].nameid=atoi(str[29+i*2]); - type = itemdb_type(mob_db[class].dropitem[i].nameid); + mob_db[class_].dropitem[i].nameid=atoi(str[29+i*2]); + type = itemdb_type(mob_db[class_].dropitem[i].nameid); if (type == 0) { // Added by Valaris rate = battle_config.item_rate_heal; ratemin = battle_config.item_drop_heal_min; @@ -4375,27 +4379,27 @@ static int mob_read_sqldb(void) } rate = (rate / 100) * atoi(str[30+i*2]); rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate; - mob_db[class].dropitem[i].p = rate; + mob_db[class_].dropitem[i].p = rate; } - - mob_db[class].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100; - mob_db[class].mexpper=atoi(str[46]); + + mob_db[class_].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100; + mob_db[class_].mexpper=atoi(str[46]); for(i=0;i<3;i++){ - mob_db[class].mvpitem[i].nameid=atoi(str[47+i*2]); - mob_db[class].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100; + mob_db[class_].mvpitem[i].nameid=atoi(str[47+i*2]); + mob_db[class_].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100; } for(i=0;iareanpc_id=nd->bl.id; npc_event(sd,strcat(name,"::OnTouch"),0); } - free(name); + aFree(name); return 0; } int npc_enable(const char *name,int flag) @@ -92,7 +92,7 @@ int npc_enable(const char *name,int flag) struct npc_data *nd=strdb_search(npcname_db,name); if (nd==NULL) return 0; - + if (flag&1) { // 有効化 nd->flag&=~1; clif_spawnnpc(nd); @@ -132,7 +132,7 @@ int npc_event_dequeue(struct map_session_data *sd) sd->npc_id=0; if (sd->eventqueue[0][0]) { // キューのイベント処理 - char *name=(char *)aCalloc(50,sizeof(char)); + char *name=(char *)aCallocA(50,sizeof(char)); int i; memcpy(name,sd->eventqueue[0],50); @@ -164,9 +164,9 @@ int npc_event_timer(int tid,unsigned int tick,int id,int data) struct map_session_data *sd=map_id2sd(id); if (sd==NULL) return 0; - + npc_event(sd,(const char *)data,0); - free((void*)data); + aFree((void*)data); return 0; } @@ -226,7 +226,7 @@ int npc_timer(int tid,unsigned int tick,int id,int data) // Added by RoVeRT { strdb_foreach(npcname_db,npc_timer_sub); - free((void*)data); + aFree((void*)data); return 0; }*/ /*========================================== @@ -239,14 +239,14 @@ int npc_event_export(void *key,void *data,va_list ap) char *lname=(char *)key; int pos=(int)data; struct npc_data *nd=va_arg(ap,struct npc_data *); - + if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) { struct event_data *ev; char *buf; char *p=strchr(lname,':'); // エクスポートされる ev=aCalloc(sizeof(struct event_data), 1); - buf=aCalloc(50, 1); + buf=aCallocA(50, 1); if (ev==NULL || buf==NULL) { printf("npc_event_export: out of memory !\n"); exit(1); @@ -344,17 +344,17 @@ int npc_event_doall_sub(void *key,void *data,va_list ap) run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id); (*c)++; } - + return 0; } int npc_event_doall(const char *name) { int c=0; char buf[64]="::"; - + strncpy(buf+2,name,62); strdb_foreach(ev_db,npc_event_doall_sub,&c,buf); - return c; + return c; } int npc_event_do_sub(void *key,void *data,va_list ap) @@ -380,7 +380,7 @@ int npc_event_do_sub(void *key,void *data,va_list ap) int npc_event_do(const char *name) { int c=0; - + if (*name==':' && name[1]==':') { return npc_event_doall(name+2); } @@ -400,7 +400,7 @@ int npc_event_do_clock(int tid,unsigned int tick,int id,int data) char buf[64]; char *day=""; int c=0; - + time(&timer); t=localtime(&timer); @@ -413,7 +413,7 @@ int npc_event_do_clock(int tid,unsigned int tick,int id,int data) case 5: day = "Fri"; break; case 6: day = "Sat"; break; } - + if (t->tm_min != ev_tm_b.tm_min ) { sprintf(buf,"OnMinute%02d",t->tm_min); c+=npc_event_doall(buf); @@ -460,7 +460,7 @@ int npc_addeventtimer(struct npc_data *nd,int tick,const char *name) if( nd->eventtimer[i]==-1 ) break; if(iu.scr.timer_event; int j,i=nd->u.scr.timeramount; - if(te==NULL) te=aMalloc(sizeof(struct npc_timerevent_list)); + if(te==NULL) te=aMallocA(sizeof(struct npc_timerevent_list)); else te=aRealloc( te, sizeof(struct npc_timerevent_list) * (i+1) ); if(te==NULL){ printf("npc_timerevent_import: out of memory !\n"); @@ -581,7 +581,7 @@ int npc_timerevent(int tid,unsigned int tick,int id,int data) nd->u.scr.timertick=tick; te=nd->u.scr.timer_event+ nd->u.scr.nexttimer; nd->u.scr.timerid = -1; - + t = nd->u.scr.timer+=data; nd->u.scr.nexttimer++; if( nd->u.scr.timeramount>nd->u.scr.nexttimer ){ @@ -605,7 +605,7 @@ int npc_timerevent_start(struct npc_data *nd, int rid) n=nd->u.scr.timeramount; if( nd->u.scr.nexttimer>=0 || n==0 ) return 0; - + for(j=0;ju.scr.timer_event[j].timer > nd->u.scr.timer ) break; @@ -617,7 +617,7 @@ int npc_timerevent_start(struct npc_data *nd, int rid) nd->u.scr.timertick=gettick(); if (rid >= 0) nd->u.scr.rid=rid; // changed to: attaching to given rid by default [Shinomori] // if rid is less than 0 leave it unchanged [celest] - + next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer; nd->u.scr.timerid = add_timer(gettick()+next,npc_timerevent,nd->bl.id,next); return 0; @@ -743,7 +743,7 @@ int npc_event(struct map_session_data *sd,const char *eventname,int mob_kill) npc_event_dequeue(sd); return 0; } - + sd->npc_id=nd->bl.id; sd->npc_pos=run_script(nd->u.scr.script,ev->pos,sd->bl.id,nd->bl.id); return 0; @@ -764,7 +764,7 @@ int npc_command_sub(void *key,void *data,va_list ap) if (strcmp(command,temp)==0) run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id); } - + return 0; } @@ -793,7 +793,7 @@ int npc_touch_areanpc(struct map_session_data *sd,int m,int x,int y) f=0; continue; } - + switch(map[m].npc[i]->bl.subtype) { case WARP: xs=map[m].npc[i]->u.warp.xs; @@ -824,7 +824,7 @@ int npc_touch_areanpc(struct map_session_data *sd,int m,int x,int y) break; case SCRIPT: { - char *name=(char *)aCalloc(50,sizeof(char)); + char *name=(char *)aCallocA(50,sizeof(char)); memcpy(name,map[m].npc[i]->name,50); if(sd->areanpc_id==map[m].npc[i]->bl.id) @@ -832,7 +832,7 @@ int npc_touch_areanpc(struct map_session_data *sd,int m,int x,int y) sd->areanpc_id=map[m].npc[i]->bl.id; if(npc_event(sd,strcat(name,"::OnTouch"),0)>0) npc_click(sd,map[m].npc[i]->bl.id); - free(name); + aFree(name); break; } } @@ -855,7 +855,7 @@ int npc_checknear(struct map_session_data *sd,int id) printf("no such npc : %d\n",id); return 1; } - + if (nd->class_<0) // イベント系は常にOK return 0; @@ -968,7 +968,7 @@ int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list) { struct npc_data *nd; double z; - int i,j,w,skill,itemamount=0,new=0; + int i,j,w,skill,itemamount=0,new_=0; nullpo_retr(3, sd); nullpo_retr(3, item_list); @@ -998,7 +998,7 @@ int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list) case ADDITEM_EXIST: break; case ADDITEM_NEW: - new++; + new_++; break; case ADDITEM_OVERAMOUNT: return 2; @@ -1010,7 +1010,7 @@ int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list) return 1; // zeny不足 if (w+sd->weight > sd->max_weight) return 2; // 重量超過 - if (pc_inventoryblank(sd)walkpath.path_pos>=nd->walkpath.path_len) clif_fixnpcpos(nd); // When npc stops, retransmission current of a position. - + } return 0; } @@ -1237,7 +1237,7 @@ static int npc_walktimer(int tid,unsigned int tick,int id,int data) if(nd->walktimer != tid){ return 0; } - + nd->walktimer=-1; if(nd->bl.prev == NULL) @@ -1302,7 +1302,7 @@ int npc_stop_walking(struct npc_data *nd,int type) if(nd->state.state == MS_WALK || nd->state.state == MS_IDLE) { int dx=0,dy=0; - + nd->walkpath.path_len=0; if(type&4){ dx=nd->to_x-nd->bl.x; @@ -1352,7 +1352,7 @@ void npc_clearsrcfile() while( p ) { struct npc_src_list *p2=p; p=p->next; - free(p2); + aFree(p2); } npc_src_first=NULL; npc_src_last=NULL; @@ -1363,7 +1363,7 @@ void npc_clearsrcfile() */ void npc_addsrcfile(char *name) { - struct npc_src_list *new; + struct npc_src_list *new_; size_t len; if ( strcmpi(name,"clear")==0 ) { @@ -1382,16 +1382,16 @@ void npc_addsrcfile(char *name) } } - len = sizeof(*new) + strlen(name); - new=(struct npc_src_list *)aCalloc(1,len); - new->next = NULL; - strncpy(new->name,name,strlen(name)+1); + len = sizeof(*new_) + strlen(name); + new_=(struct npc_src_list *)aCalloc(1,len); + new_->next = NULL; + strncpy(new_->name,name,strlen(name)+1); if (npc_src_first==NULL) - npc_src_first = new; + npc_src_first = new_; if (npc_src_last) - npc_src_last->next = new; + npc_src_last->next = new_; - npc_src_last=new; + npc_src_last=new_; } /*========================================== * 読み込むnpcファイルの削除 @@ -1411,7 +1411,7 @@ void npc_delsrcfile(char *name) *lp=p->next; if ( npc_src_last==p ) npc_src_last=pp; - free(p); + aFree(p); break; } } @@ -1525,7 +1525,7 @@ static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4) p=strchr(p,','); } if (pos == 0) { - free(nd); + aFree(nd); return 1; } nd->u.shop_item[pos++].nameid = 0; @@ -1545,7 +1545,7 @@ static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4) nd->opt1 = 0; nd->opt2 = 0; nd->opt3 = 0; - + nd = (struct npc_data *)aRealloc(nd, sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos); @@ -1572,14 +1572,14 @@ int npc_convertlabel_db(void *key,void *data,va_list ap) struct npc_label_list *lst; int num; char *p=strchr(lname,':'); - + nullpo_retr(0, ap); nullpo_retr(0, nd=va_arg(ap,struct npc_data *)); lst=nd->u.scr.label_list; num=nd->u.scr.label_list_num; if(!lst){ - lst=(struct npc_label_list *)aCalloc(1,sizeof(struct npc_label_list)); + lst=(struct npc_label_list *)aCallocA(1,sizeof(struct npc_label_list)); num=0; }else lst=(struct npc_label_list *)aRealloc(lst,sizeof(struct npc_label_list)*(num+1)); @@ -1598,7 +1598,7 @@ int npc_convertlabel_db(void *key,void *data,va_list ap) */ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines) { - int x,y,dir=0,m,xs=0,ys=0,class=0; // [Valaris] thanks to fov + int x,y,dir=0,m,xs=0,ys=0,class_=0; // [Valaris] thanks to fov char mapname[24]; unsigned char *srcbuf=NULL,*script; int srcsize=65536; @@ -1627,7 +1627,7 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line if(strcmp(w2,"script")==0){ // スクリプトの解析 - srcbuf=(char *)aCalloc(srcsize,sizeof(char)); + srcbuf=(char *)aCallocA(srcsize,sizeof(char)); if (strchr(first_line,'{')) { strcpy(srcbuf,strchr(first_line,'{')); startline=*lines; @@ -1657,13 +1657,13 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line script=parse_script(srcbuf,startline); if (script==NULL) { // script parse error? - free(srcbuf); + aFree(srcbuf); return 1; } }else{ // duplicateする - + char srcname[128]; struct npc_data *nd2; if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){ @@ -1678,22 +1678,22 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line label_dup=nd2->u.scr.label_list; label_dupnum=nd2->u.scr.label_list_num; src_id=nd2->bl.id; - + }// end of スクリプト解析 nd=(struct npc_data *)aCalloc(1,sizeof(struct npc_data)); if(m==-1){ // スクリプトコピー用のダミーNPC - - }else if( sscanf(w4,"%d,%d,%d",&class,&xs,&ys)==3) { + + }else if( sscanf(w4,"%d,%d,%d",&class_,&xs,&ys)==3) { // 接触型NPC int i,j; - + if (xs>=0)xs=xs*2+1; if (ys>=0)ys=ys*2+1; - - if (class>=0) { + + if (class_>=0) { for(i=0;iu.scr.xs=xs; nd->u.scr.ys=ys; } else { // クリック型NPC - class=atoi(w4); + class_=atoi(w4); nd->u.scr.xs=0; nd->u.scr.ys=0; } - - if (class<0 && m>=0) { // イベント型NPC + + if (class_<0 && m>=0) { // イベント型NPC evflag=1; } @@ -1735,7 +1735,7 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line nd->bl.id=npc_get_new_npc_id(); nd->dir = dir; nd->flag=0; - nd->class_=class; + nd->class_=class_; nd->speed=200; nd->u.scr.script=script; nd->u.scr.src_id=src_id; @@ -1766,21 +1766,21 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line //----------------------------------------- - // ラベルデータの準備 + // ラベルデータの準備 if(srcbuf){ // script本体がある場合の処理 - + // ラベルデータのコンバート label_db=script_get_label_db(); strdb_foreach(label_db,npc_convertlabel_db,nd); - + // もう使わないのでバッファ解放 - free(srcbuf); + aFree(srcbuf); }else{ // duplicate -// nd->u.scr.label_list=aMalloc(sizeof(struct npc_label_list)*label_dupnum); +// nd->u.scr.label_list=aMallocA(sizeof(struct npc_label_list)*label_dupnum); // memcpy(nd->u.scr.label_list,label_dup,sizeof(struct npc_label_list)*label_dupnum); nd->u.scr.label_list=label_dup; // ラベルデータ共有 @@ -1792,13 +1792,13 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line for(i=0;iu.scr.label_list_num;i++){ char *lname=nd->u.scr.label_list[i].name; int pos=nd->u.scr.label_list[i].pos; - + if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) { struct event_data *ev; char *buf; // エクスポートされる ev=(struct event_data *)aCalloc(1,sizeof(struct event_data)); - buf=(char *)aCalloc(50,sizeof(char)); + buf=(char *)aCallocA(50,sizeof(char)); if (strlen(lname)>24) { printf("npc_parse_script: label name error !\n"); exit(1); @@ -1810,7 +1810,7 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line } } } - + //----------------------------------------- // ラベルデータからタイマーイベント取り込み for(i=0;iu.scr.label_list_num;i++){ @@ -1822,7 +1822,7 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line struct npc_timerevent_list *te=nd->u.scr.timer_event; int j,k=nd->u.scr.timeramount; if(te==NULL) - te=(struct npc_timerevent_list *)aCalloc(1,sizeof(struct npc_timerevent_list)); + te=(struct npc_timerevent_list *)aCallocA(1,sizeof(struct npc_timerevent_list)); else te=(struct npc_timerevent_list *)aRealloc( te, sizeof(struct npc_timerevent_list) * (k+1) ); for(j=0;ju.scr.nexttimer=-1; nd->u.scr.timerid=-1; - + return 0; } @@ -1859,7 +1859,7 @@ static int npc_parse_function(char *w1,char *w2,char *w3,char *w4,char *first_li char *p; // スクリプトの解析 - srcbuf=(char *)aCalloc(srcsize,sizeof(char)); + srcbuf=(char *)aCallocA(srcsize,sizeof(char)); if (strchr(first_line,'{')) { strcpy(srcbuf,strchr(first_line,'{')); startline=*lines; @@ -1889,11 +1889,11 @@ static int npc_parse_function(char *w1,char *w2,char *w3,char *w4,char *first_li script=parse_script(srcbuf,startline); if (script==NULL) { // script parse error? - free(srcbuf); + aFree(srcbuf); return 1; } - p=(char *)aCalloc(50,sizeof(char)); + p=(char *)aCallocA(50,sizeof(char)); strncpy(p,w3,50); strdb_insert(script_get_userfunc_db(),p,script); @@ -1901,10 +1901,10 @@ static int npc_parse_function(char *w1,char *w2,char *w3,char *w4,char *first_li // label_db=script_get_label_db(); // もう使わないのでバッファ解放 - free(srcbuf); - + aFree(srcbuf); + // printf("function %s => %p\n",p,script); - + return 0; } @@ -1915,7 +1915,7 @@ static int npc_parse_function(char *w1,char *w2,char *w3,char *w4,char *first_li */ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) { - int m,x,y,xs,ys,class,num,delay1,delay2,level; + int m,x,y,xs,ys,class_,num,delay1,delay2,level; int i; char mapname[24]; char mobname[24]; @@ -1926,7 +1926,7 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) delay1=delay2=0; // 引数の個数チェック if (sscanf(w1,"%[^,],%d,%d,%d,%d",mapname,&x,&y,&xs,&ys) < 3 || - sscanf(w4,"%d,%d,%d,%d,%s",&class,&num,&delay1,&delay2,eventname) < 2 ) { + sscanf(w4,"%d,%d,%d,%d,%s",&class_,&num,&delay1,&delay2,eventname) < 2 ) { printf("bad monster line : %s\n",w3); return 1; } @@ -1941,13 +1941,13 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) for(i=0;i4000) { // large/tiny mobs [Valaris] + if(class_>4000) { // large/tiny mobs [Valaris] md->size=2; - class-=4000; + class_-=4000; } - else if(class>2000) { + else if(class_>2000) { md->size=1; - class-=2000; + class_-=2000; } md->bl.prev=NULL; @@ -1958,9 +1958,9 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) if(sscanf(w3,"%[^,],%d",mobname,&level) > 1) { if(strcmp(mobname,"--en--")==0) - memcpy(md->name,mob_db[class].name,24); + memcpy(md->name,mob_db[class_].name,24); else if(strcmp(mobname,"--ja--")==0) - memcpy(md->name,mob_db[class].jname,24); + memcpy(md->name,mob_db[class_].jname,24); md->level=level; } @@ -1968,7 +1968,7 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) memcpy(md->name,w3,24); md->n = i; - md->base_class = md->class_ = class; + md->base_class = md->class_ = class_; md->bl.id=npc_get_new_npc_id(); md->m =m; md->x0=x; @@ -1982,9 +1982,9 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) md->timer = -1; md->target_id=0; md->attacked_id=0; - md->speed=mob_db[class].speed; + md->speed=mob_db[class_].speed; - if (mob_db[class].mode&0x02) + if (mob_db[class_].mode&0x02) md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); else md->lootitem=NULL; @@ -2122,19 +2122,19 @@ static int npc_parse_mapflag(char *w1,char *w2,char *w3,char *w4) } else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris] map[m].flag.noicewall=1; - } + } else if (strcmpi(w3,"snow")==0) { // snow [Valaris] map[m].flag.snow=1; - } + } else if (strcmpi(w3,"fog")==0) { // fog [Valaris] map[m].flag.fog=1; - } + } else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris] map[m].flag.sakura=1; - } + } else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris] map[m].flag.leaves=1; - } + } else if (strcmpi(w3,"rain")==0) { // rain [Valaris] map[m].flag.rain=1; } @@ -2144,7 +2144,7 @@ static int npc_parse_mapflag(char *w1,char *w2,char *w3,char *w4) else if (strcmpi(w3,"nogo")==0) { // celest map[m].flag.nogo=1; } - + return 0; } @@ -2169,12 +2169,12 @@ static int npc_read_indoors(void) if ((m = map_mapname2mapid(map_name)) >= 0) map[m].flag.indoors=1; } - + p=strchr(p,10); if(!p) break; p++; } - free(buf); + aFree(buf); sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\indoorrswtable.txt"); ShowStatus(tmp_output); @@ -2183,9 +2183,9 @@ static int npc_read_indoors(void) static int ev_db_final(void *key,void *data,va_list ap) { - free(data); + aFree(data); if(strstr(key,"::")!=NULL) - free(key); + aFree(key); return 0; } static int npcname_db_final(void *key,void *data,va_list ap) @@ -2214,49 +2214,49 @@ int do_final_npc(void) if((bl=map_id2bl(i))){ if(bl->type == BL_NPC && (nd = (struct npc_data *)bl)){ if(nd->chat_id && (cd=(struct chat_data*)map_id2bl(nd->chat_id))){ - free(cd); + aFree(cd); cd = NULL; } if(nd->bl.subtype == SCRIPT){ if(nd->u.scr.timer_event) - free(nd->u.scr.timer_event); + aFree(nd->u.scr.timer_event); if(nd->u.scr.src_id==0){ if(nd->u.scr.script){ - free(nd->u.scr.script); + aFree(nd->u.scr.script); nd->u.scr.script=NULL; } if(nd->u.scr.label_list){ - free(nd->u.scr.label_list); + aFree(nd->u.scr.label_list); nd->u.scr.label_list = NULL; } } } - free(nd); + aFree(nd); nd = NULL; }else if(bl->type == BL_MOB && (md = (struct mob_data *)bl)){ if(md->lootitem){ - free(md->lootitem); + aFree(md->lootitem); md->lootitem = NULL; } - free(md); + aFree(md); md = NULL; }else if(bl->type == BL_PET && (pd = (struct pet_data *)bl)){ - free(pd); + aFree(pd); pd = NULL; } } } - + return 0; } -void ev_release(struct dbn *db, int which) +void ev_release(struct dbn *db, int which) { if (which & 0x1) - free(db->key); + aFree(db->key); if (which & 0x2) - free(db->data); + aFree(db->data); } /*========================================== @@ -2281,12 +2281,12 @@ int do_init_npc(void) npcname_db=strdb_init(24); ev_db->release = ev_release; - + memset(&ev_tm_b,-1,sizeof(ev_tm_b)); for(nsl=npc_src_first;nsl;nsl=nsl->next) { /*if(nsl->prev){ // [Shinomori] - free(nsl->prev); + aFree(nsl->prev); nsl->prev = NULL; }*/ fp=fopen(nsl->name,"r"); diff --git a/src/map/party.c b/src/map/party.c index 28f05bab9..3c3c12886 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -30,7 +30,7 @@ int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data); */ static int party_db_final(void *key,void *data,va_list ap) { - free(data); + aFree(data); return 0; } void do_final_party(void) diff --git a/src/map/pc.c b/src/map/pc.c index 2954dfddf..c17e8677b 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -87,11 +87,11 @@ int pc_isGM(struct map_session_data *sd) { if (p == NULL) return 0; return p->level;*/ - + //For console [Wizputer] if ( sd->fd == 0 ) return 99; - + for(i = 0; i < GM_num; i++) if (gm_account[i].account_id == sd->status.account_id) return gm_account[i].level; @@ -218,7 +218,7 @@ int pc_addspiritball(struct map_session_data *sd,int interval,int max) { sd->spiritball = 0; if(sd->spiritball >= max) { - if(sd->spirit_timer[0] != -1) + if(sd->spirit_timer[0] != -1) delete_timer(sd->spirit_timer[0],pc_spiritball_timer); memcpy( &sd->spirit_timer[0], &sd->spirit_timer[1], sizeof(sd->spirit_timer[0]) * (sd->spiritball - 1)); } else @@ -554,7 +554,7 @@ int pc_isequip(struct map_session_data *sd,int n) item = sd->inventory_data[n]; sc_data = battle_get_sc_data(&sd->bl); - //s_class = pc_calc_base_job(sd->status.class); + //s_class = pc_calc_base_job(sd->status.class_); if( battle_config.gm_allequip>0 && pc_isGM(sd)>=battle_config.gm_allequip ) return 1; @@ -599,7 +599,7 @@ int pc_break_equip(struct map_session_data *sd, unsigned short where) struct item_data* item; int i; int sc; - char output[255]; + char output[255]; if(sd == NULL) return -1; @@ -669,7 +669,7 @@ int pc_breakweapon(struct map_session_data *sd) return 1; } } - + return 0; } /*========================================== @@ -755,7 +755,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars sd->skillitem = -1; sd->skillitemlv = -1; sd->invincible_timer = -1; - + sd->deal_locked = 0; sd->trade_partner = 0; @@ -772,7 +772,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars sd->doridori_counter = 0; - sd->change_level = pc_readglobalreg(sd,"jobchange_level"); + sd->change_level = pc_readglobalreg(sd,"jobchange_level"); #ifndef TXT_ONLY // mail system [Valaris] if(battle_config.mail_system) @@ -790,7 +790,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars sd->dev.val1[i] = 0; sd->dev.val2[i] = 0; } - + // アカウント??の送信要求 intif_request_accountreg(sd); @@ -876,7 +876,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars sd->state.event_death = pc_readglobalreg(sd,"PCDieEvent"); sd->state.event_kill = pc_readglobalreg(sd,"PCKillEvent"); sd->state.event_disconnect = pc_readglobalreg(sd,"PCLogoffEvent"); - + if (night_flag == 1 && !map[sd->bl.m].flag.indoors) { char tmpstr[1024]; strcpy(tmpstr, msg_txt(500)); // Actually, it's the night... @@ -1016,7 +1016,7 @@ int pc_calc_skilltree(struct map_session_data *sd) for(i=0;istatus.skill[i].flag != 13) + if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0; if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardスキルなら、 sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // 本?のlvに @@ -1030,13 +1030,13 @@ int pc_calc_skilltree(struct map_session_data *sd) sd->status.skill[i].id=i; for(i=210;i<291;i++) sd->status.skill[i].id=i; - for(i=304;i<337;i++){ + for(i=304;i<338;i++){ if(i==331) continue; sd->status.skill[i].id=i; } if(battle_config.enable_upper_class){ //confで無?でなければ?み?む - for(i=355;istatus.skill[i].id=i; + for(i=355;i<411;i++) + sd->status.skill[i].id=i; } }else{ do { @@ -1052,6 +1052,8 @@ int pc_calc_skilltree(struct map_session_data *sd) break; } } + if (id >= 2 && id <= 53 && pc_checkskill(sd, NV_BASIC) < 9) + f=0; } if(f && sd->status.skill[id].id==0 ){ sd->status.skill[id].id=id; @@ -1073,7 +1075,7 @@ int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd) { c = 0; //else if((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 && c < 4023) || (c > 4029 && c < 4045))) { //else if ((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && (c > 6 && c < 23)) { - else if ((sd->status.skill_point >= sd->status.job_level && skill_point < sd->change_level+8) && (c > 6 && c < 23)) { + else if (sd->status.skill_point >= sd->status.job_level && ((sd->change_level > 0 && skill_point < sd->change_level+8) || skill_point < 58) && (c > 6 && c < 23)) { switch(c) { case 7: case 13: @@ -1178,7 +1180,7 @@ int pc_checkweighticon(struct map_session_data *sd) flag=1; if(sd->weight*10 >= sd->max_weight*9) flag=2; - + if(flag==1){ if(sd->sc_data[SC_WEIGHT50].timer==-1) skill_status_change_start(&sd->bl,SC_WEIGHT50,0,0,0,0,0,0); @@ -1670,6 +1672,16 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->paramb[5] += sd->status.luk+psd->status.luk/2 > 99 ? 99-sd->status.luk : psd->status.luk/2; } } + if(sd->sc_data[SC_GOSPEL].timer!=-1 && sd->sc_data[SC_GOSPEL].val4 == BCT_PARTY){ + if (sd->sc_data[SC_GOSPEL].val3 == 6) { + sd->paramb[0]+= 2; + sd->paramb[1]+= 2; + sd->paramb[2]+= 2; + sd->paramb[3]+= 2; + sd->paramb[4]+= 2; + sd->paramb[5]+= 2; + } + } } //1度も死んでないJob70スパノビに+10 @@ -1769,7 +1781,7 @@ int pc_calcstatus(struct map_session_data* sd,int first) else if (pc_isriding(sd)) { // ペコペコ?りによる速度?加 sd->speed -= (0.25 * DEFAULT_WALK_SPEED); sd->max_weight += 10000; - } + } if((skill=pc_checkskill(sd,CR_TRUST))>0) { // フェイス sd->status.max_hp += skill*200; sd->subele[6] += skill*5; @@ -1788,7 +1800,7 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->status.max_hp = sd->status.max_hp * 130/100; else if (s_class.upper==2) sd->status.max_hp = sd->status.max_hp * 70/100; - + if(sd->hprate!=100) sd->status.max_hp = sd->status.max_hp*sd->hprate/100; @@ -1910,6 +1922,13 @@ int pc_calcstatus(struct map_session_data* sd,int first) } if(sd->sc_data[SC_POISON].timer!=-1) // 毒?態 sd->def2 = sd->def2*75/100; + if(sd->sc_data[SC_CURSE].timer!=-1){ + sd->base_atk = sd->base_atk*75/100; + sd->watk = sd->watk*75/100; + index = sd->equip_index[8]; + if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4) + sd->watk_ = sd->watk_*75/100; + } if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // ?太鼓の響き sd->watk += sd->sc_data[SC_DRUMBATTLE].val2; sd->def += sd->sc_data[SC_DRUMBATTLE].val3; @@ -2113,8 +2132,62 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->def = 100; if(sd->sc_data[SC_BARRIER].timer!=-1) sd->mdef = 100; + + if(sd->sc_data[SC_GOSPEL].timer!=-1) { + if (sd->sc_data[SC_GOSPEL].val4 == BCT_PARTY){ + switch (sd->sc_data[SC_GOSPEL].val3) + { + case 4: + sd->status.max_hp += sd->status.max_hp * 25 / 100; + if(sd->status.max_hp > battle_config.max_hp) + sd->status.max_hp = battle_config.max_hp; + break; + case 5: + sd->status.max_sp += sd->status.max_sp * 25 / 100; + if(sd->status.max_sp > battle_config.max_sp) + sd->status.max_sp = battle_config.max_sp; + break; + case 11: + sd->def += sd->def * 25 / 100; + sd->def2 += sd->def2 * 25 / 100; + break; + case 12: + sd->base_atk += sd->base_atk * 8 / 100; + break; + case 13: + sd->flee += sd->flee * 5 / 100; + break; + case 14: + sd->hit += sd->hit * 5 / 100; + break; + } + } else if (sd->sc_data[SC_GOSPEL].val4 == BCT_ENEMY){ + switch (sd->sc_data[SC_GOSPEL].val3) + { + case 5: + sd->def = 0; + sd->def2 = 0; + break; + case 6: + sd->base_atk = 0; + sd->watk = 0; + sd->watk2 = 0; + break; + case 7: + sd->flee = 0; + break; + case 8: + sd->speed_rate += 75; + aspd_rate += 75; + break; + } + } + } } + if (sd->speed_rate <= 0) + sd->speed_rate = 1; + if(sd->speed_rate != 100) sd->speed = sd->speed*sd->speed_rate/100; if(sd->speed < 1) sd->speed = 1; @@ -2216,7 +2289,7 @@ int pc_calcstatus(struct map_session_data* sd,int first) clif_updatestatus(sd,SP_CARTINFO);*/ //if(sd->status.hpstatus.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 && - if(sd->status.hpstatus.max_hp>>2 && sd->sc_data[SC_AUTOBERSERK].timer != -1 && + if(sd->status.hpstatus.max_hp>>2 && sd->sc_data[SC_AUTOBERSERK].timer != -1 && (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ) && !pc_isdead(sd)) // オ?トバ?サ?ク?動 skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0); @@ -2239,7 +2312,7 @@ int pc_calcspeed (struct map_session_data *sd) b_speed = sd->speed; sd->speed = DEFAULT_WALK_SPEED ; - + if(sd->sc_count){ if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // 速度?加 sd->speed -= sd->speed *25/100; @@ -2303,7 +2376,7 @@ int pc_calcspeed (struct map_session_data *sd) if(sd->speed_rate != 100) sd->speed = sd->speed*sd->speed_rate/100; if(sd->speed < 1) sd->speed = 1; - + if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) { sd->prev_speed = sd->speed; sd->speed = sd->speed*(175 - skill*5)/100; @@ -2932,7 +3005,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) if(sd->state.lr_flag !=2){ sd->random_attack_increase_add = type2; sd->random_attack_increase_per += val; - } + } break; case SP_WEAPON_ATK: if(sd->state.lr_flag != 2) @@ -3662,7 +3735,7 @@ int pc_item_refine(struct map_session_data *sd,int idx) int flag = 1, i = 0, ep = 0, per; int material[5] = { 0, 1010, 1011, 984, 984 }; struct item *item; - + nullpo_retr(0, sd); item = &sd->status.inventory[idx]; @@ -3681,7 +3754,7 @@ int pc_item_refine(struct map_session_data *sd,int idx) per = percentrefinery [itemdb_wlv (item->nameid)][(int)item->refine]; //per += pc_checkskill(sd,BS_WEAPONRESEARCH); per *= (75 + sd->status.job_level/2)/100; - + if (per > rand() % 100) { flag = 0; item->refine++; @@ -3691,7 +3764,7 @@ int pc_item_refine(struct map_session_data *sd,int idx) pc_unequipitem(sd,idx,3); } clif_refine(sd->fd,sd,0,idx,item->refine); - clif_delitem(sd,idx,1); + clif_delitem(sd,idx,1); clif_additem(sd,idx,1,0); if (ep) pc_equipitem(sd,idx,ep); @@ -3777,7 +3850,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl) if(itemid > 0 && itemdb_type(itemid) != 6) { rate = (mob_db[md->class_].dropitem[i].p / battle_config.item_rate_common * 100 * skill)/100; - + if(rand()%10000 < rate) { struct item tmp_item; @@ -3882,7 +3955,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt if(sd->sc_data[SC_DANCING].timer!=-1) // clear dance effect when warping [Valaris] skill_stop_dancing(&sd->bl,0); } - + if(sd->status.option&2) skill_status_change_end(&sd->bl, SC_HIDING, -1); if(sd->status.option&4) @@ -3894,7 +3967,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt pet_stopattack(sd->pd); pet_changestate(sd->pd,MS_IDLE,0); } - + if(sd->disguise) { // clear disguises when warping [Valaris] clif_clearchar(&sd->bl, 9); disguise=sd->disguise; @@ -4000,13 +4073,13 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt if(disguise) // disguise teleport fix [Valaris] sd->disguise=disguise; - + memcpy(sd->mapname,mapname,24); sd->bl.m = m; sd->to_x = x; sd->to_y = y; - // moved and changed dance effect stopping + // moved and changed dance effect stopping sd->bl.x = x; sd->bl.y = y; @@ -4336,19 +4409,19 @@ int pc_walktoxy(struct map_session_data *sd,int x,int y) if (sd->sc_data && sd->status.guild_id > 0) { struct skill_unit *su; struct skill_unit_group *sg; - if (sd->state.leadership_flag && (su=(struct skill_unit *)sd->state.leadership_flag) && + if (sd->state.leadership_flag && (su=(struct skill_unit *)sd->state.leadership_flag) && (sg=su->group) && sg->src_id == sd->bl.id) { skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); } - if (sd->state.glorywounds_flag && (su=(struct skill_unit *)sd->state.glorywounds_flag) && + if (sd->state.glorywounds_flag && (su=(struct skill_unit *)sd->state.glorywounds_flag) && (sg=su->group) && sg->src_id == sd->bl.id) { skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); } - if (sd->state.soulcold_flag && (su=(struct skill_unit *)sd->state.soulcold_flag) && + if (sd->state.soulcold_flag && (su=(struct skill_unit *)sd->state.soulcold_flag) && (sg=su->group) && sg->src_id == sd->bl.id) { skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); } - if (sd->state.hawkeyes_flag && (su=(struct skill_unit *)sd->state.hawkeyes_flag) && + if (sd->state.hawkeyes_flag && (su=(struct skill_unit *)sd->state.hawkeyes_flag) && (sg=su->group) && sg->src_id == sd->bl.id) { skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); } @@ -4392,7 +4465,7 @@ int pc_randomwalk(struct map_session_data *sd,int tick) { const int retrycount = 20; nullpo_retr(0, sd); - + if(DIFF_TICK(sd->next_walktime,tick)<0){ int i,x,y,d; d = rand()%7+5; @@ -4608,7 +4681,7 @@ struct pc_base_job pc_calc_base_job(int b_class) }else{ bj.type = 2; } - + return bj; } @@ -4624,7 +4697,7 @@ int pc_calc_base_job2 (int b_class) return b_class - 4001; else if(b_class == 4045) return 23; - return b_class - 4023; + return b_class - 4023; } int pc_calc_upper(int b_class) @@ -4668,8 +4741,12 @@ int pc_attack_timer(int tid,unsigned int tick,int id,int data) if(bl==NULL || bl->prev == NULL) return 0; - if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) - return 0; + if(bl->type == BL_PC) { + if (pc_isdead((struct map_session_data *)bl)) + return 0; + else if (pc_ishiding((struct map_session_data *)bl)) + return 0; + } // 同じmapでないなら攻?しない // PCが死んでても攻?しない @@ -4685,7 +4762,7 @@ int pc_attack_timer(int tid,unsigned int tick,int id,int data) return 0; if(sd->sc_data[SC_BLADESTOP].timer != -1) return 0; - } + } //if((opt = battle_get_option(bl)) != NULL && *opt&0x46) if((opt = battle_get_option(bl)) != NULL && *opt&0x42) @@ -4774,13 +4851,13 @@ int pc_attack(struct map_session_data *sd,int target_id,int type) return 1; sd->idletime = tick_; - + if(bl->type==BL_NPC) { // monster npcs [Valaris] //npc_click(sd,RFIFOL(sd->fd,2)); npc_click(sd,target_id); // submitted by leinsirk10 [Celest] return 0; } - + if(!battle_check_target(&sd->bl,bl,BCT_ENEMY)) return 1; if(sd->attacktimer != -1) @@ -4972,7 +5049,7 @@ int pc_gainexp(struct map_session_data *sd,int base_exp,int job_exp) sd->status.base_exp += base_exp; if(sd->status.base_exp < 0) sd->status.base_exp = 0; - + while(pc_checkbaselevelup(sd)) ; clif_updatestatus(sd,SP_BASEEXP); @@ -4985,13 +5062,13 @@ int pc_gainexp(struct map_session_data *sd,int base_exp,int job_exp) sd->status.job_exp += job_exp; if(sd->status.job_exp < 0) sd->status.job_exp = 0; - + while(pc_checkjoblevelup(sd)) ; clif_updatestatus(sd,SP_JOBEXP); if(battle_config.disp_experience){ - sprintf(output, + sprintf(output, "Experienced Gained Base:%d Job:%d",base_exp,job_exp); clif_disp_onlyself(sd,output,strlen(output)); } @@ -5124,7 +5201,7 @@ int pc_need_status_point(struct map_session_data *sd,int type) int pc_statusup(struct map_session_data *sd,int type) { int max, need,val = 0; - + nullpo_retr(0, sd); max = (pc_calc_upper(sd->status.class_)==2) ? 80 : battle_config.max_parameter; @@ -5326,17 +5403,21 @@ int pc_allskillup(struct map_session_data *sd) sd->status.skill[i].lv=skill_get_max(i); for(i=210;i<291;i++) sd->status.skill[i].lv=skill_get_max(i); - for(i=304;istatus.skill[i].lv=skill_get_max(i); } + if(battle_config.enable_upper_class){ //confで無?でなければ?み?む + for(i=355;i<411;i++) + sd->status.skill[i].id=i; + } } else { for(i=0;(id=skill_tree[s][c][i].id)>0;i++){ if(sd->status.skill[id].id==0 && (!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn) ) { sd->status.skill[id].id = id; // celest // sd->status.skill[id].lv=skill_get_max(id); - sd->status.skill[id].lv = skill_tree_get_max(id, sd->status.class_); // celest + sd->status.skill[id].lv = skill_tree_get_max(id, sd->status.class_); // celest } } } @@ -5352,9 +5433,9 @@ int pc_allskillup(struct map_session_data *sd) int pc_resetlvl(struct map_session_data* sd,int type) { int i; - + nullpo_retr(0, sd); - + for(i=1;istatus.skill[i].lv = 0; } @@ -5395,7 +5476,7 @@ int pc_resetlvl(struct map_session_data* sd,int type) if(type == 4){ sd->status.job_level=1; sd->status.job_exp=0; - } + } clif_updatestatus(sd,SP_STATUSPOINT); clif_updatestatus(sd,SP_STR); @@ -5444,7 +5525,7 @@ int pc_resetstate(struct map_session_data* sd) sd->status.status_point = atoi (statp[sd->status.base_level - 1]); if(sd->status.class_ >= 4001 && sd->status.class_ <= 4024) sd->status.status_point+=52; // extra 52+48=100 stat points -// End addition +// End addition // Removed by Dexity - old count // add += sumsp(sd->status.str); @@ -5794,7 +5875,7 @@ int pc_readparam(struct map_session_data *sd,int type) { int val=0; struct pc_base_job s_class; - + s_class = pc_calc_base_job(sd->status.class_); nullpo_retr(0, sd); @@ -6208,12 +6289,12 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper) int b_class = 0; //?生や養子の場合の元の職業を算出する struct pc_base_job s_class = pc_calc_base_job(sd->status.class_); - + nullpo_retr(0, sd); if (upper < 0 || upper > 2) //現在?生かどうかを判?する upper = s_class.upper; - + b_class = job; //通常職ならjobそのまんま if (job < 23) { if (upper == 1) @@ -6248,8 +6329,8 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper) else sd->change_level = 0; - pc_setglobalreg (sd, "jobchange_level", sd->change_level); - + pc_setglobalreg (sd, "jobchange_level", sd->change_level); + sd->status.class_ = sd->view_class = b_class; sd->status.job_level=1; @@ -6276,12 +6357,12 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper) clif_equiplist(sd); if(pc_isriding(sd)) { // remove peco status if changing into invalid class [Valaris] - if(!(pc_checkskill(sd,KN_RIDING))) + if(!(pc_checkskill(sd,KN_RIDING))) pc_setoption(sd,sd->status.option|-0x0000); if(pc_checkskill(sd,KN_RIDING)>0) pc_setriding(sd); } - + return 0; } @@ -6418,13 +6499,13 @@ int pc_setriding(struct map_session_data *sd) if(sd->status.class_==7) sd->status.class_=sd->view_class=13; - + if(sd->status.class_==14) sd->status.class_=sd->view_class=21; - + if(sd->status.class_==4008) sd->status.class_=sd->view_class=4014; - + if(sd->status.class_==4015) sd->status.class_=sd->view_class=4022; } @@ -6772,7 +6853,7 @@ int pc_eventtimer(int tid,unsigned int tick,int id,int data) break; } } - free((void *)data); + aFree((void *)data); if(i==MAX_EVENTTIMER) { if(battle_config.error_log) printf("pc_eventtimer: no such event timer\n"); @@ -6795,7 +6876,7 @@ int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name) if( sd->eventtimer[i]==-1 ) break; if(ieventtimer[i]=add_timer(gettick()+tick, pc_eventtimer,sd->bl.id,(int)evname); @@ -7035,7 +7116,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int pos) */ int pc_unequipitem(struct map_session_data *sd,int n,int flag) { - nullpo_retr(0, sd); + nullpo_retr(0, sd); // -- moonsoul (if player is berserk then cannot unequip) // @@ -7243,7 +7324,7 @@ int pc_calc_pvprank(struct map_session_data *sd) nullpo_retr(0, sd); nullpo_retr(0, m=&map[sd->bl.m]); - + old=sd->pvp_rank; if( !(m->flag.pvp) ) @@ -7385,8 +7466,8 @@ static int pc_spheal(struct map_session_data *sd) if(gc) { struct guild *g; g=guild_search(sd->status.guild_id); - if(g && g->guild_id == gc->guild_id) - a += a; + if(g && g->guild_id == gc->guild_id) + a += a; } // end addition [Valaris] return a; @@ -7415,8 +7496,8 @@ static int pc_hpheal(struct map_session_data *sd) if(gc) { struct guild *g; g=guild_search(sd->status.guild_id); - if(g && g->guild_id == gc->guild_id) - a += a; + if(g && g->guild_id == gc->guild_id) + a += a; } // end addition [Valaris] return a; @@ -7680,8 +7761,8 @@ static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) { // -- moonsoul (if conditions below altered to disallow natural healing if under berserk status) if ((battle_config.natural_heal_weight_rate > 100 || sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate) && - !pc_isdead(sd) && - !pc_ishiding(sd) && + !pc_isdead(sd) && + !pc_ishiding(sd) && //-- cannot regen for 5 minutes after using Berserk --- [Celest] DIFF_TICK (gettick(), sd->canregen_tick)>=0 && (sd->sc_data && !(sd->sc_data[SC_POISON].timer != -1 && sd->sc_data[SC_SLOWPOISON].timer == -1) && @@ -7746,7 +7827,7 @@ static int pc_autosave_sub(struct map_session_data *sd,va_list ap) { nullpo_retr(0, sd); - Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd); + Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd); if(save_flag==0 && sd->fd>last_save_fd){ struct guild_castle *gc=NULL; @@ -7807,10 +7888,10 @@ int pc_read_gm_account(int fd) int i = 0; #endif if (gm_account != NULL) - free(gm_account); + aFree(gm_account); GM_num = 0; #ifdef TXT_ONLY - gm_account = aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1); + gm_account = aCallocA(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1); for (i = 4; i < RFIFOW(fd,2); i = i + 5) { gm_account[GM_num].account_id = RFIFOL(fd,i); gm_account[GM_num].level = (int)RFIFOB(fd,i+4); @@ -7824,7 +7905,7 @@ int pc_read_gm_account(int fd) } lsql_res = mysql_store_result(&lmysql_handle); if (lsql_res) { - gm_account = aCalloc(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1); + gm_account = aCallocA(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1); while ((lsql_row = mysql_fetch_row(lsql_res))) { gm_account[GM_num].account_id = atoi(lsql_row[0]); gm_account[GM_num].level = atoi(lsql_row[1]); @@ -7832,7 +7913,7 @@ int pc_read_gm_account(int fd) GM_num++; } } - + mysql_free_result(lsql_res); #endif /* TXT_ONLY */ return GM_num; @@ -7926,7 +8007,7 @@ int pc_readdb(void) char line[1024],*p; // 必要??値?み?み - + memset(exp_table,0,sizeof(exp_table)); fp=fopen("db/exp.txt","r"); if(fp==NULL){ printf("can't read db/exp.txt\n"); @@ -7997,6 +8078,7 @@ int pc_readdb(void) ShowStatus(tmp_output); // JOBボ?ナス + memset(job_bonus,0,sizeof(job_bonus)); fp=fopen("db/job_db2.txt","r"); if(fp==NULL){ printf("can't read db/job_db2.txt\n"); @@ -8076,7 +8158,7 @@ int pc_readdb(void) for(j=0;skill_tree[u][i][j].id;j++); skill_tree[u][i][j].id=atoi(split[1]); skill_tree[u][i][j].max=atoi(split[2]); - + //not required - Celest //skill_tree[2][i][j].id=atoi(split[1]); //養子職は良く分からないので暫定 //skill_tree[2][i][j].max=atoi(split[2]); //養子職は良く分からないので暫定 @@ -8242,7 +8324,7 @@ static void pc_statpointdb(void) end = ftell(stp); rewind(stp); - buf_stat = (char *) malloc (end + 1); + buf_stat = (char *) aMallocA (end + 1); l = fread(buf_stat,1,end,stp); fclose(stp); sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/statpoint.txt"); @@ -8251,7 +8333,7 @@ static void pc_statpointdb(void) for(i=0;i<255;i++) { j=0; - while (*(buf_stat+k)!='\n') { + while (*(buf_stat+k)!='\n') { statp[i][j]=*(buf_stat+k); j++;k++; } @@ -8259,7 +8341,7 @@ static void pc_statpointdb(void) k++; } - free(buf_stat); + aFree(buf_stat); } /*========================================== diff --git a/src/map/pet.c b/src/map/pet.c index c198c1fb5..99f2a4d95 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -1376,7 +1376,7 @@ int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd) clif_additem(sd,0,0,flag); map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); } - free(ditem); + aFree(ditem); } else add_timer(gettick()+540+i,pet_delay_item_drop2,(int)ditem,0); @@ -1399,7 +1399,7 @@ int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data) map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); - free(ditem); + aFree(ditem); return 0; } diff --git a/src/map/script.c b/src/map/script.c index a6b65e213..35645eaab 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -507,7 +507,7 @@ struct { {buildin_npctalk,"npctalk","*"}, // [Valaris] {buildin_hasitems,"hasitems","*"}, // [Valaris] {buildin_mobcount,"mobcount","ss"}, - {buildin_getlook,"getlook","i"}, + {buildin_getlook,"getlook","i"}, {buildin_getsavepoint,"getsavepoint","i"}, {buildin_npcspeed,"npcspeed","i"}, // [Valaris] {buildin_npcwalkto,"npcwalkto","ii"}, // [Valaris] @@ -576,14 +576,14 @@ static int add_str(const unsigned char *p) int i; char *lowcase; - lowcase=strdup(p); + lowcase=aStrdup(p); for(i=0;lowcase[i];i++) lowcase[i]=tolower(lowcase[i]); if((i=search_str(lowcase))>=0){ - free(lowcase); + aFree(lowcase); return i; } - free(lowcase); + aFree(lowcase); i=calc_hash(p); if(str_hash[i]==0){ @@ -605,7 +605,7 @@ static int add_str(const unsigned char *p) str_data=aRealloc(str_data,sizeof(str_data[0])*str_data_size); memset(str_data + (str_data_size - 128), '\0', 128); } - while(str_pos+strlen(p)+1>=str_size){ + while(str_pos+(int)strlen(p)+1>=str_size){ str_size+=256; str_buf=(char *)aRealloc(str_buf,str_size); memset(str_buf + (str_size - 256), '\0', 256); @@ -1159,7 +1159,7 @@ unsigned char* parse_script(unsigned char *src,int line) read_constdb(); } first=0; - script_buf=(unsigned char *)aCalloc(SCRIPT_BLOCK_SIZE,sizeof(unsigned char)); + script_buf=(unsigned char *)aCallocA(SCRIPT_BLOCK_SIZE,sizeof(unsigned char)); script_pos=0; script_size=SCRIPT_BLOCK_SIZE; str_data[LABEL_NEXTLINE].type=C_NOP; @@ -1395,7 +1395,7 @@ char* conv_str(struct script_state *st,struct script_data *data) get_val(st,data); if(data->type==C_INT){ char *buf; - buf=(char *)aCalloc(16,sizeof(char)); + buf=(char *)aCallocA(16,sizeof(char)); sprintf(buf,"%d",data->u.num); data->type=C_STR; data->u.str=buf; @@ -1421,7 +1421,7 @@ int conv_num(struct script_state *st,struct script_data *data) p=data->u.str; data->u.num = atoi(p); if(data->type==C_STR) - free(p); + aFree(p); data->type=C_INT; } return data->u.num; @@ -1478,7 +1478,7 @@ void push_copy(struct script_stack *stack,int pos) push_str(stack,C_CONSTSTR,stack->stack_data[pos].u.str); break; case C_STR: - push_str(stack,C_STR,strdup(stack->stack_data[pos].u.str)); + push_str(stack,C_STR,aStrdup(stack->stack_data[pos].u.str)); break; default: push_val(stack,stack->stack_data[pos].type,stack->stack_data[pos].u.num); @@ -1495,7 +1495,7 @@ void pop_stack(struct script_stack* stack,int start,int end) int i; for(i=start;istack_data[i].type==C_STR){ - free(stack->stack_data[i].u.str); + aFree(stack->stack_data[i].u.str); } } if(stack->sp>end){ @@ -1663,7 +1663,7 @@ int buildin_menu(struct script_state *st) char *buf; int len,i; struct map_session_data *sd; - + sd=script_rid2sd(st); if(sd->state.menu_or_input==0){ @@ -1673,14 +1673,14 @@ int buildin_menu(struct script_state *st) conv_str(st,& (st->stack->stack_data[i])); len+=strlen(st->stack->stack_data[i].u.str)+1; } - buf=(char *)aCalloc(len,sizeof(char)); + buf=(char *)aCallocA(len,sizeof(char)); buf[0]=0; for(i=st->start+2,len=0;iend;i+=2){ strcat(buf,st->stack->stack_data[i].u.str); strcat(buf,":"); } clif_scriptmenu(script_rid2sd(st),st->oid,buf); - free(buf); + aFree(buf); } else if(sd->npc_menu==0xff){ // cansel sd->state.menu_or_input=0; st->state=END; @@ -2522,7 +2522,7 @@ int buildin_delitem(struct script_state *st) if(sd->inventory_data[i]->type==7 && sd->status.inventory[i].card[0] == (short)0xff00 && search_petDB_index(nameid, PET_EGG) >= 0 ){ intif_delete_petdata(*((long *)(&sd->status.inventory[i].card[1]))); //clear egg flag. so it won't be put in IMPORTANT items (eggs look like item with 2 cards ^_^) - sd->status.inventory[i].card[1] = sd->status.inventory[i].card[0] = 0; + sd->status.inventory[i].card[1] = sd->status.inventory[i].card[0] = 0; //now this egg'll be deleted as a common unimportant item } //is this item important? does it have cards? or Player's name? or Refined/Upgraded @@ -2551,7 +2551,7 @@ int buildin_delitem(struct script_state *st) continue; if(sd->status.inventory[i].amount>=amount){ - pc_delitem(sd,i,amount,0); + pc_delitem(sd,i,amount,0); return 0; //we deleted exact amount of items. now exit } else { amount-=sd->status.inventory[i].amount; @@ -2627,7 +2627,7 @@ char *buildin_getpartyname_sub(int party_id) if(p!=NULL){ char *buf; - buf=(char *)aCalloc(24,sizeof(char)); + buf=(char *)aCallocA(24,sizeof(char)); strcpy(buf,p->name); return buf; } @@ -2684,7 +2684,7 @@ char *buildin_getguildname_sub(int guild_id) if(g!=NULL){ char *buf; - buf=(char *)aCalloc(24,sizeof(char)); + buf=(char *)aCallocA(24,sizeof(char)); strcpy(buf,g->name); return buf; } @@ -2713,7 +2713,7 @@ char *buildin_getguildmaster_sub(int guild_id) if(g!=NULL){ char *buf; - buf=(char *)aCalloc(24,sizeof(char)); + buf=(char *)aCallocA(24,sizeof(char)); strncpy(buf,g->master, 23); return buf; } @@ -2763,7 +2763,7 @@ int buildin_strcharinfo(struct script_state *st) num=conv_num(st,& (st->stack->stack_data[st->start+2])); if(num==0){ char *buf; - buf=(char *)aCalloc(24,sizeof(char)); + buf=(char *)aCallocA(24,sizeof(char)); strncpy(buf,sd->status.name, 23); push_str(st->stack,C_STR,buf); } @@ -2830,7 +2830,7 @@ int buildin_getequipname(struct script_state *st) struct item_data* item; char *buf; - buf=(char *)aCalloc(64,sizeof(char)); + buf=(char *)aCallocA(64,sizeof(char)); sd=script_rid2sd(st); num=conv_num(st,& (st->stack->stack_data[st->start+2])); i=pc_checkequip(sd,equip[num-1]); @@ -2856,9 +2856,9 @@ int buildin_getbrokenid(struct script_state *st) { int i,num,id=0,brokencounter=0; struct map_session_data *sd; - + sd=script_rid2sd(st); - + num=conv_num(st,& (st->stack->stack_data[st->start+2])); for(i=0; istatus.inventory[i].attribute==1){ @@ -2869,7 +2869,7 @@ int buildin_getbrokenid(struct script_state *st) } } } - + push_val(st->stack,C_INT,id); return 0; @@ -2887,7 +2887,7 @@ int buildin_repair(struct script_state *st) sd=script_rid2sd(st); - + num=conv_num(st,& (st->stack->stack_data[st->start+2])); for(i=0; istatus.inventory[i].attribute==1){ @@ -2941,7 +2941,7 @@ int buildin_getequipisenableref(struct script_state *st) i=pc_checkequip(sd,equip[num-1]); if(i >= 0 && num<7 && sd->inventory_data[i] && !sd->inventory_data[i]->flag.no_refine) // replaced by Celest - /*(num!=1 + /*(num!=1 || sd->inventory_data[i]->def > 1 || (sd->inventory_data[i]->def==1 && sd->inventory_data[i]->equip_script==NULL) || (sd->inventory_data[i]->def<=0 && sd->inventory_data[i]->equip_script!=NULL)))*/ @@ -3245,15 +3245,15 @@ int buildin_getskilllv(struct script_state *st) return 0; } /*========================================== - * getgdskilllv(Guild_ID, Skill_ID); - * skill_id = 10000 : GD_APPROVAL - * 10001 : GD_KAFRACONTACT - * 10002 : GD_GUARDIANRESEARCH - * 10003 : GD_GUARDUP - * 10004 : GD_EXTENSION + * getgdskilllv(Guild_ID, Skill_ID); + * skill_id = 10000 : GD_APPROVAL + * 10001 : GD_KAFRACONTACT + * 10002 : GD_GUARDIANRESEARCH + * 10003 : GD_GUARDUP + * 10004 : GD_EXTENSION *------------------------------------------ */ -int buildin_getgdskilllv(struct script_state *st) +int buildin_getgdskilllv(struct script_state *st) { int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); int skill_id=conv_num(st,& (st->stack->stack_data[st->start+3])); @@ -3590,7 +3590,7 @@ int buildin_gettimestr(struct script_state *st) fmtstr=conv_str(st,& (st->stack->stack_data[st->start+2])); maxlen=conv_num(st,& (st->stack->stack_data[st->start+3])); - tmpstr=(char *)aCalloc(maxlen+1,sizeof(char)); + tmpstr=(char *)aCallocA(maxlen+1,sizeof(char)); strftime(tmpstr,maxlen,fmtstr,localtime(&now)); tmpstr[maxlen]='\0'; @@ -3677,8 +3677,8 @@ int buildin_makepet(struct script_state *st) sd->catch_target_class = pet_db[pet_id].class_; intif_create_pet( sd->status.account_id, sd->status.char_id, - pet_db[pet_id].class_, mob_db[pet_db[pet_id].class_].lv, - pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate, + (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv, + (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate, 100, 0, 1, pet_db[pet_id].jname); } @@ -3727,19 +3727,19 @@ int buildin_guildgetexp(struct script_state *st) */ int buildin_monster(struct script_state *st) { - int class,amount,x,y; + int class_,amount,x,y; char *str,*map,*event=""; map =conv_str(st,& (st->stack->stack_data[st->start+2])); x =conv_num(st,& (st->stack->stack_data[st->start+3])); y =conv_num(st,& (st->stack->stack_data[st->start+4])); str =conv_str(st,& (st->stack->stack_data[st->start+5])); - class=conv_num(st,& (st->stack->stack_data[st->start+6])); + class_=conv_num(st,& (st->stack->stack_data[st->start+6])); amount=conv_num(st,& (st->stack->stack_data[st->start+7])); if( st->end>st->start+8 ) event=conv_str(st,& (st->stack->stack_data[st->start+8])); - mob_once_spawn(map_id2sd(st->rid),map,x,y,str,class,amount,event); + mob_once_spawn(map_id2sd(st->rid),map,x,y,str,class_,amount,event); return 0; } /*========================================== @@ -3748,7 +3748,7 @@ int buildin_monster(struct script_state *st) */ int buildin_areamonster(struct script_state *st) { - int class,amount,x0,y0,x1,y1; + int class_,amount,x0,y0,x1,y1; char *str,*map,*event=""; map =conv_str(st,& (st->stack->stack_data[st->start+2])); @@ -3757,12 +3757,12 @@ int buildin_areamonster(struct script_state *st) x1 =conv_num(st,& (st->stack->stack_data[st->start+5])); y1 =conv_num(st,& (st->stack->stack_data[st->start+6])); str =conv_str(st,& (st->stack->stack_data[st->start+7])); - class=conv_num(st,& (st->stack->stack_data[st->start+8])); + class_=conv_num(st,& (st->stack->stack_data[st->start+8])); amount=conv_num(st,& (st->stack->stack_data[st->start+9])); if( st->end>st->start+10 ) event=conv_str(st,& (st->stack->stack_data[st->start+10])); - mob_once_spawn_area(map_id2sd(st->rid),map,x0,y0,x1,y1,str,class,amount,event); + mob_once_spawn_area(map_id2sd(st->rid),map,x0,y0,x1,y1,str,class_,amount,event); return 0; } /*========================================== @@ -3974,7 +3974,7 @@ int buildin_attachnpctimer(struct script_state *st) struct map_session_data *sd; struct npc_data *nd; - nd=(struct npc_data *)map_id2bl(st->oid); + nd=(struct npc_data *)map_id2bl(st->oid); if( st->end > st->start+2 ) { char *name = conv_str(st,& (st->stack->stack_data[st->start+2])); sd=map_nick2sd(name); @@ -4270,7 +4270,7 @@ int buildin_sc_start(struct script_state *st) bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+5]))); else bl = map_id2bl(st->rid); - + if (bl != 0) { if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag) bl = map_id2bl(((struct map_session_data *)bl)->skilltarget); @@ -5101,7 +5101,7 @@ int buildin_getcastlename(struct script_state *st) for(i=0;imap_name)==0){ - buf=(char *)aCalloc(24,sizeof(char)); + buf=(char *)aCallocA(24,sizeof(char)); strncpy(buf,gc->castle_name,24); break; } @@ -5343,8 +5343,8 @@ int buildin_failedremovecards(struct script_state *st) if( (sd->status.inventory[i].card[c-1] > 4000 && sd->status.inventory[i].card[c-1] < 5000) || itemdb_type(sd->status.inventory[i].card[c-1]) == 6){ // [Celest] - - cardflag = 1; + + cardflag = 1; if(typefail == 2){ // 武具のみ損失なら、カードは受け取らせる item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1]; @@ -5561,39 +5561,39 @@ int buildin_strmobinfo(struct script_state *st) { int num=conv_num(st,& (st->stack->stack_data[st->start+2])); - int class=conv_num(st,& (st->stack->stack_data[st->start+3])); + int class_=conv_num(st,& (st->stack->stack_data[st->start+3])); - if(num<=0 || num>=8 || (class>=0 && class<=1000) || class >2000) + if(num<=0 || num>=8 || (class_>=0 && class_<=1000) || class_ >2000) return 0; if(num==1) { char *buf; - buf=aCalloc(24, 1); -// buf=mob_db[class].name; + buf=aCallocA(24, 1); +// buf=mob_db[class_].name; // for string assignments you would need to go for c++ [Shinomori] - strcpy(buf,mob_db[class].name); + strcpy(buf,mob_db[class_].name); push_str(st->stack,C_STR,buf); return 0; } else if(num==2) { char *buf; - buf=aCalloc(24, 1); -// buf=mob_db[class].jname; + buf=aCallocA(24, 1); +// buf=mob_db[class_].jname; // for string assignments you would need to go for c++ [Shinomori] - strcpy(buf,mob_db[class].jname); + strcpy(buf,mob_db[class_].jname); push_str(st->stack,C_STR,buf); return 0; } else if(num==3) - push_val(st->stack,C_INT,mob_db[class].lv); + push_val(st->stack,C_INT,mob_db[class_].lv); else if(num==4) - push_val(st->stack,C_INT,mob_db[class].max_hp); + push_val(st->stack,C_INT,mob_db[class_].max_hp); else if(num==5) - push_val(st->stack,C_INT,mob_db[class].max_sp); + push_val(st->stack,C_INT,mob_db[class_].max_sp); else if(num==6) - push_val(st->stack,C_INT,mob_db[class].base_exp); + push_val(st->stack,C_INT,mob_db[class_].base_exp); else if(num==7) - push_val(st->stack,C_INT,mob_db[class].job_exp); + push_val(st->stack,C_INT,mob_db[class_].job_exp); return 0; } @@ -5603,20 +5603,20 @@ int buildin_strmobinfo(struct script_state *st) */ int buildin_guardian(struct script_state *st) { - int class=0,amount=1,x=0,y=0,guardian=0; + int class_=0,amount=1,x=0,y=0,guardian=0; char *str,*map,*event=""; map =conv_str(st,& (st->stack->stack_data[st->start+2])); x =conv_num(st,& (st->stack->stack_data[st->start+3])); y =conv_num(st,& (st->stack->stack_data[st->start+4])); str =conv_str(st,& (st->stack->stack_data[st->start+5])); - class=conv_num(st,& (st->stack->stack_data[st->start+6])); + class_=conv_num(st,& (st->stack->stack_data[st->start+6])); amount=conv_num(st,& (st->stack->stack_data[st->start+7])); event=conv_str(st,& (st->stack->stack_data[st->start+8])); if( st->end>st->start+9 ) guardian=conv_num(st,& (st->stack->stack_data[st->start+9])); - mob_spawn_guardian(map_id2sd(st->rid),map,x,y,str,class,amount,event,guardian); + mob_spawn_guardian(map_id2sd(st->rid),map,x,y,str,class_,amount,event,guardian); return 0; } @@ -5657,7 +5657,7 @@ int buildin_getitemname(struct script_state *st) i_data = NULL; i_data = itemdb_search(item_id); - item_name=(char *)aCalloc(24,sizeof(char)); + item_name=(char *)aCallocA(24,sizeof(char)); strncpy(item_name,i_data->jname,23); push_str(st->stack,C_STR,item_name); @@ -5671,12 +5671,12 @@ int buildin_getitemname(struct script_state *st) int buildin_petskillbonus(struct script_state *st) { - int type,val,duration,timer; + int type,val,duration,timer; struct pet_data *pd; - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd=script_rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if(sd==NULL || sd->pd==NULL) return 0; pd=sd->pd; @@ -5691,7 +5691,7 @@ int buildin_petskillbonus(struct script_state *st) pd->skillbonusduration=-1; pd->skillbonustimer=-1; - + pet_skill_bonus(sd,pd,type,val,duration,timer,0); return 0; @@ -5719,7 +5719,7 @@ int buildin_petloot(struct script_state *st) if(!max) return 0; - + pd->loot=1; pd->lootmax=max; @@ -5790,14 +5790,14 @@ int buildin_clearitem(struct script_state *st) */ int buildin_classchange(struct script_state *st) { - int class,type; + int _class,type; struct block_list *bl=map_id2bl(st->oid); - + if(bl==NULL) return 0; - class=conv_num(st,& (st->stack->stack_data[st->start+2])); + _class=conv_num(st,& (st->stack->stack_data[st->start+2])); type=conv_num(st,& (st->stack->stack_data[st->start+3])); - clif_class_change(bl,class,type); + clif_class_change(bl,_class,type); return 0; } @@ -5867,9 +5867,9 @@ int buildin_petrecovery(struct script_state *st) { struct pet_data *pd; - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd=script_rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if(sd==NULL || sd->pd==NULL) return 0; pd=sd->pd; @@ -5893,9 +5893,9 @@ int buildin_petheal(struct script_state *st) { struct pet_data *pd; - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd=script_rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if(sd==NULL || sd->pd==NULL) return 0; pd=sd->pd; @@ -5911,7 +5911,7 @@ int buildin_petheal(struct script_state *st) return 0; } - + /*========================================== * pet magnificat [Valaris] *------------------------------------------ @@ -5919,9 +5919,9 @@ int buildin_petheal(struct script_state *st) int buildin_petmag(struct script_state *st) { struct pet_data *pd; - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd=script_rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if(sd==NULL || sd->pd==NULL) return 0; pd=sd->pd; @@ -5946,9 +5946,9 @@ int buildin_petmag(struct script_state *st) int buildin_petskillattack(struct script_state *st) { struct pet_data *pd; - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd=script_rid2sd(st); - if(sd==NULL || sd->pd==NULL) + if(sd==NULL || sd->pd==NULL) return 0; pd=sd->pd; @@ -5957,7 +5957,7 @@ int buildin_petskillattack(struct script_state *st) return 0; pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2])); - pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3])); + pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3])); pd->skillduration=conv_num(st,& (st->stack->stack_data[st->start+4])); pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+5])); @@ -5973,11 +5973,11 @@ int buildin_petskillattack(struct script_state *st) int buildin_skilleffect(struct script_state *st) { struct map_session_data *sd; - + int skillid=conv_num(st,& (st->stack->stack_data[st->start+2])); int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3])); sd=script_rid2sd(st); - + clif_skill_nodamage(&sd->bl,&sd->bl,skillid,skilllv,1); return 0; @@ -5990,9 +5990,9 @@ int buildin_skilleffect(struct script_state *st) int buildin_npcskilleffect(struct script_state *st) { struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid); - + int skillid=conv_num(st,& (st->stack->stack_data[st->start+2])); - int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3])); + int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3])); int x=conv_num(st,& (st->stack->stack_data[st->start+4])); int y=conv_num(st,& (st->stack->stack_data[st->start+5])); @@ -6036,13 +6036,13 @@ int buildin_specialeffect2(struct script_state *st) int buildin_nude(struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd=script_rid2sd(st); int i; if(sd==NULL) return 0; - - for(i=0;i<11;i++) + + for(i=0;i<11;i++) if(sd->equip_index[i] >= 0) pc_unequipitem(sd,sd->equip_index[i],2); @@ -6118,7 +6118,7 @@ int buildin_message(struct script_state *st) * area) [Valaris] *------------------------------------------ */ - + int buildin_npctalk(struct script_state *st) { char *str; @@ -6148,16 +6148,16 @@ int buildin_hasitems(struct script_state *st) { int i; struct map_session_data *sd; - + sd=script_rid2sd(st); - + for(i=0; istatus.inventory[i].amount) { push_val(st->stack,C_INT,1); return 0; } } - + push_val(st->stack,C_INT,0); return 0; @@ -6262,7 +6262,7 @@ int buildin_getsavepoint(struct script_state *st) sd=script_rid2sd(st); type=conv_num(st,& (st->stack->stack_data[st->start+2])); - mapname=aCalloc(24, 1); + mapname=aCallocA(24, 1); x=sd->status.save_point.x; y=sd->status.save_point.y; @@ -6331,7 +6331,7 @@ int buildin_getmapxy(struct script_state *st){ //??????????? >>> Possible needly check function parameters on C_STR,C_INT,C_INT <<< ???????????// type=conv_num(st,& (st->stack->stack_data[st->start+5])); - mapname=aCalloc(24, 1); + mapname=aCallocA(24, 1); switch (type){ case 0: //Get Character Position @@ -6363,7 +6363,7 @@ int buildin_getmapxy(struct script_state *st){ } x=nd->bl.x; - y=nd->bl.y; + y=nd->bl.y; strncpy(mapname,map[nd->bl.m].name,24); printf(">>>>%s %d %d\n",mapname,x,y); break; @@ -6385,7 +6385,7 @@ int buildin_getmapxy(struct script_state *st){ return 0; } x=pd->bl.x; - y=pd->bl.y; + y=pd->bl.y; strncpy(mapname,map[pd->bl.m].name,24); printf(">>>>%s %d %d\n",mapname,x,y); @@ -6491,7 +6491,7 @@ int buildin_logmes(struct script_state *st) int buildin_summon(struct script_state *st) { - int class, id; + int _class, id; char *str,*event=""; struct map_session_data *sd; struct mob_data *md; @@ -6500,11 +6500,11 @@ int buildin_summon(struct script_state *st) if (sd) { int tick = gettick(); str =conv_str(st,& (st->stack->stack_data[st->start+2])); - class=conv_num(st,& (st->stack->stack_data[st->start+3])); + _class=conv_num(st,& (st->stack->stack_data[st->start+3])); if( st->end>st->start+4 ) event=conv_str(st,& (st->stack->stack_data[st->start+4])); - id=mob_once_spawn(sd, "this", 0, 0, str,class,1,event); + id=mob_once_spawn(sd, "this", 0, 0, str,_class,1,event); if((md=(struct mob_data *)map_id2bl(id))){ md->master_id=sd->bl.id; md->state.special_mob_ai=1; @@ -6608,14 +6608,14 @@ void op_add(struct script_state* st) st->stack->stack_data[st->stack->sp-1].u.num += st->stack->stack_data[st->stack->sp].u.num; } else { // ssの予定 char *buf; - buf=(char *)aCalloc(strlen(st->stack->stack_data[st->stack->sp-1].u.str)+ + buf=(char *)aCallocA(strlen(st->stack->stack_data[st->stack->sp-1].u.str)+ strlen(st->stack->stack_data[st->stack->sp].u.str)+1,sizeof(char)); strcpy(buf,st->stack->stack_data[st->stack->sp-1].u.str); strcat(buf,st->stack->stack_data[st->stack->sp].u.str); if(st->stack->stack_data[st->stack->sp-1].type==C_STR) - free(st->stack->stack_data[st->stack->sp-1].u.str); + aFree(st->stack->stack_data[st->stack->sp-1].u.str); if(st->stack->stack_data[st->stack->sp].type==C_STR) - free(st->stack->stack_data[st->stack->sp].u.str); + aFree(st->stack->stack_data[st->stack->sp].u.str); st->stack->stack_data[st->stack->sp-1].type=C_STR; st->stack->stack_data[st->stack->sp-1].u.str=buf; } @@ -6657,8 +6657,8 @@ void op_2str(struct script_state *st,int op,int sp1,int sp2) push_val(st->stack,C_INT,a); - if(st->stack->stack_data[sp1].type==C_STR) free(s1); - if(st->stack->stack_data[sp2].type==C_STR) free(s2); + if(st->stack->stack_data[sp1].type==C_STR) aFree(s1); + if(st->stack->stack_data[sp2].type==C_STR) aFree(s2); } /*========================================== * 二項演算子(数値) @@ -6672,7 +6672,11 @@ void op_2num(struct script_state *st,int op,int i1,int i2) break; case C_MUL: { + #ifndef _MSC_VER long long res = i1 * i2; + #else + __int64 res = i1 * i2; + #endif if (res > 2147483647 ) i1 = 2147483647; else @@ -6988,7 +6992,7 @@ int run_script_main(unsigned char *script,int pos,int rid,int oid,struct script_ struct map_session_data *sd=map_id2sd(st->rid); if(sd/* && sd->npc_stackbuf==NULL*/){ if( sd->npc_stackbuf ) - free( sd->npc_stackbuf ); + aFree( sd->npc_stackbuf ); sd->npc_stackbuf = (char *)aCalloc(sizeof(stack->stack_data[0])*stack->sp_max,sizeof(char)); memcpy(sd->npc_stackbuf, stack->stack_data, sizeof(stack->stack_data[0]) * stack->sp_max); sd->npc_stack = stack->sp; @@ -7022,7 +7026,7 @@ int run_script(unsigned char *script,int pos,int rid,int oid) stack.sp_max=sd->npc_stackmax; stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0])); memcpy(stack.stack_data,sd->npc_stackbuf,sizeof(stack.stack_data[0])*stack.sp_max); - free(sd->npc_stackbuf); + aFree(sd->npc_stackbuf); sd->npc_stackbuf=NULL; }else{ // スタック初期化 @@ -7036,7 +7040,7 @@ int run_script(unsigned char *script,int pos,int rid,int oid) st.oid=oid; run_script_main(script,pos,rid,oid,&st,rootscript); - free(stack.stack_data); + aFree(stack.stack_data); stack.stack_data=NULL; return st.pos; } @@ -7065,14 +7069,14 @@ int mapreg_setregstr(int num,const char *str) char *p; if( (p=numdb_search(mapregstr_db,num))!=NULL ) - free(p); + aFree(p); if( str==NULL || *str==0 ){ numdb_erase(mapregstr_db,num); mapreg_dirty=1; return 0; } - p=(char *)aCalloc(strlen(str)+1, sizeof(char)); + p=(char *)aCallocA(strlen(str)+1, sizeof(char)); strcpy(p,str); numdb_insert(mapregstr_db,num,p); mapreg_dirty=1; @@ -7102,7 +7106,7 @@ static int script_load_mapreg() printf("%s: %s broken data !\n",mapreg_txt,buf1); continue; } - p=(char *)aCalloc(strlen(buf2) + 1,sizeof(char)); + p=(char *)aCallocA(strlen(buf2) + 1,sizeof(char)); strcpy(p,buf2); s=add_str(buf1); numdb_insert(mapregstr_db,(i<<24)|s,p); @@ -7170,7 +7174,7 @@ static int script_autosave_mapreg(int tid,unsigned int tick,int id,int data) } /*========================================== - * + * *------------------------------------------ */ static int set_posword(char *p) @@ -7256,7 +7260,7 @@ static int mapreg_db_final(void *key,void *data,va_list ap) } static int mapregstr_db_final(void *key,void *data,va_list ap) { - free(data); + aFree(data); return 0; } static int scriptlabel_db_final(void *key,void *data,va_list ap) @@ -7265,8 +7269,8 @@ static int scriptlabel_db_final(void *key,void *data,va_list ap) } static int userfunc_db_final(void *key,void *data,va_list ap) { - free(key); - free(data); + aFree(key); + aFree(data); return 0; } int do_final_script() @@ -7274,7 +7278,7 @@ int do_final_script() if(mapreg_dirty>=0) script_save_mapreg(); if(script_buf) - free(script_buf); + aFree(script_buf); if(mapreg_db) numdb_final(mapreg_db,mapreg_db_final); @@ -7286,9 +7290,9 @@ int do_final_script() strdb_final(userfunc_db,userfunc_db_final); if (str_data) - free(str_data); + aFree(str_data); if (str_buf) - free(str_buf); + aFree(str_buf); return 0; } diff --git a/src/map/skill.c b/src/map/skill.c index 8ede774e3..16cb26c06 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -730,7 +730,7 @@ const struct skill_name_db skill_names[] = { { WZ_STORMGUST, "STORMGUST", "Storm_Gust" } , { WZ_VERMILION, "VERMILION", "Lord_of_Vermilion" } , { WZ_WATERBALL, "WATERBALL", "Water_Ball" } , - { 0, 0, 0 } + { 0, 0, 0 } }; static const int dirx[8]={0,-1,-1,-1,0,1,1,1}; @@ -890,8 +890,8 @@ int skillnotok(int skillid, struct map_session_data *sd) { if (sd == 0) return 0; - if (!(skillid >= 10000 && skillid < 10015)) - if ((skillid > MAX_SKILL) || (skillid < 0)) + if (!(skillid >= 10000 && skillid < 10015)) + if ((skillid > MAX_SKILL) || (skillid < 0)) return 1; if (pc_isGM(sd) >= 20) @@ -1055,12 +1055,12 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s //if(skilllv <= 0) return 0; if(skillid > 0 && skilllv <= 0) return 0; // don't forget auto attacks! - celest - if(src->type==BL_PC){ - nullpo_retr(0, sd=(struct map_session_data *)src); - }else if(src->type==BL_MOB){ - nullpo_retr(0, md=(struct mob_data *)src); //未使用? - }else if(src->type==BL_PET){ - nullpo_retr(0, pd=(struct pet_data *)src); // [Valaris] + if (src->type == BL_PC){ + nullpo_retr(0, sd = (struct map_session_data *)src); + } else if (src->type == BL_MOB){ + nullpo_retr(0, md = (struct mob_data *)src); //未使用? + } else if (src->type == BL_PET){ + nullpo_retr(0, pd = (struct pet_data *)src); // [Valaris] } //?象の耐性 @@ -1088,6 +1088,13 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s if(sc_def_luk<50) sc_def_luk=50; } + if (dstsd && dstsd->sc_count && dstsd->sc_data[SC_GOSPEL].timer != -1 && + dstsd->sc_data[SC_GOSPEL].val4 == BCT_PARTY && + dstsd->sc_data[SC_GOSPEL].val3 == 3) { + sc_def_mdef -= 25; + sc_def_vit -= 25; + sc_def_int -= 25; + } if(sc_def_mdef<0) sc_def_mdef=0; if(sc_def_vit<0) @@ -1291,18 +1298,18 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s // case WZ_METEOR: if(rand()%100 < sc_def_vit) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); + skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); break; case WZ_VERMILION: if(rand()%100 < sc_def_int) - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); + skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); break; // -- moonsoul (stun ability of new champion skill tigerfist) // case CH_TIGERFIST: if( rand()%100 < (10 + skilllv*10)*sc_def_vit/100 ) { - int sec = skill_get_time2 (skillid,skilllv) - (double)battle_get_agi(bl)*0.1; + int sec = skill_get_time2 (skillid,skilllv) - battle_get_agi(bl)/10; skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,sec,0); } break; @@ -1577,7 +1584,7 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds return 0; if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //?象がPCですでに死んでいたら何もしない return 0; - if(bl->type == BL_PC && skillnotok(skillid, (struct map_session_data *) bl)) + if(bl->type == BL_PC && skillnotok(skillid, (struct map_session_data *) bl)) return 0; // [MouseJstr] if(sc_data && sc_data[SC_HIDING].timer != -1) { //ハイディング?態で if(skill_get_pl(skillid) != 2) //スキルの?性が地?性でなければ何もしない @@ -2297,7 +2304,7 @@ int skill_cleartimerskill(struct block_list *src) */ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ) { - struct map_session_data *sd=NULL; + struct map_session_data *sd = NULL; struct status_change *sc_data = battle_get_sc_data(src); int i; @@ -2374,7 +2381,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s case LK_SPIRALPIERCE: /* スパイラルピア?ス */ case LK_HEADCRUSH: /* ヘッドクラッシュ */ case LK_JOINTBEAT: /* ジョイントビ?ト */ - case PA_PRESSURE: /* プレッシャ? */ +// case PA_PRESSURE: /* プレッシャ? */ // case PA_SACRIFICE: /* サクリファイス */ case SN_SHARPSHOOTING: /* シャ?プシュ?ティング */ case CG_ARROWVULCAN: /* アロ?バルカン */ @@ -2383,6 +2390,22 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s case ITM_TOMAHAWK: skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); break; + case PA_PRESSURE: /* プレッシャ? */ + skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); + if (rand()%100 < 50) + skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(PA_PRESSURE,skilllv),0); + else + skill_status_change_start(bl,SC_BLEEDING,skilllv,0,0,0,skill_get_time2(PA_PRESSURE,skilllv),0); + if (bl->type == BL_PC) { + int sp; + struct map_session_data *tsd = (struct map_session_data *)bl; + nullpo_retb (tsd); + sp = tsd->status.max_sp * 10 * skilllv / 100; + if (sp > tsd->status.sp) sp = tsd->status.sp; + tsd->status.sp -= sp; + pc_heal(sd,0,-sp); + } + break; case NPC_DARKBREATH: clif_emotion(src,7); skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag); @@ -2429,7 +2452,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s else if (bl->type == BL_MOB) ((struct mob_data *)bl)->dir=dir; clif_changed_dir(bl); - //skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)); + //skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)); } else if(src->type == BL_PC) clif_skill_fail(sd,sd->skillid,0,0); @@ -2558,7 +2581,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s if (skillid == ASC_METEORASSAULT) clif_skill_nodamage(src,bl,skillid,skilllv,1); - + skill_area_temp[1]=bl->id; skill_area_temp[2]=x; skill_area_temp[3]=y; @@ -2752,7 +2775,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s case WZ_FROSTNOVA: /* フロストノヴァ */ skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0); //skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - map_foreachinarea(skill_attack_area,src->m,src->x-5,bl->y-5,bl->x+5,bl->y+5,0,BF_MAGIC,src,src,skillid,skilllv,tick,flag,BCT_ENEMY); + map_foreachinarea(skill_attack_area,src->m,src->x-5,bl->y-5,bl->x+5,bl->y+5,0,BF_MAGIC,src,src,skillid,skilllv,tick,flag,BCT_ENEMY); break; case WZ_SIGHTRASHER: @@ -2806,8 +2829,10 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s clif_skill_nodamage(src,bl,skillid,skilllv,1); if (skilllv == 5) skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,0 ); - if (bl->type == BL_PC) + if (bl->type == BL_PC) { ((struct map_session_data *)bl)->status.sp = 0; + clif_updatestatus((struct map_session_data *)bl,SP_SP); + } } else { clif_skill_nodamage(src,src,skillid,skilllv,1); if (skilllv == 5) @@ -2961,7 +2986,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int return 1; if (skillnotok(skillid, (struct map_session_data *)bl)) // [MouseJstr] return 0; - + map_freeblock_lock(); switch(skillid) { @@ -2971,7 +2996,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int int heal_get_jobexp; int skill; struct pc_base_job s_class; - + if( dstsd && dstsd->special_state.no_magic_damage ) heal=0; /* ?金蟲カ?ド(ヒ?ル量0) */ if (sd){ @@ -2981,7 +3006,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //自分も?象もPC、?象が自分のパ?トナ?、自分がスパノビ、自分が♀なら heal = heal*2; //スパノビの嫁が旦那にヒ?ルすると2倍になる } - + clif_skill_nodamage(src,bl,skillid,heal,1); heal_get_jobexp = battle_heal(NULL,bl,heal,0,0); @@ -3192,11 +3217,11 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int struct status_change *tsc_data = battle_get_sc_data(bl); int sc = SkillStatusChangeTable[skillid]; int sc2 = SC_MARIONETTE2; - + if((dstsd->bl.type!=BL_PC) || (sd->bl.id == dstsd->bl.id) || (!sd->status.party_id) - || (sd->status.party_id != dstsd->status.party_id)) { + || (sd->status.party_id != dstsd->status.party_id)) { clif_skill_fail(sd,skillid,0,0); map_freeblock_unlock(); return 1; @@ -3218,7 +3243,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int } clif_skill_nodamage(src,bl,skillid,skilllv,1); } - } + } break; case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris] @@ -3303,7 +3328,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); skill_status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0,10000,0 ); break; - + case SM_AUTOBERSERK: // Celest { struct status_change *tsc_data = battle_get_sc_data(bl); @@ -3317,7 +3342,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int } } break; - + case AS_ENCHANTPOISON: // Prevent spamming [Valaris] if(bl->type==BL_PC) { struct map_session_data *sd2=(struct map_session_data *)bl; @@ -3385,11 +3410,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skill_status_change_end(bl,SC_SLEEP,-1); } - if(bl->type==BL_MOB) { + if(dstmd) { int range = skill_get_range(skillid,skilllv); if(range < 0) range = battle_get_range(src) - (range + 1); - mob_target((struct mob_data *)bl,src,range); + md->state.provoke_flag = src->id; + mob_target(dstmd,src,range); } } break; @@ -3506,7 +3532,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int clif_skill_produce_mix_list(sd,256); clif_skill_nodamage(src,bl,skillid,skilllv,1); } - break; + break; case BS_HAMMERFALL: /* ハンマ?フォ?ル */ clif_skill_nodamage(src,bl,skillid,skilllv,1); if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage ) @@ -3733,6 +3759,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skill_clear_unitgroup(src); clif_skill_nodamage(src,bl,skillid,skilllv,1); skill_unitsetting(src,skillid,skilllv,src->x,src->y,0); + skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,BCT_SELF,skill_get_time(skillid,skilllv),0); break; case BD_ADAPTATION: /* アドリブ */ @@ -4402,20 +4429,20 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking) pc_breakweapon((struct map_session_data *)bl); break; - + case NPC_BREAKARMOR: clif_skill_nodamage(src,bl,skillid,skilllv,1); if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking) pc_breakarmor((struct map_session_data *)bl); break; - + case NPC_BREAKHELM: clif_skill_nodamage(src,bl,skillid,skilllv,1); if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking) // since we don't have any code for helm breaking yet... pc_breakweapon((struct map_session_data *)bl); break; - + case NPC_BREAKSHIELD: clif_skill_nodamage(src,bl,skillid,skilllv,1); if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking) @@ -4449,7 +4476,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int if(map[sd->bl.m].flag.nomemo || map[sd->bl.m].flag.nowarpto || map[dstsd->bl.m].flag.nowarp){ clif_skill_teleportmessage(sd,1); return 0; - } + } skill_unitsetting(src,skillid,skilllv,sd->bl.x,sd->bl.y,0); } break; @@ -4500,7 +4527,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); } } - + } if(su->group->unit_id == 0x91 && su->group->val2){ struct block_list *target=map_id2bl(su->group->val2); @@ -4595,7 +4622,9 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int sd->status.sp = sp2; dstsd->status.sp = sp1; clif_heal(sd->fd,SP_SP,sp2); + clif_updatestatus(sd,SP_SP); clif_heal(dstsd->fd,SP_SP,sp1); + clif_updatestatus(dstsd,SP_SP); } else if (dstmd) { if (dstmd->state.soul_change_flag) { clif_skill_fail(sd,skillid,0,0); @@ -4607,6 +4636,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int sp2 = sd->status.max_sp - sd->status.sp; sd->status.sp += sp2; clif_heal(sd->fd,SP_SP,sp2); + clif_updatestatus(sd,SP_SP); dstmd->state.soul_change_flag = 1; } } @@ -4661,6 +4691,15 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int } } break; + case ST_PRESERVE: + if (sd){ + if (sd->sc_count && sd->sc_data[SC_PRESERVE].timer != -1) + skill_status_change_end(src, SC_PRESERVE, -1 ); + else + skill_status_change_start(src,SC_PRESERVE,skilllv,0,0,0,skill_get_time(skillid, skilllv),0 ); + clif_skill_nodamage(src,src,skillid,skilllv,1); + } + break; // New guild skills [Celest] case GD_BATTLEORDER: @@ -4713,7 +4752,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int } } break; - case GD_RESTORE: + case GD_RESTORE: { struct guild *g = NULL; // Only usable during WoE @@ -4725,8 +4764,8 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int if(flag&1) { if (dstsd && dstsd->status.guild_id == sd->status.guild_id) { int hp, sp; - hp = dstsd->status.max_hp*0.9; - sp = dstsd->status.max_sp*0.9; + hp = dstsd->status.max_hp*9/10; + sp = dstsd->status.max_sp*9/10; sp = dstsd->status.sp + sp <= dstsd->status.max_sp ? sp : dstsd->status.max_sp - dstsd->status.sp; clif_skill_nodamage(src,bl,AL_HEAL,hp,1); battle_heal(NULL,bl,hp,sp,0); @@ -4937,8 +4976,8 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil if(src->type==BL_PC){ nullpo_retr(0, sd=(struct map_session_data *)src); } - if( skillid != WZ_METEOR && - skillid != WZ_SIGHTRASHER && + if( skillid != WZ_METEOR && + skillid != WZ_SIGHTRASHER && skillid != AM_CANNIBALIZE && skillid != AM_SPHEREMINE) clif_skill_poseffect(src,skillid,skilllv,x,y,tick); @@ -5015,7 +5054,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil case HT_TALKIEBOX: /* ト?キ?ボックス */ skill_unitsetting(src,skillid,skilllv,x,y,0); break; - + case RG_GRAFFITI: /* Graffiti [Valaris] */ skill_clear_unitgroup(src); skill_unitsetting(src,skillid,skilllv,x,y,0); @@ -5088,7 +5127,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil mx = x;// + (rand()%10 - 5); my = y;// + (rand()%10 - 5); - + id=mob_once_spawn(sd,"this",mx,my,"--ja--", summons[skilllv-1] ,1,""); if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){ md->master_id=sd->bl.id; @@ -5138,7 +5177,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil map_foreachinarea(skill_area_sub, src->m,x-3,y-3,x+3,y+3,0, src,skillid,skilllv,tick,flag|BCT_ALL|1, - skill_castend_nodamage_id); + skill_castend_nodamage_id); } } } @@ -5175,7 +5214,7 @@ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *ma sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_MARIONETTE].timer != -1) return 0; - + if (sd->sc_data[SC_BLOCKSKILL].timer!=-1) if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3) return 0; @@ -5243,7 +5282,7 @@ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *ma return 0; if((group=skill_unitsetting(&sd->bl,sd->skillid,sd->skilllv,sd->skillx,sd->skilly,0))==NULL) return 0; - group->valstr=(char *)aCalloc(24,sizeof(char)); + group->valstr=(char *)aCallocA(24,sizeof(char)); memcpy(group->valstr,map,24); group->val2=(x<<16)|y; } @@ -5287,7 +5326,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, else count=3; limit=skill_get_time(skillid,skilllv); if(sc_data) { - if (sc_data[SC_VIOLENTGALE].timer!=-1) limit *= 1.5; + if (sc_data[SC_VIOLENTGALE].timer!=-1) limit = limit*3/2; } // check for sc_data first - Celest // if (((struct map_session_data *)src)->sc_data[SC_VIOLENTGALE].timer!=-1) @@ -5337,7 +5376,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, if(skilllv < 6) range=1; else - range=2; + range=2; break; case MG_THUNDERSTORM: /* サンダ?スト?ム */ @@ -5629,7 +5668,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, group->range=range; if(skillid==HT_TALKIEBOX || skillid==RG_GRAFFITI){ - group->valstr=aCalloc(80, 1); + group->valstr=aCallocA(80, 1); if(group->valstr==NULL){ printf("skill_castend_map: out of memory !\n"); exit(1); @@ -6079,13 +6118,13 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int { struct status_change *sc_data=battle_get_sc_data(bl); if(sg->val2==0 && sc_data && sc_data[SC_ANKLE].timer==-1){ - int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE); - int sec=skill_get_time2(sg->skill_id,sg->skill_lv) - (double)battle_get_agi(bl)*0.1; + int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE); + int sec = skill_get_time2(sg->skill_id,sg->skill_lv) - battle_get_agi(bl)/10; if(battle_get_mode(bl)&0x20) sec = sec/5; battle_stopwalking(bl,1); skill_status_change_start(bl,SC_ANKLE,sg->skill_lv,0,0,0,sec,0); - + if(moveblock) map_delblock(bl); bl->x = src->bl.x; bl->y = src->bl.y; @@ -6127,7 +6166,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int case 0x8e: /* クァグマイア */ { struct status_change *sc_data=battle_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; + int type=SkillStatusChangeTable[sg->skill_id]; if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) break; if(sc_data && sc_data[type].timer==-1) @@ -6153,7 +6192,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int if (sc_data[type].timer==-1) skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){ - if( unit2->group != 0 && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) + if( unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); ts->tick-=sg->interval; } @@ -6210,7 +6249,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); else if((unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){ - if( unit2->group != 0 && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) + if( unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); ts->tick-=sg->interval; @@ -6489,7 +6528,7 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t { struct map_session_data *sd; if (bl->type == BL_PC && (sd=(struct map_session_data *)bl) && sd->state.hawkeyes_flag > 0) - sd->state.hawkeyes_flag = 0; + sd->state.hawkeyes_flag = 0; } break; @@ -6578,7 +6617,7 @@ int skill_unit_onlimit(struct skill_unit *src,unsigned int tick) src->bl.x,src->bl.y,1); if(group == NULL) return 0; - group->valstr=aCalloc(24, 1); + group->valstr=aCallocA(24, 1); if(group->valstr==NULL){ printf("skill_unit_onlimit: out of memory !\n"); exit(1); @@ -6619,7 +6658,7 @@ int skill_unit_onlimit(struct skill_unit *src,unsigned int tick) struct map_session_data *sd; if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) { sd->state.glorywounds_flag = 0; - } + } } break; case 0xc3: // GD_SOULCOLD @@ -6627,7 +6666,7 @@ int skill_unit_onlimit(struct skill_unit *src,unsigned int tick) struct map_session_data *sd; if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) { sd->state.soulcold_flag = 0; - } + } } break; case 0xc4: // GD_HAWKEYES @@ -6905,7 +6944,7 @@ static int skill_check_condition_use_sub(struct block_list *bl,va_list ap) nullpo_retr(0, ssd=(struct map_session_data*)src); s_class = pc_calc_base_job(sd->status.class_); - + //チェックしない設定ならcにありえない大きな?字を返して終了 if(!battle_config.player_skill_partner_check){ //本?はforeachの前にやりたいけど設定適用箇所をまとめるためにここへ (*c)=99; @@ -7034,7 +7073,7 @@ int skill_check_condition(struct map_session_data *sd,int type) (sd->sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE)){ clif_skill_fail(sd,sd->skillid,0,0); return 0; /* ?態異常や沈?など */ - } + } } skill = sd->skillid; lv = sd->skilllv; @@ -7192,7 +7231,7 @@ int skill_check_condition(struct map_session_data *sd,int type) break; case MG_FIREWALL: /* ファイア?ウォ?ル */ case WZ_QUAGMIRE: - case WZ_FIREPILLAR: // celest + case WZ_FIREPILLAR: // celest case PF_FOGWALL: /* ?制限 */ if(battle_config.pc_land_skill_limit) { @@ -7340,7 +7379,7 @@ int skill_check_condition(struct map_session_data *sd,int type) if(((itemid[i] >= 715 && itemid[i] <= 717) || itemid[i] == 1065) && sd->sc_data[SC_INTOABYSS].timer != -1) continue; if(skill == WZ_FIREPILLAR && lv<=5) - continue; // no gemstones for 1-5 [Celest] + continue; // no gemstones for 1-5 [Celest] if(skill == AM_POTIONPITCHER && i != x) continue; @@ -7357,7 +7396,7 @@ int skill_check_condition(struct map_session_data *sd,int type) if(!(type&1)) return 1; - if(skill != AM_POTIONPITCHER && + if(skill != AM_POTIONPITCHER && skill != CR_SLIMPITCHER && skill != MG_STONECURSE) { if(skill == AL_WARP && !(type&2)) @@ -7408,7 +7447,7 @@ int skill_castfix( struct block_list *bl, int time ) nullpo_retr(0, md=(struct mob_data*)bl); skill = md->skillid; lv = md->skilllv; - } else { + } else { nullpo_retr(0, sd=(struct map_session_data*)bl); skill = sd->skillid; lv = sd->skilllv; @@ -7451,13 +7490,13 @@ int skill_delayfix( struct block_list *bl, int time ) { struct status_change *sc_data; struct map_session_data *sd = NULL; - int skill,lv = 0; - int delayrate=100; - + int skill = 0,lv = 0; + int delayrate = 100; + nullpo_retr(0, bl); - if(bl->type==BL_PC){ - nullpo_retr(0, sd=(struct map_session_data*)bl); + if(bl->type == BL_PC){ + nullpo_retr(0, sd = (struct map_session_data*)bl); skill = sd->skillid; lv = sd->skilllv; } @@ -7466,24 +7505,32 @@ int skill_delayfix( struct block_list *bl, int time ) sc_data = battle_get_sc_data(bl); - // instant cast attack skills depend on aspd as delay [celest] - if (time <= 0 && skill_db[skill].skill_type == BF_WEAPON) - time = battle_get_adelay (bl)/2; - if(sd) { delayrate=((struct map_session_data *)bl)->delayrate; + // instant cast attack skills depend on aspd as delay [celest] + if (time == 0) { + if (skill_db[skill].skill_type == BF_WEAPON) + time = battle_get_adelay (bl)/2; + else + time = 300; // default delay, according to official servers + } else if (time < 0) + time = abs(time) + battle_get_adelay (bl)/2; // if set to <0, the aspd delay will be added + if(battle_config.delay_dependon_dex && /* dexの影響を計算する */ !skill_get_delaynodex(skill, lv)) // if skill casttime is allowed to be reduced by dex - time=time*(battle_config.castrate_dex_scale - battle_get_dex(bl))/(battle_config.castrate_dex_scale); + time = time * (battle_config.castrate_dex_scale - battle_get_dex(bl)) / (battle_config.castrate_dex_scale); - time=time*delayrate*battle_config.delay_rate/10000; + time = time * delayrate * battle_config.delay_rate / 10000; + + if (time < battle_config.min_skill_delay_limit) // check minimum skill delay + time = battle_config.min_skill_delay_limit; } /* ブラギの詩 */ - if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1 ) - time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2 - +(sc_data[SC_POEMBRAGI].val3&0xffff)))/100; + if(sc_data && sc_data[SC_POEMBRAGI].timer != -1 ) + time = time * (100 - (sc_data[SC_POEMBRAGI].val1 * 3 + sc_data[SC_POEMBRAGI].val2 + + (sc_data[SC_POEMBRAGI].val3 & 0xffff))) / 100; return (time>0)?time:0; } @@ -7512,10 +7559,10 @@ int skill_use_id( struct map_session_data *sd, int target_id, } if(sd->bl.m != bl->m || pc_isdead(sd)) return 0; - + if(skillnotok(skill_num, sd)) // [MouseJstr] return 0; - + sc_data=sd->sc_data; /* 沈?や異常(ただし、グリムなどの判定をする) */ @@ -7598,7 +7645,7 @@ int skill_use_id( struct map_session_data *sd, int target_id, case ST_CHASEWALK: return 0; } - }*/ + }*/ if(skill_get_inf2(skill_num)&0x200 && sd->bl.id == target_id) return 0; @@ -7671,15 +7718,27 @@ int skill_use_id( struct map_session_data *sd, int target_id, if(!skill_check_condition(sd,0)) return 0; - /* 射程と障害物チェック */ - range = skill_get_range(skill_num,skill_lv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - // be lenient if the skill was cast before we have moved to the correct position [Celest] - if (sd->walktimer != -1) - range += battle_config.skill_range_leniency; - if(!battle_check_range(&sd->bl,bl,range) ) - return 0; + { + int check_range_flag = 0; + + /* 射程と障害物チェック */ + range = skill_get_range(skill_num,skill_lv); + if(range < 0) + range = battle_get_range(&sd->bl) - (range + 1); + // be lenient if the skill was cast before we have moved to the correct position [Celest] + if (sd->walktimer != -1) + range += battle_config.skill_range_leniency; + else check_range_flag = 1; + if(!battle_check_range(&sd->bl,bl,range)) { + if (check_range_flag && battle_check_range(&sd->bl,bl,range + battle_config.skill_range_leniency)) { + int dir, mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}}; + dir = map_calc_dir(&sd->bl,bl->x,bl->y); + pc_walktoxy (sd, sd->bl.x + mask[dir][0] * battle_config.skill_range_leniency, + sd->bl.y + mask[dir][1] * battle_config.skill_range_leniency); + } else + return 0; + } + } if(bl->type==BL_PC) { target_sd=(struct map_session_data*)bl; @@ -7745,13 +7804,12 @@ int skill_use_id( struct map_session_data *sd, int target_id, case WE_MALE: case WE_FEMALE: { + struct map_session_data *p_sd = pc_get_partner(sd); + nullpo_retr (0, p_sd) if(skill_num == WE_MALE && sd->status.hp <= ((15*sd->status.max_hp)/100)) // Requires more than 15% of Max HP for WE_MALE return 0; if(skill_num == WE_FEMALE && sd->status.sp <= ((15*sd->status.max_sp)/100)) // Requires more than 15% of Max SP for WE_FEMALE return 0; - struct map_session_data *p_sd = NULL; - if((p_sd = pc_get_partner(sd)) == NULL) - return 0; target_id = p_sd->bl.id; //rangeをもう1回?査 range = skill_get_range(skill_num,skill_lv); @@ -7905,7 +7963,7 @@ int skill_use_pos( struct map_session_data *sd, /* if(map[sd->bl.m].flag.gvg && (skill_num == SM_ENDURE || skill_num == AL_TELEPORT || - skill_num == AL_WARP || skill_num == WZ_ICEWALL || + skill_num == AL_WARP || skill_num == WZ_ICEWALL || skill_num == TF_BACKSLIDING)) return 0;*/ @@ -8023,7 +8081,7 @@ int skill_castcancel(struct block_list *bl,int type) } sd->skilltimer=-1; clif_skillcastcancel(bl); - } + } return 0; }else if(bl->type==BL_MOB){ @@ -8695,12 +8753,14 @@ int skill_status_change_timer_sub(struct block_list *bl, va_list ap ) break; case SC_RUWACH: /* ルアフ */ if( (*battle_get_option(bl))&6 ){ - skill_status_change_end( bl, SC_HIDING, -1); - skill_status_change_end( bl, SC_CLOAKING, -1); if(battle_check_target( src,bl, BCT_ENEMY ) > 0) { - struct status_change *sc_data = battle_get_sc_data(bl); - if (sc_data) + struct status_change *sc_data = battle_get_sc_data(bl); // check whether the target is hiding/cloaking [celest] + if (sc_data && (sc_data[SC_HIDING].timer != -1 || // if the target is using a special hiding, i.e not using normal hiding/cloaking, don't bother + sc_data[SC_CLOAKING].timer != -1)) { + skill_status_change_end( bl, SC_HIDING, -1); + skill_status_change_end( bl, SC_CLOAKING, -1); skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0); + } } } break; @@ -8712,7 +8772,7 @@ int skill_status_change_timer_sub(struct block_list *bl, va_list ap ) * ステ?タス異常終了 *------------------------------------------ */ -int skill_status_change_end(struct block_list* bl, int type, int tid) +int skill_status_change_end(struct block_list* bl, int type, int tid) { struct status_change* sc_data; int opt_flag=0, calc_flag = 0; @@ -8798,8 +8858,6 @@ int skill_status_change_end(struct block_list* bl, int type, int tid) case SC_MELTDOWN: /* メルトダウン */ // Celest case SC_EDP: - case SC_MARIONETTE: - case SC_MARIONETTE2: case SC_SLOWDOWN: case SC_SPEEDUP0: /* case SC_LEADERSHIP: @@ -8816,7 +8874,7 @@ int skill_status_change_end(struct block_list* bl, int type, int tid) break; case SC_BERSERK: /* バ?サ?ク */ calc_flag = 1; - clif_status_change(bl,SC_INCREASEAGI,0); /* アイコン消去 */ + clif_status_change(bl,SC_INCREASEAGI,0); /* アイコン消去 */ break; case SC_DEVOTION: /* ディボ?ション */ { @@ -8900,14 +8958,32 @@ int skill_status_change_end(struct block_list* bl, int type, int tid) case SC_CONFUSION: { struct map_session_data *sd=NULL; - if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){ + if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){ sd->next_walktime = -1; } } break; - } - if(bl->type==BL_PC && type 0 && + (sc_data = battle_get_sc_data(pbl)) && + sc_data[type2].timer != -1) + skill_status_change_end(pbl, type2, -1); + } + calc_flag = 1; + } + break; + } + + if(bl->type==BL_PC && + (type 0) { sc_data[type].timer = add_timer( 500 + tick, skill_status_change_timer, @@ -9437,7 +9513,7 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) 1000 + tick, skill_status_change_timer, bl->id, data); return 0; - } + } } break; @@ -9451,7 +9527,7 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) bl->id, data); } break;*/ - + // Celest case SC_CONFUSION: { @@ -9475,7 +9551,159 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) } } break; - } + + case SC_GOSPEL: + { + int calc_flag = 0; + if (sc_data[type].val3 > 0) { + sc_data[type].val3 = 0; + calc_flag = 1; + } + if(sd && sc_data[type].val4 == BCT_SELF){ + int hp, sp; + hp = (sc_data[type].val1 > 5) ? 45 : 30; + sp = (sc_data[type].val1 > 5) ? 35 : 20; + if(sd->status.hp - hp > 0 && + sd->status.sp - sp > 0){ + sd->status.hp -= hp; + sd->status.sp -= sp; + clif_updatestatus(sd,SP_HP); + clif_updatestatus(sd,SP_SP); + if ((sc_data[type].val2 -= 10000) > 0) { + sc_data[type].timer = add_timer( + 10000+tick, skill_status_change_timer, + bl->id, data); + return 0; + } + } + } else if (sd && sc_data[type].val4 == BCT_PARTY) { + int i; + switch ((i = rand() % 12)) { + case 1: // heal between 100-1000 + { + struct block_list tbl; + int heal = rand() % 900 + 100; + tbl.id = 0; + tbl.m = bl->m; + tbl.x = bl->x; + tbl.y = bl->y; + clif_skill_nodamage(&tbl,bl,AL_HEAL,heal,1); + battle_heal(NULL,bl,heal,0,0); + } + break; + case 2: // end negative status + { + int j; + for (j=0; j<4; j++) + if(sc_data[i + SC_POISON].timer!=-1) { + skill_status_change_end(bl,j,-1); + break; + } + } + break; + case 3: // +25% resistance to negative status + case 4: // +25% max hp + case 5: // +25% max sp + case 6: // +2 to all stats + case 11: // +25% armor and vit def + case 12: // +8% atk + case 13: // +5% flee + case 14: // +5% hit + sc_data[type].val3 = i; + if (i == 6 || + (i >= 11 && i <= 14)) + calc_flag = 1; + break; + case 7: // level 5 bless + { + struct block_list tbl; + tbl.id = 0; + tbl.m = bl->m; + tbl.x = bl->x; + tbl.y = bl->y; + clif_skill_nodamage(&tbl,bl,AL_BLESSING,5,1); + skill_status_change_start(bl,SkillStatusChangeTable[AL_BLESSING],5,0,0,0,10000,0 ); + } + break; + case 8: // level 5 increase agility + { + struct block_list tbl; + tbl.id = 0; + tbl.m = bl->m; + tbl.x = bl->x; + tbl.y = bl->y; + clif_skill_nodamage(&tbl,bl,AL_INCAGI,5,1); + skill_status_change_start(bl,SkillStatusChangeTable[AL_INCAGI],5,0,0,0,10000,0 ); + } + break; + case 9: // holy element to weapon + { + struct block_list tbl; + tbl.id = 0; + tbl.m = bl->m; + tbl.x = bl->x; + tbl.y = bl->y; + clif_skill_nodamage(&tbl,bl,PR_ASPERSIO,1,1); + skill_status_change_start(bl,SkillStatusChangeTable[PR_ASPERSIO],1,0,0,0,10000,0 ); + } + break; + case 10: // holy element to armour + { + struct block_list tbl; + tbl.id = 0; + tbl.m = bl->m; + tbl.x = bl->x; + tbl.y = bl->y; + clif_skill_nodamage(&tbl,bl,PR_BENEDICTIO,1,1); + skill_status_change_start(bl,SkillStatusChangeTable[PR_BENEDICTIO],1,0,0,0,10000,0 ); + } + break; + default: + break; + } + } else if (sc_data[type].val4 == BCT_ENEMY) { + int i; + switch ((i = rand() % 8)) { + case 1: // damage between 300-800 + case 2: // damage between 150-550 (ignore def) + battle_damage(NULL, bl, rand() % 500,0); // temporary damage + break; + case 3: // random status effect + { + int effect[3] = { + SC_CURSE, + SC_BLIND, + SC_POISON }; + skill_status_change_start(bl,effect[rand()%3],1,0,0,0,10000,0 ); + } + break; + case 4: // level 10 provoke + { + struct block_list tbl; + tbl.id = 0; + tbl.m = bl->m; + tbl.x = bl->x; + tbl.y = bl->y; + clif_skill_nodamage(&tbl,bl,SM_PROVOKE,1,1); + skill_status_change_start(bl,SkillStatusChangeTable[SM_PROVOKE],10,0,0,0,10000,0 ); + } + break; + case 5: // 0 def + case 6: // 0 atk + case 7: // 0 flee + case 8: // -75% move speed and aspd + sc_data[type].val3 = i; + calc_flag = 1; + break; + default: + break; + } + } + if (sd && calc_flag) + pc_calcstatus (sd, 0); + } + break; + } return skill_status_change_end( bl,type,tid ); } @@ -9510,7 +9738,7 @@ int skill_encchant_eremental_end(struct block_list *bl,int type) * ステ?タス異常開始 *------------------------------------------ */ -int skill_status_change_start(struct block_list *bl, int type, int val1, int val2, int val3, int val4, int tick, int flag) +int skill_status_change_start(struct block_list *bl, int type, int val1, int val2, int val3, int val4, int tick, int flag) { struct map_session_data *sd = NULL; struct status_change* sc_data; @@ -9660,7 +9888,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val break; case SC_DECREASEAGI: /* 速度減少 */ if (bl->type == BL_PC) // Celest - tick>>=1; + tick>>=1; calc_flag = 1; if(sc_data[SC_INCREASEAGI].timer!=-1 ) skill_status_change_end(bl,SC_INCREASEAGI,-1); @@ -9718,7 +9946,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val calc_flag = 1; break; case SC_POISONREACT: /* ポイズンリアクト */ - val2=val1/2 + val1%2; // [Celest] + val2=val1/2 + val1%2; // [Celest] break; case SC_IMPOSITIO: /* インポシティオマヌス */ calc_flag = 1; @@ -9756,7 +9984,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val case SC_TRICKDEAD: /* 死んだふり */ if (bl->type == BL_PC) { pc_stopattack((struct map_session_data *)sd); - } + } break; case SC_QUAGMIRE: /* クァグマイア */ calc_flag = 1; @@ -9814,7 +10042,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val case SC_STRIPSHIELD: if (val2==0) val2=85; break; - case SC_STRIPARMOR: + case SC_STRIPARMOR: case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: @@ -9970,7 +10198,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val case SC_WEDDING: //結婚用(結婚衣裳になって?くのが?いとか) { time_t timer; - + calc_flag = 1; tick = 10000; if(!val2) @@ -9983,7 +10211,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val if(!battle_config.muting_players) break; - + tick = 60000; if(!val2) val2 = time(&timer); @@ -10243,6 +10471,30 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val case SC_BASILICA: // [celest] break; + case SC_GOSPEL: + if (val4 == BCT_SELF) { // self effect + int i; + if (sd) { + sd->canact_tick += tick; + sd->canmove_tick += tick; + } + val2 = tick; + tick = 1000; + for (i=0; i<=26; i++) { + if(sc_data[i].timer!=-1) + skill_status_change_end(bl,i,-1); + } + for (i=58; i<=62; i++) { + if(sc_data[i].timer!=-1) + skill_status_change_end(bl,i,-1); + } + for (i=132; i<=136; i++) { + if(sc_data[i].timer!=-1) + skill_status_change_end(bl,i,-1); + } + } + break; + case SC_MARIONETTE: /* マリオネットコントロ?ル */ case SC_MARIONETTE2: val2 = tick; @@ -10284,6 +10536,9 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val // calc_flag = 1; // not sure of effects yet [celest] break; + case SC_PRESERVE: + break; + case SC_BLOCKSKILL: if (!tick) tick = 60000; if (!val3) val3 = -1; @@ -10307,7 +10562,8 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val return 0; } - if(bl->type==BL_PC && typetype==BL_PC && + (typevalstr=NULL; } - map_freeblock(group->unit); /* free()の替わり */ + map_freeblock(group->unit); /* aFree()の替わり */ group->unit=NULL; group->src_id=0; group->group_id=0; @@ -11243,9 +11491,9 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int int i,j, *r_flag, *s_flag, *m_flag; struct skill_unit *unit1; struct skill_unit *unit2; - r_flag = (int *) aMalloc(sizeof(int) * group->unit_count); - s_flag = (int *) aMalloc(sizeof(int) * group->unit_count); - m_flag = (int *) aMalloc(sizeof(int) * group->unit_count); + r_flag = (int *) aMallocA(sizeof(int) * group->unit_count); + s_flag = (int *) aMallocA(sizeof(int) * group->unit_count); + m_flag = (int *) aMallocA(sizeof(int) * group->unit_count); memset(r_flag,0, sizeof(int) * group->unit_count);// ?承フラグ memset(s_flag,0, sizeof(int) * group->unit_count);// ?承フラグ memset(m_flag,0, sizeof(int) * group->unit_count);// ?承フラグ @@ -11316,9 +11564,9 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int } } } - free(r_flag); - free(s_flag); - free(m_flag); + aFree(r_flag); + aFree(s_flag); + aFree(m_flag); } } return 0; @@ -11470,7 +11718,7 @@ int skill_produce_mix( struct map_session_data *sd, else make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300; } else if (skill_produce_db[idx].req_skill == ASC_CDP) { - make_per = 2000 + 40*sd->paramc[4] + 20*sd->paramc[5]; + make_per = 2000 + 40*sd->paramc[4] + 20*sd->paramc[5]; //make_per = 20 + (20*sd->paramc[4])/50 + (20*sd->paramc[5])/100; } else { if(nameid == 998) @@ -11493,7 +11741,7 @@ int skill_produce_mix( struct map_session_data *sd, if(make_per < 1) make_per = 1; - if(skill_produce_db[idx].req_skill==AM_PHARMACY || + if(skill_produce_db[idx].req_skill==AM_PHARMACY || skill_produce_db[idx].req_skill==ASC_CDP) { if( battle_config.pp_rate!=100 ) make_per=make_per*battle_config.pp_rate/100; @@ -12059,7 +12307,7 @@ int skill_readdb(void) i -= 9500; else if(i<=0 || i>MAX_SKILL_DB) continue; - + memset(split2,0,sizeof(split2)); for(j=0,p=split[1];j blank) + new_++; + if (new_ > blank) return; // 種類数超過 break; case ADDITEM_OVERAMOUNT: diff --git a/src/txt-converter/char/char-converter.c b/src/txt-converter/char/char-converter.c index 7b35fda63..1c5028d7e 100644 --- a/src/txt-converter/char/char-converter.c +++ b/src/txt-converter/char/char-converter.c @@ -16,16 +16,16 @@ #define STORAGE_MEMINC 16 - + #include "char.h" #include "../../common/strlib.h" #ifdef MEMWATCH #include "memwatch.h" #endif - + char pet_txt[256]="save/pet.txt"; -char storage_txt[256]="save/storage.txt"; +char storage_txt[256]="save/storage.txt"; MYSQL mysql_handle; MYSQL_RES* sql_res ; @@ -89,18 +89,18 @@ int inter_pet_fromstr(char *str, struct s_pet *p) int s; int tmp_int[16]; char tmp_str[256]; - + memset(p, 0, sizeof(struct s_pet)); - + // printf("sscanf pet main info\n"); s=sscanf(str,"%d, %d,%[^\t]\t%d, %d, %d, %d, %d, %d, %d, %d, %d", &tmp_int[0], &tmp_int[1], tmp_str, &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10]); if(s!=12) return 1; - + p->pet_id = tmp_int[0]; - p->class = tmp_int[1]; + p->class_ = tmp_int[1]; memcpy(p->name, tmp_str, 24); p->account_id = tmp_int[2]; p->char_id = tmp_int[3]; @@ -126,11 +126,11 @@ int inter_pet_fromstr(char *str, struct s_pet *p) //--------------------------------------------------------- int inter_pet_tosql(int pet_id, struct s_pet *p) { //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) - + char tmp_sql[65535]; MYSQL_RES* sql_res ; MYSQL_ROW sql_row ; - + jstrescapecpy (t_name, p->name); if(p->hungry < 0) p->hungry = 0; @@ -148,19 +148,19 @@ int inter_pet_tosql(int pet_id, struct s_pet *p) { sql_row = mysql_fetch_row(sql_res); //row fetching if (!sql_row) //no row -> insert sprintf(tmp_sql,"INSERT INTO `pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - p->pet_id, p->class, t_name, p->account_id, p->char_id, p->level, p->egg_id, + p->pet_id, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id, p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate); else //row reside -> updating sprintf(tmp_sql, "UPDATE `pet` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'", - p->class, t_name, p->account_id, p->char_id, p->level, p->egg_id, + p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id, p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id); mysql_free_result(sql_res) ; //resource free if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } - + printf ("pet dump success! - %d:%s\n", pet_id, p->name); - + return 0; } @@ -168,22 +168,22 @@ int storage_tosql(int account_id,struct storage *p){ // id -> DB dump // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} int i,j; - + j=0; - + //printf ("starting storage dump to DB - id: %d\n", account_id); - + //delete old data. sprintf(tmp_sql,"DELETE FROM `storage` WHERE `account_id`='%d'",account_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } - + //printf ("all storage item was deleted ok\n"); - + for(i=0;istorage[i].nameid , p->storage[i].amount); - + if( (p->storage[i].nameid) && (p->storage[i].amount) ){ sprintf(tmp_sql,"INSERT INTO `storage` (`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", p->account_id, p->storage[i].nameid, p->storage[i].amount, p->storage[i].equip, @@ -212,7 +212,7 @@ int storage_fromstr(char *str, struct storage *p) if(set!=2) return 0; if(str[next]=='\n' || str[next]=='\r') - return 1; + return 1; next++; for(i=0;str[next] && str[next]!='\t';i++){ if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", @@ -233,7 +233,7 @@ int storage_fromstr(char *str, struct storage *p) p->storage[i].broken = tmp_int[11]; next += len; if (str[next] == ' ') - next++; + next++; } else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", @@ -251,12 +251,12 @@ int storage_fromstr(char *str, struct storage *p) p->storage[i].card[1] = tmp_int[8]; p->storage[i].card[2] = tmp_int[9]; p->storage[i].card[3] = tmp_int[10]; - p->storage[i].broken = 0; + p->storage[i].broken = 0; next += len; if (str[next] == ' ') - next++; + next++; } - + else return 0; } return 1; @@ -337,7 +337,7 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p) { p->char_id = tmp_int[0]; p->account_id = tmp_int[1]; p->char_num = tmp_int[2]; - p->class = tmp_int[3]; + p->class_ = tmp_int[3]; p->base_level = tmp_int[4]; p->job_level = tmp_int[5]; p->base_exp = tmp_int[6]; @@ -508,10 +508,10 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p) { //========================================================================================================== int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ int i,save_flag; - + save_flag = char_id; printf("request save char data... (%d)\n",char_id); - + //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9 //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15 //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21 @@ -525,7 +525,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d'," "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `partner_id` = '%d'", - char_id,p->account_id,p->char_num,p->name,p->class, p->base_level, p->job_level, + char_id,p->account_id,p->char_num,p->name,p->class_, p->base_level, p->job_level, p->base_exp, p->job_exp, p->zeny, p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point, p->str, p->agi, p->vit, p->int_, p->dex, p->luk, @@ -535,17 +535,17 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ p->last_point.map, p->last_point.x, p->last_point.y, p->save_point.map, p->save_point.x, p->save_point.y, p->partner_id ); - + if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); } - + //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) sprintf(tmp_sql,"DELETE FROM `memo` WHERE `char_id`='%d'",char_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle) ); } - + //insert here. for(i=0;i<10;i++){ if(p->memo_point[i].map[0]){ @@ -560,7 +560,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `inventory`)- %s\n", mysql_error(&mysql_handle) ); } - + //insert here. for(i=0;iinventory[i].nameid){ @@ -579,7 +579,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `cart_inventory`)- %s\n", mysql_error(&mysql_handle) ); } - + //insert here. for(i=0;icart[i].nameid){ @@ -593,14 +593,14 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ } } } - - + + //`skill` (`char_id`, `id`, `lv`) sprintf(tmp_sql,"DELETE FROM `skill` WHERE `char_id`='%d'",char_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle) ); } - + //insert here. for(i=0;iskill[i].id){ @@ -618,7 +618,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); } - + //insert here. for(i=0;iglobal_reg_num;i++){ if(p->global_reg[i].value !=0){ @@ -629,10 +629,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ } } } - + printf("saving char is done... (%d)\n",char_id); save_flag = 0; - + return 0; } //========================================================================================================== @@ -645,7 +645,7 @@ int mmo_char_init(void){ char input; FILE *fp; - + //DB connection initialized mysql_init(&mysql_handle); printf("Connect DB server.... (inter server)\n"); @@ -658,7 +658,7 @@ int mmo_char_init(void){ else { printf ("connect success! (inter server)\n"); } - + printf("Warning : Make sure you backup your databases before continuing!\n"); @@ -667,14 +667,14 @@ int mmo_char_init(void){ if(input == 'y' || input == 'Y'){ printf("\nConverting Character Database...\n"); fp=fopen("save/athena.txt","r"); - char_dat=malloc(sizeof(char_dat[0])*256); + char_dat = (struct mmo_charstatus*)malloc(sizeof(char_dat[0])*256); char_max=256; if(fp==NULL) return 0; while(fgets(line, 65535, fp)){ if(char_num>=char_max){ char_max+=256; - char_dat=realloc(char_dat, sizeof(char_dat[0]) *char_max); + char_dat = (struct mmo_charstatus*)realloc(char_dat, sizeof(char_dat[0]) *char_max); } memset(&char_dat[char_num], 0, sizeof(char_dat[0])); ret=mmo_char_fromstr(line, &char_dat[char_num]); @@ -689,8 +689,8 @@ int mmo_char_init(void){ printf("char data convert end\n"); fclose(fp); } - - while(getchar() != '\n'); + + while(getchar() != '\n'); printf("\nDo you wish to convert your Storage Database to SQL? (y/n) : "); input=getchar(); if(input == 'y' || input == 'Y') { @@ -700,14 +700,14 @@ int mmo_char_init(void){ printf("cant't read : %s\n",storage_txt); return 0; } - + while(fgets(line,65535,fp)){ set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]); if(set==2) { if(i==0){ - storage=malloc(sizeof(struct storage)); + storage = (struct storage*)malloc(sizeof(struct storage)); }else{ - storage=realloc(storage,sizeof(struct storage)*(i+1)); + storage = (struct storage*)realloc(storage,sizeof(struct storage)*(i+1)); } memset(&storage[i],0,sizeof(struct storage)); storage[i].account_id=tmp_int[0]; @@ -718,7 +718,7 @@ int mmo_char_init(void){ } fclose(fp); } - + while(getchar() != '\n'); printf("\nDo you wish to convert your Pet Database to SQL? (y/n) : "); input=getchar(); @@ -726,8 +726,8 @@ int mmo_char_init(void){ printf("\nConverting Pet Database...\n"); if( (fp=fopen(pet_txt,"r")) ==NULL ) return 1; - - p=malloc(sizeof(struct s_pet)); + + p = (struct s_pet*)malloc(sizeof(struct s_pet)); while(fgets(line, sizeof(line), fp)){ if(p==NULL){ printf("int_pet: out of memory!\n"); @@ -792,7 +792,7 @@ int inter_config_read(const char *cfgName) { } } fclose(fp); - + printf("Reading interserver configuration: Done\n"); return 0; @@ -825,7 +825,7 @@ int char_config_read(const char *cfgName) { } fclose(fp); printf("Reading configuration: Done\n"); - + return 0; } diff --git a/src/txt-converter/char/char.h b/src/txt-converter/char/char.h index b5864b31c..e1d5c90dc 100644 --- a/src/txt-converter/char/char.h +++ b/src/txt-converter/char/char.h @@ -24,9 +24,9 @@ struct mmo_map_server{ char map[MAX_MAP_PER_SERVER][16]; }; -int mapif_sendall(unsigned char *buf,unsigned int len); -int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len); -int mapif_send(int fd,unsigned char *buf,unsigned int len); +int mapif_sendall(char *buf,unsigned int len); +int mapif_sendallwos(int fd,char *buf,unsigned int len); +int mapif_send(int fd,char *buf,unsigned int len); extern int autosave_interval; diff --git a/src/txt-converter/common/mmo.h b/src/txt-converter/common/mmo.h index eb02b6879..e8ef2b987 100644 --- a/src/txt-converter/common/mmo.h +++ b/src/txt-converter/common/mmo.h @@ -87,7 +87,7 @@ struct s_pet { int account_id; int char_id; int pet_id; - short class; + short class_; short level; short egg_id;//pet egg id short equip;//pet equip name_id @@ -105,7 +105,7 @@ struct mmo_charstatus { int base_exp,job_exp,zeny; - short class; + short class_; short status_point,skill_point; int hp,max_hp,sp,max_sp; short option,karma,manner; @@ -168,7 +168,7 @@ struct party { struct guild_member { int account_id, char_id; - short hair,hair_color,gender,class,lv; + short hair,hair_color,gender,class_,lv; int exp,exp_payper; short online,position; int rsv1,rsv2; @@ -237,8 +237,8 @@ struct guild_castle { int Ghp4; int Ghp5; int Ghp6; - int Ghp7; - int GID0; + int Ghp7; + int GID0; int GID1; int GID2; int GID3; diff --git a/src/txt-converter/login/login-converter.c b/src/txt-converter/login/login-converter.c index a277ca949..f452d70aa 100644 --- a/src/txt-converter/login/login-converter.c +++ b/src/txt-converter/login/login-converter.c @@ -40,7 +40,7 @@ struct { int sex,delflag; } auth_fifo[AUTH_FIFO_SIZE]; int auth_fifo_pos=0; -struct { +struct auth_dat_ { int account_id, sex; char userid[24], pass[24], lastlogin[24]; int logincount; @@ -72,7 +72,7 @@ char db_server_logindb[32] = "ragnarok"; int isGM(int account_id) { struct gm_account *p; - p = numdb_search(gm_account_db,account_id); + p = (struct gm_account*)numdb_search(gm_account_db,account_id); if( p == NULL) return 0; return p->level; @@ -95,7 +95,7 @@ int read_gm_account() if(line[0] == '/' || line[1] == '/' || line[2] == '/') continue; - p=malloc(sizeof(struct gm_account)); + p = (struct gm_account*)malloc(sizeof(struct gm_account)); if(p==NULL){ printf("gm_account: out of memory!\n"); exit(0); @@ -145,7 +145,7 @@ int mmo_auth_init(void) fp=fopen("save/account.txt","r"); - auth_dat=malloc(sizeof(auth_dat[0])*256); + auth_dat = (struct auth_dat_*)malloc(sizeof(auth_dat[0])*256); auth_max=256; if(fp==NULL) return 0; -- cgit v1.2.3-70-g09d2 From 817a048b554ed05fda836a9b55e0dc9a816334b7 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@54d463be-8e91-2dee-dedb-b68131a5f0ec> Date: Mon, 24 Jan 2005 03:12:42 +0000 Subject: A lot of changes. login and char server compile under both TXT and SQL under g++. Same for the convertors (login and char). One change that I felt iffy about, but it worked, was the char* buf -> unsinged char* bug in clif.c git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@975 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog.txt | 2 + src/char/char.c | 28 +++--- src/char/int_guild.c | 14 +-- src/char/int_party.c | 12 +-- src/char/int_pet.c | 18 ++-- src/char/int_storage.c | 20 ++-- src/char/inter.c | 18 ++-- src/char_sql/char.c | 4 +- src/char_sql/int_guild.c | 36 +++---- src/char_sql/int_party.c | 166 ++++++++++++++++---------------- src/char_sql/int_pet.c | 54 +++++------ src/char_sql/int_storage.c | 34 +++---- src/char_sql/inter.c | 50 +++++----- src/char_sql/itemdb.c | 8 +- src/common/grfio.c | 4 +- src/common/malloc.c | 8 +- src/common/strlib.c | 4 +- src/ladmin/md5calc.c | 6 +- src/login/login.c | 98 +++++++++---------- src/login/md5calc.c | 6 +- src/login_sql/md5calc.c | 6 +- src/map/clif.c | 235 +++++++++++++++++++++++---------------------- 22 files changed, 417 insertions(+), 414 deletions(-) (limited to 'src/common/malloc.c') diff --git a/Changelog.txt b/Changelog.txt index 02ef7b0b3..9d51367f1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ Date Added 01/23 + * char-server (SQL & TXT), login-server (SQL & TXT), and txt-coonvertors + (char and login) all compile on g++ now [svn 975] [Ajarn] * Fixed the sizeof errors in g++ [SVN 972] [Ajarn] * Reverted back some of the char* changes [SVN 972] [Ajarn] * Changed parse_script to now return char* [SVN 969] [Ajarn] diff --git a/src/char/char.c b/src/char/char.c index fb154c51c..d851ea854 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -853,14 +853,14 @@ int make_new_char(int fd, unsigned char *dat) { // remove control characters from the name dat[23] = '\0'; - if (remove_control_chars(dat)) { + if (remove_control_chars((char*)dat)) { char_log("Make new char error (control char received in the name): (connection #%d, account: %d)." RETCODE, fd, sd->account_id); return -1; } // check lenght of character name - if (strlen(dat) < 4) { + if (strlen((const char*)dat) < 4) { char_log("Make new char error (character name too small): (connection #%d, account: %d, name: '%s')." RETCODE, fd, sd->account_id, dat); return -1; @@ -902,8 +902,8 @@ int make_new_char(int fd, unsigned char *dat) { } for(i = 0; i < char_num; i++) { - if ((name_ignoring_case != 0 && strcmp(char_dat[i].name, dat) == 0) || - (name_ignoring_case == 0 && strcmpi(char_dat[i].name, dat) == 0)) { + if ((name_ignoring_case != 0 && strcmp(char_dat[i].name, (const char*)dat) == 0) || + (name_ignoring_case == 0 && strcmpi(char_dat[i].name, (const char*)dat) == 0)) { char_log("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE, fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); return -1; @@ -915,7 +915,7 @@ int make_new_char(int fd, unsigned char *dat) { } } - if (strcmp(wisp_server_name, dat) == 0) { + if (strcmp(wisp_server_name, (const char*)dat) == 0) { char_log("Make new char error (name used is wisp name for server): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE, fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); return -1; @@ -949,7 +949,7 @@ int make_new_char(int fd, unsigned char *dat) { char_dat[i].char_id = char_id_count++; char_dat[i].account_id = sd->account_id; char_dat[i].char_num = dat[30]; - strcpy(char_dat[i].name, dat); + strcpy(char_dat[i].name, (const char*)dat); char_dat[i].class_ = 0; char_dat[i].base_level = 1; char_dat[i].job_level = 1; @@ -1507,9 +1507,9 @@ int char_divorce(struct mmo_charstatus *cs) { //------------------------------------------------------------ // E-mail check: return 0 (not correct) or 1 (valid). by [Yor] //------------------------------------------------------------ -int e_mail_check(unsigned char *email) { +int e_mail_check(char *email) { char ch; - unsigned char* last_arobas; + char* last_arobas; // athena limits if (strlen(email) < 3 || strlen(email) > 39) @@ -1585,7 +1585,7 @@ static int char_delete(struct mmo_charstatus *cs) { // 離婚 if (cs->partner_id){ // 離婚情報をmapに通知 - char buf[10]; + unsigned char buf[10]; WBUFW(buf,0) = 0x2b12; WBUFL(buf,2) = cs->char_id; WBUFL(buf,6) = cs->partner_id; @@ -1798,7 +1798,7 @@ int parse_tologin(int fd) { if (i == MAX_MAP_SERVERS) char_log("'ladmin': Receiving a message for broadcast, but no map-server is online." RETCODE); else { - char buf[128]; + unsigned char buf[128]; char message[RFIFOL(fd,4) + 1]; // +1 to add a null terminated if not exist in the packet int lp; char *p; @@ -1946,7 +1946,7 @@ int parse_tologin(int fd) { if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) return 0; { - char buf[32000]; + unsigned char buf[32000]; if (gm_account != NULL) aFree(gm_account); gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1); @@ -2559,7 +2559,7 @@ int parse_char(int fd) { else printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2)); if (sd == NULL) { - sd = session[fd]->session_data = (struct char_session_data*)aCalloc(sizeof(struct char_session_data), 1); + sd = (struct char_session_data*)session[fd]->session_data = (struct char_session_data*)aCalloc(sizeof(struct char_session_data), 1); memset(sd, 0, sizeof(struct char_session_data)); memcpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server) @@ -2881,7 +2881,7 @@ int parse_char(int fd) { if (server_fd[i] < 0) break; } - if (i == MAX_MAP_SERVERS || strcmp(RFIFOP(fd,2), userid) || strcmp(RFIFOP(fd,26), passwd)){ + if (i == MAX_MAP_SERVERS || strcmp((char*)RFIFOP(fd,2), userid) || strcmp((char*)RFIFOP(fd,26), passwd)){ WFIFOB(fd,2) = 3; WFIFOSET(fd,3); RFIFOSKIP(fd,60); @@ -3019,7 +3019,7 @@ int mapif_send(int fd, unsigned char *buf, unsigned int len) { int send_users_tologin(int tid, unsigned int tick, int id, int data) { int users = count_users(); - char buf[16]; + unsigned char buf[16]; if (login_fd > 0 && session[login_fd]) { // send number of user to login server diff --git a/src/char/int_guild.c b/src/char/int_guild.c index 348008e1d..b95817599 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -1419,21 +1419,21 @@ int mapif_parse_GuildCheck(int fd, int guild_id, int account_id, int char_id) { // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない int inter_guild_parse_frommap(int fd) { switch(RFIFOW(fd,0)) { - case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), RFIFOP(fd,8), (struct guild_member *)RFIFOP(fd,32)); break; + case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), (char*)RFIFOP(fd,8), (struct guild_member *)RFIFOP(fd,32)); break; case 0x3031: mapif_parse_GuildInfo(fd, RFIFOL(fd,2)); break; case 0x3032: mapif_parse_GuildAddMember(fd, RFIFOL(fd,4), (struct guild_member *)RFIFOP(fd,8)); break; - case 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), RFIFOP(fd,15)); break; + case 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), (const char*)RFIFOP(fd,15)); break; case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), RFIFOW(fd,15), RFIFOW(fd,17)); break; case 0x3036: mapif_parse_BreakGuild(fd, RFIFOL(fd,2)); break; - case 0x3037: mapif_parse_GuildMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); break; + case 0x3037: mapif_parse_GuildMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break; case 0x3038: mapif_parse_GuildCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break; - case 0x3039: mapif_parse_GuildBasicInfoChange(fd, RFIFOL(fd,4), RFIFOW(fd,8), RFIFOP(fd,10), RFIFOW(fd,2)-10); break; - case 0x303A: mapif_parse_GuildMemberInfoChange(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOL(fd,12), RFIFOW(fd,16), RFIFOP(fd,18), RFIFOW(fd,2)-18); break; + case 0x3039: mapif_parse_GuildBasicInfoChange(fd, RFIFOL(fd,4), RFIFOW(fd,8), (const char*)RFIFOP(fd,10), RFIFOW(fd,2)-10); break; + case 0x303A: mapif_parse_GuildMemberInfoChange(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOL(fd,12), RFIFOW(fd,16), (const char*)RFIFOP(fd,18), RFIFOW(fd,2)-18); break; case 0x303B: mapif_parse_GuildPosition(fd, RFIFOL(fd,4), RFIFOL(fd,8), (struct guild_position *)RFIFOP(fd,12)); break; case 0x303C: mapif_parse_GuildSkillUp(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break; case 0x303D: mapif_parse_GuildAlliance(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18)); break; - case 0x303E: mapif_parse_GuildNotice(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,66)); break; - case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12)); break; + case 0x303E: mapif_parse_GuildNotice(fd, RFIFOL(fd,2), (const char*)RFIFOP(fd,6), (const char*)RFIFOP(fd,66)); break; + case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), (const char*)RFIFOP(fd,12)); break; case 0x3040: mapif_parse_GuildCastleDataLoad(fd, RFIFOW(fd,2), RFIFOB(fd,4)); break; case 0x3041: mapif_parse_GuildCastleDataSave(fd, RFIFOW(fd,2), RFIFOB(fd,4), RFIFOL(fd,5)); break; diff --git a/src/char/int_party.c b/src/char/int_party.c index 6b7f4361e..c95d13620 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -94,7 +94,7 @@ int inter_party_init() { continue; } - p = aCalloc(sizeof(struct party), 1); + p = (struct party*)aCalloc(sizeof(struct party), 1); if (p == NULL){ printf("int_party: out of memory!\n"); exit(0); @@ -572,15 +572,15 @@ int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) { // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない int inter_party_parse_frommap(int fd) { switch(RFIFOW(fd,0)) { - case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,30), RFIFOP(fd,54), RFIFOW(fd,70)); break; + case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), (char*)RFIFOP(fd,6), (char*)RFIFOP(fd,30), (char*)RFIFOP(fd,54), RFIFOW(fd,70)); break; case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break; - case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOP(fd,34), RFIFOW(fd,50)); break; + case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10), (char*)RFIFOP(fd,34), RFIFOW(fd,50)); break; case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break; case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6)); break; - case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break; + case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break; case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break; - case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); break; - case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10)); break; + case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break; + case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10)); break; default: return 0; } diff --git a/src/char/int_pet.c b/src/char/int_pet.c index 0dd334514..f690e554e 100644 --- a/src/char/int_pet.c +++ b/src/char/int_pet.c @@ -41,16 +41,16 @@ int inter_pet_fromstr(char *str,struct s_pet *p) int s; int tmp_int[16]; char tmp_str[256]; - + memset(p,0,sizeof(struct s_pet)); - + // printf("sscanf pet main info\n"); s=sscanf(str,"%d,%d,%[^\t]\t%d,%d,%d,%d,%d,%d,%d,%d,%d",&tmp_int[0],&tmp_int[1],tmp_str,&tmp_int[2], &tmp_int[3],&tmp_int[4],&tmp_int[5],&tmp_int[6],&tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10]); if(s!=12) return 1; - + p->pet_id = tmp_int[0]; p->class_ = tmp_int[1]; memcpy(p->name,tmp_str,24); @@ -88,7 +88,7 @@ int inter_pet_init() if( (fp=fopen(pet_txt,"r"))==NULL ) return 1; while(fgets(line,sizeof(line),fp)){ - p=aCalloc(sizeof(struct s_pet), 1); + p = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1); if(p==NULL){ printf("int_pet: out of memory!\n"); exit(0); @@ -242,11 +242,11 @@ int mapif_create_pet(int fd,int account_id,int char_id,short pet_class,short pet p->intimate = 0; else if(p->intimate > 1000) p->intimate = 1000; - + numdb_insert(pet_db,p->pet_id,p); - + mapif_pet_created(fd,account_id,p); - + return 0; } @@ -292,7 +292,7 @@ int mapif_save_pet(int fd,int account_id,struct s_pet *data) p->pet_id = data->pet_id; if(p->pet_id == 0) data->pet_id = p->pet_id = pet_newid++; - numdb_insert(pet_db,p->pet_id,p); + numdb_insert(pet_db,p->pet_id,p); } if(data->hungry < 0) data->hungry = 0; @@ -322,7 +322,7 @@ int mapif_delete_pet(int fd,int pet_id) int mapif_parse_CreatePet(int fd) { mapif_create_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOW(fd,14),RFIFOW(fd,16),RFIFOL(fd,18), - RFIFOL(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),RFIFOP(fd,24)); + RFIFOL(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),(char*)RFIFOP(fd,24)); return 0; } diff --git a/src/char/int_storage.c b/src/char/int_storage.c index 73d50f323..8e4711cec 100644 --- a/src/char/int_storage.c +++ b/src/char/int_storage.c @@ -56,7 +56,7 @@ int storage_fromstr(char *str,struct storage *p) if(set!=2) return 1; if(str[next]=='\n' || str[next]=='\r') - return 0; + return 0; next++; for(i=0;str[next] && str[next]!='\t';i++){ if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", @@ -76,7 +76,7 @@ int storage_fromstr(char *str,struct storage *p) p->storage[i].card[3] = tmp_int[10]; next += len; if (str[next] == ' ') - next++; + next++; } else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", @@ -96,9 +96,9 @@ int storage_fromstr(char *str,struct storage *p) p->storage[i].card[3] = tmp_int[10]; next += len; if (str[next] == ' ') - next++; + next++; } - + else return 1; } return 0; @@ -138,7 +138,7 @@ int guild_storage_fromstr(char *str,struct guild_storage *p) if(set!=2) return 1; if(str[next]=='\n' || str[next]=='\r') - return 0; + return 0; next++; for(i=0;str[next] && str[next]!='\t';i++){ if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", @@ -158,7 +158,7 @@ int guild_storage_fromstr(char *str,struct guild_storage *p) p->storage[i].card[3] = tmp_int[10]; next += len; if (str[next] == ' ') - next++; + next++; } else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", @@ -178,9 +178,9 @@ int guild_storage_fromstr(char *str,struct guild_storage *p) p->storage[i].card[3] = tmp_int[10]; next += len; if (str[next] == ' ') - next++; + next++; } - + else return 1; } return 0; @@ -242,7 +242,7 @@ int inter_storage_init() } while(fgets(line,65535,fp)){ sscanf(line,"%d",&tmp_int); - s=aCalloc(sizeof(struct storage), 1); + s = (struct storage*)aCalloc(sizeof(struct storage), 1); if(s==NULL){ printf("int_storage: out of memory!\n"); exit(0); @@ -270,7 +270,7 @@ int inter_storage_init() } while(fgets(line,65535,fp)){ sscanf(line,"%d",&tmp_int); - gs=aCalloc(sizeof(struct guild_storage), 1); + gs = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1); if(gs==NULL){ printf("int_storage: out of memory!\n"); exit(0); diff --git a/src/char/inter.c b/src/char/inter.c index f0fe38f60..ac460d4c4 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -114,7 +114,7 @@ int inter_accreg_init() { while(fgets(line, sizeof(line)-1, fp)){ line[sizeof(line)-1] = '\0'; - reg = aCalloc(sizeof(struct accreg), 1); + reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1); if (reg == NULL) { printf("inter: accreg: out of memory!\n"); exit(0); @@ -325,7 +325,7 @@ int mapif_account_reg(int fd, unsigned char *src) { // アカウント変数要求返信 int mapif_account_reg_reply(int fd,int account_id) { - struct accreg *reg = numdb_search(accreg_db,account_id); + struct accreg *reg = (struct accreg*)numdb_search(accreg_db,account_id); WFIFOW(fd,0) = 0x3804; WFIFOL(fd,4) = account_id; @@ -366,7 +366,7 @@ int check_ttl_wisdata() { wis_delnum = 0; numdb_foreach(wis_db, check_ttl_wisdata_sub, tick); for(i = 0; i < wis_delnum; i++) { - struct WisData *wd = numdb_search(wis_db, wis_dellist[i]); + struct WisData *wd = (struct WisData*)numdb_search(wis_db, wis_dellist[i]); printf("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst); // removed. not send information after a timeout. Just no answer for the player //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target @@ -403,7 +403,7 @@ int mapif_parse_WisRequest(int fd) { } // search if character exists before to ask all map-servers - if ((index = search_character_index(RFIFOP(fd,28))) == -1) { + if ((index = search_character_index((char*)RFIFOP(fd,28))) == -1) { unsigned char buf[27]; WBUFW(buf, 0) = 0x3802; memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); @@ -413,9 +413,9 @@ int mapif_parse_WisRequest(int fd) { } else { // to be sure of the correct name, rewrite it memset(RFIFOP(fd,28), 0, 24); - strncpy(RFIFOP(fd,28), search_character_name(index), 24); + strncpy((char*)RFIFOP(fd,28), search_character_name(index), 24); // if source is destination, don't ask other servers. - if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) { + if (strcmp((char*)RFIFOP(fd,4),(char*)RFIFOP(fd,28)) == 0) { unsigned char buf[27]; WBUFW(buf, 0) = 0x3802; memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); @@ -450,7 +450,7 @@ int mapif_parse_WisRequest(int fd) { // Wisp/page transmission result int mapif_parse_WisReply(int fd) { int id = RFIFOL(fd,2), flag = RFIFOB(fd,6); - struct WisData *wd = numdb_search(wis_db, id); + struct WisData *wd = (struct WisData*)numdb_search(wis_db, id); if (wd == NULL) return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server @@ -478,10 +478,10 @@ int mapif_parse_WisToGM(int fd) { // アカウント変数保存要求 int mapif_parse_AccReg(int fd) { int j, p; - struct accreg *reg = numdb_search(accreg_db, RFIFOL(fd,4)); + struct accreg *reg = (struct accreg*)numdb_search(accreg_db, RFIFOL(fd,4)); if (reg == NULL) { - if ((reg = aCalloc(sizeof(struct accreg), 1)) == NULL) { + if ((reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1)) == NULL) { printf("inter: accreg: out of memory !\n"); exit(0); } diff --git a/src/char_sql/char.c b/src/char_sql/char.c index df3c40bda..e4ae162eb 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -2654,7 +2654,7 @@ int parse_char(int fd) { //Divorce [Wizputer] if (sql_row[1] != 0) { - char buf[64]; + unsigned char buf[64]; sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,atoi(sql_row[1])); if(mysql_query(&mysql_handle, tmp_sql)) { printf("DB server Error - %s\n", mysql_error(&mysql_handle)); @@ -2900,7 +2900,7 @@ int mapif_send(int fd, unsigned char *buf, unsigned int len) { int send_users_tologin(int tid, unsigned int tick, int id, int data) { int users = count_users(); - char buf[16]; + unsigned char buf[16]; if (login_fd > 0 && session[login_fd]) { // send number of user to login server diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c index e3b8d30a8..de6fc0ed0 100644 --- a/src/char_sql/int_guild.c +++ b/src/char_sql/int_guild.c @@ -329,11 +329,11 @@ struct guild * inter_guild_fromsql(int guild_id) if (guild_id==0) return 0; - g = numdb_search(guild_db_,guild_id); + g = (struct guild*)numdb_search(guild_db_,guild_id); if (g != NULL) return g; - g = (struct guild *) aMalloc(sizeof(struct guild)); + g = (struct guild*)aMalloc(sizeof(struct guild)); memset(g,0,sizeof(struct guild)); // printf("Retrieve guild information from sql ......\n"); @@ -527,9 +527,9 @@ int inter_guildcastle_tosql(struct guild_castle *gc) if (gc==NULL) return 0; //printf("Save to guild_castle\n"); - gcopy = numdb_search(castle_db_,gc->castle_id); + gcopy = (struct guild_castle*)numdb_search(castle_db_,gc->castle_id); if (gcopy == NULL) { - gcopy = (struct guild_castle *) aMalloc(sizeof(struct guild_castle)); + gcopy = (struct guild_castle*)aMalloc(sizeof(struct guild_castle)); numdb_insert(castle_db_, gc->castle_id, gcopy); } else { if ((gc->guild_id == gcopy->guild_id ) && ( gc->economy == gcopy->economy ) && ( gc->defense == gcopy->defense ) && ( gc->triggerE == gcopy->triggerE ) && ( gc->triggerD == gcopy->triggerD ) && ( gc->nextTime == gcopy->nextTime ) && ( gc->payTime == gcopy->payTime ) && ( gc->createTime == gcopy->createTime ) && ( gc->visibleC == gcopy->visibleC ) && ( gc->visibleG0 == gcopy->visibleG0 ) && ( gc->visibleG1 == gcopy->visibleG1 ) && ( gc->visibleG2 == gcopy->visibleG2 ) && ( gc->visibleG3 == gcopy->visibleG3 ) && ( gc->visibleG4 == gcopy->visibleG4 ) && ( gc->visibleG5 == gcopy->visibleG5 ) && ( gc->visibleG6 == gcopy->visibleG6 ) && ( gc->visibleG7 == gcopy->visibleG7 ) && ( gc->Ghp0 == gcopy->Ghp0 ) && ( gc->Ghp1 == gcopy->Ghp1 ) && ( gc->Ghp2 == gcopy->Ghp2 ) && ( gc->Ghp3 == gcopy->Ghp3 ) && ( gc->Ghp4 == gcopy->Ghp4 ) && ( gc->Ghp5 == gcopy->Ghp5 ) && ( gc->Ghp6 == gcopy->Ghp6 ) && ( gc->Ghp7 == gcopy->Ghp7 )) @@ -573,13 +573,13 @@ int inter_guildcastle_tosql(struct guild_castle *gc) // Read guild_castle from sql int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc) { - struct guild_castle *gcopy; + struct guild_castle *gcopy; if (gc==NULL) return 0; //printf("Read from guild_castle\n"); - gcopy = numdb_search(castle_db_, castle_id); + gcopy = (struct guild_castle*)numdb_search(castle_db_, castle_id); if (gcopy == NULL) { - gcopy = (struct guild_castle *) aMalloc(sizeof(struct guild_castle)); + gcopy = (struct guild_castle*)aMalloc(sizeof(struct guild_castle)); numdb_insert(castle_db_, gc->castle_id, gcopy); } else { memcpy(gc, gcopy, sizeof(struct guild_castle)); @@ -678,9 +678,9 @@ int inter_guild_sql_init() guild_castleinfoevent_db_=numdb_init(); printf("interserver guild memory initialize.... (%d byte)\n",sizeof(struct guild)); - guild_pt = aCalloc(sizeof(struct guild), 1); - guild_pt2= aCalloc(sizeof(struct guild), 1); - guildcastle_pt=aCalloc(sizeof(struct guild_castle), 1); + guild_pt = (struct guild*)aCalloc(sizeof(struct guild), 1); + guild_pt2= (struct guild*)aCalloc(sizeof(struct guild), 1); + guildcastle_pt = (struct guild_castle*)aCalloc(sizeof(struct guild_castle), 1); inter_guild_readdb(); // Read exp @@ -1094,7 +1094,7 @@ int mapif_guild_castle_alldataload(int fd) { gc->Ghp7 = atoi(sql_row[25]); memcpy(WFIFOP(fd,len), gc, sizeof(struct guild_castle)); - gcopy = numdb_search(castle_db_,gc->castle_id); + gcopy = (struct guild_castle*)numdb_search(castle_db_,gc->castle_id); if (gcopy == NULL) { gcopy = (struct guild_castle *) aMalloc(sizeof(struct guild_castle)); numdb_insert(castle_db_, gc->castle_id, gcopy); @@ -1671,21 +1671,21 @@ int mapif_parse_GuildCheck(int fd,int guild_id,int account_id,int char_id) int inter_guild_parse_frommap(int fd) { switch(RFIFOW(fd,0)){ - case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),RFIFOP(fd,8),(struct guild_member *)RFIFOP(fd,32)); break; + case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),(char*)RFIFOP(fd,8),(struct guild_member *)RFIFOP(fd,32)); break; case 0x3031: mapif_parse_GuildInfo(fd,RFIFOL(fd,2)); break; case 0x3032: mapif_parse_GuildAddMember(fd,RFIFOL(fd,4),(struct guild_member *)RFIFOP(fd,8)); break; - case 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOP(fd,15)); break; + case 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),(const char*)RFIFOP(fd,15)); break; case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17)); break; case 0x3036: mapif_parse_BreakGuild(fd,RFIFOL(fd,2)); break; - case 0x3037: mapif_parse_GuildMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break; + case 0x3037: mapif_parse_GuildMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),(char*)RFIFOP(fd,12),RFIFOW(fd,2)-12); break; case 0x3038: mapif_parse_GuildCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break; - case 0x3039: mapif_parse_GuildBasicInfoChange(fd,RFIFOL(fd,4),RFIFOW(fd,8),RFIFOP(fd,10),RFIFOW(fd,2)-10); break; - case 0x303A: mapif_parse_GuildMemberInfoChange(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOL(fd,12),RFIFOW(fd,16),RFIFOP(fd,18),RFIFOW(fd,2)-18); break; + case 0x3039: mapif_parse_GuildBasicInfoChange(fd,RFIFOL(fd,4),RFIFOW(fd,8),(const char*)RFIFOP(fd,10),RFIFOW(fd,2)-10); break; + case 0x303A: mapif_parse_GuildMemberInfoChange(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOL(fd,12),RFIFOW(fd,16),(const char*)RFIFOP(fd,18),RFIFOW(fd,2)-18); break; case 0x303B: mapif_parse_GuildPosition(fd,RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12)); break; case 0x303C: mapif_parse_GuildSkillUp(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break; case 0x303D: mapif_parse_GuildAlliance(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),RFIFOB(fd,18)); break; - case 0x303E: mapif_parse_GuildNotice(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66)); break; - case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12)); break; + case 0x303E: mapif_parse_GuildNotice(fd,RFIFOL(fd,2),(const char*)RFIFOP(fd,6),(const char*)RFIFOP(fd,66)); break; + case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),(const char*)RFIFOP(fd,12)); break; case 0x3040: mapif_parse_GuildCastleDataLoad(fd,RFIFOW(fd,2),RFIFOB(fd,4)); break; case 0x3041: mapif_parse_GuildCastleDataSave(fd,RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); break; diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c index 9ea3a5635..b8a4a1160 100644 --- a/src/char_sql/int_party.c +++ b/src/char_sql/int_party.c @@ -8,7 +8,7 @@ #include #include "char.h" #include "../common/strlib.h" -#include "socket.h" +#include "socket.h" static struct party *party_pt; static int party_newid=100; @@ -23,24 +23,24 @@ int mapif_parse_PartyLeave(int fd,int party_id,int account_id); int inter_party_tosql(int party_id,struct party *p) { // 'party' ('party_id','name','exp','item','leader') - + char t_name[100]; char t_member[24]; int party_member = 0, party_online_member = 0; int party_exist = 0; int leader_id = 0; int i = 0; - + printf("(\033[1;64m%d\033[0m) Request save party - ",party_id); - + jstrescapecpy(t_name, p->name); - + if (p==NULL || party_id==0 || p->party_id ==0 || party_id!=p->party_id) { printf("- Party pointer or party_id error \n"); return 0; } - - // Check if party exists + + // Check if party exists sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",party_db, party_id); // TBR if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); @@ -57,29 +57,29 @@ int inter_party_tosql(int party_id,struct party *p) if (party_exist >0){ // Check members in party sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",char_db, party_id); // TBR - if(mysql_query(&mysql_handle, tmp_sql) ) { + if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); return 0; } sql_res = mysql_store_result(&mysql_handle) ; if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { sql_row = mysql_fetch_row(sql_res); - + party_member = atoi (sql_row[0]); // printf("- Check members in party %d : %d \n",party_id,party_member); } mysql_free_result(sql_res) ; //resource free - + party_online_member = 0; i=0; while (imember[i].account_id>0) party_online_member++; i++; } - + //if (party_online_member==0) printf("- No member online \n"); else printf("- Some member %d online \n", party_online_member); - + if (party_member <= 0 && party_online_member == 0) { // Delete the party, if has no member. @@ -92,29 +92,29 @@ int inter_party_tosql(int party_id,struct party *p) return 0; } else { // Update party information, if exists - + int i=0; - + for (i=0;imember[i].account_id>0){ sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `name`='%s'", - char_db, party_id, p->member[i].account_id,jstrescapecpy(t_member,p->member[i].name)); + char_db, party_id, p->member[i].account_id,jstrescapecpy(t_member,p->member[i].name)); //printf("%s",tmp_sql); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); } } } - - + + sprintf(tmp_sql,"UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d', `leader_id`=`leader_id` WHERE `party_id`='%d'", - party_db, t_name,p->exp,p->item,party_id); + party_db, t_name,p->exp,p->item,party_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) ); } - + // printf("- Update party %d information \n",party_id); } } else { @@ -128,18 +128,18 @@ int inter_party_tosql(int party_id,struct party *p) printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) ); return 0; } - + sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `name`='%s'", - char_db, party_id,leader_id, jstrescapecpy(t_member,p->member[i].name)); + char_db, party_id,leader_id, jstrescapecpy(t_member,p->member[i].name)); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) ); } - - //printf("- Insert new party %d \n",party_id); + + //printf("- Insert new party %d \n",party_id); } - + printf("Party save success\n"); - return 0; + return 0; } @@ -148,15 +148,15 @@ int inter_party_fromsql(int party_id,struct party *p) { int leader_id=0; printf("(\033[1;64m%d\033[0m) Request load party - ",party_id); - + memset(p, 0, sizeof(struct party)); - + sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`, `leader_id` FROM `%s` WHERE `party_id`='%d'",party_db, party_id); // TBR if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) ); return 0; } - + sql_res = mysql_store_result(&mysql_handle) ; if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { sql_row = mysql_fetch_row(sql_res); @@ -171,9 +171,9 @@ int inter_party_fromsql(int party_id,struct party *p) // printf("- Cannot find party %d \n",party_id); return 0; } - + mysql_free_result(sql_res); - + // Load members sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, party_id); // TBR if(mysql_query(&mysql_handle, tmp_sql) ) { @@ -195,20 +195,20 @@ int inter_party_fromsql(int party_id,struct party *p) // printf("- %d members found in party %d \n",i,party_id); } mysql_free_result(sql_res); - - + + printf("Party load success\n"); return 0; - + } int inter_party_sql_init(){ int i; - + //memory alloc printf("interserver party memory initialize.... (%d byte)\n",sizeof(struct party)); - party_pt = aCalloc(sizeof(struct party), 1); - + party_pt = (struct party*)aCalloc(sizeof(struct party), 1); + sprintf (tmp_sql , "SELECT count(*) FROM `%s`",party_db); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); @@ -225,16 +225,16 @@ int inter_party_sql_init(){ if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } - + sql_res = mysql_store_result(&mysql_handle) ; - + sql_row = mysql_fetch_row(sql_res); party_newid = atoi (sql_row[0])+1; mysql_free_result(sql_res); } - + printf("set party_newid: %d.......\n",party_newid); - + return 0; } @@ -245,8 +245,8 @@ struct party* search_partyname(char *str) struct party *p=NULL; int leader_id = 0; char t_name[24]; - - sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str)); + + sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str)); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) ); } @@ -477,12 +477,12 @@ int mapif_parse_CreateParty(int fd,int account_id,char *name,char *nick,char *ma p->member[0].leader=1; p->member[0].online=1; p->member[0].lv=lv; - + inter_party_tosql(p->party_id,p); - + mapif_party_created(fd,account_id,p); mapif_party_info(fd,p); - + return 0; } // パーティ情報要求 @@ -494,7 +494,7 @@ int mapif_parse_PartyInfo(int fd,int party_id) return 0; } inter_party_fromsql(party_id, p); - + if(p->party_id >= 0) mapif_party_info(fd,p); else @@ -506,23 +506,23 @@ int mapif_parse_PartyAddMember(int fd,int party_id,int account_id,char *nick,cha { struct party *p; int i; - + p = party_pt; if(p==NULL){ printf("int_party: out of memory !\n"); return 0; } inter_party_fromsql(party_id, p); - + if(p->party_id <= 0){ mapif_party_memberadded(fd,party_id,account_id,1); return 0; } - + for(i=0;imember[i].account_id==0){ int flag=0; - + p->member[i].account_id=account_id; memcpy(p->member[i].name,nick,24); memcpy(p->member[i].map,map,16); @@ -538,7 +538,7 @@ int mapif_parse_PartyAddMember(int fd,int party_id,int account_id,char *nick,cha } if(flag) mapif_party_optionchanged(fd,p,0,0); - + inter_party_tosql(party_id, p); return 0; } @@ -552,25 +552,25 @@ int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int { struct party *p; int flag=0; - + p = party_pt; if(p==NULL){ printf("int_party: out of memory !\n"); return 0; } - + inter_party_fromsql(party_id, p); - + if(p->party_id <= 0){ return 0; } - + p->exp=exp; if( exp>0 && !party_check_exp_share(p) ){ flag|=0x01; p->exp=0; } - + p->item=item; mapif_party_optionchanged(fd,p,account_id,flag); @@ -586,27 +586,27 @@ int mapif_parse_PartyLeave(int fd,int party_id,int account_id) printf("int_party: out of memory !\n"); return 0; } - + inter_party_fromsql(party_id, p); - + if(p->party_id >= 0){ int i,j; for(i=0;imember[i].account_id==account_id){ //printf("p->member[i].account_id = %d , account_id = %d \n",p->member[i].account_id,account_id); mapif_party_leaved(party_id,account_id,p->member[i].name); - - - + + + // Update char information, does the name need encoding? - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'", + sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'", char_db, party_id, jstrescapecpy(t_member,p->member[i].name)); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); } -// printf("Delete member %s from MySQL \n", p->member[i].name); - +// printf("Delete member %s from MySQL \n", p->member[i].name); + if (p->member[i].leader==1){ for(j=0;jmember[j].account_id>0&&j!=i){ mapif_party_leaved(party_id,p->member[j].account_id,p->member[j].name); // Update char information, does the name need encoding? - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'", + sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'", char_db, party_id, jstrescapecpy(t_member,p->member[i].name)); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); } -// printf("Delete member %s from MySQL \n", p->member[j].name); +// printf("Delete member %s from MySQL \n", p->member[j].name); } } // Delete the party, if has no member. @@ -628,9 +628,9 @@ int mapif_parse_PartyLeave(int fd,int party_id,int account_id) printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } // printf("Leader breaks party %d \n",party_id); - memset(p, 0, sizeof(struct party)); + memset(p, 0, sizeof(struct party)); }else memset(&p->member[i],0,sizeof(struct party_member)); - + break; } @@ -642,8 +642,8 @@ int mapif_parse_PartyLeave(int fd,int party_id,int account_id) inter_party_tosql(party_id,p); // Break the party if no member */ }else{ - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'", - char_db, party_id, account_id); + sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'", + char_db, party_id, account_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); } @@ -655,21 +655,21 @@ int mapif_parse_PartyChangeMap(int fd,int party_id,int account_id,char *map,int { struct party *p; int i; - + p = party_pt; if(p==NULL){ printf("int_party: out of memory !\n"); return 0; } inter_party_fromsql(party_id, p); - + if(p->party_id <= 0){ return 0; } for(i=0;imember[i].account_id==account_id){ int flag=0; - + memcpy(p->member[i].map,map,16); p->member[i].online=online; p->member[i].lv=lv; @@ -691,20 +691,20 @@ int mapif_parse_PartyChangeMap(int fd,int party_id,int account_id,char *map,int int mapif_parse_BreakParty(int fd,int party_id) { struct party *p; - + p = party_pt; if(p==NULL){ printf("int_party: out of memory !\n"); return 0; } - + inter_party_fromsql(party_id, p); - + if(p->party_id <= 0){ return 0; } inter_party_tosql(party_id,p); - + mapif_party_broken(fd,party_id); return 0; } @@ -727,15 +727,15 @@ int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick) int inter_party_parse_frommap(int fd) { switch(RFIFOW(fd,0)){ - case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54),RFIFOW(fd,70)); break; + case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),(char*)RFIFOP(fd,6),(char*)RFIFOP(fd,30),(char*)RFIFOP(fd,54),RFIFOW(fd,70)); break; case 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); break; - case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOP(fd,34),RFIFOW(fd,50)); break; + case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),(char*)RFIFOP(fd,10),(char*)RFIFOP(fd,34),RFIFOW(fd,50)); break; case 0x3023: mapif_parse_PartyChangeOption(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12)); break; case 0x3024: mapif_parse_PartyLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6)); break; - case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); break; + case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),(char*)RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); break; case 0x3026: mapif_parse_BreakParty(fd,RFIFOL(fd,2)); break; - case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break; - case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10)); break; + case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),(char*)RFIFOP(fd,12),RFIFOW(fd,2)-12); break; + case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),(char*)RFIFOP(fd,10)); break; default: return 0; } diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c index 18172b066..35a7710a7 100644 --- a/src/char_sql/int_pet.c +++ b/src/char_sql/int_pet.c @@ -18,11 +18,11 @@ static int pet_newid = 100; int inter_pet_tosql(int pet_id, struct s_pet *p) { //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) char t_name[100]; - + printf("request save pet: %d.......\n",pet_id); - + jstrescapecpy(t_name, p->name); - + if(p->hungry < 0) p->hungry = 0; else if(p->hungry > 100) @@ -36,7 +36,7 @@ int inter_pet_tosql(int pet_id, struct s_pet *p) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) + if (sql_res!=NULL && mysql_num_rows(sql_res)>0) //row reside -> updating sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'", pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id, @@ -49,19 +49,19 @@ int inter_pet_tosql(int pet_id, struct s_pet *p) { if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (inset/update `pet`)- %s\n", mysql_error(&mysql_handle) ); } - + printf("pet save success.......\n"); return 0; } int inter_pet_fromsql(int pet_id, struct s_pet *p){ - + printf("request load pet: %d.......\n",pet_id); - + memset(p, 0, sizeof(struct s_pet)); - + //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) - + sprintf(tmp_sql,"SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (select `pet`)- %s\n", mysql_error(&mysql_handle) ); @@ -70,7 +70,7 @@ int inter_pet_fromsql(int pet_id, struct s_pet *p){ sql_res = mysql_store_result(&mysql_handle) ; if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { sql_row = mysql_fetch_row(sql_res); - + p->pet_id = pet_id; p->class_ = atoi(sql_row[1]); memcpy(p->name, sql_row[2],24); @@ -92,20 +92,20 @@ int inter_pet_fromsql(int pet_id, struct s_pet *p){ p->intimate = 0; else if(p->intimate > 1000) p->intimate = 1000; - + mysql_free_result(sql_res); - + printf("pet load success.......\n"); return 0; } //---------------------------------------------- - + int inter_pet_sql_init(){ int i; - + //memory alloc printf("interserver pet memory initialize.... (%d byte)\n",sizeof(struct s_pet)); - pet_pt = aCalloc(sizeof(struct s_pet), 1); + pet_pt = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1); sprintf (tmp_sql , "SELECT count(*) FROM `%s`", pet_db); if(mysql_query(&mysql_handle, tmp_sql) ) { @@ -124,22 +124,22 @@ int inter_pet_sql_init(){ if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } - + sql_res = mysql_store_result(&mysql_handle) ; - + sql_row = mysql_fetch_row(sql_res); pet_newid = atoi (sql_row[0])+1; //should SET MAX existing PET ID + 1 [Lupus] mysql_free_result(sql_res); } - + printf("set pet_newid: %d.......\n",pet_newid); - + return 0; } //---------------------------------- int inter_pet_delete(int pet_id){ printf("request delete pet: %d.......\n",pet_id); - + sprintf(tmp_sql,"DELETE FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); @@ -232,19 +232,19 @@ int mapif_create_pet(int fd, int account_id, int char_id, short pet_class, short pet_pt->intimate = 0; else if(pet_pt->intimate > 1000) pet_pt->intimate = 1000; - + inter_pet_tosql(pet_pt->pet_id,pet_pt); - + mapif_pet_created(fd, account_id, pet_pt); - + return 0; } int mapif_load_pet(int fd, int account_id, int char_id, int pet_id){ memset(pet_pt, 0, sizeof(struct s_pet)); - + inter_pet_fromsql(pet_id, pet_pt); - + if(pet_pt!=NULL) { if(pet_pt->incuvate == 1) { pet_pt->account_id = pet_pt->char_id = 0; @@ -267,7 +267,7 @@ int mapif_save_pet(int fd, int account_id, struct s_pet *data) { if(sizeof(struct s_pet)!=len-8) { printf("inter pet: data size error %d %d\n", sizeof(struct s_pet), len-8); } - + else{ if(data->hungry < 0) data->hungry = 0; @@ -292,7 +292,7 @@ int mapif_delete_pet(int fd, int pet_id){ int mapif_parse_CreatePet(int fd){ mapif_create_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10), RFIFOW(fd, 12), RFIFOW(fd, 14), RFIFOW(fd, 16), RFIFOL(fd, 18), - RFIFOL(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), RFIFOP(fd, 24)); + RFIFOL(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), (char*)RFIFOP(fd, 24)); return 0; } diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c index e2d4010a1..b93fc5b7d 100644 --- a/src/char_sql/int_storage.c +++ b/src/char_sql/int_storage.c @@ -24,7 +24,7 @@ int storage_tosql(int account_id,struct storage *p){ struct itemtemp mapitem; for(i=0;istorage[i].nameid>0){ - if(itemdb_isequip(p->storage[i].nameid)==1){ + if(itemdb_isequip(p->storage[i].nameid)==1){ mapitem.equip[eqcount].flag=0; mapitem.equip[eqcount].id = p->storage[i].id; mapitem.equip[eqcount].nameid=p->storage[i].nameid; @@ -39,7 +39,7 @@ int storage_tosql(int account_id,struct storage *p){ mapitem.equip[eqcount].card[3] = p->storage[i].card[3]; eqcount++; } - else if(itemdb_isequip(p->storage[i].nameid)==0){ + else if(itemdb_isequip(p->storage[i].nameid)==0){ mapitem.notequip[noteqcount].flag=0; mapitem.notequip[noteqcount].id = p->storage[i].id; mapitem.notequip[noteqcount].nameid=p->storage[i].nameid; @@ -66,18 +66,18 @@ int storage_tosql(int account_id,struct storage *p){ // DB -> storage data conversion int storage_fromsql(int account_id, struct storage *p){ int i=0; - + memset(p,0,sizeof(struct storage)); //clean up memory p->storage_amount = 0; p->account_id = account_id; - + // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `account_id`='%d'",storage_db, account_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } sql_res = mysql_store_result(&mysql_handle) ; - + if (sql_res) { while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch p->storage[i].id= atoi(sql_row[0]); @@ -95,7 +95,7 @@ int storage_fromsql(int account_id, struct storage *p){ } mysql_free_result(sql_res); } - + printf ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount); return 1; } @@ -108,7 +108,7 @@ int guild_storage_tosql(int guild_id, struct guild_storage *p){ struct itemtemp mapitem; for(i=0;istorage[i].nameid>0){ - if(itemdb_isequip(p->storage[i].nameid)==1){ + if(itemdb_isequip(p->storage[i].nameid)==1){ mapitem.equip[eqcount].flag=0; mapitem.equip[eqcount].id = p->storage[i].id; mapitem.equip[eqcount].nameid=p->storage[i].nameid; @@ -123,7 +123,7 @@ int guild_storage_tosql(int guild_id, struct guild_storage *p){ mapitem.equip[eqcount].card[3] = p->storage[i].card[3]; eqcount++; } - else if(itemdb_isequip(p->storage[i].nameid)==0){ + else if(itemdb_isequip(p->storage[i].nameid)==0){ mapitem.notequip[noteqcount].flag=0; mapitem.notequip[noteqcount].id = p->storage[i].id; mapitem.notequip[noteqcount].nameid=p->storage[i].nameid; @@ -163,7 +163,7 @@ int guild_storage_fromsql(int guild_id, struct guild_storage *p){ printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); } sql_res = mysql_store_result(&mysql_handle) ; - + if (sql_res) { while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch p->storage[i].id= atoi(sql_row[0]); @@ -188,14 +188,14 @@ int guild_storage_fromsql(int guild_id, struct guild_storage *p){ //--------------------------------------------------------- // storage data initialize int inter_storage_sql_init(){ - + //memory alloc printf("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage)); - storage_pt=aCalloc(sizeof(struct storage), 1); - guild_storage_pt=aCalloc(sizeof(struct guild_storage), 1); + storage_pt = (struct storage*)aCalloc(sizeof(struct storage), 1); + guild_storage_pt = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1); memset(storage_pt,0,sizeof(struct storage)); memset(guild_storage_pt,0,sizeof(struct guild_storage)); - + return 1; } // 倉庫データ削除 @@ -243,7 +243,7 @@ int mapif_load_guild_storage(int fd,int account_id,int guild_id) { int guild_exist=0; WFIFOW(fd,0)=0x3818; - + // Check if guild exists, I may write a function for this later, coz I use it several times. //printf("- Check if guild %d exists\n",g->guild_id); sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id); @@ -257,7 +257,7 @@ int mapif_load_guild_storage(int fd,int account_id,int guild_id) //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); } mysql_free_result(sql_res) ; //resource free - + if(guild_exist==1) { guild_storage_fromsql(guild_id,guild_storage_pt); WFIFOW(fd,2)=sizeof(struct guild_storage)+12; @@ -296,7 +296,7 @@ int mapif_parse_LoadStorage(int fd){ int mapif_parse_SaveStorage(int fd){ int account_id=RFIFOL(fd,4); int len=RFIFOW(fd,2); - + if(sizeof(struct storage)!=len-8){ printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8); }else{ @@ -335,7 +335,7 @@ int mapif_parse_SaveGuildStorage(int fd) //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); } mysql_free_result(sql_res) ; //resource free - + if(guild_exist==1) { memcpy(guild_storage_pt,RFIFOP(fd,12),sizeof(struct guild_storage)); guild_storage_tosql(guild_id,guild_storage_pt); diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c index 92a002898..6d0ed144a 100644 --- a/src/char_sql/inter.c +++ b/src/char_sql/inter.c @@ -87,20 +87,20 @@ static int wis_dellist[WISDELLIST_MAX], wis_delnum; //-------------------------------------------------------- // Save account_reg to sql (type=2) int inter_accreg_tosql(int account_id,struct accreg *reg){ - + int j; char temp_str[32]; if (account_id<=0) return 0; reg->account_id=account_id; - + //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, account_id); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); } - + if (reg->reg_num<=0) return 0; - + for(j=0;jreg_num;j++){ if(reg->reg[j].str != NULL){ sprintf(tmp_sql,"INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES (2,'%d', '%s','%d')", @@ -120,7 +120,7 @@ int inter_accreg_fromsql(int account_id,struct accreg *reg) if (reg==NULL) return 0; memset(reg, 0, sizeof(struct accreg)); reg->account_id=account_id; - + //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id); if(mysql_query(&mysql_handle, tmp_sql) ) { @@ -129,7 +129,7 @@ int inter_accreg_fromsql(int account_id,struct accreg *reg) sql_res = mysql_store_result(&mysql_handle); if (sql_res) { - for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){ + for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){ memcpy(reg->reg[j].str, sql_row[0],32); reg->reg[j].value = atoi(sql_row[1]); } @@ -144,7 +144,7 @@ int inter_accreg_sql_init() { CREATE(accreg_pt, struct accreg, 1); return 0; - + } /*========================================== @@ -190,7 +190,7 @@ int inter_config_read(const char *cfgName) { } //Logins information to be read from the inter_athena.conf //for character deletion (checks email in the loginDB) - + else if(strcmpi(w1,"login_server_ip")==0){ strcpy(login_server_ip, w2); printf ("set login_server_ip : %s\n",w2); @@ -226,7 +226,7 @@ int inter_config_read(const char *cfgName) { } } fclose(fp); - + printf ("success reading interserver configuration\n"); return 0; @@ -244,7 +244,7 @@ int inter_log(char *fmt,...) sprintf(tmp_sql,"INSERT DELAYED INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')",interlog_db, jstrescapecpy(temp_str,str)); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error (insert `interlog`)- %s\n", mysql_error(&mysql_handle) ); - } + } va_end(ap); return 0; @@ -255,10 +255,10 @@ int inter_log(char *fmt,...) int inter_init(const char *file) { //int i; - + printf ("interserver initialize...\n"); inter_config_read(file); - + //DB connection initialized mysql_init(&mysql_handle); printf("Connect Character DB server.... (Character Server)\n"); @@ -271,7 +271,7 @@ int inter_init(const char *file) else { printf ("Connect Success! (Character Server)\n"); } - + mysql_init(&lmysql_handle); printf("Connect Character DB server.... (login server)\n"); if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw, @@ -286,7 +286,7 @@ int inter_init(const char *file) inter_guild_sql_init(); inter_storage_sql_init(); inter_party_sql_init(); - + inter_pet_sql_init(); inter_accreg_sql_init(); @@ -335,7 +335,7 @@ int mapif_wis_message(struct WisData *wd) { int mapif_wis_end(struct WisData *wd,int flag) { unsigned char buf[27]; - + WBUFW(buf, 0)=0x3802; memcpy(WBUFP(buf, 2),wd->src,24); WBUFB(buf,26)=flag; @@ -358,7 +358,7 @@ int mapif_account_reg_reply(int fd,int account_id) { struct accreg *reg=accreg_pt; inter_accreg_fromsql(account_id,reg); - + WFIFOW(fd,0)=0x3804; WFIFOL(fd,4)=account_id; if(reg->reg_num==0){ @@ -397,7 +397,7 @@ int check_ttl_wisdata() { wis_delnum = 0; numdb_foreach(wis_db, check_ttl_wisdata_sub, tick); for(i = 0; i < wis_delnum; i++) { - struct WisData *wd = numdb_search(wis_db, wis_dellist[i]); + struct WisData *wd = (struct WisData*)numdb_search(wis_db, wis_dellist[i]); printf("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst); // removed. not send information after a timeout. Just no answer for the player //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target @@ -448,9 +448,9 @@ int mapif_parse_WisRequest(int fd) { } else { // to be sure of the correct name, rewrite it memset(RFIFOP(fd,28), 0, 24); - strncpy(RFIFOP(fd,28), sql_row[0], 24); + strncpy((char*)RFIFOP(fd,28), sql_row[0], 24); // if source is destination, don't ask other servers. - if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) { + if (strcmp((char*)RFIFOP(fd,4),(char*)RFIFOP(fd,28)) == 0) { unsigned char buf[27]; WBUFW(buf, 0) = 0x3802; memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); @@ -482,7 +482,7 @@ int mapif_parse_WisRequest(int fd) { // Wisp/page transmission result int mapif_parse_WisReply(int fd) { int id = RFIFOL(fd,2), flag = RFIFOB(fd,6); - struct WisData *wd = numdb_search(wis_db, id); + struct WisData *wd = (struct WisData*)numdb_search(wis_db, id); if (wd == NULL) return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server @@ -504,13 +504,13 @@ int mapif_parse_AccReg(int fd) struct accreg *reg=accreg_pt; int account_id = RFIFOL(fd,4); memset(accreg_pt,0,sizeof(struct accreg)); - + for(j=0,p=8;jreg[j].str,RFIFOP(fd,p),32); reg->reg[j].value=RFIFOL(fd,p+32); } reg->reg_num=j; - + inter_accreg_tosql(account_id,reg); mapif_account_reg(fd,RFIFOP(fd,0)); // Send confirm message to map return 0; @@ -539,7 +539,7 @@ int inter_parse_frommap(int fd) // パケット長を調べる if( (len=inter_check_length(fd,inter_recv_packet_length[cmd-0x3000]))==0 ) return 2; - + switch(cmd){ case 0x3000: mapif_parse_GMmessage(fd); break; case 0x3001: mapif_parse_WisRequest(fd); break; @@ -569,9 +569,9 @@ int inter_check_length(int fd, int length) return 0; length = RFIFOW(fd, 2); } - + if(RFIFOREST(fd)=20000) continue; @@ -185,7 +185,7 @@ static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map // ---------- */ id=itemdb_search(nameid); - + memcpy(id->name, sql_row[1], 24); memcpy(id->jname, sql_row[2], 24); @@ -212,7 +212,7 @@ static int itemdb_final(void *key,void *data,va_list ap) { struct item_data *id; - id=data; + id = (struct item_data*)data; if(id->use_script) aFree(id->use_script); if(id->equip_script) diff --git a/src/common/grfio.c b/src/common/grfio.c index 6454d5048..5453a4b5d 100644 --- a/src/common/grfio.c +++ b/src/common/grfio.c @@ -574,7 +574,7 @@ void* grfio_reads(char *fname, int *size) lentry.declen = ftell(in); } fseek(in,0,0); // SEEK_SET - buf2 = (unsigned char *) aCallocA(lentry.declen+1024, 1); + buf2 = (unsigned char *)aCallocA(lentry.declen+1024, 1); if (buf2==NULL) { printf("file read memory allocate error : declen\n"); goto errret; @@ -612,7 +612,7 @@ void* grfio_reads(char *fname, int *size) fseek(in,entry->srcpos,0); fread(buf,1,entry->srclen_aligned,in); fclose(in); - buf2 = (unsigned char *) aCallocA(entry->declen+1024, 1); + buf2 = (unsigned char *)aCallocA(entry->declen+1024, 1); if (buf2==NULL) { printf("file decode memory allocate error\n"); goto errret; diff --git a/src/common/malloc.c b/src/common/malloc.c index a00399a0e..089a9db18 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -8,7 +8,7 @@ void* aMalloc_( size_t size, const char *file, int line, const char *func ) { void *ret; - + // printf("%s:%d: in func %s: malloc %d\n",file,line,func,size); ret=malloc(size); if(ret==NULL){ @@ -21,7 +21,7 @@ void* aMalloc_( size_t size, const char *file, int line, const char *func ) void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func ) { void *ret; - + // printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size); ret=calloc(num,size); if(ret==NULL){ @@ -35,7 +35,7 @@ void* aCalloc_( size_t num, size_t size, const char *file, int line, const char void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func ) { void *ret; - + // printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size); ret=realloc(p,size); if(ret==NULL){ @@ -66,7 +66,7 @@ void * _bcalloc(size_t size, size_t cnt) { char * _bstrdup(const char *chr) { int len = strlen(chr); - char *ret = aMalloc(len + 1); + char *ret = (char*)aMalloc(len + 1); strcpy(ret, chr); return ret; } diff --git a/src/common/strlib.c b/src/common/strlib.c index ca6e38761..64c8e154f 100644 --- a/src/common/strlib.c +++ b/src/common/strlib.c @@ -10,12 +10,12 @@ // string lib. char* jstrescape (char* pt) { //copy from here - unsigned char * ptr; + char *ptr; int i =0, j=0; //copy string to temporary CREATE_A(ptr, char, J_MAX_MALLOC_SIZE); - strcpy (ptr,pt); + strcpy(ptr,pt); while (ptr[i] != '\0') { switch (ptr[i]) { diff --git a/src/ladmin/md5calc.c b/src/ladmin/md5calc.c index 7b9a9a2c6..c6c958583 100644 --- a/src/ladmin/md5calc.c +++ b/src/ladmin/md5calc.c @@ -96,7 +96,7 @@ static void MD5_Round_Calculate(const unsigned char *block, //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) unsigned int A=*A2, B=*B2, C=*C2, D=*D2; unsigned int AA = A,BB = B,CC = C,DD = D; - + //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 pX = X; @@ -187,7 +187,7 @@ void MD5_String2binary(const char * string, char * output) memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. padding_message[copy_len] |= 0x80; //The next of a message is 1. - //1-4 + //1-4 //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. if (56 <= copy_len) { MD5_Round_Calculate(padding_message, A,B,C,D); @@ -226,7 +226,7 @@ void MD5_String(const char * string, char * output) { unsigned char digest[16]; - MD5_String2binary(string,digest); + MD5_String2binary(string,(char*)digest); sprintf(output, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", digest[ 0], digest[ 1], digest[ 2], digest[ 3], diff --git a/src/login/login.c b/src/login/login.c index 1a0faddb0..5736963d3 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -971,7 +971,7 @@ int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { //----------------------------------------------------- void send_GM_accounts() { int i; - char buf[32767]; + unsigned char buf[32767]; int len; len = 4; @@ -1239,7 +1239,7 @@ int mmo_auth(struct mmo_account* account, int fd) { } gettimeofday(&tv, NULL); - strftime(tmpstr, 24, date_format, localtime(&(tv.tv_sec))); + strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec))); sprintf(tmpstr + strlen(tmpstr), ".%03d", (int)tv.tv_usec / 1000); account->account_id = auth_dat[i].account_id; @@ -1463,7 +1463,7 @@ int parse_fromchar(int fd) { WBUFW(buf,0) = 0x2721; WBUFL(buf,2) = acc; WBUFL(buf,6) = 0; - if (strcmp(RFIFOP(fd,8), gm_pass) == 0) { + if (strcmp((char*)RFIFOP(fd,8), gm_pass) == 0) { // only non-GM can become GM if (isGM(acc) == 0) { // if we autorise creation @@ -1473,7 +1473,7 @@ int parse_fromchar(int fd) { char tmpstr[24]; struct timeval tv; gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec))); + strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec))); fprintf(fp, RETCODE "// %s: @GM command on account %d" RETCODE "%d %d" RETCODE, tmpstr, acc, acc, level_new_gm); fclose(fp); WBUFL(buf,6) = level_new_gm; @@ -1801,7 +1801,7 @@ int parse_fromchar(int fd) { logfp = fopen(login_log_unknown_packets_filename, "a"); if (logfp) { gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec))); + strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec))); fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000); fprintf(logfp, "parse_fromchar: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd)); fprintf(logfp, "Detail (in hex):" RETCODE); @@ -1945,13 +1945,13 @@ int parse_admin(int fd) { return 0; { struct mmo_account ma; - ma.userid = RFIFOP(fd, 2); + ma.userid = (char*)RFIFOP(fd, 2); memcpy(ma.passwd, RFIFOP(fd, 26), 24); ma.passwd[24] = '\0'; memcpy(ma.lastlogin, "-", 2); ma.sex = RFIFOB(fd,50); WFIFOW(fd,0) = 0x7931; - WFIFOL(fd,2) = -1; + WFIFOL(fd,2) = -1; // WTF? usigned being set to a -1??? memcpy(WFIFOP(fd,6), RFIFOP(fd,2), 24); if (strlen(ma.userid) > 23 || strlen(ma.passwd) > 23) { login_log("'ladmin': Attempt to create an invalid account (account or pass is too long, ip: %s)" RETCODE, @@ -1997,8 +1997,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 26) return 0; WFIFOW(fd,0) = 0x7933; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF? an unsigned being set to -1 + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2014,7 +2014,7 @@ int parse_admin(int fd) { // save deleted account in log file login_log("'ladmin': Account deletion (account: %s, id: %d, ip: %s) - saved in next line:" RETCODE, auth_dat[i].userid, auth_dat[i].account_id, ip); - mmo_auth_tostr(buf, &auth_dat[i]); + mmo_auth_tostr((char*)buf, &auth_dat[i]); login_log("%s" RETCODE, buf); // delete account memset(auth_dat[i].userid, '\0', sizeof(auth_dat[i].userid)); @@ -2033,8 +2033,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 50) return 0; WFIFOW(fd,0) = 0x7935; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; /// WTF??? an unsigned being set to a -1 + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2063,8 +2063,8 @@ int parse_admin(int fd) { char error_message[20]; int statut; WFIFOW(fd,0) = 0x7937; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); statut = RFIFOL(fd,26); @@ -2138,8 +2138,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 50) return 0; WFIFOW(fd,0) = 0x793b; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2170,8 +2170,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 27) return 0; WFIFOW(fd,0) = 0x793d; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); memcpy(WFIFOP(fd,6), account_name, 24); @@ -2222,8 +2222,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 27) return 0; WFIFOW(fd,0) = 0x793f; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); memcpy(WFIFOP(fd,6), account_name, 24); @@ -2250,7 +2250,7 @@ int parse_admin(int fd) { if ((fp2 = lock_fopen(GM_account_filename, &lock)) != NULL) { if ((fp = fopen(GM_account_filename, "r")) != NULL) { gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec))); + strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec))); modify_flag = 0; // read/write GM file while(fgets(line, sizeof(line)-1, fp)) { @@ -2312,8 +2312,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 66) return 0; WFIFOW(fd,0) = 0x7941; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); memcpy(WFIFOP(fd,6), account_name, 24); @@ -2347,8 +2347,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 28 || RFIFOREST(fd) < (28 + RFIFOW(fd,26))) return 0; WFIFOW(fd,0) = 0x7943; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2382,8 +2382,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 26) return 0; WFIFOW(fd,0) = 0x7945; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2409,7 +2409,7 @@ int parse_admin(int fd) { memset(WFIFOP(fd,6), '\0', 24); for(i = 0; i < auth_num; i++) { if (auth_dat[i].account_id == RFIFOL(fd,2)) { - strncpy(WFIFOP(fd,6), auth_dat[i].userid, 24); + strncpy((char*)WFIFOP(fd,6), auth_dat[i].userid, 24); login_log("'ladmin': Request (by id) of an account name (account: %s, id: %d, ip: %s)" RETCODE, auth_dat[i].userid, RFIFOL(fd,2), ip); break; @@ -2418,7 +2418,7 @@ int parse_admin(int fd) { if (i == auth_num) { login_log("'ladmin': Name request (by id) of an unknown account (id: %d, ip: %s)" RETCODE, RFIFOL(fd,2), ip); - strncpy(WFIFOP(fd,6), "", 24); + strncpy((char*)WFIFOP(fd,6), "", 24); } WFIFOSET(fd,30); RFIFOSKIP(fd,6); @@ -2431,8 +2431,8 @@ int parse_admin(int fd) { time_t timestamp; char tmpstr[2048]; WFIFOW(fd,0) = 0x7949; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); timestamp = (time_t)RFIFOL(fd,26); @@ -2463,8 +2463,8 @@ int parse_admin(int fd) { time_t timestamp; char tmpstr[2048]; WFIFOW(fd,0) = 0x794b; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); timestamp = (time_t)RFIFOL(fd,26); @@ -2511,8 +2511,8 @@ int parse_admin(int fd) { struct tm *tmtime; char tmpstr[2048]; WFIFOW(fd,0) = 0x794d; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2573,7 +2573,7 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4))) return 0; WFIFOW(fd,0) = 0x794f; - WFIFOW(fd,2) = -1; + WFIFOW(fd,2) = -1; // WTF??? if (RFIFOL(fd,4) < 1) { login_log("'ladmin': Receiving a message for broadcast, but message is void (ip: %s)" RETCODE, ip); @@ -2586,7 +2586,7 @@ int parse_admin(int fd) { login_log("'ladmin': Receiving a message for broadcast, but no char-server is online (ip: %s)" RETCODE, ip); } else { - char buf[32000]; + unsigned char buf[32000]; char message[32000]; WFIFOW(fd,2) = 0; memset(message, '\0', sizeof(message)); @@ -2618,8 +2618,8 @@ int parse_admin(int fd) { char tmpstr[2048]; char tmpstr2[2048]; WFIFOW(fd,0) = 0x7951; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2672,8 +2672,8 @@ int parse_admin(int fd) { if (RFIFOREST(fd) < 26) return 0; WFIFOW(fd,0) = 0x7953; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); + WFIFOL(fd,2) = -1; // WTF??? + account_name = (char*)RFIFOP(fd,2); account_name[23] = '\0'; remove_control_chars(account_name); i = search_account_index(account_name); @@ -2739,7 +2739,7 @@ int parse_admin(int fd) { if (i == auth_num) { login_log("'ladmin': Attempt to obtain information (by the id) of an unknown account (id: %d, ip: %s)" RETCODE, RFIFOL(fd,2), ip); - strncpy(WFIFOP(fd,7), "", 24); + strncpy((char*)WFIFOP(fd,7), "", 24); WFIFOW(fd,148) = 0; WFIFOSET(fd,150); } @@ -2762,7 +2762,7 @@ int parse_admin(int fd) { logfp = fopen(login_log_unknown_packets_filename, "a"); if (logfp) { gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec))); + strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec))); fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000); fprintf(logfp, "parse_admin: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd)); fprintf(logfp, "Detail (in hex):" RETCODE); @@ -2874,7 +2874,7 @@ int parse_login(int fd) { if (RFIFOREST(fd) < ((RFIFOW(fd,0) == 0x64) ? 55 : 47)) return 0; - account.userid = RFIFOP(fd,6); + account.userid = (char*)RFIFOP(fd,6); account.userid[23] = '\0'; remove_control_chars(account.userid); if (RFIFOW(fd,0) == 0x64) { @@ -3022,15 +3022,15 @@ int parse_login(int fd) { return 0; { int GM_value, len; - unsigned char* server_name; - account.userid = RFIFOP(fd,2); + char* server_name; + account.userid = (char*)RFIFOP(fd,2); account.userid[23] = '\0'; remove_control_chars(account.userid); memcpy(account.passwd, RFIFOP(fd,26), 24); account.passwd[24] = '\0'; remove_control_chars(account.passwd); account.passwdenc = 0; - server_name = RFIFOP(fd,60); + server_name = (char*)RFIFOP(fd,60); server_name[19] = '\0'; remove_control_chars(server_name); login_log("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)" RETCODE, @@ -3117,7 +3117,7 @@ int parse_login(int fd) { } else { struct login_session_data *ld = (struct login_session_data*)session[fd]->session_data; if (RFIFOW(fd,2) == 0) { // non encrypted password - unsigned char* password=""; + char* password=""; memcpy(password, RFIFOP(fd,4), 24); password[24] = '\0'; remove_control_chars(password); @@ -3167,7 +3167,7 @@ int parse_login(int fd) { logfp = fopen(login_log_unknown_packets_filename, "a"); if (logfp) { gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec))); + strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec))); fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000); fprintf(logfp, "parse_login: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd)); fprintf(logfp, "Detail (in hex):" RETCODE); diff --git a/src/login/md5calc.c b/src/login/md5calc.c index 96bfc34d0..0ee64476d 100644 --- a/src/login/md5calc.c +++ b/src/login/md5calc.c @@ -96,7 +96,7 @@ static void MD5_Round_Calculate(const unsigned char *block, //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) unsigned int A=*A2, B=*B2, C=*C2, D=*D2; unsigned int AA = A,BB = B,CC = C,DD = D; - + //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 pX = X; @@ -187,7 +187,7 @@ void MD5_String2binary(const char * string, char * output) memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. padding_message[copy_len] |= 0x80; //The next of a message is 1. - //1-4 + //1-4 //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. if (56 <= copy_len) { MD5_Round_Calculate(padding_message, A,B,C,D); @@ -226,7 +226,7 @@ void MD5_String(const char * string, char * output) { unsigned char digest[16]; - MD5_String2binary(string,digest); + MD5_String2binary(string,(char*)digest); sprintf(output, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", digest[ 0], digest[ 1], digest[ 2], digest[ 3], diff --git a/src/login_sql/md5calc.c b/src/login_sql/md5calc.c index 58cea1246..856c7ecb0 100644 --- a/src/login_sql/md5calc.c +++ b/src/login_sql/md5calc.c @@ -95,7 +95,7 @@ static void MD5_Round_Calculate(const unsigned char *block, //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) unsigned int A=*A2, B=*B2, C=*C2, D=*D2; unsigned int AA = A,BB = B,CC = C,DD = D; - + //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 pX = X; @@ -186,7 +186,7 @@ void MD5_String2binary(const char * string, char * output) memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. padding_message[copy_len] |= 0x80; //The next of a message is 1. - //1-4 + //1-4 //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. if (56 <= copy_len) { MD5_Round_Calculate(padding_message, A,B,C,D); @@ -225,7 +225,7 @@ void MD5_String(const char * string, char * output) { unsigned char digest[16]; - MD5_String2binary(string,digest); + MD5_String2binary(string,(char*)digest); sprintf(output, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", digest[ 0], digest[ 1], digest[ 2], digest[ 3], diff --git a/src/map/clif.c b/src/map/clif.c index 38aa8ab26..7b088068f 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -202,7 +202,7 @@ int clif_countusers(void) struct map_session_data *sd; for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth && + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd && sd->state.auth && !(battle_config.hide_GM_session && pc_isGM(sd))) users++; } @@ -221,7 +221,7 @@ int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...) va_start(ap,func); for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth) + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd && sd->state.auth) func(sd, ap); } va_end(ap); @@ -300,7 +300,7 @@ int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) { switch(type) { case ALL_CLIENT: // 全クライアントに送信 for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) { + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth) { if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version memcpy(WFIFOP(i,0), buf, len); WFIFOSET(i,len); @@ -310,7 +310,7 @@ int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) { break; case ALL_SAMEMAP: // 同じマップの全クライアントに送信 for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) { + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) { if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version memcpy(WFIFOP(i,0), buf, len); WFIFOSET(i,len); @@ -391,7 +391,7 @@ int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) { } } for (i = 0; i < fd_max; i++){ - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) { + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth) { if (sd->partyspy == p->party_id) { if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version memcpy(WFIFOP(sd->fd,0), buf, len); @@ -441,7 +441,7 @@ int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) { } } for (i = 0; i < fd_max; i++){ - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) { + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth) { if (sd->guildspy == g->guild_id) { if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version memcpy(WFIFOP(sd->fd,0), buf, len); @@ -590,7 +590,7 @@ static int clif_set009e(struct flooritem_data *fitem,unsigned char *buf) { *------------------------------------------ */ int clif_dropflooritem(struct flooritem_data *fitem) { - char buf[64]; + unsigned char buf[64]; nullpo_retr(0, fitem); @@ -908,7 +908,7 @@ static int clif_set007b(struct map_session_data *sd,unsigned char *buf) { */ int clif_class_change(struct block_list *bl,int class_,int type) { - char buf[16]; + unsigned char buf[16]; nullpo_retr(0, bl); @@ -927,7 +927,7 @@ int clif_class_change(struct block_list *bl,int class_,int type) *------------------------------------------ */ int clif_mob_class_change(struct mob_data *md, int class_) { - char buf[16]; + unsigned char buf[16]; int view = mob_get_viewclass(class_); nullpo_retr(0, md); @@ -1539,7 +1539,7 @@ void clif_setwaitclose(int fd) { struct map_session_data *sd; // if player is not already in the game (double connection probably) - if ((sd = session[fd]->session_data) == NULL) { + if ((sd = (struct map_session_data*)session[fd]->session_data) == NULL) { // limited timer, just to send information. add_timer(gettick() + 1000, clif_waitclose, fd, 0); } else @@ -1595,7 +1595,7 @@ int clif_changemapserver(struct map_session_data *sd, char *mapname, int x, int *------------------------------------------ */ int clif_fixpos(struct block_list *bl) { - char buf[16]; + unsigned char buf[16]; nullpo_retr(0, bl); @@ -1701,7 +1701,7 @@ int clif_scriptmes(struct map_session_data *sd, int npcid, char *mes) { WFIFOW(fd,0)=0xb4; WFIFOW(fd,2)=strlen(mes)+9; WFIFOL(fd,4)=npcid; - strcpy(WFIFOP(fd,8),mes); + strcpy((char*)WFIFOP(fd,8),mes); WFIFOSET(fd,WFIFOW(fd,2)); return 0; @@ -1754,7 +1754,7 @@ int clif_scriptmenu(struct map_session_data *sd, int npcid, char *mes) { WFIFOW(fd,0)=0xb7; WFIFOW(fd,2)=strlen(mes)+8; WFIFOL(fd,4)=npcid; - strcpy(WFIFOP(fd,8),mes); + strcpy((char*)WFIFOP(fd,8),mes); WFIFOSET(fd,WFIFOW(fd,2)); return 0; @@ -1827,7 +1827,7 @@ int clif_cutin(struct map_session_data *sd, char *image, int type) { fd=sd->fd; WFIFOW(fd,0)=0x1b3; - strncpy(WFIFOP(fd,2),image,64); + strncpy((char*)WFIFOP(fd,2),image,64); WFIFOB(fd,66)=type; WFIFOSET(fd,packet_len_table[0x1b3]); @@ -2841,7 +2841,7 @@ int clif_unequipitemack(struct map_session_data *sd,int n,int pos,int ok) */ int clif_misceffect(struct block_list* bl,int type) { - char buf[32]; + unsigned char buf[32]; nullpo_retr(0, bl); @@ -2875,7 +2875,7 @@ int clif_misceffect2(struct block_list *bl, int type) { */ int clif_changeoption(struct block_list* bl) { - char buf[32]; + unsigned char buf[32]; short option; struct status_change *sc_data; static const int omask[]={ 0x10,0x20 }; @@ -2895,7 +2895,7 @@ int clif_changeoption(struct block_list* bl) WBUFB(buf,12) = 0; // ?? if(bl->type==BL_PC) { // disguises [Valaris] - struct map_session_data *sd=((struct map_session_data *)bl); + struct map_session_data *sd=(struct map_session_data *)bl; if(sd && sd->disguise > 23 && sd->disguise < 4001) { clif_send(buf,packet_len_table[0x119],bl,AREA_WOS); clif_spawnpc(sd); @@ -2942,7 +2942,7 @@ int clif_useitemack(struct map_session_data *sd,int index,int amount,int ok) WFIFOB(fd,6)=ok; WFIFOSET(fd,packet_len_table[0xa8]); #else - char buf[32]; + unsigned char buf[32]; WBUFW(buf,0)=0x1c8; WBUFW(buf,2)=index+2; @@ -2984,19 +2984,19 @@ int clif_createchat(struct map_session_data *sd,int fail) */ int clif_dispchat(struct chat_data *cd,int fd) { - char buf[128]; // 最大title(60バイト)+17 + unsigned char buf[128]; // 最大title(60バイト)+17 if(cd==NULL || *cd->owner==NULL) return 1; WBUFW(buf,0)=0xd7; - WBUFW(buf,2)=strlen(cd->title)+17; + WBUFW(buf,2)=strlen((const char*)cd->title)+17; WBUFL(buf,4)=(*cd->owner)->id; WBUFL(buf,8)=cd->bl.id; WBUFW(buf,12)=cd->limit; WBUFW(buf,14)=cd->users; WBUFB(buf,16)=cd->pub; - strcpy(WBUFP(buf,17),cd->title); + strcpy((char*)WBUFP(buf,17),(const char*)cd->title); if(fd){ memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2)); WFIFOSET(fd,WBUFW(buf,2)); @@ -3014,19 +3014,19 @@ int clif_dispchat(struct chat_data *cd,int fd) */ int clif_changechatstatus(struct chat_data *cd) { - char buf[128]; // 最大title(60バイト)+17 + unsigned char buf[128]; // 最大title(60バイト)+17 if(cd==NULL || cd->usersd[0]==NULL) return 1; WBUFW(buf,0)=0xdf; - WBUFW(buf,2)=strlen(cd->title)+17; + WBUFW(buf,2)=strlen((char*)cd->title)+17; WBUFL(buf,4)=cd->usersd[0]->bl.id; WBUFL(buf,8)=cd->bl.id; WBUFW(buf,12)=cd->limit; WBUFW(buf,14)=cd->users; WBUFB(buf,16)=cd->pub; - strcpy(WBUFP(buf,17),cd->title); + strcpy((char*)WBUFP(buf,17),(const char*)cd->title); clif_send(buf,WBUFW(buf,2),&cd->usersd[0]->bl,CHAT); return 0; @@ -3038,7 +3038,7 @@ int clif_changechatstatus(struct chat_data *cd) */ int clif_clearchat(struct chat_data *cd,int fd) { - char buf[32]; + unsigned char buf[32]; nullpo_retr(0, cd); @@ -3104,7 +3104,7 @@ int clif_joinchatok(struct map_session_data *sd,struct chat_data* cd) */ int clif_addchat(struct chat_data* cd,struct map_session_data *sd) { - char buf[32]; + unsigned char buf[32]; nullpo_retr(0, sd); nullpo_retr(0, cd); @@ -3123,7 +3123,7 @@ int clif_addchat(struct chat_data* cd,struct map_session_data *sd) */ int clif_changechatowner(struct chat_data* cd,struct map_session_data *sd) { - char buf[64]; + unsigned char buf[64]; nullpo_retr(0, sd); nullpo_retr(0, cd); @@ -3146,7 +3146,7 @@ int clif_changechatowner(struct chat_data* cd,struct map_session_data *sd) */ int clif_leavechat(struct chat_data* cd,struct map_session_data *sd) { - char buf[32]; + unsigned char buf[32]; nullpo_retr(0, sd); nullpo_retr(0, cd); @@ -3173,7 +3173,7 @@ int clif_traderequest(struct map_session_data *sd,char *name) fd=sd->fd; WFIFOW(fd,0)=0xe5; - strcpy(WFIFOP(fd,2),name); + strcpy((char*)WFIFOP(fd,2),name); WFIFOSET(fd,packet_len_table[0xe5]); return 0; @@ -3897,7 +3897,7 @@ int clif_clearchar_skillunit(struct skill_unit *unit,int fd) */ int clif_01ac(struct block_list *bl) { - char buf[32]; + unsigned char buf[32]; nullpo_retr(0, bl); @@ -4579,10 +4579,10 @@ int clif_skill_warppoint(struct map_session_data *sd,int skill_num, fd=sd->fd; WFIFOW(fd,0)=0x11c; WFIFOW(fd,2)=skill_num; - strncpy(WFIFOP(fd, 4),map1,16); - strncpy(WFIFOP(fd,20),map2,16); - strncpy(WFIFOP(fd,36),map3,16); - strncpy(WFIFOP(fd,52),map4,16); + strncpy((char*)WFIFOP(fd, 4),map1,16); + strncpy((char*)WFIFOP(fd,20),map2,16); + strncpy((char*)WFIFOP(fd,36),map3,16); + strncpy((char*)WFIFOP(fd,52),map4,16); WFIFOSET(fd,packet_len_table[0x11c]); return 0; } @@ -4824,11 +4824,12 @@ int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type) WFIFOL(sd->fd,10) = pvpnum; WFIFOSET(sd->fd,packet_len_table[0x19a]); } else { - char buf[32]; + unsigned char buf[32]; WBUFW(buf,0) = 0x19a; WBUFL(buf,2) = sd->bl.id; if(sd->status.option&0x46) + // WTF? a -1 to an unsigned value... WBUFL(buf,6) = -1; else if(pvprank<=0) @@ -4851,7 +4852,7 @@ int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type) int clif_send0199(int map,int type) { struct block_list bl; - char buf[16]; + unsigned char buf[16]; bl.m = map; WBUFW(buf,0)=0x199; @@ -5117,7 +5118,7 @@ int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const ch if(range < 0) range = battle_get_range(&sd->bl) - (range + 1); WFIFOW(fd,12)=range; - strncpy(WFIFOP(fd,14),name,24); + strncpy((char*)WFIFOP(fd,14),name,24); WFIFOB(fd,38)=0; WFIFOSET(fd,packet_len_table[0x147]); return 0; @@ -5360,7 +5361,7 @@ int clif_showvendingboard(struct block_list* bl,char *message,int fd) WBUFW(buf,0)=0x131; WBUFL(buf,2)=bl->id; - strncpy(WBUFP(buf,6),message,80); + strncpy((char*)WBUFP(buf,6),message,80); if(fd){ memcpy(WFIFOP(fd,0),buf,packet_len_table[0x131]); WFIFOSET(fd,packet_len_table[0x131]); @@ -5807,7 +5808,7 @@ int clif_hpmeter(struct map_session_data *sd) WBUFW(buf,8)=sd->bl.y; for(i=0;isession_data) && md->state.auth && + if(session[i] && (md = (struct map_session_data*)session[i]->session_data) && md->state.auth && md->bl.m == sd->bl.m && pc_isGM(md) && sd != md){ memcpy(WFIFOP(i,0),buf,packet_len_table[0x107]); WFIFOSET(i,packet_len_table[0x107]); @@ -5819,7 +5820,7 @@ int clif_hpmeter(struct map_session_data *sd) WBUFW(buf2,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp; WBUFW(buf2,8)=(sd->status.max_hp > 0x7fff)? 0x7fff:sd->status.max_hp; for(i=0;isession_data) && md->state.auth && + if(session[i] && (md = (struct map_session_data*)session[i]->session_data) && md->state.auth && md->bl.m == sd->bl.m && pc_isGM(md) && sd != md){ memcpy(WFIFOP(i,0),buf2,packet_len_table[0x106]); WFIFOSET(i,packet_len_table[0x106]); @@ -6234,7 +6235,7 @@ int clif_bladestop(struct block_list *src,struct block_list *dst, int clif_changemapcell(int m,int x,int y,int cell_type,int type) { struct block_list bl; - char buf[32]; + unsigned char buf[32]; bl.m = m; bl.x = x; @@ -6424,32 +6425,32 @@ int clif_guild_basicinfo(struct map_session_data *sd) if(g->guild_id == gc->guild_id) t++; } - if (t==1) strncpy(WFIFOP(fd,94),"One Castle",20); - else if (t==2) strncpy(WFIFOP(fd,94),"Two Castles",20); - else if (t==3) strncpy(WFIFOP(fd,94),"Three Castles",20); - else if (t==4) strncpy(WFIFOP(fd,94),"Four Castles",20); - else if (t==5) strncpy(WFIFOP(fd,94),"Five Castles",20); - else if (t==6) strncpy(WFIFOP(fd,94),"Six Castles",20); - else if (t==7) strncpy(WFIFOP(fd,94),"Seven Castles",20); - else if (t==8) strncpy(WFIFOP(fd,94),"Eight Castles",20); - else if (t==9) strncpy(WFIFOP(fd,94),"Nine Castles",20); - else if (t==10) strncpy(WFIFOP(fd,94),"Ten Castles",20); - else if (t==11) strncpy(WFIFOP(fd,94),"Eleven Castles",20); - else if (t==12) strncpy(WFIFOP(fd,94),"Twelve Castles",20); - else if (t==13) strncpy(WFIFOP(fd,94),"Thirteen Castles",20); - else if (t==14) strncpy(WFIFOP(fd,94),"Fourteen Castles",20); - else if (t==15) strncpy(WFIFOP(fd,94),"Fifteen Castles",20); - else if (t==16) strncpy(WFIFOP(fd,94),"Sixteen Castles",20); - else if (t==17) strncpy(WFIFOP(fd,94),"Seventeen Castles",20); - else if (t==18) strncpy(WFIFOP(fd,94),"Eighteen Castles",20); - else if (t==19) strncpy(WFIFOP(fd,94),"Nineteen Castles",20); - else if (t==20) strncpy(WFIFOP(fd,94),"Twenty Castles",20); - else if (t==21) strncpy(WFIFOP(fd,94),"Twenty One Castles",20); - else if (t==22) strncpy(WFIFOP(fd,94),"Twenty Two Castles",20); - else if (t==23) strncpy(WFIFOP(fd,94),"Twenty Three Castles",20); - else if (t==24) strncpy(WFIFOP(fd,94),"Twenty Four Castles",20); - else if (t==MAX_GUILDCASTLE) strncpy(WFIFOP(fd,94),"Total Domination",20); - else strncpy(WFIFOP(fd,94),"None Taken",20); + if (t==1) strncpy((char*)WFIFOP(fd,94),"One Castle",20); + else if (t==2) strncpy((char*)WFIFOP(fd,94),"Two Castles",20); + else if (t==3) strncpy((char*)WFIFOP(fd,94),"Three Castles",20); + else if (t==4) strncpy((char*)WFIFOP(fd,94),"Four Castles",20); + else if (t==5) strncpy((char*)WFIFOP(fd,94),"Five Castles",20); + else if (t==6) strncpy((char*)WFIFOP(fd,94),"Six Castles",20); + else if (t==7) strncpy((char*)WFIFOP(fd,94),"Seven Castles",20); + else if (t==8) strncpy((char*)WFIFOP(fd,94),"Eight Castles",20); + else if (t==9) strncpy((char*)WFIFOP(fd,94),"Nine Castles",20); + else if (t==10) strncpy((char*)WFIFOP(fd,94),"Ten Castles",20); + else if (t==11) strncpy((char*)WFIFOP(fd,94),"Eleven Castles",20); + else if (t==12) strncpy((char*)WFIFOP(fd,94),"Twelve Castles",20); + else if (t==13) strncpy((char*)WFIFOP(fd,94),"Thirteen Castles",20); + else if (t==14) strncpy((char*)WFIFOP(fd,94),"Fourteen Castles",20); + else if (t==15) strncpy((char*)WFIFOP(fd,94),"Fifteen Castles",20); + else if (t==16) strncpy((char*)WFIFOP(fd,94),"Sixteen Castles",20); + else if (t==17) strncpy((char*)WFIFOP(fd,94),"Seventeen Castles",20); + else if (t==18) strncpy((char*)WFIFOP(fd,94),"Eighteen Castles",20); + else if (t==19) strncpy((char*)WFIFOP(fd,94),"Nineteen Castles",20); + else if (t==20) strncpy((char*)WFIFOP(fd,94),"Twenty Castles",20); + else if (t==21) strncpy((char*)WFIFOP(fd,94),"Twenty One Castles",20); + else if (t==22) strncpy((char*)WFIFOP(fd,94),"Twenty Two Castles",20); + else if (t==23) strncpy((char*)WFIFOP(fd,94),"Twenty Three Castles",20); + else if (t==24) strncpy((char*)WFIFOP(fd,94),"Twenty Four Castles",20); + else if (t==MAX_GUILDCASTLE) strncpy((char*)WFIFOP(fd,94),"Total Domination",20); + else strncpy((char*)WFIFOP(fd,94),"None Taken",20); WFIFOSET(fd,packet_len_table[WFIFOW(fd,0)]); clif_guild_emblem(sd,g); // Guild emblem vanish fix [Valaris] @@ -7251,7 +7252,7 @@ int clif_specialeffect(struct block_list *bl, int type, int flag) { struct map_session_data *pl_sd; int i; for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) != NULL && + if (session[i] && (pl_sd = (struct map_session_data*)session[i]->session_data) != NULL && pl_sd->state.auth && (pc_isGM((struct map_session_data *)&bl) > pc_isGM((struct map_session_data *)&pl_sd->bl))) clif_specialeffect(&pl_sd->bl, type, 1); @@ -7261,7 +7262,7 @@ int clif_specialeffect(struct block_list *bl, int type, int flag) { struct map_session_data *sd; int i; for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) + if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) clif_specialeffect(&sd->bl, type, 1); } } @@ -7342,7 +7343,7 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) if (sd != 0) clif_setwaitclose(sd->fd); // Set session to EOF } else { - sd = session[fd]->session_data = (struct map_session_data*)aCalloc(1, sizeof(struct map_session_data)); + sd = (struct map_session_data*)session[fd]->session_data = (struct map_session_data*)aCalloc(1, sizeof(struct map_session_data)); sd->fd = fd; if (IS_PACKET_DB_VER(cmd)) { @@ -7885,27 +7886,27 @@ void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) { */ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c .w .?B char *message; - char *buf; + unsigned char *buf; nullpo_retv(sd); - if ((is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None) || - (is_charcommand(fd, sd, RFIFOP(fd,4),0)!= CharCommand_None) || + if ((is_atcommand(fd, sd, (char*)RFIFOP(fd,4), 0) != AtCommand_None) || + (is_charcommand(fd, sd, (char*)RFIFOP(fd,4),0)!= CharCommand_None) || (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 || //バーサーク時は会話も不可 sd->sc_data[SC_NOCHAT].timer != -1 ))) //チャット禁止 return; message = (char*)aCallocA(RFIFOW(fd,2) + 128, sizeof(char)); - buf = (char*)aCallocA(RFIFOW(fd,2) + 4, sizeof(char)); + buf = (unsigned char*)aCallocA(RFIFOW(fd,2) + 4, sizeof(char)); //printf("clif_parse_GlobalMessage: message: '%s'.\n", RFIFOP(fd,4)); - if (strncmp(RFIFOP(fd,4), sd->status.name, strlen(sd->status.name)) != 0) { + if (strncmp((char*)RFIFOP(fd,4), sd->status.name, strlen(sd->status.name)) != 0) { printf("Hack on global message: character '%s' (account: %d), use an other name to send a (normal) message.\n", sd->status.name, sd->status.account_id); // information is sended to all online GM sprintf(message, "Hack on global message (normal message): character '%s' (account: %d) uses another name.", sd->status.name, sd->status.account_id); intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message, strlen(message) + 1); - if (strlen(RFIFOP(fd,4)) == 0) + if (strlen((char*)RFIFOP(fd,4)) == 0) strcpy(message, " This player sends a void name and a void message."); else sprintf(message, " This player sends (name:message): '%s'.", RFIFOP(fd,4)); @@ -7946,16 +7947,16 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c < if (pc_calc_base_job2 (sd->status.class_) == 23 ) { int next = pc_nextbaseexp(sd)>0 ? pc_nextbaseexp(sd) : sd->status.base_exp; if ((sd->status.base_exp*100/next)%10 == 0) { - estr_lower(RFIFOP(fd,4)); - if (sd->state.snovice_flag == 0 && strstr(RFIFOP(fd,4), msg_txt(540))) + estr_lower((char*)RFIFOP(fd,4)); + if (sd->state.snovice_flag == 0 && strstr((char*)RFIFOP(fd,4), msg_txt(540))) sd->state.snovice_flag = 1; else if (sd->state.snovice_flag == 1) { sprintf(message, msg_txt(541), sd->status.name); estr_lower(message); - if (strstr(RFIFOP(fd,4), message)) + if (strstr((char*)RFIFOP(fd,4), message)) sd->state.snovice_flag = 2; } - else if (sd->state.snovice_flag == 2 && strstr(RFIFOP(fd,4), msg_txt(542))) + else if (sd->state.snovice_flag == 2 && strstr((char*)RFIFOP(fd,4), msg_txt(542))) sd->state.snovice_flag = 3; else if (sd->state.snovice_flag == 3) { int i; @@ -8292,7 +8293,7 @@ void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 .w status.name, RFIFOP(fd,28)); if ((is_charcommand(fd, sd, gm_command, 0) != CharCommand_None) || @@ -8308,16 +8309,16 @@ void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 .w status.name, RFIFOP(fd,4)) != 0) // not exactly same name + strcmp(dstsd->status.name, (const char*)RFIFOP(fd,4)) != 0) // not exactly same name // send message to inter-server - intif_wis_message(sd, RFIFOP(fd,4), RFIFOP(fd,28), RFIFOW(fd,2)-28); + intif_wis_message(sd, (char*)RFIFOP(fd,4), (char*)RFIFOP(fd,28), RFIFOW(fd,2)-28); // player is on this map-server else { // if you send to your self, don't send anything to others @@ -8336,7 +8337,7 @@ void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 .w fd, sd->status.name, RFIFOP(fd,28), RFIFOW(fd,2) - 28); + clif_wis_message(dstsd->fd, sd->status.name, (char*)RFIFOP(fd,28), RFIFOW(fd,2) - 28); clif_wis_end(fd, 0); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target } } @@ -8356,7 +8357,7 @@ void clif_parse_GMmessage(int fd, struct map_session_data *sd) { if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && (pc_isGM(sd) >= get_atcommand_level(AtCommand_Broadcast))) - intif_GMmessage(RFIFOP(fd,4), RFIFOW(fd,2)-4, 0); + intif_GMmessage((char*)RFIFOP(fd,4), RFIFOW(fd,2)-4, 0); } /*========================================== @@ -8688,7 +8689,7 @@ void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd) void clif_parse_CreateChatRoom(int fd,struct map_session_data *sd) { if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 4){ - chat_createchat(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15); + chat_createchat(sd,RFIFOW(fd,4),RFIFOB(fd,6),(char*)RFIFOP(fd,7),(char*)RFIFOP(fd,15),RFIFOW(fd,2)-15); } else clif_skill_fail(sd,1,0,3); } @@ -8699,7 +8700,7 @@ void clif_parse_CreateChatRoom(int fd,struct map_session_data *sd) */ void clif_parse_ChatAddMember(int fd,struct map_session_data *sd) { - chat_joinchat(sd,RFIFOL(fd,2),RFIFOP(fd,6)); + chat_joinchat(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6)); } /*========================================== @@ -8708,7 +8709,7 @@ void clif_parse_ChatAddMember(int fd,struct map_session_data *sd) */ void clif_parse_ChatRoomStatusChange(int fd,struct map_session_data *sd) { - chat_changechatstatus(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15); + chat_changechatstatus(sd,RFIFOW(fd,4),RFIFOB(fd,6),(char*)RFIFOP(fd,7),(char*)RFIFOP(fd,15),RFIFOW(fd,2)-15); } /*========================================== @@ -8717,7 +8718,7 @@ void clif_parse_ChatRoomStatusChange(int fd,struct map_session_data *sd) */ void clif_parse_ChangeChatOwner(int fd,struct map_session_data *sd) { - chat_changechatowner(sd,RFIFOP(fd,6)); + chat_changechatowner(sd,(char*)RFIFOP(fd,6)); } /*========================================== @@ -8726,7 +8727,7 @@ void clif_parse_ChangeChatOwner(int fd,struct map_session_data *sd) */ void clif_parse_KickFromChat(int fd,struct map_session_data *sd) { - chat_kickchat(sd,RFIFOP(fd,2)); + chat_kickchat(sd,(char*)RFIFOP(fd,2)); } /*========================================== @@ -9196,7 +9197,7 @@ void clif_parse_UseSkillMap(int fd,struct map_session_data *sd) if(sd->invincible_timer != -1) pc_delinvincibletimer(sd); - skill_castend_map(sd,RFIFOW(fd,2),RFIFOP(fd,4)); + skill_castend_map(sd,RFIFOW(fd,2),(char*)RFIFOP(fd,4)); } /*========================================== * メモ要求 @@ -9269,7 +9270,7 @@ void clif_parse_NpcStringInput(int fd,struct map_session_data *sd) memcpy(sd->npc_str,RFIFOP(fd,8),sizeof(sd->npc_str)); sd->npc_str[sizeof(sd->npc_str)-1]=0; } else - strcpy(sd->npc_str,RFIFOP(fd,8)); + strcpy(sd->npc_str,(char*)RFIFOP(fd,8)); npc_scriptcont(sd,RFIFOL(fd,4)); } @@ -9590,7 +9591,7 @@ void clif_parse_CloseKafra(int fd, struct map_session_data *sd) { */ void clif_parse_CreateParty(int fd, struct map_session_data *sd) { if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7) { - party_create(sd,RFIFOP(fd,2)); + party_create(sd,(char*)RFIFOP(fd,2)); } else clif_skill_fail(sd,1,0,4); } @@ -9601,9 +9602,9 @@ void clif_parse_CreateParty(int fd, struct map_session_data *sd) { */ void clif_parse_CreateParty2(int fd, struct map_session_data *sd) { if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7){ - party_create(sd, RFIFOP(fd,2)); + party_create(sd,(char*)RFIFOP(fd,2)); } else - clif_skill_fail(sd, 1, 0, 4); + clif_skill_fail(sd,1,0,4); } /*========================================== @@ -9640,7 +9641,7 @@ void clif_parse_LeaveParty(int fd, struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) { - party_removemember(sd,RFIFOL(fd,2),RFIFOP(fd,6)); + party_removemember(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6)); } /*========================================== @@ -9657,16 +9658,16 @@ void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) { */ void clif_parse_PartyMessage(int fd, struct map_session_data *sd) { nullpo_retv(sd); - if (is_charcommand(fd, sd, RFIFOP(fd,4), 0) != CharCommand_None) + if (is_charcommand(fd, sd, (char*)RFIFOP(fd,4), 0) != CharCommand_None) return; - if (is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None) + if (is_atcommand(fd, sd, (char*)RFIFOP(fd,4), 0) != AtCommand_None) return; if(sd->sc_data && (sd->sc_data[SC_BERSERK].timer!=-1 || //バーサーク時は会話も不可 sd->sc_data[SC_NOCHAT].timer!=-1)) //チャット禁止 return; - party_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4); + party_send_message(sd, (char*)RFIFOP(fd,4), RFIFOW(fd,2)-4); } /*========================================== @@ -9702,7 +9703,7 @@ void clif_parse_PurchaseReq(int fd, struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_OpenVending(int fd,struct map_session_data *sd) { - vending_openvending(sd, RFIFOW(fd,2), RFIFOP(fd,4), RFIFOB(fd,84), RFIFOP(fd,85)); + vending_openvending(sd, RFIFOW(fd,2), (char*)RFIFOP(fd,4), RFIFOB(fd,84), RFIFOP(fd,85)); } /*========================================== @@ -9735,7 +9736,7 @@ void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_CreateGuild(int fd,struct map_session_data *sd) { - guild_create(sd, RFIFOP(fd,6)); + guild_create(sd, (char*)RFIFOP(fd,6)); } /*========================================== @@ -9785,7 +9786,7 @@ void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) { int i; for(i = 4; i < RFIFOW(fd,2); i += 40 ){ - guild_change_position(sd, RFIFOL(fd,i), RFIFOL(fd,i+4), RFIFOL(fd,i+12), RFIFOP(fd,i+16)); + guild_change_position(sd, RFIFOL(fd,i), RFIFOL(fd,i+4), RFIFOL(fd,i+12), (char*)RFIFOP(fd,i+16)); } } @@ -9819,7 +9820,7 @@ void clif_parse_GuildRequestEmblem(int fd,struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) { - guild_change_emblem(sd,RFIFOW(fd,2)-4,RFIFOP(fd,4)); + guild_change_emblem(sd,RFIFOW(fd,2)-4,(char*)RFIFOP(fd,4)); } /*========================================== @@ -9827,7 +9828,7 @@ void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_GuildChangeNotice(int fd,struct map_session_data *sd) { - guild_change_notice(sd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66)); + guild_change_notice(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6),(char*)RFIFOP(fd,66)); } /*========================================== @@ -9851,7 +9852,7 @@ void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_GuildLeave(int fd,struct map_session_data *sd) { - guild_leave(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14)); + guild_leave(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),(char*)RFIFOP(fd,14)); } /*========================================== @@ -9859,7 +9860,7 @@ void clif_parse_GuildLeave(int fd,struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_GuildExplusion(int fd,struct map_session_data *sd) { - guild_explusion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14)); + guild_explusion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),(char*)RFIFOP(fd,14)); } /*========================================== @@ -9868,16 +9869,16 @@ void clif_parse_GuildExplusion(int fd,struct map_session_data *sd) { */ void clif_parse_GuildMessage(int fd,struct map_session_data *sd) { nullpo_retv(sd); - if (is_charcommand(fd, sd, RFIFOP(fd, 4), 0) != CharCommand_None) + if (is_charcommand(fd, sd, (char*)RFIFOP(fd, 4), 0) != CharCommand_None) return; - if (is_atcommand(fd, sd, RFIFOP(fd, 4), 0) != AtCommand_None) + if (is_atcommand(fd, sd, (char*)RFIFOP(fd, 4), 0) != AtCommand_None) return; if(sd->sc_data && (sd->sc_data[SC_BERSERK].timer!=-1 || //バーサーク時は会話も不可 sd->sc_data[SC_NOCHAT].timer!=-1)) //チャット禁止 return; - guild_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4); + guild_send_message(sd, (char*)RFIFOP(fd,4), RFIFOW(fd,2)-4); } /*========================================== @@ -9917,7 +9918,7 @@ void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) { *------------------------------------------ */ void clif_parse_GuildBreak(int fd, struct map_session_data *sd) { - guild_break(sd,RFIFOP(fd,2)); + guild_break(sd,(char*)RFIFOP(fd,2)); } // pet @@ -9941,7 +9942,7 @@ void clif_parse_SendEmotion(int fd, struct map_session_data *sd) { } void clif_parse_ChangePetName(int fd, struct map_session_data *sd) { - pet_change_name(sd,RFIFOP(fd,2)); + pet_change_name(sd,(char*)RFIFOP(fd,2)); } // Kick (right click menu for GM "(name) force to quit") @@ -10081,7 +10082,7 @@ void clif_parse_GMReqNoChatCount(int fd, struct map_session_data *sd) WFIFOW(fd,0) = 0x1e0; WFIFOL(fd,2) = tid; - sprintf(WFIFOP(fd,6),"%d",tid); + sprintf((char*)WFIFOP(fd,6),"%d",tid); // memcpy(WFIFOP(fd,6), "TESTNAME", 24); WFIFOSET(fd, packet_len_table[0x1e0]); @@ -10095,7 +10096,7 @@ void clif_parse_PMIgnore(int fd, struct map_session_data *sd) { // Rewritten by memset(output, '\0', sizeof(output)); - nick = RFIFOP(fd,2); // speed up + nick = (char*)RFIFOP(fd,2); // speed up RFIFOB(fd,25) = '\0'; // to be sure that the player name have at maximum 23 characters //printf("Ignore: char '%s' state: %d\n", nick, RFIFOB(fd,26)); @@ -10216,7 +10217,7 @@ void clif_parse_skillMessage(int fd, struct map_session_data *sd) { // Added by y = RFIFOB(fd,6); x = RFIFOB(fd,8); - mes = RFIFOP(fd,10); + mes = (char*)RFIFOP(fd,10); // skill 220 = graffiti // printf("skill: %d %d location: %3d %3d message: %s\n", skillid, skilllv, x, y, (char*)mes); @@ -10292,7 +10293,7 @@ void clif_parse_friends_list_add(int fd, struct map_session_data *sd) { struct map_session_data *f_sd; int i; - f_sd = map_nick2sd(RFIFOP(fd,2)); + f_sd = map_nick2sd((char*)RFIFOP(fd,2)); // Friend doesn't exist (no player with this name) if (f_sd == NULL) { @@ -10504,7 +10505,7 @@ static int clif_parse(int fd) { int packet_len = 0, cmd, packet_ver; struct map_session_data *sd; - sd = session[fd]->session_data; + sd = (struct map_session_data*)session[fd]->session_data; // 接続が切れてるので後始末 if (!chrif_isconnect() || session[fd]->eof) { // char鯖に繋がってない間は接続禁止 (!chrif_isconnect()) -- cgit v1.2.3-70-g09d2 From f65bf4bd28cd9240c889bfd2a1f4650d91760a2d Mon Sep 17 00:00:00 2001 From: celest Date: Tue, 22 Feb 2005 16:08:24 +0000 Subject: * Corrected Spiral Pierce's hits in the skill_db * Moved /common/*.o into a obj folder when compiling * Updated core and map server to jA 1094~1115 git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@1162 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-SVN.txt | 20 + Readme-jap | 2939 +++++++++++++++++++++++++++++++++++++- db/skill_cast_db.txt | 20 +- db/skill_db.txt | 2 +- db/skill_unit_db.txt | 78 + src/char/Makefile | 2 +- src/char_sql/Makefile | 2 +- src/common/Makefile | 34 +- src/common/core.c | 74 +- src/common/db.c | 20 +- src/common/db.h | 10 +- src/common/grfio.c | 55 +- src/common/malloc.c | 484 ++++++- src/common/malloc.h | 8 +- src/ladmin/Makefile | 2 +- src/login/Makefile | 2 +- src/login_sql/Makefile | 2 +- src/map/Makefile | 102 +- src/map/atcommand.c | 52 +- src/map/atcommand.h | 2 + src/map/battle.c | 16 +- src/map/chrif.c | 11 + src/map/chrif.h | 1 + src/map/guild.c | 10 +- src/map/itemdb.c | 18 +- src/map/map.c | 152 +- src/map/map.h | 39 +- src/map/mob.c | 98 +- src/map/path.c | 2 +- src/map/pc.c | 93 +- src/map/skill.c | 2822 +++++++++++++++--------------------- src/map/skill.h | 36 +- src/map/status.c | 31 +- src/map/status.h | 2 +- src/txt-converter/char/Makefile | 2 +- src/txt-converter/login/Makefile | 2 +- 36 files changed, 5225 insertions(+), 2020 deletions(-) create mode 100644 db/skill_unit_db.txt (limited to 'src/common/malloc.c') diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt index f6c7813ce..0703d2cb9 100644 --- a/Changelog-SVN.txt +++ b/Changelog-SVN.txt @@ -1,5 +1,25 @@ Date Added +02/23 + * Corrected Spiral Pierce's hits in the skill_db [celest] + * Moved /common/*.o into a obj folder when compiling [celest] + * Updated core and map server to jA 1094~1115 [celest] + - Added End_of_exam's Memory Manager for detecting memory problems. + To enable remove the // in malloc.c line 11 + // #define USE_MEMMGR + - Added @npctalk and @pettalk + - Added support for jA's local zlib + - Fixed a bug with path search long + - Updated malloc.c to support Memwatch + - Added DB data loss detection + - Added db/skill_unit_db.txt + - Updated skill unit system + - Changed Waterball to the new timerskill system + ~ For more detailed logs check 'Readme-jap' (knowledge in japanese required, + obviously ^^;) + Please test if there's any skills that might have suddenly stopped working, + thanks ^^; + 02/22 * Revised New Cards, added missing effects, fixed bugs [Lupus] ~20 cards to check left 8) But in 22 Feb some new cards have been announced T__T' diff --git a/Readme-jap b/Readme-jap index 6bf23c87b..9956e4bd0 100644 --- a/Readme-jap +++ b/Readme-jap @@ -1,3 +1,2923 @@ +-------------------- +//1114-fix1 by 稀枝 + +・zlibをmap-server内部に取り込めるオプションを追加 +・makeがMinGW+Msysで正常に通るよう修正 +・win32_start.batにチェック追加 + + (src/common/zlib) + trees.h - anybody's guess上のzlib_1_2_1_staticlibより取り込み + inffixed.h - 同上 + inffast.h - 同上 + crc32.h - 同上 + compress.c - 同上 + deflate.h - 同上 + inftrees.h - 同上 + zutil.c - 同上 + crc32.c - 同上 + inflate.h - 同上 + inffast.c - 同上 + trees.c - 同上 + inflate.c - 同上 + zconf.h - 同上 + deflate.c - 同上 + inftrees.c - 同上 + zutil.h - 同上 + zlib.h - 同上 + adler32.c - 同上 + Makefile - LOCALZLIBが指定されている時のみコンパイルします。 + + (src/map/) + Makefile - MinGWの場合、引数-wsock32を追加します。 + - LOCALZLIBが指定されている場合リンクします。 + - LOCALZLIBが無い場合だけzlib.aをリンクします。 + (src/char/) + Makefile - MinGWの場合、引数-wsock32を追加します。 + (src/login/) + Makefile - MinGWの場合、引数-wsock32を追加します。 + (src/common/grfio.c) - Zlibを内包した際に_WIN32と競合しないよう変更 + - zlib_win32.h zconf_win32.hを廃止 + + (./) + Makefile - #Link Zlib(NOTrecommended)、zlibを内包します。 + win32_start.bat - athena-startの半クローン化。初期起動でこけなくなるはずです。 + +-------------------- +//1113 by End_of_exam + +・linux 環境で大量のwarning が出ていたのを修正(malloc.h) +・map_quit() でcharid_db のデータを削除しないように変更(map.c thanks to lemitさん) +・pc_eventtimer(), npc_event_timer() のfree()で警告が出ていたのを修正(pc.c npc.c) +・map_eraseipport() がメモリリークしていたバグを修正(map.c) +・addtimer 命令に指定するイベント名が23文字に制限されていたのを無制限にする(pc.c) +・pc_cleareventtimer() , pc_deleventtimer() がメモリリークしていたバグを修正 + (pc.c thanks to Shinomoriさん) + + (src/common/) + malloc.h - "#undef strdup" を追加 + + (src/map/) + npc.c - npc_event_timer() 修正 + pc.c - pc_eventtimer() , pc_addeventtimer() , pc_cleareventtimer(), + pc_deleventtimer() 修正 + map.c - map_quit() , map_eraseipport() 修正 + +-------------------- +//1112 by lizorett +・PCがマップ移動中に、そのPCが設置したスキルユニットのskill_unit_onoutが呼ばれ +ない問題(map-severが落ちる可能性あり)を修正 +・バジリカを仕様に併せて修正 +・正常終了時にchar-serverがコアダンプする問題を修正 +・mobがウォータボール使用時のヒット数を修正(skill_db.txtに指定した数ヒット) +・コーティングされている場合にはストリップできないよう変更 +・属性場を使用した際、前に出していた属性場が消えないことがある問題を修正 + + (db) + skill_db.txt + - mobのウォータボールのカウント数をDBにいれた + skill_unit_db.txt + - バジリカを修正 + (char) + char.c - do_final()のchar_datのメモリ開放位置を変更 + (map) + clif.c - バジリカ時に攻撃などができないよう変更 + map.c - バジリカ位置をセルのフラグに入れるよう変更 + map.h - バジリカ用のセルフラグ追加 + mob.c - バジリカに進入できないように変更 + pc.c - 移動時(蝿など)にバジリカを消すよう修正 + skill.c - バジリカ修正 + - ウォータボール修正 + - skill_unit_onoutの呼び出しを修正 + - コーティングされている箇所はストリップ不可に変更 + +-------------------- +//1111 by Toshi^2 +・pc系mobに転生&養子を指定できるように変更。 + db/mob_avail.txtに説明文を追加したので、それを参照してください。 + + (db) + mob_avail.txt - 引数の説明を追加。 + (src/map) + clif.c - clif_mob0078() clif_mob007b() clif_pet0078() clif_pet007b() 修正 + mob.c - mob_readdb_mobavail() 修正 + mob.h - 構造体mob_dbに「short trans」を追加、mob_availのtransフラグを格納。 + +-------------------- +//1110 by lizorett +・ユニット系スキル(ニュマ、ダンス等)でmap_server.exeが落ちる問題を修正 + (トレースではskill_unit_onplace/skill_unit_onoutで落ちる) +・サンクチュアリの人数カウント方法を変更(本鯖仕様) +・マグヌスの範囲を広げ、使用したユニットが削除されるようにする(本鯖仕様) +・デボーションの距離が短くなる問題を修正(バグ報告スレッド part8 >>15) +・デボーションでnullpoが出る問題を修正 +・mobのインティミデイトが成功するとmap-serverが落ちる問題を修正(バグ報告スレッ +ド part8 >>42) +・ウォーターボールの仕様を本鯖に近づける(水場が少ない場合にはhit数が減る、 +デリュージ上で実行するとユニットが欠ける) +・ファーマシーの製造成功確率のコードを変更 + + (db) + skill_unit_db.txt + - ユニットID/配置などをdb化しています + (src/map) + map.h - skill_unit_groupのメンバ変更 + mob.c - 移動時にスキルユニット判断(skill_unit_out_all/skill_unit_move) + を追加 + - 足元置き/重複置き判断を変更 + pc.c - 移動時にスキルユニット判断(同上)を追加 + - 無敵時間が終わる際にスキルユニット判断(同上)を追加 + skill.h - skill_dbの参照関数をdefineに変更 + - スキル配置を入れるskill_unit_layout構造体を定義 + - SC_WATERBALL削除 + skill.c - unit_idをdb化(skill_unit_db.txt) + - スキルユニットのレイアウトを起動時に定義 + - 移動時にスキルユニット判断(同上)を追加 + - 足元置き/重複置き判断を変更 + - スキルユニットの移動処理を変更 + - デボーションの修正 + - mobのインティミデイトで落ちる問題を修正 + - ウォータボールの仕様変更 + status.c- SC_WATERBALLの処理を削除 + +-------------------- +//1109 by End_of_exam + +1108に引き続きメモリリークのバグ修正です。2つ共に深刻なバグなので、 +最新版に更新しない方でも修正することをおすすめします。 + +・ペットが床にアイテムを落とす時、ペットを卵に戻す時にメモリリークが発生 + していたバグを修正。(pet.c) + +・キャラクター依存一時変数の利用したキャラがログアウトするとメモリリークが + 発生していたバグを修正(map.c) + + (src/map) + map.c - map_quit() 修正 + pet.c - pet_remove_map(), pet_return_egg() pet_lootitem_drop() 修正 + +-------------------- +//1108 by End_of_exam + +・以前作ったメモリマネージャーを統合。(malloc.c core.c) + 有効にするには、malloc.c内部のコメントを外す必要があります。開発に協力して + 頂ける方は、メモリマネージャを有効にして、チェック結果(map-server.logなど)を + アップロードしてくれると助かります。 + +  1. guild.c がコンパイルエラーになったので修正(guild.c) +  2. pet.c がメモリ解放し忘れていたので、do_final_pet() を追加(pet.c) +  3. do_final_socket を追加して、終了時に全ての接続を切断する(socket.c) +  4. deplicate の元スクリプトが終了時にfreeされないバグを修正(npc.c) +  5. do_final_script で開放されないメモリがあるバグを修正(script.c) +  6. do_init_*** の呼ばれる順番がおかしかったのを修正(map.c) +  7. イベント名が重複したときにメッセージを出すように変更(npc.c) +  8. map_quit() 内部でcharid_db をfreeし忘れているバグを修正(map.c) + + 特に8.は最重要で、キャラがログアウトする度にメモリリークが発生するという、 + 最悪な結果になっていました。気になる方は修正しておきましょう。 + +・delete_session でNULLチェックを怠っていたバグを修正(socket.c) +・chrif_disconnect_sub でdelete_session を呼ぶように変更(chrif.c) +・マルチラインコメント(/* 〜 */)の解析を忘れていたバグを修正(npc.c) +・銀行などのNPC でZenyがMAX_ZENYにならないバグを修正(pc.c) +・1107の製造確率が一部消されていたのを修正(skill.c thanks to lizorettさん) +・セージ転職試験のイベントが衝突を起こしていたのを修正(npc.c) +  npc_parse_script : dup event jobsage_2nd::OnTimer150000 +  npc_parse_script : dup event jobsage_2nd::OnTimer30000 +  npc_parse_script : dup event jobsage_success::OnTimer7000 +  npc_parse_script : dup event jobsage_success::OnTimer3000 + + (src/common) + core.c - do_init_memmgr() 追加 + malloc.c - メモリマネージャの追加 + malloc.h - メモリマネージャの追加 + socket.c - delete_sessionのバグ、do_final_socketの追加 + + (src/map) + chrif.c - chrif_disconnect_sub() を修正 + guild.c - guild_recv_info(), guild_castledataloadack() 修正 + map.c - map_quit() のメモリリーク、do_final,do_init 修正 + npc.c - npc_parse_script_line() , npc_parse_script() 他修正 + pc.c - pc_setparam() 修正 + pet.c - do_final_pet() 追加 + pet.h - do_final_pet() 追加 + script.c - do_init_script(), do_final_script() 修正 + skill.c - skill_produce_mix() 修正 + +-------------------- +//1107 by code +・@npctalk, @pettalkコマンド追加 +・ダメージの遅延を実装 +・@mesを全体発言に修正 +・ファーマシーの製造成功確率修正 +・@storageで倉庫が二重で開くことがないよう修正 +・scriptに globalmes, getmapmobs 関数を追加 + + (/src/map) + atcommand.c + atcommand.h + battle.c + clif.c + clif.h + npc.c + npc.h + script.c + skill.c + storage.c + +-------------------- +//1106 by sylpheed + +・item_rate_details:1が動かなかったのを修正 + + (src/map/) + mob.c + +-------------------- +//1105 by End_of_exam + +・1101のマップの再分配が上手くいかないバグを修正(char.c thanks to Mystleさん) + + (src/char/) + char.c - parse_frommap() 修正 + +-------------------- +//1104 by nameless +・BCC32のコンパイルオプションなどの最適化 +・BCC32/VC++で最適な最適化オプションを見つけるためのベンチ +・bcc32_clean.batとbcc32_make.batを統合、クリーンビルドの失敗をしないように。 + +※P4だからとかOpteronだから特定オプションで早いということではないようです。 +※P4でもロットによっては-5が最適だったり-3 -O2が最適だったりするものがあるようです +※思い込みでオプションをつけないようにするために作りました。 +※少しでもレスポンスを上げて運用したいという人は活用してください。 + + (/) + bcc32_make.bat + + 最適化オプションの追加と警告メッセージで深刻ではないものを + 完全に表示しないように設定、bcc32_clean.batをmakeに統合した + ので確実にクリーンビルドできるようになりました + + bench.bat + bench.c + + 最適なコンパイルオプションを見つけるためのベンチです。 + bench.batでコンパイル&実行が行われます。 + 結果はbench.txtに格納されますので数値の一番小さいものを選ん + でbcc32_make.batの23行目に追加・修正してあげてください。 + ※初期状態ではbcc32用になっていますので +-------------------- +//1103 by End_of_exam + +・char_athena.conf のdefault_map_typeが0 になっている時に、PVPガイドで + セーブした後、PVPエリア内でログアウトしたキャラがログインできなくなる + バグを修正。(npc_etc_pvp.txt) 多くの方々からの情報提供感謝します。 + (npc_etc_pvp.txt 内部の ".gat" の付け忘れと、このミスに対応していない +  pc.c のバグです。このパッチを当てないでこのバグを修正したい場合、 +  添付した修正ファイルを参考にしながら、npc_etc_pvp.txtに".gat"を +  付加してください。) + +・do_final内部で不正な処理を行う場合があるのを修正(map.c thanks to lizorettさん) +・マップキャッシュの読み込みに失敗したときにメモリリークしていたバグを修正(map.c) + + (src/map) + pc.c - pc_setsavepoint() 修正 + map.c - do_final(), map_cache_read() 修正 + + (src/char) + char.c - search_mapserver() , parse_char() 修正 + + (script/npc/etc) + npc_etc_pvp.txt - ".gat" を付加する + +-------------------- +//1102 by 人柱さんA +・バグ報告スレ >>35-37にあった修正版 + 詳しいことはスレを見てください + (src/map) + pc.c + +-------------------- +//1101 by End_of_exam + +・socket関連の修正(socket.c socket.h) + + 1. FIFO関連をfd が不正(fd<=0)の時にも正常に動作するように変更 + 2. socket.h の内部を色々と整理 + 3. make_connection() が接続に失敗した時にエラーを返さないバグを修正 +   その変更に合わせて、chrif.c check_connect_char_server() , char.c +   check_connect_login_server() を修正。これでサーバーゾンビ化のバグは +   解決したと思いますが、再発したら報告をお願いします。 + +・char - map 間のコネクションを見直し(char.c chrif.c map.c map.h) + + 1. char - map 間のコネクションが切れたら、map 鯖に接続しているキャラを +  全て切断するようにする。これは、同期を取るのが難しいのと、char鯖との +  通信が必要な処理(パーティ、ギルド、ペット他)ができなくなるためです。 + 2. 複数のmap 鯖で同じマップを担当することがあるバグを修正 + 3. map 鯖の割り当て方法の見直し +  複数のmap 鯖で同じマップを読み込めば、どれか1つが落ちている時でも、 +  正常なmap 鯖にログインできるようになりました。例えば、同じマップを +  map鯖AとBに読み込ませておけば、Aが落ちている時にはBに、Bが落ちている +  時にはAに転送されます。ただし、優先順位の指定はまだ出来てないので、 +  1つのmap 鯖に人数が集中しすぎる可能性があります。 + + (src/map) + chrif.c - map 鯖の割り当て方法の見直し + map.c - map 鯖の割り当て方法の見直し + map.h - map 鯖の割り当て方法の見直し + + (src/char) + char.c - map 鯖の割り当て方法の見直し + + (src/common) + socket.c - 色々修正(上記参照) + socket.h - 色々修正(上記参照) + +-------------------- +//1100 by nyankochan +・1098の修正 + (src/map) + pc.c + +-------------------- +//1099 by End_of_exam + +・mapflag nosave が不正な時に起動を中断させるようにする(npc.c) +・pc_autosave が呼ばれる回数が異常に高くなるバグを修正(pc.c) + +pc_autosave() の内部が、 + +> interval = autosave_interval/(clif_countusers()+1); +> if(interval <= 0) +> interval = 1; + +という風になっているので、1マップサーバーに200人のキャラが接続してると、 +autosave_interval(def:15 * 1000) / 200 = 0.075 秒ごとに関数が呼ばれます。 +さすがにこの状態だとchar鯖が厳しくなるので、関数を呼び出す最小間隔を +0.2 秒に変更しました。 + + (src/map) + pc.c - pc_autosave が呼ばれる回数が異常に高くなるバグを修正 + npc.c - mapflag nosave が不正な時に起動を中断させる + +-------------------- +//1098 by nyankochan +・入手装備品の個数1固定 + (src/map) + pc.c + +-------------------- +//1097 by End_of_exam + +主にバグ修正です。バグ報告してくれた皆様に感謝、感謝。 + +・Zeny増殖対策(pc.c trade.c script.c) + 1. 交換、pc_setparam でMAX_ZENY を超える場合があるバグを修正 + 2. スクリプトにオーバーフロー対策を追加 + +・ログイン成功時・アカウント変数更新時に無条件にmmo_auth_sync を + 呼んでいたのをタイマーを使用した定期更新に変更(login.c login_athena.conf) + +・db関係にバグが潜んでいる模様なので、チェック機構を追加する(db.c db.h) + 一部アカウントのみログイン不可、倉庫ロスト、@whoで表示されるキャラが + 一部消えるなどのバグの原因がdb関連にある模様です。 + 「db_foreach : data lost %d of %d item(s)」というメッセージが表示 + された場合はバグがある(dbに入っているはずのデータが消えた)ので、 + 報告をお願いします。 + +・ある方法で通常より強いキャラが作れてしまうバグの修正(char.c) +・ギルドの役職名に不正な文字が使えるバグを修正(int_guild.c) +・スクリプト内で0での除算時が起こった時にINT_MAXを返すようにする(script.c) + + (conf/) + login_athena.conf - autosave_time の追加 + + (src/common) + db.h - チェック機構の追加 + db.c - チェック機構の追加 + + (src/login) + login.c - mmo_auth_sync にタイマーを適用 + + (src/char) + char.c - 通常より強いキャラが作れてしまうバグの修正 + int_guild.c - ギルドの役職名に不正な文字が使えるバグを修正 + + (src/map) + trade.c - MAX_ZENY を超える場合があるバグを修正 + pc.c - MAX_ZENY を超える場合があるバグを修正 + script.c - オーバーフロー対策、0での除算時の処理を追加 + +-------------------- +//1096 by lizorett +・壁越しにスキルが撃ててしまうバグを修正(バグ報告スレッド part8 >>28) + + (src/map) + path.c - 壁越しにスキルが撃ててしまうバグを修正 + +-------------------- +//1095 by lizorett +・スクリプトのエスケープ判断を変更 +・スキルユニットグループのgroup_idの範囲を変更 +・skill_unitsetting()で全てのスキルでskill_get_time()を使用するよう変更 +・サイトラッシャーをユニットスキルから範囲攻撃魔法に変更(本鯖仕様) + + (src/map) + skill.c - skill_unitgrouptickset_* で skill_id/group_idが重ならないよう + にgroup_idの範囲を制限 + - SkillStatusChangeTableにSC_SAFETYWALL,SC_PNEUMA追加 + - skill_unitsetting()で全てのスキルでskill_get_time()を使用する + よう変更 + - サイトラッシャーを範囲攻撃魔法に変更 + npc.c - エスケープ判断をparse_simpleexpr()と同様にし、全角判断を削除 + (db) + skill_cast_db.txt + - TS/MS/LoV/FN/SG/HD/GXにupkeep_timeを設定 + +-------------------- +//1094 by End_of_exam + +・サブルーチン呼び出し構文の追加(script.c npc.c npc_convertlabel_db()) +・逆アセンブル処理の追加(script.c , DEBUG_DISASM を有効にしてください。) +・switch の一時変数消去位置を変更(script.c) +・RERUNLINEの衝動が怪しかったので修正(script.c / h , map.h) +・ソースを読みやすくするためにbuildin_*をファイル最後に移動(script.c) +・新しく加わった構文のサンプルとして「ハノイの塔」を追加(npc_test_hanoi.txt) +・buildin_getitemname 修正(script.c , 質問スレッド Part14 >>129-130) + +・bcc でコンパイルした時に落ちるバグを修正(map.c map_id2bl 内部) +・Windowsでコンパイルした時に、gettick()のキャッシュが無効になっていたのを + 修正(timer.c , thanks to Shinomori) + + (src/common) + timer.c gettick() のバグ修正 + + (src/map) + script.c 色々変更(上記参照) + script.h struct script_state 修正 + npc.c npc_convertlabel_db() で落ちるのを修正 + map.c map_id2bl() を修正(落ちるのはbcc だけ?) + map.h map_session_data 修正 + + (doc/) + script_ref.txt function 構文の追加 + + (script/sample/) + npc_test_hanoi.txt ハノイの塔 + +-------------------- +//1093 by いど + +・サーバースナップショット + +-------------------- +//1092 by lizorett +・遠距離攻撃のパス検索アルゴリズムを本鯖と同じになるよう変更 +・ストームガスト、ロードオブヴァーミリオンを重ねた場合、片方からだけダメージを +受けるよう修正(仕様が不明なので先に見つけたユニットから攻撃するようにしています) +・アイテムが一つしかない場合、アイテムを使用してもエフェクトが表示されない問題 +を修正 +・セーフティーウォール使用時にアドレス不正となる場合がある問題を修正 +・map_getcell/map_setcellの仕様変更 +・1085のビットマップ対応の痕跡の消去 +・1088のアイスウォールの変更を巻き戻し(本鯖に合わせる) +・全角判断(npc.c)を修正(For English User Forum >>54) + + (注意) map_athena.confのマップキャッシュ指定を行うパラメータ名を変更しています + + (conf) + map_athena.conf - read_map_from_bitmapをread_map_from_cache に変更 + - map_bitmap_pathをmap_cache_fileに変更 + (src/map) + map.h - セルタイプ名称変更(CELL_CHKHIGH,CELL_CHKTYPE)、 + 削除(CELL_SET*) + - skill_unit_group_ticksetメンバ名変更(group_id -> id) + - ビットマップ関連の記述の痕跡を削除 + map.c - map_getcell() セルタイプ名称変更と若干のコード変更 + - map_setcell()を1084以前の仕様に戻し、CELL_SETNPCの + フラグを追加 + - map_cache関連の細かな修正 + npc.c - 全角判断(is_zenkaku)を正確に行うよう変更 + - map_getcell()のセルタイプ名称変更に追従 + pc.c - アイテムが一つしかない場合、使用時のエフェクトが表示 + されない問題を修正 + - map_getcell()のセルタイプ名称変更に追従 + skill.c - ストームガスト、ロードオブヴァーミリオンを重ねた場合 + 片方からだけダメージを受けるよう修正 + - セーフティーウォール使用時にアドレス不正となる場合が + ある問題を修正 + - map_getcell()のセルタイプ名称変更に追従 + skill.h - 関数定義変更 + path.c - 遠距離攻撃のパス検索処理を追加(path_search_long) + - map_getcell()のセルタイプ名称変更に追従 + battle.c - 遠距離攻撃のパス検索を使用するよう変更 + +-------------------- +//1091 by End_of_exam + +** 注意 ** + + 今回のパッチは改造内容が複雑なので、導入は慎重に行ってください。 + status.c / h への分離は、関数名の置き換えだけに留めたつもりですが、 + 思わぬバグが潜んでいる可能性があります。 + +・スパゲティ対策の一環として、ステータス計算、状態異常に関わる部分を + status.c / h として分離。battle.c から39KB程 , skill.c から41KB程 , + pc.c から38KB程移動できました。少々強引ですが、スキル使用や攻撃などの + 処理の流れをつかみやすくするためには、battle.c / skill.c の中身を + 減らす必要があると考えたためです。 + + battle_get_* => status_get_* + skill_status_change_* => status_change_* + pc_calcstatus => status_calc_pc + pc_calc_sigma => status_calc_sigma + pc_getrefinebonus => status_getrefinebonus + pc_percentrefinery => status_percentrefinery + +・battle.c , script.c の巻き戻りを戻す +・npc.c の怪しい変更を戻し、きちんとNUL を付け加えるようにする +・script.c のミスを直す(jump_non_zero => jump_zero 意味が逆になってました…) +・skill.c の武器修理 のコメントミスを修正 +・WIN32でコンパイルした時、最大接続人数が60人程に制限されていたバグを修正 + + (/) + athena.dsw , athena.dsp , bcc32_make.bat , src/login/login.dsp + src/char/char.dsp , src/map/map.dsp + コンパイル条件の変更 + + (src/map/) + 上の分離に合わせてコンパイルエラーの出ないように修正 + +-------------------- +//1090 by Sapientia +・チャットの便利さのために叫ぶ追加 (ギルドチャットと区分するためにウェチギシの前に [叫ぶこと]が付き) +・atcomand_athena.conf で onlymes を 0で設定して皆使うように活性化 + オリジナルなのでデフォルトで GMだけ使うことができるように設定しました. +・@mes [言うこと] で使用 + + (src/map) + atcommand.c atcommand_charkami 追加 + atcommand.h + clif.c clif_onlymessage 追加 + clif.h + (src/conf) + atcommand_athena.conf onlymes 追加 + help.txt @mes 説明追加 + + +-------------------- +//1089 by 聖 +・VC.NET2003でコンパイルすると大量に警告が出るのを修正 +・その他バッファオーバーフロー等の細かいバグ修正 + + (src/char) + int_guild.c 警告箇所を修正 + + (src/map) + atcommand.c, battle.c, clif.c, itemdb.c, pc.c, pc.h, script.c, skill.c + 警告箇所を修正 + npc.c 警告箇所とバッファオーバーフロー修正 + +-------------------- +//1088 by Sapientia +・ウィザドスキル Icewall このキャラクターやモンスター足もとに設置されることを防止 +・ロードナイトスキル Berserk 使用の時 HPが 1/3になれば回復するバグ修正 + + (src/map) + pc.c Berserk 修正 + skill.c Icewall 修正 + +-------------------- +//1087 by End_of_exam + +・マップキャッシュに圧縮機能を追加(1MB程に縮まるようです) +・npc.c の巻き戻りを修正(質問スレッド Part14 , 111) +・map_athena.conf のコメントアウトを修正(Athena雑談スレッドPart7 , 146) +・Windows 用の起動スクリプトを追加してみる(eAthena のを元に改造) + + (/) + win32_start.bat Windows 用の起動ファイル + + (src/map) + map.c 圧縮機能の追加 + npc.c 巻き戻りを修正 + + (src/common) + grfio.c decode_zip , encode_zip のエクスポート + grfio.h decode_zip , encode_zip のエクスポート + + (conf/) + map_athena.conf 修正 + +-------------------- +//1086 by End_of_exam + +主に1085のバグ修正だったりもします。 +「てめー、1から書き直しやがって」という突っ込みだけは勘弁してくださいませ。 + +・データ構造の大変更(map.c) + マップを削除&追加しても正しく動くように変更 + マップキャッシュ作成中に強制終了すると再起動時に不安定になるバグを修正 + 圧縮フラグの追加(需要あるのか不明。compressを真にすると、現在のソースで + 読めなくなります。) + +・なんか衝動があやしすぎるので、ビットマップ処理を撤廃する(map.c map.h) + npc_touch_areanpc : some bug がたくさん出てくる -> 原因不明? + 恐らく通行可能判定が正しく設定されていないっぽいんですが謎です。 + #read_map_from_bitmap の設定を省くとログイン時に落ちるバグを修正 + +・キャッシュ内に全てのマップがあれば、grf 無しでも動作するように変更。(grfio.c map.c) + + (src/map) + map.c バグ修正他 + map.h バグ修正他 + + (src/common) + grfio.c ファイルが見つからない時にexit を呼ばないように修正 + +-------------------- +//1085 by zalem +・マップデータの読み込みはビットマップファイルから行なえるような機能追加 + + grfファイルから一度ビットマップファイルを作成して以後はその + 作成されたビットマップフォーマットのファイルからマップ情報を読み込む + という方法を採ることによって、map-serverが立ち上がる時マップ情報を読み取る + のに掛かる時間がほとんどなくなる、また1intに32個のセル情報が格納できるの + で、map情報に関するメモリ使用量も3割り近くまで減るので(そのかわりに + ある程度CPUの負担が大きくなる)、追加してみた。 + conf/map_athena.confのread_map_from_bitmapオプションで利用する + かどうかを指定でき、その下にあるmap_bitmap_pathでファイル名を変更する + (デフォルトでdb/map.info) + まだテスト段階なので、導入はご慎重に(一応Linuxで、いろいろと + テストしてみたが...) + +・map_getcell()に4番目引数の追加とmap_setcell()の4番目引数の変更 + + 関数の利用意図がわかりやすいように、そしてこれからの変更を容易にする + ために、map_getcell()とmap_setcell()のそれぞれ4番目の引数を追加、変更してみた、 + map_getcell()の4番目の引数はmap.hで定義されてるCELL_CHK列挙型、map_setcell() + の4番目の引数はmap.hで定義されてるCELL_SET列挙型をとるように変更.また、上の + Featureに対応するため、map_getcell()をポインタに変更した。 + + 主な変更点: + + src/map/map.h read_gat(),read_gatp()マクロの変更 + 列挙型 CELL_CHK,CELL_SETを追加,map_getcell(),map_setcel()用 + map_data構造体にメンバーint* gat_fileused[MAX_CELL_TYPE+2]追加 + src/map/map.c map_getcell()を関数型ポインタに変更,map_getcellp()をread_gatp() + のために追加,実際に下の四つの関数のどっちに指すかはmap_read_flagによる + map_getcell_gat(),map_getcell_bitmap() 追加 + map_getcellp_gat(),map_getcellp_bitmap() 追加 + map_setcell() 変更 + map_createbitmap() 追加 + map_readmapfromfile() 追加 + map_readallmap() 変更 + map_config_read() 変更 + do_final() 変更 + 以下の*.cファイル内のmap_getcell(),map_setcell(),read_gat(),read_gatp()を呼出した部分をすべて変更 + src/map/atcommand.c + src/map/mob.c + src/map/npc.c + src/map/path.c + src/map/pc.c + src/map/pet.c + src/map/skill.c + + conf/map_athena.conf read_map_from_bitmap,map_bitmap_path 追加 + +-------------------- +//1084 by lizorett +・経験値獲得のバグ修正(バグ報告スレッド part7 >>134) + (src/map) + mob.c 経験値計算修正 + +-------------------- +//1083 by End_of_exam special thanks to lizorettさん +・ソケットのデストラクタ処理の追加 + (common/socket.c common/socket.h login/login.c char/char.c map/clif.c map/chrif.c) + ソケットを閉じる時の処理の流れが変更になります。今までソケットを閉じる場合は、 + まずsession[fd]->eof を真にした後、パーズルーチン内で後処理(メモリ解放など) + していました。ですが、close(fd); が2重に実行されてサーバーが落ちるなどの + バグが発生していたり、処理の流れがつかみにくいといった理由から、socket.c 内部で + 全て処理するように変更しました。ソケットを閉じる時の主な流れは次の通りです。 + + 1. ソース内からsession[fd]->eof = 1; をする + 2. socket.c 内からsession[fd]->destruct() が呼ばれる + 3. メモリの解放&後処理(socket.c delete_session内部) + + close(fd) は、session[fd]->eof = 1; に置き換えました(#define)。 + また、delete_session() を明示的に呼ぶ必要はありません。 + +・マップ鯖分配時のアイテムdupe問題修正(map/map.c map/pc.c map/chrif.c) + ソケット切断時に倉庫データのキャッシュを消すように変更 + 2重ログイン時にマップサーバーが違った場合にも切断できるように修正 + +・古いバージョンでログインした時にmap鯖が落ちるバグを修正(map/clif.c) + clif_parse() 内部 + + if(packet_db[cmd].len==0) { + -> if(cmd>116,>>125,>>126 のファイルを念のためマージ + + (db/) + skill_db.txt, skill_cast_db.txt, skill_require_db.txt + - サクリファイスの記述を修正/追加 + (src/map/) + battle.c - エンチャントデッドリーポイズンの変更 + - サクリファイスの実装 + - ストームガストのノックバック方向を変更 + - 白刃取りをボスに無効に変更 + skill.h - SC_SACRIFICEを追加 + skill.c - サクリファイスの実装 + - skill_castend_damage_id()のMG_FROSTDIVER/MG_STONECURSEに + NULLチェックを追加 + mob.c - 経験値の配分を修正 + script.c - 個別に出されていたファイルをマージ(>>125) + npc.c - 個別に出されていたファイルをマージ(>>126) + (src/common) + core.c - 個別に出されていたファイルをマージ(>>116) + +-------------------- +//1081 by End_of_exam +・「ループ構文の方も実装してください」という要望を貰ったので、 + for , while , do - while 構文を導入。個人的に余り需要は無いと思うのですが…。 + +・elseが完全に解析できてなかったバグを修正。 +・switch のbreak; が場所によってはコンパイルエラーになるバグを修正。 + + (src/map/) + script.c : 構文を拡張。色々整理。 + + (doc/) + script_ref.txt : 上の修正に合わせて変更。 + +-------------------- +//1080 by End_of_exam + +・スクリプトを if - else if - else 構文 , switch 構文に対応させました。 + 多重ネストが可能ですので、今までより見やすいスクリプトが書けると思います。 + if(aa) { aaa(); } else if(bb) { cc; if(dd) { ee() } else { ff(); } } + それに伴い、__ から始まる変数やラベルを用いると、不都合が生じる可能性があります。 + +・スクリプトに新しい関数(select関数・menu命令の関数版)を追加しました。 + + (src/map/) + script.c : 構文を拡張 + npc.c : npc_perse_script の修正( { , } のネストに対応 ) + + (script/) + npc/town/npc_town_alberta.txt : 一カ所 goto が抜けてたので修正 + sample/npc_debug_pota.txt : switch , select を使って書き直し + (デバッグに使わせて貰いました) + + (doc/) + script_ref.txt : 上の修正に合わせて変更 +-------------------- +//1079 by Yuuki +・石化中にストーンカースを使うと石化解除 +・FDでスキル追加効果を使うと氷化中ダメージ判定で先に割れてもう一度氷化判定がくるのでスキル追加効果つかわず +・BBで睡眠石化氷化が割れないバグの修正(独自のダメージ判定使ってたので消して正規のダメージ判定に戻した) +・ディレイ0のスキルにadelay/2追加(G鯖でTS使って検証した結果最もこれが近かった通常攻撃よりはやかったので) + + (src/map) + skill.c + +-------------------- +//1078 by End_of_exam + +・Visual C++ 6.0 / bcc32 でコンパイル出来るように修正(別途zlib.dll が必要) +・1074は欠番にします。色々とご迷惑をかけた事をお詫びします。 + +** 注意 ** + 今回のバージョンの完全な動作確認はしていません(人柱版扱いにしてください)。 + 本格的な運用に踏み切る前には、必ず動作確認をするようにしてください。 + 場合によっては、コンパイル出来ない、不正な動作になる…等々の問題が起こるかも + しれませんが、そのときは、騒がず、慌てずに、ネ申の降臨を待つようお願いします。 + +** お願い ** + このパッチを完全版にしてくれる方、使用感レポートを投稿してくれる方を募集します。 + パッチを公開するついでに、大量のwarning を修正してくれたら嬉しいな〜、と思ってみたり。 + + (/) + bcc32_make.bat , bcc32_clean.bat + bcc32 でコンパイル / クリーン を簡単にするためのバッチファイル。 + + athena.dsp , athena.dsw , src/login/login.dsp , src/char/char.dsp , + src/map/map.dsp + Visual C++ 用のプロジェクトファイル & ワークスペース + + (src/) + コンパイル出来るように色々修正。 + + (src/common/timer.c) + 独自の手抜きアルゴリズム(2分ソート)を採用したバージョン。 + +-------------------- +//1077 by sylpheed +・サーバースナップショット +・下記二つを取り込み +質問スレッド Part14-41 Plalaさん +バグ報告スレッド part7-68 ...さん + +1074は取り込んでいません。 + +-------------------- +//1076 by mare +・韓国公知の通りアリスとジルタスのエサの変更。 +・GMのアブラカタブラ専用スキルのフラグが消えてたので復活。 +・ブラックスミスギルド員にプリーストの場合のセリフを追加。 +・クラスチェンジで全ての指定IDボスが出るように(なってるといいなぁ) + (db) + pet_db.txt + (conf) + battle_athena.conf + (script/npc/job) + npc_job_10blacksmith.txt + (src/map) + mob.c +-------------------- +//1075 by kag +・弓手用の指貫の効果実装の布石 +・効果がはっきりとしないのでitem_dbの修正はいれていません。 +・1075番でいいのかなぁと思ったり。 + + (db) + const.txt + bWeponAtk=1073とbWeponAtkRate=1074を追加 + + (src/map) + battle.c + int battle_get_baseatk()修正 + static struct Damage battle_calc_pc_weapon_attack()修正 + map.h + int weapon_atk[16],weapon_atk_rate[16]; + SP_WEPON_ATK,SP_WEPON_ATK_RATE, // 1073-1074を追加 + pc.c + memset(sd->weapon_atk,0,sizeof(sd->weapon_atk)); + memset(sd->weapon_atk_rate,0,sizeof(sd->weapon_atk_rate));を追加 + + pc_bonus2() 修正 + (doc) + item_bonus.txt + bWeponAtk,bWeponAtkRate,bHPDrainValue,bSPDrainValue 追加。 + +-------------------- +//1073 by LP@@ +・アコスキルの一部及びサイトスキルの修正(日本には今月末に来る筈?@2004/12/06) +速度減少は移動速度減少量が、シグナムクルシスは成功率、DEF減少量の増加量が +はっきりしなかったので弄っていません。 + (src/map) + battle.c + デーモンベイン、ディバインプロテクション計算式を修正。 + skill.c + ルアフ、サイトの有効範囲を修正(両方10x10→ルアフ5x5,サイト7x7)。 + + (db) + skill_cast.db + アクアベネディクタの詠唱及びディレイを修正。 + +//1072 by kag +・転生スキルを中心に修正 + (src/map) + battle.c + 魔法力増幅をスキルレベル*5%に修正。 + 矢撃ちに矢のATKが乗らなくなるように修正。 + オーラブレードの追加ダメージを100に修正。 + バーサークの与ダメを2倍になるように修正。 + ヘッドクラッシュの計算式を修正。 + スパイラルピアースの計算式だけ修正。 + プレッシャーの計算式を修正。 + 連柱崩撃の計算式を修正。 + ソードリジェクトの反射率をスキルレベル*15%に修正。 + アローバルカンの計算式を修正。矢の属性が乗るように修正。 + ファルコンアサルトの計算式を修正。頑強フラグで1ダメになるように修正。 + ブリッツビートを頑強フラグで1ダメになるように修正。 + デモンストレーションを必中、カードを乗らないように修正。 + アシッドテラーを防御無視、必中、無属性、カードを乗らないように修正。 + skill.c + 魔法力増幅に0.7秒の固定詠唱追加。 + LP@@ さんのアスムキリエ重複不可を追加。 + + (db) + skill_db.txt + 狂気孔を詠唱妨害できるように修正。 + skill_cast_db.txt + プレッシャーの詠唱、ディレイを追加。 + 猛虎硬派山のディレイを追加。 + ライフ置き換えのディレイを追加。 + ファルコンアサルトの詠唱、ディレイを追加。 + ウインドウォークのディレイ、持続時間を変更。 + アローバルカンの詠唱、ディレイを追加。 + クリエイトデッドリーポイズンのディレイを追加。 + skill_require_db.txt + オーラブレードの消費SPを修正。 + コンセントレーションの消費SPを修正。 + 魔法力増幅の消費SPを修正。 + ナパームバルカンの消費SPを修正。 + プレッシャーの消費SPを修正。 + サクリファイスの消費SPを修正。 + 猛虎硬派山の消費SPを修正。 + リジェクトソードの消費SPを修正。 + +//1071 by ICO +・npc_job_09wizard.txt,npc_job_16sage.txtを修正 +・取り巻きが召喚系スキルを使用する際の挙動を修正 + + (src/map) + mob.c + 取り巻きの召喚系スキルを規制するタイミングを変更 + skill.c + 召喚系スキルの発動条件を修正 + +//1070 by sylpheed +・ドロップ率のレートごとの調整を追加 + ドロップ設定1〜9 10〜99 100〜999 1000〜10000で個別に倍率と最低/最高値の設定が可能です +・@weather 0 が動かないのを修正 +・転生二次職のHP/SP25%上昇実装 +ドロップ倍率はeAthenaのアイテム種類毎の設定を移植しても良かったのですが +種類毎だとレートの開きが大きい場合があり、あまり意味がないため +このような形でレート詳細設定を追加してみました。 +mob_dbを弄るより楽にドロップ率の変更ができると思います。 + +weather 0が動かないのは理由が良くわからなかったので +動くように修正するついでに、雨フラグ消去時に +虹が出るように追加してみました。 + +転生のHP/SPに関しては、転生していても二次職になってない場合 +増加はしないようなので、そのように実装してみました。 +wedding_modifydisplay: yes の時にドレス/タキシードを装備解除すると +増加分が消えてしまいます・・・ +わかる方いたら修正お願いしますorz + + (src/map) + atcommand.c + @weather関連の修正(case 0を実行するように修正) + 雨フラグを消した場合虹が出るようにしてみました(JP蔵で使えるか不明) + (マップ移動しないと天候が消えないのはragexeの仕様かな?) + battle.c + battle.h + mob.c + item_rate_details関連を追加 + pc.c + 転生二次職時のHP/SP最大値25%増加を追加 + 転生していても二次職でない場合はHP/SP増加は無しのようです + (conf) + help.txt 修正 + msg_athena.conf 112追加 + + (doc) + conf_ref.txt 修正 + help.txt 修正 + +//1069 by lizorett (2004/11/26) special thanks to 名無し様@g@me +・メルトダウンの実装 +・魔法力増幅が詠唱のある魔法で有効にならなかった問題を修正 +・map-serverがダウンする問題の修正(質問スレッド Part13 >>55) +・map-serverに不正IDでログインするとchar-serverがダウンする問題の修正 +・サフラギウムが無詠唱スキルで取り消されない問題を修正 +・重複して猛毒状態とならないよう修正 +・マグナムブレイクのダメージを修正 +・バーサク中にHP/SP吸収、毒などのダメージを受けるよう修正 +・月光剣のSP吸収量が増加していく問題を修正(暫定) +・@helpにキーワード検索機能を追加 + + (src/map) + battle.c - マジックパワーによるMATK増加の実装 + - 武器鎧破壊をpc_break_equip()に書き換え + - HP/SP吸収を修正 + map.h - 装備破壊の定義を追加 + pc.c - pc_break_armor()/pc_break_weapon()を、新規の装備破壊の + 関数pc_break_equip()に統合 + - 魔法力増幅のコードを削除(battle.cで行う) + - HP/SP吸収関係の変数の初期化を追加 + pc.h - 関数定義を修正 + skill.c - メルトダウンによる装備破壊を実装 + - 魔法力増幅に関する修正 + - 重複して猛毒状態とならないよう修正 + clif.c - map-serverがダウンする問題の修正 + atcommand.c - @helpにキーワード検索を追加("@help jobchange"など) + (src/char) + char.c - char-serverがダウンする問題の修正 + (db) + const.txt - bUnbreakableHelm, bUnbreakableShield追加 + skill_cast_db.txt + - メルトダウンの状態異常時間を設定 + +//1068 by huge +・atcommandをいくつか追加と、eAthenaからいくつか移植。(help.txt参照) +・非GMキャラが@で始まる発言をした時、そのまま表示するようにした。(GMレベル0のコマンドは実行) +・天気コマンドに合わせて、mapflag設定できるように。 +・scriptをいくつか追加と、eAthenaから一つ移植。 +・初期HP倍率とSP倍率をbattle_athenaで設定できるようにした。 +・全キャラが、GMには位置・HPを通知させるようbattle_athenaで設定できるようにした。 +・ドクロドロップについて、battle_athenaで設定できるようにした。 +・GMのアイテムドロップや交換についてGMレベルを制限できるようにした。 +・ディテクティングスキル修正。 +※デフォルトの日本クライアントだと、雨で落ちます。 + + (conf/) + atcommand_athena.conf 修正 + battle_athena.conf 修正 + help.txt 修正 + msg_athena.conf 修正 + + (doc/) + help.txt 修正 + script_ref.txt 修正 + conf_ref.txt 修正 + + (src/map/) + atcommand.c + atcommnad.h + guild.h party.hを読む様に修正 + is_atcommand() 修正 + atcommand() 修正 + ※移植・新規コマンドについては help.txt を確認して下さい。 + battle.c + battle.h + hp_rate,sp_rate,hp_meter,bone_drop 追加 + clif.c + clif.h + clif_spawnpc() 修正 + clif_hpmeter() 追加 + guild.c + guild.h + guild_searchname() 追加 + guild_searchname_sub() 追加 + map.h + 天候に関するflag追加 + npc.c + npc_parse_mapflag() 修正 + party.c + party.h + party_searchname() 追加 + party_searchname_sub() 追加 + pc.c + pc.h + pc_calcstatus() 修正 + pc_damage() 修正 + pc_walk() 修正 + pc_can_drop() 追加 + script.c + gmcommand 移植追加 + dispbottom 追加 + getusersname 追加 + recovery 追加 + petinfo 追加 + checkequipedcard 追加 + getexp 削除(setを使うようにして下さい) + skill.c + skill.h + skill_castend_pos2() 修正 + + +Athena雑談スレッドPart7 >>54 もっさりさんの分 + 記述漏れがあったらすいません。 +-------------------- +//1067 by kai +・メディテイティオによるヒール回復量増加の効果を修正 +・アドバンスドカタール研究の修正 +・PvP時におけるアスムプティオの効果を修正 + + (src/map) + skill.c + 2120行 heal += heal*(skill*2)/100; //メディテイティオの修正 + + battle.c + 1723行 damage += dmg*(10+(skill * 2))/100; //アドバンスドカタール研究の修正 + + 2598〜2599、3580〜3582行 アスムプティオの修正 + if(map[target->m].flag.pvp)としダメージ計算を2/3に修正 + +-------------------- +//1066 by lizorett (2004/11/17) special thanks to 名無し様@g@me +・デッドリーポイズン作成実装 +・エンチャントデッドリーポイズン実装 +・ソウルブレイカー実装 +・battle_weapon_attackで未初期化の値が戻されるバグ修正 +・他使用SPの変更等の細かい修正 + + (db) + const.txt - 猛毒(SC_DPoison)を追加 + item_db.txt - 緑ハーブ,緑ポーション,万能薬に猛毒を治す効果を追加 + produce_db.txt - デッドリーポイズンの材料の定義を追加 + skill_cast_db.txtエンチャントデッドリーポイズン、ソウルブレイカー + の定義を修正/追加 + skill_db.txt - ソウルブレイカー/エンチャントデッドリーポイズン/ + デッドリーポイズン作成の定義を修正 + - ナパームバルカンのヒット数修正 + skill_require_db.txt + - エンチャントデッドリーポイズンが毒薬の瓶を使用する + ように修正 + - ソウルブレーカー/メテオアサルトの使用SPを修正 + (src/map) + battle.h - battle_config.cdp_rateを追加 + battle.c - ソウルブレーカー実装 + - メテオアサルトにカード効果がかからないよう変更 + - 4213行の条件で未初期化の値が戻されるバグ修正 + - battle_config.cdp_rateを追加 + skill.h - デッドリーポイズン作成の材料が7つなので、テーブル + を追加。材料の最大数をdefineで変更できるよう修正 + - SC_DPOISON(182)/SC_EDP(183)を追加 + skill.c - 猛毒効果を追加 + - デッドリーポイズン作成を実装 +-------------------- +//1065 by End_of_exam + +・サーバーゾンビ化に暫定対処 +・calc_index(path.c)の不都合を修正 + + (common/) + timer.c + TIMER_MIN_INTERVEL(タイマーの最小インターバル)を追加しました。 + それに伴い、do_timer() の戻り値の最低を 10ms から 50ms に変更しました。 + + selectが10ms以内に終わらない環境だと、モンスターを大量召還した時などに、 + クライアントからのパケットに反応しなくなる模様です。 + ローカルテスト(モンスター大量召還)をしてみたところ、25msに変更した時点で + 改善しましたが、環境によっては50msでも不十分かもしれません。 + その場合は、TIMER_MIN_INTERVELを増やして様子を見てください。 + + 同様の現象として、多数のクライアントが接続するとサーバーが反応しなくなる + というのがありますが、このパッチによってある程度改善されるかもしれません。 + + (map/) + map.h : MAX_WALKPATH + path.c 内の calc_indexが不都合を起こす(48*48-1 = 1000 1111 1111(b)) ため、 + MAX_WALKPATHを 48 から 32 に変更しました。(32*32-1 = 0011 1111 1111(b)) + + #define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1)) +-------------------- +//1064 by nameless +・GCC 3.3.0/3.3.1が内包する0/0=変数最大値の問題対策(int:65535/long:4294967294) +・魔法防御・防御・属性防御が正しく適用されない問題を修正 +・ナパームバルカンを単体魔法のコードに修正し、呪い効果を実装 + + (src/map) + skill.c + 442〜448行 不等号[<]を[>]に修正 + 512〜519行 不等号[>]を[<]に修正 + 529〜538行 コンパイラバグの訂正方法と例/*〜*/の部分を + gccのバージョンに合わせて生かしたり殺したり + してください。3.3.2からは直っているようです + 1857行 ナパームバルカンを追加 + 660〜664行 ナパームバルカンの呪い効果を追加 + (src/char) + char.c + 修正しきれていなかった部分を修正しました。 + +-------------------- +//1063 by 七誌 +・月光剣の効果実装 +・左手カードによる、武器攻撃時のHP/SP吸収効果が右手に影響する様に修正(本鯖仕様) + (left_cardfix_to_rightがyesの時のみ。noだと従来通り) + + (db) + const.txt + bHPDrainValue=1071とbSPDrainValue=1072を追加 + item_db.txt + 月光剣のEquipScriptにbonus2 bSPDrainValue,100,3を追加 + + (src/map) + battle.c + battle_weapon_attack() 修正 + map.h + short hp_drain_value,sp_drain_value,hp_drain_value_,sp_drain_value_;を追加 + SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1071-1072を追加 + pc.c + pc_bonus2() 修正 + +-------------------- +//1062 by nameless +・パケット送受信での誤送信修正 +・バグ報告スレッド part7 からの取り込み・修正 >> 56,57,58 +・fix1059の取り込み +・ハイウィズのネイパームバルカンの実装(eA取り込み) +・CPU最適化コードの修正(athlon系)・追加(玄人箱/Linux Zaurus) + + (/) + Makefile + athlon系最適化の修正 + 玄人箱(Kuro-Box 200MHz版[PPC 603x]) + 玄人箱(Kuro-Box 266MHz版[PPC 604x]) + Linux Zaurus (SL-C7xx) + の最適化コードを記述 + + (db) + skill_cast_db.txt + 400,500,1200:1600:2000:2400:2500,0,0 //HW_NAPALMVULCAN#ナパームバルカン# + (src/map) + clif.c + clif_parse() 修正 + (src/char) + char.c + 1367行 cmd = RFIFOW(fd,0);追加 + (src/map) + skill.c + switch(skillid)にcase HW_NAPALMVULCAN:以下20行ほど追加 +-------------------- +//1061 by lizorett (2004/11/9) +・不正なギルドスキルパケットを受けた場合にmap/charサーバが落ちる現象を修正 +・不正なパケットを受けた場合にcharサーバが落ちる現象を修正 +・結婚したキャラを削除するとcharサーバが落ちる現象を修正 +・青箱を一つだけ持った状態で青箱から青箱がでると、青箱が消えるたように見える + (リログすると見える)問題を修正 +・スナッチャーのスキル失敗を表示しないようにできる設定を追加 +・デボーションのレベル制限(10レベル差)を変更できる設定を追加 + + (src/common) + mmo.h + ギルドスキルのenumを追加(src/map/skill.hから移動) + (src/map) + skill.h + ギルドスキルのenumを削除(src/common/mmo.hに移動) + guild.c + guild_checkskill スキルの範囲チェックを追加 + guild_skillup スキルの範囲チェックを追加 + skill.c + skill_additional_effect display_snatcher_skill_failの処理を追加 + skill_castend_nodamage_id devotion_level_differenceの処理を追加 + battle.c + display_snatcher_skill_fail,devotion_level_differenceの初期化を追加 + (src/char) + int_guild.c + guild_checkskill スキルの範囲チェックを追加 + mapif_parse_GuildSkillUp スキルの範囲チェックを追加 + char.c + parse_char 不正なパケットを受けた場合にはダンプするよう修正 + char_divorce i1052 変更 + (/src/map) + atcommand.c + ATCOMMAND_FUNC(whop); 追加 + { AtCommand_WhoP,"@who+",0, atcommand_whop }, 追加 + atcommand.h + AtCommand_WhoP, 追加 +-------------------- +//1051 by Plala +・ペコペコ騎乗時MAX Weightを増やせるようにしました。 +battle_athena.confで設定可能です。 + + (conf/) + battle_athena.conf + riding_weight 追加 + (map/) + battle.c + battle_config.riding_weight 追加 + battle.h + int riding_weight; 追加 + clif.c + clif_parse_RemoveOption 変更 + pc.c + int pc_calcstatus 変更 + 1415にsd->max_weight +=battle_config.riding_weight; を追加 + (common/) + version.h + Ver 1050->1051 変更 +-------------------- +//1050 by code +・各種天候操作コマンドの見直し +※いちいち@misceffectで呼び出さずに簡単に天候操作を行えるように +※クライアント依存は落ち葉ではなく雨でした、間違いました(^-^; + + (src/common/) + version.h + Ver 1049->1050 変更 + (/src/map) + atcommand.c + AtCommand_Rain{} 変更 + AtCommand_Snow{} 変更 + AtCommand_Cherry{} 変更 + AtCommand_Fog{} 変更 + AtCommand_Maple{} 変更 + +-------------------- +//1049 by code +・霧、落葉の2つの天候操作コマンドを追加しました。 +※落ち葉に関してはクライアント依存なのでjROだと落ちるかも… + + GMコマンド追加 + @fog 霧 + @maple 落葉 + + (conf/) + atcommand_athena.conf + fog: 1 追加 + maple: 1 追加 + + msg_athena.conf + 87: 霧が立ち込めました。 追加 + 88: 落ち葉が降ってきました。 追加 + (/src/common/) + version.h + Ver 1048->1049 変更 + (/src/map) + atcommand.c + ATCOMMAND_FUNC(fog); 追加 + ATCOMMAND_FUNC(maple); 追加 + { AtCommand_fog,"@fog",0, atcommand_fog }, 追加 + { AtCommand_maple,"@maple",0, atcommand_maple }, 追加 + + atcommand.h + AtCommand_Fog, 追加 + AtCommand_Maple, 追加 + +-------------------- +//1048 by code +・雨、雪、サクラ吹雪の3つの天候操作コマンドを追加しました。 +※衝動的に追加してしまったのでバグがあるかも知れません(汗 + + GMコマンド追加 + @rain 雨 + @snow 雪 + @cherry サクラ吹雪 + + (conf/) + atcommand_athena.conf + rain: 1 追加 + snow: 1 追加 + cherry: 1 追加 + + msg_athena.conf + 84: 雨が降り出しました。 追加 + 85: 雪が降り出しました。 追加 + 86: サクラ吹雪を降らせます。 追加 + (/src/common/) + version.h + Ver 1047->1048 変更 + (/src/map) + atcommand.c + ATCOMMAND_FUNC(rain); 追加 + ATCOMMAND_FUNC(snow); 追加 + ATCOMMAND_FUNC(cherry); 追加 + { AtCommand_rain,"@rain",0, atcommand_rain }, 追加 + { AtCommand_snow,"@snow",0, atcommand_snow }, 追加 + { AtCommand_cherry,"@cherry",0, atcommand_cherry }, 追加 + + atcommand.h + AtCommand_Rain, 追加 + AtCommand_Snow, 追加 + AtCommand_Cherry, 追加 + +-------------------- +//1047 by SVN +・製造アイテムの製作者の名前を引くmap←→charのパケットが間違っていたのを修正 +・二重ログインをした時にchar-serverが落ちる可能性があったのを修正 +・ガーディアンをGv時間外に殴れた、ID指定のスキルが当たった、skill_unitなスキル攻撃が当たったのを修正 +・グラフィティのRangeをとりあえず3にしてみた + (db/) + skill_db.txt + (char/) + char.c + parse_frommap() + (map/) + clif.c + clif_parse_ActionRequest() 変更 + clif_parse_UseSkillToId() 変更 + mob.c + mob_gvmobcheck() 追加 + mob.h + mob_gvmobcheck() 定義追加 + skill.c + skill_attack() 変更 + +-------------------- +//1046 by SVN +※db/packet_db.txtは2004-09-06aSakexe用なので、jROクライアントで使用する際は「//jROはここまで」以下をコメントアウトするか削除してください + +・変更点が多いので詳細はファイル、関数ごとに記述しています +・1045にそのまま上書きしても動作しますが、使われないファイルがいくつか残ります +・script/以下は名前が変更されているファイルが大量にあるのでscript/の変更点を参考にしてください +・スクリプト用の関数や命令が増えたり仕様が変更されているものがあります + 基本的には互換性があるはずですが、getgdskilllv()だけは第二引数を数字ではなくスキル名(GD_APPROVALなど)に置き換える必要があります + getgdskilllv()が使われている/script/npc/gvg_big5/*.* は中国語で必要ないので削除してください + 追加や変更に関しては概ねscript_ref.txtに反映してありますが、詳細はscript.cの変更点を読んでください +・追加された@コマンドについては@helpとatcommand.cの変更点を読んでください +・追加された設定はconf_ref.txtを参照してください +・記述漏れの変更点もあるかもしれません + +追加したファイルは「A」 +変更したファイルは「C」 +削除したファイルは「D」 +移動したファイルは「M」 + / + C athena-start + ./conf/import 以下を起動時に自動作成するように変更 + seqコマンドを使わないようにしてFreeBSDでも動作するように変更 + start + すでにAthenaが起動している時は何もしないように変更 + execで ./ がダブっていたので削除 + stop + FreeBSDでもシェルに戻るように変更 + kill + 同上 + C Makefile + PACKETDEF に PACKETVER=6 を追加 + FreeBSDを判定して make と gmake を切り替えるように変更 + CFLAGS を分解して弄りやすいように変更 + C start + 1行目のシェル指定が正しくなかったのを変更 + すでにAthenaが起動している時は何もしないように変更 + 起動確認の条件式を athena-start と同じ物に変更 + bin/tool/ + シェルスクリプトの改行コードを CRLF から LF のみに変更 + C getlogincount + ログインバージョンを $loginversion として変更できるように変更 + C ladmin + アカウント名に「-」を使えるように変更 + + conf/ + D import/ + 配布物から削除(athena-start start で自動作成される) + C atcommand_athena.conf + shuffle maintenance misceffect 追加 + C char_athena.conf + default_map_type default_map_name 追加 + C help.txt + 説明追加 + C login_athena.conf + login_version login_type 追加 + C map_athena.conf + npc map 色々変更 + C mapflag.txt + 最新版に更新 + C msg_athena.conf + 81以降追加 + C water_height.txt + 最新版に更新 + db/ + C castle_db.txt + ギルド解体時に発生する OnGuildBreak イベントのために 追加 + C const.txt + GvGの開始時間等を設定できるように追加 + マップフラグ mf_notrade mf_noskill 追加 + パラメータ PartnerId Cart 追加 + ボーナス bBreakWeaponRate bBreakArmorRate bAddStealRate bUnbreakableWeapon bUnbreakableArmor 追加 + ステータス変化 SC_WEDDING 追加 + スクリプト命令 getgdskilllv 用に GD_APPROVAL など追加 + C exp.txt + 転生二次職がBaseLv12になるときに必要な経験値を41→481に修正 + C item_db.txt + C mob_db.txt + C mob_skill_db.txt + C skill_cast_db.txt + C skill_db.txt + C skill_require_db.txt + C skill_tree.txt + 最新版に更新 + A packet_db.txt + パケット定義ファイル追加 + doc/ + C client_packet.txt + 新しく判明したパケットをいくつか追加 + C conf_ref.txt + 新しく追加した設定の説明を追加 + C db_ref.txt + skill_cast_db.txt の list_hp_rate list_sp_rate で負数を指定した時の挙動を追加 + C help.txt + conf/help.txt 同様に変更 + C inter_server_packet.txt + 新規で追加したパケットを追加と実態とあっていなかった部分を修正 + C item.txt + 最新版に更新 + C item_bonus.txt + 新規で追加されたボーナスを追加 + C script_ref.txt + 新規命令の追加と既存命令の変更など + C serverlink_packet.txt + 新規で追加したパケットを追加と既存で書かれていなかったパケットの追加 + script/ + mob/ + C npc_monster.txt + 最新版に更新 + ニブルヘイムのMobはnpc_parse_mob()の変更サンプルになってます + npc/ + ほぼすべてのNPCをnpc_function.txtを使ったユーザー定義関数と複製などで書き換え + 移動したファイルに関しては移動後のファイルが含まれているので移動前のファイルのみ削除してください + 例) etc/npc_etc_cTower.txt は含まれているので npc_cTower.txt を削除 + M npc_cTower.txt + →etc/npc_etc_cTower.txt + A npc_function.txt + M npc_pota.txt + →../sample/npc_debug_pota.txt + M npc_pvp.txt + M npc_pvproom.txt + 2ファイル合体 + →etc/npc_etc_pvp.txt + M npc_resetJ.txt + →../sample/npc_debug_reset.txt + A etc/ + A npc_etc_gefenia.txt + C gvg/ + すべてev_agit_common.txtを使ったユーザー定義関数で書き換え + すべて削除してからこのパッチを当ててください + ギルド解散時に砦を放棄するためにev_agit_砦.txtにOnGuildBreakイベントを追加 + D test/ + A ev_agit_common.txt + D ev_agit_event.txt + D TEST_prtg_cas01_AbraiJ.txt + D TEST_prtg_cas01_mob.txt + D gvg_big5/ + C job/ + 転職スクリプトの名前をnpc_job_[JOB番号][ジョブ名].txtに変更 + すべて削除してからこのパッチを当ててください + C quest/ + M npc_event_arrow.txt + →../../sample/npc_debug_arrow.txt + A npc_event_hat2.txt + ニブル同時実装の新頭装備スクリプトを追加 + src/ + calloc() realloc() を極力各型にキャストするように変更 + calloc() 後に memset() で \0 を埋めていたのを削除 + calloc() なのに(サイズ*個数,1)で指定していたのを(個数,サイズ)に変更 + メモリ確保をエラー処理をまとめた関数に書き換え + malloc() → aMalloc() + calloc() → aCalloc() + realloc() → aRealloc() + strcpy() を strncpy() に極力変更 + + char/ + C char.c + スペースでインデントされていたところをタブで統一 + A isGM() + A read_gm_account() + GMアカウントが必要になったので追加 + C mmo_char_tostr() + C mmo_char_fromstr() + nullpoチェック追加 + C count_users() + 必要ない{}を削除 + C char_delete() + nullチェック追加 + 削除メッセージをコンソールに表示するようにした + 削除時に接続しているキャラを切断するようmap-serverに通知(0x2b19パケット)するようにした + C parse_tologin() + C 0x2713 + char-serverメンテナンス設定時はGM以外入れないようにした + 接続数制限で最大値でもGMは接続できるようにした + C 0x272a + 0x2730を0x272aに変更して番号を詰めた + アカウント削除した時にキャラが一部消されない問題を修正 + A 0x272c + 受信時にlogin-serverに通知(0x2b15パケット)してメンテナンス状態になるようにした + A char_erasemap() + map-server切断時に他map-serverにマップの削除を通知(0x2b16パケット)するようにした + これにより他map-server管轄のマップに移動しようとして、そのmap-serverが切断されていたら、 + pc_setpos()で存在しないマップということで移動しようとしなくなるので、 + クライアントが「永遠にお待ちください状態」にならないようになります + C parse_frommap() + map-server切断時にchar_erasemap()を実行するようにした + map-server切断時に管轄のマップにキャラが残っていたら切断を他map-serverに通知(0x2b17パケット)するようにした + C 0x2afc + 認証失敗時に char_dat[].mapip/mapport を 0 にするようにした + 認証成功時に char_dat[].mapip/mapport をmap-serverのIPアドレスとポートにするようにした + 認証成功時に他map-serverにキャラがログインしたことを通知(0x2b09パケット)するようにした + C 0x2b02 + C 0x2b05 + コンソールへの出力にパケット番号を記述するようにした + C 0x2b08 + パケット仕様を変更して account_id mapip mapport も通知するように変更 + map-serverに接続していない時はすべて 0 が入ります + A 0x2b13 + map-server起動途中などでキャラがログインできないようにする server[].active フラグを操作する + active = 0 でキャラはログインできずに切断される + map-serverが起動を完了したときに active = 1 にするパケットが送られてくる + A 0x2b14 + char-serverをメンテナンス状態にする char_maintenance フラグを操作する + login-serverにも通知(0x272bパケット)してワールド選択画面でメンテナンス表示をする + メンテナンス状態ではGM以外のユーザーはログインできません + A 0x2b18 + キャラクターの切断を他map-serverに通知(0x2b17パケット)するようにした + C search_mapserver() + 引数に struct mmo_charstatus *cd を追加 + cdが渡された&探しているマップが接続しているmap-serverに無かったときに、最初に見つけたmap-serverの最初に見つけたマップに接続するようにした + これは char_athena.conf default_map_type: 2 の時の挙動です + C parse_char() + C 0x65 + メンテナンス状態の時にGM以外を切断するようにした + 最大接続数が設定されていて最大接続数のときもGMは接続できるようにした + C 0x66 + char-serverに接続しているmap-serverにlast_pointが見つけられなかったときに、 + default_map_type&1 の時は default_map_name に接続する + default_map_type&2 の時は 最初に見つけたmap-serverの最初に見つけたマップに接続する + それでも見つからない時は切断するようにした + コンソールへの出力にパケット番号を記述するようにした + C 0x2af8 + 他マップに接続しているキャラ情報を通知(0x2b09パケット)するようにした + C 0x187 + S 0187パケットを返信するようにした + C check_connect_login_server() + char_portをWFIFOLで送っていたのをWFIFOWに修正 + 80と82の間が空いていたのを詰めてパケット長を86→84に変更 + C char_config_read() + default_map_type default_map_name を読み込むようにした + A gm_account_db_final() + 確保した gm_account_db のメモリを終了時に開放するようにした + C do_final() + inter.c など他ファイルの終了処理(do_final_*)を追加した + exit_dbn() でdb用のメモリを開放するようにした + 接続されているmap-serverのセッションを削除するようにした + do_final_timer()でtimerを終了させるようにした + C do_init() + server[].active = 0 で初期化 + read_gm_account() でGMアカウントファイルを読み込むようにした + C char.h + mmo_map_server に active フラグを追加した + C int_guild.c + C mapif_parse_GuildSkillUp() + ギルドポイントを消費しないでギルドスキルを上げるために int flag を追加 + C inter_guild_parse_frommap() + 0x303C + パケット定義を変更してflagを追加した + A guild_db_final() + A castle_db_final() + A do_final_int_guild() + 終了時にメモリを開放するようにした + C int_guild.h + A do_final_int_guild() + 定義を追加 + C int_party.c + A party_db_final() + A do_final_int_party() + 終了時にメモリを開放するようにした + C int_party.h + A do_final_int_party() + 定義を追加 + C int_pet.c + A pet_db_final() + A do_final_int_pet() + 終了時にメモリを開放するようにした + C int_pet.h + A do_final_int_pet() + 定義を追加 + C int_storage.c + A storage_db_final() + A guild_storage_db_final() + A do_final_int_storage() + 終了時にメモリを開放するようにした + C int_storage.h + A do_final_int_storage() + 定義を追加 + C inter.c + パケット長定義を変更 + A mapif_parse_CharPosReq() + 0x3090パケットへの対応 + キャラの位置要求をmap-serverに通知(0x3890パケット)する + A mapif_parse_CharPos() + 0x3091パケットへの対応 + キャラの位置要求をしたキャラに位置情報を通知(0x3891パケット)する + A mapif_parse_CharMoveReq() + 0x3092パケットへの対応 + 要求したキャラまで対象のキャラを飛ばす要求を通知(0x3892パケット)をする + A mapif_parse_DisplayMessage() + 0x3093パケットへの対応 + キャラにメッセージを送信(0x3893パケット)する + C inter_parse_frommap() + 各追加パケットへの対応を追加した + A wis_db_final() + A accreg_db_final() + A do_final_inter() + 終了時にメモリを開放するようにした + C inter.h + A do_final_inter() + 定義を追加 + C Makefile + A nullpo.o nullpo.h を追加 + A malloc.o malloc.h を追加 + common/ + C db.c + A exit_dbn() + 終了時にメモリを開放するために追加 + C db.h + A exit_dbn() + 定義追加 + A malloc.h + A malloc.c + メモリ確保関数のまとめ + C mmo.h + C mmp_charstatus + mapip mapport 追加 + C guild_castle + castle_event 追加 + C Makefile + A malloc.o malloc.h malloc.c を追加 + C nullpo.h + 古いgccでコンパイルできるように\を削除 + C socket.c + C recv_to_fifo() + 汎用性を高めるために read() を recv() に変更 + C send_from_fifo() + 汎用性を高めるために write() を send() に変更 + C timer.c + A do_final_timer() + 終了時にメモリを開放するようにした + C timer.h + A do_final_timer() + 定義追加 + login/ + C login.c + A login_version login_type + clientinfo.xmlで指定する login_version login_type でログインを規制するときに使います + C parse_fromchar() + A 0x272b + server[].maintenance フラグを変更する + 変更した内容をchar-serverに返信(0x272cパケット)する + C parse_admin() + C 0x7932 + 0x2730→0x272a に変更 + C parse_login() + C 0x64 0x01dd + login_version login_type を判定するようにした + C 0x2710 + パケット長の定義が正しくなかったのを修正した + char.c check_connect_login_server の変更を反映 + C login_config_read() + login_version login_typeの読み込みを追加 + A gm_account_db_final() + C do_final() + 終了時にメモリを開放するように変更 + C Makefile + A malloc.o malloc.h を追加 + map/ + C atcommand.c + コンパイルオプションでmemwatchを読み込めるようにした + C atcommand_where() + 他map-serverにいるキャラの居場所も表示できるようにした + C atcommand_jumpto() + 他map-serverにいるキャラにも飛べるようにした + C atcommand_who() + ワールド内のすべてにいるキャラを表示するようにした + C atcommand_go() + ニブルヘルムの移動ポイントを変更 + C atcommand_recall() + 他map-serverにいるキャラも呼び出せるようにした + A atshuffle_sub() + A atcommand_shuffle() + PCとMOBのシャッフルを行う @shuffle を追加 + A atcommand_maintenance() + char-serverをメンテナンス状態にする @maintenance を追加 + A atcommand_misceffect() + 実行したキャラから0x1f3パケットを発信してエフェクトを表示する @misceffect を追加 + A atcommand_summon() + コールホムンクルスと叫んで指定したMobを召喚する @summon を追加 + 召喚されたMobは他のMob(Pv等では敵対PC含む)を攻撃します + 召喚されたMobに攻撃されたMobは召喚主を攻撃します(バイオプラントのフローラと同じ挙動) + 召喚されたMobは1分後に消滅します + ネタなので隠しコマンドとしてhelp.txtには記述してません + C atcommand.h + 追加した@コマンドを AtCommandType に追加 + C msg_table[] を外から使えるようにするためにexternした + C battle.c + コンパイルオプションでmemwatchを読み込めるようにした + A battle_config.castle_defense_rate + 本鯖で防御値がどのように影響するか具体的には分からなかったので、砦の防御値を反映させる率を設定できるようにした + C battle_get_opt1() + C battle_get_opt2() + C battle_get_option() + NPCのオプションも返すようにした + A battle_get_opt3() + opt3を返すように追加 + C battle_calc_damage() + 砦内のMobへのダメージは防御値で減算(ダメージ*(防御値/100)*(castle_defense_rate/100))されるようにした + ガーディアンにはスキルが効くようにした + C battle_calc_pet_weapon_attack() + C battle_calc_mob_weapon_attack() + C battle_calc_pc_weapon_attack() + ベナムスプラッシャーのダメージ計算をするようにした + C battle_weapon_attack() + 武器攻撃による即死の仕様を変更 + 武器、鎧破壊の確率計算をするように変更 + ベナムスプラッシャーが解除されるように変更 + C battle_check_target() + src じゃなくて ss からparty_id guild_idを取得するように修正 + target=BCT_NOENEMY なスキル 口笛、ハミングなどがPvP、GvGの時にも他PCに影響するようにした + Mobがspecial_aiならMobを敵とみなすようにした + C battle_config_read() + castle_defense_rate を読み込むようにした + C battle.h + A battle_get_opt3() + 定義追加 + C Battle_Config + castle_defense_rate 追加 + C chat.c + C chat_createnpcchat() + 引数に int pub を追加 + pub=3 ではチャットの看板に(0/20)のような表示がされなくなります + A do_final_chat() + 何もしてないけどとりあえず追加 + C chat.h + C chat_createnpcchat() + 定義を変更 + A do_final_chat() + 定義を追加 + C chrif.c + パケット長テーブルを拡張 + C chrif_connect() + C chrif_changemapserver() + WFIFOLでポートを送っていたのをWFIFOWに修正 + A chrif_recverasemap() + 他map-serverが切断されたことがchar-serverより通知された時に、そのmap-serverが管理していたマップの情報を削除するようにした + A chrif_mapactive() + map-server起動準備中に0、完了時に1をchar-serverに通知(0x2b13)して起動途中にユーザーがログインできないようにした + A chrif_maintenance() + char-serverをメンテナンス状態にしたり解除したりを通知(0x2b14)する + A chrif_maintenanceack() + char-serverをメンテナンス状態にした時の応答 + メンテナンス状態にした旨をマップ内に通知する + A chrif_chardisconnect() + char-serverにキャラが切断されたことを通知(0x2b18)する + A chrif_parse_chardisconnectreq() + char-serverからのキャラ切断要求を受けて、対象キャラがいる場合には切断する + C chrif_parse() + C 0x2b09 + map_addchariddb() の引数増加に対応 + A 0x2b15 + A 0x2b16 + A 0x2b17 + A 0x2b19 + 各新規パケットに対応 + C check_connect_char_server() + 接続時char-serverにmap-serverの準備が出来たことを通知するようにした + A do_final_chrif() + 終了時にchar-serverとの接続を削除するようにした + C chrif.h + A chrif_mapactive() + A chrif_maintenance() + A chrif_chardisconnect() + A do_final_chrif() + 定義を追加 + C clif.c + すべてのパケット定義を packet_db から読み込むように変更 + packet_db.txtを変更することで、度々変更される韓国クライアントのパケット定義に対応しやすくなります + packet_len_table[] は packet_db[].len に置き換わりました + をinclude + clif_parse_*を先頭で宣言するようにした + clif_parse_*内のRFIFO系で使われている第2引数は packet_db[cmd].pos[] で表記されるようになりました + パケット番号の最大値を MAX_PACKET_DB で定義するようにした + C clif_set0078() + C clif_set007b() + パケットの内容が本鯖と違っていたのでguild_emblem_id,manner,opt3を正しく送るように変更 + C clif_class_change() + Mob以外のNPCでも使えるようにした + C clif_mob0078() + C clif_mob007b() + ガーディアンにギルドエンブレムを表示するように変更 + C clif_npc0078() + ワープポータルをギルドフラッグにするオプションを有効にした時にmap-serverが落ちる問題を修正 + C clif_spawnnpc() + NPCが無効でもHide状態の時はパケットを送るように変更 + C clif_quitsave() + キャラ終了時にchar-serverに切断を通知するようにした + C clif_scriptmenu() + C clif_dispchat() + C clif_changechatstatus() + lenに1バイト追加 + C clif_updatestatus() + マナーポイントを送信するようにした + A clif_changestatus() + 周囲に赤エモ状態であることを送信 + A clif_misceffect2() + エフェクトを発生させるパケットを送信 + @misceffect, misceffect命令で使用 + C clif_changeoption() + 状態異常時以外は状態異常アイコン表示パケットを送らないようにした + PCの時は clif_changelook() を送信するようにした(結婚衣裳表示用?) + C clif_traderequest() + 取引パケットの 0xe5 → 0x1f4 に仮対応(本鯖での算出式は不明なのでとりあえず char_id を送信) + C clif_tradestart() + 取引パケットの 0xe7 → 0x1f5 に仮対応(本鯖での算出式は不明なのでとりあえず char_id を送信) + C clif_getareachar_pc() + マナーポイントが負数の時には赤エモ表示パケットを送信するようにした + C clif_getareachar_npc() + NPCのHide状態に対応 + C clif_getareachar_skillunit() + C clif_skill_nodamage() + 自爆の時はhealを負数にできるようにした + C clif_skill_setunit() + グラフィティに対応 + A clif_item_repair_list() + 武器修理スキルに対応しようとしたけどパケットが分からないので頓挫中 + C clif_produceeffect() + map_addchariddb() の引数増加に対応 + C clif_guild_skillinfo() + 未実装ギルドスキル カリスマを表示しないようにした + C clif_callpartner() + あなたに逢いたい 使用時に相手の名前を叫ぶようにした + C clif_sitting() + 引数 fd は不要なので削除 + C clif_GM_kick() + フラグを0にするようにした + A clif_wisexin() + Wis拒否許可の応答を送信 + A clif_wisall() + Wis全拒否許可の応答を送信 + A clif_soundeffect() + SEを鳴らすパケットを送信 + soundeffect命令で使用 + C clif_parse_LoadEndAck() + 結婚後のウェディングドレスやタキシードの状態をログアウトしても1時間は継続されるようにした + 赤エモ状態はログアウトしてもログインした時からまた継続するようにした + C clif_parse_QuitGame() + C clif_parse_Restart() + 終了できない条件を pc_isquitable() にまとめた + C clif_parse_GlobalMessage() + C clif_parse_Wis() + C clif_parse_PartyMessage() + C clif_parse_GuildMessage() + 赤エモ状態では発言できないようにした + C clif_parse_ActionRequest() + ギルド未加入などの場合はガーディアンやエンペリウムを殴れないようにした + clif_sitting()の引数変更に対応 + C clif_parse_UseItem() + 赤エモ状態ではアイテムを使えないようにした + C clif_parse_EquipItem() + アイテムが破壊されている時は装備できないようにした + C clif_parse_TradeRequest() + C clif_parse_TradeAck() + notradeマップでは取引要請を送れないようにした + C clif_parse_UseSkillToId() + C clif_parse_UseSkillToPos() + C clif_parse_UseSkillMap() + noskillマップではスキルを使用できないようにした + チャット中はスキルを使用できないようにした + 赤エモ中はスキルを使用できないようにした + ウェディング状態ではスキルを使用できないようにした + C clif_parse_MoveToKafra() + itemdb_isdropable()==0 は倉庫に入れられないようにした + C clif_parse_GMReqNoChat() + GM右クリックで赤エモを付与・解除できるようにした + C clif_parse_GMReqNoChatCount() + 本鯖での返答パケットがよく分からないので仮対応 + 本当はアカウント名が返るのかな? + C clif_parse_sn_explosionspirits() + クライアントからパケットが来た時にコンソールにログを表示するようにした + BaseLv99以上の時に0で除算する可能性があるのを回避 + A pstrcmp() + clif_parse_wisexin()のqsort()で使用 + A clif_parse_wisexin() + Wis拒否許可に対応 + A clif_parse_wisexlist() + Wis拒否リスト表示に対応 + A clif_parse_wisall() + Wis全拒否許可に対応 + A clif_parse_GMkillall() + GMコマンド/killall(=@kickall)に対応 + A clif_parse_GMsummon() + GMコマンド/summon(=@recall)に対応 + A clif_parse_GMshift() + GMコマンド/shift(=@jumpto)に対応 + A clif_parse_debug() + packet_db.txtのデバグ用に追加 + パケット内容をダンプします + C clif_parse() + clif_parse_func_table を削除(packet_db[cmd].funcに入るようになりました) + A packetdb_readdb() + packet_db.txtを読み込みます + フォーマットは パケット番号,パケット長[,コマンド,コマンド引数の位置(:区切りで複数指定)] + コマンド引数の位置は各コマンドに対応する関数内で設定されているのでclif.cを読まないと分からない難解なフォーマットです + 変更されたパケットはpacket_db.txtの末尾に追加します + 古いクライアントを利用する場合には不要な定義を末尾から削除すればよいようにします + A do_final_clif() + 終了時にセッションを削除するようにした + C do_init_clif() + packet_dbを読み込むようにした + 終了時にセッションを削除できるように make_listen_port() の戻り値を map_fd に入れるようにした + C clif.h + A MAX_PACKET_DB + A struct packet_db + A clif_changestatus() + A clif_misceffect2() + A clif_callpartner() + A clif_sitting() + A clif_soundeffect() + A clif_item_repair_list() + A do_final_clif() + 定義を追加 + C clif_class_change + clif_mob_class_change() から変更 + C guild.c + C guild_read_castledb() + castle_event を読み込むようにした + C guild_skillup() + 引数を変更 + flag=1 でギルドポイントを使用しないようにした + C guild_broken() + ギルド解散時に所有砦を破棄するための OnGuildBreak イベントを追加 + A guild_db_final() + A castle_db_final() + A guild_expcache_db_final() + A guild_infoevent_db_final() + A do_final_guild() + 終了時にメモリを開放するようにした + C guild.h + C guild_skillup() + 定義を変更 + A do_final_guild() + 定義を追加 + C intif.c + atcommand.h をinclude + packet_len_table[] 拡張 + C intif_guild_skillup() + 引数 flag 追加 + A intif_charposreq() + キャラの場所要求パケットを送信 + flag=1 @jumpto + flag=0 @where + A intif_jumpto() + 他map-serverのキャラに @jumpto 出来るようにした + A intif_where() + 他map-serverのキャラに @where 出来るようにした + A intif_charmovereq() + キャラを呼び寄せる + flag=1 @recall + flag=0 あなたに逢いたい + A intif_displaymessage() + 他map-serverのキャラにメッセージを送れるようにした + (Wisではなくて送りっぱなし。@recall 成功時用) + C intif_parse_WisMessage() + Wis拒否の判定をするようにした + A intif_parse_CharPosReq() + キャラの居場所をInterへ返答 + A intif_parse_CharPos() + キャラの居場所がInterから送られてきたので + flag=1 キャラの場所へ移動(@jumpto) + flag=0 キャラの場所を表示(@where) + A intif_parse_CharMoveReq() + キャラがいたら指定位置に移動させる + flag=1 @recall なのでGMレベルを比較、メッセージを表示 + A intif_parse_DisplayMessage() + 指定キャラにメッセージを送信 + C intif_parse() + 新パケットを追加 + C intif.h + C intif_guild_skillup() + 定義変更 + A intif_jumpto() + A intif_where() + A intif_charmovereq() + A intif_displaymessage() + 定義の追加 + C itemdb.c + A itemdb_isdropable() + アイテムが捨てられるかどうかの判定をする + A itemdb_read_cardillustnametable() + grfファイルから num2cardillustnametable.txt を読み込む + cutincard命令で使用 + C do_init_itemdb() + itemdb_read_cardillustnametable() を追加 + C itemdb.h + C struct item_data + char cardillustname[64] 追加 + A itemdb_isdropable() + 定義の追加 + C Makefile + A malloc.o malloc.h を追加 + C map.c + C struct charid2nick + @whoで他map-serverのキャラも表示できるように account_id ip port を追加 + C map_freeblock() + C map_freeblock_unlock() + 二重free()対策でNULLを代入するようにした + C map_delblock() + 見やすいように繰り返し使用される変数をまとめた + C map_addchariddb() + charid2nick の拡張にあわせて引数を増やした + A map_delchariddb() + charid_db からキャラを削除(実際にはip portを0に)する + C map_quit() + 結婚状態中はログアウトしても1時間は状態が続くようにPCグローバル変数 PC_WEDDING_TIME に開始時間を記録するようにした + C map_id2bl() + 見やすいように書き換え + A map_eraseipport() + 他map-server管理のマップを map_db から削除する + A map_who_sub() + A map_who() + 他map-serverにいるキャラも @who で表示されるようにした + 表示上キャラが残ることがあるのは調査中 + A id_db_final() + A map_db_final() + A nick_db_final() + A charid_db_final() + C do_final() + 終了時にメモリを開放するように変更 + C map.h + A MAX_WIS_REFUSAL + Wis拒否リストの保存最大値 + C struct map_session_data + C special_state + A unbreakable_weapon + 武器が絶対に壊れない + A unbreakable_armor + 鎧が絶対に壊れない + A opt3 + 画面外から入ってきたキャラの状態 + A areanpc_id + OnTouchイベントを実行したNPCのID + A wis_refusal[][] + Wis拒否リスト + A wis_all + Wis全拒否フラグ + A break_weapon_rate + 武器破壊率 + A break_armor_rate + 鎧破壊率 + A add_steal_rate + 追加スティール率 + C struct npc_data + A opt1,opt2,opt3,option + PCと同じ + C u.scr + A src_id + 終了時のメモリ開放用 + C struct mob_data + A opt3 + PCと同じ + A guild_id + ガーディアンなどで使用 + D exclusion_* + 関連関数を消したので削除した + C struct map_data + C flag + A notrade + 取引禁止マップフラグ + A noskill + スキル使用禁止マップフラグ + 定数の追加 + SP_PARTNER SP_CART + SP_BREAK_WEAPON_RATE SP_BREAK_ARMOR_RATE SP_ADD_STEAL_RATE + SP_UNBREAKABLE_WEAPON SP_UNBREAKABLE_ARMOR + D talkie_mes[] + 定義削除 + C map_addchariddb() + 定義変更 + A map_delchariddb() + A map_eraseipport() + A map_who() + 定義追加 + C mob.c + D mob_exclusion_add() + D mob_exclusion_check() + 意味がある使用をされていないのとbattle_check_target()で代用できるので削除した + C mob_stop_walking() + type&4で目的の場所まで距離があれば1歩進んで止まるようにした + C mob_attack() + MobがMobを攻撃できるようにした + C mob_target() + C mob_ai_sub_hard_slavemob() + mob_exclusion_check()を削除 + C mob_ai_sub_hard_activesearch() + C mob_ai_sub_hard() + special_mob_aiな場合はMobも索敵するようにした + ルートモンスターが目標のアイテムを見失った時は目的の場所まで歩かないようにした + C mob_damage() + スフィアマインが殴られた時に自爆しなかったのを修正した + スフィアマインが殴られて自爆する時に移動するようにした + srcがMobの時はsrcのターゲットを外すようにした + C mob_skillid2skillidx() + インデックスが0から始まるのにエラーも0を返すしていたのを修正した + スフィアマインが殴られても自爆しない原因はこれ + C mobskill_use() + 自爆状態ではスキルを使用できないようにした + C mob_spawn() + ガーディアンとエンペリウムが砦で発生した場合は guild_id を設定 + opt3 を 0 で初期化 + C mob_can_reach() + GvG以外ではガーディアンは何もしないようにした + C mob_catch_delete() + Mobが消えるときのエフェクトを type で指定できるようにした + C mob_timer_delete() + スフィアマインとバイオプラントが消えるときはテレポエフェクトで消えるようにした + C mob_deleteslave_sub() + nullチェック前に代入している部分を修正 + C mob_class_change() + clif_class_change() の変更に対応 + C mob.h + C mob_catch_delete() + 定義変更 + D mob_exclusion_add() + D mob_exclusion_check() + 定義削除 + C npc.c + C struct npc_src_list + A prev + 終了時のメモリ開放用に追加 + C npc_checknear() + イベントPCの場合に常にOKを返していなかったのを修正 + A npc_enable_sub() + npc_enable() から呼ばれて周囲のPCにOnTouchイベントを実行する + C npc_enable() + flag による挙動を追加 + flag=2 NPCのHide状態を解除する + flag=4 NPCをHide状態にする + HideしているNPCは無効になります + 有効にした時に npc_enable_sub() を呼ぶようにした + C npc_event() + エラー時は1を返すように変更 + OnTouchイベントから呼ばれたときはイベントが見つからないエラーを返さないようにした + C npc_touch_areanpc() + PCがエリア内を通った時に何度も実行されるのを修正 + NPCにOnTouchイベントがあった場合には実行するようにした + 互換性を保つためにOnTouchイベントが無い場合は今までと同じように動きます + C npc_parse_warp() + option,opt1,opt2,opt3 を 0 で初期化 + C npc_parse_warp() + C npc_parse_shop() + IDをnpc_get_new_npc_id()で取得するようにした + option,opt1,opt2,opt3 を 0 で初期化 + C npc_convertlabel_db() + メモリ確保後にnullかどうか確認していないのを修正 + C npc_parse_script() + bad duplicate name!エラー表示が改行されていなかったのを修正 + 終了時メモリ開放用にduplicateで src_id を挿入 + IDをnpc_get_new_npc_id()で取得するようにした + option,opt1,opt2,opt3 を 0 で初期化 + C npc_parse_mob() + memwatch対策でメモリを一括確保しないようにした + モンスター名に --ja-- --en-- を指定するとmob_dbの名前を使うようにした + IDをnpc_get_new_npc_id()で取得するようにした + C npc_parse_mapflag() + notrade noskill を読み込むようにした + A ev_db_final() + A npcname_db_final() + A do_final_npc() + 終了時にメモリを開放するようにした + C do_init_npc() + メモリを開放するようにした + C npc.h + A do_final_npc() + 定義の追加 + C party.c + A party_db_final() + A do_final_party() + 終了時にメモリを開放するようにした + C party.h + A do_final_party() + 定義の追加 + C pc.c + A pc_numisGM() + account_idでGMかどうか判断する + A pc_isquitable() + PCが終了できる状態にあるかどうか判断する + 1を返すときは終了できない + C pc_counttargeted_sub() + Mob状態によって値を正しく返さないような気がするので条件を仮変更 + C pc_makesavestatus() + マナーポイントが正数の場合は 0 にする + C pc_authok() + wis_all を 0 で初期化 + map_addchariddb() の変更に対応と常に実行するようにした + C pc_calcstatus() + break_weapon_rate break_armor_rate add_steal_rate を 0 で初期化 + 結婚状態では歩く速度が半分になるようにした + C pc_bonus() + SP_UNBREAKABLE_WEAPON SP_UNBREAKABLE_ARMOR SP_BREAK_WEAPON_RATE SP_BREAK_ARMOR_RATE SP_ADD_STEAL_RATE + 処理を追加 + C pc_dropitem() + アイテムを捨てられるかどうか判定するようにした + C pc_putitemtocart() + アイテムをカートに移動できるか判定するようにした + C pc_steal_item() + スティール率に add_steal_rate を加算するようにした + C pc_walk() + C pc_movepos() + 範囲NPCがいないときには areanpc_id=0 にした + C pc_checkbaselevelup() + スパノビがレベルアップした時にかかるスキルのレベルを本鯖にあわせた + C pc_skillup() + guild_skillup() の変更に対応 + C pc_damage() + スパノビがExp99%でHPが0になるとHPが回復して金剛状態になるようにした + C pc_readparam() + nullチェック前にsdを使っていたのを修正 + A SP_PARTNER + 結婚相手のchar_id + A SP_CART + カートを引いている場合は0以上が返る + C pc_jobchange() + マナーポイントが負数の場合は赤エモ表示するようにした + A pc_break_weapon() + 武器破壊をする + A pc_break_armor() + 鎧破壊をする + C pc_natural_heal_sp() + スパノビは爆裂状態でもSPが自然回復するようにした + A gm_account_db_final() + A do_final_pc() + 終了時にメモリ開放するようにした + C pc.h + A pc_numisGM() + A pc_isquitable() + A pc_break_weapon() + A pc_break_armor() + A do_final_pc() + 定義追加 + C pet.c + C pet_data_init() + C pet_lootitem_drop() + メモリ確保できたかどうか確認していなかったので修正 + C pet_catch_process2() + mob_catch_delete() の変更に対応 + C script.c + 追加した関数のプロトタイプを先頭に追加 + buildin_func[]に追加した命令や関数を追加 + 演算子に C_R_SHIFT C_L_SHIFT を追加 + C parse_subexpr() + 演算子 >> << 追加 + C get_val() + PC主体の変数でPCがアタッチされていなかったらエラーを出すようにした + PC主体の変数でsd=NULLだった場合にはpc_read*で取得に行かないようにした + A buildin_close2() + スクリプトを中断してCloseボタンを表示します + C buildin_areawarp_sub() + RandomだけでなくSavePointにも飛ばせるようにした + A buildin_cutincard() + カードのアイテムIDを指定することでカード画像を表示します + C buildin_getitem() + 引数を変更して鑑定した状態で渡すかどうかを指定できるようにした + account_idを指定することで、そのPCにアイテムを渡せるようにした(結婚用拡張) + C buildin_getitem2() + account_idを指定することで、そのPCにアイテムを渡せるようにした(結婚用拡張) + C buildin_readparam() + キャラ名を指定することで、そのPCのパラメータを読み取れるようにした + C buildin_getcharid() + キャラ名を指定することで、そのPCの関係IDを取得できるようにした + A buildin_getpartymember() + 指定IDのパーティ人数の取得とパーティーメンバーのIDを配列で取得できます + A buildin_guildskill() + ギルドスキルを覚えることができます + C buildin_getgdskilllv() + ギルドスキルIDをGD_APPROVALのようなスキル名で指定するようにした + A buildin_hideoffnpc() + Hide状態のNPCを表示する + A buildin_hideonnpc() + NPCをHide状態にする + C buildin_sc_start() + ID指定したキャラを状態異常にできるようにした + A buildin_sc_start2() + 確率指定でキャラを状態異常にできます(アイス、おもち等で使用) + A buildin_getscrate() + 状態異常耐性を計算した確率を返す + C buildin_changebase() + IDで指定したキャラの見た目を変更することができるようにした + C buildin_waitingroom() + limit=0の時は(1/10)を表示しないようにした + C buildin_setmapflag() + MF_NOTRADE MF_NOSKILL を追加 + C buildin_flagemblem() + NPCが特定できなかったときにmap-serverが落ちる問題を修正 + A buildin_getinventorylist() + 配列で所持品を返します + A buildin_getskilllist() + 配列で所有スキルを返します + A buildin_clearitem() + 所持アイテムを削除します + A buildin_getrepairableitemcount() + 壊れているアイテムを数えます + A buildin_repairitem() + 壊れているアイテムをすべて修理します + A buildin_classchange() + NPCをクラスチェンジします + A buildin_misceffect() + エフェクトを表示します + A buildin_soundeffect() + 指定したSEを鳴らします + C op_2num() + C run_script_main() + シフト演算子を追加 + A mapreg_db_final() + A mapregstr_db_final() + A scriptlabel_db_final() + A userfunc_db_final() + C do_final_script() + 終了時にメモリを開放するようにした + C skill.c + intif.h をinclude + コメントのスキル名をjRO仕様に書き換え + C SkillStatusChangeTable[] + ベナムスプラッシャー グラフィティ 自爆 自爆2 を追加 + C skill_additional_effect() + ベナムスプラッシャー追加 + アンクルスネアを削除 + C skill_attack() + チャット中にスキルが影響しないようにした(チャットキャンセル) + ベナムスプラッシャーはSkillLv=-1でclif_skill_damage()するようにした + 自爆はダメージ表示しないようにした + C skill_castend_damage_id() + アシッドテラーで武器破壊をするようにした + ベナムスプラッシャーが3*3の範囲攻撃をするようにした + 自爆の処理を変更した + C skill_castend_nodamage_id() + sdとdstsdでPCかどうかを判定するようにした + スパノビの嫁がヒールを使うと回復量が2倍になるようにした + clif_sitting()の変更に対応 + 武器修理はパケットが分からないのでコメントアウト + ストリップ〜、ケミカル〜をスキルユニットに使用した場合、map-serverが落ちる問題を修正 + 君だけは護るよ、あなたの為に犠牲になりますの計算をMAX_HPまたはMAX_SPからするようにした + あなたに逢いたい を相手の名前を叫ぶ、複数設置できない等、本鯖風にした + アンクルスネアでPCが引っかかっている時にリムーブトラップしてもPCが動けるようにならなかったのを修正 + アンコールを叫ぶようにした + ベナムスプラッシャーを実装した + 自爆で自爆状態を開始するようにした + C skill_castend_pos2() + バイオプラント、スフィアマイン + パケット順番を変更 + 指定した場所に設置するようにした + 効果時間をskill_cast_db.txtで指定するようにした + mob_exclusion_add()を削除 + グラフィティを実装、1個しか置けません + C skill_castend_map() + ワープポータルは実際の設置時にブルージェムストーンを消費するようにした + C skill_unitsetting() + グラフィティのスキルユニットを1個に修正 + トーキーボックス、グラフィティの文字列は sd->message に格納するようにした + C skill_unit_onplace() + チャット時はスキルユニットが動作しないようにした(チャットキャンセル) + アンクルスネアにかかる処理をskill_additional_effect()から移動 + ワープポータルに術者が乗ったら消えるようにした + デモンストレーションによる武器破壊をするようにした + アンクルスネア、スパイダーウェッブでメモリアクセス違反が起きる可能性があったのを修正 + C skill_unit_onout() + アンクルスネアで「}」が足りなかったために近くを通りかかっただけで1秒後罠に戻ってしまったのを修正 + C skill_unit_onlimit() + ワープポータル発動前の処理を削除 + あなたに逢いたいを他map-serverにいても呼べるようにした + A skill_check_condition_mob_master_sub() + マップ内で同じPCから出たバイオプラントやスフィアマインの数を数える + C skill_check_condition() + hp_rateとsp_rateに負数を指定すると消費計算をMax値からするようにした + あなたに逢いたいを結婚していない状態で使ったら使用失敗を表示するようにした + バイオプラントとスフィアマインの設置数をskill_cast_db.txtで設定できるようにした + ファイアーウォールの数制限を skill_use_pos() から移動 + C skill_use_id() + バジリカをGvGでは使用できないようにした + ベナムスプラッシャーは対象が毒状態でなければ使用失敗 + C skill_use_pos() + ファイアーウォールの数制限を skill_check_condition() に移動 + C skill_status_change_end() + opt3の処理を追加 + 結婚状態の終了を追加 + ベナムスプラッシャーを追加 + 自爆を追加 + C skill_status_change_timer() + 結婚状態と赤エモ状態のタイマー再設定を追加 + 自爆状態では1秒ごとに速度が変化するようにした + C skill_status_change_start() + opt3の処理を追加 + グラフィティは追加で置いたら前のは消えるようにした + 結婚状態と赤エモ状態を追加 + グラフィティは状態異常開始時にスキルユニットを設置するようにした + ベナムスプラッシャーは特に何も追加はなし + 自爆は詠唱パケットをここで送るようにした + C skill_status_change_clear() + opt3の処理を追加 + C skill_unit_timer_sub() + ワープポータル発動前が時間切れになるときに見た目を変更して本鯖のように効果音が出るようにした + ブラストマイン以外の罠は時間切れで罠に戻るようにした + C skill.h + 状態異常にスキル名をいくつかつけたり、新規の状態異常を増やした + C storage.c + A storage_db_final() + A guild_storage_db_final() + C do_final_storage() + 終了時にメモリを開放するようにした + C trade.c + C trade_tradeadditem() + C trade_tradecommit() + itemdb_isdropable()で交換できないアイテムを判定するようにした + C vending.c + vending_purchasereq() + 金額計算をdoubleでするようにしてintで桁あふれしないようにした + +-------------------- +//1045 by TEILU + +・スティール、スティールコイン、スナッチャーの失敗メッセージが + レベルが1〜9の時に変だったので修正。 + (map/) + skill.c + +・精錬の可否を情報サイトを元にDBに設定。(頭装備はrusiさん作成分を使用) + (db/) + item_db.txt + +・ファイアーウォールが制限数を超えたときにスキル使用失敗が + 出るタイミングを変更。 + (map/) + skill.c + +・アブラカタブラ専用スキルをgm_all_skill設定時に表示できるように変更。 + battle_athena.confのgm_all_skill_add_abraにyesを設定すれば + スキルリストに表示されるようになります。 + (conf/) + battle_athena.conf + (db/) + skill_require_db.txt + (map/) + battle.c + battle.h + pc.c + +-------------------- +//1044 by TEILU + +・1042で@itemidentifyの権限の設定を忘れていたので追加。 + (conf/) + atcommand_athena.conf + +・スティール、スティールコイン、スナッチャーの失敗時に + 失敗メッセージを表示するように変更。 + (map/) + skill.c + +・アイテムDBに精錬可否フラグのカラムを追加 + 精錬の可否をDBを参照するように修正 + ※とりあえず中段、下段、中下段の頭装備とアクセサリ以外の + 装備品はすべて精錬可の設定でDBを作りました。 + DBは修正が必要になります。 + (db/) + item_db.txt + (map/) + itemdb.c + itemdb.h + script.c + +-------------------- +//1043 by dusk +・docフォルダ・confフォルダ内のhelp.txtに1042(TEILUさん)の説明追加 + @itemidentifyの説明は72行目の@itemresetの下に。 + +・Valkyrie Realms 5 (右上)の旗の修正 + Valkyrie Realms 5 (右上)の旗を見ると未取得状態コメントばっかり出ていたのを + ちゃんと確認できるように。 + ※ Valkyrie Realmsの各砦に戻る旗とは違います。 + prtg_cas05.txt内のギルドダンジョンに入るレバー以外の + getcastledata "prtg_cas05.gat",1,@GIDp5;を + set @GIDp5,getcastledata("prtg_cas05.gat",1);に修正。 + +-------------------- +//1042 by TEILU + +・@healコマンドに何も渡さないと完全回復するように変更。 + (map/) + atcommand.c + +・@itemitemidentifyコマンドの追加 + 未鑑定の所持アイテムを全て鑑定します。 + (conf/) + msg_athena.conf + (map/) + atcommand.c + atcommand.h + +-------------------- +//1041 by mare + FIX NPC Script Command - buildin_getgdskilllv() + Add NPC Sctipt Command - buildin_agitcheck() + (script/npc/job/) + npc_job_wizard.txt + ラウレルさんの台詞、ノビとプリの場合の分追加 +------------------- +//1040 by 胡蝶蘭 + +・サーバー間接続のパケット表追加 + (doc/) + serverlink_packet.txt + inter<->map 以外のサーバー間接続のパケット表 + +・仕様スレの Login_ID2 関係でごにょごにょ +・サーバー間接続のパケット一部変更 + (login/) + login.c + auth_fifo に ip メンバ追加 + パケット変更に伴う変更他 + (char/) + char.c + auth_fifo に login_id2, ip メンバ追加 + パケット変更に伴う変更他 + (map/) + chrif.c + chrif_authok()追加 + パケット変更に伴う変更他 + +・自動再起動スクリプト start にコメントで簡単な説明追加 + start + コメント追加 + +-------------------- +//1039 by Ni+S + ・ギルド関係のスクリプト + 所有者の居ないアジトから、ギルドに所属してないキャラなら + ギルドダンジョンに入れてしまうという不具合がありました + + これは、所有者の居ないアジトの値が0であり、 + getcharid(2)でギルドIDを返すのですが、 + ギルドに所属していないキャラはgetcharid(2)で0を返す為、 + 値が一致してしまい起こっていた現象でした + 未所属キャラが入れないように修正しました + + ・ファーマシー/ポーション作成DB + レッドスリムポーション + イエロースリムポーション + ホワイトスリムポーション + の材料を、空のポーション瓶から試験管に修正 + +-------------------- +//1038 by Plala +・転職NPC関連の重大なバグ修正 + (script/npc/job) + npc_job_aco.txt 修正 + npc_job_merchant.txt 修正 + npc_job_thief.txt 修正 + + ・上記NPCで途中までクエストを進めて他の職に転職すると、 + 再び転職可能だった点を修正しました + + +-------------------- +//1037 by 胡蝶蘭 + +** FOR ENGLISH DEVELOPERS ** +DO NOT UPLOAD IF YOU DON'T USE JAPANESE ENCODE (SHIFT-JIS) ! +WHY WE(JAPANESE) REPAIR ERROR CHARACTER AFTER EVERY YOUR UPLOADING ? +BREAKING IS EASY, REPAIRING IS VERY DIFFICULT ! + +** 英語圏の開発者の方へ(日本語訳) ** +日本語エンコード(シフトJIS)を使う気が無いならアップロードしないてください! +なぜ我々(日本人)があなた方のアップロードのたびに文字化けを直さなければならないんですか? +壊すのは簡単ですが、直すのはとても難しいんです! + +・文字化けを根性で修正 + (map/) + script.c + +・ladminがPOSIX必須に。Digest::MD5が無くても実行できるように修正 +・serverstatus.cgiで、Net::Pingが無くても実行できるように修正 + (bin/tool/) + ladmin + (bin/tool/cgi/) + serverstatus.cgi + +・script_refで抜けてるものでわかるものを修正 + 何故かscript_refから抜けてるもの(getargなど)の一部を再び追加 + ** アップロードするときは最新パッチからの差分をアップロードしましょう ** + (doc/) + script_ref.txt + +・account_making.txt修正 + ladminスクリプトのパス + (doc/) + accoun_tmaking.txt + +-------------------- +//1036 by Michael +・追加 Script Command: + getequipid(EquipPos); EquipPos: 1-10 + gettimetick(Type); Type: 0 SystemTick, 1 TimeSecondTick(0-86399) + gettime(Type); Type: 1 Sec, 2 Min, 3 Hour, 4 Weekday, 5, Monthday, 6 Month, 7 Year + gettimestr("TimeFMT", Len); TimeFMT: Time format strinf / Len: String Length + + (map/) + script.c + buildin_getequipid(); 追加 + buildin_gettimetick(); 追加 + buildin_gettime(); 追加 + buildin_gettimestr(); 追加 + +-------------------- +//1035 by Michael +・追加 GVG Script NPC edit from Aegis NPC(Chinese-big5 version), Please someone translate to Japanese. +・修正 NPC Script Command - buildin_getgdskilllv() + getgdskilllv(Guild_ID, Skill_ID); + + (map/) + script.c + buildin_getgdskilllv() 修正 + +-------------------- +//1034 by (Pepermint) + FIX NPC Script Command - buildin_getgdskilllv() + Add NPC Sctipt Command - buildin_agitcheck() + (map/) + script.c + buildin_getgdskilllv() 修正 + buildin_agitcheck() 追加 + +-------------------- +//1033 by Michael +・追加 NPC Script Command - buildin_getgdskilllv() + getgdskilllv(Guild_ID, Skill_ID); + skill_id = 1:GD_APPROVAL,2:GD_KAFRACONTACT,3:GD_GUARDIANRESEARCH,4:GD_CHARISMA,5:GD_EXTENSION + + (map/) + script.c + buildin_getgdskilllv() 追加 + -------------------- //1032 by (凸) ・1031で何故か削除されていたbuildin_getitemname()を復活 @@ -17,7 +2937,7 @@ script.c buildin_getitemname() 復活 ----------------------------------------- +-------------------- //1031 by huge ・NPCのscriptに、makepetを追加。 makepet 卵ID; で、ペットを作成します。 @@ -110,11 +3030,11 @@ pc.c pc_calcstatus() 変更 skill.c - + skill_status_change_end() 変更 skill_status_change_start() 変更とNULLチェック修正 skill.h 変更 - + -------------------- //1027 by Ni+S ・getitemname関数追加 @@ -125,7 +3045,7 @@ script.c getitemname()追加 ----------------------------------------- +-------------------- //1026 by (凸) ・1023で入れてなかったclif.hを同梱 ・バイオプラントとスフィアーマインで出したmobを倒すとmob_timer_delete()でnullpoが出る問題を解決したつもり @@ -150,7 +3070,6 @@ ・オーラブレード武器制限を素手以外全てに修正 ・コンセントレーション武器制限を両手槍のみから片手槍+両手槍へ修正 ・トゥルーサイト効果時間を修正 -・ファルコンアサルト武器制限を解除、素手を含めた全てで使用可能に (db/) job_db2-2.txt 変更 @@ -164,7 +3083,7 @@ (db/) produce_db.txt 変更 ----------------------------------------- +-------------------- //1023 by (凸) ・1022でエンバグしたnpc_parse_script()を戻し ・スパイラルピアースの重量追加ダメージ計算式をちょっと変更 @@ -403,13 +3322,17 @@ -------------------- //1014 by (Pepermint) -I fixed again the problem if you put minus sign(-) in front of digits, +I fixed again the problem if you put minus sign(-) in front of digits, the error comes up when you puchase a item. -When you put a minus sign(-), the error sign will be changed shrotage of +When you put a minus sign(-), the error sign will be changed shrotage of amount as original server dose. I tested with it in ver. 1013, it was working +-------------------- +//1013 by (凸) +・サーバースナップショット + -------------------- //1012 by (凸) ・help.txtにある@goの説明から13と14を削除 diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt index 92e458588..93badb7a2 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -16,7 +16,7 @@ 18,2000:1850:1700:1550:1400:1250:1100:950:800:650,0,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0 //MG_FIREWALL#ファイアーウォール# 19,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_FIREBOLT#ファイアーボルト# 20,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_LIGHTNINGBOLT#ライトニングボルト# -21,1000:2000:3000:4000:5000:6000:7000:8000:9000:10000,2000,0,0 //MG_THUNDERSTORM#サンダーストーム# +21,1000:2000:3000:4000:5000:6000:7000:8000:9000:10000,2000,500,0 //MG_THUNDERSTORM#サンダーストーム# 24,0,0,10000,0 //AL_RUWACH#ルアフ# 25,0,0,10000,0 //AL_PNEUMA#ニューマ# @@ -62,17 +62,17 @@ 78,0,3000,600000,0 //PR_LEXAETERNA#レックスエーテルナ# 79,15000,4000,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0 //PR_MAGNUS#マグヌスエクソシズム# 80,3000:2700:2400:2100:1800:1500:1200:900:600:300,2000,30000,0 //WZ_FIREPILLAR#ファイアーピラー# -81,700,2000,0,0 //WZ_SIGHTRASHER#サイトラッシャー# +81,700,2000,500,0 //WZ_SIGHTRASHER#サイトラッシャー# -83,15000,2000:3000:3000:4000:4000:5000:5000:6000:6000:7000,0,3200:3400:3600:3800:4000:4200:4400:4600:4800:5000 //WZ_METEOR#メテオストーム# +83,15000,2000:3000:3000:4000:4000:5000:5000:6000:6000:7000,500,3200:3400:3600:3800:4000:4200:4400:4600:4800:5000 //WZ_METEOR#メテオストーム# 84,2500:3000:3500:4000:4500:5000:5500:6000:6500:7000,0,0,0 //WZ_JUPITEL#ユピテルサンダー# -85,15000:14500:14000:13500:13000:12500:12000:11500:11000:10500,5000,0,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000 //WZ_VERMILION#ロードオブヴァーミリオン# +85,15000:14500:14000:13500:13000:12500:12000:11500:11000:10500,5000,4100,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000 //WZ_VERMILION#ロードオブヴァーミリオン# 86,1000:2000:3000:4000:5000,0,0,0 //WZ_WATERBALL#ウォーターボール# 87,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //WZ_ICEWALL#アイスウォール# 88,5000:4700:4400:4100:3800:3500:3200:2900:2700:2500,1000,0,3000:3500:4000:4500:5000:5500:6000:6500:7000:7500 //WZ_FROSTNOVA#フロストノヴァ# -89,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000,5000,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //WZ_STORMGUST#ストームガスト# +89,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000,5000,4600,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //WZ_STORMGUST#ストームガスト# 90,1000:2000:3000:4000:5000,700,0,0 //WZ_EARTHSPIKE#アーススパイク# -91,1000:2000:3000:4000:5000,700,0,0 //WZ_HEAVENDRIVE#ヘヴンズドライブ# +91,1000:2000:3000:4000:5000,700,500,0 //WZ_HEAVENDRIVE#ヘヴンズドライブ# 92,0,1000,5000:10000:15000:20000:25000,5000:10000:15000:20000:25000 //WZ_QUAGMIRE#クァグマイア# 110,0,0,0,6000:7000:8000:9000:10000:11000 //BS_HAMMERFALL#ハンマーフォール# @@ -155,7 +155,7 @@ 251,0,700,0,0 //CR_SHIELDBOOMERANG#シールドブーメラン# 252,0,0,300000,0 //CR_REFLECTSHIELD#リフレクトシールド# 253,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_HOLYCROSS#ホーリークロス# -254,3000,1500,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_GRANDCROSS#グランドクロス# +254,3000,1500,1000,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_GRANDCROSS#グランドクロス# 256,3000,0,180000,0 //CR_PROVIDENCE#プロヴィデンス# 257,0,800,180000,0 //CR_DEFENDER#ディフェンダー# @@ -218,6 +218,8 @@ 335,3000,0,0,0 //WE_FEMALE#あなたに尽くします# 336,0,0,10000,0 //WE_CALLPARTNER#あなたに逢いたい# +339,3000,1500,1000,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //NPC_DARKGRANDCROSS#闇グランドクロス + 355,0,0,40000:60000:80000:100000:120000,0 //LK_AURABLADE#オーラブレード# 356,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,0 //LK_PARRYING#パリイング# 357,0,0,25000:30000:35000:40000:45000,0 //LK_CONCENTRATION#コンセントレーション# @@ -270,6 +272,10 @@ 476,1000,1000,75000:90000:105000:120000:135000,0 //ST_FULLSTRIP## 479,2000,0,120000:240000:360000:480000:600000,0 //CR_FULLPROTECTION## +10006,0,0,300000,0 //GD_LEADERSHIP## +10007,0,0,300000,0 //GD_GLORYWOUNDS## +10008,0,0,300000,0 //GD_SOULCOLD## +10009,0,0,300000,0 //GD_HAWKEYES## 10010,100,1000,60000,0 //GD_BATTLEORDER## 10011,100,1000,60000,0 //GD_REGENERATION## 10012,100,1000,0,0 //GD_RESTORE## diff --git a/db/skill_db.txt b/db/skill_db.txt index d7b4fd9d0..c66c43a33 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -454,7 +454,7 @@ 394,8,8,1,0,0,10,9,no,0,0,0,weapon,0 //CG_ARROWVULCAN#アロ?バルカン# 395,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CG_MOONLIT#月明りの泉に落ちる花びら# 396,0,6,16,0,1,1,1,yes,0,0,0,magic,1 //CG_MARIONETTE#?リオネットコントロ?ル# -397,4,8,1,0,0,5,1,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#スパイラルピア?ス# +397,4,8,1,0,0,5,5,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#スパイラルピア?ス# 398,4,6,1,0,0,5,1,no,0,0,0,weapon,0 //LK_HEADCRUSH#ヘッドクラッシュ# 399,4,6,1,0,0,10,1,no,0,0,0,weapon,0 //LK_JOINTBEAT#ジョイントビ?ト# 400,8,8,1,8,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //HW_NAPALMVULCAN#ナパ??バルカン# diff --git a/db/skill_unit_db.txt b/db/skill_unit_db.txt new file mode 100644 index 000000000..9c0616e30 --- /dev/null +++ b/db/skill_unit_db.txt @@ -0,0 +1,78 @@ +// id,unit,unit,layout,range,interval,target,flag +// position -1:特殊, 0:1*1, 1:3*3, 2:5*5,..., 5:11*11 +// target friend:NOENEMY, party:PARTY, 0x20000:BCT_ALL, enemy:ENEMY +// flag 0x001(UF_DEFNOTENEMY) defunit_not_enemyの影響を受ける +// 0x002(UF_NOREITERRATION) 重ね置き不可 +// 0x004(UF_NOFOOTSET) 足元置き不可 +// 0x008(UF_NOOVERLAP) 効果が重複しない +// 0x100(UF_DANCE) ダンススキル +// 0x200(UF_ENSEMBLE) 合奏スキル +// +// 0x89,0x8a,0x8b 表示無し +// 0x9a 炎属性の詠唱みたいなエフェクト +// 0x9b 水属性の詠唱みたいなエフェクト +// 0x9c 風属性の詠唱みたいなエフェクト +// 0x9d 白い小さなエフェクト +// +// u1 u2 lay r intr target flag + 12,0x7e, , 0, 0, -1,all, 0x003 //MG_SAFETYWALL#セイフティウォール + 18,0x7f, , -1, 0, 1,enemy, 0x000 //MG_FIREWALL#ファイアーウォール + 21,0x86, , 0, 1,1000,enemy, 0x008 //MG_THUNDERSTORM#サンダーストーム + 25,0x85, , 1, 0, -1,all, 0x003 //AL_PNEUMA#ニューマ + 27,0x81,0x80, 0, 0, -1,all, 0x002 //AL_WARP#ワープポータル + 70,0x83, , -1, 1,1000,all, 0x000 //PR_SANCTUARY#サンクチュアリ + 79,0x84, , -1, 1,3000,enemy, 0x000 //PR_MAGNUS#マグヌスエクソシズム + 80,0x87,0x88, 0, 1,2000,enemy, 0x002 //WZ_FIREPILLAR#ファイアーピラー + 83,0x86, , 0, 3,1000,enemy, 0x000 //WZ_METEOR#メテオストーム + 85,0x86, , 0, 6,1000,enemy, 0x008 //WZ_VERMILION#ロードオブヴァーミリオン + 87,0x8d, , -1, 0, -1,all, 0x000 //WZ_ICEWALL#アイスウォール + 88,0x86, , 0, 2,1000,enemy, 0x000 //WZ_FROSTNOVA#フロストノヴァ + 89,0x86, , 0, 5, 450,enemy, 0x000 //WZ_STORMGUST#ストームガスト + 91,0x86, , 0, 2,1000,enemy, 0x000 //WZ_HEAVENDRIVE#ヘヴンズドライブ + 92,0x8e, , 2, 0, -1,enemy, 0x000 //WZ_QUAGMIRE#クァグマイア +115,0x90, , 0, 1,1000,enemy, 0x002 //HT_SKIDTRAP#スキッドトラップ +116,0x93, , 0, 1,1000,enemy, 0x002 //HT_LANDMINE#ランドマイン +117,0x91, , 0, 1,1000,enemy, 0x002 //HT_ANKLESNARE#アンクルスネア +118,0x94, , 0, 1,1000,enemy, 0x002 //HT_SHOCKWAVE#ショックウェーブトラップ +119,0x95, , 0, 2,1000,enemy, 0x002 //HT_SANDMAN#サンドマン +120,0x96, , 0, 1,1000,enemy, 0x002 //HT_FLASHER#フラッシャー +121,0x97, , 0, 1,1000,enemy, 0x002 //HT_FREEZINGTRAP#フリージングトラップ +122,0x8f, , 0, 1,1000,enemy, 0x002 //HT_BLASTMINE#ブラストマイン +123,0x98, , 0, 2,1000,enemy, 0x002 //HT_CLAYMORETRAP#クレイモアトラップ +125,0x99, , 0, 1,1000,all, 0x002 //HT_TALKIEBOX#トーキーボックス +140,0x92, , -1, 0,1000,enemy, 0x000 //AS_VENOMDUST#ベナムダスト +220,0xb0, , 0, 0, -1,all, 0x002 //RG_GRAFFITI#グラフィティ +229,0xb1, , 0, 1,1000,enemy, 0x000 //AM_DEMONSTRATION#デモンストレーション +254,0x86, , -1, 0, 300,enemy, 0x000 //CR_GRANDCROSS#グランドクロス +285,0x9a, , 3, 0, -1,all, 0x000 //SA_VOLCANO#ボルケーノ +286,0x9b, , 3, 0, -1,all, 0x000 //SA_DELUGE#デリュージ +287,0x9c, , 3, 0, -1,all, 0x000 //SA_VIOLENTGALE#バイオレントゲイル +288,0x9d, , 3, 0, -1,all, 0x000 //SA_LANDPROTECTOR#ランドプロテクター +306,0x9e, , 4, 0, -1,all, 0x300 //BD_LULLABY#子守歌 +307,0x9f, , 4, 0, -1,party, 0x300 //BD_RICHMANKIM#ニヨルドの宴 +308,0xa0, , 4, 0, -1,enemy, 0x300 //BD_ETERNALCHAOS#永遠の混沌 +309,0xa1, , 4, 0, -1,party, 0x300 //BD_DRUMBATTLEFIELD#戦太鼓の響き +310,0xa2, , 4, 0, -1,party, 0x300 //BD_RINGNIBELUNGEN#ニーベルングの指輪 +311,0xa3, , 4, 0, -1,all, 0x300 //BD_ROKISWEIL#ロキの叫び +312,0xa4, , 4, 0, -1,party, 0x300 //BD_INTOABYSS#深淵の中に +313,0xa5, , 4, 0, -1,party, 0x300 //BD_SIEGFRIED#不死身のジークフリード +317,0xa6, , 3, 0, -1,enemy, 0x100 //BA_DISSONANCE#不協和音 +319,0xa7, , 3, 0, -1,friend,0x100 //BA_WHISTLE#口笛 +320,0xa8, , 3, 0, -1,friend,0x100 //BA_ASSASSINCROSS#夕陽のアサシンクロス +321,0xa9, , 3, 0, -1,friend,0x100 //BA_POEMBRAGI#ブラギの詩 +322,0xaa, , 3, 0, -1,friend,0x100 //BA_APPLEIDUN#イドゥンの林檎 +325,0xab, , 3, 0, -1,enemy, 0x100 //DC_UGLYDANCE#自分勝手なダンス +327,0xac, , 3, 0, -1,friend,0x100 //DC_HUMMING#ハミング +328,0xad, , 3, 0, -1,enemy, 0x100,0 //DC_DONTFORGETME#私を忘れないで… +329,0xae, , 3, 0, -1,friend,0x100,0 //DC_FORTUNEKISS#幸運のキス +330,0xaf, , 3, 0, -1,party, 0x100,0 //DC_SERVICEFORYOU#サービスフォーユー +336,0xb2, , 0,-1, -1,all, 0x000,0 //WE_CALLPARTNER#あなたに逢いたい +339,0x86, , -1, 0, 300,enemy, 0x000,0 //NPC_DARKGRANDCROSS#闇グランドクロス +362,0xb4, , 0, 3, 300,all, 0x000,0 //HP_BASILICA#バジリカ +369,0xb3, , 3, 0, -1,all, 0x000,0 //PA_GOSPEL#ゴスペル +404,0xb6, , -1, 0, -1,all, 0x000,0 //PF_FOGWALL#フォグウォール +405,0xb7, , 0, 1,1000,enemy, 0x002,0 //PF_SPIDERWEB#スパイダーウェッブ +10006,0xc1, , 0, 2, -1,all, 0x000,0 //GD_LEADERSHIP +10007,0xc2, , 0, 2, -1,all, 0x000,0 //GD_GLORYWOUNDS +10008,0xc3, , 0, 2, -1,all, 0x000,0 //GD_SOULCOLD +10009,0xc4, , 0, 2, -1,all, 0x000,0 //GD_HAWKEYES diff --git a/src/char/Makefile b/src/char/Makefile index 3c09db92c..aee0e69e2 100644 --- a/src/char/Makefile +++ b/src/char/Makefile @@ -1,7 +1,7 @@ all: char-server txt: char-server -COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/showmsg.o ../common/strlib.o +COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/lock.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h char-server: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o $(COMMON_OBJ) $(CC) -o ../../$@ $> $(LIB_S) diff --git a/src/char_sql/Makefile b/src/char_sql/Makefile index e206dd211..1741b5ab6 100644 --- a/src/char_sql/Makefile +++ b/src/char_sql/Makefile @@ -1,7 +1,7 @@ all: char-server_sql sql: char-server_sql -COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o ../common/utils.o ../common/strlib.o +COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/utils.o ../common/obj/strlib.o COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/db.h ../common/malloc.h ../common/showmsg.h ../common/utils.h ../common/strlib.h char-server_sql: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o itemdb.o $(COMMON_OBJ) diff --git a/src/common/Makefile b/src/common/Makefile index eaa7205d2..c387c2e01 100644 --- a/src/common/Makefile +++ b/src/common/Makefile @@ -1,15 +1,23 @@ -txt sql all: core.o socket.o timer.o grfio.o db.o lock.o nullpo.o malloc.o showmsg.o - -core.o: core.c core.h showmsg.h -socket.o: socket.c socket.h mmo.h showmsg.h -timer.o: timer.c timer.h showmsg.h -grfio.o: grfio.c grfio.h showmsg.h -db.o: db.c db.h showmsg.h -lock.o: lock.h showmsg.h -nullpo.o: nullpo.c nullpo.h showmsg.h -malloc.o: malloc.c malloc.h showmsg.h -showmsg.o: showmsg.c showmsg.h -strlib.o: strlib.c strlib.h utils.h +txt sql all: obj common + +obj: + mkdir obj + +common: obj/core.o obj/socket.o obj/timer.o obj/grfio.o obj/db.o obj/lock.o obj/nullpo.o obj/malloc.o obj/showmsg.o obj/strlib.o obj/utils.o + +obj/%.o: %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + +obj/core.o: core.c core.h showmsg.h +obj/socket.o: socket.c socket.h mmo.h showmsg.h +obj/timer.o: timer.c timer.h showmsg.h +obj/grfio.o: grfio.c grfio.h showmsg.h +obj/db.o: db.c db.h showmsg.h +obj/lock.o: lock.h showmsg.h +obj/nullpo.o: nullpo.c nullpo.h showmsg.h +obj/malloc.o: malloc.c malloc.h showmsg.h +obj/showmsg.o: showmsg.c showmsg.h +obj/strlib.o: strlib.c strlib.h utils.h clean: - rm -f *.o + rm -f *.o obj diff --git a/src/common/core.c b/src/common/core.c index fbd607080..016ade08d 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -9,10 +9,13 @@ #include #include #ifdef DUMPSTACK -#include + #ifndef _WIN32 // HAVE_EXECINFO_H + #include + #endif #endif #include "../common/mmo.h" +#include "malloc.h" #include "core.h" #include "socket.h" #include "timer.h" @@ -92,44 +95,44 @@ static void sig_proc(int sn) * Dumps the stack using glibc's backtrace *----------------------------------------- */ -#ifdef DUMPSTACK static void sig_dump(int sn) { - FILE *fp; - void* array[20]; + #ifdef DUMPSTACK + FILE *fp; + void* array[20]; - char **stack; - size_t size; - int no = 0; - char tmp[256]; + char **stack; + size_t size; + int no = 0; + char tmp[256]; - // search for a usable filename - do { - sprintf(tmp,"save/stackdump_%04d.txt", ++no); - } while((fp = fopen(tmp,"r")) && (fclose(fp), no < 9999)); - // dump the trace into the file - if ((fp = fopen (tmp,"w")) != NULL) { + // search for a usable filename + do { + sprintf(tmp,"save/stackdump_%04d.txt", ++no); + } while((fp = fopen(tmp,"r")) && (fclose(fp), no < 9999)); + // dump the trace into the file + if ((fp = fopen (tmp,"w")) != NULL) { - fprintf(fp,"Exception: %s\n", strsignal(sn)); - fprintf(fp,"Stack trace:\n"); - size = backtrace (array, 20); - stack = backtrace_symbols (array, size); + fprintf(fp,"Exception: %s\n", strsignal(sn)); + fprintf(fp,"Stack trace:\n"); + size = backtrace (array, 20); + stack = backtrace_symbols (array, size); - for (no = 0; no < size; no++) { + for (no = 0; no < size; no++) { - fprintf(fp, "%s\n", stack[no]); + fprintf(fp, "%s\n", stack[no]); - } - fprintf(fp,"End of stack trace\n"); + } + fprintf(fp,"End of stack trace\n"); - fclose(fp); - free(stack); - } + fclose(fp); + free(stack); + } + #endif // When pass the signal to the system's default handler compat_signal(sn, SIG_DFL); raise(sn); } -#endif int get_svn_revision(char *svnentry) { // Warning: minor syntax checking char line[1024]; @@ -204,28 +207,20 @@ int main(int argc,char **argv) compat_signal(SIGPIPE,SIG_IGN); compat_signal(SIGTERM,sig_proc); compat_signal(SIGINT,sig_proc); - -#ifndef DUMPSTACK - // Signal to create coredumps by system when necessary (crash) - compat_signal(SIGSEGV, SIG_DFL); - compat_signal(SIGFPE, SIG_DFL); - compat_signal(SIGILL, SIG_DFL); - #ifndef _WIN32 - compat_signal(SIGBUS, SIG_DFL); - compat_signal(SIGTRAP, SIG_DFL); - #endif -#else + + // Signal to create coredumps by system when necessary (crash) compat_signal(SIGSEGV, sig_dump); compat_signal(SIGFPE, sig_dump); compat_signal(SIGILL, sig_dump); #ifndef _WIN32 compat_signal(SIGBUS, sig_dump); - compat_signal(SIGTRAP, SIG_DFL); + compat_signal(SIGTRAP, SIG_DFL); #endif -#endif display_title(); + do_init_memmgr(argv[0]); // 一番最初に実行する必要がある + tick_ = time(0); do_init(argc,argv); @@ -234,5 +229,6 @@ int main(int argc,char **argv) do_sendrecv(next); do_parsepacket(); } + return 0; } diff --git a/src/common/db.c b/src/common/db.c index 12d54176c..9f2c75a68 100644 --- a/src/common/db.c +++ b/src/common/db.c @@ -65,7 +65,7 @@ static unsigned int strdb_hash(struct dbt* table,void* a) return h; } -struct dbt* strdb_init(int maxlen) +struct dbt* strdb_init_(int maxlen,const char *file,int line) { int i; struct dbt* table; @@ -77,6 +77,9 @@ struct dbt* strdb_init(int maxlen) table->maxlen=maxlen; for(i=0;iht[i]=NULL; + table->alloc_file = file; + table->alloc_line = line; + table->item_count = 0; return table; } @@ -98,7 +101,7 @@ static unsigned int numdb_hash(struct dbt* table,void* a) return (unsigned int)a; } -struct dbt* numdb_init(void) +struct dbt* numdb_init_(const char *file,int line) { int i; struct dbt* table; @@ -110,6 +113,9 @@ struct dbt* numdb_init(void) table->maxlen=sizeof(int); for(i=0;iht[i]=NULL; + table->alloc_file = file; + table->alloc_line = line; + table->item_count = 0; return table; } @@ -400,6 +406,7 @@ struct dbn* db_insert(struct dbt *table,void* key,void* data) db_rebalance(p,&table->ht[hash]); } } + table->item_count++; return p; } @@ -428,12 +435,14 @@ void* db_erase(struct dbt *table,void* key) #else aFree(p); #endif + table->item_count--; return data; } void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) { int i,sp; + int count = 0; // red-black treeなので64個stackがあれば2^32個ノードまで大丈夫 struct dbn *p,*pn,*stack[64]; va_list ap; @@ -449,6 +458,7 @@ void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) // printf("Warning: no data for key %d in db_foreach (db.c) !\n",(int)p->key); //} else { func(p->key, p->data, ap); + count++; //} if((pn=p->left)!=NULL){ if(p->right){ @@ -466,6 +476,12 @@ void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) } } } + if(count != table->item_count) { + printf( + "db_foreach : data lost %d of %d item(s) allocated from %s line %d\n", + table->item_count - count,count,table->alloc_file,table->alloc_line + ); + } va_end(ap); } diff --git a/src/common/db.h b/src/common/db.h index ea9aceab0..c31f5bfaa 100644 --- a/src/common/db.h +++ b/src/common/db.h @@ -22,6 +22,9 @@ struct dbt { void (*release)(struct dbn*,int which); int maxlen; struct dbn *ht[HASH_SIZE]; + int item_count; // vf? + const char* alloc_file; // DB?t@C + int alloc_line; // DB?s }; #define strdb_search(t,k) db_search((t),(void*)(k)) @@ -34,9 +37,12 @@ struct dbt { #define numdb_erase(t,k) db_erase ((t),(void*)(k)) #define numdb_foreach db_foreach #define numdb_final db_final +#define strdb_init(a) strdb_init_(a,__FILE__,__LINE__) +#define numdb_init() numdb_init_(__FILE__,__LINE__) + +struct dbt* strdb_init_(int maxlen,const char *file,int line); +struct dbt* numdb_init_(const char *file,int line); -struct dbt* strdb_init(int maxlen); -struct dbt* numdb_init(void); void* db_search(struct dbt *table,void* key); void* db_search2(struct dbt *table, const char *key); // [MouseJstr] struct dbn* db_insert(struct dbt *table,void* key,void* data); diff --git a/src/common/grfio.c b/src/common/grfio.c index 0c628d163..224ea909e 100644 --- a/src/common/grfio.c +++ b/src/common/grfio.c @@ -32,21 +32,36 @@ #include "malloc.h" #ifdef _WIN32 - #include - #include "../lib/zlib_win32.h" - HINSTANCE zlib_dll; - #define zlib_inflateInit(strm) zlib_inflateInit_((strm),ZLIB_VERSION, sizeof(z_stream)) - #define zlib_deflateInit(strm, level) zlib_deflateInit_((strm),(level),ZLIB_VERSION,sizeof(z_stream)) - - int (WINAPI* zlib_inflateInit_) (z_streamp strm, const char *version, int stream_size); - int (WINAPI* zlib_inflate) (z_streamp strm, int flush); - int (WINAPI* zlib_inflateEnd) (z_streamp strm); - - int (WINAPI* zlib_deflateInit_) (z_streamp strm, int level, const char *version, int stream_size); - int (WINAPI* zlib_deflate) (z_streamp strm, int flush); - int (WINAPI* zlib_deflateEnd) (z_streamp strm); + #ifdef LOCALZLIB + #include "../lib/zlib/zlib.h" + #define zlib_inflateInit inflateInit + #define zlib_inflate inflate + #define zlib_inflateEnd inflateEnd + #define zlib_deflateInit deflateInit + #define zlib_deflate deflate + #define zlib_deflateEnd deflateEnd + #else + #include + #include "../lib/zlib_win32.h" + HINSTANCE zlib_dll; + #define zlib_inflateInit(strm) zlib_inflateInit_((strm),ZLIB_VERSION, sizeof(z_stream)) + #define zlib_deflateInit(strm, level) zlib_deflateInit_((strm),(level),ZLIB_VERSION,sizeof(z_stream)) + + int (WINAPI* zlib_inflateInit_) (z_streamp strm, const char *version, int stream_size); + int (WINAPI* zlib_inflate) (z_streamp strm, int flush); + int (WINAPI* zlib_inflateEnd) (z_streamp strm); + + int (WINAPI* zlib_deflateInit_) (z_streamp strm, int level, const char *version, int stream_size); + int (WINAPI* zlib_deflate) (z_streamp strm, int flush); + int (WINAPI* zlib_deflateEnd) (z_streamp strm); + #endif #else - #include + #ifdef LOCALZLIB + #include "zlib/zlib.h" + #else + #include + #endif + #define zlib_inflateInit inflateInit #define zlib_inflate inflate #define zlib_inflateEnd inflateEnd @@ -966,6 +981,16 @@ void grfio_final(void) } gentry_table = NULL; gentry_entrys = gentry_maxentry = 0; + +#ifdef _WIN32 + #ifndef LOCALZLIB + FreeLibrary(zlib_dll); + zlib_inflateInit_ = NULL; + zlib_inflate = NULL; + zlib_inflateEnd = NULL; + #endif +#endif + } /*========================================== @@ -979,6 +1004,7 @@ void grfio_init(char *fname) int result = 0, result2 = 0, result3 = 0, result4 = 0; #ifdef _WIN32 + #ifndef LOCALZLIB if(!zlib_dll) { zlib_dll = LoadLibrary("zlib.dll"); (FARPROC)zlib_inflateInit_ = GetProcAddress(zlib_dll,"inflateInit_"); @@ -992,6 +1018,7 @@ void grfio_init(char *fname) exit(1); } } + #endif #endif data_conf = fopen(fname, "r"); diff --git a/src/common/malloc.c b/src/common/malloc.c index 089a9db18..40c9f34bf 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -3,14 +3,25 @@ #include #include "malloc.h" -#if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) +#ifdef MEMWATCH +#include "memwatch.h" +#endif + +// 独自メモリマネージャを使用する場合、次のコメントを外してください。 +// #define USE_MEMMGR + +#if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) && !defined(USE_MEMMGR) void* aMalloc_( size_t size, const char *file, int line, const char *func ) { void *ret; // printf("%s:%d: in func %s: malloc %d\n",file,line,func,size); +#ifdef MEMWATCH + ret=mwMalloc(size,file,line); +#else ret=malloc(size); +#endif if(ret==NULL){ printf("%s:%d: in func %s: malloc error out of memory!\n",file,line,func); exit(1); @@ -23,7 +34,11 @@ void* aCalloc_( size_t num, size_t size, const char *file, int line, const char void *ret; // printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size); +#ifdef MEMWATCH + ret=mwCalloc(num,size,file,line); +#else ret=calloc(num,size); +#endif if(ret==NULL){ printf("%s:%d: in func %s: calloc error out of memory!\n",file,line,func); exit(1); @@ -37,7 +52,11 @@ void* aRealloc_( void *p, size_t size, const char *file, int line, const char *f void *ret; // printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size); +#ifdef MEMWATCH + ret=mwRealloc(p,size,file,line); +#else ret=realloc(p,size); +#endif if(ret==NULL){ printf("%s:%d: in func %s: realloc error out of memory!\n",file,line,func); exit(1); @@ -46,10 +65,39 @@ void* aRealloc_( void *p, size_t size, const char *file, int line, const char *f return ret; } +void* aStrdup_( const void *p, const char *file, int line, const char *func ) +{ + void *ret; + + // printf("%s:%d: in func %s: strdup %p\n",file,line,func,p); +#ifdef MEMWATCH + ret=mwStrdup(p,file,line); +#else + ret=strdup(p); +#endif + if(ret==NULL){ + printf("%s:%d: in func %s: strdup error out of memory!\n",file,line,func); + exit(1); + + } + return ret; +} + +void aFree_( void *p, const char *file, int line, const char *func ) +{ + // printf("%s:%d: in func %s: free %p\n",file,line,func,p); +#ifdef MEMWATCH + mwFree(p,file,line); +#else + free(p); #endif +} +int do_init_memmgr(const char* file) { + return 0; +} -#if defined(GCOLLECT) +#elif defined(GCOLLECT) void * _bcallocA(size_t size, size_t cnt) { void *ret = aMallocA(size * cnt); @@ -62,7 +110,6 @@ void * _bcalloc(size_t size, size_t cnt) { memset(ret, 0, size * cnt); return ret; } -#endif char * _bstrdup(const char *chr) { int len = strlen(chr); @@ -70,3 +117,434 @@ char * _bstrdup(const char *chr) { strcpy(ret, chr); return ret; } + +#elif defined(USE_MEMMGR) + +/* USE_MEMMGR */ + +/* + * メモリマネージャ + * malloc , free の処理を効率的に出来るようにしたもの。 + * 複雑な処理を行っているので、若干重くなるかもしれません。 + * + * データ構造など(説明下手ですいません^^; ) + * ・メモリを複数の「ブロック」に分けて、さらにブロックを複数の「ユニット」 + * に分けています。ユニットのサイズは、1ブロックの容量を複数個に均等配分 + * したものです。たとえば、1ユニット32KBの場合、ブロック1つは32Byteのユ + * ニットが、1024個集まって出来ていたり、64Byteのユニットが 512個集まって + * 出来ていたりします。(padding,unit_head を除く) + * + * ・ユニット同士はリンクリスト(block_prev,block_next) でつながり、同じサイ + * ズを持つユニット同士もリンクリスト(samesize_prev,samesize_nect) でつな + * がっています。それにより、不要となったメモリの再利用が効率的に行えます。 + */ + +/* ブロックに入るデータ量 */ +#define BLOCK_DATA_SIZE 80*1024 + +/* 一度に確保するブロックの数。 */ +#define BLOCK_ALLOC 32 + +/* ブロックのアライメント */ +#define BLOCK_ALIGNMENT 64 + +/* ブロック */ +struct block { + int block_no; /* ブロック番号 */ + struct block* block_prev; /* 前に確保した領域 */ + struct block* block_next; /* 次に確保した領域 */ + int samesize_no; /* 同じサイズの番号 */ + struct block* samesize_prev; /* 同じサイズの前の領域 */ + struct block* samesize_next; /* 同じサイズの次の領域 */ + int unit_size; /* ユニットのバイト数 0=未使用 */ + int unit_hash; /* ユニットのハッシュ */ + int unit_count; /* ユニットの数 */ + int unit_used; /* 使用済みユニット */ + char data[BLOCK_DATA_SIZE]; +}; + +struct unit_head { + struct block* block; + int size; + const char* file; + int line; +}; + +static struct block* block_first = NULL; +static struct block* block_last = NULL; +static struct block* block_unused = NULL; + +/* ユニットへのハッシュ。80KB/64Byte = 1280個 */ +static struct block* unit_first[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* 最初 */ +static struct block* unit_unfill[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* 埋まってない */ +static struct block* unit_last[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* 最後 */ + +/* メモリを使い回せない領域用のデータ */ +struct unit_head_large { + struct unit_head_large* prev; + struct unit_head_large* next; + struct unit_head unit_head; +}; +static struct unit_head_large *unit_head_large_first = NULL; + +static struct block* block_malloc(void); +static void block_free(struct block* p); +static void memmgr_info(void); + +void* aMalloc_(size_t size, const char *file, int line, const char *func ) { + int i; + struct block *block; + int size_hash = (size+BLOCK_ALIGNMENT-1) / BLOCK_ALIGNMENT; + size = size_hash * BLOCK_ALIGNMENT; /* アライメントの倍数に切り上げ */ + + if(size == 0) { + return NULL; + } + + /* ブロック長を超える領域の確保には、malloc() を用いる */ + /* その際、unit_head.block に NULL を代入して区別する */ + if(size > BLOCK_DATA_SIZE - sizeof(struct unit_head)) { +#ifdef MEMWATCH + struct unit_head_large* p = (struct unit_head_large*)mwMalloc(sizeof(struct unit_head_large) + size,file,line); +#else + struct unit_head_large* p = (struct unit_head_large*)malloc(sizeof(struct unit_head_large) + size); +#endif + if(p != NULL) { + p->unit_head.block = NULL; + p->unit_head.size = size; + p->unit_head.file = file; + p->unit_head.line = line; + if(unit_head_large_first == NULL) { + unit_head_large_first = p; + p->next = NULL; + p->prev = NULL; + } else { + unit_head_large_first->prev = p; + p->prev = NULL; + p->next = unit_head_large_first; + unit_head_large_first = p; + } + return (char *)p + sizeof(struct unit_head_large); + } else { + printf("MEMMGR::memmgr_alloc failed.\n"); + exit(1); + } + } + + /* 同一サイズのブロックが確保されていない時、新たに確保する */ + if(unit_unfill[size_hash] == NULL) { + block = block_malloc(); + if(unit_first[size_hash] == NULL) { + /* 初回確保 */ + unit_first[size_hash] = block; + unit_last[size_hash] = block; + block->samesize_no = 0; + block->samesize_prev = NULL; + block->samesize_next = NULL; + } else { + /* 連結作業 */ + unit_last[size_hash]->samesize_next = block; + block->samesize_no = unit_last[size_hash]->samesize_no + 1; + block->samesize_prev = unit_last[size_hash]; + block->samesize_next = NULL; + unit_last[size_hash] = block; + } + unit_unfill[size_hash] = block; + block->unit_size = size + sizeof(struct unit_head); + block->unit_count = BLOCK_DATA_SIZE / block->unit_size; + block->unit_used = 0; + block->unit_hash = size_hash; + /* 未使用Flagを立てる */ + for(i=0;iunit_count;i++) { + ((struct unit_head*)(&block->data[block->unit_size * i]))->block = NULL; + } + } + /* ユニット使用個数加算 */ + block = unit_unfill[size_hash]; + block->unit_used++; + + /* ユニット内を全て使い果たした */ + if(block->unit_count == block->unit_used) { + do { + unit_unfill[size_hash] = unit_unfill[size_hash]->samesize_next; + } while( + unit_unfill[size_hash] != NULL && + unit_unfill[size_hash]->unit_count == unit_unfill[size_hash]->unit_used + ); + } + + /* ブロックの中の空きユニット捜索 */ + for(i=0;iunit_count;i++) { + struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]); + if(head->block == NULL) { + head->block = block; + head->size = size; + head->line = line; + head->file = file; + return (char *)head + sizeof(struct unit_head); + } + } + // ここに来てはいけない。 + printf("MEMMGR::memmgr_malloc() serious error.\n"); + memmgr_info(); + exit(1); + return NULL; +}; + +void* aCalloc_(size_t num, size_t size, const char *file, int line, const char *func ) { + void *p = aMalloc_(num * size,file,line,func); + memset(p,0,num * size); + return p; +} + +void* aRealloc_(void *memblock, size_t size, const char *file, int line, const char *func ) { + size_t old_size; + if(memblock == NULL) { + return aMalloc_(size,file,line,func); + } + + old_size = ((struct unit_head *)((char *)memblock - sizeof(struct unit_head)))->size; + if(old_size > size) { + // サイズ縮小 -> そのまま返す(手抜き) + return memblock; + } else { + // サイズ拡大 + void *p = aMalloc_(size,file,line,func); + if(p != NULL) { + memcpy(p,memblock,old_size); + } + aFree_(memblock,file,line,func); + return p; + } +} + +void* aStrdup_(const void* string, const char *file, int line, const char *func ) { + if(string == NULL) { + return NULL; + } else { + int len = strlen(string); + char *p = (char *)aMalloc_(len + 1,file,line,func); + memcpy(p,string,len+1); + return p; + } +} + +void aFree_(void *ptr, const char *file, int line, const char *func ) { + struct unit_head *head = (struct unit_head *)((char *)ptr - sizeof(struct unit_head)); + if(ptr == NULL) { + return; + } else if(head->block == NULL && head->size > BLOCK_DATA_SIZE - sizeof(struct unit_head)) { + /* malloc() で直に確保された領域 */ + struct unit_head_large *head_large = (struct unit_head_large *)((char *)ptr - sizeof(struct unit_head_large)); + if(head_large->prev) { + head_large->prev->next = head_large->next; + } else { + unit_head_large_first = head_large->next; + } + if(head_large->next) { + head_large->next->prev = head_large->prev; + } + free(head_large); + return; + } else { + /* ユニット解放 */ + struct block *block = head->block; + if(head->block == NULL) { + printf("memmgr: args of aFree is freed pointer %s line %d\n",file,line); + } else { + head->block = NULL; + if(--block->unit_used == 0) { + /* ブロックの解放 */ + if(unit_unfill[block->unit_hash] == block) { + /* 空きユニットに指定されている */ + do { + unit_unfill[block->unit_hash] = unit_unfill[block->unit_hash]->samesize_next; + } while( + unit_unfill[block->unit_hash] != NULL && + unit_unfill[block->unit_hash]->unit_count == unit_unfill[block->unit_hash]->unit_used + ); + } + if(block->samesize_prev == NULL && block->samesize_next == NULL) { + /* 独立ブロックの解放 */ + unit_first[block->unit_hash] = NULL; + unit_last[block->unit_hash] = NULL; + unit_unfill[block->unit_hash] = NULL; + } else if(block->samesize_prev == NULL) { + /* 先頭ブロックの解放 */ + unit_first[block->unit_hash] = block->samesize_next; + (block->samesize_next)->samesize_prev = NULL; + } else if(block->samesize_next == NULL) { + /* 末端ブロックの解放 */ + unit_last[block->unit_hash] = block->samesize_prev; + (block->samesize_prev)->samesize_next = NULL; + } else { + /* 中間ブロックの解放 */ + (block->samesize_next)->samesize_prev = block->samesize_prev; + (block->samesize_prev)->samesize_next = block->samesize_next; + } + block_free(block); + } else { + /* 空きユニットの再設定 */ + if( + unit_unfill[block->unit_hash] == NULL || + unit_unfill[block->unit_hash]->samesize_no > block->samesize_no + ) { + unit_unfill[block->unit_hash] = block; + } + } + } + } +} + +/* 現在の状況を表示する */ +static void memmgr_info(void) { + int i; + struct block *p; + printf("** Memory Maneger Information **\n"); + if(block_first == NULL) { + printf("Uninitialized.\n"); + return; + } + printf( + "Blocks: %04u , BlockSize: %06u Byte , Used: %08uKB\n", + block_last->block_no+1,sizeof(struct block), + (block_last->block_no+1) * sizeof(struct block) / 1024 + ); + p = block_first; + for(i=0;i<=block_last->block_no;i++) { + printf(" Block #%04u : ",p->block_no); + if(p->unit_size == 0) { + printf("unused.\n"); + } else { + printf( + "size: %05u byte. used: %04u/%04u prev:", + p->unit_size - sizeof(struct unit_head),p->unit_used,p->unit_count + ); + if(p->samesize_prev == NULL) { + printf("NULL"); + } else { + printf("%04u",(p->samesize_prev)->block_no); + } + printf(" next:"); + if(p->samesize_next == NULL) { + printf("NULL"); + } else { + printf("%04u",(p->samesize_next)->block_no); + } + printf("\n"); + } + p = p->block_next; + } +} + +/* ブロックを確保する */ +static struct block* block_malloc(void) { + if(block_unused != NULL) { + /* ブロック用の領域は確保済み */ + struct block* ret = block_unused; + do { + block_unused = block_unused->block_next; + } while(block_unused != NULL && block_unused->unit_size != 0); + return ret; + } else { + /* ブロック用の領域を新たに確保する */ + int i; + int block_no; + struct block* p = (struct block *)calloc(sizeof(struct block),BLOCK_ALLOC); + if(p == NULL) { + printf("MEMMGR::block_alloc failed.\n"); + exit(1); + } + if(block_first == NULL) { + /* 初回確保 */ + block_no = 0; + block_first = p; + } else { + block_no = block_last->block_no + 1; + block_last->block_next = p; + p->block_prev = block_last; + } + block_last = &p[BLOCK_ALLOC - 1]; + /* ブロックを連結させる */ + for(i=0;iunit_size = 1; + return p; + } +} + +static void block_free(struct block* p) { + /* free() せずに、未使用フラグを付けるだけ */ + p->unit_size = 0; + /* 未使用ポインターを更新する */ + if(block_unused == NULL) { + block_unused = p; + } else if(block_unused->block_no > p->block_no) { + block_unused = p; + } +} + +static char memmer_logfile[128]; + +static FILE* memmgr_log(void) { + FILE *fp = fopen(memmer_logfile,"w"); + if(!fp) { fp = stdout; } + fprintf(fp,"memmgr: memory leaks found\n"); + return fp; +} + +static void memmer_exit(void) { + FILE *fp = NULL; + int i; + int count = 0; + struct block *block = block_first; + struct unit_head_large *large = unit_head_large_first; + while(block) { + if(block->unit_size) { + if(!fp) { fp = memmgr_log(); } + for(i=0;iunit_count;i++) { + struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]); + if(head->block != NULL) { + fprintf( + fp,"%04d : %s line %d size %d\n",++count, + head->file,head->line,head->size + ); + } + } + } + block = block->block_next; + } + while(large) { + if(!fp) { fp = memmgr_log(); } + fprintf( + fp,"%04d : %s line %d size %d\n",++count, + large->unit_head.file, + large->unit_head.line,large->unit_head.size + ); + large = large->next; + } + if(!fp) { + printf("memmgr: no memory leaks found.\n"); + } else { + printf("memmgr: memory leaks found.\n"); + } +} + +int do_init_memmgr(const char* file) { + sprintf(memmer_logfile,"%s.log",file); + atexit(memmer_exit); + printf("memmgr: initialised: %s\n",memmer_logfile); + return 0; +} + +#endif diff --git a/src/common/malloc.h b/src/common/malloc.h index d90665487..45451c9e0 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -59,15 +59,19 @@ void* aMalloc_( size_t size, const char *file, int line, const char *func ); void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func ); void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func ); + void aFree_( void *p, const char *file, int line, const char *func ); + void* aStrdup_( const void *p, const char *file, int line, const char *func ); # define aMalloc(n) aMalloc_(n,ALC_MARK) # define aMallocA(n) aMalloc_(n,ALC_MARK) # define aCalloc(m,n) aCalloc_(m,n,ALC_MARK) # define aCallocA(m,n) aCalloc_(m,n,ALC_MARK) # define aRealloc(p,n) aRealloc_(p,n,ALC_MARK) -# define aFree(ptr) free(ptr) -# define aStrdup(ptr) strdup(ptr) +# define aStrdup(p) aStrdup_(p,ALC_MARK) +# define aFree(p) do { aFree_(p,ALC_MARK); if(p != NULL) { p = NULL; } } while(0) #endif +int do_init_memmgr(const char* file); + #endif diff --git a/src/ladmin/Makefile b/src/ladmin/Makefile index ebe67a349..20722350b 100644 --- a/src/ladmin/Makefile +++ b/src/ladmin/Makefile @@ -2,7 +2,7 @@ all: ladmin txt: ladmin sql: ladmin -COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o ../common/strlib.o +COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h ladmin: ladmin.o md5calc.o $(COMMON_OBJ) diff --git a/src/login/Makefile b/src/login/Makefile index 482503969..01810b1d1 100644 --- a/src/login/Makefile +++ b/src/login/Makefile @@ -1,7 +1,7 @@ all: login-server txt: login-server -COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/showmsg.o ../common/strlib.o +COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/lock.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h login-server: login.o md5calc.o $(COMMON_OBJ) diff --git a/src/login_sql/Makefile b/src/login_sql/Makefile index 18b023fe6..20b01c66d 100644 --- a/src/login_sql/Makefile +++ b/src/login_sql/Makefile @@ -2,7 +2,7 @@ all: login-server_sql sql: login-server_sql shared_libs=all -COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o ../common/strlib.o +COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h login-server_sql: login.o md5calc.o $(COMMON_OBJ) diff --git a/src/map/Makefile b/src/map/Makefile index 884e8b902..b413c8a62 100644 --- a/src/map/Makefile +++ b/src/map/Makefile @@ -10,7 +10,9 @@ txtobj: sqlobj: mkdir sqlobj -COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/showmsg.o ../common/utils.o ../common/strlib.o +COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/grfio.o ../common/obj/db.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_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/grfio.h ../common/db.h ../common/lock.h ../common/nullpo.h ../common/malloc.h ../common/showmsg.h ../common/utils.h ../common/strlib.h LIBS = -lz -lm map-server: txtobj/map.o txtobj/chrif.o txtobj/clif.o txtobj/pc.o txtobj/status.o txtobj/npc.o txtobj/npc_chat.o txtobj/chat.o txtobj/path.o txtobj/itemdb.o txtobj/mob.o txtobj/script.o txtobj/storage.o txtobj/skill.o txtobj/atcommand.o txtobj/charcommand.o txtobj/battle.o txtobj/intif.o txtobj/trade.o txtobj/party.o txtobj/vending.o txtobj/guild.o txtobj/pet.o txtobj/log.o $(COMMON_OBJ) @@ -25,56 +27,56 @@ txtobj/%.o: %.c sqlobj/%.o: %.c $(COMPILE.c) $(OUTPUT_OPTION) $< -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 ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h -txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.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 ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.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/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.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/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h -txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -txtobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h -txtobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h -txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h -txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.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 ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h -txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h -txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/socket.h ../common/mmo.h ../common/showmsg.h -txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h ../common/mmo.h ../common/showmsg.h -txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h ../common/mmo.h ../common/showmsg.h -txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -txtobj/log.o: log.c log.h map.h ../common/nullpo.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/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h +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 $(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 $(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 $(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 $(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 $(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 $(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) -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 ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h -sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.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/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.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/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h -sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h -sqlobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h -sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.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 ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.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 ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h -sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h -sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/socket.h ../common/mmo.h ../common/showmsg.h -sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h ../common/mmo.h ../common/showmsg.h -sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h ../common/mmo.h ../common/showmsg.h -sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.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/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h -sqlobj/mail.o: mail.c mail.h ../common/showmsg.h ../common/strlib.h ../common/utils.h -sqlobj/log.o: log.c log.h map.h ../common/nullpo.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/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.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 $(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 $(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 $(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 $(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 $(COMMON_H) +sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.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) clean: rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 12e6c2306..3169c75ab 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -9,6 +9,7 @@ #include "../common/timer.h" #include "../common/nullpo.h" #include "../common/mmo.h" +#include "../common/db.h" #include "log.h" #include "clif.h" @@ -210,6 +211,8 @@ ACMD_FUNC(gmotd); // Added by MC Cameri, created by davidsiaw ACMD_FUNC(misceffect); // by MC Cameri ACMD_FUNC(mobsearch); ACMD_FUNC(cleanmap); +ACMD_FUNC(npctalk); +ACMD_FUNC(pettalk); ACMD_FUNC(autoloot); // by Upa-Kun #ifndef TXT_ONLY @@ -484,6 +487,8 @@ static AtCommandInfo atcommand_info[] = { { AtCommand_MiscEffect, "@misceffect", 50, atcommand_misceffect }, // by MC Cameri { AtCommand_MobSearch, "@mobsearch", 0, atcommand_mobsearch }, { AtCommand_CleanMap, "@cleanmap", 0, atcommand_cleanmap }, + { AtCommand_NpcTalk, "@npctalk", 0, atcommand_npctalk }, + { AtCommand_PetTalk, "@pettalk", 0, atcommand_pettalk }, #ifndef TXT_ONLY // sql-only commands { AtCommand_CheckMail, "@checkmail", 1, atcommand_listmail }, // [Valaris] @@ -1743,8 +1748,8 @@ int atcommand_whozeny( clif_displaymessage(fd, output); } - free(zeny); - free(counted); + aFree(zeny); + aFree(counted); return 0; } @@ -7789,6 +7794,49 @@ atcommand_cleanmap( return 0; } +/*========================================== + * NPC/PETに話させる + *------------------------------------------ + */ +int +atcommand_npctalk( + const int fd, struct map_session_data* sd, + const char* command, const char* message) +{ + char name[100],mes[100]; + struct npc_data *nd; + + if (sscanf(message, "%s %99[^\n]", name, mes) < 2) + return -1; + + if (!(nd = npc_name2id(name))) + return -1; + + clif_message(&nd->bl, mes); + return 0; +} +int +atcommand_pettalk( + const int fd, struct map_session_data* sd, + const char* command, const char* message) +{ + char mes[100],temp[100]; + struct pet_data *pd; + + nullpo_retr(-1, sd); + + if(!sd->status.pet_id || !(pd=sd->pd)) + return -1; + + if (sscanf(message, "%99[^\n]", mes) < 1) + return -1; + + snprintf(temp, sizeof temp ,"%s : %s",sd->pet.name,mes); + clif_message(&pd->bl, temp); + + return 0; +} + /*========================================== * *------------------------------------------ diff --git a/src/map/atcommand.h b/src/map/atcommand.h index cb260db19..ea6849476 100644 --- a/src/map/atcommand.h +++ b/src/map/atcommand.h @@ -196,6 +196,8 @@ enum AtCommandType { AtCommand_MiscEffect, // by MC Cameri AtCommand_MobSearch, AtCommand_CleanMap, + AtCommand_NpcTalk, + AtCommand_PetTalk, // SQL-only commands start #ifndef TXT_ONLY diff --git a/src/map/battle.c b/src/map/battle.c index 707362f7f..605fd30e0 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -59,15 +59,17 @@ int battle_counttargeted(struct block_list *bl,struct block_list *src,int target // ダメージの遅延 struct battle_delay_damage_ { - struct block_list *src,*target; + struct block_list *src; + int target; int damage; int flag; }; int battle_delay_damage_sub(int tid,unsigned int tick,int id,int data) { struct battle_delay_damage_ *dat=(struct battle_delay_damage_ *)data; - if( dat && map_id2bl(id)==dat->src && dat->target->prev!=NULL) - battle_damage(dat->src,dat->target,dat->damage,dat->flag); + struct block_list *target=map_id2bl(dat->target); + if( dat && map_id2bl(id)==dat->src && target && target->prev!=NULL) + battle_damage(dat->src,target,dat->damage,dat->flag); aFree(dat); return 0; } @@ -80,7 +82,7 @@ int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_li dat->src=src; - dat->target=target; + dat->target=target->id; dat->damage=damage; dat->flag=flag; add_timer(tick,battle_delay_damage_sub,src->id,(int)dat); @@ -256,7 +258,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i flag&BF_SHORT && skill_num != NPC_GUIDEDATTACK) { // セーフティウォール struct skill_unit *unit; - unit = map_find_skill_unit_oncell(bl->m,bl->x,bl->y,MG_SAFETYWALL); + unit = (struct skill_unit *)sc_data[SC_SAFETYWALL].val2; if (unit) { if (unit->group && (--unit->group->val2)<=0) skill_delunit(unit); @@ -3501,7 +3503,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, if(sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0) ) skill_castend_damage_id(src,target,0,-1,tick,0); map_freeblock_lock(); - battle_damage(src,target,(wd.damage+wd.damage2),0); + battle_delay_damage(tick+wd.amotion,src,target,(wd.damage+wd.damage2),0); if(target->prev != NULL && (target->type != BL_PC || (target->type == BL_PC && !pc_isdead((struct map_session_data *)target) ) ) ) { if(wd.damage > 0 || wd.damage2 > 0) { @@ -3652,7 +3654,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, } if(rdamage > 0) - battle_damage(target,src,rdamage,0); + battle_delay_damage(tick+wd.amotion,src,target,rdamage,0); if(t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1 && t_sc_data[SC_AUTOCOUNTER].val4 > 0) { if(t_sc_data[SC_AUTOCOUNTER].val3 == src->id) battle_weapon_attack(target,src,tick,0x8000|t_sc_data[SC_AUTOCOUNTER].val1); diff --git a/src/map/chrif.c b/src/map/chrif.c index a04c483d5..bbc6a51e5 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -1011,6 +1011,8 @@ int chrif_disconnect(int fd) { ShowWarning(tmp_output); clif_foreachclient(chrif_disconnect_sub); chrif_connected = 0; + // 他のmap 鯖のデータを消す + map_eraseallipport(); } close(fd); return 0; @@ -1146,6 +1148,15 @@ int check_connect_char_server(int tid, unsigned int tick, int id, int data) { if (chrif_isconnect()) displayed = 0; return 0; } +/*========================================== + * 終了 + *------------------------------------------ + */ +int do_final_chrif(void) +{ + delete_session(char_fd); + return 0; +} /*========================================== * diff --git a/src/map/chrif.h b/src/map/chrif.h index 7f55d23d6..03ff83f6a 100644 --- a/src/map/chrif.h +++ b/src/map/chrif.h @@ -31,6 +31,7 @@ int chrif_changesex(int id, int sex); int chrif_chardisconnect(struct map_session_data *sd); int check_connect_char_server(int tid, unsigned int tick, int id, int data); +int do_final_chrif(void); int do_init_chrif(void); int chrif_flush_fifo(void); diff --git a/src/map/guild.c b/src/map/guild.c index d0d7f14dd..ea9c3795f 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -477,8 +477,11 @@ int guild_recv_info(struct guild *sg) // イベントの発生 if( (ev=numdb_search(guild_infoevent_db,sg->guild_id))!=NULL ){ numdb_erase(guild_infoevent_db,sg->guild_id); - for(;ev;ev2=ev->next,aFree(ev),ev=ev2){ + while(ev){ npc_event_do(ev->name); + ev2=ev->next; + aFree(ev); + ev=ev2; } } @@ -1400,8 +1403,11 @@ int guild_castledataloadack(int castle_id,int index,int value) } if( (ev=numdb_search(guild_castleinfoevent_db,code))!=NULL ){ numdb_erase(guild_castleinfoevent_db,code); - for(;ev;ev2=ev->next,aFree(ev),ev=ev2){ + while(ev){ npc_event_do(ev->name); + ev2=ev->next; + aFree(ev); + ev=ev2; } } return 1; diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 41e2e2a75..82149946d 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -379,8 +379,10 @@ static int itemdb_readdb(void) id->equip_script = parse_script((unsigned char *) p,lines); } fclose(fp); - sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]); - ShowStatus(tmp_output); + if (ln > 0) { + sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]); + ShowStatus(tmp_output); + } ln=0; // reset to 0 } return 0; @@ -456,8 +458,10 @@ static int itemdb_read_randomitem() ln++; } fclose(fp); - sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",*pc,fn); - ShowStatus(tmp_output); + if (*pc > 0) { + sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",*pc,fn); + ShowStatus(tmp_output); + } } return 0; @@ -699,8 +703,10 @@ static int itemdb_read_noequip(void) } fclose(fp); - sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"db/item_noequip.txt"); - ShowStatus(tmp_output); + if (ln > 0) { + sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"db/item_noequip.txt"); + ShowStatus(tmp_output); + } return 0; } diff --git a/src/map/map.c b/src/map/map.c index ee597789c..d402ac06c 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -403,12 +403,13 @@ int map_count_oncell(int m, int x, int y) { /* * ォサォ・セェホフェヒフクェトェアェソォケォュォ・讚ヒォテォネェレェケ */ -struct skill_unit *map_find_skill_unit_oncell(int m,int x,int y,int skill_id) +struct skill_unit *map_find_skill_unit_oncell(struct block_list *target,int x,int y,int skill_id,struct skill_unit *out_unit) { - int bx,by; + int m,bx,by; struct block_list *bl; int i,c; struct skill_unit *unit; + m = target->m; if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys)) return NULL; @@ -421,7 +422,10 @@ struct skill_unit *map_find_skill_unit_oncell(int m,int x,int y,int skill_id) if (bl->x != x || bl->y != y || bl->type != BL_SKILL) continue; unit = (struct skill_unit *) bl; - if (unit->alive && unit->group->skill_id == skill_id) + if (unit==out_unit || !unit->alive || + !unit->group || unit->group->skill_id!=skill_id) + continue; + if (battle_check_target(&unit->bl,target,unit->group->target_flag)>0) return unit; } return NULL; @@ -1622,7 +1626,7 @@ struct map_session_data * map_nick2sd(char *nick) { struct block_list * map_id2bl(int id) { struct block_list *bl=NULL; - if(id= 0 && id < sizeof(objects)/sizeof(objects[0])) bl = objects[id]; else bl = (struct block_list*)numdb_search(id_db,id); @@ -1826,7 +1830,7 @@ int map_getcell(int m,int x,int y,cell_t cellchk) int map_getcellp(struct map_data* m,int x,int y,cell_t cellchk) { - int j; + int type; nullpo_ret(m); if(x<0 || x>=m->xs-1 || y<0 || y>=m->ys-1) @@ -1834,24 +1838,28 @@ int map_getcellp(struct map_data* m,int x,int y,cell_t cellchk) if(cellchk==CELL_CHKNOPASS) return 1; return 0; } - j=x+y*m->xs; + type = m->gat[x+y*m->xs]; + if (cellchk<0x10) + type &= CELL_MASK; switch(cellchk) { case CELL_CHKPASS: - return (m->gat[j] != 1 && m->gat[j] != 5); + return (type!=1 && type!=5); case CELL_CHKNOPASS: - return (m->gat[j] == 1 || m->gat[j] == 5); + return (type==1 || type==5); case CELL_CHKWALL: - return (m->gat[j] == 1); - case CELL_CHKNPC: - return (m->gat[j]&0x80); + return (type==1); case CELL_CHKWATER: - return (m->gat[j] == 3); + return (type==3); case CELL_CHKGROUND: - return (m->gat[j] == 5); + return (type==5); case CELL_GETTYPE: - return m->gat[j]; + return type; + case CELL_CHKNPC: + return (type&CELL_NPC); + case CELL_CHKBASILICA: + return (type&CELL_BASILICA); default: return 0; } @@ -1868,10 +1876,20 @@ void map_setcell(int m,int x,int y,int cell) return; j=x+y*map[m].xs; - if (cell == CELL_SETNPC) - map[m].gat[j] |= 0x80; - else - map[m].gat[j] = cell; + switch (cell) { + case CELL_SETNPC: + map[m].gat[j] |= CELL_NPC; + break; + case CELL_SETBASILICA: + map[m].gat[j] |= CELL_BASILICA; + break; + case CELL_CLRBASILICA: + map[m].gat[j] &= ~CELL_BASILICA; + break; + default: + map[m].gat[j] = (map[m].gat[j]&~CELL_MASK) + cell; + break; + } } /*========================================== @@ -1889,15 +1907,39 @@ int map_setipport(char *name,unsigned long ip,int port) { mdos->gat = NULL; mdos->ip = ip; mdos->port = port; + mdos->map = NULL; strdb_insert(map_db,mdos->name,mdos); + } else if(md->gat){ + if(ip!=clif_getip() || port!=clif_getport()){ + // 読み込んでいたけど、担当外になったマップ + mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server)); + memcpy(mdos->name,name,24); + mdos->gat = NULL; + mdos->ip = ip; + mdos->port = port; + mdos->map = md; + strdb_insert(map_db,mdos->name,mdos); + // printf("from char server : %s -> %08lx:%d\n",name,ip,port); + } else { + // 読み込んでいて、担当になったマップ(何もしない) + ; + } } else { - if(md->gat){ // local -> check data - if(ip!=clif_getip() || port!=clif_getport()){ - printf("from char server : %s -> %08lx:%d\n",name,ip,port); - return 1; + mdos=(struct map_data_other_server *)md; + if(ip == clif_getip() && port == clif_getport()) { + // 自分の担当になったマップ + if(mdos->map == NULL) { + // 読み込んでいないので終了する + printf("map_setipport : %s is not loaded.\n",name); + exit(1); + } else { + // 読み込んでいるので置き換える + md = mdos->map; + free(mdos); + strdb_insert(map_db,md->name,md); } - } else { // update - mdos=(struct map_data_other_server *)md; + } else { + // 他の鯖の担当マップなので置き換えるだけ mdos->ip = ip; mdos->port = port; } @@ -1905,6 +1947,56 @@ int map_setipport(char *name,unsigned long ip,int port) { return 0; } +/*========================================== + * 他鯖管理のマップを全て削除 + *------------------------------------------ + */ +int map_eraseallipport_sub(void *key,void *data,va_list va) { + struct map_data_other_server *mdos = (struct map_data_other_server*)data; + if(mdos->gat == NULL && mdos->map == NULL) { + strdb_erase(map_db,key); + free(mdos); + } + return 0; +} + +int map_eraseallipport(void) { + strdb_foreach(map_db,map_eraseallipport_sub); + return 1; +} + +/*========================================== + * 他鯖管理のマップをdbから削除 + *------------------------------------------ + */ +int map_eraseipport(char *name,unsigned long ip,int port) +{ + struct map_data *md; + struct map_data_other_server *mdos; +// unsigned char *p=(unsigned char *)&ip; + + md=strdb_search(map_db,name); + if(md){ + if(md->gat) // local -> check data + return 0; + else { + mdos=(struct map_data_other_server *)md; + if(mdos->ip==ip && mdos->port == port) { + if(mdos->map) { + // このマップ鯖でも読み込んでいるので移動できる + return 1; // 呼び出し元で chrif_sendmap() をする + } else { + strdb_erase(map_db,name); + free(mdos); + } +// if(battle_config.etc_log) +// printf("erase map %s %d.%d.%d.%d:%d\n",name,p[0],p[1],p[2],p[3],port); + } + } + } + return 0; +} + // 初期化周り /*========================================== * 水場高さ設定 @@ -2043,7 +2135,7 @@ static void map_cache_close(void) fwrite(map_cache.map,map_cache.head.nmaps,sizeof(struct map_cache_info),map_cache.fp); } fclose(map_cache.fp); - free(map_cache.map); + aFree(map_cache.map); map_cache.fp = NULL; return; } @@ -2085,16 +2177,16 @@ int map_cache_read(struct map_data *m) if(fread(buf,1,size_compress,map_cache.fp) != size_compress) { // なぜかファイル後半が欠けてるので読み直し printf("fread error\n"); - m->xs = 0; m->ys = 0; m->gat = NULL; - free(m->gat); free(buf); + free(m->gat); m->xs = 0; m->ys = 0; m->gat = NULL; + free(buf); return 0; } dest_len = m->xs * m->ys; decode_zip(m->gat,&dest_len,buf,size_compress); if(dest_len != map_cache.map[i].xs * map_cache.map[i].ys) { // 正常に解凍が出来てない - m->xs = 0; m->ys = 0; m->gat = NULL; - free(m->gat); free(buf); + free(m->gat); m->xs = 0; m->ys = 0; m->gat = NULL; + free(buf); return 0; } free(buf); @@ -3069,7 +3161,7 @@ void do_final(void) { strdb_final(nick_db, nick_db_final); numdb_final(charid_db, charid_db_final); - + do_final_chrif(); // この内部でキャラを全て切断する do_final_script(); do_final_itemdb(); do_final_storage(); diff --git a/src/map/map.h b/src/map/map.h index 2963a316e..96cbc9fb3 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -20,7 +20,7 @@ #define MAX_STATUSCHANGE 210 #define MAX_SKILLUNITGROUP 32 #define MAX_MOBSKILLUNITGROUP 8 -#define MAX_SKILLUNITGROUPTICKSET 128 +#define MAX_SKILLUNITGROUPTICKSET 32 #define MAX_SKILLTIMERSKILL 32 #define MAX_MOBSKILLTIMERSKILL 10 #define MAX_MOBSKILL 32 @@ -85,13 +85,13 @@ struct skill_unit_group { int src_id; int party_id; int guild_id; - int map,range; + int map; int target_flag; unsigned int tick; int limit,interval; int skill_id,skill_lv; - int val1,val2; + int val1,val2,val3; char *valstr; int unit_id; int group_id; @@ -582,6 +582,7 @@ struct map_data_other_server { unsigned char *gat; // NULL固定にして判断 unsigned long ip; unsigned int port; + struct map_data* map; }; struct flooritem_data { @@ -646,20 +647,29 @@ enum { LOOK_BASE,LOOK_HAIR,LOOK_WEAPON,LOOK_HEAD_BOTTOM,LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HAIR_COLOR,LOOK_CLOTHES_COLOR,LOOK_SHIELD,LOOK_SHOES }; +// CELL +#define CELL_MASK 0x0f +#define CELL_NPC 0x80 // NPCセル +#define CELL_BASILICA 0x40 // BASILICAセル /* - * map_getcell()ェヌ゙ナ鯑ェオェェォユォ鬮ー + * map_getcell()で使用されるフラグ */ typedef enum { - CELL_CHKWALL=1, // ロ(ォサォォソォ、ォラ1) - CELL_CHKWATER=3, // 筰゙(ォサォォソォ、ォラ3) - CELL_CHKGROUND=5, // 「リ。ェレェ(ォサォォソォ、ォラ5) - CELL_CHKNPC=0x80, // ォソォテォチォソォ、ォラェホNPC(ォサォォソォ、ォラ0x80ォユォ鬮ー) - CELL_CHKPASS, // ラホヲハヲメ(ォサォォソォ、ォラ1,5、鞣) - CELL_CHKNOPASS, // ラホヲワハヲ(ォサォォソォ、ォラ1,5) - CELL_GETTYPE // ォサォォソォ、ォラェレェケ + CELL_CHKWALL=0, // 壁(セルタイプ1) + CELL_CHKWATER, // 水場(セルタイプ3) + CELL_CHKGROUND, // 地面障害物(セルタイプ5) + CELL_CHKPASS, // 通過可能(セルタイプ1,5以外) + CELL_CHKNOPASS, // 通過不可(セルタイプ1,5) + CELL_GETTYPE, // セルタイプを返す + CELL_CHKNPC=0x10, // タッチタイプのNPC(セルタイプ0x80フラグ) + CELL_CHKBASILICA, // バジリカ(セルタイプ0x40フラグ) } cell_t; -// map_setcell()ェヌ゙ナ鯑ェオェェォユォ鬮ー -#define CELL_SETNPC 0x80 // ォソォテォチォソォ、ォラェホNPCェォサォテォネ +// map_setcell()で使用されるフラグ +enum { + CELL_SETNPC=0x10, // タッチタイプのNPCをセット + CELL_SETBASILICA, // バジリカをセット + CELL_CLRBASILICA, // バジリカをクリア +}; struct chat_data { struct block_list bl; @@ -718,7 +728,7 @@ void map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int int map_countnearpc(int,int,int); //block関連に追加 int map_count_oncell(int m,int x,int y); -struct skill_unit *map_find_skill_unit_oncell(int m,int x,int y,int skill_id); +struct skill_unit *map_find_skill_unit_oncell(struct block_list *,int x,int y,int skill_id,struct skill_unit *); // 一時的object関連 int map_addobject(struct block_list *); int map_delobject(int); @@ -747,6 +757,7 @@ int map_mapname2mapid(char*); int map_mapname2ipport(char*,int*,int*); int map_setipport(char *name,unsigned long ip,int port); int map_eraseipport(char *name,unsigned long ip,int port); +int map_eraseallipport(void); void map_addiddb(struct block_list *); void map_deliddb(struct block_list *bl); int map_foreachiddb(int (*)(void*,void*,va_list),...); diff --git a/src/map/mob.c b/src/map/mob.c index 74a1c5889..9b2f91da1 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -496,10 +496,16 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data) dx = dirx[md->dir]; dy = diry[md->dir]; - if(map_getcell(md->bl.m,x+dx,y+dy,CELL_CHKNOPASS)) { + if (map_getcell(md->bl.m,x+dx,y+dy,CELL_CHKBASILICA) && !(status_get_mode(&md->bl)&0x20)) { + mob_stop_walking(md,1); + return 0; + } + + if (map_getcell(md->bl.m,x+dx,y+dy,CELL_CHKNOPASS)) { mob_walktoxy_sub(md); return 0; } + if (skill_check_basilica (&md->bl,x+dx,y+dy) || skill_check_moonlit (&md->bl,x+dx,y+dy)) { mob_walktoxy_sub(md); @@ -515,18 +521,18 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data) if(md->min_chase>13) md->min_chase--; + skill_unit_move(&md->bl,tick,0); if(moveblock) map_delblock(&md->bl); md->bl.x = x; md->bl.y = y; if(moveblock) map_addblock(&md->bl); + skill_unit_move(&md->bl,tick,1); map_foreachinmovearea(clif_mobinsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md); md->state.state=MS_IDLE; if(md->option&4) skill_check_cloaking(&md->bl); - - skill_unit_move(&md->bl,tick,1); // スキルユニットの検査 } if((i=calc_next_walk_step(md))>0){ i = i>>1; @@ -712,7 +718,7 @@ int mob_changestate(struct mob_data *md,int state,int type) md->last_deadtime=gettick(); // Since it died, all aggressors' attack to this mob is stopped. clif_foreachclient(mob_stopattacked,md->bl.id); - skill_unit_out_all(&md->bl,gettick(),1); + skill_unit_move(&md->bl,gettick(),0); status_change_clear(&md->bl,2); // ステータス異常を解除する skill_clear_unitgroup(&md->bl); // 全てのスキルユニットグループを削除する skill_cleartimerskill(&md->bl); @@ -789,11 +795,21 @@ static int mob_timer(int tid,unsigned int tick,int id,int data) static int mob_walktoxy_sub(struct mob_data *md) { struct walkpath_data wpd; + int x,y; + static int dirx[8]={0,-1,-1,-1,0,1,1,1}; + static int diry[8]={1,1,0,-1,-1,-1,0,1}; nullpo_retr(0, md); if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,md->to_x,md->to_y,md->state.walk_easy)) return 1; + x = md->bl.x+dirx[wpd.path[0]]; + y = md->bl.y+diry[wpd.path[0]]; + if (map_getcell(md->bl.m,x,y,CELL_CHKBASILICA) && !(status_get_mode(&md->bl)&0x20)) { + md->state.change_walk_target=0; + return 1; + } + memcpy(&md->walkpath,&wpd,sizeof(wpd)); md->state.change_walk_target=0; @@ -909,7 +925,7 @@ int mob_spawn(int id) md->last_spawntime=tick; if( md->bl.prev!=NULL ){ // clif_clearchar_area(&md->bl,3); - skill_unit_out_all(&md->bl,gettick(),1); +// skill_unit_move(&md->bl,tick,0); map_delblock(&md->bl); } else @@ -939,8 +955,6 @@ int mob_spawn(int id) md->dir=0; md->target_dir=0; - map_addblock(&md->bl); - memset(&md->state,0,sizeof(md->state)); md->attacked_id = 0; md->target_id = 0; @@ -1003,6 +1017,9 @@ int mob_spawn(int id) md->hp = status_get_max_hp(&md->bl); } + map_addblock(&md->bl); + skill_unit_move(&md->bl,tick,1); + clif_spawnmob(md); return 0; @@ -2876,6 +2893,7 @@ int mob_warpslave(struct mob_data *md,int x, int y) int mob_warp(struct mob_data *md,int m,int x,int y,int type) { int i=0,xs=0,ys=0,bx=x,by=y; + int tick = gettick(); nullpo_retr(0, md); @@ -2889,7 +2907,7 @@ int mob_warp(struct mob_data *md,int m,int x,int y,int type) return 0; clif_clearchar_area(&md->bl,type); } - skill_unit_out_all(&md->bl,gettick(),1); + skill_unit_move(&md->bl,tick,0); map_delblock(&md->bl); if(bx>0 && by>0){ // 位置指定の場合周囲9セルを探索 @@ -2928,6 +2946,7 @@ int mob_warp(struct mob_data *md,int m,int x,int y,int type) } map_addblock(&md->bl); + skill_unit_move(&md->bl,tick,1); if(type>0) { clif_spawnmob(md); @@ -3241,59 +3260,16 @@ int mobskill_castend_pos( int tid, unsigned int tick, int id,int data ) return 0; } - if(battle_config.monster_skill_reiteration == 0) { - range = -1; - switch(md->skillid) { - case MG_SAFETYWALL: - case WZ_FIREPILLAR: - case HT_SKIDTRAP: - case HT_LANDMINE: - case HT_ANKLESNARE: - case HT_SHOCKWAVE: - case HT_SANDMAN: - case HT_FLASHER: - case HT_FREEZINGTRAP: - case HT_BLASTMINE: - case HT_CLAYMORETRAP: - case PF_SPIDERWEB: /* スパイダーウェッブ */ - range = 0; - break; - case AL_PNEUMA: - case AL_WARP: - range = 1; - break; - } - if(range >= 0) { - if(skill_check_unit_range(md->bl.m,md->skillx,md->skilly,range,md->skillid) > 0) - return 0; - } - } - if(battle_config.monster_skill_nofootset) { - range = -1; - switch(md->skillid) { - case WZ_FIREPILLAR: - case HT_SKIDTRAP: - case HT_LANDMINE: - case HT_ANKLESNARE: - case HT_SHOCKWAVE: - case HT_SANDMAN: - case HT_FLASHER: - case HT_FREEZINGTRAP: - case HT_BLASTMINE: - case HT_CLAYMORETRAP: - case AM_DEMONSTRATION: - case PF_SPIDERWEB: /* スパイダーウェッブ */ - range = 1; - break; - case AL_WARP: - range = 0; - break; - } - if(range >= 0) { - if(skill_check_unit_range2(md->bl.m,md->skillx,md->skilly,range) > 0) - return 0; - } - } + if (!battle_config.monster_skill_reiteration && + skill_get_unit_flag(md->skillid)&UF_NOREITERATION && + skill_check_unit_range(md->bl.m,md->skillx,md->skilly,md->skillid,md->skilllv)) + return 0; + + if(battle_config.monster_skill_nofootset && + skill_get_unit_flag(md->skillid)&UF_NOFOOTSET && + skill_check_unit_range2(md->bl.m,md->skillx,md->skilly,md->skillid,md->skilllv)) + return 0; + if(battle_config.monster_land_skill_limit) { maxcount = skill_get_maxcount(md->skillid); diff --git a/src/map/path.c b/src/map/path.c index dae7fc59a..92ea4941e 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -273,7 +273,7 @@ int path_search_long(int m,int x0,int y0,int x1,int y1) else weight = abs(y1 - y0); - while (x0 != x1 && y0 != y1) { + while (x0 != x1 || y0 != y1) { if (map_getcellp(md,x0,y0,CELL_CHKWALL)) return 0; wx += dx; diff --git a/src/map/pc.c b/src/map/pc.c index 416e05f97..0a5ef8a67 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -140,6 +140,7 @@ static int pc_invincible_timer(int tid,unsigned int tick,int id,int data) { return 0; } sd->invincible_timer=-1; + skill_unit_move(&sd->bl,tick,1); return 0; } @@ -160,6 +161,7 @@ int pc_delinvincibletimer(struct map_session_data *sd) { delete_timer(sd->invincible_timer,pc_invincible_timer); sd->invincible_timer = -1; } + skill_unit_move(&sd->bl,gettick(),1); return 0; } @@ -2244,7 +2246,12 @@ int pc_additem(struct map_session_data *sd,struct item *item_data,int amount) i = pc_search_inventory(sd,0); if(i >= 0) { memcpy(&sd->status.inventory[i],item_data,sizeof(sd->status.inventory[0])); - sd->status.inventory[i].amount=amount; + if(itemdb_isequip2(data)){ + sd->status.inventory[i].amount=1; + amount=1; + } else { + sd->status.inventory[i].amount=amount; + } sd->inventory_data[i]=data; clif_additem(sd,i,amount,0); } @@ -2480,7 +2487,12 @@ int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amoun for(i=0;istatus.cart[i].nameid==0){ memcpy(&sd->status.cart[i],item_data,sizeof(sd->status.cart[0])); - sd->status.cart[i].amount=amount; + if(itemdb_isequip2(data)){ + sd->status.inventory[i].amount=1; + amount=1; + } else { + sd->status.inventory[i].amount=amount; + } sd->cart_num++; clif_cart_additem(sd,i,amount,0); break; @@ -2877,6 +2889,13 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt status_change_end(&sd->bl,SC_BLADESTOP,-1); if(sd->sc_data[SC_DANCING].timer!=-1) // clear dance effect when warping [Valaris] skill_stop_dancing(&sd->bl,0); + if (sd->sc_data[SC_BASILICA].timer!=-1) { + int i; + for (i=0;iskillunit[i].skill_id==HP_BASILICA) + skill_delunitgroup(&sd->skillunit[i]); + status_change_end(&sd->bl,SC_BASILICA,-1); + } } if(sd->status.option&2) @@ -2910,7 +2929,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt int ip,port; if(map_mapname2ipport(mapname,&ip,&port)==0){ skill_stop_dancing(&sd->bl,1); - skill_unit_out_all(&sd->bl,gettick(),1); + skill_unit_move(&sd->bl,gettick(),0); clif_clearchar_area(&sd->bl,clrtype&0xffff); skill_gangsterparadise(sd,0); map_delblock(&sd->bl); @@ -2966,7 +2985,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt } if(sd->mapname[0] && sd->bl.prev != NULL){ - skill_unit_out_all(&sd->bl,gettick(),1); + skill_unit_move(&sd->bl,gettick(),0); clif_clearchar_area(&sd->bl,clrtype&0xffff); skill_gangsterparadise(sd,0); map_delblock(&sd->bl); @@ -3199,10 +3218,12 @@ static int pc_walk(int tid,unsigned int tick,int id,int data) x += dx; y += dy; + skill_unit_move(&sd->bl,tick,0); if(moveblock) map_delblock(&sd->bl); sd->bl.x = x; sd->bl.y = y; if(moveblock) map_addblock(&sd->bl); + skill_unit_move(&sd->bl,tick,1); #if 0 if (sd->status.guild_id > 0) { @@ -3250,20 +3271,15 @@ static int pc_walk(int tid,unsigned int tick,int id,int data) if (sd->sc_data[SC_DEVOTION].val1) skill_devotion2(&sd->bl,sd->sc_data[SC_DEVOTION].val1); - if (sd->sc_data[SC_BASILICA].timer != -1) { // Basilica cancels if caster moves [celest] - struct skill_unit *su; - if ((su = (struct skill_unit *)sd->sc_data[SC_BASILICA].val4)) { - struct skill_unit_group *sg; - if ((sg = su->group) && sg->src_id == sd->bl.id) { - status_change_end(&sd->bl,SC_BASILICA,-1); - skill_delunitgroup (sg); - } - } + if (sd->sc_data[SC_BASILICA].timer!=-1) { // Basilica cancels if caster moves [celest] + int i; + for (i=0;iskillunit[i].skill_id==HP_BASILICA) + skill_delunitgroup(&sd->skillunit[i]); + status_change_end(&sd->bl,SC_BASILICA,-1); } } - skill_unit_move(&sd->bl,tick,1); // スキルユニットの?査 - if(map_getcell(sd->bl.m,x,y,CELL_CHKNPC)) npc_touch_areanpc(sd,sd->bl.m,x,y); else @@ -3420,7 +3436,8 @@ int pc_randomwalk(struct map_session_data *sd,int tick) int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y) { int moveblock; - int dx,dy,dist; + int dx,dy; + int tick = gettick(); struct walkpath_data wpd; @@ -3433,16 +3450,17 @@ int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y) dx = dst_x - sd->bl.x; dy = dst_y - sd->bl.y; - dist = distance(sd->bl.x,sd->bl.y,dst_x,dst_y); moveblock = ( sd->bl.x/BLOCK_SIZE != dst_x/BLOCK_SIZE || sd->bl.y/BLOCK_SIZE != dst_y/BLOCK_SIZE); map_foreachinmovearea(clif_pcoutsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,dx,dy,0,sd); + skill_unit_move(&sd->bl,tick,0); if(moveblock) map_delblock(&sd->bl); sd->bl.x = dst_x; sd->bl.y = dst_y; if(moveblock) map_addblock(&sd->bl); + skill_unit_move(&sd->bl,tick,1); map_foreachinmovearea(clif_pcinsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,0,sd); @@ -3459,8 +3477,6 @@ int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y) if(sd->status.option&4) // クロ?キングの消滅?査 skill_check_cloaking(&sd->bl); - skill_unit_move(&sd->bl,gettick(),dist+7); // スキルユニットの?査 - if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNPC)) npc_touch_areanpc(sd,sd->bl.m,sd->bl.x,sd->bl.y); else @@ -3781,7 +3797,7 @@ int pc_attack(struct map_session_data *sd,int target_id,int type) return 0; } - if(!battle_check_target(&sd->bl,bl,BCT_ENEMY)) + if(battle_check_target(&sd->bl,bl,BCT_ENEMY) <= 0) return 1; if(sd->attacktimer != -1) pc_stopattack(sd); @@ -4612,7 +4628,7 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) skill_castcancel(&sd->bl,0); // 詠唱の中止 clif_clearchar_area(&sd->bl,1); pc_setdead(sd); - skill_unit_out_all(&sd->bl,gettick(),1); + skill_unit_move(&sd->bl,gettick(),0); if(sd->sc_data[SC_BLADESTOP].timer!=-1)//白刃は事前に解除 status_change_end(&sd->bl,SC_BLADESTOP,-1); pc_setglobalreg(sd,"PC_DIE_COUNTER",++sd->die_counter); //死にカウンタ?書き?み @@ -4967,7 +4983,21 @@ int pc_setparam(struct map_session_data *sd,int type,int val) sd->status.status_point = val; break; case SP_ZENY: - sd->status.zeny = val; + if(val <= MAX_ZENY) { + // MAX_ZENY 以下なら代入 + sd->status.zeny = val; + } else { + if(sd->status.zeny > val) { + // Zeny が減少しているなら代入 + sd->status.zeny = val; + } else if(sd->status.zeny <= MAX_ZENY) { + // Zeny が増加していて、現在の値がMAX_ZENY 以下ならMAX_ZENY + sd->status.zeny = MAX_ZENY; + } else { + // Zeny が増加していて、現在の値がMAX_ZENY より下なら増加分を無視 + ; + } + } break; case SP_BASEEXP: if(pc_nextbaseexp(sd) > 0) { @@ -5761,6 +5791,7 @@ int pc_setaccountreg2(struct map_session_data *sd,char *reg,int val) int pc_eventtimer(int tid,unsigned int tick,int id,int data) { struct map_session_data *sd=map_id2sd(id); + char *p = (char *)data; int i; if(sd==NULL) return 0; @@ -5768,11 +5799,11 @@ int pc_eventtimer(int tid,unsigned int tick,int id,int data) for(i=0;ieventtimer[i]==tid ){ sd->eventtimer[i]=-1; - npc_event(sd,(const char *)data,0); + npc_event(sd,p,0); break; } } - aFree((void *)data); + aFree(p); if(i==MAX_EVENTTIMER) { if(battle_config.error_log) printf("pc_eventtimer: no such event timer\n"); @@ -5795,8 +5826,9 @@ int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name) if( sd->eventtimer[i]==-1 ) break; if(ieventtimer[i]=add_timer(gettick()+tick, pc_eventtimer,sd->bl.id,(int)evname); sd->eventcount++; @@ -5819,12 +5851,15 @@ int pc_deleventtimer(struct map_session_data *sd,const char *name) return 0; for(i=0;ieventtimer[i]!=-1 && strcmp( - (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){ + if( sd->eventtimer[i]!=-1 ) { + char *p = (char *)(get_timer(sd->eventtimer[i])->data); + if(strcmp(p, name)==0) { delete_timer(sd->eventtimer[i],pc_eventtimer); sd->eventtimer[i]=-1; sd->eventcount--; + free(p); break; + } } return 0; @@ -5865,8 +5900,10 @@ int pc_cleareventtimer(struct map_session_data *sd) for(i=0;ieventtimer[i]!=-1 ){ + char *p = (char *)(get_timer(sd->eventtimer[i])->data); delete_timer(sd->eventtimer[i],pc_eventtimer); sd->eventtimer[i]=-1; + free(p); } return 0; diff --git a/src/map/skill.c b/src/map/skill.c index 9ae3e2ba4..3d3411b16 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -556,6 +556,12 @@ int skill_get_mhp( int id ,int lv ){ skill_get (skill_db[id].mhp[lv-1], id, lv); int skill_get_castnodex( int id ,int lv ){ skill_get (skill_db[id].castnodex[lv-1], id, lv); } int skill_get_delaynodex( int id ,int lv ){ skill_get (skill_db[id].delaynodex[lv-1], id, lv); } int skill_get_nocast ( int id ){ skill_get (skill_db[id].nocast, id, 1); } +int skill_get_unit_id ( int id, int flag ){ skill_get (skill_db[id].unit_id[flag], id, 1); } +int skill_get_unit_layout_type( int id ,int lv ){ skill_get (skill_db[id].unit_layout_type[lv-1], id, lv); } +int skill_get_unit_interval( int id ){ skill_get (skill_db[id].unit_interval, id, 1); } +int skill_get_unit_range( int id ){ skill_get (skill_db[id].unit_range, id, 1); } +int skill_get_unit_target( int id ){ skill_get (skill_db[id].unit_target, id, 1); } +int skill_get_unit_flag( int id ){ skill_get (skill_db[id].unit_flag, id, 1); } int skill_tree_get_max(int id, int b_class){ struct pc_base_job s_class = pc_calc_base_job(b_class); @@ -577,6 +583,9 @@ int skill_clear_element_field(struct block_list *bl); int skill_landprotector(struct block_list *bl, va_list ap ); int skill_trap_splash(struct block_list *bl, va_list ap ); int skill_count_target(struct block_list *bl, va_list ap ); +struct skill_unit_group_tickset *skill_unitgrouptickset_search(struct block_list *bl,struct skill_unit_group *sg,int tick); +int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick); +int skill_unit_effect(struct block_list *bl,va_list ap); // [MouseJstr] - skill ok to cast? and when? int skillnotok(int skillid, struct map_session_data *sd) @@ -635,96 +644,53 @@ static int distance(int x0,int y0,int x1,int y1) return dx>dy ? dx : dy; } -/* スキルユニットIDを返す(これもデ?タベ?スに入れたいな) */ -int skill_get_unit_id(int id,int flag) +/* スキルユニットの配置情報を返す */ +struct skill_unit_layout skill_unit_layout[MAX_SKILL_UNIT_LAYOUT]; +int firewall_unit_pos; +int icewall_unit_pos; + +struct skill_unit_layout *skill_get_unit_layout(int skillid,int skilllv,struct block_list *src,int x,int y) { + + int pos = skill_get_unit_layout_type(skillid,skilllv); + int dir; - switch(id){ - case MG_SAFETYWALL: return 0x7e; /* セイフティウォ?ル */ - case MG_FIREWALL: return 0x7f; /* ファイア?ウォ?ル */ - case AL_WARP: return (flag==0)?0x81:0x80; /* ワ?プポ?タル */ - case PR_BENEDICTIO: return 0x82; /* 聖?降福 */ - case PR_SANCTUARY: return 0x83; /* サンクチュアリ */ - case PR_MAGNUS: return 0x84; /* マグヌスエクソシズム */ - case AL_PNEUMA: return 0x85; /* ニュ?マ */ - case MG_THUNDERSTORM: return 0x86; /* サンダ?スト?ム */ - case WZ_HEAVENDRIVE: return 0x86; /* ヘヴンズドライブ */ - case WZ_SIGHTRASHER: return 0x86; /* サイトラッシャ? */ - case WZ_METEOR: return 0x86; /* メテオスト?ム */ - case WZ_VERMILION: return 0x86; /* ロ?ドオブヴァ?ミリオン */ - //case WZ_FROSTNOVA: return 0x86; /* フロストノヴァ */ - case WZ_STORMGUST: return 0x86; /* スト?ムガスト(とりあえずLoVと同じで?理) */ - case CR_GRANDCROSS: return 0x86; /* グランドクロス */ - case NPC_DARKGRANDCROSS: return 0x86; /*闇グランドクロス*/ - case WZ_FIREPILLAR: return (flag==0)?0x87:0x88; /* ファイア?ピラ? */ - case HT_TALKIEBOX: return 0x99; /* ト?キ?ボックス */ - case WZ_ICEWALL: return 0x8d; /* アイスウォ?ル */ - case WZ_QUAGMIRE: return 0x8e; /* クァグマイア */ - case HT_BLASTMINE: return 0x8f; /* ブラストマイン */ - case HT_SKIDTRAP: return 0x90; /* スキッドトラップ */ - case HT_ANKLESNARE: return 0x91; /* アンクルスネア */ - case AS_VENOMDUST: return 0x92; /* ベノムダスト */ - case HT_LANDMINE: return 0x93; /* ランドマイン */ - case HT_SHOCKWAVE: return 0x94; /* ショックウェ?ブトラップ */ - case HT_SANDMAN: return 0x95; /* サンドマン */ - case HT_FLASHER: return 0x96; /* フラッシャ? */ - case HT_FREEZINGTRAP: return 0x97; /* フリ?ジングトラップ */ - case HT_CLAYMORETRAP: return 0x98; /* クレイモア?トラップ */ - case SA_VOLCANO: return 0x9a; /* ボルケ?ノ */ - case SA_DELUGE: return 0x9b; /* デリュ?ジ */ - case SA_VIOLENTGALE: return 0x9c; /* バイオレントゲイル */ - case SA_LANDPROTECTOR: return 0x9d; /* ランドプロテクタ? */ - case BD_LULLABY: return 0x9e; /* 子守歌 */ - case BD_RICHMANKIM: return 0x9f; /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: return 0xa0; /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD:return 0xa1; /* ?太鼓の響き */ - case BD_RINGNIBELUNGEN: return 0xa2; /* ニ?ベルングの指輪 */ - case BD_ROKISWEIL: return 0xa3; /* ロキの叫び */ - case BD_INTOABYSS: return 0xa4; /* 深淵の中に */ - case BD_SIEGFRIED: return 0xa5; /* 不死身のジ?クフリ?ド */ - case BA_DISSONANCE: return 0xa6; /* 不協和音 */ - case BA_WHISTLE: return 0xa7; /* 口笛 */ - case BA_ASSASSINCROSS: return 0xa8; /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: return 0xa9; /* ブラギの詩 */ - case BA_APPLEIDUN: return 0xaa; /* イドゥンの林檎 */ - case DC_UGLYDANCE: return 0xab; /* 自分勝手なダンス */ - case DC_HUMMING: return 0xac; /* ハミング */ - case DC_DONTFORGETME: return 0xad; /* 私を忘れないで… */ - case DC_FORTUNEKISS: return 0xae; /* 幸運のキス */ - case DC_SERVICEFORYOU: return 0xaf; /* サ?ビスフォ?ユ? */ - case RG_GRAFFITI: return 0xb0; /* グラフィティ */ - case AM_DEMONSTRATION: return 0xb1; /* デモンストレ?ション */ - case WE_CALLPARTNER: return 0xb2; /* あなたに逢いたい */ - case PA_GOSPEL: return 0xb3; /* ゴスペル */ - case HP_BASILICA: return 0xb4; /* バジリカ */ -// case CG_MOONLIT: return 0xb5; - case PF_FOGWALL: return 0xb6; /* フォグウォ?ル */ - case PF_SPIDERWEB: return 0xb7; /* スパイダ?ウェッブ */ - // temporary unit ID's [Celest] - case GD_LEADERSHIP: return 0xc1; - case GD_GLORYWOUNDS: return 0xc2; - case GD_SOULCOLD: return 0xc3; - case GD_HAWKEYES: return 0xc4; - } - return 0; - /* - 0x89,0x8a,0x8b 表示無し - 0x9a 炎?性の詠唱みたいなエフェクト - 0x9b 水?性の詠唱みたいなエフェクト - 0x9c 風?性の詠唱みたいなエフェクト - 0x9d 白い小さなエフェクト - 0xb1 Alchemist Demonstration - 0xb2 = Pink Warp Portal - 0xb3 = Gospel For Paladin - 0xb4 = Basilica - 0xb5 = Empty - 0xb6 = Fog Wall for Professor - 0xb7 = Spider Web for Professor - 0xb8 = Empty - 0xb9 = - */ + if (pos!=-1) + return &skill_unit_layout[pos]; + + if (src->x==x && src->y==y) + dir = 2; + else + dir = map_calc_dir(src,x,y); + + if (skillid==MG_FIREWALL) + return &skill_unit_layout[firewall_unit_pos+dir]; + else if (skillid==WZ_ICEWALL) + return &skill_unit_layout[icewall_unit_pos+dir]; + + printf("unknown unit layout for skill %d, %d\n",skillid,skilllv); + return &skill_unit_layout[0]; } +// case GD_LEADERSHIP: return 0xc1; +// case GD_GLORYWOUNDS: return 0xc2; +// case GD_SOULCOLD: return 0xc3; +// case GD_HAWKEYES: return 0xc4; +// 0x89,0x8a,0x8b 表示無し +// 0x9a 炎?性の詠唱みたいなエフェクト +// 0x9b 水?性の詠唱みたいなエフェクト +// 0x9c 風?性の詠唱みたいなエフェクト +// 0x9d 白い小さなエフェクト +// 0xb1 Alchemist Demonstration +// 0xb2 = Pink Warp Portal +// 0xb3 = Gospel For Paladin +// 0xb4 = Basilica +// 0xb5 = Empty +// 0xb6 = Fog Wall for Professor +// 0xb7 = Spider Web for Professor +// 0xb8 = Empty +// 0xb9 = + /*========================================== * スキル追加?果 *------------------------------------------ @@ -1162,16 +1128,16 @@ int skill_blown( struct block_list *src, struct block_list *target,int count) nullpo_retr(0, target); if(target->type==BL_PC){ - nullpo_retr(0, sd=(struct map_session_data *)target); + sd=(struct map_session_data *)target; }else if(target->type==BL_MOB){ - nullpo_retr(0, md=(struct mob_data *)target); + md=(struct mob_data *)target; }else if(target->type==BL_PET){ - nullpo_retr(0, pd=(struct pet_data *)target); + pd=(struct pet_data *)target; }else if(target->type==BL_SKILL){ - nullpo_retr(0, su=(struct skill_unit *)target); + su=(struct skill_unit *)target; }else return 0; - if(!(count&0x10000 && (sd||md||pd||su))){ /* 指定なしなら位置?係から方向を求める */ + if(!(count&0x10000)){ /* 指定なしなら位置関係から方向を求める */ dx=target->x-src->x; dx=(dx>0)?1:((dx<0)?-1: 0); dy=target->y-src->y; dy=(dy>0)?1:((dy<0)?-1: 0); } @@ -1228,18 +1194,13 @@ int skill_blown( struct block_list *src, struct block_list *target,int count) if(su){ skill_unit_move_unit_group(su->group,target->m,dx,dy); }else{ -// struct status_change *sc_data=status_get_sc_data(target); - if(moveblock) map_delblock(target); - target->x=nx; - target->y=ny; - if(moveblock) map_addblock(target); -/*ダンス中にエフェクトは移動しないらしい - if(sc_data && sc_data[SC_DANCING].timer!=-1){ //?象がダンス中なのでエフェクトも移動 - struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[SC_DANCING].val2; - if(sg) - skill_unit_move_unit_group(sg,target->m,dx,dy); - } -*/ + int tick = gettick(); + skill_unit_move(target,tick,0); + if(moveblock) map_delblock(target); + target->x=nx; + target->y=ny; + if(moveblock) map_addblock(target); + skill_unit_move(target,tick,1); } if(sd) { /* ?面?に入ってきたので表示 */ @@ -1258,8 +1219,6 @@ int skill_blown( struct block_list *src, struct block_list *target,int count) pd->state.state = prev_state; } - skill_unit_move(target,gettick(),(count&0xffff)+7); /* スキルユニットの判定 */ - return 0; } @@ -1480,9 +1439,6 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds //武器スキル?ここまで switch(skillid){ - case WZ_SIGHTRASHER: - clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, 5); - break; case AS_SPLASHER: clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5); break; @@ -1495,11 +1451,9 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds default: clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, (skillid==0)? 5:type ); } - if(dmg.blewcount > 0 && !map[src->m].flag.gvg) { /* 吹き飛ばし?理とそのパケット */ - if(skillid == WZ_SIGHTRASHER) - skill_blown(src,bl,dmg.blewcount); - else - skill_blown(dsrc,bl,dmg.blewcount); + /* 吹き飛ばし処理とそのパケット */ + if (dmg.blewcount > 0 && bl->type!=BL_SKILL && !map[src->m].flag.gvg) { + skill_blown(dsrc,bl,dmg.blewcount); if(bl->type == BL_MOB) clif_fixmobpos((struct mob_data *)bl); else if(bl->type == BL_PET) @@ -1510,8 +1464,12 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds map_freeblock_lock(); /* ?際にダメ?ジ?理を行う */ - if(skillid || flag) - battle_damage(src,bl,damage,0); + if (skillid || flag) { + if (attack_type&BF_WEAPON) + battle_delay_damage(tick+dmg.amotion,src,bl,damage,0); + else + battle_damage(src,bl,damage,0); + } if(skillid == RG_INTIMIDATE && damage > 0 && !(status_get_mode(bl)&0x20) && !map[src->m].flag.gvg ) { int s_lv = status_get_lv(src),t_lv = status_get_lv(bl); int rate = 50 + skilllv * 5; @@ -1594,8 +1552,12 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds battle_heal(NULL,bl,0,-sp,0); } - if((skillid || flag) && rdamage > 0) - battle_damage(bl,src,rdamage,0); + if ((skillid || flag) && rdamage>0) { + if (attack_type&BF_WEAPON) + battle_delay_damage(tick+dmg.amotion,bl,src,rdamage,0); + else + battle_damage(bl,src,rdamage,0); + } if(attack_type&BF_WEAPON && sc_data && sc_data[SC_AUTOCOUNTER].timer != -1 && sc_data[SC_AUTOCOUNTER].val4 > 0) { if(sc_data[SC_AUTOCOUNTER].val3 == dsrc->id) @@ -1647,9 +1609,8 @@ int skill_area_sub( struct block_list *bl,va_list ap ) static int skill_check_unit_range_sub( struct block_list *bl,va_list ap ) { struct skill_unit *unit; - int *c,x,y,range,sx[4],sy[4]; - int t_range,tx[4],ty[4]; - int i,r_flag,skillid; + int *c; + int skillid,unit_id; nullpo_retr(0, bl); nullpo_retr(0, ap); @@ -1662,57 +1623,46 @@ static int skill_check_unit_range_sub( struct block_list *bl,va_list ap ) if(!unit->alive) return 0; - x = va_arg(ap,int); - y = va_arg(ap,int); - range = va_arg(ap,int); skillid = va_arg(ap,int); + unit_id = unit->group->unit_id; - if(skillid == MG_SAFETYWALL || skillid == AL_PNEUMA) { - if(unit->group->unit_id != 0x7e && unit->group->unit_id != 0x85) + if (skillid==MG_SAFETYWALL || skillid==AL_PNEUMA) { + if(unit_id != 0x7e && unit_id != 0x85) return 0; - } - else if(skillid == AL_WARP) { - if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92) + } else if (skillid==AL_WARP) { + if ((unit_id<0x8f || unit_id>0x99) && unit_id!=0x92) return 0; - } - else if((skillid >= HT_SKIDTRAP && skillid <= HT_CLAYMORETRAP) || skillid == HT_TALKIEBOX) { - if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92) + } else if ((skillid>=HT_SKIDTRAP && skillid<=HT_CLAYMORETRAP) || skillid==HT_TALKIEBOX) { + if ((unit_id<0x8f || unit_id>0x99) && unit_id!=0x92) return 0; - } - else if(skillid == WZ_FIREPILLAR) { - if(unit->group->unit_id != 0x87) + } else if (skillid==WZ_FIREPILLAR) { + if (unit_id!=0x87) return 0; - } - else return 0; - t_range=(unit->range!=0)? unit->range:unit->group->range; - tx[0] = tx[3] = unit->bl.x - t_range; - tx[1] = tx[2] = unit->bl.x + t_range; - ty[0] = ty[1] = unit->bl.y - t_range; - ty[2] = ty[3] = unit->bl.y + t_range; - sx[0] = sx[3] = x - range; - sx[1] = sx[2] = x + range; - sy[0] = sy[1] = y - range; - sy[2] = sy[3] = y + range; - for(i=r_flag=0;i<4;i++) { - if(sx[i] >= tx[0] && sx[i] <= tx[1] && sy[i] >= ty[0] && sy[i] <= ty[2]) { - r_flag = 1; - break; - } - if(tx[i] >= sx[0] && tx[i] <= sx[1] && ty[i] >= sy[0] && ty[i] <= sy[2]) { - r_flag = 1; - break; - } - } - if(r_flag) (*c)++; + } else if (skillid==HP_BASILICA) { + if ((unit_id<0x8f || unit_id>0x99) && unit_id!=0x92 && unit_id!=0x83) + return 0; + } else + return 0; + + (*c)++; return 0; } -int skill_check_unit_range(int m,int x,int y,int range,int skillid) +int skill_check_unit_range(int m,int x,int y,int skillid,int skilllv) { int c = 0; + int range = skill_get_unit_range(skillid); + int layout_type = skill_get_unit_layout_type(skillid,skilllv); + if (layout_type==-1 || layout_type>MAX_SQUARE_LAYOUT) { + printf("skill_check_unit_range: unsupported layout type %d for skill %d\n",layout_type,skillid); + return 0; + } - map_foreachinarea(skill_check_unit_range_sub,m,x-10,y-10,x+10,y+10,BL_SKILL,&c,x,y,range,skillid); + // とりあえず正方形のユニットレイアウトのみ対応 + range += layout_type; + map_foreachinarea(skill_check_unit_range_sub,m, + x-range,y-range,x+range,y+range,BL_SKILL,&c,skillid); return c; } @@ -1720,6 +1670,8 @@ int skill_check_unit_range(int m,int x,int y,int range,int skillid) static int skill_check_unit_range2_sub( struct block_list *bl,va_list ap ) { int *c; + int skillid; + nullpo_retr(0, bl); nullpo_retr(0, ap); @@ -1731,16 +1683,29 @@ static int skill_check_unit_range2_sub( struct block_list *bl,va_list ap ) if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) return 0; + skillid = va_arg(ap,int); + if (skillid==HP_BASILICA && bl->type==BL_PC) + return 0; + (*c)++; return 0; } -int skill_check_unit_range2(int m,int x,int y,int range) +int skill_check_unit_range2(int m,int x,int y,int skillid, int skilllv) { int c = 0; + int range = skill_get_unit_range(skillid); + int layout_type = skill_get_unit_layout_type(skillid,skilllv); + if (layout_type==-1 || layout_type>MAX_SQUARE_LAYOUT) { + printf("skill_check_unit_range2: unsupported layout type %d for skill %d\n",layout_type,skillid); + return 0; + } - map_foreachinarea(skill_check_unit_range2_sub,m,x-range,y-range,x+range,y+range,0,&c); + // とりあえず正方形のユニットレイアウトのみ対応 + range += layout_type; + map_foreachinarea(skill_check_unit_range2_sub,m, + x-range,y-range,x+range,y+range,0,&c,skillid); return c; } @@ -1758,6 +1723,27 @@ int skill_area_sub_count(struct block_list *src,struct block_list *target,int sk return 0; } +int skill_count_water(struct block_list *src,int range) +{ + int i,x,y,cnt = 0,size = range*2+1; + struct skill_unit *unit; + + for (i=0;ix+(i%size-range); + y = src->y+(i/size-range); + if (map_getcell(src->m,x,y,CELL_CHKWATER)) { + cnt++; + continue; + } + unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL); + if (unit) { + cnt++; + skill_delunit(unit); + } + } + return cnt; +} + /*========================================== * *------------------------------------------ @@ -1877,6 +1863,14 @@ static int skill_timerskill(int tid, unsigned int tick, int id,int data ) src->x+range,src->y+range,0,src,skl->skill_id,skl->skill_lv,tick); break; + case WZ_WATERBALL: + if (skl->type>1) { + skl->timer = 0; // skill_addtimerskillで使用されないように + skill_addtimerskill(src,tick+150,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag); + skl->timer = -1; + } + skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); + break; default: skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); break; @@ -2047,7 +2041,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s if(sd && pc_isdead(sd)) return 1; - if((skillid == WZ_SIGHTRASHER || skillid == CR_GRANDCROSS || skillid == NPC_DARKGRANDCROSS) && src != bl) + if((skillid == CR_GRANDCROSS || skillid == NPC_DARKGRANDCROSS) && src != bl) bl = src; if(bl->prev == NULL) return 1; @@ -2445,8 +2439,17 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s case WZ_WATERBALL: /* ウォ?タ?ボ?ル */ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - if(skilllv>1) - status_change_start(src,SC_WATERBALL,skilllv,bl->id,0,0,0,0); + if (skilllv>1) { + int cnt,range; + range = skilllv>5?2:skilllv/2; + if (sd) + cnt = skill_count_water(src,range)-1; + else + cnt = skill_get_num(skillid,skilllv)-1; + if (cnt>0) + skill_addtimerskill(src,tick+150,bl->id,0,0, + skillid,skilllv,cnt,flag); + } break; case PR_BENEDICTIO: /* 聖?降福 */ @@ -2457,6 +2460,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s /* 魔法系範?攻?スキル */ case MG_NAPALMBEAT: /* ナパ?ムビ?ト */ case MG_FIREBALL: /* ファイヤ?ボ?ル */ + case WZ_SIGHTRASHER: /* サイトラッシャー */ if(flag&1){ /* 個別にダメ?ジを?える */ if(bl->id!=skill_area_temp[1]){ @@ -2469,27 +2473,46 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s skill_area_temp[0]| 0x0500); } }else{ - int ar=(skillid==MG_NAPALMBEAT)?1:2; + int ar; + skill_area_temp[0]=0; skill_area_temp[1]=bl->id; - if(skillid==MG_NAPALMBEAT){ /* ナパ?ムでは先に?える */ - skill_area_temp[0]=0; - map_foreachinarea(skill_area_sub, - bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY , - skill_area_sub_count); - }else{ - skill_area_temp[0]=0; - skill_area_temp[2]=bl->x; - skill_area_temp[3]=bl->y; + switch (skillid) { + case MG_NAPALMBEAT: + ar = 1; + /* ナパームビートは分散ダメージなので敵の数を数える */ + map_foreachinarea(skill_area_sub, + bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0, + src,skillid,skilllv,tick,flag|BCT_ENEMY, + skill_area_sub_count); + break; + case MG_FIREBALL: + ar = 2; + skill_area_temp[2]=bl->x; + skill_area_temp[3]=bl->y; + /* ターゲットに攻撃を加える(スキルエフェクト表示) */ + skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, + skill_area_temp[0]); + break; + case WZ_SIGHTRASHER: + default: + ar = 3; + bl = src; + status_change_end(src,SC_SIGHT,-1); + break; } - /* まずタ?ゲットに攻?を加える */ - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, - skill_area_temp[0] ); - /* その後タ?ゲット以外の範??の敵全?に?理を行う */ + if (skillid==WZ_SIGHTRASHER) { + /* スキルエフェクト表示 */ + clif_skill_nodamage(src,bl,skillid,skilllv,1); + } else { + /* ターゲットに攻撃を加える(スキルエフェクト表示) */ + skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, + skill_area_temp[0]); + } + /* ターゲット以外の範囲内の敵全体に処理を行う */ map_foreachinarea(skill_area_sub, - bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); + bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0, + src,skillid,skilllv,tick, flag|BCT_ENEMY|1, + skill_castend_damage_id); } break; @@ -2528,12 +2551,6 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s map_foreachinarea(skill_attack_area,src->m,src->x-5,bl->y-5,bl->x+5,bl->y+5,0,BF_MAGIC,src,src,skillid,skilllv,tick,flag,BCT_ENEMY); break; - case WZ_SIGHTRASHER: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0); - status_change_end(src,SC_SIGHT,-1); - break; - /* その他 */ case HT_BLITZBEAT: /* ブリッツビ?ト */ if(flag&1){ @@ -4688,7 +4705,6 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil nullpo_retr(0, sd=(struct map_session_data *)src); } if( skillid != WZ_METEOR && - skillid != WZ_SIGHTRASHER && skillid != AM_CANNIBALIZE && skillid != AM_SPHEREMINE) clif_skill_poseffect(src,skillid,skilllv,x,y,tick); @@ -4739,7 +4755,6 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil case AL_PNEUMA: /* ニュ?マ */ case WZ_ICEWALL: /* アイスウォ?ル */ case WZ_FIREPILLAR: /* ファイアピラ? */ - case WZ_SIGHTRASHER: case WZ_QUAGMIRE: /* クァグマイア */ case WZ_VERMILION: /* ロ?ドオブヴァ?ミリオン */ //case WZ_FROSTNOVA: /* フロストノヴァ */ @@ -5007,349 +5022,137 @@ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *ma struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag) { struct skill_unit_group *group; - int i,count=1,limit=10000,val1=0,val2=0; - int target=BCT_ENEMY,interval=1000,range=0; - int dir=0,aoe_diameter=0; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills + int i,limit,val1=0,val2=0,val3=0; + int count=0; + int target,interval,range,unit_flag; + struct skill_unit_layout *layout; struct status_change *sc_data; nullpo_retr(0, src); + limit = skill_get_time(skillid,skilllv); + range = skill_get_unit_range(skillid); + interval = skill_get_unit_interval(skillid); + target = skill_get_unit_target(skillid); + unit_flag = skill_get_unit_flag(skillid); + layout = skill_get_unit_layout(skillid,skilllv,src,x,y); + + if (unit_flag&UF_DEFNOTENEMY && battle_config.defnotenemy) + target = BCT_NOENEMY; + sc_data = status_get_sc_data(src); // for firewall and fogwall - celest switch(skillid){ /* 設定 */ case MG_SAFETYWALL: /* セイフティウォ?ル */ - limit=skill_get_time(skillid,skilllv); val2=skilllv+1; - interval = -1; - target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL; break; - case MG_FIREWALL: /* ファイヤ?ウォ?ル */ - if(src->x == x && src->y == y) - dir = 2; - else - dir=map_calc_dir(src,x,y); - if(dir&1) count=5; - else count=3; - limit=skill_get_time(skillid,skilllv); - if(sc_data) { - if (sc_data[SC_VIOLENTGALE].timer!=-1) limit = limit*3/2; - } - // check for sc_data first - Celest - // if (((struct map_session_data *)src)->sc_data[SC_VIOLENTGALE].timer!=-1) - // limit *= 1.5; + if(sc_data && sc_data[SC_VIOLENTGALE].timer!=-1) + limit = limit*3/2; val2=4+skilllv; - interval=1; - break; - - case AL_PNEUMA: /* ニュ?マ */ - limit=skill_get_time(skillid,skilllv); - interval = -1; - target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL; - count = 9; break; case AL_WARP: /* ワ?プポ?タル */ - target=BCT_ALL; val1=skilllv+6; if(flag==0) limit=2000; - else - limit=skill_get_time(skillid,skilllv); break; case PR_SANCTUARY: /* サンクチュアリ */ - count=21; - limit=skill_get_time(skillid,skilllv); val1=(skilllv+3)*2; val2=(skilllv>6)?777:skilllv*100; - target=BCT_ALL; - range=1; - break; - - case PR_MAGNUS: /* マグヌスエクソシズム */ - count=33; - limit=skill_get_time(skillid,skilllv); - interval=3000; + interval += 500; break; case WZ_FIREPILLAR: /* ファイア?ピラ? */ - if(flag==0) - limit=skill_get_time(skillid,skilllv); - else + if(flag!=0) limit=1000; - interval=2000; val1=skilllv+2; - if(skilllv < 6) - range=1; - else + if(skilllv >= 6) range=2; break; - case MG_THUNDERSTORM: /* サンダ?スト?ム */ - limit=500; - range=1; - break; - - //case WZ_FROSTNOVA: /* フロストノヴァ */ - // limit=500; - // range=5; - // break; - - case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */ - limit=500; - range=2; - break; - - case WZ_METEOR: /* メテオスト?ム */ - limit=500; - range=3; - break; - - case WZ_SIGHTRASHER: - limit=500; - count=41; - break; - - case WZ_VERMILION: /* ロ?ドオブヴァ?ミリオン */ - limit=4100; - interval=1000; - range=6; - break; - - case WZ_ICEWALL: /* アイスウォ?ル */ - limit=skill_get_time(skillid,skilllv); - count=5; - break; - - case WZ_STORMGUST: /* スト?ムガスト */ - limit=4600; - interval=450; - range=5; - break; - - case WZ_QUAGMIRE: /* クァグマイア */ - limit=skill_get_time(skillid,skilllv); - interval=200; - count=25; - break; - case HT_SANDMAN: /* サンドマン */ case HT_CLAYMORETRAP: /* クレイモア?トラップ */ - limit=skill_get_time(skillid,skilllv); - // longer trap times in WOE [celest] - if (map[src->m].flag.gvg) limit *= 4; - range=2; - break; case HT_SKIDTRAP: /* スキッドトラップ */ case HT_LANDMINE: /* ランドマイン */ case HT_ANKLESNARE: /* アンクルスネア */ - case PF_SPIDERWEB: /* スパイダ?ウェッブ */ case HT_FLASHER: /* フラッシャ? */ case HT_FREEZINGTRAP: /* フリ?ジングトラップ */ case HT_BLASTMINE: /* ブラストマイン */ - limit=skill_get_time(skillid,skilllv); // longer trap times in WOE [celest] - if (skillid != PF_SPIDERWEB && map[src->m].flag.gvg) - limit *= 4; - range=1; - break; - - case HT_TALKIEBOX: /* ト?キ?ボックス */ - limit=skill_get_time(skillid,skilllv); - range=1; - target=BCT_ALL; + if (map[src->m].flag.gvg) limit *= 4; break; - case HT_SHOCKWAVE: /* ショックウェ?ブトラップ */ - limit=skill_get_time(skillid,skilllv); - range=1; val1=skilllv*15+10; break; - case AS_VENOMDUST: /* ベノムダスト */ - limit=skill_get_time(skillid,skilllv); - interval=1000; - count=5; - break; - - case CR_GRANDCROSS: /* グランドクロス */ - case NPC_DARKGRANDCROSS: /*闇グランドクロス*/ - count=29; - limit=1000; - interval=300; - break; - - case SA_VOLCANO: /* ボルケ?ノ */ - case SA_DELUGE: /* デリュ?ジ */ - case SA_VIOLENTGALE: /* バイオレントゲイル */ - limit=skill_get_time(skillid,skilllv); - //count=skilllv<=2?25:(skilllv<=4?49:81); - count=49; - target=BCT_ALL; - break; - case SA_LANDPROTECTOR: /* グランドクロス */ - limit=skill_get_time(skillid,skilllv); // changed to get duration from cast_db (moonsoul) - val1=skilllv*15+10; - aoe_diameter=skilllv+skilllv%2+5; - target=BCT_ALL; - count=aoe_diameter*aoe_diameter; // -- this will not function if changed to ^2 (moonsoul) - break; - - case BD_LULLABY: /* 子守唄 */ - case BD_ETERNALCHAOS: /* エタ?ナルカオス */ - case BD_ROKISWEIL: /* ロキの叫び */ - count=81; - limit=skill_get_time(skillid,skilllv); - range=5; - target=(skillid==BD_ETERNALCHAOS ? BCT_ENEMY : BCT_ALL); - break; - case BD_RICHMANKIM: - case BD_DRUMBATTLEFIELD: /* ?太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニ?ベルングの指輪 */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジ?クフリ?ド */ - count=81; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_PARTY; + { + int aoe_diameter; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills + val1=skilllv*15+10; + aoe_diameter=skilllv+skilllv%2+5; + count=aoe_diameter*aoe_diameter; // -- this will not function if changed to ^2 (moonsoul) + } break; case BA_WHISTLE: /* 口笛 */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_NOENEMY; if(src->type == BL_PC) val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1; val2 = ((status_get_agi(src)/10)&0xffff)<<16; val2 |= (status_get_luk(src)/10)&0xffff; break; case DC_HUMMING: /* ハミング */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_NOENEMY; if(src->type == BL_PC) val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; val2 = status_get_dex(src)/10; break; - - case BA_DISSONANCE: /* 不協和音 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_ENEMY; - break; - case DC_DONTFORGETME: /* 私を忘れないで… */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_ENEMY; if(src->type == BL_PC) val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; val2 = ((status_get_str(src)/20)&0xffff)<<16; val2 |= (status_get_agi(src)/10)&0xffff; break; case BA_POEMBRAGI: /* ブラギの詩 */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_NOENEMY; if(src->type == BL_PC) val1 = pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON); val2 = ((status_get_dex(src)/10)&0xffff)<<16; val2 |= (status_get_int(src)/5)&0xffff; break; case BA_APPLEIDUN: /* イドゥンの林檎 */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_NOENEMY; if(src->type == BL_PC) val1 = ((pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON))&0xffff)<<16; - else - val1 = 0; - val1 |= (status_get_vit(src))&0xffff; - val2 = 0;//回復用タイムカウンタ(6秒?に1?加) + val2 |= (status_get_vit(src))&0xffff; + val3 = 0;//回復用タイムカウンタ(6秒?に1?加) break; case DC_SERVICEFORYOU: /* サ?ビスフォ?ユ? */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_PARTY; if(src->type == BL_PC) val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; val2 = status_get_int(src)/10; break; case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_NOENEMY; if(src->type == BL_PC) val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1; val2 = status_get_agi(src)/20; break; case DC_FORTUNEKISS: /* 幸運のキス */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=3; - target=BCT_NOENEMY; if(src->type == BL_PC) val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; val2 = status_get_luk(src)/10; break; - case AM_DEMONSTRATION: /* デモンストレ?ション */ - limit=skill_get_time(skillid,skilllv); - interval=1000; - range=1; - target=BCT_ENEMY; - break; - - case WE_CALLPARTNER: /* あなたに逢いたい */ - limit=skill_get_time(skillid,skilllv); - range=-1; - break; - case HP_BASILICA: /* バジリカ */ - limit=skill_get_time(skillid,skilllv); - target=BCT_ALL; - range=3; //Fix to prevent the priest from walking while Basilica is up. battle_stopwalking(src,1); - //status_change_start(src,SC_ANKLE,skilllv,0,0,0,limit,0); - //sd->canmove_tick = gettick() + limit; // added later [celest] - break; - - case PA_GOSPEL: /* ゴスペル */ - count=49; - target=BCT_PARTY; - limit=skill_get_time(skillid,skilllv); break; -/* case CG_MOONLIT: - range=1; - target=BCT_ALL; - limit=skill_get_time(skillid,skilllv); - break;*/ - case PF_FOGWALL: /* フォグウォ?ル */ - count=15; - limit=skill_get_time(skillid,skilllv); - if(sc_data) { - if (sc_data[SC_DELUGE].timer!=-1) limit *= 2; - } + if(sc_data && sc_data[SC_DELUGE].timer!=-1) limit *= 2; break; case RG_GRAFFITI: /* Graffiti */ count=1; // Leave this at 1 [Valaris] - limit=600000; // Time length [Valaris] break; case GD_LEADERSHIP: @@ -5360,20 +5163,16 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, target=BCT_ALL; limit=300000; break; - - default: - if(battle_config.error_log) - printf ("skill_unitsetting: Unknown skill id = %d\n",skillid); - return 0; } - nullpo_retr(NULL, group=skill_initunitgroup(src,count,skillid,skilllv,skill_get_unit_id(skillid,flag&1))); + nullpo_retr(NULL, group=skill_initunitgroup(src,(count > 0 ? count : layout->count), + skillid,skilllv,skill_get_unit_id(skillid,flag&1))); group->limit=limit; group->val1=val1; group->val2=val2; + group->val3=val3; group->target_flag=target; group->interval=interval; - group->range=range; if(skillid==HT_TALKIEBOX || skillid==RG_GRAFFITI){ group->valstr=aCallocA(80, 1); @@ -5383,200 +5182,20 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, } memcpy(group->valstr,talkie_mes,80); } - for(i=0;icount;i++){ struct skill_unit *unit; - int ux=x,uy=y,val1=skilllv,val2=0,limit=group->limit,alive=1; - int range=group->range; - switch(skillid){ /* 設定 */ - case AL_PNEUMA: /* ニュ?マ */ - { - static const int dx[9]={-1, 0, 1,-1, 0, 1,-1, 0, 1}; - static const int dy[9]={-1,-1,-1, 0, 0, 0, 1, 1, 1}; - ux+=dx[i]; - uy+=dy[i]; - } - break; + int ux,uy,val1=skilllv,val2=0,limit=group->limit,alive=1; + ux = x + layout->dx[i]; + uy = y + layout->dy[i]; + switch (skillid) { case MG_FIREWALL: /* ファイヤ?ウォ?ル */ - { - if(dir&1){ /* 斜め配置 */ - static const int dx[][5]={ - { 1,1,0,0,-1 }, { -1,-1,0,0,1 }, - },dy[][5]={ - { 1,0,0,-1,-1 }, { 1,0,0,-1,-1 }, - }; - ux+=dx[(dir>>1)&1][i]; - uy+=dy[(dir>>1)&1][i]; - }else{ /* 上下配置 */ - if(dir%4==0) /* 上下 */ - ux+=i-1; - else /* 左右 */ - uy+=i-1; - } - val2=group->val2; - } - break; - - case PR_SANCTUARY: /* サンクチュアリ */ - { - static const int dx[]={ - -1,0,1, -2,-1,0,1,2, -2,-1,0,1,2, -2,-1,0,1,2, -1,0,1 }; - static const int dy[]={ - -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0, 1,1,1,1,1, 2,2,2, }; - ux+=dx[i]; - uy+=dy[i]; - } - break; - - case PR_MAGNUS: /* マグヌスエクソシズム */ - { - static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, - -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; - static const int dy[]={ - -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1, - 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 }; - ux+=dx[i]; - uy+=dy[i]; - } + val2=group->val2; break; - - case WZ_SIGHTRASHER: - { - static const int dx[]={ - -5, 0, 5, -4, 0, 4, -3, 0, 3, -2, 0, 2, -1, 0, 1, -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5, -1, 0, 1, -2, 0, 2, -3, 0, 3, -4, 0, 4, -5, 0, 5 }; - static const int dy[]={ - -5,-5,-5, -4,-4,-4, -3,-3,-3, -2,-2,-2, -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5 }; - ux+=dx[i]; - uy+=dy[i]; - } - break; - case WZ_ICEWALL: /* アイスウォ?ル */ - { - static const int dirx[8]={0,-1,-1,-1,0,1,1,1}; - static const int diry[8]={1,1,0,-1,-1,-1,0,1}; if(skilllv <= 1) val1 = 500; else val1 = 200 + 200*skilllv; - if(src->x == x && src->y == y) - dir = 2; - else - dir=map_calc_dir(src,x,y); - ux+=(2-i)*diry[dir]; - uy+=(i-2)*dirx[dir]; - } - break; - - case WZ_QUAGMIRE: /* クァグマイア */ - ux+=(i%5-2); - uy+=(i/5-2); - if(i==12) - range=2; - else - range=-1; - - break; - - case AS_VENOMDUST: /* ベノムダスト */ - { - static const int dx[]={-1,0,0,0,1}; - static const int dy[]={0,-1,0,1,0}; - ux+=dx[i]; - uy+=dy[i]; - } - break; - - case CR_GRANDCROSS: /* グランドクロス */ - case NPC_DARKGRANDCROSS: /*闇グランドクロス*/ - { - static const int dx[]={ - 0, 0, -1,0,1, -2,-1,0,1,2, -4,-3,-2,-1,0,1,2,3,4, -2,-1,0,1,2, -1,0,1, 0, 0, }; - static const int dy[]={ - -4, -3, -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0,0,0,0,0, 1,1,1,1,1, 2,2,2, 3, 4, }; - ux+=dx[i]; - uy+=dy[i]; - } - break; - case SA_VOLCANO: /* ボルケ?ノ */ - case SA_DELUGE: /* デリュ?ジ */ - case SA_VIOLENTGALE: /* バイオレントゲイル */ - { - int u_range=0,central=0; - if(skilllv<=2){ - u_range=2; - central=12; - }else if(skilllv<=4){ - u_range=3; - central=24; - }else if(skilllv>=5){ - u_range=4; - central=40; - } - ux+=(i%(u_range*2+1)-u_range); - uy+=(i/(u_range*2+1)-u_range); - - if(i==central) - range=u_range;//中央のユニットの?果範?は全範? - else - range=-1;//中央以外のユニットは飾り - } - break; - case SA_LANDPROTECTOR: /* ランドプロテクタ? */ - { - int u_range=0; - - if(skilllv<=2) u_range=3; - else if(skilllv<=4) u_range=4; - else if(skilllv>=5) u_range=5; - - ux+=(i%(u_range*2+1)-u_range); - uy+=(i/(u_range*2+1)-u_range); - - range=0; - } - break; - - /* ダンスなど */ - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD:/* ?太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニ?ベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジ?クフリ?ド */ - ux+=(i%9-4); - uy+=(i/9-4); - if(i==40) - range=4; /* 中心の場合は範?を4にオ?バ?ライド */ - else - range=-1; /* 中心じゃない場合は範?を-1にオ?バ?ライド */ - break; - case BA_DISSONANCE: /* 不協和音 */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: /* ブラギの詩 */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - case DC_HUMMING: /* ハミング */ - case DC_DONTFORGETME: /* 私を忘れないで… */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サ?ビスフォ?ユ? */ -// case CG_MOONLIT: - ux+=(i%7-3); - uy+=(i/7-3); - if(i==40) - range=4; /* 中心の場合は範?を4にオ?バ?ライド */ - else - range=-1; /* 中心じゃない場合は範?を-1にオ?バ?ライド */ - break; - case PA_GOSPEL: /* ゴスペル */ - ux+=(i%7-3); - uy+=(i/7-3); - break; - case PF_FOGWALL: /* フォグウォ?ル */ - ux+=(i%5-2); - uy+=(i/5-1); break; case RG_GRAFFITI: /* Graffiti [Valaris] */ ux+=(i%5-2); @@ -5603,7 +5222,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, unit->val2=val2; unit->limit=limit; unit->range=range; - + // [celest] if (sc_data) { // attach the unit's id to the caster @@ -5642,6 +5261,10 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, break; } } + if (range==0) + map_foreachinarea(skill_unit_effect,unit->bl.m + ,unit->bl.x,unit->bl.y,unit->bl.x,unit->bl.y + ,0,&unit->bl,gettick(),1); } } return group; @@ -5655,123 +5278,284 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int { struct skill_unit_group *sg; struct block_list *ss; - struct skill_unit_group_tickset *ts; - struct map_session_data *srcsd=NULL; - int diff,goflag,splash_count=0; + struct skill_unit *unit2; struct status_change *sc_data; + int type; nullpo_retr(0, src); nullpo_retr(0, bl); - sc_data = status_get_sc_data(bl); - - if( bl->prev==NULL || !src->alive || (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl) ) ) + + if(bl->prev==NULL || !src->alive || + (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))) return 0; nullpo_retr(0, sg=src->group); nullpo_retr(0, ss=map_id2bl(sg->src_id)); + + sc_data = status_get_sc_data(bl); + type = SkillStatusChangeTable[sg->skill_id]; - if(ss->type == BL_PC) - nullpo_retr(0, srcsd=(struct map_session_data *)ss); - if(srcsd && srcsd->chatID) + if (battle_check_target(&src->bl,bl,sg->target_flag)<=0) return 0; - if( bl->type != BL_PC && bl->type != BL_MOB ) + // 対象がLP上に居る場合は無効 + if (map_find_skill_unit_oncell(bl,bl->x,bl->y,SA_LANDPROTECTOR,NULL)) return 0; - nullpo_retr(0, ts = skill_unitgrouptickset_search(bl, sg)); - diff=DIFF_TICK(tick,ts->tick); - goflag=(diff>sg->interval || diff<0); - if (sg->skill_id == CR_GRANDCROSS && !battle_config.gx_allhit) // 重なっていたら3HITしない - goflag = (diff>sg->interval*map_count_oncell(bl->m,bl->x,bl->y) || diff<0); - - //?象がLP上に居る場合は無? - map_foreachinarea(skill_landprotector,bl->m,bl->x,bl->y,bl->x,bl->y,BL_SKILL,0,&goflag); - if(!goflag) - return 0; - ts->tick=tick; + switch (sg->unit_id) { + case 0x85: /* ニューマ */ + case 0x7e: /* セイフティウォール */ + if (sc_data && sc_data[type].timer == -1) + status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0); + break; - switch(sg->unit_id){ - case 0x83: /* サンクチュアリ */ - { - int race=status_get_race(bl); - int damage_flag = (battle_check_undead(race,status_get_elem_type(bl)) || race == 6)? 1:0; + case 0x80: /* ワープポータル(発動後) */ + if(bl->type==BL_PC){ + struct map_session_data *sd = (struct map_session_data *)bl; + if(sd && src->bl.m == bl->m && src->bl.x == bl->x && src->bl.y == bl->y && + src->bl.x == sd->to_x && src->bl.y == sd->to_y) { + if( battle_config.chat_warpportal || !sd->chatID ){ + pc_setpos(sd,sg->valstr,sg->val2>>16,sg->val2&0xffff,3); + if(sg->src_id == bl->id || (strcmp(map[src->bl.m].name,sg->valstr) == 0 && + src->bl.x == (sg->val2>>16) && src->bl.y == (sg->val2&0xffff) )) + skill_delunitgroup(sg); + if (--sg->val1<=0) + skill_delunitgroup(sg); + } + } + } else if(bl->type==BL_MOB && battle_config.mob_warpportal){ + int m = map_mapname2mapid(sg->valstr); + mob_warp((struct mob_data *)bl,m,sg->val2>>16,sg->val2&0xffff,3); + } + break; - if( status_get_hp(bl)>=status_get_max_hp(bl) && !damage_flag) - break; + case 0x8e: /* クァグマイア */ + if(bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) + break; + if(sc_data && sc_data[type].timer==-1) + status_change_start(bl,type,sg->skill_lv,(int)src,0,0, + skill_get_time2(sg->skill_id,sg->skill_lv),0); + break; - if((sg->val1--)<=0){ - skill_delunitgroup(sg); - return 0; - } - if(!damage_flag) { - int heal=sg->val2; - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage) - heal=0; /* ?金蟲カ?ド(ヒ?ル量0) */ - clif_skill_nodamage(&src->bl,bl,AL_HEAL,heal,1); - battle_heal(NULL,bl,heal,0,0); - } - else { - // reduce healing count if this was meant for damaging [celest] - sg->val1 /= 2; - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - } + case 0x9a: /* ボルケ?ノ */ + case 0x9b: /* デリュ?ジ */ + case 0x9c: /* バイオレントゲイル */ + if (sc_data && sc_data[type].timer!=-1) { + unit2 = (struct skill_unit *)sc_data[type].val4; + if (unit2 && unit2->group && + (unit2==src || DIFF_TICK(sg->tick,unit2->group->tick)<=0)) + break; } + status_change_start(bl,type,sg->skill_lv,(int)src,0,0, + skill_get_time2(sg->skill_id,sg->skill_lv),0); break; - case 0x84: /* マグヌスエクソシズム */ - { - int race=status_get_race(bl); - int damage_flag = (battle_check_undead(race,status_get_elem_type(bl)) || race == 6)? 1:0; + case 0x9e: /* 子守唄 */ + case 0x9f: /* ニヨルドの宴 */ + case 0xa0: /* 永遠の混沌 */ + case 0xa1: /* ?太鼓の響き */ + case 0xa2: /* ニ?ベルングの指輪 */ + case 0xa3: /* ロキの叫び */ + case 0xa4: /* 深淵の中に */ + case 0xa5: /* 不死身のジ?クフリ?ド */ + case 0xa6: /* 不協和音 */ + case 0xa7: /* 口笛 */ + case 0xa8: /* 夕陽のアサシンクロス */ + case 0xa9: /* ブラギの詩 */ + case 0xaa: /* イドゥンの林檎 */ + case 0xab: /* 自分勝手なダンス */ + case 0xac: /* ハミング */ + case 0xad: /* 私を忘れないで… */ + case 0xae: /* 幸運のキス */ + case 0xaf: /* サ?ビスフォ?ユ? */ + case 0xb4: + if (sg->src_id==bl->id) + break; + if (sc_data && sc_data[type].timer!=-1) { + unit2 = (struct skill_unit *)sc_data[type].val4; + if (unit2 && unit2->group && + (unit2 == src || DIFF_TICK(sg->tick,unit2->group->tick)<=0)) + break; + } + status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, + (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); + break; - if(!damage_flag) - return 0; - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + case 0xb6: /* フォグウォ?ル */ + if (sc_data && sc_data[type].timer!=-1) { + unit2 = (struct skill_unit *)sc_data[type].val4; + if (unit2 && unit2->group && + (unit2 == src || DIFF_TICK(sg->tick,unit2->group->tick)<=0)) + break; } + status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, + (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); + skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); break; - case 0x85: /* ニュ?マ */ + // New guild skills [Celest] + case 0xc1: // GD_LEADERSHIP { - struct skill_unit *unit2; - int type=SC_PNEUMA; - if(sc_data) { - if (sc_data[type].timer==-1) - status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0); - else if((unit2 = (struct skill_unit *)sc_data[type].val2) && unit2 != src){ - if(unit2 && unit2->group && DIFF_TICK(sg->tick,unit2->group->tick) > 0) - status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0); - ts->tick-=sg->interval; + struct map_session_data *sd, *tsd; + tsd=(struct map_session_data *)ss; + if (tsd && (sd=(struct map_session_data *)bl) && + sd->status.guild_id == tsd->status.guild_id && + sd != tsd) { + sd->state.leadership_flag = (int)src; + status_calc_pc (sd, 0); + } + } + break; + case 0xc2: // GD_GLORYWOUNDS + { + struct map_session_data *sd, *tsd; + tsd=(struct map_session_data *)ss; + if (tsd && (sd=(struct map_session_data *)bl) && + sd->status.guild_id == tsd->status.guild_id && + sd != tsd) { + sd->state.glorywounds_flag = (int)src; + status_calc_pc (sd, 0); + } + } + break; + case 0xc3: // GD_SOULCOLD + { + struct map_session_data *sd, *tsd; + tsd=(struct map_session_data *)ss; + if (tsd && (sd=(struct map_session_data *)bl) && + sd->status.guild_id == tsd->status.guild_id && + sd != tsd) { + sd->state.soulcold_flag = (int)src; + status_calc_pc (sd, 0); } - } } break; - case 0x7e: /* セイフティウォ?ル */ - if (sc_data) { - status_change_start(bl,SC_SAFETYWALL,sg->skill_lv,(int)src,0,0,0,0); - ts->tick-=sg->interval; + case 0xc4: // GD_HAWKEYES + { + struct map_session_data *sd, *tsd; + tsd=(struct map_session_data *)ss; + if (tsd && (sd=(struct map_session_data *)bl) && + sd->status.guild_id == tsd->status.guild_id && + sd != tsd) { + sd->state.hawkeyes_flag = (int)src; + status_calc_pc (sd, 0); + } } break; - case 0x86: /* ロ?ドオブヴァ?ミリオン(&スト?ムガスト &グランドクロス) */ - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + case 0xb2: /* あなたを_?いたいです */ + case 0xb3: /* ゴスペル */ + //case 0xb6: /* フォグウォ?ル */ - moved [celest] + //とりあえず何もしない break; + /* default: + if(battle_config.error_log) + printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); + break;*/ + } + + return 0; +} + +/*========================================== + * スキルユニットの発動イベント(タイマー発動) + *------------------------------------------ + */ +int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsigned int tick) +{ + struct skill_unit_group *sg; + struct block_list *ss; + int splash_count=0; + struct status_change *sc_data; + struct skill_unit_group_tickset *ts; + int type; + int diff=0; + + nullpo_retr(0, src); + nullpo_retr(0, bl); + + if (bl->type!=BL_PC && bl->type!=BL_MOB) + return 0; + + if (bl->prev==NULL || !src->alive || + (bl->type==BL_PC && pc_isdead((struct map_session_data *)bl))) + return 0; + + nullpo_retr(0, sg=src->group); + nullpo_retr(0, ss=map_id2bl(sg->src_id)); + sc_data = status_get_sc_data(bl); + type = SkillStatusChangeTable[sg->skill_id]; + + // 対象がLP上に居る場合は無効 + if (map_find_skill_unit_oncell(bl,bl->x,bl->y,SA_LANDPROTECTOR,NULL)) + return 0; + + // 前に影響を受けてからintervalの間は影響を受けない + nullpo_retr(0,ts = skill_unitgrouptickset_search(bl,sg,tick)); + diff = DIFF_TICK(tick,ts->tick); + if (sg->skill_id == PR_SANCTUARY) + diff += 500; // 新規に回復したユニットだけカウントするための仕掛け + if (diff < 0) + return 0; + ts->tick = tick+sg->interval; + // GXは重なっていたら3HITしない + if (sg->skill_id==CR_GRANDCROSS && !battle_config.gx_allhit) + ts->tick += sg->interval*(map_count_oncell(bl->m,bl->x,bl->y)-1); - case 0x7f: /* ファイヤ?ウォ?ル */ - if( (src->val2--)>0) - skill_attack(BF_MAGIC,ss,&src->bl,bl, - sg->skill_id,sg->skill_lv,tick,0); - if( src->val2<=0 ) + switch (sg->unit_id) { + case 0x83: /* サンクチュアリ */ + { + int race=status_get_race(bl); + + if (battle_check_undead(race,status_get_elem_type(bl)) || race==6) { + if (skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0)) { + // reduce healing count if this was meant for damaging [celest] + // sg->val1 /= 2; + sg->val1--; // チャットキャンセルに対応 + } + } else { + int heal = sg->val2; + if (status_get_hp(bl)>=status_get_max_hp(bl)) + break; + if(bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage) + heal=0; /* 黄金蟲カード(ヒール量0) */ + clif_skill_nodamage(&src->bl,bl,AL_HEAL,heal,1); + battle_heal(NULL,bl,heal,0,0); + if (diff>=500) + sg->val1--; // 新規に入ったユニットだけカウント + } + if (sg->val1<=0) + skill_delunitgroup(sg); + break; + } + + case 0x84: /* マグヌスエクソシズム */ + { + int race = status_get_race(bl); + if (!battle_check_undead(race,status_get_elem_type(bl)) && race!=6) + return 0; + skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + src->val2++; + break; + } + + case 0x7f: /* ファイヤーウォール */ + skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + if (--src->val2<=0) skill_delunit(src); break; - - case 0x87: /* ファイア?ピラ?(?動前) */ + case 0x86: /* ロードオブヴァーミリオン(TS,MS,FN,SG,HD,GX,闇GX) */ + skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); + break; + case 0x87: /* ファイアーピラー(発動前) */ skill_delunit(src); skill_unitsetting(ss,sg->skill_id,sg->skill_lv,src->bl.x,src->bl.y,1); break; - case 0x88: /* ファイア?ピラ?(?動後) */ - if(DIFF_TICK(tick,sg->tick) < 150) - //skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - map_foreachinarea(skill_attack_area,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,BF_MAGIC,ss,&src->bl,sg->skill_id,sg->skill_lv,tick,0,BCT_ENEMY); // area damage [Celest] + case 0x88: /* ファイアーピラー(発動後) */ + map_foreachinarea(skill_attack_area,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, + BF_MAGIC,ss,&src->bl,sg->skill_id,sg->skill_lv,tick,0,BCT_ENEMY); // area damage [Celest] + //skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); break; case 0x90: /* スキッドトラップ */ @@ -5784,7 +5568,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int clif_changelook(&src->bl,LOOK_BASE,sg->unit_id); sg->limit=DIFF_TICK(tick,sg->tick)+1500; } - break; + break; case 0x93: /* ランドマイン */ skill_attack(BF_MISC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); @@ -5813,22 +5597,22 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int break; case 0x91: /* アンクルスネア */ - { - struct status_change *sc_data=status_get_sc_data(bl); - if(sg->val2==0 && sc_data && sc_data[SC_ANKLE].timer==-1){ - int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE); - int sec = skill_get_time2(sg->skill_id,sg->skill_lv) - status_get_agi(bl)*100; - if(status_get_mode(bl)&0x20) - sec = sec/5; - if (sec < 3000) // minimum time of 3 seconds [celest] - sec = 3000; - battle_stopwalking(bl,1); - status_change_start(bl,SC_ANKLE,sg->skill_lv,0,0,0,sec,0); - + if(sg->val2==0 && sc_data && sc_data[SC_ANKLE].timer==-1){ + int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE); + int sec = skill_get_time2(sg->skill_id,sg->skill_lv) - status_get_agi(bl)*100; + if(status_get_mode(bl)&0x20) + sec = sec/5; + if (sec < 3000) // minimum time of 3 seconds [celest] + sec = 3000; + battle_stopwalking(bl,1); + status_change_start(bl,SC_ANKLE,sg->skill_lv,0,0,0,sec,0); + + skill_unit_move(bl,tick,0); if(moveblock) map_delblock(bl); bl->x = src->bl.x; bl->y = src->bl.y; if(moveblock) map_addblock(bl); + skill_unit_move(bl,tick,1); if(bl->type == BL_MOB) clif_fixmobpos((struct mob_data *)bl); else if(bl->type == BL_PET) @@ -5836,156 +5620,26 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int else clif_fixpos(bl); clif_01ac(&src->bl); - sg->limit=DIFF_TICK(tick,sg->tick) + sec; + sg->limit=DIFF_TICK(tick,sg->tick) + sec; sg->val2=bl->id; - } + sg->interval = -1; + src->range = 0; } break; - case 0x80: /* ワ?プポ?タル(?動後) */ - if(bl->type==BL_PC){ - struct map_session_data *sd = (struct map_session_data *)bl; - if(sd && src->bl.m == bl->m && src->bl.x == bl->x && src->bl.y == bl->y && src->bl.x == sd->to_x && src->bl.y == sd->to_y) { - if( battle_config.chat_warpportal || !sd->chatID ){ - if((sg->val1--)>0){ - pc_setpos(sd,sg->valstr,sg->val2>>16,sg->val2&0xffff,3); - if(sg->src_id == bl->id ||( strcmp(map[src->bl.m].name,sg->valstr) == 0 && src->bl.x == (sg->val2>>16) && src->bl.y == (sg->val2&0xffff) )) - skill_delunitgroup(sg); - }else - skill_delunitgroup(sg); - } - } - }else if(bl->type==BL_MOB && battle_config.mob_warpportal){ - int m=map_mapname2mapid(sg->valstr); - struct mob_data *md; - md=(struct mob_data *)bl; - mob_warp((struct mob_data *)bl,m,sg->val2>>16,sg->val2&0xffff,3); - } - break; - - case 0x8e: /* クァグマイア */ - { - struct status_change *sc_data=status_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if(sc_data && sc_data[type].timer==-1) - status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - } - break; case 0x92: /* ベノムダスト */ - { - struct status_change *sc_data=status_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sc_data && sc_data[type].timer==-1 ) - status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - } + if(sc_data && sc_data[type].timer==-1 ) + status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); break; - case 0x9a: /* ボルケ?ノ */ - case 0x9b: /* デリュ?ジ */ - case 0x9c: /* バイオレントゲイル */ - { - struct skill_unit *unit2; - struct status_change *sc_data=status_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sc_data) { - if (sc_data[type].timer==-1) - status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){ - if(unit2 && unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) - status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - ts->tick-=sg->interval; - } - } - } break; - - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* ?太鼓の響き */ - case 0xa2: /* ニ?ベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジ?クフリ?ド */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サ?ビスフォ?ユ? */ - case 0xb4: -// case 0xb6: /* フォグウォ?ル */ - { - struct skill_unit *unit2; - struct status_change *sc_data=status_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sg->src_id == bl->id) - break; - if(sc_data) { - if (sc_data[type].timer==-1) - status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - else if( (unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){ - if(unit2 && unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) - status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - ts->tick-=sg->interval; - } - } - } break; - - case 0xaa: /* イドゥンの林檎 */ - { - struct skill_unit *unit2; - struct status_change *sc_data=status_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sg->src_id == bl->id) - break; - if(sc_data) { - if (sc_data[type].timer==-1) - status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - else if((unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){ - if(unit2 && unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) - status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - ts->tick-=sg->interval; - } - } - } break; - - case 0xb6: /* フォグウォ?ル */ - { - struct skill_unit *unit2; - struct status_change *sc_data=status_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sc_data) { - if (sc_data[type].timer==-1) { - status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); - } - else if( (unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){ - if(unit2 && unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) { - status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); - } -// ts->tick-=sg->interval; - } - } - } break; case 0xb1: /* デモンストレ?ション */ skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); if(bl->type == BL_PC && rand()%100 < sg->skill_lv && battle_config.equipment_breaking) pc_breakweapon((struct map_session_data *)bl); break; - case 0x99: /* ト?キ?ボックス */ - if(sg->src_id == bl->id) //自分が踏んでも?動しない + + case 0x99: /* トーキーボックス */ + if(sg->src_id == bl->id) //自分が踏んでも発動しない break; if(sg->val2==0){ clif_talkiebox(&src->bl,sg->valstr); @@ -5994,76 +5648,41 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int sg->limit=DIFF_TICK(tick,sg->tick)+5000; sg->val2=-1; //踏んだ } - break; - case 0xb2: /* あなたを_?いたいです */ - case 0xb3: /* ゴスペル */ - //case 0xb6: /* フォグウォ?ル */ - moved [celest] - //とりあえず何もしない - break; + break; + + //case 0xb4: /* バジリカ */ + /*if (battle_check_target(&src->bl,bl,BCT_ENEMY)>0 && + !(status_get_mode(bl)&0x20)) + skill_blown(&src->bl,bl,1); + if (sg->src_id==bl->id) + break; + if (battle_check_target(&src->bl,bl,BCT_NOENEMY)>0) { + type = SkillStatusChangeTable[sg->skill_id]; + status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, + (int)src,sg->interval+100,0); + } + break;*/ case 0xb7: /* スパイダ?ウェッブ */ if(sg->val2==0){ int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE); skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); + skill_unit_move(bl,tick,0); if(moveblock) map_delblock(bl); - bl->x = (&src->bl)->x; - bl->y = (&src->bl)->y; + bl->x = src->bl.x; + bl->y = src->bl.y; if(moveblock) map_addblock(bl); - if(bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *)bl); - else if(bl->type == BL_PET) - clif_fixpetpos((struct pet_data *)bl); - else - clif_fixpos(bl); - clif_01ac(&src->bl); - sg->limit=DIFF_TICK(tick,sg->tick) + skill_get_time2(sg->skill_id,sg->skill_lv); + skill_unit_move(bl,tick,1); + if(bl->type == BL_MOB) + clif_fixmobpos((struct mob_data *)bl); + else if(bl->type == BL_PET) + clif_fixpetpos((struct pet_data *)bl); + else + clif_fixpos(bl); + sg->limit = DIFF_TICK(tick,sg->tick)+skill_get_time2(sg->skill_id,sg->skill_lv); sg->val2=bl->id; - } - break; - - // New guild skills [Celest] - case 0xc1: // GD_LEADERSHIP - { - struct map_session_data *sd; - if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == srcsd->status.guild_id && - sd != srcsd) { - sd->state.leadership_flag = (int)src; - status_calc_pc (sd, 0); - } - } - break; - case 0xc2: // GD_GLORYWOUNDS - { - struct map_session_data *sd; - if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == srcsd->status.guild_id && - sd != srcsd) { - sd->state.glorywounds_flag = (int)src; - status_calc_pc (sd, 0); - } - } - break; - case 0xc3: // GD_SOULCOLD - { - struct map_session_data *sd; - if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == srcsd->status.guild_id && - sd != srcsd) { - sd->state.soulcold_flag = (int)src; - status_calc_pc (sd, 0); - } - } - break; - case 0xc4: // GD_HAWKEYES - { - struct map_session_data *sd; - if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == srcsd->status.guild_id && - sd != srcsd) { - sd->state.hawkeyes_flag = (int)src; - status_calc_pc (sd, 0); - } + sg->interval = -1; + src->range = 0; } break; @@ -6072,6 +5691,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); break;*/ } + if(bl->type==BL_MOB && ss!=bl) /* スキル使用?件のMOBスキル */ { if(battle_config.mob_changetarget_byskill == 1) @@ -6095,77 +5715,41 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int tick) { struct skill_unit_group *sg; + struct status_change *sc_data; + int type; nullpo_retr(0, src); nullpo_retr(0, bl); nullpo_retr(0, sg=src->group); + sc_data = status_get_sc_data(bl); + type = SkillStatusChangeTable[sg->skill_id]; - if( bl->prev==NULL || !src->alive ) - return 0; - - if( bl->type!=BL_PC && bl->type!=BL_MOB ) + if (bl->prev==NULL || !src->alive || + (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))) return 0; switch(sg->unit_id){ - case 0x7e: /* セイフティウォ?ル */ - case 0x85: /* ニュ?マ */ + case 0x7e: /* セイフティウォール */ + case 0x85: /* ニューマ */ case 0x8e: /* クァグマイア */ - { - struct status_change *sc_data=status_get_sc_data(bl); - int type= - (sg->unit_id==0x85)?SC_PNEUMA: - ((sg->unit_id==0x7e)?SC_SAFETYWALL: - SC_QUAGMIRE); - if((type != SC_QUAGMIRE || bl->type != BL_MOB) && - sc_data && sc_data[type].timer!=-1 && ((struct skill_unit *)sc_data[type].val2)==src){ - status_change_end(bl,type,-1); - } - } break; - - case 0x91: /* アンクルスネア */ - { - struct block_list *target=map_id2bl(sg->val2); - if( target && target==bl ){ - status_change_end(bl,SC_ANKLE,-1); - sg->limit=DIFF_TICK(tick,sg->tick)+1000; - } + case 0x9a: /* ボルケーノ */ + case 0x9b: /* デリュージ */ + case 0x9c: /* バイオレントゲイル */ + if (type==SC_QUAGMIRE && bl->type==BL_MOB) + break; + if (sc_data && sc_data[type].timer!=-1 && sc_data[type].val2==(int)src) { + status_change_end(bl,type,-1); } break; -// case 0xb5: - case 0xb8: - { - struct block_list *target=map_id2bl(sg->val2); - if( target==bl ) - status_change_end(bl,SC_SPIDERWEB,-1); + case 0x91: /* アンクルスネア */ + { + struct block_list *target = map_id2bl(sg->val2); + if(target && target == bl){ + status_change_end(bl,SC_ANKLE,-1); sg->limit=DIFF_TICK(tick,sg->tick)+1000; } break; - case 0xb6: - { - struct block_list *target=map_id2bl(sg->val2); - struct status_change *sc_data=status_get_sc_data(bl); - if( target==bl ) { - status_change_end(bl,SC_FOGWALL,-1); - if (sc_data && sc_data[SC_BLIND].timer!=-1) - sc_data[SC_BLIND].timer = add_timer( - gettick() + 30000, status_change_timer, bl->id, 0); - } - //sg->limit=DIFF_TICK(tick,sg->tick)+1000; - } - break; - case 0x9a: /* ボルケ?ノ */ - case 0x9b: /* デリュ?ジ */ - case 0x9c: /* バイオレントゲイル */ - { - struct status_change *sc_data=status_get_sc_data(bl); - struct skill_unit *su; - int type=SkillStatusChangeTable[sg->skill_id]; - if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val2)) && su == src ){ - status_change_end(bl,type,-1); - } - } - break; - + } case 0x9e: /* 子守唄 */ case 0x9f: /* ニヨルドの宴 */ case 0xa0: /* 永遠の混沌 */ @@ -6185,24 +5769,32 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t case 0xae: /* 幸運のキス */ case 0xaf: /* サ?ビスフォ?ユ? */ case 0xb4: - { - struct status_change *sc_data=status_get_sc_data(bl); - struct skill_unit *su; - int type=SkillStatusChangeTable[sg->skill_id]; - if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val4)) && su == src ){ - status_change_end(bl,type,-1); - } + if (sc_data[type].timer!=-1 && sc_data[type].val4==(int)src) { + status_change_end(bl,type,-1); } break; + + case 0xb6: + { + struct block_list *target = map_id2bl(sg->val2); + if(target && target==bl) { + status_change_end(bl,SC_FOGWALL,-1); + if (sc_data && sc_data[SC_BLIND].timer!=-1) + sc_data[SC_BLIND].timer = add_timer( + gettick() + 30000, status_change_timer, bl->id, 0); + } + break; + } + case 0xb7: /* スパイダ?ウェッブ */ { - struct block_list *target=map_id2bl(sg->val2); - if( target && target==bl ) + struct block_list *target = map_id2bl(sg->val2); + if (target && target==bl) status_change_end(bl,SC_SPIDERWEB,-1); - sg->limit=DIFF_TICK(tick,sg->tick)+1000; + sg->limit = DIFF_TICK(tick,sg->tick)+1000; + break; } - break; - // New guild skills [Celest] + // New guild skills [Celest] case 0xc1: // GD_LEADERSHIP { struct map_session_data *sd; @@ -6231,73 +5823,53 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t sd->state.hawkeyes_flag = 0; } break; - /* default: if(battle_config.error_log) printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); break;*/ } - skill_unitgrouptickset_delete(bl,sg); + return 0; } + /*========================================== - * スキルユニットの削除イベント + * スキルユニット効果発動/離脱処理(foreachinarea) + * bl: ユニット(BL_PC/BL_MOB) *------------------------------------------ */ -int skill_unit_ondelete(struct skill_unit *src,struct block_list *bl,unsigned int tick) +int skill_unit_effect(struct block_list *bl,va_list ap) { - struct skill_unit_group *sg; + struct skill_unit *unit; + struct skill_unit_group *group; + int flag; + unsigned int tick; - nullpo_retr(0, src); nullpo_retr(0, bl); - nullpo_retr(0, sg = src->group); + nullpo_retr(0, ap); + nullpo_retr(0, unit=va_arg(ap,struct skill_unit*)); + tick = va_arg(ap,unsigned int); + flag = va_arg(ap,unsigned int); - if( bl->prev==NULL || !src->alive ) + if (bl->type!=BL_PC && bl->type!=BL_MOB) return 0; - if( bl->type!=BL_PC && bl->type!=BL_MOB ) + if (!unit->alive || bl->prev==NULL) return 0; - switch(sg->unit_id){ - case 0x85: /* ニュ?マ */ - case 0x7e: /* セイフティウォ?ル */ - case 0x8e: /* クァグマイヤ */ - case 0x9a: /* ボルケ?ノ */ - case 0x9b: /* デリュ?ジ */ - case 0x9c: /* バイオレントゲイル */ - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* ?太鼓の響き */ - case 0xa2: /* ニ?ベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジ?クフリ?ド */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xaa: /* イドゥンの林檎 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サ?ビスフォ?ユ? */ - case 0xb4: - case 0xc1: - case 0xc2: - case 0xc3: - case 0xc4: - return skill_unit_onout(src,bl,tick); + nullpo_retr(0, group=unit->group); -/* default: - if(battle_config.error_log) - printf("skill_unit_ondelete: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); - break;*/ + if (flag) + skill_unit_onplace(unit,bl,tick); + else { + skill_unit_onout(unit,bl,tick); + unit = map_find_skill_unit_oncell(bl,bl->x,bl->y,group->skill_id,unit); + if (unit) + skill_unit_onplace(unit,bl,tick); } - skill_unitgrouptickset_delete(bl,sg); + return 0; } + /*========================================== * スキルユニットの限界イベント *------------------------------------------ @@ -6435,10 +6007,7 @@ int skill_castend_pos( int tid, unsigned int tick, int id,int data ) return 0; } - if(battle_config.pc_skill_reiteration == 0) { - range = -1; - switch(sd->skillid) { - case MG_SAFETYWALL: + /*case MG_SAFETYWALL: case WZ_FIREPILLAR: case HT_SKIDTRAP: case HT_LANDMINE: @@ -6451,28 +6020,23 @@ int skill_castend_pos( int tid, unsigned int tick, int id,int data ) case HT_CLAYMORETRAP: case HT_TALKIEBOX: case AL_WARP: - case PF_SPIDERWEB: /* スパイダ?ウェッブ */ - case RG_GRAFFITI: /* グラフィティ */ + case PF_SPIDERWEB: + case RG_GRAFFITI: range = 0; break; case AL_PNEUMA: range = 1; - break; - } - if(range >= 0) { - if(skill_check_unit_range(sd->bl.m,sd->skillx,sd->skilly,range,sd->skillid) > 0) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } + break;*/ + if (!battle_config.pc_skill_reiteration && + skill_get_unit_flag(sd->skillid)&UF_NOREITERATION && + skill_check_unit_range(sd->bl.m,sd->skillx,sd->skilly,sd->skillid,sd->skilllv)) { + clif_skill_fail(sd,sd->skillid,0,0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; } - if(battle_config.pc_skill_nofootset) { - range = -1; - switch(sd->skillid) { - case WZ_FIREPILLAR: + /*case WZ_FIREPILLAR: case HT_SKIDTRAP: case HT_LANDMINE: case HT_ANKLESNARE: @@ -6483,25 +6047,22 @@ int skill_castend_pos( int tid, unsigned int tick, int id,int data ) case HT_BLASTMINE: case HT_CLAYMORETRAP: case HT_TALKIEBOX: - case PF_SPIDERWEB: /* スパイダ?ウェッブ */ + case PF_SPIDERWEB: case WZ_ICEWALL: range = 2; break; case AL_WARP: range = 0; - break; - } - if(range >= 0) { - if(skill_check_unit_range2(sd->bl.m,sd->skillx,sd->skilly,range) > 0) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } + break;*/ + if (battle_config.pc_skill_nofootset && + skill_get_unit_flag(sd->skillid)&UF_NOFOOTSET && + skill_check_unit_range2(sd->bl.m,sd->skillx,sd->skilly,sd->skillid,sd->skilllv)) { + clif_skill_fail(sd,sd->skillid,0,0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; } - if(battle_config.pc_land_skill_limit) { maxcount = skill_get_maxcount(sd->skillid); if(maxcount > 0) { @@ -7523,22 +7084,22 @@ int skill_use_id( struct map_session_data *sd, int target_id, return 0; } break; - // removed on 12/14's patch [celest] - //case AS_SPLASHER: /* ベナムスプラッシャ? */ - /* { - struct status_change *t_sc_data = status_get_sc_data(bl); - if(t_sc_data && t_sc_data[SC_POISON].timer==-1){ - clif_skill_fail(sd,skill_num,0,10); - return 0; - } - } - break;*/ case PF_MEMORIZE: /* メモライズ */ casttime = 12000; break; case HW_MAGICPOWER: casttime = 700; break; + case HP_BASILICA: /* バジリカ */ + if (skill_check_unit_range(sd->bl.m,sd->bl.x,sd->bl.y,sd->skillid,sd->skilllv)) { + clif_skill_fail(sd,sd->skillid,0,0); + return 0; + } + if (skill_check_unit_range2(sd->bl.m,sd->bl.x,sd->bl.y,sd->skillid,sd->skilllv)) { + clif_skill_fail(sd,sd->skillid,0,0); + return 0; + } + break; case GD_BATTLEORDER: case GD_REGENERATION: case GD_RESTORE: @@ -7991,13 +7552,14 @@ int skill_devotion3(struct block_list *bl,int target) int n,r=0; nullpo_retr(1, bl); + md = (struct map_session_data *)bl; - if( (md = (struct map_session_data *)bl) == NULL || (sd = map_id2sd(target)) == NULL ) + if ((sd = map_id2sd(target))==NULL) return 1; else r = distance(bl->x,bl->y,sd->bl.x,sd->bl.y); - if(pc_checkskill(sd,CR_DEVOTION)+6 < r){ // 許容範?を超えてた + if(pc_checkskill(md,CR_DEVOTION)+6 < r){ // 許容範?を超えてた for(n=0;n<5;n++) if(md->dev.val1[n]==target) md->dev.val2[n]=0; // 離れた時は、?を切るだけ @@ -8249,11 +7811,27 @@ int skill_abra_dataset(int skilllv) //NPCスキルはダメ if(skill >= NPC_PIERCINGATT && skill <= NPC_SUMMONMONSTER) return 0; //演奏スキルはダメ - if(skill_is_danceskill(skill)) return 0; + if (skill_get_unit_flag(skill)&UF_DANCE) return 0; return skill; } +/*========================================== + * バジリカのセルを設定する + *------------------------------------------ + */ +void skill_basilica_cell(struct skill_unit *unit,int flag) +{ + int i,x,y,range = skill_get_unit_range(HP_BASILICA); + int size = range*2+1; + + for (i=0;ibl.x+(i%size-range); + y = unit->bl.y+(i/size-range); + map_setcell(unit->bl.m,x,y,flag); + } +} + /*========================================== * *------------------------------------------ @@ -8293,16 +7871,20 @@ int skill_clear_element_field(struct block_list *bl) { struct mob_data *md=NULL; struct map_session_data *sd=NULL; - int i,skillid; + int i,max,skillid; nullpo_retr(0, bl); - if(bl->type==BL_MOB) - md=(struct mob_data *)bl; - if(bl->type==BL_PC) - sd=(struct map_session_data *)bl; + if (bl->type==BL_MOB) { + max = MAX_MOBSKILLUNITGROUP; + md = (struct mob_data *)bl; + } else if(bl->type==BL_PC) { + max = MAX_SKILLUNITGROUP; + sd = (struct map_session_data *)bl; + } else + return 0; - for(i=0;iskillunit[i].skill_id; if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR) @@ -8372,7 +7954,8 @@ int skill_idun_heal(struct block_list *bl, va_list ap ) * 指定範??でsrcに?して有?なタ?ゲットのblの?を?える(foreachinarea) *------------------------------------------ */ -int skill_count_target(struct block_list *bl, va_list ap ){ +int skill_count_target(struct block_list *bl, va_list ap) +{ struct block_list *src; int *c; @@ -8527,48 +8110,6 @@ int skill_type_cloaking(struct block_list *bl) *---------------------------------------------------------------------------- */ -/*========================================== - * 演奏/ダンススキルかどうか判定 - * 引? スキルID - * ?り ダンスじゃない=0 合奏=2 それ以外のダンス=1 - *------------------------------------------ - */ -int skill_is_danceskill(int id) -{ - int i; - switch(id){ - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* ?太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニ?ベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジ?クフリ?ド */ - case BD_RAGNAROK: /* 神?の?昏 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - i=2; - break; - case BA_DISSONANCE: /* 不協和音 */ - case BA_FROSTJOKE: /* 寒いジョ?ク */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: /* ブラギの詩 */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - case DC_SCREAM: /* スクリ?ム */ - case DC_HUMMING: /* ハミング */ - case DC_DONTFORGETME: /* 私を忘れないで… */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サ?ビスフォ?ユ? */ - i=1; - break; - default: - i=0; - } - return i; -} - /*========================================== * 演奏/ダンスをやめる * flag 1で合奏中なら相方にユニットを任せる @@ -8650,10 +8191,13 @@ struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,i map_addblock(&unit->bl); clif_skill_setunit(unit); + +// if (group->skill_id==HP_BASILICA) +// skill_basilica_cell(unit,CELL_SETBASILICA); + return unit; } -int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap ); /*========================================== * スキルユニット削除 *------------------------------------------ @@ -8661,7 +8205,6 @@ int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap ); int skill_delunit(struct skill_unit *unit) { struct skill_unit_group *group; - int range; nullpo_retr(0, unit); if(!unit->alive) @@ -8671,11 +8214,15 @@ int skill_delunit(struct skill_unit *unit) /* onlimitイベント呼び出し */ skill_unit_onlimit( unit,gettick() ); - /* ondeleteイベント呼び出し */ - range=group->range; - map_foreachinarea( skill_unit_timer_sub_ondelete, unit->bl.m, - unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0, - &unit->bl,gettick() ); + /* onoutイベント呼び出し */ + if (!unit->range) { + map_foreachinarea(skill_unit_effect,unit->bl.m, + unit->bl.x,unit->bl.y,unit->bl.x,unit->bl.y,0, + &unit->bl,gettick(),0); + } + +// if (group->skill_id==HP_BASILICA) +// skill_basilica_cell(unit,CELL_CLRBASILICA); clif_skill_delunit(unit); @@ -8691,7 +8238,7 @@ int skill_delunit(struct skill_unit *unit) * スキルユニットグル?プ初期化 *------------------------------------------ */ -static int skill_unit_group_newid=10; +static int skill_unit_group_newid = MAX_SKILL_DB; struct skill_unit_group *skill_initunitgroup(struct block_list *src, int count,int skillid,int skilllv,int unit_id) { @@ -8743,7 +8290,7 @@ struct skill_unit_group *skill_initunitgroup(struct block_list *src, group->guild_id=status_get_guild_id(src); group->group_id=skill_unit_group_newid++; if(skill_unit_group_newid<=0) - skill_unit_group_newid=10; + skill_unit_group_newid = MAX_SKILL_DB; group->unit=(struct skill_unit *)aCalloc(count,sizeof(struct skill_unit)); group->unit_count=count; group->val1=group->val2=0; @@ -8751,39 +8298,23 @@ struct skill_unit_group *skill_initunitgroup(struct block_list *src, group->skill_lv=skilllv; group->unit_id=unit_id; group->map=src->m; - group->range=0; group->limit=10000; group->interval=1000; group->tick=gettick(); group->valstr=NULL; - if( skill_is_danceskill(skillid) ){ + if (skill_get_unit_flag(skillid)&UF_DANCE) { struct map_session_data *sd = NULL; if(src->type==BL_PC && (sd=(struct map_session_data *)src) ){ sd->skillid_dance=skillid; sd->skilllv_dance=skilllv; } status_change_start(src,SC_DANCING,skillid,(int)group,0,0,skill_get_time(skillid,skilllv)+1000,0); - switch(skillid){ //合奏スキルは相方をダンス?態にする - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* ?太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニ?ベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジ?クフリ?ド */ - case BD_RAGNAROK: /* 神?の?昏 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - { - int range=1; - int c=0; - if(sd){ - map_foreachinarea(skill_check_condition_use_sub,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c); - } - } + //合奏スキルは相方をダンス状態にする + if (sd && skill_get_unit_flag(skillid)&UF_ENSEMBLE) { + int c=0; + map_foreachinarea(skill_check_condition_use_sub,sd->bl.m, + sd->bl.x-1,sd->bl.y-1,sd->bl.x+1,sd->bl.y+1,BL_PC,&sd->bl,&c); } } return group; @@ -8803,7 +8334,8 @@ int skill_delunitgroup(struct skill_unit_group *group) return 0; src=map_id2bl(group->src_id); - if( skill_is_danceskill(group->skill_id) ){ //ダンススキルはダンス?態を解除する + //ダンススキルはダンス状態を解除する + if (skill_get_unit_flag(group->skill_id)&UF_DANCE) { if(src) status_change_end(src,SC_DANCING,-1); } @@ -8841,13 +8373,14 @@ int skill_clear_unitgroup(struct block_list *src) if(src->type==BL_PC){ group=((struct map_session_data *)src)->skillunit; maxsug=MAX_SKILLUNITGROUP; - }else if(src->type==BL_MOB){ + } else if(src->type==BL_MOB){ group=((struct mob_data *)src)->skillunit; maxsug=MAX_MOBSKILLUNITGROUP; - }else if(src->type==BL_PET){ // [Valaris] + } else if(src->type==BL_PET){ // [Valaris] group=((struct pet_data *)src)->skillunit; maxsug=MAX_MOBSKILLUNITGROUP; - } + } else + return 0; if(group){ int i; for(i=0;iinterval==-1) + return NULL; if (bl->type == BL_PC) set = ((struct map_session_data *)bl)->skillunittick; @@ -8890,16 +8411,16 @@ struct skill_unit_group_tickset *skill_unitgrouptickset_search( else return 0; - if (skill_unit_overlap_type(sg->skill_id)) - id = s = sg->skill_id; + if (skill_get_unit_flag(group->skill_id)&UF_NOOVERLAP) + id = s = group->skill_id; else - id = s = sg->group_id; + id = s = group->group_id; for (i=0; i0 || set[k].id==0)) j=k; } @@ -8908,101 +8429,41 @@ struct skill_unit_group_tickset *skill_unitgrouptickset_search( sprintf (tmp_output, "skill_unitgrouptickset_search: tickset is full\n"); ShowWarning (tmp_output); } - for (i = 0; itype == BL_PC) - set=((struct map_session_data *)bl)->skillunittick; - else if (bl->type == BL_MOB) - set=((struct mob_data *)bl)->skillunittick; - else - return 0; - - if (skill_unit_overlap_type(sg->skill_id)) - id = s = sg->skill_id; - else - id = s = sg->group_id; - - for(i=0; ialive ) { - struct skill_unit_group *sg; - sg = su->group; - if(sg && battle_check_target(src,bl,sg->target_flag )>0) - skill_unit_onplace( su, bl, tick ); - } - return 0; -} + if (bl->type!=BL_PC && bl->type!=BL_MOB) + return 0; + if (!unit->alive || bl->prev==NULL) + return 0; -/*========================================== - * スキルユニットタイマ?削除?理用(foreachinarea) - *------------------------------------------ - */ -int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap ) -{ - struct block_list *src; - struct skill_unit *su; - unsigned int tick; + nullpo_retr(0, group=unit->group); - nullpo_retr(0, bl); - nullpo_retr(0, ap); - src=va_arg(ap,struct block_list*); + if (battle_check_target(&unit->bl,bl,group->target_flag)<=0) + return 0; - tick=va_arg(ap,unsigned int); - su = (struct skill_unit *)src; + skill_unit_onplace_timer(unit,bl,tick); - if( su && su->alive ){ - struct skill_unit_group *sg; - sg = su->group; - if( sg && battle_check_target(src,bl,sg->target_flag )>0 ) - skill_unit_ondelete( su, bl, tick ); - } return 0; } @@ -9020,28 +8481,37 @@ int skill_unit_timer_sub( struct block_list *bl, va_list ap ) nullpo_retr(0, bl); nullpo_retr(0, ap); nullpo_retr(0, unit=(struct skill_unit *)bl); - nullpo_retr(0, group=unit->group); tick=va_arg(ap,unsigned int); if(!unit->alive) return 0; - range=(unit->range!=0)?unit->range:group->range; + nullpo_retr(0, group=unit->group); + range = unit->range; - /* onplaceイベント呼び出し */ - if(unit->alive && unit->range>=0){ - map_foreachinarea( skill_unit_timer_sub_onplace, bl->m, - bl->x-range,bl->y-range,bl->x+range,bl->y+range,0, - bl,tick); - if(group->unit_id == 0xaa && DIFF_TICK(tick,group->tick)>=6000*group->val2){ - map_foreachinarea( skill_idun_heal, bl->m, - bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,unit); - group->val2++; + /* onplace_timerイベント呼び出し */ + if (range>=0 && group->interval!=-1) { + map_foreachinarea(skill_unit_timer_sub_onplace, bl->m, + bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,bl,tick); + if (!unit->alive) + return 0; + // マグヌスは発動したユニットは削除する + if (group->skill_id==PR_MAGNUS && unit->val2) { + skill_delunit(unit); + return 0; } } + // イドゥンの林檎による回復 + if (group->unit_id==0xaa && DIFF_TICK(tick,group->tick)>=6000*group->val3) { + struct block_list *src = map_id2bl(group->src_id); + int range = skill_get_unit_layout_type(group->skill_id,group->skill_lv); + nullpo_retr(0, src); + map_foreachinarea(skill_idun_heal,src->m, + src->x-range,src->y-range,src->x+range,src->y+range,0,unit); + group->val3++; + } /* 時間切れ削除 */ - if(unit->alive && - (DIFF_TICK(tick,group->tick)>=group->limit || DIFF_TICK(tick,group->tick)>=unit->limit) ){ + if((DIFF_TICK(tick,group->tick)>=group->limit || DIFF_TICK(tick,group->tick)>=unit->limit)){ switch(group->unit_id){ case 0x8f: /* ブラストマイン */ group->unit_id = 0x8c; @@ -9113,96 +8583,37 @@ int skill_unit_timer( int tid,unsigned int tick,int id,int data) return 0; } -/*========================================== - * スキルユニット移動時?理用(foreachinarea) - *------------------------------------------ - */ -int skill_unit_out_all_sub( struct block_list *bl, va_list ap ) -{ - struct skill_unit *unit; - struct skill_unit_group *group; - struct block_list *src; - int range; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); - nullpo_retr(0, unit=(struct skill_unit *)bl); - nullpo_retr(0, group=unit->group); - - tick=va_arg(ap,unsigned int); - - if(!unit->alive || src->prev==NULL) - return 0; - - range=(unit->range!=0)?unit->range:group->range; - - if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 ) - return 0; - - if( src->x >= bl->x-range && src->x <= bl->x+range && - src->y >= bl->y-range && src->y <= bl->y+range ) - skill_unit_onout( unit, src, tick ); - - return 0; -} - - -/*========================================== - * スキルユニット移動時?理 - *------------------------------------------ - */ -int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range) -{ - nullpo_retr(0, bl); - - if( bl->prev==NULL ) - return 0; - - if(range<7) - range=7; - map_foreachinarea( skill_unit_out_all_sub, - bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL, - bl,tick ); - - return 0; -} - /*========================================== * スキルユニット移動時?理用(foreachinarea) *------------------------------------------ */ int skill_unit_move_sub( struct block_list *bl, va_list ap ) { - struct skill_unit *unit; + struct skill_unit *unit = (struct skill_unit *)bl; struct skill_unit_group *group; - struct block_list *src; - int range; - unsigned int tick; + struct block_list *target; + unsigned int tick,flag; nullpo_retr(0, bl); nullpo_retr(0, ap); - nullpo_retr(0, unit=(struct skill_unit *)bl); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); - - tick=va_arg(ap,unsigned int); + nullpo_retr(0, target=va_arg(ap,struct block_list*)); + tick = va_arg(ap,unsigned int); + flag = va_arg(ap,int); - if(!unit->alive || src->prev==NULL) + if (target->type!=BL_PC && target->type!=BL_MOB) return 0; - if((group=unit->group) == NULL) + nullpo_retr(0, group=unit->group); + if (group->interval!=-1) return 0; - range=(unit->range!=0)?unit->range:group->range; - if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 ) + if (!unit->alive || target->prev==NULL) return 0; - if( src->x >= bl->x-range && src->x <= bl->x+range && - src->y >= bl->y-range && src->y <= bl->y+range ) - skill_unit_onplace( unit, src, tick ); + if (flag) + skill_unit_onplace(unit,target,tick); else - skill_unit_onout( unit, src, tick ); + skill_unit_onout(unit,target,tick); return 0; } @@ -9211,54 +8622,16 @@ int skill_unit_move_sub( struct block_list *bl, va_list ap ) * スキルユニット移動時?理 *------------------------------------------ */ -int skill_unit_move( struct block_list *bl,unsigned int tick,int range) -{ - nullpo_retr(0, bl); - - if( bl->prev==NULL ) - return 0; - - if(range<7) - range=7; - map_foreachinarea( skill_unit_move_sub, - bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL, - bl,tick ); - - return 0; -} - -/*========================================== - * スキルユニット自?の移動時?理(foreachinarea) - *------------------------------------------ - */ -int skill_unit_move_unit_group_sub( struct block_list *bl, va_list ap ) +int skill_unit_move(struct block_list *bl,unsigned int tick,int flag) { - struct skill_unit *unit; - struct skill_unit_group *group; - struct block_list *src; - int range; - unsigned int tick; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); - nullpo_retr(0, unit=(struct skill_unit *)src); - nullpo_retr(0, group=unit->group); - - tick=va_arg(ap,unsigned int); - if(!unit->alive || bl->prev==NULL) + if(bl->prev==NULL ) return 0; - range=(unit->range!=0)?unit->range:group->range; + map_foreachinarea(skill_unit_move_sub, + bl->m,bl->x,bl->y,bl->x,bl->y,BL_SKILL,bl,tick,flag); - if( range<0 || battle_check_target(src,bl,group->target_flag )<=0 ) - return 0; - if( bl->x >= src->x-range && bl->x <= src->x+range && - bl->y >= src->y-range && bl->y <= src->y+range ) - skill_unit_onplace( unit, bl, tick ); - else - skill_unit_onout( unit, bl, tick ); return 0; } @@ -9269,115 +8642,97 @@ int skill_unit_move_unit_group_sub( struct block_list *bl, va_list ap ) */ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy) { + int i,j; + int tick = gettick(); + int *m_flag; + struct skill_unit *unit1; + struct skill_unit *unit2; + nullpo_retr(0, group); + if (group->unit_count<=0) + return 0; + if (group->unit==NULL) + return 0; - if( group->unit_count<=0) + // 移動可能なスキルはダンス系と、ブラストマイン、クレイモアートラップのみ + if (!(skill_get_unit_flag(group->skill_id)&UF_DANCE) && + group->skill_id!=HT_CLAYMORETRAP && group->skill_id!=HT_BLASTMINE) return 0; - if(group->unit!=NULL){ - if(!battle_config.unit_movement_type){ - int i; - for(i=0;iunit_count;i++){ - struct skill_unit *unit=&group->unit[i]; - if(unit->alive && !(m==unit->bl.m && dx==0 && dy==0)){ - int range=unit->range; - map_delblock(&unit->bl); - unit->bl.m = m; - unit->bl.x += dx; - unit->bl.y += dy; - map_addblock(&unit->bl); - clif_skill_setunit(unit); - if(range>0){ - if(range<7) - range=7; - map_foreachinarea( skill_unit_move_unit_group_sub, unit->bl.m, - unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0, - &unit->bl,gettick() ); - } - } + m_flag = malloc(sizeof(int)*group->unit_count); + memset(m_flag,0,sizeof(int)*group->unit_count);// 移動フラグ + // 先にフラグを全部決める + // m_flag + // 0: 単純移動 + // 1: ユニットを移動する(現位置からユニットがなくなる) + // 2: 残留&新位置が移動先となる(移動先にユニットが存在しない) + // 3: 残留 + for(i=0;iunit_count;i++){ + unit1=&group->unit[i]; + if (!unit1->alive || unit1->bl.m!=m) + continue; + for(j=0;junit_count;j++){ + unit2=&group->unit[j]; + if (!unit2->alive) + continue; + if (unit1->bl.x+dx==unit2->bl.x && unit1->bl.y+dy==unit2->bl.y){ + // 移動先にユニットがかぶっている + m_flag[i] |= 0x1; } - }else{ - int i,j, *r_flag, *s_flag, *m_flag; - struct skill_unit *unit1; - struct skill_unit *unit2; - r_flag = (int *) aMallocA(sizeof(int) * group->unit_count); - s_flag = (int *) aMallocA(sizeof(int) * group->unit_count); - m_flag = (int *) aMallocA(sizeof(int) * group->unit_count); - memset(r_flag,0, sizeof(int) * group->unit_count);// ?承フラグ - memset(s_flag,0, sizeof(int) * group->unit_count);// ?承フラグ - memset(m_flag,0, sizeof(int) * group->unit_count);// ?承フラグ - - //先にフラグを全部決める - for(i=0;iunit_count;i++){ - int move_check=0;// かぶりフラグ - unit1=&group->unit[i]; - for(j=0;junit_count;j++){ - unit2=&group->unit[j]; - if(unit1->bl.m==m && unit1->bl.x+dx==unit2->bl.x && unit1->bl.y+dy==unit2->bl.y){ - //移動先にユニットがかぶってたら - s_flag[i]=1;// 移動前のユニットナンバ?の?承フラグon - r_flag[j]=1;// かぶるユニットナンバ?の?留フラグon - move_check=1;//ユニットがかぶった。 - break; - } - } - if(!move_check)// ユニットがかぶってなかったら - m_flag[i]=1;// 移動前ユニットナンバ?の移動フラグon - } - - //フラグに基づいてユニット移動 - for(i=0;iunit_count;i++){ - unit1=&group->unit[i]; - if(m_flag[i]){// 移動フラグがonで - if(!r_flag[i]){// ?留フラグがoffなら - //?純移動(rangeも?承の必要無し) - int range=unit1->range; - map_delblock(&unit1->bl); - unit1->bl.m = m; - unit1->bl.x += dx; - unit1->bl.y += dy; - map_addblock(&unit1->bl); - clif_skill_setunit(unit1); - if(range > 0){ - if(range < 7) - range = 7; - map_foreachinarea( skill_unit_move_unit_group_sub, unit1->bl.m, - unit1->bl.x-range,unit1->bl.y-range,unit1->bl.x+range,unit1->bl.y+range,0, - &unit1->bl,gettick() ); - } - }else{// ?留フラグがonなら - //空ユニットになるので、?承可能なユニットを探す - for(j=0;junit_count;j++){ - unit2=&group->unit[j]; - if(s_flag[j] && !r_flag[j]){ - // ?承移動(range?承付き) - int range=unit1->range; - map_delblock(&unit2->bl); - unit2->bl.m = m; - unit2->bl.x = unit1->bl.x + dx; - unit2->bl.y = unit1->bl.y + dy; - unit2->range = unit1->range; - map_addblock(&unit2->bl); - clif_skill_setunit(unit2); - if(range > 0){ - if(range < 7) - range = 7; - map_foreachinarea( skill_unit_move_unit_group_sub, unit2->bl.m, - unit2->bl.x-range,unit2->bl.y-range,unit2->bl.x+range,unit2->bl.y+range,0, - &unit2->bl,gettick() ); - } - s_flag[j]=0;// ?承完了したのでoff - break; - } - } - } + if (unit1->bl.x-dx==unit2->bl.x && unit1->bl.y-dy==unit2->bl.y){ + // ユニットがこの場所にやってくる + m_flag[i] |= 0x2; + } + } + } + // フラグに基づいてユニット移動 + // フラグが1のunitを探し、フラグが2のunitの移動先に移す + j = 0; + for (i=0;iunit_count;i++) { + unit1=&group->unit[i]; + if (!unit1->alive) + continue; + if (!(m_flag[i]&0x2)) { + // ユニットがなくなる場所でスキルユニット影響を消す + map_foreachinarea(skill_unit_effect,unit1->bl.m, + unit1->bl.x,unit1->bl.y,unit1->bl.x,unit1->bl.y,0, + &unit1->bl,tick,0); + } + if (m_flag[i]==0) { + // 単純移動 + map_delblock(&unit1->bl); + unit1->bl.m = m; + unit1->bl.x += dx; + unit1->bl.y += dy; + map_addblock(&unit1->bl); + clif_skill_setunit(unit1); + } else if (m_flag[i]==1) { + // フラグが2のものを探してそのユニットの移動先に移動 + for(;junit_count;j++) { + if (m_flag[j]==2) { + // 継承移動 + unit2 = &group->unit[j]; + if (!unit2->alive) + continue; + map_delblock(&unit1->bl); + unit1->bl.m = m; + unit1->bl.x = unit2->bl.x+dx; + unit1->bl.y = unit2->bl.y+dy; + map_addblock(&unit1->bl); + clif_skill_setunit(unit1); + j++; + break; } } - aFree(r_flag); - aFree(s_flag); - aFree(m_flag); + } + if (!(m_flag[i]&0x2)) { + // 移動後の場所でスキルユニットを発動 + map_foreachinarea(skill_unit_effect,unit1->bl.m, + unit1->bl.x,unit1->bl.y,unit1->bl.x,unit1->bl.y,0, + &unit1->bl,tick,1); } } + free(m_flag); return 0; } @@ -9505,25 +8860,29 @@ int skill_produce_mix( struct map_session_data *sd, if(!equip) { // Corrected rates [DracoRPG] --------------------------// if(skill_produce_db[idx].req_skill==AM_PHARMACY) { + make_per = pc_checkskill(sd,AM_LEARNINGPOTION)*100 + + pc_checkskill(sd,AM_PHARMACY)*300 + sd->status.job_level*20 + + sd->status.dex*10+sd->status.int_*5; + if(nameid >= 501 && nameid <= 505) // Normal potions - make_per = 2000 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_POTIONPITCHER)*100; - if(nameid >= 605 && nameid <= 606) // Anodyne & Aloevera (not sure of the formula, I put the same base value as normal pots but without the Aid Potion bonus since they are not throwable pots ^^) - make_per = 2000 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300; + make_per += 2000 + pc_checkskill(sd,AM_POTIONPITCHER)*100; + else if(nameid >= 605 && nameid <= 606) // Anodyne & Aloevera (not sure of the formula, I put the same base value as normal pots but without the Aid Potion bonus since they are not throwable pots ^^) + make_per += 2000; else if(nameid >= 545 && nameid <= 547) // Concentrated potions - make_per = sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300; + ; else if(nameid == 970) // Alcohol - make_per = 1000 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300; + make_per += 1000; else if(nameid == 7135) // Bottle Grenade - make_per = 500 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_DEMONSTRATION)*100; + make_per += 500 + pc_checkskill(sd,AM_DEMONSTRATION)*100; else if(nameid == 7136) // Acid Bottle - make_per = 500 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_ACIDTERROR)*100; + make_per += 500 + pc_checkskill(sd,AM_ACIDTERROR)*100; else if(nameid == 7137) // Plant Bottle - make_per = 500 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_CANNIBALIZE)*100; + make_per += 500 + pc_checkskill(sd,AM_CANNIBALIZE)*100; else if(nameid == 7138) // Marine Sphere Bottle - make_per = 500 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_SPHEREMINE)*100; + make_per += 500 + pc_checkskill(sd,AM_SPHEREMINE)*100; else if(nameid == 7139) // Glistening Coat - make_per = 500 + sd->status.job_level*20 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_CP_WEAPON)*100 + - pc_checkskill(sd,AM_CP_SHIELD)*100 + pc_checkskill(sd,AM_CP_ARMOR)*100 + pc_checkskill(sd,AM_CP_HELM)*100; + make_per += 500 + pc_checkskill(sd,AM_CP_WEAPON)*100 + pc_checkskill(sd,AM_CP_SHIELD)*100 + + pc_checkskill(sd,AM_CP_ARMOR)*100 + pc_checkskill(sd,AM_CP_HELM)*100; else make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300; } else if (skill_produce_db[idx].req_skill == ASC_CDP) { @@ -9604,8 +8963,7 @@ int skill_produce_mix( struct map_session_data *sd, clif_additem(sd,0,0,flag); map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); } - } - else { + } else { if(log_config.produce > 0) log_produce(sd,nameid,slot1,slot2,slot3,0); @@ -9675,6 +9033,213 @@ int skill_arrow_create( struct map_session_data *sd,int nameid) * 初期化系 */ +/*---------------------------------------------------------------------------- + * 初期化系 + */ + +/* + * 文字列処理 + * ',' で区切って val に戻す + */ +int skill_split_str(char *str,char **val,int num) +{ + int i; + + for (i=0; iMAX_SKILL_DB) continue; - memset(split2,0,sizeof(split2)); - for(j=0,p=split[1];jMAX_SKILL_DB) continue; - memset(split2,0,sizeof(split2)); - for(j=0,p=split[1];j=10000 && i<10015) // for guild skills [Celest] + i -= 9500; + else if(i<=0 || i>MAX_SKILL_DB) + continue; + skill_db[i].unit_id[0] = strtol(split[1],NULL,16); + skill_db[i].unit_id[1] = strtol(split[2],NULL,16); + skill_split_atoi(split[3],skill_db[i].unit_layout_type); + skill_db[i].unit_range = atoi(split[4]); + skill_db[i].unit_interval = atoi(split[5]); + + if( strcmpi(split[6],"noenemy")==0 ) skill_db[i].unit_target=BCT_NOENEMY; + else if( strcmpi(split[6],"friend")==0 ) skill_db[i].unit_target=BCT_NOENEMY; + else if( strcmpi(split[6],"party")==0 ) skill_db[i].unit_target=BCT_PARTY; + else if( strcmpi(split[6],"all")==0 ) skill_db[i].unit_target=BCT_ALL; + else if( strcmpi(split[6],"enemy")==0 ) skill_db[i].unit_target=BCT_ENEMY; + else if( strcmpi(split[6],"self")==0 ) skill_db[i].unit_target=BCT_SELF; + else skill_db[i].unit_target = strtol(split[6],NULL,16); + + skill_db[i].unit_flag = strtol(split[7],NULL,16); + k++; } fclose(fp); - sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_cast_db.txt"); + sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_unit_db.txt"); ShowStatus(tmp_output); + skill_init_unit_layout(); /* 製造系スキルデ?タベ?ス */ memset(skill_produce_db,0,sizeof(skill_produce_db)); @@ -9990,16 +9476,11 @@ int skill_readdb(void) if(line[0]=='/' && line[1]=='/') continue; memset(split,0,sizeof(split)); - for(j=0,p=line;j<3 + MAX_PRODUCE_RESOURCE * 2 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } + j = skill_split_str(line,split,(3 + MAX_PRODUCE_RESOURCE * 2)); if(split[0]==0) //fixed by Lupus continue; i=atoi(split[0]); - if(i<=0) - continue; + if(i<=0) continue; skill_produce_db[k].nameid=i; skill_produce_db[k].itemlv=atoi(split[1]); @@ -10031,11 +9512,7 @@ int skill_readdb(void) if(line[0]=='/' && line[1]=='/') continue; memset(split,0,sizeof(split)); - for(j=0,p=line;j<13 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } + j = skill_split_str(line,split,13); if(split[0]==0) //fixed by Lupus continue; i=atoi(split[0]); @@ -10068,11 +9545,7 @@ int skill_readdb(void) if(line[0]=='/' && line[1]=='/') continue; memset(split,0,sizeof(split)); - for(j=0,p=line;j<13 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } + j = skill_split_str(line,split,13); if(split[0]==0) //fixed by Lupus continue; i=atoi(split[0]); @@ -10096,15 +9569,11 @@ int skill_readdb(void) return 1; } while(fgets(line,1020,fp)){ - char *split[50], *split2[MAX_SKILL_LEVEL]; + char *split[50]; if(line[0]=='/' && line[1]=='/') continue; memset(split,0,sizeof(split)); - for(j=0,p=line;j<3 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } + j = skill_split_str(line,split,3); if(split[0]==0) //fixed by Lupus continue; i=atoi(split[0]); @@ -10113,25 +9582,10 @@ int skill_readdb(void) else if(i<=0 || i>MAX_SKILL_DB) continue; - memset(split2,0,sizeof(split2)); - for(j=0,p=split[1];j5) //レベルが5以上の場合は25?に制限(1?目はすでに打ってるので-1) - val3=5*5-1; - else - val3= (val1|1)*(val1|1)-1; - break; - /* スキルじゃない/時間に?係しない */ case SC_RIDING: calc_flag = 1; @@ -4361,21 +4355,6 @@ int status_change_timer(int tid, unsigned int tick, int id, int data) } break; - case SC_WATERBALL: /* ウォ?タ?ボ?ル */ - { - struct block_list *target=map_id2bl(sc_data[type].val2); - if (!target || !target->prev) - break; // target has been killed in previous hits, no need to raise an alarm ^^; - // nullpo_retb(target); - // nullpo_retb(target->prev); - skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0); - if((--sc_data[type].val3)>0) { - sc_data[type].timer=add_timer( 150+tick,status_change_timer, bl->id, data ); - return 0; - } - } - break; - case SC_ENDURE: /* インデュア */ case SC_AUTOBERSERK: // Celest if(sd && sd->special_state.infinite_endure) { diff --git a/src/map/status.h b/src/map/status.h index d788c7b50..fbeee7300 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -111,7 +111,7 @@ enum { // struct map_session_data //-- 137-139 SC_SAFETYWALL = 140, SC_PNEUMA = 141, - SC_WATERBALL = 142, +//-- 142 SC_ANKLE = 143, SC_DANCING = 144, SC_KEEPING = 145, diff --git a/src/txt-converter/char/Makefile b/src/txt-converter/char/Makefile index a4cca87fd..6b85a04db 100644 --- a/src/txt-converter/char/Makefile +++ b/src/txt-converter/char/Makefile @@ -1,7 +1,7 @@ all: char-converter sql: char-converter -COMMON_OBJ = ../../common/core.o ../../common/socket.o ../../common/timer.o ../../common/grfio.o ../../common/db.o ../../common/lock.o ../../common/nullpo.o ../../common/malloc.o ../../common/showmsg.o ../../common/strlib.o +COMMON_OBJ = ../../common/obj/core.o ../../common/obj/socket.o ../../common/obj/timer.o ../../common/obj/grfio.o ../../common/obj/db.o ../../common/obj/lock.o ../../common/obj/nullpo.o ../../common/obj/malloc.o ../../common/obj/showmsg.o ../../common/obj/strlib.o char-converter: char-converter.o $(COMMON_OBJ) $(CC) -o ../../../$@ $^ $(LIB_S) diff --git a/src/txt-converter/login/Makefile b/src/txt-converter/login/Makefile index 56b97e772..7158931d0 100644 --- a/src/txt-converter/login/Makefile +++ b/src/txt-converter/login/Makefile @@ -1,7 +1,7 @@ all: login-converter sql: login-converter -COMMON_OBJ = ../../common/core.o ../../common/socket.o ../../common/timer.o ../../common/grfio.o ../../common/db.o ../../common/lock.o ../../common/nullpo.o ../../common/malloc.o ../../common/showmsg.o ../../common/strlib.o +COMMON_OBJ = ../../common/obj/core.o ../../common/obj/socket.o ../../common/obj/timer.o ../../common/obj/grfio.o ../../common/obj/db.o ../../common/obj/lock.o ../../common/obj/nullpo.o ../../common/obj/malloc.o ../../common/obj/showmsg.o ../../common/obj/strlib.o COMMON_H = ../../common/core.h ../../common/socket.h ../../common/timer.h ../../common/mmo.h ../../common/version.h ../../common/db.h ../../common/malloc.h ../../common/strlib.h -- cgit v1.2.3-70-g09d2 From 33b8fd47955eeab26cede233b14d683b8e0491b8 Mon Sep 17 00:00:00 2001 From: celest Date: Wed, 23 Mar 2005 15:26:52 +0000 Subject: * Fixed alot of memory leaks * Added stray memory cleaning routine to db.c git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@1275 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-SVN.txt | 2 + src/char/char.c | 12 ++--- src/char/int_guild.c | 20 ++++++++- src/char/int_guild.h | 1 + src/char/int_party.c | 11 +++++ src/char/int_party.h | 1 + src/char/int_pet.c | 11 +++++ src/char/int_pet.h | 1 + src/char/int_storage.c | 16 +++++++ src/char/int_storage.h | 1 + src/char/inter.c | 23 ++++++++++ src/char/inter.h | 1 + src/char_sql/char.c | 9 ++++ src/char_sql/int_guild.c | 29 ++++++++++++ src/char_sql/int_guild.h | 1 + src/char_sql/int_party.c | 4 ++ src/char_sql/int_party.h | 1 + src/char_sql/int_pet.c | 4 ++ src/char_sql/int_pet.h | 1 + src/char_sql/int_storage.c | 7 +++ src/char_sql/int_storage.h | 1 + src/char_sql/inter.c | 20 +++++++++ src/char_sql/inter.h | 2 +- src/common/core.c | 12 ++--- src/common/malloc.c | 4 +- src/common/malloc.h | 3 ++ src/common/socket.c | 8 ++-- src/common/timer.h | 4 +- src/login/login.c | 3 +- src/login_sql/login.c | 43 ++++++++++-------- src/map/map.c | 108 ++++++++++++++++++++------------------------- src/map/npc.c | 92 ++++++++++++++++++++++++++------------ src/map/pc.c | 5 +++ src/map/pc.h | 1 + 34 files changed, 327 insertions(+), 135 deletions(-) (limited to 'src/common/malloc.c') diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt index 7d4f3d92a..047c96b99 100644 --- a/Changelog-SVN.txt +++ b/Changelog-SVN.txt @@ -1,6 +1,8 @@ Date Added 03/23 + * Fixed alot of memory leaks [celest] + * Added stray memory cleaning routine to db.c [celest] * Fixed some compile errors, sorry xP [celest] * Corrected potion creation success chances, thanks to Avaj and DracoRPG * Removed some unused potion creation code, thanks to DracoRPG diff --git a/src/char/char.c b/src/char/char.c index 1a2b61389..78f4bd3ae 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -22,6 +22,7 @@ #include "socket.h" #include "timer.h" #include "mmo.h" +#include "db.h" #include "version.h" #include "lock.h" #include "char.h" @@ -630,11 +631,6 @@ int mmo_char_init(void) { printf("out of memory: mmo_char_init (calloc of char_dat).\n"); exit(1); } - online_chars = (struct online_chars*)aCalloc(sizeof(struct online_chars) * 256, 1); - if (!online_chars) { - printf("out of memory: mmo_char_init (calloc of online_chars).\n"); - exit(1); - } for(i = 0; i < char_max; i++) { online_chars[i].char_id = -1; @@ -3456,8 +3452,9 @@ void do_final(void) { delete_session(login_fd); delete_session(char_fd); - for(i = 0; i < fd_max; i++) - if(session[i] != NULL) aFree(session[i]); + inter_final(); + exit_dbn(); + timer_final(); char_log("----End of char-server (normal end with closing of all files)." RETCODE); } @@ -3512,7 +3509,6 @@ int do_init(int argc, char **argv) { online_chars[i].server = -1; } - mmo_char_init(); update_online = time(NULL); diff --git a/src/char/int_guild.c b/src/char/int_guild.c index 267b66f0f..78e6b476f 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -488,10 +488,28 @@ int inter_guild_init() { return 0; } +int castle_db_final (void *k, void *data, va_list ap) +{ + struct guild_castle *gc = data; + if (gc) aFree(gc); + return 0; +} +int guild_db_final (void *k, void *data, va_list ap) +{ + struct guild *g = data; + if (g) aFree(g); + return 0; +} +void inter_guild_final() { + numdb_final(castle_db, castle_db_final); + numdb_final(guild_db, guild_db_final); + return; +} + struct guild *inter_guild_search(int guild_id) { struct guild *g; - g= (struct guild *) numdb_search(guild_db, guild_id); + g = (struct guild *) numdb_search(guild_db, guild_id); return g; } diff --git a/src/char/int_guild.h b/src/char/int_guild.h index 555f5e123..3eeb1b3db 100644 --- a/src/char/int_guild.h +++ b/src/char/int_guild.h @@ -3,6 +3,7 @@ #define _INT_GUILD_H_ int inter_guild_init(); +void inter_guild_final(); int inter_guild_save(); int inter_guild_parse_frommap(int fd); struct guild *inter_guild_search(int guild_id); diff --git a/src/char/int_party.c b/src/char/int_party.c index 3298587f1..5ee48fc70 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -117,6 +117,17 @@ int inter_party_init() { return 0; } +int party_db_final (void *k, void *data, va_list ap) { + struct party *p = data; + if (p) aFree(p); + return 0; +} +void inter_party_final() +{ + numdb_final(party_db, party_db_final); + return; +} + // パ?ティ?デ?タのセ?ブ用 int inter_party_save_sub(void *key, void *data, va_list ap) { char line[8192]; diff --git a/src/char/int_party.h b/src/char/int_party.h index b265b4c2e..e3180f3b7 100644 --- a/src/char/int_party.h +++ b/src/char/int_party.h @@ -3,6 +3,7 @@ #define _INT_PARTY_H_ int inter_party_init(); +void inter_party_final(); int inter_party_save(); int inter_party_parse_frommap(int fd); diff --git a/src/char/int_pet.c b/src/char/int_pet.c index 8682860c0..342854f8b 100644 --- a/src/char/int_pet.c +++ b/src/char/int_pet.c @@ -109,6 +109,17 @@ int inter_pet_init() return 0; } +int pet_db_final (void *k, void *data, va_list ap) { + struct s_pet *p = data; + if (p) aFree(p); + return 0; +} +void inter_pet_final() +{ + numdb_final(pet_db, pet_db_final); + return; +} + int inter_pet_save_sub(void *key,void *data,va_list ap) { char line[8192]; diff --git a/src/char/int_pet.h b/src/char/int_pet.h index 993f913ab..3a48ada3b 100644 --- a/src/char/int_pet.h +++ b/src/char/int_pet.h @@ -3,6 +3,7 @@ #define _INT_PET_H_ int inter_pet_init(); +void inter_pet_final(); int inter_pet_save(); int inter_pet_delete(int pet_id); diff --git a/src/char/int_storage.c b/src/char/int_storage.c index 3c5695c90..67b25909b 100644 --- a/src/char/int_storage.c +++ b/src/char/int_storage.c @@ -291,6 +291,22 @@ int inter_storage_init() return 0; } +int storage_db_final (void *k, void *data, va_list ap) { + struct storage *p = data; + if (p) aFree(p); + return 0; +} +int guild_storage_db_final (void *k, void *data, va_list ap) { + struct guild_storage *p = data; + if (p) aFree(p); + return 0; +} +void inter_storage_final() { + numdb_final(storage_db, storage_db_final); + numdb_final(guild_storage_db, guild_storage_db_final); + return; +} + int inter_storage_save_sub(void *key,void *data,va_list ap) { char line[65536]; diff --git a/src/char/int_storage.h b/src/char/int_storage.h index d918f5fe3..f228be53d 100644 --- a/src/char/int_storage.h +++ b/src/char/int_storage.h @@ -3,6 +3,7 @@ #define _INT_STORAGE_H_ int inter_storage_init(); +void inter_storage_final(); int inter_storage_save(); int inter_guild_storage_save(); int inter_storage_delete(int account_id); diff --git a/src/char/inter.c b/src/char/inter.c index f368a48b6..3a388ea82 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -261,6 +261,29 @@ int inter_init(const char *file) { return 0; } +// finalize +int accreg_db_final (void *k, void *data, va_list ap) { + struct accreg *p = data; + if (p) aFree(p); + return 0; +} +int wis_db_final (void *k, void *data, va_list ap) { + struct WisData *p = data; + if (p) aFree(p); + return 0; +} +void inter_final() { + numdb_final(accreg_db, accreg_db_final); + numdb_final(wis_db, wis_db_final); + + inter_party_final(); + inter_guild_final(); + inter_storage_final(); + inter_pet_final(); + + return; +} + // マップサーバー接続 int inter_mapif_init(int fd) { inter_guild_mapif_init(fd); diff --git a/src/char/inter.h b/src/char/inter.h index 0b6f809d7..636ce31d8 100644 --- a/src/char/inter.h +++ b/src/char/inter.h @@ -3,6 +3,7 @@ #define _INTER_H_ int inter_init(const char *file); +void inter_final(); int inter_save(); int inter_parse_frommap(int fd); int inter_mapif_init(int fd); diff --git a/src/char_sql/char.c b/src/char_sql/char.c index 78467b579..6b122974f 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -3134,6 +3134,12 @@ int char_lan_config_read(const char *lancfgName){ return 0; } +static int char_db_final(void *key,void *data,va_list ap) +{ + struct mmo_charstatus *p = data; + if (p) aFree(p); + return 0; +} void do_final(void) { printf("Doing final stage...\n"); //mmo_char_sync(); @@ -3162,9 +3168,12 @@ void do_final(void) { delete_session(login_fd); delete_session(char_fd); + numdb_final(char_db_, char_db_final); + exit_dbn(); mysql_close(&mysql_handle); mysql_close(&lmysql_handle); + timer_final(); printf("ok! all done...\n"); } diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c index 2f294bade..4961fd933 100644 --- a/src/char_sql/int_guild.c +++ b/src/char_sql/int_guild.c @@ -709,6 +709,35 @@ int inter_guild_sql_init() return 0; } +int guild_expcache_db_final (void *k, void *data, va_list ap) { return 0; } +int guild_infoevent_db_final (void *k, void *data, va_list ap) { return 0; } +int guild_castleinfoevent_db_final (void *k, void *data, va_list ap) { return 0; } +int guild_db_final (void *k, void *data, va_list ap) +{ + struct guild *g = data; + if (g) aFree(g); + return 0; +} +int castle_db_final (void *k, void *data, va_list ap) +{ + struct guild_castle *gc = data; + if (gc) aFree(gc); + return 0; +} +void inter_guild_sql_final() +{ + if (guild_pt) aFree(guild_pt); + if (guild_pt2) aFree(guild_pt2); + if (guildcastle_pt) aFree(guildcastle_pt); + + numdb_final(guild_db_, guild_db_); + numdb_final(castle_db_, castle_db_final); + numdb_final(guild_expcache_db_, guild_expcache_db_final); + numdb_final(guild_infoevent_db_, guild_infoevent_db_final); + numdb_final(guild_castleinfoevent_db_, guild_castleinfoevent_db_final); + + return; +} // Get guild by its name struct guild* search_guildname(char *str) diff --git a/src/char_sql/int_guild.h b/src/char_sql/int_guild.h index 8f4203d7c..8257cf8f6 100644 --- a/src/char_sql/int_guild.h +++ b/src/char_sql/int_guild.h @@ -3,6 +3,7 @@ int inter_guild_parse_frommap(int fd); int inter_guild_sql_init(); +void inter_guild_sql_final(); int inter_guild_mapif_init(int fd); int inter_guild_leave(int guild_id,int account_id,int char_id); diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c index 4cafa9f4d..03392feb6 100644 --- a/src/char_sql/int_party.c +++ b/src/char_sql/int_party.c @@ -237,6 +237,10 @@ int inter_party_sql_init(){ return 0; } +void inter_party_sql_final(){ + if (party_pt) aFree(party_pt); + return; +} // Search for the party according to its name diff --git a/src/char_sql/int_party.h b/src/char_sql/int_party.h index 04f71c881..686d70b04 100644 --- a/src/char_sql/int_party.h +++ b/src/char_sql/int_party.h @@ -3,6 +3,7 @@ int inter_party_parse_frommap(int fd); int inter_party_sql_init(); +void inter_party_sql_final(); int inter_party_leave(int party_id,int account_id); #endif diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c index 35a7710a7..ea1fed67d 100644 --- a/src/char_sql/int_pet.c +++ b/src/char_sql/int_pet.c @@ -136,6 +136,10 @@ int inter_pet_sql_init(){ return 0; } +void inter_pet_sql_final(){ + if (pet_pt) aFree(pet_pt); + return; +} //---------------------------------- int inter_pet_delete(int pet_id){ printf("request delete pet: %d.......\n",pet_id); diff --git a/src/char_sql/int_pet.h b/src/char_sql/int_pet.h index b6e3f1bbf..39f127262 100644 --- a/src/char_sql/int_pet.h +++ b/src/char_sql/int_pet.h @@ -2,6 +2,7 @@ #define _INT_PET_H_ int inter_pet_init(); +void inter_pet_sql_final(); int inter_pet_save(); int inter_pet_delete(int pet_id); diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c index 48f5e04a1..9bb5318c6 100644 --- a/src/char_sql/int_storage.c +++ b/src/char_sql/int_storage.c @@ -166,6 +166,13 @@ int inter_storage_sql_init(){ return 1; } +// storage data finalize +void inter_storage_sql_final() +{ + if (storage_pt) aFree(storage_pt); + if (guild_storage_pt) aFree(guild_storage_pt); + return; +} // q?f[^? int inter_storage_delete(int account_id) { diff --git a/src/char_sql/int_storage.h b/src/char_sql/int_storage.h index f9f37db3e..5541d1ed7 100644 --- a/src/char_sql/int_storage.h +++ b/src/char_sql/int_storage.h @@ -2,6 +2,7 @@ #define _INT_STORAGE_H_ int inter_storage_sql_init(); +void inter_storage_sql_final(); int inter_storage_delete(int account_id); int inter_guild_storage_delete(int guild_id); diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c index a8e0d4f44..13ce0acbe 100644 --- a/src/char_sql/inter.c +++ b/src/char_sql/inter.c @@ -290,12 +290,32 @@ int inter_init(const char *file) inter_pet_sql_init(); inter_accreg_sql_init(); + atexit(inter_final); + //printf ("interserver timer initializing : %d sec...\n",autosave_interval); //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval); return 0; } +// finalize +int wis_db_final (void *k, void *data, va_list ap) { + struct WisData *p = data; + if (p) aFree(p); + return 0; +} +void inter_final() { + numdb_final(wis_db, wis_db_final); + + inter_guild_sql_final(); + inter_storage_sql_final(); + inter_party_sql_final(); + inter_pet_sql_final(); + + if (accreg_pt) aFree(accreg_pt); + return; +} + int inter_mapif_init(int fd) { inter_guild_mapif_init(fd); diff --git a/src/char_sql/inter.h b/src/char_sql/inter.h index 4b61b69c5..1e6a26dce 100644 --- a/src/char_sql/inter.h +++ b/src/char_sql/inter.h @@ -2,10 +2,10 @@ #define _INTER_H_ int inter_init(const char *file); +void inter_final(); int inter_parse_frommap(int fd); int inter_mapif_init(int fd); - int inter_check_length(int fd,int length); int inter_log(char *fmt,...); diff --git a/src/common/core.c b/src/common/core.c index 96d2c872b..03945040a 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -285,6 +285,12 @@ int main(int argc,char **argv) { int next; + display_title(); +#ifdef USE_MEMMGR + // call this first so it'll be finalised last + do_init_memmgr(argv[0]); // 一番最初に実行する必要がある +#endif + sscanf(argv[0], "./%24[^\n]", server_type); // map/char/login? atexit(log_uptime); pid_create(argv[0]); @@ -305,12 +311,6 @@ int main(int argc,char **argv) compat_signal(SIGTRAP, SIG_DFL); #endif - display_title(); - -#ifdef USE_MEMMGR - do_init_memmgr(argv[0]); // 一番最初に実行する必要がある -#endif - tick_ = time(0); ticks = gettick(); diff --git a/src/common/malloc.c b/src/common/malloc.c index 40c9f34bf..703933d01 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -7,9 +7,6 @@ #include "memwatch.h" #endif -// 独自メモリマネージャを使用する場合、次のコメントを外してください。 -// #define USE_MEMMGR - #if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) && !defined(USE_MEMMGR) void* aMalloc_( size_t size, const char *file, int line, const char *func ) @@ -537,6 +534,7 @@ static void memmer_exit(void) { printf("memmgr: no memory leaks found.\n"); } else { printf("memmgr: memory leaks found.\n"); + fclose(fp); } } diff --git a/src/common/malloc.h b/src/common/malloc.h index 45451c9e0..eec138cdd 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -3,6 +3,9 @@ #include +// 独自メモリマネージャを使用する場合、次のコメントを外してください。 +// #define USE_MEMMGR + #if defined(DMALLOC) # include "dmalloc.h" diff --git a/src/common/socket.c b/src/common/socket.c index f49d4c0ca..1c4d5931a 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -943,11 +943,9 @@ void do_final_socket(void) aFree(access_deny); // session[0] のダミーデータを削除 - if (session[0]) { - aFree(session[0]->rdata); - aFree(session[0]->wdata); - aFree(session[0]); - } + aFree(session[0]->rdata); + aFree(session[0]->wdata); + aFree(session[0]); } void do_socket(void) diff --git a/src/common/timer.h b/src/common/timer.h index c43c0e6b0..57036ae01 100644 --- a/src/common/timer.h +++ b/src/common/timer.h @@ -36,11 +36,9 @@ int addtick_timer(int tid,unsigned int tick); struct TimerData *get_timer(int tid); int do_timer(unsigned int tick); +void timer_final(); int add_timer_func_list(int (*)(int,unsigned int,int,int),char*); -void do_final_timer(void); char* search_timer_func_list(int (*)(int,unsigned int,int,int)); -extern void timer_final(); - #endif // _TIMER_H_ diff --git a/src/login/login.c b/src/login/login.c index a54aca410..27f7c12ce 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -3923,11 +3923,12 @@ void do_final(void) { memset(&server[i], 0, sizeof(struct mmo_char_server)); close(fd); delete_session(fd); - if(session[fd]) aFree(session[fd]); } } close(login_fd); delete_session(login_fd); + exit_dbn(); + timer_final(); login_log("----End of login-server (normal end with closing of all files)." RETCODE); diff --git a/src/login_sql/login.c b/src/login_sql/login.c index 91fc9ccb8..071b6d32c 100644 --- a/src/login_sql/login.c +++ b/src/login_sql/login.c @@ -41,30 +41,19 @@ void Gettimeofday(struct timeval *timenow) #include #include #include -#include "malloc.h" //add include for DBMS(mysql) #include -#include "../common/strlib.h" -#include "timer.h" -/* -#include "timer.h" -#include "core.h" -#include "socket.h" -#include "login.h" -#include "mmo.h" -#include "version.h" -#include "db.h" -*/ - #include "../common/core.h" #include "../common/socket.h" -#include "login.h" -#include "../common/mmo.h" -#include "../common/version.h" +#include "../common/malloc.h" #include "../common/db.h" #include "../common/timer.h" +#include "../common/strlib.h" +#include "../common/mmo.h" +#include "../common/version.h" +#include "login.h" #ifdef PASSWORDENC #include "md5calc.h" @@ -1835,6 +1824,24 @@ int flush_timer(int tid, unsigned int tick, int id, int data){ return 0; } +//-------------------------------------- +// Function called at exit of the server +//-------------------------------------- +static int online_db_final(void *key,void *data,va_list ap) +{ + int *p = data; + if (p) aFree(p); + return 0; +} +void do_final(void) { + //sync account when terminating. + //but no need when you using DBMS (mysql) + mmo_db_close(); + numdb_final(online_db, online_db_final); + exit_dbn(); + timer_final(); +} + int do_init(int argc,char **argv){ //initialize login server int i; @@ -1876,9 +1883,7 @@ int do_init(int argc,char **argv){ printf ("Running mmo_auth_sqldb_init()\n"); mmo_auth_sqldb_init(); printf ("finished mmo_auth_sqldb_init()\n"); - //sync account when terminating. - //but no need when you using DBMS (mysql) - set_termfunc(mmo_db_close); + set_termfunc(do_final); //set default parser as parse_login function set_defaultparse(parse_login); diff --git a/src/map/map.c b/src/map/map.c index 60d41b84e..9dcf541c1 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1697,24 +1697,24 @@ int map_addnpc(int m,struct npc_data *nd) { } void map_removenpc(void) { - int i,m,n=0; - - for(m=0;mbl,2); - map_delblock(&map[m].npc[i]->bl); - numdb_erase(id_db,map[m].npc[i]->bl.id); - if(map[m].npc[i]->bl.subtype==SCRIPT) { -// aFree(map[m].npc[i]->u.scr.script); -// aFree(map[m].npc[i]->u.scr.label_list); - } - aFree(map[m].npc[i]); - map[m].npc[i] = NULL; - n++; - } - } - } + int i,m,n=0; + + for(m=0;mbl,2); + map_delblock(&map[m].npc[i]->bl); + numdb_erase(id_db,map[m].npc[i]->bl.id); + if(map[m].npc[i]->bl.subtype==SCRIPT) { + aFree(map[m].npc[i]->u.scr.script); + aFree(map[m].npc[i]->u.scr.label_list); + } + aFree(map[m].npc[i]); + map[m].npc[i] = NULL; + n++; + } + } + } sprintf(tmp_output,"Successfully removed and freed from memory '"CL_WHITE"%d"CL_RESET"' NPCs.\n",n); ShowStatus(tmp_output); @@ -3097,29 +3097,20 @@ int flush_timer(int tid, unsigned int tick, int id, int data){ return 0; } -int id_db_final(void *k,void *d,va_list ap) +int id_db_final(void *k,void *d,va_list ap) { return 0; } +int map_db_final(void *k,void *d,va_list ap) { return 0; } +int nick_db_final(void *k,void *d,va_list ap) { - struct mob_data *id; - nullpo_retr(0, id = (struct mob_data*)d); - if(id->lootitem) - aFree(id->lootitem); - if(id) - aFree(id); + char *p = d; + if (p) aFree(p); return 0; } - -int map_db_final(void *k,void *d,va_list ap) +int charid_db_final(void *k,void *d,va_list ap) { - struct map_data *id; - nullpo_retr(0, id = (struct map_data*)d); - if(id->gat) - aFree(id->gat); - if(id) - aFree(id); + struct charid2nick *p = d; + if (p) aFree(p); return 0; } -int nick_db_final(void *k,void *d,va_list ap){ return 0; } -int charid_db_final(void *k,void *d,va_list ap){ return 0; } int cleanup_sub(struct block_list *bl, va_list ap) { nullpo_retr(0, bl); @@ -3152,12 +3143,12 @@ int cleanup_sub(struct block_list *bl, va_list ap) { *------------------------------------------ */ void do_final(void) { - int map_id, i; + int i; ShowStatus("Terminating...\n"); - for (map_id = 0; map_id < map_num;map_id++) - if(map[map_id].m) - map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, 0, 0); + for (i = 0; i < map_num; i++) + if(map[i].m) + map_foreachinarea(cleanup_sub, i, 0, 0, map[i].xs, map[i].ys, 0, 0); #ifndef TXT_ONLY chrif_char_reset_offline(); @@ -3165,38 +3156,35 @@ void do_final(void) { chrif_flush_fifo(); - for (i = 0; i < fd_max; i++) - delete_session(i); - -#if 0 - map_removenpc(); - -// do_final_timer(); (we used timer_final() instead) - timer_final(); -// numdb_final(id_db, id_db_final); - strdb_final(map_db, map_db_final); - strdb_final(nick_db, nick_db_final); - numdb_final(charid_db, charid_db_final); - +//#if 0 // why is this here? >_> do_final_chrif(); // この内部でキャラを全て切断する + do_final_npc(); +// map_removenpc(); do_final_script(); do_final_itemdb(); do_final_storage(); do_final_guild(); + do_final_party(); + do_final_pc(); do_final_pet(); -/* - for(i=0;ichat_id && (cd=(struct chat_data*)map_id2bl(nd->chat_id))){ + aFree (cd); + cd = NULL; + } + if (nd->bl.subtype == SCRIPT) { + if (nd->u.scr.timer_event) + aFree(nd->u.scr.timer_event); + if (nd->u.scr.src_id==0) { + if(nd->u.scr.script) { + aFree(nd->u.scr.script); + nd->u.scr.script=NULL; + } + if (nd->u.scr.label_list) { + aFree(nd->u.scr.label_list); + nd->u.scr.label_list = NULL; + } + } + } + clif_clearchar_area(&nd->bl, 2); + map_delblock(&nd->bl); + map_deliddb(&nd->bl); + aFree(nd); + nd = NULL; + return 0; +} static int ev_db_final(void *key,void *data,va_list ap) { aFree(data); @@ -2326,6 +2356,30 @@ static int ev_db_final(void *key,void *data,va_list ap) static int npcname_db_final(void *key,void *data,va_list ap) { return 0; +} +/*========================================== + * + *------------------------------------------ + */ +int npc_reload(void) +{ + struct npc_data *nd; + struct block_list *bl; + int i; + + if(ev_db) + strdb_final(ev_db,ev_db_final); + if(npcname_db) + strdb_final(npcname_db,npcname_db_final); + + for (i = START_NPC_NUM; i < npc_id; i++) { + if((bl = map_id2bl(i)) && bl->type == BL_NPC && (nd = (struct npc_data *)bl)) + npc_unload(nd); + } + + return 0; + + } /*========================================== * 終了 @@ -2337,7 +2391,6 @@ int do_final_npc(void) struct block_list *bl; struct npc_data *nd; struct mob_data *md; - struct chat_data *cd; struct pet_data *pd; if(ev_db) @@ -2345,31 +2398,14 @@ int do_final_npc(void) if(npcname_db) strdb_final(npcname_db,npcname_db_final); - for(i=START_NPC_NUM;itype == BL_NPC && (nd = (struct npc_data *)bl)){ - if(nd->chat_id && (cd=(struct chat_data*)map_id2bl(nd->chat_id))){ - aFree(cd); - cd = NULL; - } - if(nd->bl.subtype == SCRIPT){ - if(nd->u.scr.timer_event) - aFree(nd->u.scr.timer_event); - if(nd->u.scr.src_id==0){ - if(nd->u.scr.script){ - aFree(nd->u.scr.script); - nd->u.scr.script=NULL; - } - if(nd->u.scr.label_list){ - aFree(nd->u.scr.label_list); - nd->u.scr.label_list = NULL; - } - } - } - aFree(nd); - nd = NULL; - }else if(bl->type == BL_MOB && (md = (struct mob_data *)bl)){ - if(md->lootitem){ + npc_unload(nd); + }else if (bl->type == BL_MOB && (md = (struct mob_data *)bl)){ + if (md->lootitem){ aFree(md->lootitem); md->lootitem = NULL; } @@ -2415,10 +2451,10 @@ int do_init_npc(void) // comparing only the first 24 chars of labels that are 50 chars long isn't that nice // will cause "duplicated" labels where actually no dup is... //ev_db=strdb_init(24); - ev_db=strdb_init(51); - npcname_db=strdb_init(24); + ev_db = strdb_init(51); + npcname_db = strdb_init(24); - ev_db->release = ev_release; + ev_db->release = ev_release; memset(&ev_tm_b,-1,sizeof(ev_tm_b)); diff --git a/src/map/pc.c b/src/map/pc.c index 07e712dbe..8c0857d4b 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -7234,6 +7234,11 @@ int pc_readdb(void) * pc? 係初期化 *------------------------------------------ */ +void do_final_pc(void) { + if (gm_account) + aFree(gm_account); + return; +} int do_init_pc(void) { pc_readdb(); diff --git a/src/map/pc.h b/src/map/pc.h index 242ae3147..8c4f96529 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -202,6 +202,7 @@ int pc_delspiritball(struct map_session_data *sd,int,int); int pc_eventtimer(int tid,unsigned int tick,int id,int data); // for npc_dequeue int do_init_pc(void); +void do_final_pc(void); enum {ADDITEM_EXIST,ADDITEM_NEW,ADDITEM_OVERAMOUNT}; -- cgit v1.2.3-70-g09d2 From 27c16626a2676237521604c7f852d786317b03f5 Mon Sep 17 00:00:00 2001 From: celest Date: Sun, 27 Mar 2005 10:38:21 +0000 Subject: Some minor changes to do_init_memmgr git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@1308 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/common/core.c | 2 -- src/common/malloc.c | 7 +++---- src/common/malloc.h | 6 +++++- 3 files changed, 8 insertions(+), 7 deletions(-) (limited to 'src/common/malloc.c') diff --git a/src/common/core.c b/src/common/core.c index 03945040a..41b73b219 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -286,10 +286,8 @@ int main(int argc,char **argv) int next; display_title(); -#ifdef USE_MEMMGR // call this first so it'll be finalised last do_init_memmgr(argv[0]); // 一番最初に実行する必要がある -#endif sscanf(argv[0], "./%24[^\n]", server_type); // map/char/login? atexit(log_uptime); diff --git a/src/common/malloc.c b/src/common/malloc.c index 703933d01..747423b47 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -7,6 +7,9 @@ #include "memwatch.h" #endif +// 独自メモリマネージャを使用する場合、次のコメントを外してください。 +// #define USE_MEMMGR + #if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) && !defined(USE_MEMMGR) void* aMalloc_( size_t size, const char *file, int line, const char *func ) @@ -90,10 +93,6 @@ void aFree_( void *p, const char *file, int line, const char *func ) #endif } -int do_init_memmgr(const char* file) { - return 0; -} - #elif defined(GCOLLECT) void * _bcallocA(size_t size, size_t cnt) { diff --git a/src/common/malloc.h b/src/common/malloc.h index eec138cdd..c59c08a4e 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -75,6 +75,10 @@ #endif -int do_init_memmgr(const char* file); +#ifndef USE_MEMMGR + #define do_init_memmgr(file) +#else + int do_init_memmgr(const char* file); +#endif #endif -- cgit v1.2.3-70-g09d2 From c1a8f6f0ac98a694e670bae4c8f74db126e0e8e8 Mon Sep 17 00:00:00 2001 From: amber Date: Tue, 29 Mar 2005 06:18:21 +0000 Subject: Fixe compile time problems with our mixed C++/C conformance git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@1328 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-SVN.txt | 2 + src/char_sql/char.c | 7 ++-- src/char_sql/char.h | 2 +- src/char_sql/int_guild.c | 6 +-- src/char_sql/inter.c | 2 +- src/common/db.h | 10 +++-- src/common/malloc.c | 6 +-- src/common/malloc.h | 2 +- src/common/socket.c | 6 +-- src/common/timer.c | 14 +++---- src/login_sql/login.c | 2 +- src/map/clif.c | 4 +- src/map/itemdb.c | 8 ++-- src/map/map.c | 6 +-- src/map/npc.c | 2 +- src/map/pc.c | 2 +- src/map/script.c | 54 ++++++++++++------------- src/txt-converter/char/char-converter.c | 72 ++++++++++++++++----------------- src/txt-converter/common/mmo.h | 4 +- 19 files changed, 108 insertions(+), 103 deletions(-) (limited to 'src/common/malloc.c') diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt index 7f32d47cb..d20b19142 100644 --- a/Changelog-SVN.txt +++ b/Changelog-SVN.txt @@ -1,6 +1,8 @@ Date Added 03/29 + * Fixed a lot of compile time problems with our mixed C++/C + conformance [1328: MouseJstr] * Fixed use of storage variable to conform to ANSI C spec [1327: MouseJstr] * Added CIA-bot to the #athena channel [MouseJstr] diff --git a/src/char_sql/char.c b/src/char_sql/char.c index ab20b893b..75bf663d0 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -67,6 +67,7 @@ char party_db[256] = "party"; char pet_db[256] = "pet"; char login_db[256] = "login"; char friend_db[256] = "friends"; +int db_use_sqldbs; char login_db_account_id[32] = "account_id"; char login_db_level[32] = "level"; @@ -3138,7 +3139,7 @@ int char_lan_config_read(const char *lancfgName){ static int char_db_final(void *key,void *data,va_list ap) { - struct mmo_charstatus *p = data; + struct mmo_charstatus *p = (struct mmo_charstatus *) data; if (p) aFree(p); return 0; } @@ -3280,8 +3281,8 @@ int char_config_read(const char *cfgName) { if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2) continue; - remove_control_chars(w1); - remove_control_chars(w2); + remove_control_chars((unsigned char *) w1); + remove_control_chars((unsigned char *) w2); if (strcmpi(w1, "userid") == 0) { memcpy(userid, w2, 24); } else if (strcmpi(w1, "passwd") == 0) { diff --git a/src/char_sql/char.h b/src/char_sql/char.h index 74bb28cf1..ddd873374 100644 --- a/src/char_sql/char.h +++ b/src/char_sql/char.h @@ -71,7 +71,7 @@ extern char guild_storage_db[256]; extern char party_db[256]; extern char pet_db[256]; -int db_use_sqldbs; // added for sql item_db read for char server [Valaris] +extern int db_use_sqldbs; // added for sql item_db read for char server [Valaris] extern char login_db_level[32]; extern char login_db_account_id[32]; diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c index b5d20590a..5ec700a54 100644 --- a/src/char_sql/int_guild.c +++ b/src/char_sql/int_guild.c @@ -532,7 +532,7 @@ int inter_guildcastle_tosql(struct guild_castle *gc) return 0; } //printf("[Guild Castle %02i]: Save...\n",gc->castle_id); - gcopy = numdb_search(castle_db_,gc->castle_id); + gcopy = (struct guild_castle *) numdb_search(castle_db_,gc->castle_id); if (gcopy == NULL) { gcopy = (struct guild_castle *) aMalloc(sizeof(struct guild_castle)); numdb_insert(castle_db_, gc->castle_id, gcopy); @@ -714,13 +714,13 @@ int guild_infoevent_db_final (void *k, void *data, va_list ap) { return 0; } int guild_castleinfoevent_db_final (void *k, void *data, va_list ap) { return 0; } int guild_db_final (void *k, void *data, va_list ap) { - struct guild *g = data; + struct guild *g = (struct guild *) data; if (g) aFree(g); return 0; } int castle_db_final (void *k, void *data, va_list ap) { - struct guild_castle *gc = data; + struct guild_castle *gc = (struct guild_castle *) data; if (gc) aFree(gc); return 0; } diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c index 13ce0acbe..1a2a2d751 100644 --- a/src/char_sql/inter.c +++ b/src/char_sql/inter.c @@ -300,7 +300,7 @@ int inter_init(const char *file) // finalize int wis_db_final (void *k, void *data, va_list ap) { - struct WisData *p = data; + struct WisData *p = (struct WisData *) data; if (p) aFree(p); return 0; } diff --git a/src/common/db.h b/src/common/db.h index 8b37e15ad..6980099cf 100644 --- a/src/common/db.h +++ b/src/common/db.h @@ -18,6 +18,11 @@ struct dbn { struct dbn *prev; }; +struct db_free { + struct dbn *z; + struct dbn **root; +}; + struct dbt { int (*cmp)(struct dbt*,void*,void*); unsigned int (*hash)(struct dbt*,void*); @@ -30,10 +35,7 @@ struct dbt { int alloc_line; // DB?s // db_foreach 内部でdb_erase される対策として、 // db_foreach が終わるまでロックすることにする - struct db_free { - struct dbn *z; - struct dbn **root; - } *free_list; + struct db_free *free_list; int free_count; int free_max; int free_lock; diff --git a/src/common/malloc.c b/src/common/malloc.c index 747423b47..b562ca3c0 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -65,15 +65,15 @@ void* aRealloc_( void *p, size_t size, const char *file, int line, const char *f return ret; } -void* aStrdup_( const void *p, const char *file, int line, const char *func ) +char* aStrdup_( const void *p, const char *file, int line, const char *func ) { - void *ret; + char *ret; // printf("%s:%d: in func %s: strdup %p\n",file,line,func,p); #ifdef MEMWATCH ret=mwStrdup(p,file,line); #else - ret=strdup(p); + ret= strdup((char *) p); #endif if(ret==NULL){ printf("%s:%d: in func %s: strdup error out of memory!\n",file,line,func); diff --git a/src/common/malloc.h b/src/common/malloc.h index c59c08a4e..1bc0eb292 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -63,7 +63,7 @@ void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func ); void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func ); void aFree_( void *p, const char *file, int line, const char *func ); - void* aStrdup_( const void *p, const char *file, int line, const char *func ); + char* aStrdup_( const void *p, const char *file, int line, const char *func ); # define aMalloc(n) aMalloc_(n,ALC_MARK) # define aMallocA(n) aMalloc_(n,ALC_MARK) diff --git a/src/common/socket.c b/src/common/socket.c index 1c4d5931a..70432eddf 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -678,7 +678,7 @@ static int connect_check_(unsigned int ip) { hist = hist->next; } // IPリストに無いので新規作成 - hist_new = aCalloc(1,sizeof(struct _connect_history)); + hist_new = (struct _connect_history *) aCalloc(1,sizeof(struct _connect_history)); hist_new->ip = ip; hist_new->tick = gettick(); if(connect_history[ip & 0xFFFF] != NULL) { @@ -791,12 +791,12 @@ int socket_config_read(const char *cfgName) { if(strcmpi(w2,"allow,deny")==0) access_order=ACO_ALLOW_DENY; if(strcmpi(w2,"mutual-failure")==0) access_order=ACO_MUTUAL_FAILTURE; } else if(strcmpi(w1,"allow")==0){ - access_allow = aRealloc(access_allow,(access_allownum+1)*sizeof(struct _access_control)); + access_allow = (struct _access_control *) aRealloc(access_allow,(access_allownum+1)*sizeof(struct _access_control)); if(access_ipmask(w2,&access_allow[access_allownum])) { access_allownum++; } } else if(strcmpi(w1,"deny")==0){ - access_deny = aRealloc(access_deny,(access_denynum+1)*sizeof(struct _access_control)); + access_deny = (struct _access_control *) aRealloc(access_deny,(access_denynum+1)*sizeof(struct _access_control)); if(access_ipmask(w2,&access_deny[access_denynum])) { access_denynum++; } diff --git a/src/common/timer.c b/src/common/timer.c index 6bf5cdbda..6a740d47a 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -54,9 +54,9 @@ int add_timer_func_list(int (*func)(int,unsigned int,int,int), char* name) { struct timer_func_list* tfl; //CALLOC(tfl, struct timer_func_list, 1); - tfl = aCalloc( sizeof(struct timer_func_list) , 1); + tfl = (struct timer_func_list*) aCalloc( sizeof(struct timer_func_list) , 1); //MALLOC(tfl->name, char, strlen(name) + 1); - tfl->name = aMalloc( strlen(name) + 1 ); + tfl->name = (char *) aMalloc( strlen(name) + 1 ); tfl->next = tfl_root; tfl->func = func; @@ -112,11 +112,11 @@ static void push_timer_heap(int index) { if (timer_heap_max == 0) { timer_heap_max = 256; //CALLOC(timer_heap, int, 256); - timer_heap = aCalloc( sizeof(int) , 256); + timer_heap = (int *) aCalloc( sizeof(int) , 256); } else { timer_heap_max += 256; //REALLOC(timer_heap, int, timer_heap_max); - timer_heap = aRealloc( timer_heap, sizeof(int) * timer_heap_max); + timer_heap = (int *) aRealloc( timer_heap, sizeof(int) * timer_heap_max); memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256); } } @@ -178,11 +178,11 @@ int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int if (timer_data_max == 0) { timer_data_max = 256; //CALLOC(timer_data, struct TimerData, timer_data_max); - timer_data = aCalloc( sizeof(struct TimerData) , timer_data_max); + timer_data = (struct TimerData*) aCalloc( sizeof(struct TimerData) , timer_data_max); } else { timer_data_max += 256; //REALLOC(timer_data, struct TimerData, timer_data_max); - timer_data = aRealloc( timer_data, sizeof(struct TimerData) * timer_data_max); + timer_data = (struct TimerData *) aRealloc( timer_data, sizeof(struct TimerData) * timer_data_max); memset(timer_data + (timer_data_max - 256), 0, sizeof(struct TimerData) * 256); } } @@ -267,7 +267,7 @@ int do_timer(unsigned int tick) { if (free_timer_list_pos >= free_timer_list_max) { free_timer_list_max += 256; //REALLOC(free_timer_list, int, free_timer_list_max); - free_timer_list = aRealloc(free_timer_list, sizeof(int) * free_timer_list_max); + free_timer_list = (int *) aRealloc(free_timer_list, sizeof(int) * free_timer_list_max); memset(free_timer_list + (free_timer_list_max - 256), 0, 256 * sizeof(int)); } free_timer_list[free_timer_list_pos++] = i; diff --git a/src/login_sql/login.c b/src/login_sql/login.c index 071b6d32c..85f08391d 100644 --- a/src/login_sql/login.c +++ b/src/login_sql/login.c @@ -1829,7 +1829,7 @@ int flush_timer(int tid, unsigned int tick, int id, int data){ //-------------------------------------- static int online_db_final(void *key,void *data,va_list ap) { - int *p = data; + int *p = (int *) data; if (p) aFree(p); return 0; } diff --git a/src/map/clif.c b/src/map/clif.c index 9e649df40..7ebf11b8a 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -4778,8 +4778,8 @@ void clif_GlobalMessage(struct block_list *bl,char *message) WBUFW(buf,0)=cmd; WBUFW(buf,2)=len+8; WBUFL(buf,4)=bl->id; - strncpy(WBUFP(buf,8),message,len); - clif_send(buf,WBUFW(buf,2),bl,AREA_CHAT_WOC); + strncpy((char *) WBUFP(buf,8),message,len); + clif_send((unsigned char *) buf,WBUFW(buf,2),bl,AREA_CHAT_WOC); } /*========================================== diff --git a/src/map/itemdb.c b/src/map/itemdb.c index c37274cb9..d575e8a77 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -851,10 +851,10 @@ static int itemdb_read_sqldb(void) if (sql_row[17] != NULL) { if (sql_row[17][0] == '{') - id->use_script = parse_script(sql_row[17], 0); + id->use_script = parse_script((unsigned char *) sql_row[17], 0); else { sprintf(script, "{%s}", sql_row[17]); - id->use_script = parse_script(script, 0); + id->use_script = parse_script((unsigned char *) script, 0); } } else @@ -865,10 +865,10 @@ static int itemdb_read_sqldb(void) if (sql_row[18] != NULL) { if (sql_row[18][0] == '{') - id->equip_script = parse_script(sql_row[18], 0); + id->equip_script = parse_script((unsigned char *) sql_row[18], 0); else { sprintf(script, "{%s}", sql_row[18]); - id->equip_script = parse_script(script, 0); + id->equip_script = parse_script((unsigned char *) script, 0); } } else diff --git a/src/map/map.c b/src/map/map.c index db2831cf5..19edfd08b 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -2012,7 +2012,7 @@ int map_eraseipport(char *name,unsigned long ip,int port) struct map_data_other_server *mdos; // unsigned char *p=(unsigned char *)&ip; - md=strdb_search(map_db,name); + md=(struct map_data *) strdb_search(map_db,name); if(md){ if(md->gat) // local -> check data return 0; @@ -3119,13 +3119,13 @@ int id_db_final(void *k,void *d,va_list ap) { return 0; } int map_db_final(void *k,void *d,va_list ap) { return 0; } int nick_db_final(void *k,void *d,va_list ap) { - char *p = d; + char *p = (char *) d; if (p) aFree(p); return 0; } int charid_db_final(void *k,void *d,va_list ap) { - struct charid2nick *p = d; + struct charid2nick *p = (struct charid2nick *) d; if (p) aFree(p); return 0; } diff --git a/src/map/npc.c b/src/map/npc.c index 6e22c69b3..95893ad11 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -875,7 +875,7 @@ int npc_checknear(struct map_session_data *sd,int id) */ int npc_globalmessage(const char *name,char *mes) { - struct npc_data *nd=strdb_search(npcname_db,name); + struct npc_data *nd=(struct npc_data *) strdb_search(npcname_db,name); char temp[100]; char ntemp[50]; char *ltemp; diff --git a/src/map/pc.c b/src/map/pc.c index c9b8755de..8b3a32c6f 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -6994,7 +6994,7 @@ int pc_read_gm_account(int fd) } lsql_res = mysql_store_result(&lmysql_handle); if (lsql_res) { - gm_account = aCallocA(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1); + gm_account = (struct gm_account *) aCallocA(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1); while ((lsql_row = mysql_fetch_row(lsql_res))) { gm_account[GM_num].account_id = atoi(lsql_row[0]); gm_account[GM_num].level = atoi(lsql_row[1]); diff --git a/src/map/script.c b/src/map/script.c index d7d5f433e..c39afc8f6 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -62,7 +62,7 @@ static struct str_data_struct { int str; int backpatch; int label; - int (*func)(); + int (*func)(script_state *); int val; int next; } *str_data; @@ -1190,7 +1190,7 @@ static void read_constdb(void) sscanf(line,"%[A-Za-z0-9_] %d %d",name,&val,&type)>=2){ for(i=0;name[i];i++) name[i]=tolower(name[i]); - n=add_str(name); + n=add_str((const unsigned char *) name); if(type==0) str_data[n].type=C_INT; else @@ -1281,7 +1281,7 @@ char* parse_script(unsigned char *src,int line) add_scriptc(C_NOP); script_size = script_pos; - script_buf=(char *)aRealloc(script_buf,script_pos + 1); + script_buf=(unsigned char *)aRealloc(script_buf,script_pos + 1); // 未解決のラベルを解決 for(i=LABEL_START;i %d\n",type,str,stack->sp); stack->stack_data[stack->sp].type=type; - stack->stack_data[stack->sp].u.str=str; + stack->stack_data[stack->sp].u.str=(char *) str; stack->sp++; } @@ -1537,10 +1537,10 @@ void push_copy(struct script_stack *stack,int pos) { switch(stack->stack_data[pos].type){ case C_CONSTSTR: - push_str(stack,C_CONSTSTR,stack->stack_data[pos].u.str); + push_str(stack,C_CONSTSTR,(unsigned char *) stack->stack_data[pos].u.str); break; case C_STR: - push_str(stack,C_STR,aStrdup(stack->stack_data[pos].u.str)); + push_str(stack,C_STR,(unsigned char *) aStrdup(stack->stack_data[pos].u.str)); break; default: push_val(stack,stack->stack_data[pos].type,stack->stack_data[pos].u.num); @@ -1609,7 +1609,7 @@ int buildin_callfunc(struct script_state *st) char *scr; char *str=conv_str(st,& (st->stack->stack_data[st->start+2])); - if( (scr=strdb_search(script_get_userfunc_db(),str)) ){ + if( (scr=(char *) strdb_search(script_get_userfunc_db(),str)) ){ int i,j; for(i=st->start+3,j=0;iend;i++,j++) push_copy(st->stack,i); @@ -1748,8 +1748,8 @@ int buildin_menu(struct script_state *st) st->state=END; } else { // goto動作 // ragemu互換のため - pc_setreg(sd,add_str("l15"),sd->npc_menu); - pc_setreg(sd,add_str("@menu"),sd->npc_menu); + pc_setreg(sd,add_str((unsigned char *) "l15"),sd->npc_menu); + pc_setreg(sd,add_str((unsigned char *) "@menu"),sd->npc_menu); sd->state.menu_or_input=0; if(sd->npc_menu>0 && sd->npc_menu<(st->end-st->start)/2){ int pos; @@ -1930,7 +1930,7 @@ int buildin_input(struct script_state *st) { struct map_session_data *sd=NULL; int num=(st->end>st->start+2)?st->stack->stack_data[st->start+2].u.num:0; - char *name=(st->end>st->start+2)?str_buf+str_data[num&0x00ffffff].str:""; + char *name=(char *) ((st->end>st->start+2)?str_buf+str_data[num&0x00ffffff].str:""); // char prefix=*name; char postfix=name[strlen(name)-1]; @@ -1961,7 +1961,7 @@ int buildin_input(struct script_state *st) set_reg(sd,num,name,(void*)sd->npc_amount); } else { // ragemu互換のため - pc_setreg(sd,add_str("l14"),sd->npc_amount); + pc_setreg(sd,add_str((unsigned char *) "l14"),sd->npc_amount); } } } else { @@ -2186,7 +2186,7 @@ int buildin_deletearray(struct script_state *st) } for(;i<(128-(num>>24));i++){ if( postfix!='$' ) set_reg(sd,num+(i<<24),name, 0); - if( postfix=='$' ) set_reg(sd,num+(i<<24),name, ""); + if( postfix=='$' ) set_reg(sd,num+(i<<24),name, (void *) ""); } return 0; } @@ -2704,9 +2704,9 @@ int buildin_getpartyname(struct script_state *st) party_id=conv_num(st,& (st->stack->stack_data[st->start+2])); name=buildin_getpartyname_sub(party_id); if(name!=0) - push_str(st->stack,C_STR,name); + push_str(st->stack,C_STR,(unsigned char *)name); else - push_str(st->stack,C_CONSTSTR,"null"); + push_str(st->stack,C_CONSTSTR, (unsigned char *) "null"); return 0; } @@ -2726,12 +2726,12 @@ int buildin_getpartymember(struct script_state *st) for(i=0;imember[i].account_id){ // printf("name:%s %d\n",p->member[i].name,i); - mapreg_setregstr(add_str("$@partymembername$")+(i<<24),p->member[i].name); + mapreg_setregstr(add_str((unsigned char *) "$@partymembername$")+(i<<24),p->member[i].name); j++; } } } - mapreg_setreg(add_str("$@partymembercount"),j); + mapreg_setreg(add_str((unsigned char *) "$@partymembercount"),j); return 0; } @@ -2758,9 +2758,9 @@ int buildin_getguildname(struct script_state *st) int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); name=buildin_getguildname_sub(guild_id); if(name!=0) - push_str(st->stack,C_STR,name); + push_str(st->stack,C_STR,(unsigned char *) name); else - push_str(st->stack,C_CONSTSTR,"null"); + push_str(st->stack,C_CONSTSTR,(unsigned char *) "null"); return 0; } @@ -2788,9 +2788,9 @@ int buildin_getguildmaster(struct script_state *st) int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); master=buildin_getguildmaster_sub(guild_id); if(master!=0) - push_str(st->stack,C_STR,master); + push_str(st->stack,C_STR,(unsigned char *) master); else - push_str(st->stack,C_CONSTSTR,"null"); + push_str(st->stack,C_CONSTSTR,(unsigned char *) "null"); return 0; } @@ -2827,23 +2827,23 @@ int buildin_strcharinfo(struct script_state *st) char *buf; buf=(char *)aCallocA(24,sizeof(char)); strncpy(buf,sd->status.name, 23); - push_str(st->stack,C_STR,buf); + push_str(st->stack,C_STR,(unsigned char *) buf); } if(num==1){ char *buf; buf=buildin_getpartyname_sub(sd->status.party_id); if(buf!=0) - push_str(st->stack,C_STR,buf); + push_str(st->stack,C_STR,(unsigned char *) buf); else - push_str(st->stack,C_CONSTSTR,""); + push_str(st->stack,C_CONSTSTR,(unsigned char *) ""); } if(num==2){ char *buf; buf=buildin_getguildname_sub(sd->status.guild_id); if(buf!=0) - push_str(st->stack,C_STR,buf); + push_str(st->stack,C_STR,(unsigned char *) buf); else - push_str(st->stack,C_CONSTSTR,""); + push_str(st->stack,C_CONSTSTR,(unsigned char *) ""); } return 0; diff --git a/src/txt-converter/char/char-converter.c b/src/txt-converter/char/char-converter.c index 30782412c..217bf2b15 100644 --- a/src/txt-converter/char/char-converter.c +++ b/src/txt-converter/char/char-converter.c @@ -39,7 +39,7 @@ char db_server_id[32] = "ragnarok"; char db_server_pw[32] = "ragnarok"; char db_server_logindb[32] = "ragnarok"; -struct storage *storage=NULL; +struct storage *storage_=NULL; struct mmo_map_server server[MAX_MAP_SERVERS]; int server_fd[MAX_MAP_SERVERS]; @@ -182,13 +182,13 @@ int storage_tosql(int account_id,struct storage *p){ //printf ("all storage item was deleted ok\n"); for(i=0;istorage[i].nameid , p->storage[i].amount); + //printf ("save storage num: %d (%d:%d)\n",i, p->storage_[i].nameid , p->storage_[i].amount); - if( (p->storage[i].nameid) && (p->storage[i].amount) ){ + if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){ sprintf(tmp_sql,"INSERT INTO `storage` (`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - p->account_id, p->storage[i].nameid, p->storage[i].amount, p->storage[i].equip, - p->storage[i].identify, p->storage[i].refine, p->storage[i].attribute, - p->storage[i].card[0], p->storage[i].card[1], p->storage[i].card[2], p->storage[i].card[3], p->storage[i].broken ); + p->account_id, p->storage_[i].nameid, p->storage_[i].amount, p->storage_[i].equip, + p->storage_[i].identify, p->storage_[i].refine, p->storage_[i].attribute, + p->storage_[i].card[0], p->storage_[i].card[1], p->storage_[i].card[2], p->storage_[i].card[3], p->storage_[i].broken ); //printf ("%s\n",tmp_sql); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); @@ -219,18 +219,18 @@ int storage_fromstr(char *str, struct storage *p) &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) { - p->storage[i].id = tmp_int[0]; - p->storage[i].nameid = tmp_int[1]; - p->storage[i].amount = tmp_int[2]; - p->storage[i].equip = tmp_int[3]; - p->storage[i].identify = tmp_int[4]; - p->storage[i].refine = tmp_int[5]; - p->storage[i].attribute = tmp_int[6]; - p->storage[i].card[0] = tmp_int[7]; - p->storage[i].card[1] = tmp_int[8]; - p->storage[i].card[2] = tmp_int[9]; - p->storage[i].card[3] = tmp_int[10]; - p->storage[i].broken = tmp_int[11]; + p->storage_[i].id = tmp_int[0]; + p->storage_[i].nameid = tmp_int[1]; + p->storage_[i].amount = tmp_int[2]; + p->storage_[i].equip = tmp_int[3]; + p->storage_[i].identify = tmp_int[4]; + p->storage_[i].refine = tmp_int[5]; + p->storage_[i].attribute = tmp_int[6]; + p->storage_[i].card[0] = tmp_int[7]; + p->storage_[i].card[1] = tmp_int[8]; + p->storage_[i].card[2] = tmp_int[9]; + p->storage_[i].card[3] = tmp_int[10]; + p->storage_[i].broken = tmp_int[11]; next += len; if (str[next] == ' ') next++; @@ -240,18 +240,18 @@ int storage_fromstr(char *str, struct storage *p) &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - p->storage[i].id = tmp_int[0]; - p->storage[i].nameid = tmp_int[1]; - p->storage[i].amount = tmp_int[2]; - p->storage[i].equip = tmp_int[3]; - p->storage[i].identify = tmp_int[4]; - p->storage[i].refine = tmp_int[5]; - p->storage[i].attribute = tmp_int[6]; - p->storage[i].card[0] = tmp_int[7]; - p->storage[i].card[1] = tmp_int[8]; - p->storage[i].card[2] = tmp_int[9]; - p->storage[i].card[3] = tmp_int[10]; - p->storage[i].broken = 0; + p->storage_[i].id = tmp_int[0]; + p->storage_[i].nameid = tmp_int[1]; + p->storage_[i].amount = tmp_int[2]; + p->storage_[i].equip = tmp_int[3]; + p->storage_[i].identify = tmp_int[4]; + p->storage_[i].refine = tmp_int[5]; + p->storage_[i].attribute = tmp_int[6]; + p->storage_[i].card[0] = tmp_int[7]; + p->storage_[i].card[1] = tmp_int[8]; + p->storage_[i].card[2] = tmp_int[9]; + p->storage_[i].card[3] = tmp_int[10]; + p->storage_[i].broken = 0; next += len; if (str[next] == ' ') next++; @@ -705,14 +705,14 @@ int mmo_char_init(void){ set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]); if(set==2) { if(i==0){ - storage = (struct storage*)malloc(sizeof(struct storage)); + storage_ = (struct storage*)malloc(sizeof(struct storage)); }else{ - storage = (struct storage*)realloc(storage,sizeof(struct storage)*(i+1)); + storage_ = (struct storage*)realloc(storage_,sizeof(struct storage)*(i+1)); } - memset(&storage[i],0,sizeof(struct storage)); - storage[i].account_id=tmp_int[0]; - storage_fromstr(line,&storage[i]); - storage_tosql(tmp_int[0],&storage[i]); //to sql. (dump) + memset(&storage_[i],0,sizeof(struct storage)); + storage_[i].account_id=tmp_int[0]; + storage_fromstr(line,&storage_[i]); + storage_tosql(tmp_int[0],&storage_[i]); //to sql. (dump) i++; } } diff --git a/src/txt-converter/common/mmo.h b/src/txt-converter/common/mmo.h index e8ef2b987..28462e99d 100644 --- a/src/txt-converter/common/mmo.h +++ b/src/txt-converter/common/mmo.h @@ -135,14 +135,14 @@ struct storage { int account_id; short storage_status; short storage_amount; - struct item storage[MAX_STORAGE]; + struct item storage_[MAX_STORAGE]; }; struct guild_storage { int guild_id; short storage_status; short storage_amount; - struct item storage[MAX_GUILD_STORAGE]; + struct item storage_[MAX_GUILD_STORAGE]; }; struct map_session_data; -- cgit v1.2.3-70-g09d2 From be2871f1e62bbb88c7fd413456d1b9c39d1f2fd9 Mon Sep 17 00:00:00 2001 From: celest Date: Thu, 7 Apr 2005 14:52:15 +0000 Subject: some small USE_MEMMGR changes git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@1428 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/common/malloc.c | 25 +++++++++++++------------ src/common/malloc.h | 9 +-------- 2 files changed, 14 insertions(+), 20 deletions(-) (limited to 'src/common/malloc.c') diff --git a/src/common/malloc.c b/src/common/malloc.c index b562ca3c0..b81c25ed5 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -8,7 +8,7 @@ #endif // 独自メモリマネージャを使用する場合、次のコメントを外してください。 -// #define USE_MEMMGR +//#define USE_MEMMGR #if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) && !defined(USE_MEMMGR) @@ -314,14 +314,14 @@ void* aRealloc_(void *memblock, size_t size, const char *file, int line, const c } } -void* aStrdup_(const void* string, const char *file, int line, const char *func ) { - if(string == NULL) { +char* aStrdup_(const void *p, const char *file, int line, const char *func ) { + if(p == NULL) { return NULL; } else { - int len = strlen(string); - char *p = (char *)aMalloc_(len + 1,file,line,func); - memcpy(p,string,len+1); - return p; + int len = strlen(p); + char *string = (char *)aMalloc_(len + 1,file,line,func); + memcpy(string,p,len+1); + return string; } } @@ -536,12 +536,13 @@ static void memmer_exit(void) { fclose(fp); } } +#endif int do_init_memmgr(const char* file) { - sprintf(memmer_logfile,"%s.log",file); - atexit(memmer_exit); - printf("memmgr: initialised: %s\n",memmer_logfile); + #ifdef USE_MEMMGR + sprintf(memmer_logfile,"%s.log",file); + atexit(memmer_exit); + printf("memmgr: initialised: %s\n",memmer_logfile); + #endif return 0; } - -#endif diff --git a/src/common/malloc.h b/src/common/malloc.h index 1bc0eb292..c233adb8d 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -3,9 +3,6 @@ #include -// 独自メモリマネージャを使用する場合、次のコメントを外してください。 -// #define USE_MEMMGR - #if defined(DMALLOC) # include "dmalloc.h" @@ -75,10 +72,6 @@ #endif -#ifndef USE_MEMMGR - #define do_init_memmgr(file) -#else - int do_init_memmgr(const char* file); -#endif +int do_init_memmgr(const char* file); #endif -- cgit v1.2.3-70-g09d2