diff options
Diffstat (limited to 'src')
70 files changed, 4221 insertions, 3565 deletions
diff --git a/src/char/HPMchar.h b/src/char/HPMchar.h index 594bb7f00..e3e000ef3 100644 --- a/src/char/HPMchar.h +++ b/src/char/HPMchar.h @@ -22,4 +22,3 @@ void HPM_char_do_final(void); void HPM_char_do_init(void); #endif /* CHAR_HPMCHAR_H */ - diff --git a/src/char/char.c b/src/char/char.c index 819cd2ef8..3cc8853a4 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -140,7 +140,11 @@ struct fame_list chemist_fame_list[MAX_FAME_LIST]; struct fame_list taekwon_fame_list[MAX_FAME_LIST]; // Initial position (it's possible to set it in conf file) -struct point start_point = { 0, 53, 111 }; +#ifdef RENEWAL + struct point start_point = { 0, 97, 90 }; +#else + struct point start_point = { 0, 53, 111 }; +#endif unsigned short skillid2idx[MAX_SKILL_ID]; @@ -2410,7 +2414,7 @@ void char_changesex(int account_id, int sex) * Performs the necessary operations when changing a character's sex, such as * correcting the job class and unequipping items, and propagating the * information to the guild data. - * + * * @param sex The new sex (SEX_MALE or SEX_FEMALE). * @param acc The character's account ID. * @param char_id The character ID. @@ -2479,7 +2483,7 @@ int char_parse_fromlogin_changesex_reply(int fd) SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &char_id, 0, NULL, NULL); SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &class_, 0, NULL, NULL); SQL->StmtBindColumn(stmt, 2, SQLDT_INT, &guild_id, 0, NULL, NULL); - + for (i = 0; i < MAX_CHARS && SQL_SUCCESS == SQL->StmtNextRow(stmt); ++i) { char_change_sex_sub(sex, acc, char_id, class_, guild_id); } @@ -3451,7 +3455,7 @@ void char_ask_name_ack(int fd, int acc, const char* name, int type, int result) * Changes a character's sex. * The information is updated on database, and the character is kicked if it * currently is online. - * + * * @param char_id The character's ID. * @param sex The new sex. * @retval 0 in case of success. @@ -3475,7 +3479,7 @@ int char_changecharsex(int char_id, int sex) SQL->GetData(inter->sql_handle, 1, &data, NULL); class_ = atoi(data); SQL->GetData(inter->sql_handle, 2, &data, NULL); guild_id = atoi(data); SQL->FreeResult(inter->sql_handle); - + if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `sex` = '%c' WHERE `char_id` = '%d'", char_db, sex == SEX_MALE ? 'M' : 'F', char_id)) { Sql_ShowDebug(inter->sql_handle); return 1; @@ -5639,17 +5643,33 @@ int char_config_read(const char* cfgName) autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; } else if (strcmpi(w1, "save_log") == 0) { save_log = config_switch(w2); - } else if (strcmpi(w1, "start_point") == 0) { - char map[MAP_NAME_LENGTH_EXT]; - int x, y; - if (sscanf(w2, "%15[^,],%d,%d", map, &x, &y) < 3) - continue; - start_point.map = mapindex->name2id(map); - if (!start_point.map) - ShowError("Specified start_point %s not found in map-index cache.\n", map); - start_point.x = x; - start_point.y = y; - } else if (strcmpi(w1, "start_items") == 0) { + } + #ifdef RENEWAL + else if (strcmpi(w1, "start_point") == 0) { + char map[MAP_NAME_LENGTH_EXT]; + int x, y; + if (sscanf(w2, "%15[^,],%d,%d", map, &x, &y) < 3) + continue; + start_point.map = mapindex->name2id(map); + if (!start_point.map) + ShowError("Specified start_point %s not found in map-index cache.\n", map); + start_point.x = x; + start_point.y = y; + } + #else + else if (strcmpi(w1, "start_point_pre") == 0) { + char map[MAP_NAME_LENGTH_EXT]; + int x, y; + if (sscanf(w2, "%15[^,],%d,%d", map, &x, &y) < 3) + continue; + start_point.map = mapindex->name2id(map); + if (!start_point.map) + ShowError("Specified start_point_pre %s not found in map-index cache.\n", map); + start_point.x = x; + start_point.y = y; + } + #endif + else if (strcmpi(w1, "start_items") == 0) { int i; char *split; @@ -5876,7 +5896,12 @@ int do_init(int argc, char **argv) { //Read map indexes mapindex->init(); - start_point.map = mapindex->name2id("new_zone01"); + + #ifdef RENEWAL + start_point.map = mapindex->name2id("iz_int"); + #else + start_point.map = mapindex->name2id("new_1-1"); + #endif cmdline->exec(argc, argv, CMDLINE_OPT_NORMAL); chr->config_read(chr->CHAR_CONF_NAME); diff --git a/src/char/int_quest.h b/src/char/int_quest.h index c2393d103..442995826 100644 --- a/src/char/int_quest.h +++ b/src/char/int_quest.h @@ -20,4 +20,3 @@ void inter_quest_defaults(void); HPShared struct inter_quest_interface *inter_quest; #endif /* CHAR_INT_QUEST_H */ - diff --git a/src/char/inter.c b/src/char/inter.c index 548b24ee8..65048a9f9 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -953,7 +953,7 @@ int mapif_wis_message(struct WisData *wd) wd->len = 0; if (wd->len >= sizeof(wd->msg) - 1) wd->len = sizeof(wd->msg) - 1; - + WBUFW(buf, 0) = 0x3801; WBUFW(buf, 2) = 56 +wd->len; WBUFL(buf, 4) = wd->id; diff --git a/src/common/HPM.c b/src/common/HPM.c index a78f03daa..23265fa24 100644 --- a/src/common/HPM.c +++ b/src/common/HPM.c @@ -477,31 +477,32 @@ struct hplugin *hplugin_load(const char* filename) { return plugin; } -void hplugin_unload(struct hplugin* plugin) { - unsigned int i = plugin->idx; - - if( plugin->filename ) +void hplugin_unload(struct hplugin* plugin) +{ + if (plugin->filename) aFree(plugin->filename); - if( plugin->dll ) + if (plugin->dll) plugin_close(plugin->dll); /* TODO: for manual packet unload */ /* - Go through known packets and unlink any belonging to the plugin being removed */ - aFree(plugin); if (!HPM->off) { - int cursor = 0; - HPM->plugins[i] = NULL; - for(i = 0; i < HPM->plugin_count; i++) { - if( HPM->plugins[i] == NULL ) + int i, cursor; + for (cursor = 0; cursor < HPM->plugin_count; cursor++) { + if (HPM->plugins[cursor]->idx != plugin->idx) continue; - if( cursor != i ) - HPM->plugins[cursor] = HPM->plugins[i]; + HPM->plugins[cursor] = NULL; + break; + } + for(i = cursor + 1; i < HPM->plugin_count; i++) { + HPM->plugins[cursor] = HPM->plugins[i]; cursor++; } - if( !(HPM->plugin_count = cursor) ) { + if (!(HPM->plugin_count = cursor)) { aFree(HPM->plugins); HPM->plugins = NULL; } } + aFree(plugin); } /** @@ -560,8 +561,8 @@ void hplugins_config_read(void) { if ((plugin = HPM->load(filename))) { const char * (*func)(bool *fr); bool (*addhook_sub) (enum HPluginHookType type, const char *target, void *hook, unsigned int pID); - if ((func = plugin_import(plugin->dll, "Hooked",const char * (*)(bool *))) - && (addhook_sub = plugin_import(plugin->dll, "HPM_Plugin_AddHook",bool (*)(enum HPluginHookType, const char *, void *, unsigned int)))) { + if ((func = plugin_import(plugin->dll, "Hooked",const char * (*)(bool *))) != NULL + && (addhook_sub = plugin_import(plugin->dll, "HPM_Plugin_AddHook",bool (*)(enum HPluginHookType, const char *, void *, unsigned int))) != NULL) { const char *failed = func(&HPM->force_return); if (failed) { ShowError("HPM: failed to retrieve '%s' for '"CL_WHITE"%s"CL_RESET"'!\n", failed, plugin_name); @@ -580,8 +581,8 @@ void hplugins_config_read(void) { snprintf(filename, 60, "plugins/%s%s", libconfig->setting_get_string_elem(plist,i), DLL_EXT); HPM->load(filename); } - libconfig->destroy(&plugins_conf); } + libconfig->destroy(&plugins_conf); if( HPM->plugin_count ) ShowStatus("HPM: There are '"CL_WHITE"%d"CL_RESET"' plugins loaded, type '"CL_WHITE"plugins"CL_RESET"' to list them\n", HPM->plugin_count); diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h index 7eb4029aa..4fd16114b 100644 --- a/src/common/HPMDataCheck.h +++ b/src/common/HPMDataCheck.h @@ -106,6 +106,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = { #endif // COMMON_CONF_H #ifdef COMMON_CONSOLE_H { "CParseEntry", sizeof(struct CParseEntry), SERVER_TYPE_ALL }, + { "console_input_interface", sizeof(struct console_input_interface), SERVER_TYPE_ALL }, { "console_interface", sizeof(struct console_interface), SERVER_TYPE_ALL }, #else #define COMMON_CONSOLE_H diff --git a/src/common/HPMi.h b/src/common/HPMi.h index bd8d8fe64..e03f52e3b 100644 --- a/src/common/HPMi.h +++ b/src/common/HPMi.h @@ -71,11 +71,12 @@ enum HPluginDataTypes { HPDT_MOBDATA, HPDT_ITEMDATA, HPDT_BGDATA, + HPDT_AUTOTRADE_VEND, }; /* used in macros and conf storage */ enum HPluginConfType { - HPCT_BATTLE, /* battle-conf (map-server */ + HPCT_BATTLE, /* battle-conf (map-server) */ HPCT_LOGIN, /* login-server.conf (login-server) */ HPCT_CHAR, /* char-server.conf (char-server) */ HPCT_CHAR_INTER, /* inter-server.conf (char-server) */ @@ -138,6 +139,10 @@ enum HPluginConfType { #define addToBGDATA(ptr,data,index,autofree) (HPMi->addToHPData(HPDT_BGDATA,HPMi->pid,(ptr),(data),(index),(autofree))) #define getFromBGDATA(ptr,index) (HPMi->getFromHPData(HPDT_BGDATA,HPMi->pid,(ptr),(index))) #define removeFromBGDATA(ptr,index) (HPMi->removeFromHPData(HPDT_BGDATA,HPMi->pid,(ptr),(index))) +/* autotrade_vending */ +#define addToATVEND(ptr,data,index,autofree) (HPMi->addToHPData(HPDT_AUTOTRADE_VEND,HPMi->pid,(ptr),(data),(index),(autofree))) +#define getFromATVEND(ptr,index) (HPMi->getFromHPData(HPDT_AUTOTRADE_VEND,HPMi->pid,(ptr),(index))) +#define removeFromATVEND(ptr,index) (HPMi->removeFromHPData(HPDT_AUTOTRADE_VEND,HPMi->pid,(ptr),(index))) /// HPMi->addCommand #define addAtcommand(cname,funcname) do { \ diff --git a/src/common/atomic.h b/src/common/atomic.h index c1ea2aa48..1bb859b29 100644 --- a/src/common/atomic.h +++ b/src/common/atomic.h @@ -40,7 +40,6 @@ forceinline int64 InterlockedCompareExchange64(volatile int64 *dest, int64 exch, } } - forceinline volatile int64 InterlockedIncrement64(volatile int64 *addend){ __int64 old; do{ @@ -50,8 +49,6 @@ forceinline volatile int64 InterlockedIncrement64(volatile int64 *addend){ return (old + 1); } - - forceinline volatile int64 InterlockedDecrement64(volatile int64 *addend){ __int64 old; @@ -97,53 +94,42 @@ static forceinline int64 InterlockedExchangeAdd64(volatile int64 *addend, int64 return __sync_fetch_and_add(addend, increment); }//end: InterlockedExchangeAdd64() - static forceinline int32 InterlockedExchangeAdd(volatile int32 *addend, int32 increment){ return __sync_fetch_and_add(addend, increment); }//end: InterlockedExchangeAdd() - static forceinline int64 InterlockedIncrement64(volatile int64 *addend){ return __sync_add_and_fetch(addend, 1); }//end: InterlockedIncrement64() - static forceinline int32 InterlockedIncrement(volatile int32 *addend){ return __sync_add_and_fetch(addend, 1); }//end: InterlockedIncrement() - static forceinline int64 InterlockedDecrement64(volatile int64 *addend){ return __sync_sub_and_fetch(addend, 1); }//end: InterlockedDecrement64() - static forceinline int32 InterlockedDecrement(volatile int32 *addend){ return __sync_sub_and_fetch(addend, 1); }//end: InterlockedDecrement() - static forceinline int64 InterlockedCompareExchange64(volatile int64 *dest, int64 exch, int64 cmp){ return __sync_val_compare_and_swap(dest, cmp, exch); }//end: InterlockedCompareExchange64() - static forceinline int32 InterlockedCompareExchange(volatile int32 *dest, int32 exch, int32 cmp){ return __sync_val_compare_and_swap(dest, cmp, exch); }//end: InterlockedCompareExchnage() - static forceinline int64 InterlockedExchange64(volatile int64 *target, int64 val){ return __sync_lock_test_and_set(target, val); }//end: InterlockedExchange64() - static forceinline int32 InterlockedExchange(volatile int32 *target, int32 val){ return __sync_lock_test_and_set(target, val); }//end: InterlockedExchange() - #endif //endif compiler decision - #endif /* COMMON_ATOMIC_H */ diff --git a/src/common/core.c b/src/common/core.c index 7f5a1da53..dcc96fa41 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -206,7 +206,7 @@ const char *cmdline_arg_source(struct CmdlineArgData *arg) { */ bool cmdline_arg_add(unsigned int pluginID, const char *name, char shortname, CmdlineExecFunc func, const char *help, unsigned int options) { struct CmdlineArgData *data = NULL; - + RECREATE(cmdline->args_data, struct CmdlineArgData, ++cmdline->args_data_count); data = &cmdline->args_data[cmdline->args_data_count-1]; data->pluginID = pluginID; @@ -227,7 +227,7 @@ static CMDLINEARG(help) ShowInfo("Usage: %s [options]\n", SERVER_NAME); ShowInfo("\n"); ShowInfo("Options:\n"); - + for (i = 0; i < cmdline->args_data_count; i++) { struct CmdlineArgData *data = &cmdline->args_data[i]; char altname[16], paramnames[256]; @@ -400,7 +400,7 @@ int main (int argc, char **argv) { cmdline->exec(argc, argv, CMDLINE_OPT_SILENT); iMalloc->init_messages(); // Initialization messages (after buying us some time to suppress them if needed) - + sysinfo->init(); if (!(showmsg->silent&0x1)) diff --git a/src/common/db.h b/src/common/db.h index 9b9cba8f8..73d44a755 100644 --- a/src/common/db.h +++ b/src/common/db.h @@ -269,13 +269,9 @@ typedef uint64 (*DBHasher)(DBKey key, unsigned short maxlen); */ typedef void (*DBReleaser)(DBKey key, DBData data, DBRelease which); - - typedef struct DBIterator DBIterator; typedef struct DBMap DBMap; - - /** * Database iterator. * Supports forward iteration, backward iteration and removing entries from the database. @@ -621,7 +617,6 @@ struct DBMap { #define i64db_get(db,k) ( DB->data2ptr((db)->get((db),DB->i642key(k))) ) #define ui64db_get(db,k) ( DB->data2ptr((db)->get((db),DB->ui642key(k))) ) - // Get int-type data from DBMaps of various key types #define db_iget(db,k) ( DB->data2i((db)->get((db),(k))) ) #define idb_iget(db,k) ( DB->data2i((db)->get((db),DB->i2key(k))) ) @@ -940,7 +935,6 @@ void db_defaults(void); HPShared struct db_interface *DB; - /// Finds an entry in an array. /// ex: ARR_FIND(0, size, i, list[i] == target); /// @@ -955,8 +949,6 @@ HPShared struct db_interface *DB; break; \ }while(0) - - /// Moves an entry of the array. /// Use ARR_MOVERIGHT/ARR_MOVELEFT if __from and __to are direct numbers. /// ex: ARR_MOVE(i, 0, list, int);// move index i to index 0 @@ -980,8 +972,6 @@ HPShared struct db_interface *DB; } \ }while(0) - - /// Moves an entry of the array to the right. /// ex: ARR_MOVERIGHT(1, 4, list, int);// move index 1 to index 4 /// @@ -997,8 +987,6 @@ HPShared struct db_interface *DB; memmove((__arr)+(__to), &__backup__, sizeof(__type)); \ }while(0) - - /// Moves an entry of the array to the left. /// ex: ARR_MOVELEFT(3, 0, list, int);// move index 3 to index 0 /// @@ -1014,14 +1002,10 @@ HPShared struct db_interface *DB; memmove((__arr)+(__to), &__backup__, sizeof(__type)); \ }while(0) - - ///////////////////////////////////////////////////////////////////// // Vector library based on defines. (dynamic array) // uses aMalloc, aRealloc, aFree - - /// Declares an anonymous vector struct. /// /// @param __type Type of data @@ -1032,8 +1016,6 @@ HPShared struct db_interface *DB; __type* _data_; \ } - - /// Declares a named vector struct. /// /// @param __name Structure name @@ -1045,8 +1027,6 @@ HPShared struct db_interface *DB; __type* _data_; \ } - - /// Declares and initializes an anonymous vector variable. /// /// @param __type Type of data @@ -1054,8 +1034,6 @@ HPShared struct db_interface *DB; #define VECTOR_VAR(__type,__var) \ VECTOR_DECL(__type) __var = {0,0,NULL} - - /// Declares and initializes a named vector variable. /// /// @param __name Structure name @@ -1063,16 +1041,12 @@ HPShared struct db_interface *DB; #define VECTOR_STRUCT_VAR(__name,__var) \ struct __name __var = {0,0,NULL} - - /// Initializes a vector. /// /// @param __vec Vector #define VECTOR_INIT(__vec) \ memset(&(__vec), 0, sizeof(__vec)) - - /// Returns the internal array of values. /// /// @param __vec Vector @@ -1080,8 +1054,6 @@ HPShared struct db_interface *DB; #define VECTOR_DATA(__vec) \ ( (__vec)._data_ ) - - /// Returns the length of the vector. /// /// @param __vec Vector @@ -1089,8 +1061,6 @@ HPShared struct db_interface *DB; #define VECTOR_LENGTH(__vec) \ ( (__vec)._len_ ) - - /// Returns the capacity of the vector. /// /// @param __vec Vector @@ -1098,8 +1068,6 @@ HPShared struct db_interface *DB; #define VECTOR_CAPACITY(__vec) \ ( (__vec)._max_ ) - - /// Returns the value at the target index. /// Assumes the index exists. /// @@ -1109,8 +1077,6 @@ HPShared struct db_interface *DB; #define VECTOR_INDEX(__vec,__idx) \ ( VECTOR_DATA(__vec)[__idx] ) - - /// Returns the first value of the vector. /// Assumes the array is not empty. /// @@ -1119,8 +1085,6 @@ HPShared struct db_interface *DB; #define VECTOR_FIRST(__vec) \ ( VECTOR_INDEX(__vec,0) ) - - /// Returns the last value of the vector. /// Assumes the array is not empty. /// @@ -1129,8 +1093,6 @@ HPShared struct db_interface *DB; #define VECTOR_LAST(__vec) \ ( VECTOR_INDEX(__vec,VECTOR_LENGTH(__vec)-1) ) - - /// Resizes the vector. /// Excess values are discarded, new positions are zeroed. /// @@ -1159,8 +1121,6 @@ HPShared struct db_interface *DB; } \ }while(0) - - /// Ensures that the array has the target number of empty positions. /// Increases the capacity in multiples of __step. /// @@ -1176,8 +1136,6 @@ HPShared struct db_interface *DB; } \ }while(0) - - /// Inserts a zeroed value in the target index. /// Assumes the index is valid and there is enough capacity. /// @@ -1191,8 +1149,6 @@ HPShared struct db_interface *DB; ++VECTOR_LENGTH(__vec); /* increase length */ \ }while(0) - - /// Inserts a value in the target index. (using the '=' operator) /// Assumes the index is valid and there is enough capacity. /// @@ -1207,8 +1163,6 @@ HPShared struct db_interface *DB; ++VECTOR_LENGTH(__vec); /* increase length */ \ }while(0) - - /// Inserts a value in the target index. (using memcpy) /// Assumes the index is valid and there is enough capacity. /// @@ -1218,8 +1172,6 @@ HPShared struct db_interface *DB; #define VECTOR_INSERTCOPY(__vec,__idx,__val) \ VECTOR_INSERTARRAY(__vec,__idx,&(__val),1) - - /// Inserts the values of the array in the target index. (using memcpy) /// Assumes the index is valid and there is enough capacity. /// @@ -1235,8 +1187,6 @@ HPShared struct db_interface *DB; VECTOR_LENGTH(__vec) += (__n); /* increase length */ \ }while(0) - - /// Inserts a zeroed value in the end of the vector. /// Assumes there is enough capacity. /// @@ -1247,7 +1197,6 @@ HPShared struct db_interface *DB; ++VECTOR_LENGTH(__vec); /* increase length */ \ }while(0) - /// Inserts a value in the end of the vector. (using the '=' operator) /// Assumes there is enough capacity. /// @@ -1259,8 +1208,6 @@ HPShared struct db_interface *DB; ++VECTOR_LENGTH(__vec); /* increase length */ \ }while(0) - - /// Inserts a value in the end of the vector. (using memcpy) /// Assumes there is enough capacity. /// @@ -1269,8 +1216,6 @@ HPShared struct db_interface *DB; #define VECTOR_PUSHCOPY(__vec,__val) \ VECTOR_PUSHARRAY(__vec,&(__val),1) - - /// Inserts the values of the array in the end of the vector. (using memcpy) /// Assumes there is enough capacity. /// @@ -1283,8 +1228,6 @@ HPShared struct db_interface *DB; VECTOR_LENGTH(__vec) += (__n); /* increase length */ \ }while(0) - - /// Removes and returns the last value of the vector. /// Assumes the array is not empty. /// @@ -1293,8 +1236,6 @@ HPShared struct db_interface *DB; #define VECTOR_POP(__vec) \ ( VECTOR_INDEX(__vec,--VECTOR_LENGTH(__vec)) ) - - /// Removes the last N values of the vector and returns the value of the last pop. /// Assumes there are enough values. /// @@ -1304,8 +1245,6 @@ HPShared struct db_interface *DB; #define VECTOR_POPN(__vec,__n) \ ( VECTOR_INDEX(__vec,(VECTOR_LENGTH(__vec)-=(__n))) ) - - /// Removes the target index from the vector. /// Assumes the index is valid and there are enough values. /// @@ -1314,8 +1253,6 @@ HPShared struct db_interface *DB; #define VECTOR_ERASE(__vec,__idx) \ VECTOR_ERASEN(__vec,__idx,1) - - /// Removes N values from the target index of the vector. /// Assumes the index is valid and there are enough values. /// @@ -1329,8 +1266,6 @@ HPShared struct db_interface *DB; VECTOR_LENGTH(__vec) -= (__n); /* decrease length */ \ }while(0) - - /// Clears the vector, freeing allocated data. /// /// @param __vec Vector @@ -1344,77 +1279,57 @@ HPShared struct db_interface *DB; } \ }while(0) - - ///////////////////////////////////////////////////////////////////// // Binary heap library based on defines. (uses the vector defines above) // uses aMalloc, aRealloc, aFree // WARNING: BHEAP implementation details affect behaviour of A* pathfinding - - /// Declares an anonymous binary heap struct. /// /// @param __type Type of data #define BHEAP_DECL(__type) VECTOR_DECL(__type) - - /// Declares a named binary heap struct. /// /// @param __name Structure name /// @param __type Type of data #define BHEAP_STRUCT_DECL(__name,__type) VECTOR_STRUCT_DECL(__name,__type) - - /// Declares and initializes an anonymous binary heap variable. /// /// @param __type Type of data /// @param __var Variable name #define BHEAP_VAR(__type,__var) VECTOR_VAR(__type,__var) - - /// Declares and initializes a named binary heap variable. /// /// @param __name Structure name /// @param __var Variable name #define BHEAP_STRUCT_VAR(__name,__var) VECTOR_STRUCT_VAR(__name,__var) - - /// Initializes a heap. /// /// @param __heap Binary heap #define BHEAP_INIT(__heap) VECTOR_INIT(__heap) - - /// Returns the internal array of values. /// /// @param __heap Binary heap /// @return Array of values #define BHEAP_DATA(__heap) VECTOR_DATA(__heap) - - /// Returns the length of the heap. /// /// @param __heap Binary heap /// @return Length #define BHEAP_LENGTH(__heap) VECTOR_LENGTH(__heap) - - /// Returns the capacity of the heap. /// /// @param __heap Binary heap /// @return Capacity #define BHEAP_CAPACITY(__heap) VECTOR_CAPACITY(__heap) - - /// Ensures that the heap has the target number of empty positions. /// Increases the capacity in multiples of __step. /// @@ -1423,8 +1338,6 @@ HPShared struct db_interface *DB; /// @param __step Increase #define BHEAP_ENSURE(__heap,__n,__step) VECTOR_ENSURE(__heap,__n,__step) - - /// Returns the top value of the heap. /// Assumes the heap is not empty. /// @@ -1432,8 +1345,6 @@ HPShared struct db_interface *DB; /// @return Value at the top #define BHEAP_PEEK(__heap) VECTOR_INDEX(__heap,0) - - /// Inserts a value in the heap. (using the '=' operator) /// Assumes there is enough capacity. /// @@ -1460,8 +1371,6 @@ HPShared struct db_interface *DB; } \ }while(0) - - /// See BHEAP_PUSH. Version used by A* implementation, matching client bheap. /// /// @param __heap Binary heap @@ -1475,8 +1384,6 @@ HPShared struct db_interface *DB; BHEAP_SIFTDOWN(__heap,0,_i_,__topcmp,__swp); \ }while(0) - - /// Removes the top value of the heap. (using the '=' operator) /// Assumes the heap is not empty. /// @@ -1490,8 +1397,6 @@ HPShared struct db_interface *DB; /// @param __swp Swapper #define BHEAP_POP(__heap,__topcmp,__swp) BHEAP_POPINDEX(__heap,0,__topcmp,__swp) - - /// See BHEAP_POP. Version used by A* implementation, matching client bheap. /// /// @param __heap Binary heap @@ -1505,8 +1410,6 @@ HPShared struct db_interface *DB; BHEAP_SIFTUP(__heap,0,__topcmp,__swp); \ }while(0) - - /// Removes the target value of the heap. (using the '=' operator) /// Assumes the index exists. /// @@ -1553,8 +1456,6 @@ HPShared struct db_interface *DB; } \ }while(0) - - /// Follow path up towards (but not all the way to) the root, swapping nodes until finding /// a place where the new item that was placed at __idx fits. /// Only goes as high as __startidx (usually 0). @@ -1577,8 +1478,6 @@ HPShared struct db_interface *DB; } \ }while(0) - - /// Repeatedly swap the smaller child with parent, after placing a new item at __idx. /// /// @param __heap Binary heap @@ -1607,8 +1506,6 @@ HPShared struct db_interface *DB; BHEAP_SIFTDOWN(__heap,__idx,_i_,__topcmp,__swp); \ }while(0) - - /// Call this after modifying the item at __idx__ to restore the heap /// /// @param __heap Binary heap @@ -1621,15 +1518,11 @@ HPShared struct db_interface *DB; BHEAP_SIFTUP(__heap,__idx,__topcmp,__swp); \ }while(0) - - /// Clears the binary heap, freeing allocated data. /// /// @param __heap Binary heap #define BHEAP_CLEAR(__heap) VECTOR_CLEAR(__heap) - - /// Generic comparator for a min-heap. (minimum value at top) /// Returns -1 if v1 is smaller, 1 if v2 is smaller, 0 if equal. /// @@ -1638,8 +1531,6 @@ HPShared struct db_interface *DB; /// @return negative if v1 is top, positive if v2 is top, 0 if equal #define BHEAP_MINTOPCMP(v1,v2) ( v1 == v2 ? 0 : v1 < v2 ? -1 : 1 ) - - /// Generic comparator for a max-heap. (maximum value at top) /// Returns -1 if v1 is bigger, 1 if v2 is bigger, 0 if equal. /// @@ -1648,6 +1539,4 @@ HPShared struct db_interface *DB; /// @return negative if v1 is top, positive if v2 is top, 0 if equal #define BHEAP_MAXTOPCMP(v1,v2) ( v1 == v2 ? 0 : v1 > v2 ? -1 : 1 ) - - #endif /* COMMON_DB_H */ diff --git a/src/common/grfio.c b/src/common/grfio.c index 614678da8..b59c2b63d 100644 --- a/src/common/grfio.c +++ b/src/common/grfio.c @@ -47,7 +47,6 @@ typedef struct FILELIST { // (NOTE: probably meant to be used to override grf contents by files in the data directory) //#define GRFIO_LOCAL - // stores info about every loaded file FILELIST* filelist = NULL; int filelist_entrys = 0; @@ -61,14 +60,12 @@ int gentry_maxentry = 0; // the path to the data directory char data_dir[1024] = ""; - // little endian char array to uint conversion static unsigned int getlong(unsigned char* p) { return (p[0] << 0 | p[1] << 8 | p[2] << 16 | p[3] << 24); } - static void NibbleSwap(unsigned char* src, int len) { while( len > 0 ) @@ -79,7 +76,6 @@ static void NibbleSwap(unsigned char* src, int len) } } - /// Substitutes some specific values for others, leaves rest intact. Obfuscation. /// NOTE: Operation is symmetric (calling it twice gives back the original input). static uint8_t grf_substitution(uint8_t in) @@ -142,7 +138,6 @@ static void grf_shuffle_dec(BIT64* src) *src = out; } - static void grf_decode_header(unsigned char* buf, size_t len) { BIT64* p = (BIT64*)buf; @@ -156,7 +151,6 @@ static void grf_decode_header(unsigned char* buf, size_t len) // the rest is plaintext, done. } - static void grf_decode_full(unsigned char* buf, size_t len, int cycle) { BIT64* p = (BIT64*)buf; @@ -195,7 +189,6 @@ static void grf_decode_full(unsigned char* buf, size_t len, int cycle) } } - /// Decodes grf data. /// @param buf data to decode (in-place) /// @param len length of the data @@ -235,7 +228,6 @@ static void grf_decode(unsigned char* buf, size_t len, char entry_type, int entr } } - /****************************************************** *** Zlib Subroutines *** ******************************************************/ @@ -246,14 +238,12 @@ unsigned long grfio_crc32(const unsigned char* buf, unsigned int len) return crc32(crc32(0L, Z_NULL, 0), buf, len); } - /// zlib uncompress int decode_zip(void* dest, unsigned long* destLen, const void* source, unsigned long sourceLen) { return uncompress((Bytef*)dest, destLen, (const Bytef*)source, sourceLen); } - /// zlib compress int encode_zip(void* dest, unsigned long* destLen, const void* source, unsigned long sourceLen) { if( *destLen == 0 ) /* [Ind/Hercules] */ @@ -264,7 +254,6 @@ int encode_zip(void* dest, unsigned long* destLen, const void* source, unsigned return compress((Bytef*)dest, destLen, (const Bytef*)source, sourceLen); } - /*********************************************************** *** File List Subroutines *** ***********************************************************/ @@ -370,12 +359,10 @@ static void filelist_compact(void) } } - /*********************************************************** *** Grfio Subroutines *** ***********************************************************/ - /// Combines are resource path with the data folder location to create local resource path. static void grfio_localpath_create(char* buffer, size_t size, const char* filename) { @@ -399,7 +386,6 @@ static void grfio_localpath_create(char* buffer, size_t size, const char* filena buffer[i] = '/'; } - /// Reads a file into a newly allocated buffer (from grf or data directory). void *grfio_reads(const char *fname, int *size) { @@ -449,7 +435,7 @@ void *grfio_reads(const char *fname, int *size) // Archive[GRF] File Read char *grfname = gentry_table[entry->gentry - 1]; FILE *in = fopen(grfname, "rb"); - + if (in != NULL) { int fsize = entry->srclen_aligned; unsigned char *buf = (unsigned char *)aMalloc(fsize); @@ -496,7 +482,6 @@ void *grfio_reads(const char *fname, int *size) return NULL; } - /// Decodes encrypted filename from a version 01xx grf index. static char* decode_filename(unsigned char* buf, int len) { @@ -508,7 +493,6 @@ static char* decode_filename(unsigned char* buf, int len) return (char*)buf; } - /// Compares file extension against known large file types. /// @return true if the file should undergo full mode 0 decryption, and true otherwise. static bool isFullEncrypt(const char* fname) @@ -525,7 +509,6 @@ static bool isFullEncrypt(const char* fname) return true; } - /// Loads all entries in the specified grf file into the filelist. /// @param gentry index of the grf file name in the gentry_table static int grfio_entryread(const char *grfname, int gentry) @@ -691,7 +674,6 @@ static int grfio_entryread(const char *grfname, int gentry) return 0; // 0:no error } - static bool grfio_parse_restable_row(const char* row) { char w1[256], w2[256]; @@ -733,7 +715,6 @@ static bool grfio_parse_restable_row(const char* row) return false; } - /// Grfio Resource file check. static void grfio_resourcecheck(void) { @@ -785,7 +766,6 @@ static void grfio_resourcecheck(void) } } - /// Reads a grf file and adds it to the list. static int grfio_add(const char* fname) { @@ -802,7 +782,6 @@ static int grfio_add(const char* fname) return grfio_entryread(fname, gentry_entrys - 1); } - /// Finalizes grfio. void grfio_final(void) { @@ -829,7 +808,6 @@ void grfio_final(void) gentry_entrys = gentry_maxentry = 0; } - /// Initializes grfio. void grfio_init(const char* fname) { diff --git a/src/common/mmo.h b/src/common/mmo.h index 1567f20be..012eec935 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -299,6 +299,7 @@ enum e_mmo_charstatus_opt { }; enum e_item_bound_type { + IBT_NONE = 0x0, IBT_MIN = 0x1, IBT_ACCOUNT = 0x1, IBT_GUILD = 0x2, @@ -333,18 +334,15 @@ enum { OPTION_DRAGON5 = 0x04000000, OPTION_HANBOK = 0x08000000, OPTION_OKTOBERFEST = 0x10000000, - #ifndef NEW_CARTS OPTION_CART1 = 0x00000008, OPTION_CART2 = 0x00000080, OPTION_CART3 = 0x00000100, OPTION_CART4 = 0x00000200, OPTION_CART5 = 0x00000400, - /* compound constant for older carts */ OPTION_CART = OPTION_CART1|OPTION_CART2|OPTION_CART3|OPTION_CART4|OPTION_CART5, #endif - // compound constants OPTION_DRAGON = OPTION_DRAGON1|OPTION_DRAGON2|OPTION_DRAGON3|OPTION_DRAGON4|OPTION_DRAGON5, OPTION_COSTUME = OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK|OPTION_OKTOBERFEST, @@ -757,7 +755,6 @@ enum { GD_MAX, }; - //These mark the ID of the jobs, as expected by the client. [Skotlex] enum { JOB_NOVICE, diff --git a/src/common/mutex.c b/src/common/mutex.c index 5dfb3d01c..715609628 100644 --- a/src/common/mutex.c +++ b/src/common/mutex.c @@ -25,7 +25,6 @@ struct ramutex{ #endif }; - struct racond{ #ifdef WIN32 HANDLE events[2]; @@ -40,14 +39,12 @@ struct racond{ #endif }; - //////////////////// // Mutex // // Implementation: // - ramutex *ramutex_create(void) { struct ramutex *m; @@ -66,7 +63,6 @@ ramutex *ramutex_create(void) { return m; }//end: ramutex_create() - void ramutex_destroy(ramutex *m) { #ifdef WIN32 @@ -79,7 +75,6 @@ void ramutex_destroy(ramutex *m) { }//end: ramutex_destroy() - void ramutex_lock(ramutex *m) { #ifdef WIN32 @@ -89,7 +84,6 @@ void ramutex_lock(ramutex *m) { #endif }//end: ramutex_lock - bool ramutex_trylock(ramutex *m) { #ifdef WIN32 if(TryEnterCriticalSection(&m->hMutex) != FALSE) @@ -104,7 +98,6 @@ bool ramutex_trylock(ramutex *m) { #endif }//end: ramutex_trylock() - void ramutex_unlock(ramutex *m) { #ifdef WIN32 LeaveCriticalSection(&m->hMutex); @@ -114,8 +107,6 @@ void ramutex_unlock(ramutex *m) { }//end: ramutex_unlock() - - /////////////// // Condition Variables // @@ -143,7 +134,6 @@ racond *racond_create(void) { return c; }//end: racond_create() - void racond_destroy(racond *c) { #ifdef WIN32 CloseHandle( c->events[ EVENT_COND_SIGNAL ] ); @@ -156,14 +146,12 @@ void racond_destroy(racond *c) { aFree(c); }//end: racond_destroy() - void racond_wait(racond *c, ramutex *m, sysint timeout_ticks) { #ifdef WIN32 register DWORD ms; int result; bool is_last = false; - EnterCriticalSection(&c->waiters_lock); c->nWaiters++; LeaveCriticalSection(&c->waiters_lock); @@ -191,7 +179,6 @@ void racond_wait(racond *c, ramutex *m, sysint timeout_ticks) { if(is_last == true) ResetEvent( c->events[EVENT_COND_BROADCAST] ); - ramutex_lock(m); #else @@ -210,7 +197,6 @@ void racond_wait(racond *c, ramutex *m, sysint timeout_ticks) { #endif }//end: racond_wait() - void racond_signal(racond *c) { #ifdef WIN32 # if 0 @@ -228,7 +214,6 @@ void racond_signal(racond *c) { #endif }//end: racond_signal() - void racond_broadcast(racond *c) { #ifdef WIN32 # if 0 @@ -245,5 +230,3 @@ void racond_broadcast(racond *c) { pthread_cond_broadcast(&c->hCond); #endif }//end: racond_broadcast() - - diff --git a/src/common/nullpo.c b/src/common/nullpo.c index 829ba4aab..98faa9f06 100644 --- a/src/common/nullpo.c +++ b/src/common/nullpo.c @@ -58,6 +58,5 @@ void assert_report(const char *file, int line, const char *func, const char *tar **/ void nullpo_defaults(void) { nullpo = &nullpo_s; - nullpo->assert_report = assert_report; } diff --git a/src/common/socket.c b/src/common/socket.c index c4cc4a329..de8ca4682 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -113,7 +113,6 @@ int sock2fd(SOCKET s) return fd; } - /// Inserts the socket into the global array of sockets. /// Returns a new fd associated with the socket. /// If there are too many sockets it closes the socket, sets an error and @@ -293,7 +292,6 @@ void set_defaultparse(ParseFunc defaultparse) default_func_parse = defaultparse; } - /*====================================== * CORE : Socket options *--------------------------------------*/ @@ -1066,12 +1064,12 @@ static int connect_check_clear(int tid, int64 tick, int id, intptr_t data) { int list = 0; ConnectHistory *hist = NULL; DBIterator *iter; - + if( !db_size(connect_history) ) return 0; - + iter = db_iterator(connect_history); - + for( hist = dbi_first(iter); dbi_exists(iter); hist = dbi_next(iter) ){ if( (!hist->ddos && DIFF_TICK(tick,hist->tick) > ddos_interval*3) || (hist->ddos && DIFF_TICK(tick,hist->tick) > ddos_autoreset) ) @@ -1081,13 +1079,12 @@ static int connect_check_clear(int tid, int64 tick, int id, intptr_t data) { } list++; } - dbi_destroy(iter); - + if( access_debug ){ ShowInfo("connect_check_clear: Cleared %d of %d from IP list.\n", clear, list); } - + return list; } @@ -1206,7 +1203,6 @@ int socket_config_read(const char* cfgName) return 0; } - void socket_final(void) { int i; diff --git a/src/common/sql.c b/src/common/sql.c index 0ca51e272..ee759eb61 100644 --- a/src/common/sql.c +++ b/src/common/sql.c @@ -36,8 +36,6 @@ struct Sql { int keepalive; }; - - // Column length receiver. // Takes care of the possible size mismatch between uint32 and unsigned long. struct s_column_length { @@ -46,8 +44,6 @@ struct s_column_length { }; typedef struct s_column_length s_column_length; - - /// Sql statement struct SqlStmt { StringBuf buf; @@ -61,14 +57,10 @@ struct SqlStmt { bool bind_columns; }; - - /////////////////////////////////////////////////////////////////////////////// // Sql Handle /////////////////////////////////////////////////////////////////////////////// - - /// Allocates and initializes a new Sql handle. Sql* Sql_Malloc(void) { @@ -84,8 +76,6 @@ Sql* Sql_Malloc(void) return self; } - - static int Sql_P_Keepalive(Sql* self); /// Establishes a connection. @@ -111,8 +101,6 @@ int Sql_Connect(Sql* self, const char* user, const char* passwd, const char* hos return SQL_SUCCESS; } - - /// Retrieves the timeout of the connection. int Sql_GetTimeout(Sql* self, uint32* out_timeout) { @@ -130,8 +118,6 @@ int Sql_GetTimeout(Sql* self, uint32* out_timeout) return SQL_ERROR; } - - /// Retrieves the name of the columns of a table into out_buf, with the separator after each name. int Sql_GetColumnNames(Sql* self, const char* table, char* out_buf, size_t buf_len, char sep) { @@ -160,8 +146,6 @@ int Sql_GetColumnNames(Sql* self, const char* table, char* out_buf, size_t buf_l return SQL_SUCCESS; } - - /// Changes the encoding of the connection. int Sql_SetEncoding(Sql* self, const char* encoding) { @@ -170,8 +154,6 @@ int Sql_SetEncoding(Sql* self, const char* encoding) return SQL_ERROR; } - - /// Pings the connection. int Sql_Ping(Sql* self) { @@ -180,8 +162,6 @@ int Sql_Ping(Sql* self) return SQL_ERROR; } - - /// Wrapper function for Sql_Ping. /// /// @private @@ -193,8 +173,6 @@ static int Sql_P_KeepaliveTimer(int tid, int64 tick, int id, intptr_t data) return 0; } - - /// Establishes keepalive (periodic ping) on the connection. /// /// @return the keepalive timer id, or INVALID_TIMER @@ -218,8 +196,6 @@ static int Sql_P_Keepalive(Sql* self) return timer->add_interval(timer->gettick() + ping_interval*1000, Sql_P_KeepaliveTimer, 0, (intptr_t)self, ping_interval*1000); } - - /// Escapes a string. size_t Sql_EscapeString(Sql* self, char *out_to, const char *from) { @@ -229,8 +205,6 @@ size_t Sql_EscapeString(Sql* self, char *out_to, const char *from) return (size_t)mysql_escape_string(out_to, from, (unsigned long)strlen(from)); } - - /// Escapes a string. size_t Sql_EscapeStringLen(Sql* self, char *out_to, const char *from, size_t from_len) { @@ -240,8 +214,6 @@ size_t Sql_EscapeStringLen(Sql* self, char *out_to, const char *from, size_t fro return (size_t)mysql_escape_string(out_to, from, (unsigned long)from_len); } - - /// Executes a query. int Sql_Query(Sql *self, const char *query, ...) __attribute__((format(printf, 2, 3))); int Sql_Query(Sql *self, const char *query, ...) { @@ -255,8 +227,6 @@ int Sql_Query(Sql *self, const char *query, ...) { return res; } - - /// Executes a query. int Sql_QueryV(Sql* self, const char* query, va_list args) { @@ -282,8 +252,6 @@ int Sql_QueryV(Sql* self, const char* query, va_list args) return SQL_SUCCESS; } - - /// Executes a query. int Sql_QueryStr(Sql* self, const char* query) { @@ -309,8 +277,6 @@ int Sql_QueryStr(Sql* self, const char* query) return SQL_SUCCESS; } - - /// Returns the number of the AUTO_INCREMENT column of the last INSERT/UPDATE query. uint64 Sql_LastInsertId(Sql* self) { @@ -320,8 +286,6 @@ uint64 Sql_LastInsertId(Sql* self) return 0; } - - /// Returns the number of columns in each row of the result. uint32 Sql_NumColumns(Sql* self) { @@ -330,8 +294,6 @@ uint32 Sql_NumColumns(Sql* self) return 0; } - - /// Returns the number of rows in the result. uint64 Sql_NumRows(Sql* self) { @@ -340,8 +302,6 @@ uint64 Sql_NumRows(Sql* self) return 0; } - - /// Fetches the next row. int Sql_NextRow(Sql* self) { if( self && self->result ) { @@ -357,8 +317,6 @@ int Sql_NextRow(Sql* self) { return SQL_ERROR; } - - /// Gets the data of a column. int Sql_GetData(Sql* self, size_t col, char** out_buf, size_t* out_len) { @@ -375,8 +333,6 @@ int Sql_GetData(Sql* self, size_t col, char** out_buf, size_t* out_len) return SQL_ERROR; } - - /// Frees the result of the query. void Sql_FreeResult(Sql* self) { if( self && self->result ) { @@ -387,8 +343,6 @@ void Sql_FreeResult(Sql* self) { } } - - /// Shows debug information (last query). void Sql_ShowDebug_(Sql* self, const char* debug_file, const unsigned long debug_line) { @@ -400,8 +354,6 @@ void Sql_ShowDebug_(Sql* self, const char* debug_file, const unsigned long debug ShowDebug("at %s:%lu\n", debug_file, debug_line); } - - /// Frees a Sql handle returned by Sql_Malloc. void Sql_Free(Sql* self) { if( self ) @@ -414,14 +366,10 @@ void Sql_Free(Sql* self) { } } - - /////////////////////////////////////////////////////////////////////////////// // Prepared Statements /////////////////////////////////////////////////////////////////////////////// - - /// Returns the mysql integer type for the target size. /// /// @private @@ -439,8 +387,6 @@ static enum enum_field_types Sql_P_SizeToMysqlIntType(int sz) } } - - /// Binds a parameter/result. /// /// @private @@ -514,8 +460,6 @@ static int Sql_P_BindSqlDataType(MYSQL_BIND* bind, enum SqlDataType buffer_type, return SQL_SUCCESS; } - - /// Prints debug information about a field (type and length). /// /// @private @@ -551,8 +495,6 @@ static void Sql_P_ShowDebugMysqlFieldInfo(const char* prefix, enum enum_field_ty ShowDebug("%stype=%s%s, length=%lu%s\n", prefix, sign, type_string, length, length_postfix); } - - /// Reports debug information about a truncated column. /// /// @private @@ -575,8 +517,6 @@ static void SqlStmt_P_ShowDebugTruncatedColumn(SqlStmt* self, size_t i) mysql_free_result(meta); } - - /// Allocates and initializes a new SqlStmt handle. SqlStmt* SqlStmt_Malloc(Sql* sql) { SqlStmt* self; @@ -604,8 +544,6 @@ SqlStmt* SqlStmt_Malloc(Sql* sql) { return self; } - - /// Prepares the statement. int SqlStmt_Prepare(SqlStmt *self, const char *query, ...) __attribute__((format(printf, 2, 3))); int SqlStmt_Prepare(SqlStmt *self, const char *query, ...) { @@ -619,8 +557,6 @@ int SqlStmt_Prepare(SqlStmt *self, const char *query, ...) { return res; } - - /// Prepares the statement. int SqlStmt_PrepareV(SqlStmt* self, const char* query, va_list args) { @@ -641,8 +577,6 @@ int SqlStmt_PrepareV(SqlStmt* self, const char* query, va_list args) return SQL_SUCCESS; } - - /// Prepares the statement. int SqlStmt_PrepareStr(SqlStmt* self, const char* query) { @@ -663,8 +597,6 @@ int SqlStmt_PrepareStr(SqlStmt* self, const char* query) return SQL_SUCCESS; } - - /// Returns the number of parameters in the prepared statement. size_t SqlStmt_NumParams(SqlStmt* self) { @@ -674,8 +606,6 @@ size_t SqlStmt_NumParams(SqlStmt* self) return 0; } - - /// Binds a parameter to a buffer. int SqlStmt_BindParam(SqlStmt* self, size_t idx, enum SqlDataType buffer_type, void* buffer, size_t buffer_len) { @@ -704,8 +634,6 @@ int SqlStmt_BindParam(SqlStmt* self, size_t idx, enum SqlDataType buffer_type, v return SQL_SUCCESS;// out of range - ignore } - - /// Executes the prepared statement. int SqlStmt_Execute(SqlStmt* self) { @@ -731,8 +659,6 @@ int SqlStmt_Execute(SqlStmt* self) return SQL_SUCCESS; } - - /// Returns the number of the AUTO_INCREMENT column of the last INSERT/UPDATE statement. uint64 SqlStmt_LastInsertId(SqlStmt* self) { @@ -742,8 +668,6 @@ uint64 SqlStmt_LastInsertId(SqlStmt* self) return 0; } - - /// Returns the number of columns in each row of the result. size_t SqlStmt_NumColumns(SqlStmt* self) { @@ -753,8 +677,6 @@ size_t SqlStmt_NumColumns(SqlStmt* self) return 0; } - - /// Binds the result of a column to a buffer. int SqlStmt_BindColumn(SqlStmt *self, size_t idx, enum SqlDataType buffer_type, void *buffer, size_t buffer_len, uint32 *out_length, int8 *out_is_null) { if (self == NULL) @@ -796,8 +718,6 @@ int SqlStmt_BindColumn(SqlStmt *self, size_t idx, enum SqlDataType buffer_type, } } - - /// Returns the number of rows in the result. uint64 SqlStmt_NumRows(SqlStmt* self) { @@ -807,8 +727,6 @@ uint64 SqlStmt_NumRows(SqlStmt* self) return 0; } - - /// Fetches the next row. int SqlStmt_NextRow(SqlStmt* self) { @@ -892,8 +810,6 @@ int SqlStmt_NextRow(SqlStmt* self) return SQL_SUCCESS; } - - /// Frees the result of the statement execution. void SqlStmt_FreeResult(SqlStmt* self) { @@ -901,8 +817,6 @@ void SqlStmt_FreeResult(SqlStmt* self) mysql_stmt_free_result(self->stmt); } - - /// Shows debug information (with statement). void SqlStmt_ShowDebug_(SqlStmt* self, const char* debug_file, const unsigned long debug_line) { @@ -914,8 +828,6 @@ void SqlStmt_ShowDebug_(SqlStmt* self, const char* debug_file, const unsigned lo ShowDebug("at %s:%lu\n", debug_file, debug_line); } - - /// Frees a SqlStmt returned by SqlStmt_Malloc. void SqlStmt_Free(SqlStmt* self) { diff --git a/src/common/sql.h b/src/common/sql.h index 7fb4aabe8..fc1562347 100644 --- a/src/common/sql.h +++ b/src/common/sql.h @@ -142,8 +142,6 @@ struct sql_interface { /// Allocates and initializes a new Sql handle. struct Sql *(*Malloc) (void); - - /////////////////////////////////////////////////////////////////////////////// // Prepared Statements /////////////////////////////////////////////////////////////////////////////// @@ -157,7 +155,6 @@ struct sql_interface { // 1) SELECT col FROM table WHERE id=? // 2) INSERT INTO table(col1,col2) VALUES(?,?) - /*===================================== SQL Statement interface [Susu] *-------------------------------------*/ @@ -169,8 +166,6 @@ struct sql_interface { /// @return SqlStmt handle or NULL if an error occurred struct SqlStmt* (*StmtMalloc)(Sql* sql); - - /// Prepares the statement. /// Any previous result is freed and all parameter bindings are removed. /// The query is constructed as if it was sprintf. @@ -185,8 +180,6 @@ struct sql_interface { /// @return SQL_SUCCESS or SQL_ERROR int (*StmtPrepareV)(SqlStmt* self, const char* query, va_list args); - - /// Prepares the statement. /// Any previous result is freed and all parameter bindings are removed. /// The query is used directly. @@ -194,15 +187,11 @@ struct sql_interface { /// @return SQL_SUCCESS or SQL_ERROR int (*StmtPrepareStr)(SqlStmt* self, const char* query); - - /// Returns the number of parameters in the prepared statement. /// /// @return Number or parameters size_t (*StmtNumParams)(SqlStmt* self); - - /// Binds a parameter to a buffer. /// The buffer data will be used when the statement is executed. /// All parameters should have bindings. @@ -210,30 +199,22 @@ struct sql_interface { /// @return SQL_SUCCESS or SQL_ERROR int (*StmtBindParam)(SqlStmt* self, size_t idx, SqlDataType buffer_type, void* buffer, size_t buffer_len); - - /// Executes the prepared statement. /// Any previous result is freed and all column bindings are removed. /// /// @return SQL_SUCCESS or SQL_ERROR int (*StmtExecute)(SqlStmt* self); - - /// Returns the number of the AUTO_INCREMENT column of the last INSERT/UPDATE statement. /// /// @return Value of the auto-increment column uint64 (*StmtLastInsertId)(SqlStmt* self); - - /// Returns the number of columns in each row of the result. /// /// @return Number of columns size_t (*StmtNumColumns)(SqlStmt* self); - - /// Binds the result of a column to a buffer. /// The buffer will be filled with data when the next row is fetched. /// For string/enum buffer types there has to be enough space for the data @@ -242,23 +223,17 @@ struct sql_interface { /// @return SQL_SUCCESS or SQL_ERROR int (*StmtBindColumn)(SqlStmt* self, size_t idx, SqlDataType buffer_type, void* buffer, size_t buffer_len, uint32* out_length, int8* out_is_null); - - /// Returns the number of rows in the result. /// /// @return Number of rows uint64 (*StmtNumRows)(SqlStmt* self); - - /// Fetches the next row. /// All column bindings will be filled with data. /// /// @return SQL_SUCCESS, SQL_ERROR or SQL_NO_DATA int (*StmtNextRow)(SqlStmt* self); - - /// Frees the result of the statement execution. void (*StmtFreeResult)(SqlStmt* self); diff --git a/src/common/strlib.c b/src/common/strlib.c index 024b73e59..fcd1b483b 100644 --- a/src/common/strlib.c +++ b/src/common/strlib.c @@ -423,8 +423,6 @@ bool strlib_bin2hex(char *output, unsigned char *input, size_t count) return true; } - - ///////////////////////////////////////////////////////////////////// /// Parses a single field in a delim-separated string. /// The delimiter after the field is skipped. @@ -582,7 +580,6 @@ int sv_parse_next(struct s_svstate* svstate) return 1; } - /// Parses a delim-separated string. /// Starts parsing at startoff and fills the pos array with position pairs. /// out_pos[0] and out_pos[1] are the start and end of line. @@ -892,7 +889,6 @@ const char* skip_escaped_c(const char* p) { return p; } - /// Opens and parses a file containing delim-separated columns, feeding them to the specified callback function row by row. /// Tracks the progress of the operation (current line number, number of successfully processed rows). /// Returns 'true' if it was able to process the specified file, or 'false' if it could not be read. @@ -970,7 +966,6 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc return true; } - ///////////////////////////////////////////////////////////////////// // StringBuf - dynamic string // diff --git a/src/common/thread.c b/src/common/thread.c index 9b9308d06..d5bbd7f97 100644 --- a/src/common/thread.c +++ b/src/common/thread.c @@ -48,12 +48,10 @@ struct rAthread { #endif }; - #ifdef HAS_TLS __thread int g_rathread_ID = -1; #endif - /// /// Subystem Code /// @@ -76,8 +74,6 @@ void rathread_init(void) { }//end: rathread_init() - - void rathread_final(void) { register unsigned int i; @@ -94,8 +90,6 @@ void rathread_final(void) { }//end: rathread_final() - - // gets called whenever a thread terminated .. static void rat_thread_terminated(rAthread *handle) { // Preserve handle->myID and handle->hThread, set everything else to its default value @@ -131,7 +125,6 @@ static void *raThreadMainRedirector( void *p ){ #endif - ret = ((rAthread*)p)->proc( ((rAthread*)p)->param ) ; #ifdef WIN32 @@ -146,10 +139,6 @@ static void *raThreadMainRedirector( void *p ){ #endif }//end: raThreadMainRedirector() - - - - /// /// API Level /// @@ -157,7 +146,6 @@ rAthread *rathread_create(rAthreadProc entryPoint, void *param) { return rathread_createEx( entryPoint, param, (1<<23) /*8MB*/, RAT_PRIO_NORMAL ); }//end: rathread_create() - rAthread *rathread_createEx(rAthreadProc entryPoint, void *param, size_t szStack, RATHREAD_PRIO prio) { #ifndef WIN32 pthread_attr_t attr; @@ -166,13 +154,11 @@ rAthread *rathread_createEx(rAthreadProc entryPoint, void *param, size_t szStack unsigned int i; rAthread *handle = NULL; - // given stacksize aligned to systems pagesize? tmp = szStack % sysinfo->getpagesize(); if(tmp != 0) szStack += tmp; - // Get a free Thread Slot. for(i = 0; i < RA_THREADS_MAX; i++){ if(l_threads[i].proc == NULL){ @@ -208,7 +194,6 @@ rAthread *rathread_createEx(rAthreadProc entryPoint, void *param, size_t szStack return handle; }//end: rathread_createEx - void rathread_destroy(rAthread *handle) { #ifdef WIN32 if( TerminateThread(handle->hThread, 0) != FALSE){ @@ -253,7 +238,6 @@ rAthread *rathread_self(void) { return NULL; }//end: rathread_self() - int rathread_get_tid(void) { #ifdef HAS_TLS @@ -269,7 +253,6 @@ int rathread_get_tid(void) { }//end: rathread_get_tid() - bool rathread_wait(rAthread *handle, void **out_exitCode) { // Hint: // no thread data cleanup routine call here! @@ -286,18 +269,15 @@ bool rathread_wait(rAthread *handle, void **out_exitCode) { }//end: rathread_wait() - void rathread_prio_set(rAthread *handle, RATHREAD_PRIO prio) { handle->prio = RAT_PRIO_NORMAL; //@TODO }//end: rathread_prio_set() - RATHREAD_PRIO rathread_prio_get(rAthread *handle) { return handle->prio; }//end: rathread_prio_get() - void rathread_yield(void) { #ifdef WIN32 SwitchToThread(); diff --git a/src/common/utils.c b/src/common/utils.c index 3606c6755..f5eecb65d 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -60,7 +60,6 @@ void WriteDump(FILE* fp, const void* buffer, size_t length) } } - /// Dumps given buffer on the console. void ShowDump(const void *buffer, size_t length) { size_t i; @@ -86,7 +85,6 @@ void ShowDump(const void *buffer, size_t length) { } } - #ifdef WIN32 static char* checkpath(char *path, const char *srcpath) @@ -137,7 +135,6 @@ void findfile(const char *p, const char *pat, void (func)(const char*)) func( tmppath ); } - if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { findfile(tmppath, pat, func); @@ -155,7 +152,7 @@ static char* checkpath(char *path, const char*srcpath) { // just make sure the char*path is not const char *p=path; - + if(NULL!=path && NULL!=srcpath) { while(*srcpath) { if (*srcpath=='\\') { @@ -349,7 +346,6 @@ const char* timestamp2string(char* str, size_t size, time_t timestamp, const cha return str; } - /* [Ind/Hercules] Caching */ bool HCache_check(const char *file) { diff --git a/src/config/core.h b/src/config/core.h index da9296bda..3832b185e 100644 --- a/src/config/core.h +++ b/src/config/core.h @@ -64,7 +64,6 @@ /// Uncomment to enable real-time server stats (in and out data and ram usage). [Ai4rei] //#define SHOW_SERVER_STATS - /// Comment to disable autotrade persistency (where autotrading merchants survive server restarts) #define AUTOTRADE_PERSISTENCY diff --git a/src/map/HPMmap.c b/src/map/HPMmap.c index a59fbb6ef..ac78e8c84 100644 --- a/src/map/HPMmap.c +++ b/src/map/HPMmap.c @@ -128,6 +128,10 @@ bool HPM_map_grabHPData(struct HPDataOperationStorage *ret, enum HPluginDataType ret->HPDataSRCPtr = (void**)(&((struct battleground_data *)ptr)->hdata); ret->hdatac = &((struct battleground_data *)ptr)->hdatac; break; + case HPDT_AUTOTRADE_VEND: + ret->HPDataSRCPtr = (void**)(&((struct autotrade_vending *)ptr)->hdata); + ret->hdatac = &((struct autotrade_vending *)ptr)->hdatac; + break; default: return false; } @@ -143,27 +147,27 @@ void HPM_map_plugin_load_sub(struct hplugin *plugin) { bool HPM_map_add_atcommand(char *name, AtCommandFunc func) { unsigned int i = 0; - + for(i = 0; i < atcommand_list_items; i++) { if( !strcmpi(atcommand_list[i].name,name) ) { ShowDebug("HPM_map_add_atcommand: duplicate command '%s', skipping...\n", name); return false; } } - + i = atcommand_list_items; - + RECREATE(atcommand_list, struct HPM_atcommand_list , ++atcommand_list_items); - + safestrncpy(atcommand_list[i].name, name, sizeof(atcommand_list[i].name)); atcommand_list[i].func = func; - + return true; } void HPM_map_atcommands(void) { unsigned int i; - + for(i = 0; i < atcommand_list_items; i++) { atcommand->add(atcommand_list[i].name,atcommand_list[i].func,true); } @@ -174,9 +178,9 @@ void HPM_map_atcommands(void) { **/ void HPM_map_add_group_permission(unsigned int pluginID, char *name, unsigned int *mask) { unsigned char index = pcg->HPMpermissions_count; - + RECREATE(pcg->HPMpermissions, struct pc_groups_new_permission, ++pcg->HPMpermissions_count); - + pcg->HPMpermissions[index].pID = pluginID; pcg->HPMpermissions[index].name = aStrdup(name); pcg->HPMpermissions[index].mask = mask; @@ -203,6 +207,5 @@ void HPM_map_do_final(void) { } aFree(pcg->HPMpermissions); } - HPM->datacheck_final(); } diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 105f3304c..15422a74a 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -67,6 +67,7 @@ static char atcmd_player_name[NAME_LENGTH]; struct atcmd_binding_data* get_atcommandbind_byname(const char* name) { int i = 0; + nullpo_retr(NULL, name); if( *name == atcommand->at_symbol || *name == atcommand->char_symbol ) name++; // for backwards compatibility @@ -76,18 +77,16 @@ struct atcmd_binding_data* get_atcommandbind_byname(const char* name) { } const char* atcommand_msgsd(struct map_session_data *sd, int msg_number) { - if( !(msg_number >= 0 && msg_number < MAX_MSG) ) - return "??"; - if( !sd || sd->lang_id >= atcommand->max_message_table || !atcommand->msg_table[sd->lang_id][msg_number] ) + Assert_retr("??", msg_number >= 0 && msg_number < MAX_MSG); + if (!sd || sd->lang_id >= atcommand->max_message_table || !atcommand->msg_table[sd->lang_id][msg_number]) return atcommand->msg_table[0][msg_number]; return atcommand->msg_table[sd->lang_id][msg_number]; } const char* atcommand_msgfd(int fd, int msg_number) { struct map_session_data *sd = sockt->session_is_valid(fd) ? sockt->session[fd]->session_data : NULL; - if( !(msg_number >= 0 && msg_number < MAX_MSG) ) - return "??"; - if( !sd || sd->lang_id >= atcommand->max_message_table || !atcommand->msg_table[sd->lang_id][msg_number] ) + Assert_retr("??", msg_number >= 0 && msg_number < MAX_MSG); + if (!sd || sd->lang_id >= atcommand->max_message_table || !atcommand->msg_table[sd->lang_id][msg_number]) return atcommand->msg_table[0][msg_number]; return atcommand->msg_table[sd->lang_id][msg_number]; } @@ -96,13 +95,12 @@ const char* atcommand_msgfd(int fd, int msg_number) { // Return the message string of the specified number by [Yor] //----------------------------------------------------------- const char* atcommand_msg(int msg_number) { - if (msg_number >= 0 && msg_number < MAX_MSG) { - if(atcommand->msg_table[map->default_lang_id][msg_number] != NULL && atcommand->msg_table[map->default_lang_id][msg_number][0] != '\0') - return atcommand->msg_table[map->default_lang_id][msg_number]; - - if(atcommand->msg_table[0][msg_number] != NULL && atcommand->msg_table[0][msg_number][0] != '\0') - return atcommand->msg_table[0][msg_number]; - } + Assert_retr("??", msg_number >= 0 && msg_number < MAX_MSG); + if (atcommand->msg_table[map->default_lang_id][msg_number] != NULL && atcommand->msg_table[map->default_lang_id][msg_number][0] != '\0') + return atcommand->msg_table[map->default_lang_id][msg_number]; + + if(atcommand->msg_table[0][msg_number] != NULL && atcommand->msg_table[0][msg_number][0] != '\0') + return atcommand->msg_table[0][msg_number]; return "??"; } @@ -120,11 +118,12 @@ bool msg_config_read(const char *cfg_name, bool allow_override) { FILE *fp; static int called = 1; + nullpo_retr(false, cfg_name); if ((fp = fopen(cfg_name, "r")) == NULL) { ShowError("Messages file not found: %s\n", cfg_name); return false; } - + if( !atcommand->max_message_table ) atcommand->expand_message_table(); @@ -135,7 +134,7 @@ bool msg_config_read(const char *cfg_name, bool allow_override) { continue; if (strcmpi(w1, "import") == 0) { - msg_config_read(w2, true); + atcommand->msg_read(w2, true); } else { msg_number = atoi(w1); if (msg_number >= 0 && msg_number < MAX_MSG) { @@ -153,9 +152,8 @@ bool msg_config_read(const char *cfg_name, bool allow_override) { } } } - fclose(fp); - + if( ++called == 1 ) { //Original if( script->lang_export_fp ) { int i; @@ -179,7 +177,7 @@ bool msg_config_read(const char *cfg_name, bool allow_override) { *------------------------------------------*/ void do_final_msg(void) { int i, j; - + for(i = 0; i < atcommand->max_message_table; i++) { for (j = 0; j < MAX_MSG; j++) { if( atcommand->msg_table[i][j] ) @@ -187,7 +185,7 @@ void do_final_msg(void) { } aFree(atcommand->msg_table[i]); } - + if( atcommand->msg_table ) aFree(atcommand->msg_table); } @@ -199,8 +197,6 @@ static inline const char* atcommand_help_string(AtCommandInfo *info) { return info->help; } - - /*========================================== * @send (used for testing packet sends from the client) *------------------------------------------*/ @@ -210,8 +206,8 @@ ACMD(send) long num; // read message type as hex number (without the 0x) - if (!message || !*message - || !((sscanf(message, "len %x", &type)==1 && (len=1)) + if (!*message + || !((sscanf(message, "len %x", &type)==1 && (len=1, true)) || sscanf(message, "%x", &type)==1) ) { clif->message(fd, msg_fd(fd,900)); // Usage: @@ -223,7 +219,7 @@ ACMD(send) #define PARSE_ERROR(error,p) do {\ clif->message(fd, (error));\ - sprintf(atcmd_output, ">%s", (p));\ + safesnprintf(atcmd_output, sizeof(atcmd_output), ">%s", (p));\ clif->message(fd, atcmd_output);\ } while(0) //define PARSE_ERROR @@ -246,19 +242,19 @@ ACMD(send) }\ } while(0) //define GET_VALUE - if (type > 0 && type < MAX_PACKET_DB) { + if (type >= MIN_PACKET_DB && type <= MAX_PACKET_DB) { int off = 2; if (len) { // show packet length - sprintf(atcmd_output, msg_fd(fd,904), type, packet_db[type].len); // Packet 0x%x length: %d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,904), type, clif->packet(type)->len); // Packet 0x%x length: %d clif->message(fd, atcmd_output); return true; } - len=packet_db[type].len; + len = clif->packet(type)->len; if (len == 0) { // unknown packet - ERROR - sprintf(atcmd_output, msg_fd(fd,905), type); // Unknown packet: 0x%x + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,905), type); // Unknown packet: 0x%x clif->message(fd, atcmd_output); return false; } else if (len == -1) { @@ -406,7 +402,7 @@ ACMD(send) SKIP_VALUE(message); } - if(packet_db[type].len == -1) {// send dynamic packet + if (clif->packet(type)->len == -1) { // send dynamic packet WFIFOW(sd->fd,2)=TOW(off); WFIFOSET(sd->fd,off); } else {// send static packet @@ -438,9 +434,9 @@ ACMD(mapmove) { memset(map_name, '\0', sizeof(map_name)); - if (!message || !*message || - (sscanf(message, "%15s %hd %hd", map_name, &x, &y) < 3 && - sscanf(message, "%15[^,],%hd,%hd", map_name, &x, &y) < 1)) { + if (!*message || + (sscanf(message, "%15s %5hd %5hd", map_name, &x, &y) < 3 && + sscanf(message, "%15[^,],%5hd,%5hd", map_name, &x, &y) < 1)) { clif->message(fd, msg_fd(fd,909)); // Please enter a map (usage: @warp/@rura/@mapmove <mapname> <x> <y>). return false; } @@ -459,7 +455,7 @@ ACMD(mapmove) { return false; } - if ((x || y) && map->getcell(m, x, y, CELL_CHKNOPASS) && pc_get_group_level(sd) < battle_config.gm_ignore_warpable_area) { + if ((x || y) && map->getcell(m, &sd->bl, x, y, CELL_CHKNOPASS) && pc_get_group_level(sd) < battle_config.gm_ignore_warpable_area) { //This is to prevent the pc->setpos call from printing an error. clif->message(fd, msg_fd(fd,2)); if (!map->search_freecell(NULL, m, &x, &y, 10, 10, 1)) @@ -490,7 +486,7 @@ ACMD(where) { memset(atcmd_player_name, '\0', sizeof atcmd_player_name); - if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,910)); // Please enter a player name (usage: @where <char name>). return false; } @@ -516,7 +512,7 @@ ACMD(where) { ACMD(jumpto) { struct map_session_data *pl_sd = NULL; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,911)); // Please enter a player name (usage: @jumpto/@warpto/@goto <char name/ID>). return false; } @@ -547,7 +543,7 @@ ACMD(jumpto) { } pc->setpos(sd, pl_sd->mapindex, pl_sd->bl.x, pl_sd->bl.y, CLR_TELEPORT); - sprintf(atcmd_output, msg_fd(fd,4), pl_sd->status.name); // Jumped to %s + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,4), pl_sd->status.name); // Jumped to %s clif->message(fd, atcmd_output); return true; @@ -562,7 +558,7 @@ ACMD(jump) memset(atcmd_output, '\0', sizeof(atcmd_output)); - sscanf(message, "%hd %hd", &x, &y); + sscanf(message, "%5hd %5hd", &x, &y); if (map->list[sd->bl.m].flag.noteleport && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE)) { clif->message(fd, msg_fd(fd,248)); // You are not authorized to warp from your current map. @@ -574,20 +570,20 @@ ACMD(jump) return false; } - if ((x || y) && map->getcell(sd->bl.m, x, y, CELL_CHKNOPASS)) { + if ((x || y) && map->getcell(sd->bl.m, &sd->bl, x, y, CELL_CHKNOPASS)) { //This is to prevent the pc->setpos call from printing an error. clif->message(fd, msg_fd(fd,2)); if (!map->search_freecell(NULL, sd->bl.m, &x, &y, 10, 10, 1)) x = y = 0; //Invalid cell, use random spot. } - if( x && y && sd->bl.x == x && sd->bl.y == y ) { + if (x && y && sd->bl.x == x && sd->bl.y == y) { clif->message(fd, msg_fd(fd,253)); // You already are at your destination! return false; } pc->setpos(sd, sd->mapindex, x, y, CLR_TELEPORT); - sprintf(atcmd_output, msg_fd(fd,5), sd->bl.x, sd->bl.y); // Jumped to %d %d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,5), sd->bl.x, sd->bl.y); // Jumped to %d %d clif->message(fd, atcmd_output); return true; } @@ -735,18 +731,18 @@ ACMD(whogm) if (pl_level > level) { if (pc_isinvisible(pl_sd)) continue; - sprintf(atcmd_output, msg_fd(fd,913), pl_sd->status.name); // Name: %s (GM) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,913), pl_sd->status.name); // Name: %s (GM) clif->message(fd, atcmd_output); count++; continue; } - sprintf(atcmd_output, msg_fd(fd,914), // Name: %s (GM:%d) | Location: %s %d %d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,914), // Name: %s (GM:%d) | Location: %s %d %d pl_sd->status.name, pl_level, mapindex_id2name(pl_sd->mapindex), pl_sd->bl.x, pl_sd->bl.y); clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,915), // BLvl: %d | Job: %s (Lvl: %d) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,915), // BLvl: %d | Job: %s (Lvl: %d) pl_sd->status.base_level, pc->job_name(pl_sd->status.class_), pl_sd->status.job_level); clif->message(fd, atcmd_output); @@ -754,7 +750,7 @@ ACMD(whogm) p = party->search(pl_sd->status.party_id); g = pl_sd->guild; - sprintf(atcmd_output,msg_fd(fd,916), // Party: '%s' | Guild: '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,916), // Party: '%s' | Guild: '%s' p?p->party.name:msg_fd(fd,917), g?g->name:msg_fd(fd,917)); // None. clif->message(fd, atcmd_output); @@ -767,7 +763,7 @@ ACMD(whogm) else if (count == 1) clif->message(fd, msg_fd(fd,151)); // 1 GM found. else { - sprintf(atcmd_output, msg_fd(fd,152), count); // %d GMs found. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,152), count); // %d GMs found. clif->message(fd, atcmd_output); } @@ -821,8 +817,8 @@ ACMD(speed) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%d", &speed) < 1) { - sprintf(atcmd_output, msg_fd(fd,918), MIN_WALK_SPEED, MAX_WALK_SPEED); // Please enter a speed value (usage: @speed <%d-%d>). + if (!*message || sscanf(message, "%12d", &speed) < 1) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,918), MIN_WALK_SPEED, MAX_WALK_SPEED); // Please enter a speed value (usage: @speed <%d-%d>). clif->message(fd, atcmd_output); return false; } @@ -863,7 +859,6 @@ ACMD(storage) return true; } - /*========================================== * *------------------------------------------*/ @@ -903,7 +898,7 @@ ACMD(option) { int param1 = 0, param2 = 0, param3 = 0; - if (!message || !*message || sscanf(message, "%d %d %d", ¶m1, ¶m2, ¶m3) < 1 || param1 < 0 || param2 < 0 || param3 < 0) + if (!*message || sscanf(message, "%12d %12d %12d", ¶m1, ¶m2, ¶m3) < 1 || param1 < 0 || param2 < 0 || param3 < 0) {// failed to match the parameters so inform the user of the options const char* text; @@ -972,65 +967,64 @@ ACMD(hide) { /*========================================== * Changes a character's class *------------------------------------------*/ -ACMD(jobchange) { +ACMD(jobchange) +{ int job = 0, upper = 0; - const char* text; - - if (!message || !*message || sscanf(message, "%d %d", &job, &upper) < 1) { - upper = 0; + bool found = false; - if( message ) { - int i; - bool found = false; - - // Normal Jobs - for( i = JOB_NOVICE; i < JOB_MAX_BASIC && !found; i++ ) { - if (strncmpi(message, pc->job_name(i), 16) == 0) { - job = i; - found = true; - } - } + if (*message == '\0') { // No message, just show the list + found = false; + } else if (sscanf(message, "%12d %12d", &job, &upper) >= 1) { // Numeric job ID + found = true; + } else { // Job name + int i; - // High Jobs, Babies and Third - for( i = JOB_NOVICE_HIGH; i < JOB_MAX && !found; i++ ){ - if (strncmpi(message, pc->job_name(i), 16) == 0) { - job = i; - found = true; - } + // Normal Jobs + for (i = JOB_NOVICE; !found && i < JOB_MAX_BASIC; i++) { + if (strncmpi(message, pc->job_name(i), 16) == 0) { + job = i; + found = true; + break; } + } - if (!found) { - text = atcommand_help_string(info); - if (text) - clif->messageln(fd, text); - return false; + // High Jobs, Babies and Third + for (i = JOB_NOVICE_HIGH; !found && i < JOB_MAX; i++) { + if (strncmpi(message, pc->job_name(i), 16) == 0) { + job = i; + found = true; + break; } } } - /* WHY DO WE LIST THEM THEN? */ + + if (!found || !pc->db_checkid(job)) { + const char *text = atcommand_help_string(info); + if (text) + clif->messageln(fd, text); + return false; + } + // Deny direct transformation into dummy jobs - if (job == JOB_KNIGHT2 || job == JOB_CRUSADER2 || job == JOB_WEDDING || job == JOB_XMAS || job == JOB_SUMMER - || job == JOB_LORD_KNIGHT2 || job == JOB_PALADIN2 || job == JOB_BABY_KNIGHT2 || job == JOB_BABY_CRUSADER2 || job == JOB_STAR_GLADIATOR2 - || (job >= JOB_RUNE_KNIGHT2 && job <= JOB_MECHANIC_T2) || (job >= JOB_BABY_RUNE2 && job <= JOB_BABY_MECHANIC2) + if (job == JOB_KNIGHT2 || job == JOB_CRUSADER2 + || job == JOB_WEDDING || job == JOB_XMAS || job == JOB_SUMMER + || job == JOB_LORD_KNIGHT2 || job == JOB_PALADIN2 + || job == JOB_BABY_KNIGHT2 || job == JOB_BABY_CRUSADER2 + || job == JOB_STAR_GLADIATOR2 + || (job >= JOB_RUNE_KNIGHT2 && job <= JOB_MECHANIC_T2) + || (job >= JOB_BABY_RUNE2 && job <= JOB_BABY_MECHANIC2) ) { + /* WHY DO WE LIST THEM THEN? */ clif->message(fd, msg_fd(fd,923)); //"You can not change to this job by command." return true; } - if (pc->db_checkid(job)) { - if (pc->jobchange(sd, job, upper) == 0) - clif->message(fd, msg_fd(fd,12)); // Your job has been changed. - else { - clif->message(fd, msg_fd(fd,155)); // You are unable to change your job. - return false; - } - } else { - text = atcommand_help_string(info); - if (text) - clif->messageln(fd, text); + if (pc->jobchange(sd, job, upper) != 0) { + clif->message(fd, msg_fd(fd,155)); // You are unable to change your job. return false; } + clif->message(fd, msg_fd(fd,12)); // Your job has been changed. return true; } @@ -1070,7 +1064,7 @@ ACMD(kami) memset(atcmd_output, '\0', sizeof(atcmd_output)); if(*(info->command + 4) != 'c' && *(info->command + 4) != 'C') { - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,980)); // Please enter a message (usage: @kami <message>). return false; } @@ -1081,7 +1075,7 @@ ACMD(kami) else intif->broadcast(atcmd_output, strlen(atcmd_output) + 1, (*(info->command + 4) == 'b' || *(info->command + 4) == 'B') ? BC_BLUE : BC_YELLOW); } else { - if(!message || !*message || (sscanf(message, "%u %199[^\n]", &color, atcmd_output) < 2)) { + if(!*message || (sscanf(message, "%10u %199[^\n]", &color, atcmd_output) < 2)) { clif->message(fd, msg_fd(fd,981)); // Please enter color and message (usage: @kamic <color> <message>). return false; } @@ -1102,12 +1096,12 @@ ACMD(heal) { int hp = 0, sp = 0; // [Valaris] thanks to fov - sscanf(message, "%d %d", &hp, &sp); + sscanf(message, "%12d %12d", &hp, &sp); // some overflow checks if( hp == INT_MIN ) hp++; if( sp == INT_MIN ) sp++; - + if ( hp == 0 && sp == 0 ) { if (!status_percent_heal(&sd->bl, 100, 100)) clif->message(fd, msg_fd(fd,157)); // HP and SP have already been recovered. @@ -1166,15 +1160,15 @@ ACMD(item) memset(item_name, '\0', sizeof(item_name)); - if (!strcmpi(info->command,"itembound") && (!message || !*message || ( - sscanf(message, "\"%99[^\"]\" %d %d", item_name, &number, &bound) < 2 && - sscanf(message, "%99s %d %d", item_name, &number, &bound) < 2 + if (!strcmpi(info->command,"itembound") && (!*message || ( + sscanf(message, "\"%99[^\"]\" %12d %12d", item_name, &number, &bound) < 2 && + sscanf(message, "%99s %12d %12d", item_name, &number, &bound) < 2 ))) { clif->message(fd, msg_fd(fd,295)); // Please enter an item name or ID (usage: @itembound <item name/ID> <quantity> <bound_type>). return false; - } else if (!message || !*message - || ( sscanf(message, "\"%99[^\"]\" %d", item_name, &number) < 1 - && sscanf(message, "%99s %d", item_name, &number) < 1 + } else if (!*message + || ( sscanf(message, "\"%99[^\"]\" %12d", item_name, &number) < 1 + && sscanf(message, "%99s %12d", item_name, &number) < 1 )) { clif->message(fd, msg_fd(fd,983)); // Please enter an item name or ID (usage: @item <item name/ID> <quantity>). return false; @@ -1257,15 +1251,15 @@ ACMD(item2) memset(item_name, '\0', sizeof(item_name)); - if (!strcmpi(info->command,"itembound2") && (!message || !*message || ( - sscanf(message, "\"%99[^\"]\" %d %d %d %d %d %d %d %d %d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4, &bound) < 10 && - sscanf(message, "%99s %d %d %d %d %d %d %d %d %d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4, &bound) < 10 ))) { + if (!strcmpi(info->command,"itembound2") && (!*message || ( + sscanf(message, "\"%99[^\"]\" %12d %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4, &bound) < 10 && + sscanf(message, "%99s %12d %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4, &bound) < 10 ))) { clif->message(fd, msg_fd(fd,296)); // Please enter all parameters (usage: @itembound2 <item name/ID> <quantity> clif->message(fd, msg_fd(fd,297)); // <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4> <bound_type>). return false; - } else if ( !message || !*message - || ( sscanf(message, "\"%99[^\"]\" %d %d %d %d %d %d %d %d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4) < 9 - && sscanf(message, "%99s %d %d %d %d %d %d %d %d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4) < 9 + } else if (!*message + || ( sscanf(message, "\"%99[^\"]\" %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4) < 9 + && sscanf(message, "%99s %12d %12d %12d %12d %12d %12d %12d %12d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4) < 9 )) { clif->message(fd, msg_fd(fd,984)); // Please enter all parameters (usage: @item2 <item name/ID> <quantity> clif->message(fd, msg_fd(fd,985)); // <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4>). @@ -1361,7 +1355,7 @@ ACMD(baselevelup) { int level=0, i=0, status_point=0; - if (!message || !*message || !(level = atoi(message))) { + if (!*message || !(level = atoi(message))) { clif->message(fd, msg_fd(fd,986)); // Please enter a level adjustment (usage: @lvup/@blevel/@baselvlup <number of levels>). return false; } @@ -1420,7 +1414,7 @@ ACMD(joblevelup) { int level=0; - if (!message || !*message || !(level = atoi(message))) { + if (!*message || !(level = atoi(message))) { clif->message(fd, msg_fd(fd,987)); // Please enter a level adjustment (usage: @joblvup/@jlevel/@joblvlup <number of levels>). return false; } @@ -1470,7 +1464,7 @@ ACMD(help) { char *default_command = "help"; AtCommandInfo *tinfo = NULL; - if (!message || !*message) { + if (!*message) { command_name = default_command; // If no command_name specified, display help for @help. } else { if (*message == atcommand->at_symbol || *message == atcommand->char_symbol) @@ -1479,7 +1473,7 @@ ACMD(help) { } if (!atcommand->can_use2(sd, command_name, COMMAND_ATCOMMAND)) { - sprintf(atcmd_output, msg_fd(fd,153), message); // "%s is Unknown Command" + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,153), message); // "%s is Unknown Command" clif->message(fd, atcmd_output); atcommand->get_suggestions(sd, command_name, true); return false; @@ -1488,13 +1482,13 @@ ACMD(help) { tinfo = atcommand->get_info_byname(atcommand->check_alias(command_name)); if ( !tinfo || tinfo->help == NULL ) { - sprintf(atcmd_output, msg_fd(fd,988), atcommand->at_symbol, command_name); // There is no help for %c%s. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,988), atcommand->at_symbol, command_name); // There is no help for %c%s. clif->message(fd, atcmd_output); atcommand->get_suggestions(sd, command_name, true); return false; } - sprintf(atcmd_output, msg_fd(fd,989), atcommand->at_symbol, command_name); // Help for command %c%s: + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,989), atcommand->at_symbol, command_name); // Help for command %c%s: clif->message(fd, atcmd_output); { // Display aliases @@ -1525,25 +1519,37 @@ ACMD(help) { return true; } -// helper function, used in foreach calls to stop auto-attack timers -// parameter: '0' - everyone, 'id' - only those attacking someone with that id +/** + * Helper function, used in foreach calls to stop auto-attack timers. + * + * @see map_foreachinmap + * + * Arglist parameters: + * - (int) id: If 0, stop any attacks. Otherwise, the target block list id to stop attacking. + */ int atcommand_stopattack(struct block_list *bl,va_list ap) { - struct unit_data *ud = unit->bl2ud(bl); - int id = va_arg(ap, int); - if (ud && ud->attacktimer != INVALID_TIMER && (!id || id == ud->target)) - { + struct unit_data *ud = NULL; + int id = 0; + nullpo_ret(bl); + + ud = unit->bl2ud(bl); + id = va_arg(ap, int); + + if (ud && ud->attacktimer != INVALID_TIMER && (!id || id == ud->target)) { unit->stop_attack(bl); return 1; } return 0; } + /*========================================== * *------------------------------------------*/ int atcommand_pvpoff_sub(struct block_list *bl,va_list ap) { TBL_PC* sd = (TBL_PC*)bl; + nullpo_ret(bl); clif->pvpset(sd, 0, 0, 2); if (sd->pvp_timer != INVALID_TIMER) { timer->delete(sd->pvp_timer, pc->calc_pvprank_timer); @@ -1578,6 +1584,7 @@ ACMD(pvpoff) int atcommand_pvpon_sub(struct block_list *bl,va_list ap) { TBL_PC* sd = (TBL_PC*)bl; + nullpo_ret(bl); if (sd->pvp_timer == INVALID_TIMER) { sd->pvp_timer = timer->add(timer->gettick() + 200, pc->calc_pvprank_timer, sd->bl.id, 0); sd->pvp_rank = 0; @@ -1658,8 +1665,8 @@ ACMD(model) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%d %d %d", &hair_style, &hair_color, &cloth_color) < 1) { - sprintf(atcmd_output, msg_fd(fd,991), // Please enter at least one value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>). + if (!*message || sscanf(message, "%12d %12d %12d", &hair_style, &hair_color, &cloth_color) < 1) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,991), // Please enter at least one value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>). MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); clif->message(fd, atcmd_output); return false; @@ -1689,8 +1696,8 @@ ACMD(dye) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%d", &cloth_color) < 1) { - sprintf(atcmd_output, msg_fd(fd,992), MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); // Please enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>). + if (!*message || sscanf(message, "%12d", &cloth_color) < 1) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,992), MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); // Please enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>). clif->message(fd, atcmd_output); return false; } @@ -1715,8 +1722,8 @@ ACMD(hair_style) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%d", &hair_style) < 1) { - sprintf(atcmd_output, msg_fd(fd,993), MIN_HAIR_STYLE, MAX_HAIR_STYLE); // Please enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>). + if (!*message || sscanf(message, "%12d", &hair_style) < 1) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,993), MIN_HAIR_STYLE, MAX_HAIR_STYLE); // Please enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>). clif->message(fd, atcmd_output); return false; } @@ -1741,8 +1748,8 @@ ACMD(hair_color) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%d", &hair_color) < 1) { - sprintf(atcmd_output, msg_fd(fd,994), MIN_HAIR_COLOR, MAX_HAIR_COLOR); // Please enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>). + if (!*message || sscanf(message, "%12d", &hair_color) < 1) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,994), MIN_HAIR_COLOR, MAX_HAIR_COLOR); // Please enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>). clif->message(fd, atcmd_output); return false; } @@ -1815,7 +1822,7 @@ ACMD(go) { memset(map_name, '\0', sizeof(map_name)); memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%11s", map_name) < 1) { + if (!*message || sscanf(message, "%11s", map_name) < 1) { // no value matched so send the list of locations const char* text; @@ -1824,7 +1831,7 @@ ACMD(go) { clif->message(fd, msg_fd(fd,38)); // Invalid location number, or name. - if( text ) {// send the text to the client + if (text) { // send the text to the client clif->messageln( fd, text ); } @@ -1915,18 +1922,18 @@ ACMD(monster) memset(monster, '\0', sizeof(monster)); memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,80)); // Please specify a display name or monster name/id. return false; } - if (sscanf(message, "\"%23[^\"]\" %23s %d", name, monster, &number) > 1 || - sscanf(message, "%23s \"%23[^\"]\" %d", monster, name, &number) > 1) { + if (sscanf(message, "\"%23[^\"]\" %23s %12d", name, monster, &number) > 1 || + sscanf(message, "%23s \"%23[^\"]\" %12d", monster, name, &number) > 1) { //All data can be left as it is. - } else if ((count=sscanf(message, "%23s %d %23s", monster, &number, name)) > 1) { + } else if ((count=sscanf(message, "%23s %12d %23s", monster, &number, name)) > 1) { //Here, it is possible name was not given and we are using monster for it. if (count < 3) //Blank mob's name. name[0] = '\0'; - } else if (sscanf(message, "%23s %23s %d", name, monster, &number) > 1) { + } else if (sscanf(message, "%23s %23s %12d", name, monster, &number) > 1) { //All data can be left as it is. } else if (sscanf(message, "%23s", monster) > 0) { //As before, name may be already filled. @@ -1947,7 +1954,7 @@ ACMD(monster) if (number <= 0) number = 1; - if( !name[0] ) + if (!name[0]) strcpy(name, "--ja--"); // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive @@ -1977,7 +1984,7 @@ ACMD(monster) if (number == count) clif->message(fd, msg_fd(fd,39)); // All monster summoned! else { - sprintf(atcmd_output, msg_fd(fd,240), count); // %d monster(s) summoned! + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,240), count); // %d monster(s) summoned! clif->message(fd, atcmd_output); } else { @@ -1993,12 +2000,10 @@ ACMD(monster) *------------------------------------------*/ int atkillmonster_sub(struct block_list *bl, va_list ap) { - struct mob_data *md; - int flag; - - nullpo_ret(md=(struct mob_data *)bl); - flag = va_arg(ap, int); + struct mob_data *md = (struct mob_data *)bl; + int flag = va_arg(ap, int); + nullpo_ret(bl); if (md->guardian_data) return 0; //Do not touch WoE mobs! @@ -2015,9 +2020,9 @@ ACMD(killmonster) { memset(map_name, '\0', sizeof(map_name)); - if (!message || !*message || sscanf(message, "%15s", map_name) < 1) + if (!*message || sscanf(message, "%15s", map_name) < 1) { map_id = sd->bl.m; - else { + } else { if ((map_id = map->mapname2mapid(map_name)) < 0) map_id = sd->bl.m; } @@ -2041,27 +2046,27 @@ ACMD(refine) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%d %d", &position, &refine) < 2) { + if (!*message || sscanf(message, "%12d %12d", &position, &refine) < 2) { clif->message(fd, msg_fd(fd,996)); // Please enter a position and an amount (usage: @refine <equip position> <+/- amount>). - sprintf(atcmd_output, msg_fd(fd,997), EQP_HEAD_LOW); // %d: Lower Headgear + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,997), EQP_HEAD_LOW); // %d: Lower Headgear clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,998), EQP_HAND_R); // %d: Right Hand + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,998), EQP_HAND_R); // %d: Right Hand clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,999), EQP_GARMENT); // %d: Garment + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,999), EQP_GARMENT); // %d: Garment clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1000), EQP_ACC_L); // %d: Left Accessory + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1000), EQP_ACC_L); // %d: Left Accessory clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1001), EQP_ARMOR); // %d: Body Armor + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1001), EQP_ARMOR); // %d: Body Armor clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1002), EQP_HAND_L); // %d: Left Hand + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1002), EQP_HAND_L); // %d: Left Hand clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1003), EQP_SHOES); // %d: Shoes + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1003), EQP_SHOES); // %d: Shoes clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1004), EQP_ACC_R); // %d: Right Accessory + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1004), EQP_ACC_R); // %d: Right Accessory clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1005), EQP_HEAD_TOP); // %d: Top Headgear + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1005), EQP_HEAD_TOP); // %d: Top Headgear clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1006), EQP_HEAD_MID); // %d: Mid Headgear + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1006), EQP_HEAD_MID); // %d: Mid Headgear clif->message(fd, atcmd_output); return false; } @@ -2103,7 +2108,7 @@ ACMD(refine) else if (count == 1) clif->message(fd, msg_fd(fd,167)); // 1 item has been refined. else { - sprintf(atcmd_output, msg_fd(fd,168), count); // %d items have been refined. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,168), count); // %d items have been refined. clif->message(fd, atcmd_output); } @@ -2123,9 +2128,9 @@ ACMD(produce) memset(atcmd_output, '\0', sizeof(atcmd_output)); memset(item_name, '\0', sizeof(item_name)); - if (!message || !*message || ( - sscanf(message, "\"%99[^\"]\" %d %d", item_name, &attribute, &star) < 1 && - sscanf(message, "%99s %d %d", item_name, &attribute, &star) < 1 + if (!*message || ( + sscanf(message, "\"%99[^\"]\" %12d %12d", item_name, &attribute, &star) < 1 && + sscanf(message, "%99s %12d %12d", item_name, &attribute, &star) < 1 )) { clif->message(fd, msg_fd(fd,1007)); // Please enter at least one item name/ID (usage: @produce <equip name/ID> <element> <# of very's>). return false; @@ -2160,7 +2165,7 @@ ACMD(produce) if ((flag = pc->additem(sd, &tmp_item, 1, LOG_TYPE_COMMAND))) clif->additem(sd, 0, 0, flag); } else { - sprintf(atcmd_output, msg_fd(fd,169), item_id, item_data->name); // The item (%d: '%s') is not equipable. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,169), item_id, item_data->name); // The item (%d: '%s') is not equipable. clif->message(fd, atcmd_output); return false; } @@ -2177,16 +2182,16 @@ ACMD(memo) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if( !message || !*message || sscanf(message, "%d", &position) < 1 ) + if (!*message || sscanf(message, "%d", &position) < 1) { int i; clif->message(sd->fd, msg_fd(fd,868)); // "Your current memo positions are:" for( i = 0; i < MAX_MEMOPOINTS; i++ ) { if( sd->status.memo_point[i].map ) - sprintf(atcmd_output, "%d - %s (%d,%d)", i, mapindex_id2name(sd->status.memo_point[i].map), sd->status.memo_point[i].x, sd->status.memo_point[i].y); + safesnprintf(atcmd_output, sizeof(atcmd_output), "%d - %s (%d,%d)", i, mapindex_id2name(sd->status.memo_point[i].map), sd->status.memo_point[i].x, sd->status.memo_point[i].y); else - sprintf(atcmd_output, msg_fd(fd,171), i); // %d - void + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,171), i); // %d - void clif->message(sd->fd, atcmd_output); } return true; @@ -2194,7 +2199,7 @@ ACMD(memo) if( position < 0 || position >= MAX_MEMOPOINTS ) { - sprintf(atcmd_output, msg_fd(fd,1008), 0, MAX_MEMOPOINTS-1); // Please enter a valid position (usage: @memo <memo_position:%d-%d>). + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1008), 0, MAX_MEMOPOINTS-1); // Please enter a valid position (usage: @memo <memo_position:%d-%d>). clif->message(fd, atcmd_output); return false; } @@ -2212,13 +2217,13 @@ ACMD(gat) { memset(atcmd_output, '\0', sizeof(atcmd_output)); for (y = 2; y >= -2; y--) { - sprintf(atcmd_output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X", + safesnprintf(atcmd_output, sizeof(atcmd_output), "%s (x= %d, y= %d) %02X %02X %02X %02X %02X", map->list[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y, - map->getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y, CELL_GETTYPE), - map->getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y, CELL_GETTYPE), - map->getcell(sd->bl.m, sd->bl.x, sd->bl.y + y, CELL_GETTYPE), - map->getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y, CELL_GETTYPE), - map->getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y, CELL_GETTYPE)); + map->getcell(sd->bl.m, &sd->bl, sd->bl.x - 2, sd->bl.y + y, CELL_GETTYPE), + map->getcell(sd->bl.m, &sd->bl, sd->bl.x - 1, sd->bl.y + y, CELL_GETTYPE), + map->getcell(sd->bl.m, &sd->bl, sd->bl.x, sd->bl.y + y, CELL_GETTYPE), + map->getcell(sd->bl.m, &sd->bl, sd->bl.x + 1, sd->bl.y + y, CELL_GETTYPE), + map->getcell(sd->bl.m, &sd->bl, sd->bl.x + 2, sd->bl.y + y, CELL_GETTYPE)); clif->message(fd, atcmd_output); } @@ -2233,7 +2238,7 @@ ACMD(displaystatus) { int i, type, flag, tick, val1 = 0, val2 = 0, val3 = 0; - if (!message || !*message || (i = sscanf(message, "%d %d %d %d %d %d", &type, &flag, &tick, &val1, &val2, &val3)) < 1) { + if (!*message || (i = sscanf(message, "%d %d %d %d %d %d", &type, &flag, &tick, &val1, &val2, &val3)) < 1) { clif->message(fd, msg_fd(fd,1009)); // Please enter a status type/flag (usage: @displaystatus <status type> <flag> <tick> {<val1> {<val2> {<val3>}}}). return false; } @@ -2256,7 +2261,7 @@ ACMD(statuspoint) int point; unsigned int new_status_point; - if (!message || !*message || (point = atoi(message)) == 0) { + if (!*message || (point = atoi(message)) == 0) { clif->message(fd, msg_fd(fd,1010)); // Please enter a number (usage: @stpoint <number of points>). return false; } @@ -2304,7 +2309,7 @@ ACMD(skillpoint) int point; unsigned int new_skill_point; - if (!message || !*message || (point = atoi(message)) == 0) { + if (!*message || (point = atoi(message)) == 0) { clif->message(fd, msg_fd(fd,1011)); // Please enter a number (usage: @skpoint <number of points>). return false; } @@ -2351,12 +2356,12 @@ ACMD(zeny) { int zeny=0, ret=-1; - if (!message || !*message || (zeny = atoi(message)) == 0) { + if (!*message || (zeny = atoi(message)) == 0) { clif->message(fd, msg_fd(fd,1012)); // Please enter an amount (usage: @zeny <amount>). return false; } - if(zeny > 0){ + if(zeny > 0) { if((ret=pc->getzeny(sd,zeny,LOG_TYPE_COMMAND,NULL)) == 1) clif->message(fd, msg_fd(fd,149)); // Unable to increase the number/value. } @@ -2384,7 +2389,7 @@ ACMD(param) { memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0) { + if (!*message || sscanf(message, "%d", &value) < 1 || value == 0) { clif->message(fd, msg_fd(fd,1013)); // Please enter a valid value (usage: @str/@agi/@vit/@int/@dex/@luk <+/-adjustment>). return false; } @@ -2448,7 +2453,7 @@ ACMD(stat_all) { stats[4] = &sd->status.dex; stats[5] = &sd->status.luk; - if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0) { + if (!*message || sscanf(message, "%d", &value) < 1 || value == 0) { value = pc_maxparameter(sd); max = pc_maxparameter(sd); } else { @@ -2497,7 +2502,7 @@ ACMD(guildlevelup) { int16 added_level; struct guild *guild_info; - if (!message || !*message || sscanf(message, "%d", &level) < 1 || level == 0) { + if (!*message || sscanf(message, "%d", &level) < 1 || level == 0) { clif->message(fd, msg_fd(fd,1014)); // Please enter a valid level (usage: @guildlvup/@guildlvlup <# of levels>). return false; } @@ -2538,7 +2543,7 @@ ACMD(makeegg) struct item_data *item_data; int id, pet_id; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1015)); // Please enter a monster/egg name/ID (usage: @makeegg <pet>). return false; } @@ -2592,7 +2597,7 @@ ACMD(petfriendly) int friendly; struct pet_data *pd; - if (!message || !*message || (friendly = atoi(message)) < 0) { + if (!*message || (friendly = atoi(message)) < 0) { clif->message(fd, msg_fd(fd,1016)); // Please enter a valid value (usage: @petfriendly <0-1000>). return false; } @@ -2628,7 +2633,7 @@ ACMD(pethungry) int hungry; struct pet_data *pd; - if (!message || !*message || (hungry = atoi(message)) < 0) { + if (!*message || (hungry = atoi(message)) < 0) { clif->message(fd, msg_fd(fd,1017)); // Please enter a valid number (usage: @pethungry <0-100>). return false; } @@ -2684,7 +2689,7 @@ ACMD(petrename) ACMD(recall) { struct map_session_data *pl_sd = NULL; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1018)); // Please enter a player name (usage: @recall <char name/ID>). return false; } @@ -2712,7 +2717,7 @@ ACMD(recall) { return false; } pc->setpos(pl_sd, sd->mapindex, sd->bl.x, sd->bl.y, CLR_RESPAWN); - sprintf(atcmd_output, msg_fd(fd,46), pl_sd->status.name); // %s recalled! + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,46), pl_sd->status.name); // %s recalled! clif->message(fd, atcmd_output); return true; @@ -2727,7 +2732,7 @@ ACMD(char_block) memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,1021)); // Please enter a player name (usage: @block <char name>). return false; } @@ -2763,7 +2768,7 @@ ACMD(char_ban) memset(atcmd_output, '\0', sizeof(atcmd_output)); memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message || sscanf(message, "%255s %23[^\n]", atcmd_output, atcmd_player_name) < 2) { + if (!*message || sscanf(message, "%255s %23[^\n]", atcmd_output, atcmd_player_name) < 2) { clif->message(fd, msg_fd(fd,1022)); // Please enter ban time and a player name (usage: @ban <time> <char name>). return false; } @@ -2842,7 +2847,7 @@ ACMD(char_unblock) { memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,1024)); // Please enter a player name (usage: @unblock <char name>). return false; } @@ -2861,7 +2866,7 @@ ACMD(char_unban) { memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,1025)); // Please enter a player name (usage: @unban <char name>). return false; } @@ -2959,6 +2964,7 @@ ACMD(doommap) *------------------------------------------*/ void atcommand_raise_sub(struct map_session_data* sd) { + nullpo_retv(sd); status->revive(&sd->bl, 100, 100); clif->skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1); @@ -3012,7 +3018,7 @@ ACMD(kick) memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1026)); // Please enter a player name (usage: @kick <char name/ID>). return false; } @@ -3022,7 +3028,7 @@ ACMD(kick) return false; } - if ( pc_get_group_level(sd) < pc_get_group_level(pl_sd) ) + if (pc_get_group_level(sd) < pc_get_group_level(pl_sd)) { clif->message(fd, msg_fd(fd,81)); // Your GM level don't authorize you to do this action on this player. return false; @@ -3042,7 +3048,7 @@ ACMD(kickall) struct s_mapiterator* iter; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { if (pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) { // you can kick only lower or same gm level if (sd->status.account_id != pl_sd->status.account_id) @@ -3076,8 +3082,8 @@ ACMD(questskill) { uint16 skill_id, index; - if (!message || !*message || (skill_id = atoi(message)) <= 0) - {// also send a list of skills applicable to this command + if (!*message || (skill_id = atoi(message)) <= 0) + { // also send a list of skills applicable to this command const char* text; // attempt to find the text corresponding to this command @@ -3118,8 +3124,8 @@ ACMD(lostskill) { uint16 skill_id, index; - if (!message || !*message || (skill_id = atoi(message)) <= 0) - {// also send a list of skills applicable to this command + if (!*message || (skill_id = atoi(message)) <= 0) + { // also send a list of skills applicable to this command const char* text; // attempt to find the text corresponding to this command @@ -3134,7 +3140,7 @@ ACMD(lostskill) return false; } - if ( !( index = skill->get_index(skill_id) ) ) { + if (!( index = skill->get_index(skill_id))) { clif->message(fd, msg_fd(fd,198)); // This skill number doesn't exist. return false; } @@ -3165,7 +3171,7 @@ ACMD(spiritball) max_spiritballs = min(ARRAYLENGTH(sd->spirit_timer), 0x7FFF); - if( !message || !*message || (number = atoi(message)) < 0 || number > max_spiritballs ) + if (!*message || (number = atoi(message)) < 0 || number > max_spiritballs) { char msg[CHAT_SIZE_MAX]; safesnprintf(msg, sizeof(msg), msg_fd(fd,1028), max_spiritballs); // Please enter an amount (usage: @spiritball <number: 0-%d>). @@ -3191,7 +3197,7 @@ ACMD(party) memset(party_name, '\0', sizeof(party_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", party_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", party_name) < 1) { clif->message(fd, msg_fd(fd,1029)); // Please enter a party name (usage: @party <party_name>). return false; } @@ -3211,7 +3217,7 @@ ACMD(guild) memset(guild_name, '\0', sizeof(guild_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", guild_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", guild_name) < 1) { clif->message(fd, msg_fd(fd,1030)); // Please enter a guild name (usage: @guild <guild_name>). return false; } @@ -3227,8 +3233,7 @@ ACMD(guild) ACMD(breakguild) { if (sd->status.guild_id) { // Check if the player has a guild - struct guild *g; - g = sd->guild; // Search the guild + struct guild *g = sd->guild; // Search the guild if (g) { // Check if guild was found if (sd->state.gmaster_flag) { // Check if player is guild master int ret = 0; @@ -3337,24 +3342,24 @@ ACMD(idsearch) memset(item_name, '\0', sizeof(item_name)); memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%99s", item_name) < 0) { + if (!*message || sscanf(message, "%99s", item_name) < 0) { clif->message(fd, msg_fd(fd,1031)); // Please enter part of an item name (usage: @idsearch <part_of_item_name>). return false; } - sprintf(atcmd_output, msg_fd(fd,77), item_name); // Search results for '%s' (name: id): + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,77), item_name); // Search results for '%s' (name: id): clif->message(fd, atcmd_output); match = itemdb->search_name_array(item_array, MAX_SEARCH, item_name, 0); if (match > MAX_SEARCH) { - sprintf(atcmd_output, msg_fd(fd,269), MAX_SEARCH, match); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,269), MAX_SEARCH, match); clif->message(fd, atcmd_output); match = MAX_SEARCH; } for(i = 0; i < match; i++) { - sprintf(atcmd_output, msg_fd(fd,78), item_array[i]->jname, item_array[i]->nameid); // %s: %d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,78), item_array[i]->jname, item_array[i]->nameid); // %s: %d clif->message(fd, atcmd_output); } - sprintf(atcmd_output, msg_fd(fd,79), match); // %d results found. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,79), match); // %d results found. clif->message(fd, atcmd_output); return true; @@ -3378,7 +3383,7 @@ ACMD(recallall) count = 0; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) { + for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { if (sd->status.account_id != pl_sd->status.account_id && pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) { if (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y) continue; // Don't waste time warping the character to the same place. @@ -3397,7 +3402,7 @@ ACMD(recallall) clif->message(fd, msg_fd(fd,92)); // All characters recalled! if (count) { - sprintf(atcmd_output, msg_fd(fd,1033), count); // Because you are not authorized to warp from some maps, %d player(s) have not been recalled. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1033), count); // Because you are not authorized to warp from some maps, %d player(s) have not been recalled. clif->message(fd, atcmd_output); } @@ -3418,7 +3423,7 @@ ACMD(guildrecall) memset(guild_name, '\0', sizeof(guild_name)); memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%23[^\n]", guild_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", guild_name) < 1) { clif->message(fd, msg_fd(fd,1034)); // Please enter a guild name/ID (usage: @guildrecall <guild_name/ID>). return false; } @@ -3438,7 +3443,7 @@ ACMD(guildrecall) count = 0; iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { if (sd->status.account_id != pl_sd->status.account_id && pl_sd->status.guild_id == g->guild_id) { if (pc_get_group_level(pl_sd) > pc_get_group_level(sd) || (pl_sd->bl.m == sd->bl.m && pl_sd->bl.x == sd->bl.x && pl_sd->bl.y == sd->bl.y)) @@ -3451,10 +3456,10 @@ ACMD(guildrecall) } mapit->free(iter); - sprintf(atcmd_output, msg_fd(fd,93), g->name); // All online characters of the %s guild have been recalled to your position. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,93), g->name); // All online characters of the %s guild have been recalled to your position. clif->message(fd, atcmd_output); if (count) { - sprintf(atcmd_output, msg_fd(fd,1033), count); // Because you are not authorized to warp from some maps, %d player(s) have not been recalled. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1033), count); // Because you are not authorized to warp from some maps, %d player(s) have not been recalled. clif->message(fd, atcmd_output); } @@ -3475,7 +3480,7 @@ ACMD(partyrecall) memset(party_name, '\0', sizeof(party_name)); memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message || sscanf(message, "%23[^\n]", party_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", party_name) < 1) { clif->message(fd, msg_fd(fd,1035)); // Please enter a party name/ID (usage: @partyrecall <party_name/ID>). return false; } @@ -3507,10 +3512,10 @@ ACMD(partyrecall) } mapit->free(iter); - sprintf(atcmd_output, msg_fd(fd,95), p->party.name); // All online characters of the %s party have been recalled to your position. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,95), p->party.name); // All online characters of the %s party have been recalled to your position. clif->message(fd, atcmd_output); if (count) { - sprintf(atcmd_output, msg_fd(fd,1033), count); // Because you are not authorized to warp from some maps, %d player(s) have not been recalled. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1033), count); // Because you are not authorized to warp from some maps, %d player(s) have not been recalled. clif->message(fd, atcmd_output); } @@ -3658,7 +3663,7 @@ ACMD(reloadscript) { //atcommand_broadcast( fd, sd, "@broadcast", "You will feel a bit of lag at this point !" ); iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) { + for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { if (pl_sd->npc_id || pl_sd->npc_shopid) { if (pl_sd->state.using_fake_npc) { clif->clearunit_single(pl_sd->npc_id, CLR_OUTSIGHT, pl_sd->fd); @@ -3709,7 +3714,7 @@ ACMD(mapinfo) { memset(mapname, '\0', sizeof(mapname)); memset(direction, '\0', sizeof(direction)); - sscanf(message, "%d %23[^\n]", &list, mapname); + sscanf(message, "%12d %23[^\n]", &list, mapname); if (list < 0 || list > 3) { clif->message(fd, msg_fd(fd,1038)); // Please enter at least one valid list number (usage: @mapinfo <0-3> <map>). @@ -3744,7 +3749,7 @@ ACMD(mapinfo) { } mapit->free(iter); - sprintf(atcmd_output, msg_fd(fd,1040), mapname, map->list[m_id].zone->name, map->list[m_id].users, map->list[m_id].npc_num, chat_num, vend_num); // Map: %s (Zone:%s) | Players: %d | NPCs: %d | Chats: %d | Vendings: %d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1040), mapname, map->list[m_id].zone->name, map->list[m_id].users, map->list[m_id].npc_num, chat_num, vend_num); // Map: %s (Zone:%s) | Players: %d | NPCs: %d | Chats: %d | Vendings: %d clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1041)); // ------ Map Flags ------ if (map->list[m_id].flag.town) @@ -3797,7 +3802,7 @@ ACMD(mapinfo) { strcat(atcmd_output, msg_fd(fd,1064)); // NoMemo | clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1065), // No Exp Penalty: %s | No Zeny Penalty: %s + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1065), // No Exp Penalty: %s | No Zeny Penalty: %s (map->list[m_id].flag.noexppenalty) ? msg_fd(fd,1066) : msg_fd(fd,1067), (map->list[m_id].flag.nozenypenalty) ? msg_fd(fd,1066) : msg_fd(fd,1067)); // On / Off clif->message(fd, atcmd_output); @@ -3806,10 +3811,10 @@ ACMD(mapinfo) { if (!map->list[m_id].save.map) clif->message(fd, msg_fd(fd,1068)); // No Save (Return to last Save Point) else if (map->list[m_id].save.x == -1 || map->list[m_id].save.y == -1 ) { - sprintf(atcmd_output, msg_fd(fd,1069), mapindex_id2name(map->list[m_id].save.map)); // No Save, Save Point: %s,Random + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1069), mapindex_id2name(map->list[m_id].save.map)); // No Save, Save Point: %s,Random clif->message(fd, atcmd_output); } else { - sprintf(atcmd_output, msg_fd(fd,1070), // No Save, Save Point: %s,%d,%d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1070), // No Save, Save Point: %s,%d,%d mapindex_id2name(map->list[m_id].save.map),map->list[m_id].save.x,map->list[m_id].save.y); clif->message(fd, atcmd_output); } @@ -3877,10 +3882,10 @@ ACMD(mapinfo) { case 1: clif->message(fd, msg_fd(fd,1098)); // ----- Players in Map ----- iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { if (pl_sd->mapindex == m_index) { - sprintf(atcmd_output, msg_fd(fd,1099), // Player '%s' (session #%d) | Location: %d,%d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1099), // Player '%s' (session #%d) | Location: %d,%d pl_sd->status.name, pl_sd->fd, pl_sd->bl.x, pl_sd->bl.y); clif->message(fd, atcmd_output); } @@ -3904,27 +3909,27 @@ ACMD(mapinfo) { default: strcpy(direction, msg_fd(fd,1110)); break; // Unknown } if(strcmp(nd->name,nd->exname) == 0) - sprintf(atcmd_output, msg_fd(fd,1111), // NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d - ++i, nd->name, direction, nd->class_, nd->bl.x, nd->bl.y); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1111), // NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d + ++i, nd->name, direction, nd->class_, nd->bl.x, nd->bl.y); else - sprintf(atcmd_output, msg_fd(fd,1112), // NPC %d: %s::%s | Direction: %s | Sprite: %d | Location: %d %d - ++i, nd->name, nd->exname, direction, nd->class_, nd->bl.x, nd->bl.y); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1112), // NPC %d: %s::%s | Direction: %s | Sprite: %d | Location: %d %d + ++i, nd->name, nd->exname, direction, nd->class_, nd->bl.x, nd->bl.y); clif->message(fd, atcmd_output); } break; case 3: clif->message(fd, msg_fd(fd,1113)); // ----- Chats in Map ----- iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) + for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { if ((cd = (struct chat_data*)map->id2bl(pl_sd->chatID)) != NULL && pl_sd->mapindex == m_index && cd->usersd[0] == pl_sd) { - sprintf(atcmd_output, msg_fd(fd,1114), // Chat: %s | Player: %s | Location: %d %d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1114), // Chat: %s | Player: %s | Location: %d %d cd->title, pl_sd->status.name, cd->bl.x, cd->bl.y); clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1115), // Users: %d/%d | Password: %s | Public: %s + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1115), // Users: %d/%d | Password: %s | Public: %s cd->users, cd->limit, cd->pass, (cd->pub) ? msg_fd(fd,1116) : msg_fd(fd,1117)); // Yes / No clif->message(fd, atcmd_output); } @@ -3949,14 +3954,14 @@ ACMD(mount_peco) return false; } - if( sd->sc.data[SC_ALL_RIDING] ) { + if (sd->sc.data[SC_ALL_RIDING]) { clif->message(fd, msg_fd(fd,1476)); // You are already mounting something else return false; } - if( (sd->class_&MAPID_THIRDMASK) == MAPID_RUNE_KNIGHT ) { - if( !pc->checkskill(sd,RK_DRAGONTRAINING) ) { - sprintf(atcmd_output, msg_fd(fd,213), skill->get_desc(RK_DRAGONTRAINING)); // You need %s to mount! + if ((sd->class_&MAPID_THIRDMASK) == MAPID_RUNE_KNIGHT) { + if (!pc->checkskill(sd,RK_DRAGONTRAINING)) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,213), skill->get_desc(RK_DRAGONTRAINING)); // You need %s to mount! clif->message(fd, atcmd_output); return false; } @@ -3969,13 +3974,13 @@ ACMD(mount_peco) } return true; } - if( (sd->class_&MAPID_THIRDMASK) == MAPID_RANGER ) { - if( !pc->checkskill(sd,RA_WUGRIDER) ) { - sprintf(atcmd_output, msg_fd(fd,213), skill->get_desc(RA_WUGRIDER)); // You need %s to mount! + if ((sd->class_&MAPID_THIRDMASK) == MAPID_RANGER) { + if (!pc->checkskill(sd,RA_WUGRIDER)) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,213), skill->get_desc(RA_WUGRIDER)); // You need %s to mount! clif->message(fd, atcmd_output); return false; } - if( !pc_isridingwug(sd) ) { + if (!pc_isridingwug(sd)) { clif->message(sd->fd,msg_fd(fd,1121)); // You have mounted your Warg. pc->setridingwug(sd, true); } else { @@ -3984,8 +3989,8 @@ ACMD(mount_peco) } return true; } - if( (sd->class_&MAPID_THIRDMASK) == MAPID_MECHANIC ) { - if( !pc_ismadogear(sd) ) { + if ((sd->class_&MAPID_THIRDMASK) == MAPID_MECHANIC) { + if (!pc_ismadogear(sd)) { clif->message(sd->fd,msg_fd(fd,1123)); // You have mounted your Mado Gear. pc->setmadogear(sd, true); } else { @@ -3994,10 +3999,10 @@ ACMD(mount_peco) } return true; } - if( sd->class_&MAPID_SWORDMAN && sd->class_&JOBL_2 ) { + if (sd->class_&MAPID_SWORDMAN && sd->class_&JOBL_2) { if (!pc_isridingpeco(sd)) { // if actually no peco if (!pc->checkskill(sd, KN_RIDING)) { - sprintf(atcmd_output, msg_fd(fd,213), skill->get_desc(KN_RIDING)); // You need %s to mount! + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,213), skill->get_desc(KN_RIDING)); // You need %s to mount! clif->message(fd, atcmd_output); return false; } @@ -4028,7 +4033,7 @@ ACMD(guildspy) { clif->message(fd, msg_fd(fd,1125)); // The mapserver has spy command support disabled. return false; } - if (!message || !*message || sscanf(message, "%23[^\n]", guild_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", guild_name) < 1) { clif->message(fd, msg_fd(fd,1126)); // Please enter a guild name/ID (usage: @guildspy <guild_name/ID>). return false; } @@ -4037,11 +4042,11 @@ ACMD(guildspy) { (g = guild->search(atoi(message))) != NULL) { if (sd->guildspy == g->guild_id) { sd->guildspy = 0; - sprintf(atcmd_output, msg_fd(fd,103), g->name); // No longer spying on the %s guild. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,103), g->name); // No longer spying on the %s guild. clif->message(fd, atcmd_output); } else { sd->guildspy = g->guild_id; - sprintf(atcmd_output, msg_fd(fd,104), g->name); // Spying on the %s guild. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,104), g->name); // Spying on the %s guild. clif->message(fd, atcmd_output); } } else { @@ -4068,7 +4073,7 @@ ACMD(partyspy) { return false; } - if (!message || !*message || sscanf(message, "%23[^\n]", party_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", party_name) < 1) { clif->message(fd, msg_fd(fd,1127)); // Please enter a party name/ID (usage: @partyspy <party_name/ID>). return false; } @@ -4077,11 +4082,11 @@ ACMD(partyspy) { (p = party->search(atoi(message))) != NULL) { if (sd->partyspy == p->party.party_id) { sd->partyspy = 0; - sprintf(atcmd_output, msg_fd(fd,105), p->party.name); // No longer spying on the %s party. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,105), p->party.name); // No longer spying on the %s party. clif->message(fd, atcmd_output); } else { sd->partyspy = p->party.party_id; - sprintf(atcmd_output, msg_fd(fd,106), p->party.name); // Spying on the %s party. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,106), p->party.name); // Spying on the %s party. clif->message(fd, atcmd_output); } } else { @@ -4128,7 +4133,7 @@ ACMD(nuke) { memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,1128)); // Please enter a player name (usage: @nuke <char name>). return false; } @@ -4158,7 +4163,7 @@ ACMD(tonpc) { memset(npcname, 0, sizeof(npcname)); - if (!message || !*message || sscanf(message, "%23[^\n]", npcname) < 1) { + if (!*message || sscanf(message, "%23[^\n]", npcname) < 1) { clif->message(fd, msg_fd(fd,1129)); // Please enter a NPC name (usage: @tonpc <NPC_name>). return false; } @@ -4185,7 +4190,7 @@ ACMD(shownpc) memset(NPCname, '\0', sizeof(NPCname)); - if (!message || !*message || sscanf(message, "%23[^\n]", NPCname) < 1) { + if (!*message || sscanf(message, "%23[^\n]", NPCname) < 1) { clif->message(fd, msg_fd(fd,1130)); // Please enter a NPC name (usage: @enablenpc <NPC_name>). return false; } @@ -4210,7 +4215,7 @@ ACMD(hidenpc) memset(NPCname, '\0', sizeof(NPCname)); - if (!message || !*message || sscanf(message, "%23[^\n]", NPCname) < 1) { + if (!*message || sscanf(message, "%23[^\n]", NPCname) < 1) { clif->message(fd, msg_fd(fd,1131)); // Please enter a NPC name (usage: @hidenpc <NPC_name>). return false; } @@ -4229,7 +4234,7 @@ ACMD(loadnpc) { FILE *fp; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1132)); // Please enter a script file name (usage: @loadnpc <file name>). return false; } @@ -4258,7 +4263,7 @@ ACMD(unloadnpc) memset(NPCname, '\0', sizeof(NPCname)); - if (!message || !*message || sscanf(message, "%24[^\n]", NPCname) < 1) { + if (!*message || sscanf(message, "%24[^\n]", NPCname) < 1) { clif->message(fd, msg_fd(fd,1133)); // Please enter a NPC name (usage: @npcoff <NPC_name>). return false; } @@ -4378,6 +4383,11 @@ void get_jail_time(int jailtime, int* year, int* month, int* day, int* hour, int const int factor_day = 1440; //24*60 = 1440 const int factor_hour = 60; + nullpo_retv(year); + nullpo_retv(month); + nullpo_retv(day); + nullpo_retv(hour); + nullpo_retv(minute); *year = jailtime/factor_year; jailtime -= *year*factor_year; *month = jailtime/factor_month; @@ -4407,7 +4417,7 @@ ACMD(jail) { memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,1134)); // Please enter a player name (usage: @jail <char_name>). return false; } @@ -4458,7 +4468,7 @@ ACMD(unjail) { memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,1135)); // Please enter a player name (usage: @unjail/@discharge <char_name>). return false; } @@ -4494,7 +4504,7 @@ ACMD(jailfor) { int jailtime = 0,x,y; short m_index = 0; - if (!message || !*message || sscanf(message, "%255s %23[^\n]",atcmd_output,atcmd_player_name) < 2) { + if (!*message || sscanf(message, "%255s %23[^\n]",atcmd_output,atcmd_player_name) < 2) { clif->message(fd, msg_fd(fd,400)); //Usage: @jailfor <time> <character name> return false; } @@ -4568,9 +4578,9 @@ ACMD(jailfor) { clif->message(fd, msg_fd(fd,121)); // Player unjailed } else { atcommand->get_jail_time(jailtime,&year,&month,&day,&hour,&minute); - sprintf(atcmd_output,msg_fd(fd,402),msg_fd(fd,1137),year,month,day,hour,minute); //%s in jail for %d years, %d months, %d days, %d hours and %d minutes + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,402),msg_fd(fd,1137),year,month,day,hour,minute); //%s in jail for %d years, %d months, %d days, %d hours and %d minutes clif->message(pl_sd->fd, atcmd_output); - sprintf(atcmd_output,msg_fd(fd,402),msg_fd(fd,1138),year,month,day,hour,minute); //This player is now in jail for %d years, %d months, %d days, %d hours and %d minutes + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,402),msg_fd(fd,1138),year,month,day,hour,minute); //This player is now in jail for %d years, %d months, %d days, %d hours and %d minutes clif->message(fd, atcmd_output); } } else if (jailtime < 0) { @@ -4595,7 +4605,6 @@ ACMD(jailfor) { return true; } - //By Coltaro ACMD(jailtime) { @@ -4618,7 +4627,7 @@ ACMD(jailtime) //Get remaining jail time atcommand->get_jail_time(sd->sc.data[SC_JAILED]->val1,&year,&month,&day,&hour,&minute); - sprintf(atcmd_output,msg_fd(fd,402),msg_fd(fd,1142),year,month,day,hour,minute); // You will remain in jail for %d years, %d months, %d days, %d hours and %d minutes + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,402),msg_fd(fd,1142),year,month,day,hour,minute); // You will remain in jail for %d years, %d months, %d days, %d hours and %d minutes clif->message(fd, atcmd_output); @@ -4632,7 +4641,7 @@ ACMD(disguise) { int id = 0; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1143)); // Please enter a Monster/NPC name/ID (usage: @disguise <name/ID>). return false; } @@ -4683,7 +4692,7 @@ ACMD(disguiseall) struct map_session_data *pl_sd; struct s_mapiterator* iter; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1145)); // Please enter a Monster/NPC name/ID (usage: @disguiseall <name/ID>). return false; } @@ -4717,7 +4726,7 @@ ACMD(disguiseguild) memset(monster, '\0', sizeof(monster)); memset(guild_name, '\0', sizeof(guild_name)); - if( !message || !*message || sscanf(message, "%23[^,], %23[^\r\n]", monster, guild_name) < 2 ) { + if (!*message || sscanf(message, "%23[^,], %23[^\r\n]", monster, guild_name) < 2) { clif->message(fd, msg_fd(fd,1146)); // Please enter a mob name/ID and guild name/ID (usage: @disguiseguild <mob name/ID>, <guild name/ID>). return false; } @@ -4753,7 +4762,6 @@ ACMD(disguiseguild) return true; } - /*========================================== * @undisguise by [Yor] *------------------------------------------*/ @@ -4799,17 +4807,17 @@ ACMD(undisguiseguild) memset(guild_name, '\0', sizeof(guild_name)); - if(!message || !*message || sscanf(message, "%23[^\n]", guild_name) < 1) { + if (!*message || sscanf(message, "%23[^\n]", guild_name) < 1) { clif->message(fd, msg_fd(fd,1147)); // Please enter guild name/ID (usage: @undisguiseguild <guild name/ID>). return false; } - if( (g = guild->searchname(guild_name)) == NULL && (g = guild->search(atoi(message))) == NULL ) { + if ((g = guild->searchname(guild_name)) == NULL && (g = guild->search(atoi(message))) == NULL) { clif->message(fd, msg_fd(fd,94)); // Incorrect name/ID, or no one from the guild is online. return false; } - for(i = 0; i < g->max_member; i++) { + for (i = 0; i < g->max_member; i++) { struct map_session_data *pl_sd = g->member[i].sd; if (pl_sd && pl_sd->disguise != -1) pc->disguise(pl_sd, -1); @@ -4843,7 +4851,6 @@ ACMD(exp) return true; } - /*========================================== * @broadcast by [Valaris] *------------------------------------------*/ @@ -4851,12 +4858,12 @@ ACMD(broadcast) { memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1149)); // Please enter a message (usage: @broadcast <message>). return false; } - sprintf(atcmd_output, "%s: %s", sd->status.name, message); + safesnprintf(atcmd_output, sizeof(atcmd_output), "%s: %s", sd->status.name, message); intif->broadcast(atcmd_output, strlen(atcmd_output) + 1, BC_DEFAULT); return true; @@ -4869,12 +4876,12 @@ ACMD(localbroadcast) { memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1150)); // Please enter a message (usage: @localbroadcast <message>). return false; } - sprintf(atcmd_output, "%s: %s", sd->status.name, message); + safesnprintf(atcmd_output, sizeof(atcmd_output), "%s: %s", sd->status.name, message); clif->broadcast(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, BC_DEFAULT, ALL_SAMEMAP); @@ -4892,7 +4899,7 @@ ACMD(email) memset(actual_email, '\0', sizeof(actual_email)); memset(new_email, '\0', sizeof(new_email)); - if (!message || !*message || sscanf(message, "%99s %99s", actual_email, new_email) < 2) { + if (!*message || sscanf(message, "%99s %99s", actual_email, new_email) < 2) { clif->message(fd, msg_fd(fd,1151)); // Please enter two e-mail addresses (usage: @email <current@email> <new@email>). return false; } @@ -4923,7 +4930,7 @@ ACMD(effect) { int type = 0, flag = 0; - if (!message || !*message || sscanf(message, "%d", &type) < 1) { + if (!*message || sscanf(message, "%d", &type) < 1) { clif->message(fd, msg_fd(fd,1152)); // Please enter an effect number (usage: @effect <effect number>). return false; } @@ -4941,7 +4948,7 @@ ACMD(killer) { sd->state.killer = !sd->state.killer; - if(sd->state.killer) + if (sd->state.killer) clif->message(fd, msg_fd(fd,241)); else { clif->message(fd, msg_fd(fd,292)); @@ -4957,9 +4964,9 @@ ACMD(killer) ACMD(killable) { sd->state.killable = !sd->state.killable; - if(sd->state.killable) + if (sd->state.killable) { clif->message(fd, msg_fd(fd,242)); - else { + } else { clif->message(fd, msg_fd(fd,288)); map->foreachinrange(atcommand->stopattack,&sd->bl, AREA_SIZE, BL_CHAR, sd->bl.id); } @@ -4996,7 +5003,7 @@ ACMD(npcmove) { memset(atcmd_player_name, '\0', sizeof atcmd_player_name); - if (!message || !*message || sscanf(message, "%d %d %23[^\n]", &x, &y, atcmd_player_name) < 3) { + if (!*message || sscanf(message, "%12d %12d %23[^\n]", &x, &y, atcmd_player_name) < 3) { clif->message(fd, msg_fd(fd,1153)); // Usage: @npcmove <X> <Y> <npc_name> return false; } @@ -5034,7 +5041,7 @@ ACMD(addwarp) memset(warpname, '\0', sizeof(warpname)); - if (!message || !*message || sscanf(message, "%31s %d %d %23[^\n]", mapname, &x, &y, warpname) < 4) { + if (!*message || sscanf(message, "%31s %12d %12d %23[^\n]", mapname, &x, &y, warpname) < 4) { clif->message(fd, msg_fd(fd,1156)); // Usage: @addwarp <mapname> <X> <Y> <npc name> return false; } @@ -5042,7 +5049,7 @@ ACMD(addwarp) m = mapindex->name2id(mapname); if( m == 0 ) { - sprintf(atcmd_output, msg_fd(fd,1157), mapname); // Unknown map '%s'. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1157), mapname); // Unknown map '%s'. clif->message(fd, atcmd_output); return false; } @@ -5051,7 +5058,7 @@ ACMD(addwarp) if( nd == NULL ) return false; - sprintf(atcmd_output, msg_fd(fd,1158), nd->exname); // New warp NPC '%s' created. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1158), nd->exname); // New warp NPC '%s' created. clif->message(fd, atcmd_output); return true; } @@ -5063,7 +5070,7 @@ ACMD(addwarp) ACMD(follow) { struct map_session_data *pl_sd = NULL; - if (!message || !*message) { + if (!*message) { if (sd->followtarget == -1) return false; pc->stop_following (sd); @@ -5071,7 +5078,7 @@ ACMD(follow) { return true; } - if ( (pl_sd = map->nick2sd((char *)message)) == NULL ) + if ((pl_sd = map->nick2sd((char *)message)) == NULL) { clif->message(fd, msg_fd(fd,3)); // Character not found. return false; @@ -5088,7 +5095,6 @@ ACMD(follow) { return true; } - /*========================================== * @dropall by [MouseJstr] * Drop all your possession on the ground @@ -5117,7 +5123,7 @@ ACMD(storeall) if (sd->state.storage_flag != STORAGE_FLAG_NORMAL) { //Open storage. - if( storage->open(sd) == 1 ) { + if (storage->open(sd) == 1) { clif->message(fd, msg_fd(fd,1161)); // You currently cannot open your storage. return false; } @@ -5234,7 +5240,7 @@ ACMD(skillid) { DBData *data; char partials[MAX_SKILLID_PARTIAL_RESULTS][MAX_SKILLID_PARTIAL_RESULTS_LEN]; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1163)); // Please enter a skill name to look up (usage: @skillid <skill name>). return false; } @@ -5246,7 +5252,7 @@ ACMD(skillid) { for (data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key)) { int idx = skill->get_index(DB->data2i(data)); if (strnicmp(key.str, message, skillen) == 0 || strnicmp(skill->dbs->db[idx].desc, message, skillen) == 0) { - sprintf(atcmd_output, msg_fd(fd,1164), DB->data2i(data), skill->dbs->db[idx].desc, key.str); // skill %d: %s (%s) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1164), DB->data2i(data), skill->dbs->db[idx].desc, key.str); // skill %d: %s (%s) clif->message(fd, atcmd_output); } else if ( found < MAX_SKILLID_PARTIAL_RESULTS && ( stristr(key.str,message) || stristr(skill->dbs->db[idx].desc,message) ) ) { snprintf(partials[found], MAX_SKILLID_PARTIAL_RESULTS_LEN, msg_fd(fd,1164), DB->data2i(data), skill->dbs->db[idx].desc, key.str); @@ -5257,7 +5263,7 @@ ACMD(skillid) { dbi_destroy(iter); if( found ) { - sprintf(atcmd_output, msg_fd(fd,1398), found); // -- Displaying first %d partial matches + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1398), found); // -- Displaying first %d partial matches clif->message(fd, atcmd_output); } @@ -5279,19 +5285,19 @@ ACMD(useskill) { uint16 skill_lv; char target[100]; - if(!message || !*message || sscanf(message, "%hu %hu %23[^\n]", &skill_id, &skill_lv, target) != 3) { + if (!*message || sscanf(message, "%5hu %5hu %23[^\n]", &skill_id, &skill_lv, target) != 3) { clif->message(fd, msg_fd(fd,1165)); // Usage: @useskill <skill ID> <skill level> <target> return false; } - if(!strcmp(target,"self")) + if (!strcmp(target,"self")) pl_sd = sd; //quick keyword - else if ( (pl_sd = map->nick2sd(target)) == NULL ) { + else if ((pl_sd = map->nick2sd(target)) == NULL) { clif->message(fd, msg_fd(fd,3)); // Character not found. return false; } - if ( pc_get_group_level(sd) < pc_get_group_level(pl_sd) ) + if (pc_get_group_level(sd) < pc_get_group_level(pl_sd)) { clif->message(fd, msg_fd(fd,81)); // Your GM level don't authorized you to do this action on this player. return false; @@ -5324,7 +5330,7 @@ ACMD(displayskill) { uint16 skill_id; uint16 skill_lv = 1; - if (!message || !*message || sscanf(message, "%hu %hu", &skill_id, &skill_lv) < 1) { + if (!*message || sscanf(message, "%5hu %5hu", &skill_id, &skill_lv) < 1) { clif->message(fd, msg_fd(fd,1166)); // Usage: @displayskill <skill ID> {<skill level>} return false; } @@ -5347,7 +5353,7 @@ ACMD(skilltree) { char target[NAME_LENGTH]; struct skill_tree_entry *ent; - if(!message || !*message || sscanf(message, "%hu %23[^\r\n]", &skill_id, target) != 2) { + if(!*message || sscanf(message, "%5hu %23[^\r\n]", &skill_id, target) != 2) { clif->message(fd, msg_fd(fd,1167)); // Usage: @skilltree <skill ID> <target> return false; } @@ -5360,7 +5366,7 @@ ACMD(skilltree) { c = pc->calc_skilltree_normalize_job(pl_sd); c = pc->mapid2jobid(c, pl_sd->status.sex); - sprintf(atcmd_output, msg_fd(fd,1168), pc->job_name(c), pc->checkskill(pl_sd, NV_BASIC)); // Player is using %s skill tree (%d basic points). + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1168), pc->job_name(c), pc->checkskill(pl_sd, NV_BASIC)); // Player is using %s skill tree (%d basic points). clif->message(fd, atcmd_output); ARR_FIND( 0, MAX_SKILL_TREE, j, pc->skill_tree[c][j].id == 0 || pc->skill_tree[c][j].id == skill_id ); @@ -5377,7 +5383,7 @@ ACMD(skilltree) { { if( ent->need[j].id && pc->checkskill(sd,ent->need[j].id) < ent->need[j].lv) { - sprintf(atcmd_output, msg_fd(fd,1170), ent->need[j].lv, skill->dbs->db[ent->need[j].id].desc); // Player requires level %d of skill %s. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1170), ent->need[j].lv, skill->dbs->db[ent->need[j].id].desc); // Player requires level %d of skill %s. clif->message(fd, atcmd_output); meets = 0; } @@ -5390,9 +5396,10 @@ ACMD(skilltree) { } // Hand a ring with partners name on it to this char -void getring(struct map_session_data* sd) { +void atcommand_getring(struct map_session_data* sd) { int flag, item_id; struct item item_tmp; + nullpo_retv(sd); item_id = (sd->status.sex) ? WEDDING_RING_M : WEDDING_RING_F; memset(&item_tmp, 0, sizeof(item_tmp)); @@ -5404,7 +5411,7 @@ void getring(struct map_session_data* sd) { if((flag = pc->additem(sd,&item_tmp,1,LOG_TYPE_COMMAND))) { clif->additem(sd,0,0,flag); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } @@ -5416,7 +5423,7 @@ ACMD(marry) { struct map_session_data *pl_sd = NULL; char player_name[NAME_LENGTH] = ""; - if (!message || !*message || sscanf(message, "%23s", player_name) != 1) { + if (!*message || sscanf(message, "%23s", player_name) != 1) { clif->message(fd, msg_fd(fd,1172)); // Usage: @marry <char name> return false; } @@ -5429,8 +5436,8 @@ ACMD(marry) { if (pc->marriage(sd, pl_sd) == 0) { clif->message(fd, msg_fd(fd,1173)); // They are married... wish them well. clif->wedding_effect(&pl_sd->bl); //wedding effect and music [Lupus] - getring(sd); // Auto-give named rings (Aru) - getring(pl_sd); + atcommand->getring(sd); // Auto-give named rings (Aru) + atcommand->getring(pl_sd); return true; } @@ -5445,12 +5452,12 @@ ACMD(marry) { ACMD(divorce) { if (pc->divorce(sd) != 0) { - sprintf(atcmd_output, msg_fd(fd,1175), sd->status.name); // '%s' is not married. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1175), sd->status.name); // '%s' is not married. clif->message(fd, atcmd_output); return false; } - sprintf(atcmd_output, msg_fd(fd,1176), sd->status.name); // '%s' and his/her partner are now divorced. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1176), sd->status.name); // '%s' and his/her partner are now divorced. clif->message(fd, atcmd_output); return true; } @@ -5463,7 +5470,7 @@ ACMD(changelook) int i, j = 0, k = 0; int pos[7] = { LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HEAD_BOTTOM,LOOK_WEAPON,LOOK_SHIELD,LOOK_SHOES,LOOK_ROBE }; - if((i = sscanf(message, "%d %d", &j, &k)) < 1) { + if((i = sscanf(message, "%12d %12d", &j, &k)) < 1) { clif->message(fd, msg_fd(fd,1177)); // Usage: @changelook {<position>} <view id> clif->message(fd, msg_fd(fd,1178)); // Position: 1-Top 2-Middle 3-Bottom 4-Weapon 5-Shield 6-Shoes 7-Robe return false; @@ -5540,17 +5547,17 @@ ACMD(changegm) { return false; } - if( map->list[sd->bl.m].flag.guildlock || map->list[sd->bl.m].flag.gvg_castle ) { + if (map->list[sd->bl.m].flag.guildlock || map->list[sd->bl.m].flag.gvg_castle) { clif->message(fd, msg_fd(fd,1182)); // You cannot change guild leaders in this map. return false; } - if( !message[0] ) { + if (!message[0]) { clif->message(fd, msg_fd(fd,1183)); // Usage: @changegm <guild_member_name> return false; } - if((pl_sd=map->nick2sd((char *) message)) == NULL || pl_sd->status.guild_id != sd->status.guild_id) { + if ((pl_sd=map->nick2sd((char *) message)) == NULL || pl_sd->status.guild_id != sd->status.guild_id) { clif->message(fd, msg_fd(fd,1184)); // Target character must be online and be a guild member. return false; } @@ -5565,7 +5572,7 @@ ACMD(changegm) { *------------------------------------------*/ ACMD(changeleader) { - if( !message[0] ) { + if (!message[0]) { clif->message(fd, msg_fd(fd,1185)); // Usage: @changeleader <party_member_name> return false; } @@ -5591,7 +5598,7 @@ ACMD(partyoption) return false; } - ARR_FIND( 0, MAX_PARTY, mi, p->data[mi].sd == sd ); + ARR_FIND(0, MAX_PARTY, mi, p->data[mi].sd == sd); if (mi == MAX_PARTY) return false; //Shouldn't happen @@ -5601,7 +5608,7 @@ ACMD(partyoption) return false; } - if(!message || !*message || sscanf(message, "%15s %15s", w1, w2) < 2) + if (!*message || sscanf(message, "%15s %15s", w1, w2) < 2) { clif->message(fd, msg_fd(fd,1186)); // Usage: @partyoption <pickup share: yes/no> <item distribution: yes/no> return false; @@ -5627,7 +5634,7 @@ ACMD(autoloot) int rate; // autoloot command without value - if(!message || !*message) + if (!*message) { if (sd->state.autoloot) rate = 0; @@ -5660,7 +5667,7 @@ ACMD(autolootitem) int i; int action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset - if (message && *message) { + if (*message) { if (message[0] == '+') { message++; action = 1; @@ -5684,7 +5691,7 @@ ACMD(autolootitem) } } - switch(action) { + switch (action) { case 1: ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == item_data->nameid); if (i != AUTOLOOTITEM_SIZE) { @@ -5697,7 +5704,7 @@ ACMD(autolootitem) return false; } sd->state.autolootid[i] = item_data->nameid; // Autoloot Activated - sprintf(atcmd_output, msg_fd(fd,1192), item_data->name, item_data->jname, item_data->nameid); // Autolooting item: '%s'/'%s' {%d} + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1192), item_data->name, item_data->jname, item_data->nameid); // Autolooting item: '%s'/'%s' {%d} clif->message(fd, atcmd_output); sd->state.autolooting = 1; break; @@ -5708,7 +5715,7 @@ ACMD(autolootitem) return false; } sd->state.autolootid[i] = 0; - sprintf(atcmd_output, msg_fd(fd,1194), item_data->name, item_data->jname, item_data->nameid); // Removed item: '%s'/'%s' {%d} from your autolootitem list. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1194), item_data->name, item_data->jname, item_data->nameid); // Removed item: '%s'/'%s' {%d} from your autolootitem list. clif->message(fd, atcmd_output); ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] != 0); if (i == AUTOLOOTITEM_SIZE) { @@ -5716,7 +5723,7 @@ ACMD(autolootitem) } break; case 3: - sprintf(atcmd_output, msg_fd(fd,1195), AUTOLOOTITEM_SIZE); // You can have %d items on your autolootitem list. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1195), AUTOLOOTITEM_SIZE); // You can have %d items on your autolootitem list. clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1196)); // To add an item to the list, use "@alootid +<item name or ID>". To remove an item, use "@alootid -<item name or ID>". clif->message(fd, msg_fd(fd,1197)); // "@alootid reset" will clear your autolootitem list. @@ -5733,7 +5740,7 @@ ACMD(autolootitem) ShowDebug("Non-existant item %d on autolootitem list (account_id: %d, char_id: %d)", sd->state.autolootid[i], sd->status.account_id, sd->status.char_id); continue; } - sprintf(atcmd_output, "'%s'/'%s' {%d}", item_data->name, item_data->jname, item_data->nameid); + safesnprintf(atcmd_output, sizeof(atcmd_output), "'%s'/'%s' {%d}", item_data->name, item_data->jname, item_data->nameid); clif->message(fd, atcmd_output); } } @@ -5757,7 +5764,7 @@ ACMD(autoloottype) { enum item_types type = -1; int ITEM_NONE = 0; - if (message && *message) { + if (*message) { if (message[0] == '+') { message++; action = 1; @@ -5802,7 +5809,7 @@ ACMD(autoloottype) { return false; } sd->state.autoloottype |= (1<<type); // Stores the type - sprintf(atcmd_output, msg_fd(fd,1492), itemdb->typename(type)); // Autolooting item type: '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1492), itemdb->typename(type)); // Autolooting item type: '%s' clif->message(fd, atcmd_output); break; case 2: @@ -5811,7 +5818,7 @@ ACMD(autoloottype) { return false; } sd->state.autoloottype &= ~(1<<type); - sprintf(atcmd_output, msg_fd(fd,1494), itemdb->typename(type)); // Removed item type: '%s' from your autoloottype list. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1494), itemdb->typename(type)); // Removed item type: '%s' from your autoloottype list. clif->message(fd, atcmd_output); break; case 3: @@ -5830,7 +5837,7 @@ ACMD(autoloottype) { clif->message(fd, msg_fd(fd,1496)); // Item types on your autoloottype list: for(i=0; i < IT_MAX; i++) { if (sd->state.autoloottype&(1<<i)) { - sprintf(atcmd_output, " '%s'", itemdb->typename(i)); + safesnprintf(atcmd_output, sizeof(atcmd_output), " '%s'", itemdb->typename(i)); clif->message(fd, atcmd_output); } } @@ -5995,7 +6002,7 @@ ACMD(sound) memset(sound_file, '\0', sizeof(sound_file)); - if(!message || !*message || sscanf(message, "%99[^\n]", sound_file) < 1) { + if(!*message || sscanf(message, "%99[^\n]", sound_file) < 1) { clif->message(fd, msg_fd(fd,1217)); // Please enter a sound filename (usage: @sound <filename>). return false; } @@ -6018,7 +6025,7 @@ ACMD(mobsearch) int number = 0; struct s_mapiterator* it; - if (!message || !*message || sscanf(message, "%99[^\n]", mob_name) < 1) { + if (!*message || sscanf(message, "%99[^\n]", mob_name) < 1) { clif->message(fd, msg_fd(fd,1218)); // Please enter a monster name (usage: @mobsearch <monster name>). return false; } @@ -6081,7 +6088,7 @@ ACMD(cleanmap) { ACMD(cleanarea) { int x0 = 0, y0 = 0, x1 = 0, y1 = 0, n = 0; - if (!message || !*message || (n=sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1)) < 1) { + if (!*message || (n=sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1)) < 1) { map->foreachinrange(atcommand->cleanfloor_sub, &sd->bl, AREA_SIZE * 2, BL_ITEM); } else if (n == 4) { map->foreachinarea(atcommand->cleanfloor_sub, sd->bl.m, x0, y0, x1, y1, BL_ITEM); @@ -6110,13 +6117,13 @@ ACMD(npctalk) return false; if(!ifcolor) { - if (!message || !*message || sscanf(message, "%23[^,], %99[^\n]", name, mes) < 2) { + if (!*message || sscanf(message, "%23[^,], %99[^\n]", name, mes) < 2) { clif->message(fd, msg_fd(fd,1222)); // Please enter the correct parameters (usage: @npctalk <npc name>, <message>). return false; } } else { - if (!message || !*message || sscanf(message, "%u %23[^,], %99[^\n]", &color, name, mes) < 3) { + if (!*message || sscanf(message, "%12u %23[^,], %99[^\n]", &color, name, mes) < 3) { clif->message(fd, msg_fd(fd,1223)); // Please enter the correct parameters (usage: @npctalkc <color> <npc name>, <message>). return false; } @@ -6141,13 +6148,13 @@ ACMD(pettalk) char mes[100],temp[100]; struct pet_data *pd; - if ( battle_config.min_chat_delay ) { + if (battle_config.min_chat_delay) { if( DIFF_TICK(sd->cantalk_tick, timer->gettick()) > 0 ) return true; sd->cantalk_tick = timer->gettick() + battle_config.min_chat_delay; } - if(!sd->status.pet_id || !(pd=sd->pd)) + if (!sd->status.pet_id || !(pd=sd->pd)) { clif->message(fd, msg_fd(fd,184)); return false; @@ -6158,13 +6165,13 @@ ACMD(pettalk) (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCHAT))) return false; - if (!message || !*message || sscanf(message, "%99[^\n]", mes) < 1) { + if (!*message || sscanf(message, "%99[^\n]", mes) < 1) { clif->message(fd, msg_fd(fd,1224)); // Please enter a message (usage: @pettalk <message>). return false; } if (message[0] == '/') - {// pet emotion processing + { // pet emotion processing const char* emo[] = { "/!", "/?", "/ho", "/lv", "/swt", "/ic", "/an", "/ag", "/$", "/...", "/scissors", "/rock", "/paper", "/korea", "/lv2", "/thx", "/wah", "/sry", "/heh", "/swt2", @@ -6251,7 +6258,7 @@ ACMD(users) ACMD(reset) { pc->resetstate(sd); pc->resetskill(sd, PCRESETSKILL_RESYNC); - sprintf(atcmd_output, msg_fd(fd,208), sd->status.name); // '%s' skill and stats points reseted! + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,208), sd->status.name); // '%s' skill and stats points reseted! clif->message(fd, atcmd_output); return true; } @@ -6267,7 +6274,7 @@ ACMD(summon) struct mob_data *md; int64 tick=timer->gettick(); - if (!message || !*message || sscanf(message, "%23s %d", name, &duration) < 1) + if (!*message || sscanf(message, "%23s %12d", name, &duration) < 1) { clif->message(fd, msg_fd(fd,1225)); // Please enter a monster name (usage: @summon <monster name> {duration}). return false; @@ -6312,7 +6319,7 @@ ACMD(adjgroup) { int new_group = 0; - if (!message || !*message || sscanf(message, "%d", &new_group) != 1) { + if (!*message || sscanf(message, "%12d", &new_group) != 1) { clif->message(fd, msg_fd(fd,1226)); // Usage: @adjgroup <group_id> return false; } @@ -6334,7 +6341,7 @@ ACMD(adjgroup) ACMD(trade) { struct map_session_data *pl_sd = NULL; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1230)); // Please enter a player name (usage: @trade <char name>). return false; } @@ -6356,7 +6363,7 @@ ACMD(setbattleflag) { char flag[128], value[128]; - if (!message || !*message || sscanf(message, "%127s %127s", flag, value) != 2) { + if (!*message || sscanf(message, "%127s %127s", flag, value) != 2) { clif->message(fd, msg_fd(fd,1231)); // Usage: @setbattleflag <flag> <value> return false; } @@ -6377,18 +6384,18 @@ ACMD(setbattleflag) ACMD(unmute) { struct map_session_data *pl_sd = NULL; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1234)); // Please enter a player name (usage: @unmute <char name>). return false; } - if ( (pl_sd = map->nick2sd((char *)message)) == NULL ) + if ((pl_sd = map->nick2sd((char *)message)) == NULL) { clif->message(fd, msg_fd(fd,3)); // Character not found. return false; } - if(!pl_sd->sc.data[SC_NOCHAT]) { + if (!pl_sd->sc.data[SC_NOCHAT]) { clif->message(sd->fd,msg_fd(fd,1235)); // Player is not muted. return false; } @@ -6431,8 +6438,8 @@ ACMD(changesex) { pc->resetskill(sd, PCRESETSKILL_CHSEX); // to avoid any problem with equipment and invalid sex, equipment is unequipped. - for( i=0; i<EQI_MAX; i++ ) - if( sd->equip_index[i] >= 0 ) pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE); + for (i=0; i<EQI_MAX; i++) + if (sd->equip_index[i] >= 0) pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE); chrif->changesex(sd, true); return true; } @@ -6444,17 +6451,17 @@ ACMD(mute) { struct map_session_data *pl_sd = NULL; int manner; - if (!message || !*message || sscanf(message, "%d %23[^\n]", &manner, atcmd_player_name) < 1) { + if (!*message || sscanf(message, "%12d %23[^\n]", &manner, atcmd_player_name) < 1) { clif->message(fd, msg_fd(fd,1237)); // Usage: @mute <time> <char name> return false; } - if ( (pl_sd = map->nick2sd(atcmd_player_name)) == NULL ) { + if ((pl_sd = map->nick2sd(atcmd_player_name)) == NULL) { clif->message(fd, msg_fd(fd,3)); // Character not found. return false; } - if ( pc_get_group_level(sd) < pc_get_group_level(pl_sd) ) + if (pc_get_group_level(sd) < pc_get_group_level(pl_sd)) { clif->message(fd, msg_fd(fd,81)); // Your GM level don't authorize you to do this action on this player. return false; @@ -6463,7 +6470,7 @@ ACMD(mute) { clif->manner_message(sd, 0); clif->manner_message(pl_sd, 5); - if( pl_sd->status.manner < manner ) { + if (pl_sd->status.manner < manner) { pl_sd->status.manner -= manner; sc_start(NULL,&pl_sd->bl,SC_NOCHAT,100,0,0); } else { @@ -6505,7 +6512,7 @@ ACMD(identify) { int i,num; - for(i=num=0;i<MAX_INVENTORY;i++){ + for (i=num=0;i<MAX_INVENTORY;i++) { if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify!=1){ num++; } @@ -6521,9 +6528,9 @@ ACMD(identify) ACMD(misceffect) { int effect = 0; - if (!message || !*message) + if (!*message) return false; - if (sscanf(message, "%d", &effect) < 1) + if (sscanf(message, "%12d", &effect) < 1) return false; clif->misceffect(&sd->bl,effect); @@ -6557,7 +6564,7 @@ ACMD(mobinfo) memset(atcmd_output, '\0', sizeof(atcmd_output)); memset(atcmd_output2, '\0', sizeof(atcmd_output2)); - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1239)); // Please enter a monster name/ID (usage: @mobinfo <monster_name_or_monster_ID>). return false; } @@ -6575,7 +6582,7 @@ ACMD(mobinfo) } if (count > MAX_SEARCH) { - sprintf(atcmd_output, msg_fd(fd,269), MAX_SEARCH, count); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,269), MAX_SEARCH, count); clif->message(fd, atcmd_output); count = MAX_SEARCH; } @@ -6598,27 +6605,26 @@ ACMD(mobinfo) // stats if (monster->mexp) - sprintf(atcmd_output, msg_fd(fd,1240), monster->name, monster->jname, monster->sprite, monster->vd.class_); // MVP Monster: '%s'/'%s'/'%s' (%d) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1240), monster->name, monster->jname, monster->sprite, monster->vd.class_); // MVP Monster: '%s'/'%s'/'%s' (%d) else - sprintf(atcmd_output, msg_fd(fd,1241), monster->name, monster->jname, monster->sprite, monster->vd.class_); // Monster: '%s'/'%s'/'%s' (%d) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1241), monster->name, monster->jname, monster->sprite, monster->vd.class_); // Monster: '%s'/'%s'/'%s' (%d) clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1242), monster->lv, monster->status.max_hp, base_exp, job_exp, MOB_HIT(monster), MOB_FLEE(monster)); // Lv:%d HP:%d Base EXP:%u Job EXP:%u HIT:%d FLEE:%d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1242), monster->lv, monster->status.max_hp, base_exp, job_exp, MOB_HIT(monster), MOB_FLEE(monster)); // Lv:%d HP:%d Base EXP:%u Job EXP:%u HIT:%d FLEE:%d clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1243), // DEF:%d MDEF:%d STR:%d AGI:%d VIT:%d INT:%d DEX:%d LUK:%d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1243), // DEF:%d MDEF:%d STR:%d AGI:%d VIT:%d INT:%d DEX:%d LUK:%d monster->status.def, monster->status.mdef, monster->status.str, monster->status.agi, monster->status.vit, monster->status.int_, monster->status.dex, monster->status.luk); clif->message(fd, atcmd_output); - #ifdef RENEWAL - sprintf(atcmd_output, msg_fd(fd,1291), // ATK : %d~%d MATK : %d~%d Range : %d~%d~%d Size : %s Race : %s Element : %s(Lv : %d) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1291), // ATK : %d~%d MATK : %d~%d Range : %d~%d~%d Size : %s Race : %s Element : %s(Lv : %d) MOB_ATK1(monster), MOB_ATK2(monster), MOB_MATK1(monster), MOB_MATK2(monster), monster->status.rhw.range, monster->range2 , monster->range3, msize[monster->status.size], mrace[monster->status.race], melement[monster->status.def_ele], monster->status.ele_lv); #else - sprintf(atcmd_output, msg_fd(fd,1244), // ATK:%d~%d Range:%d~%d~%d Size:%s Race: %s Element: %s (Lv:%d) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1244), // ATK:%d~%d Range:%d~%d~%d Size:%s Race: %s Element: %s (Lv:%d) monster->status.rhw.atk, monster->status.rhw.atk2, monster->status.rhw.range, monster->range2 , monster->range3, msize[monster->status.size], mrace[monster->status.race], melement[monster->status.def_ele], monster->status.ele_lv); @@ -6665,7 +6671,7 @@ ACMD(mobinfo) clif->message(fd, atcmd_output); // mvp if (monster->mexp) { - sprintf(atcmd_output, msg_fd(fd,1247), monster->mexp); // MVP Bonus EXP:%u + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1247), monster->mexp); // MVP Bonus EXP:%u clif->message(fd, atcmd_output); safestrncpy(atcmd_output, msg_fd(fd,1248), sizeof(atcmd_output)); // MVP Items: @@ -6702,7 +6708,7 @@ ACMD(showmobs) int number = 0; struct s_mapiterator* it; - if( sscanf(message, "%99[^\n]", mob_name) < 0 ) { + if (sscanf(message, "%99[^\n]", mob_name) < 0) { clif->message(fd, msg_fd(fd,546)); // Please enter a mob name/id (usage: @showmobs <mob name/id>) return false; } @@ -6768,19 +6774,19 @@ ACMD(homlevel) { int level = 0; enum homun_type htype; - if( !message || !*message || ( level = atoi(message) ) < 1 ) { + if (!*message || ( level = atoi(message) ) < 1) { clif->message(fd, msg_fd(fd,1253)); // Please enter a level adjustment (usage: @homlevel <number of levels>). return false; } - if( !homun_alive(sd->hd) ) { + if (!homun_alive(sd->hd)) { clif->message(fd, msg_fd(fd,1254)); // You do not have a homunculus. return false; } hd = sd->hd; - if( (htype = homun->class2type(hd->homunculus.class_)) == HT_INVALID ) { + if ((htype = homun->class2type(hd->homunculus.class_)) == HT_INVALID) { ShowError("atcommand_homlevel: invalid homun class %d (player %s)\n", hd->homunculus.class_,sd->status.name); return false; } @@ -6838,12 +6844,12 @@ ACMD(hommutate) { int homun_id; enum homun_type m_class, m_id; - if( !homun_alive(sd->hd) ) { + if (!homun_alive(sd->hd)) { clif->message(fd, msg_fd(fd,1254)); // You do not have a homunculus. return false; } - if( !message || !*message ) { + if (!*message) { homun_id = 6048 + (rnd() % 4); } else { homun_id = atoi(message); @@ -6866,15 +6872,15 @@ ACMD(hommutate) { ACMD(makehomun) { int homunid; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1256)); // Please enter a homunculus ID (usage: @makehomun <homunculus id>). return false; } homunid = atoi(message); - if( homunid == -1 && sd->status.hom_id && !(sd->hd && homun_alive(sd->hd)) ) { - if( !sd->hd ) + if (homunid == -1 && sd->status.hom_id && !(sd->hd && homun_alive(sd->hd))) { + if (!sd->hd) homun->call(sd); else if( sd->hd->homunculus.vaporize ) homun->ressurect(sd, 100, sd->bl.x, sd->bl.y); @@ -6883,12 +6889,12 @@ ACMD(makehomun) { return true; } - if ( sd->status.hom_id ) { + if (sd->status.hom_id) { clif->message(fd, msg_fd(fd,450)); return false; } - if( homunid < HM_CLASS_BASE || homunid > HM_CLASS_BASE + MAX_HOMUNCULUS_CLASS - 1 ) + if (homunid < HM_CLASS_BASE || homunid > HM_CLASS_BASE + MAX_HOMUNCULUS_CLASS - 1) { clif->message(fd, msg_fd(fd,1257)); // Invalid Homunculus ID. return false; @@ -6905,12 +6911,12 @@ ACMD(homfriendly) { int friendly = 0; - if ( !homun_alive(sd->hd) ) { + if (!homun_alive(sd->hd)) { clif->message(fd, msg_fd(fd,1254)); // You do not have a homunculus. return false; } - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1258)); // Please enter a friendly value (usage: @homfriendly <friendly value [0-1000]>). return false; } @@ -6930,12 +6936,12 @@ ACMD(homhungry) { int hungry = 0; - if ( !homun_alive(sd->hd) ) { + if (!homun_alive(sd->hd)) { clif->message(fd, msg_fd(fd,1254)); // You do not have a homunculus. return false; } - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1259)); // Please enter a hunger value (usage: @homhungry <hunger value [0-100]>). return false; } @@ -6955,8 +6961,8 @@ ACMD(homtalk) { char mes[100],temp[100]; - if ( battle_config.min_chat_delay ) { - if( DIFF_TICK(sd->cantalk_tick, timer->gettick()) > 0 ) + if (battle_config.min_chat_delay) { + if (DIFF_TICK(sd->cantalk_tick, timer->gettick()) > 0) return true; sd->cantalk_tick = timer->gettick() + battle_config.min_chat_delay; } @@ -6966,12 +6972,12 @@ ACMD(homtalk) (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCHAT))) return false; - if ( !homun_alive(sd->hd) ) { + if (!homun_alive(sd->hd)) { clif->message(fd, msg_fd(fd,1254)); // You do not have a homunculus. return false; } - if (!message || !*message || sscanf(message, "%99[^\n]", mes) < 1) { + if (!*message || sscanf(message, "%99[^\n]", mes) < 1) { clif->message(fd, msg_fd(fd,1260)); // Please enter a message (usage: @homtalk <message>). return false; } @@ -6989,7 +6995,7 @@ ACMD(hominfo) { struct homun_data *hd; struct status_data *st; - if ( !homun_alive(sd->hd) ) { + if (!homun_alive(sd->hd)) { clif->message(fd, msg_fd(fd,1254)); // You do not have a homunculus. return false; } @@ -7026,7 +7032,7 @@ ACMD(homstats) struct s_homunculus *hom; int lv, min, max, evo; - if ( !homun_alive(sd->hd) ) { + if (!homun_alive(sd->hd)) { clif->message(fd, msg_fd(fd,1254)); // You do not have a homunculus. return false; } @@ -7088,10 +7094,10 @@ ACMD(homstats) ACMD(homshuffle) { - if(!sd->hd) + if (!sd->hd) return false; // nothing to do - if(!homun->shuffle(sd->hd)) + if (!homun->shuffle(sd->hd)) return false; clif->message(sd->fd, msg_fd(fd,1275)); // Homunculus stats altered. @@ -7108,7 +7114,7 @@ ACMD(iteminfo) struct item_data *item_array[MAX_SEARCH]; int i, count = 1; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1276)); // Please enter an item name/ID (usage: @ii/@iteminfo <item name/ID>). return false; } @@ -7121,27 +7127,27 @@ ACMD(iteminfo) } if (count > MAX_SEARCH) { - sprintf(atcmd_output, msg_fd(fd,269), MAX_SEARCH, count); // Displaying first %d out of %d matches + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,269), MAX_SEARCH, count); // Displaying first %d out of %d matches clif->message(fd, atcmd_output); count = MAX_SEARCH; } for (i = 0; i < count; i++) { struct item_data *item_data = item_array[i]; - sprintf(atcmd_output, msg_fd(fd,1277), // Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1277), // Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s item_data->name,item_data->jname,item_data->slot,item_data->nameid, itemdb->typename(item_data->type), (item_data->script==NULL)? msg_fd(fd,1278) : msg_fd(fd,1279) // None / With script ); clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1280), item_data->value_buy, item_data->value_sell, item_data->weight/10. ); // NPC Buy:%dz, Sell:%dz | Weight: %.1f + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1280), item_data->value_buy, item_data->value_sell, item_data->weight/10. ); // NPC Buy:%dz, Sell:%dz | Weight: %.1f clif->message(fd, atcmd_output); if (item_data->maxchance == -1) safestrncpy(atcmd_output, msg_fd(fd,1281), sizeof(atcmd_output)); // - Available in the shops only. else if ( !battle_config.atcommand_mobinfo_type ) { if( item_data->maxchance ) - sprintf(atcmd_output, msg_fd(fd,1282), (float)item_data->maxchance / 100 ); // - Maximal monsters drop chance: %02.02f%% + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1282), (float)item_data->maxchance / 100 ); // - Maximal monsters drop chance: %02.02f%% else safestrncpy(atcmd_output, msg_fd(fd,1283), sizeof(atcmd_output)); // - Monsters don't drop this item. } @@ -7159,7 +7165,7 @@ ACMD(whodrops) struct item_data *item_array[MAX_SEARCH]; int i,j, count = 1; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1284)); // Please enter item name/ID (usage: @whodrops <item name/ID>). return false; } @@ -7172,25 +7178,25 @@ ACMD(whodrops) } if (count > MAX_SEARCH) { - sprintf(atcmd_output, msg_fd(fd,269), MAX_SEARCH, count); // Displaying first %d out of %d matches + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,269), MAX_SEARCH, count); // Displaying first %d out of %d matches clif->message(fd, atcmd_output); count = MAX_SEARCH; } for (i = 0; i < count; i++) { struct item_data *item_data = item_array[i]; - sprintf(atcmd_output, msg_fd(fd,1285), item_data->jname,item_data->slot); // Item: '%s'[%d] + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1285), item_data->jname,item_data->slot); // Item: '%s'[%d] clif->message(fd, atcmd_output); if (item_data->mob[0].chance == 0) { safestrncpy(atcmd_output, msg_fd(fd,1286), sizeof(atcmd_output)); // - Item is not dropped by mobs. clif->message(fd, atcmd_output); } else { - sprintf(atcmd_output, msg_fd(fd,1287), MAX_SEARCH); // - Common mobs with highest drop chance (only max %d are listed): + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1287), MAX_SEARCH); // - Common mobs with highest drop chance (only max %d are listed): clif->message(fd, atcmd_output); for (j=0; j < MAX_SEARCH && item_data->mob[j].chance > 0; j++) { - sprintf(atcmd_output, "- %s (%02.02f%%)", mob->db(item_data->mob[j].id)->jname, item_data->mob[j].chance/100.); + safesnprintf(atcmd_output, sizeof(atcmd_output), "- %s (%02.02f%%)", mob->db(item_data->mob[j].id)->jname, item_data->mob[j].chance/100.); clif->message(fd, atcmd_output); } } @@ -7204,7 +7210,7 @@ ACMD(whereis) int count; int i, j, k; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1288)); // Please enter a monster name/ID (usage: @whereis <monster_name_or_monster_ID>). return false; } @@ -7223,7 +7229,7 @@ ACMD(whereis) } if (count > MAX_SEARCH) { - sprintf(atcmd_output, msg_fd(fd,269), MAX_SEARCH, count); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,269), MAX_SEARCH, count); clif->message(fd, atcmd_output); count = MAX_SEARCH; } @@ -7246,9 +7252,9 @@ ACMD(whereis) } ACMD(version) { - sprintf(atcmd_output, msg_fd(fd,1296), sysinfo->is64bit() ? 64 : 32, sysinfo->platform()); // Hercules %d-bit for %s + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1296), sysinfo->is64bit() ? 64 : 32, sysinfo->platform()); // Hercules %d-bit for %s clif->message(fd, atcmd_output); - sprintf(atcmd_output, msg_fd(fd,1295), sysinfo->vcstype(), sysinfo->vcsrevision_src(), sysinfo->vcsrevision_scripts()); // %s revision '%s' (src) / '%s' (scripts) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1295), sysinfo->vcstype(), sysinfo->vcsrevision_src(), sysinfo->vcsrevision_scripts()); // %s revision '%s' (src) / '%s' (scripts) clif->message(fd, atcmd_output); return true; @@ -7257,7 +7263,7 @@ ACMD(version) { /*========================================== * @mutearea by MouseJstr *------------------------------------------*/ -int atcommand_mutearea_sub(struct block_list *bl,va_list ap) +int atcommand_mutearea_sub(struct block_list *bl, va_list ap) { // As it is being used [ACMD(mutearea)] there's no need to be a bool, but if there's need to reuse it, it's better to be this way int time, id; @@ -7281,7 +7287,7 @@ int atcommand_mutearea_sub(struct block_list *bl,va_list ap) ACMD(mutearea) { int time; - if (!message || !*message) { + if (!*message) { clif->message(fd, msg_fd(fd,1297)); // Please enter a time in minutes (usage: @mutearea/@stfu <time in minutes>). return false; } @@ -7295,23 +7301,22 @@ ACMD(mutearea) { return true; } - ACMD(rates) { char buf[CHAT_SIZE_MAX]; memset(buf, '\0', sizeof(buf)); - snprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1298), // Experience rates: Base %.2fx / Job %.2fx + safesnprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1298), // Experience rates: Base %.2fx / Job %.2fx battle_config.base_exp_rate/100., battle_config.job_exp_rate/100.); clif->message(fd, buf); - snprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1299), // Normal Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx + safesnprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1299), // Normal Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx battle_config.item_rate_common/100., battle_config.item_rate_heal/100., battle_config.item_rate_use/100., battle_config.item_rate_equip/100., battle_config.item_rate_card/100.); clif->message(fd, buf); - snprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1300), // Boss Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx + safesnprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1300), // Boss Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx battle_config.item_rate_common_boss/100., battle_config.item_rate_heal_boss/100., battle_config.item_rate_use_boss/100., battle_config.item_rate_equip_boss/100., battle_config.item_rate_card_boss/100.); clif->message(fd, buf); - snprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1301), // Other Drop Rates: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx + safesnprintf(buf, CHAT_SIZE_MAX, msg_fd(fd,1301), // Other Drop Rates: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx battle_config.item_rate_mvp/100., battle_config.item_rate_adddrop/100., battle_config.item_rate_treasure/100.); clif->message(fd, buf); @@ -7334,12 +7339,12 @@ ACMD(me) (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCHAT))) return false; - if (!message || !*message || sscanf(message, "%199[^\n]", tempmes) < 0) { + if (!*message || sscanf(message, "%199[^\n]", tempmes) < 0) { clif->message(fd, msg_fd(fd,1302)); // Please enter a message (usage: @me <message>). return false; } - sprintf(atcmd_output, msg_fd(fd,270), sd->status.name, tempmes); // *%s %s* + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,270), sd->status.name, tempmes); // *%s %s* clif->disp_overhead(&sd->bl, atcmd_output); return true; @@ -7380,17 +7385,17 @@ ACMD(sizeall) size = cap_value(size,0,2); iter = mapit_getallusers(); - for( pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter) ) { - if( pl_sd->state.size != size ) { - if( pl_sd->state.size ) { + for (pl_sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); pl_sd = (TBL_PC*)mapit->next(iter)) { + if (pl_sd->state.size != size) { + if (pl_sd->state.size) { pl_sd->state.size = SZ_SMALL; pc->setpos(pl_sd, pl_sd->mapindex, pl_sd->bl.x, pl_sd->bl.y, CLR_TELEPORT); } pl_sd->state.size = size; - if( size == SZ_MEDIUM ) + if (size == SZ_MEDIUM) clif->specialeffect(&pl_sd->bl,420,AREA); - else if( size == SZ_BIG ) + else if (size == SZ_BIG) clif->specialeffect(&pl_sd->bl,422,AREA); } } @@ -7409,20 +7414,20 @@ ACMD(sizeguild) memset(guild_name, '\0', sizeof(guild_name)); - if( !message || !*message || sscanf(message, "%d %23[^\n]", &size, guild_name) < 2 ) { + if (!*message || sscanf(message, "%d %23[^\n]", &size, guild_name) < 2) { clif->message(fd, msg_fd(fd,1304)); // Please enter guild name/ID (usage: @sizeguild <size> <guild name/ID>). return false; } - if( (g = guild->searchname(guild_name)) == NULL && (g = guild->search(atoi(guild_name))) == NULL ) { + if ((g = guild->searchname(guild_name)) == NULL && (g = guild->search(atoi(guild_name))) == NULL) { clif->message(fd, msg_fd(fd,94)); // Incorrect name/ID, or no one from the guild is online. return false; } size = cap_value(size,SZ_SMALL,SZ_BIG); - for( i = 0; i < g->max_member; i++ ) { - if( (pl_sd = g->member[i].sd) && pl_sd->state.size != size ) { + for (i = 0; i < g->max_member; i++) { + if ((pl_sd = g->member[i].sd) && pl_sd->state.size != size) { if( pl_sd->state.size ) { pl_sd->state.size = SZ_SMALL; pc->setpos(pl_sd, pl_sd->mapindex, pl_sd->bl.x, pl_sd->bl.y, CLR_TELEPORT); @@ -7462,9 +7467,9 @@ ACMD(monsterignore) *------------------------------------------*/ ACMD(fakename) { - if( !message || !*message ) + if (!*message) { - if( sd->fakename[0] ) + if (sd->fakename[0]) { sd->fakename[0] = '\0'; clif->charnameack(0, &sd->bl); @@ -7478,7 +7483,7 @@ ACMD(fakename) return false; } - if( strlen(message) < 2 ) + if (strlen(message) < 2) { clif->message(sd->fd, msg_fd(fd,1309)); // Fake name must be at least two characters. return false; @@ -7486,7 +7491,7 @@ ACMD(fakename) safestrncpy(sd->fakename, message, sizeof(sd->fakename)); clif->charnameack(0, &sd->bl); - if( sd->disguise ) // Another packet should be sent so the client updates the name for sd + if (sd->disguise) // Another packet should be sent so the client updates the name for sd clif->charnameack(sd->fd, &sd->bl); clif->message(sd->fd, msg_fd(fd,1310)); // Fake name enabled. @@ -7497,11 +7502,11 @@ ACMD(fakename) * Ragnarok Resources *------------------------------------------*/ ACMD(mapflag) { -#define CHECKFLAG( cmd ) do { if ( map->list[ sd->bl.m ].flag.cmd ) clif->message(sd->fd,#cmd); } while(0) +#define CHECKFLAG( cmd ) do { if (map->list[ sd->bl.m ].flag.cmd ) clif->message(sd->fd,#cmd);} while(0) #define SETFLAG( cmd ) do { \ - if ( strcmp( flag_name , #cmd ) == 0 ) { \ + if (strcmp( flag_name , #cmd ) == 0) { \ map->list[ sd->bl.m ].flag.cmd = flag; \ - sprintf(atcmd_output,"[ @mapflag ] %s flag has been set to %s value = %hd",#cmd,flag?"On":"Off",flag); \ + safesnprintf(atcmd_output, sizeof(atcmd_output),"[ @mapflag ] %s flag has been set to %s value = %hd",#cmd,flag?"On":"Off",flag); \ clif->message(sd->fd,atcmd_output); \ return true; \ } \ @@ -7512,7 +7517,7 @@ ACMD(mapflag) { memset(flag_name, '\0', sizeof(flag_name)); - if (!message || !*message || (sscanf(message, "%99s %hd", flag_name, &flag) < 1)) { + if (!*message || (sscanf(message, "%99s %5hd", flag_name, &flag) < 1)) { clif->message(sd->fd,msg_fd(fd,1311)); // Enabled Mapflags in this map: clif->message(sd->fd,"----------------------------------"); CHECKFLAG(autotrade); CHECKFLAG(allowks); CHECKFLAG(nomemo); CHECKFLAG(noteleport); @@ -7535,18 +7540,18 @@ ACMD(mapflag) { } for (i = 0; flag_name[i]; i++) flag_name[i] = TOLOWER(flag_name[i]); //lowercase - if ( strcmp( flag_name , "gvg" ) == 0 ) { + if (strcmp( flag_name , "gvg" ) == 0) { if( flag && !map->list[sd->bl.m].flag.gvg ) map->zone_change2(sd->bl.m,strdb_get(map->zone_db, MAP_ZONE_GVG_NAME)); else if ( !flag && map->list[sd->bl.m].flag.gvg ) map->zone_change2(sd->bl.m,map->list[sd->bl.m].prev_zone); } else if ( strcmp( flag_name , "pvp" ) == 0 ) { - if( flag && !map->list[sd->bl.m].flag.pvp ) + if ( flag && !map->list[sd->bl.m].flag.pvp ) map->zone_change2(sd->bl.m,strdb_get(map->zone_db, MAP_ZONE_PVP_NAME)); else if ( !flag && map->list[sd->bl.m].flag.pvp ) map->zone_change2(sd->bl.m,map->list[sd->bl.m].prev_zone); } else if ( strcmp( flag_name , "battleground" ) == 0 ) { - if( flag && !map->list[sd->bl.m].flag.battleground ) + if ( flag && !map->list[sd->bl.m].flag.battleground ) map->zone_change2(sd->bl.m,strdb_get(map->zone_db, MAP_ZONE_BG_NAME)); else if ( !flag && map->list[sd->bl.m].flag.battleground ) map->zone_change2(sd->bl.m,map->list[sd->bl.m].prev_zone); @@ -7638,36 +7643,36 @@ ACMD(invite) { unsigned int did = sd->duel_group; struct map_session_data *target_sd = map->nick2sd((char *)message); - if(did == 0) + if (did == 0) { // "Duel: @invite without @duel." clif->message(fd, msg_fd(fd,350)); return false; } - if(duel->list[did].max_players_limit > 0 && - duel->list[did].members_count >= duel->list[did].max_players_limit) { + if (duel->list[did].max_players_limit > 0 && + duel->list[did].members_count >= duel->list[did].max_players_limit) { // "Duel: Limit of players is reached." clif->message(fd, msg_fd(fd,351)); return false; } - if(target_sd == NULL) { + if (target_sd == NULL) { // "Duel: Player not found." clif->message(fd, msg_fd(fd,352)); return false; } - if(target_sd->duel_group > 0 || target_sd->duel_invite > 0) { + if (target_sd->duel_group > 0 || target_sd->duel_invite > 0) { // "Duel: Player already in duel." clif->message(fd, msg_fd(fd,353)); return false; } - if(battle_config.duel_only_on_same_map && target_sd->bl.m != sd->bl.m) + if (battle_config.duel_only_on_same_map && target_sd->bl.m != sd->bl.m) { // "Duel: You can't invite %s because he/she isn't in the same map." - sprintf(atcmd_output, msg_fd(fd,364), message); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,364), message); clif->message(fd, atcmd_output); return false; } @@ -7681,18 +7686,18 @@ ACMD(invite) { ACMD(duel) { unsigned int maxpl = 0; - if(sd->duel_group > 0) { + if (sd->duel_group > 0) { duel->showinfo(sd->duel_group, sd); return true; } - if(sd->duel_invite > 0) { + if (sd->duel_invite > 0) { // "Duel: @duel without @reject." clif->message(fd, msg_fd(fd,355)); return false; } - if(!duel->checktime(sd)) { + if (!duel->checktime(sd)) { char output[CHAT_SIZE_MAX]; // "Duel: You can take part in duel only one time per %d minutes." sprintf(output, msg_fd(fd,356), battle_config.duel_time_interval); @@ -7700,9 +7705,9 @@ ACMD(duel) { return false; } - if( message[0] ) { - if(sscanf(message, "%u", &maxpl) >= 1) { - if(maxpl < 2 || maxpl > 65535) { + if (message[0]) { + if (sscanf(message, "%12u", &maxpl) >= 1) { + if (maxpl < 2 || maxpl > 65535) { clif->message(fd, msg_fd(fd,357)); // "Duel: Invalid value." return false; } @@ -7710,10 +7715,10 @@ ACMD(duel) { } else { struct map_session_data *target_sd; target_sd = map->nick2sd((char *)message); - if(target_sd != NULL) { + if (target_sd != NULL) { unsigned int newduel; - if((newduel = duel->create(sd, 2)) != -1) { - if(target_sd->duel_group > 0 || target_sd->duel_invite > 0) { + if ((newduel = duel->create(sd, 2)) != -1) { + if (target_sd->duel_group > 0 || target_sd->duel_invite > 0) { clif->message(fd, msg_fd(fd,353)); // "Duel: Player already in duel." return false; } @@ -7732,9 +7737,8 @@ ACMD(duel) { return true; } - ACMD(leave) { - if(sd->duel_group <= 0) { + if (sd->duel_group <= 0) { // "Duel: @leave without @duel." clif->message(fd, msg_fd(fd,358)); return false; @@ -7745,7 +7749,7 @@ ACMD(leave) { } ACMD(accept) { - if(!duel->checktime(sd)) { + if (!duel->checktime(sd)) { char output[CHAT_SIZE_MAX]; // "Duel: You can take part in duel only one time per %d minutes." sprintf(output, msg_fd(fd,356), battle_config.duel_time_interval); @@ -7753,14 +7757,14 @@ ACMD(accept) { return false; } - if(sd->duel_invite <= 0) { + if (sd->duel_invite <= 0) { // "Duel: @accept without invitation." clif->message(fd, msg_fd(fd,360)); return false; } - if( duel->list[sd->duel_invite].max_players_limit > 0 - && duel->list[sd->duel_invite].members_count >= duel->list[sd->duel_invite].max_players_limit ) { + if (duel->list[sd->duel_invite].max_players_limit > 0 + && duel->list[sd->duel_invite].members_count >= duel->list[sd->duel_invite].max_players_limit) { // "Duel: Limit of players is reached." clif->message(fd, msg_fd(fd,351)); return false; @@ -7773,7 +7777,7 @@ ACMD(accept) { } ACMD(reject) { - if(sd->duel_invite <= 0) { + if (sd->duel_invite <= 0) { // "Duel: @reject without invitation." clif->message(fd, msg_fd(fd,362)); return false; @@ -7794,12 +7798,12 @@ ACMD(cash) int value; int ret=0; - if( !message || !*message || (value = atoi(message)) == 0 ) { + if (!*message || (value = atoi(message)) == 0) { clif->message(fd, msg_fd(fd,1322)); // Please enter an amount. return false; } - if( !strcmpi(info->command,"cash") ) { + if (!strcmpi(info->command,"cash")) { if( value > 0 ) { if( (ret=pc->getcash(sd, value, 0)) >= 0){ // If this option is set, the message is already sent by pc function @@ -7847,17 +7851,17 @@ ACMD(clone) { int x=0,y=0,flag=0,master=0,i=0; struct map_session_data *pl_sd=NULL; - if (!message || !*message) { + if (!*message) { clif->message(sd->fd,msg_fd(fd,1323)); // You must enter a player name or ID. return false; } - if((pl_sd=map->nick2sd((char *)message)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) { + if ((pl_sd=map->nick2sd((char *)message)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) { clif->message(fd, msg_fd(fd,3)); // Character not found. return false; } - if(pc_get_group_level(pl_sd) > pc_get_group_level(sd)) { + if (pc_get_group_level(pl_sd) > pc_get_group_level(sd)) { clif->message(fd, msg_fd(fd,126)); // Cannot clone a player of higher GM level than yourself. return false; } @@ -7866,7 +7870,7 @@ ACMD(clone) { flag = 1; else if (strcmpi(info->command, "slaveclone") == 0) { flag = 2; - if(pc_isdead(sd)){ + if (pc_isdead(sd)){ //"Unable to spawn slave clone." clif->message(fd, msg_fd(fd,129+flag*2)); return false; @@ -7882,14 +7886,14 @@ ACMD(clone) { do { x = sd->bl.x + (rnd() % 10 - 5); y = sd->bl.y + (rnd() % 10 - 5); - } while (map->getcell(sd->bl.m,x,y,CELL_CHKNOPASS) && i++ < 10); + } while (map->getcell(sd->bl.m, &sd->bl, x, y, CELL_CHKNOPASS) && i++ < 10); if (i >= 10) { x = sd->bl.x; y = sd->bl.y; } - if((x = mob->clone_spawn(pl_sd, sd->bl.m, x, y, "", master, 0, flag?1:0, 0)) > 0) { + if ((x = mob->clone_spawn(pl_sd, sd->bl.m, x, y, "", master, 0, flag?1:0, 0)) > 0) { clif->message(fd, msg_fd(fd,128+flag*2)); // Evil Clone spawned. Clone spawned. Slave clone spawned. return true; } @@ -7903,7 +7907,7 @@ ACMD(clone) { *-------------------------------------*/ ACMD(noask) { - if(sd->state.noask) { + if (sd->state.noask) { clif->message(fd, msg_fd(fd,391)); // Autorejecting is deactivated. sd->state.noask = 0; } else { @@ -7920,12 +7924,12 @@ ACMD(noask) *-------------------------------------*/ ACMD(request) { - if (!message || !*message) { + if (!*message) { clif->message(sd->fd,msg_fd(fd,277)); // Usage: @request <petition/message to online GMs>. return false; } - sprintf(atcmd_output, msg_fd(fd,278), message); // (@request): %s + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,278), message); // (@request): %s intif->wis_message_to_gm(sd->status.name, PC_PERM_RECEIVE_REQUESTS, atcmd_output); clif_disp_onlyself(sd, atcmd_output, strlen(atcmd_output)); clif->message(sd->fd,msg_fd(fd,279)); // @request sent. @@ -7965,7 +7969,7 @@ ACMD(ksprotection) { if( sd->state.noks ) { sd->state.noks = KSPROTECT_NONE; clif->message(fd, msg_fd(fd,1325)); // [ K.S Protection Inactive ] - } else if( !message || !*message || strcmpi(message, "party") == 0 ) { + } else if (!*message || strcmpi(message, "party") == 0) { // Default is Party sd->state.noks = KSPROTECT_PARTY; clif->message(fd, msg_fd(fd,1326)); // [ K.S Protection Active - Option: Party ] @@ -7998,7 +8002,7 @@ ACMD(allowks) ACMD(resetstat) { pc->resetstate(sd); - sprintf(atcmd_output, msg_fd(fd,207), sd->status.name); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,207), sd->status.name); clif->message(fd, atcmd_output); return true; } @@ -8006,7 +8010,7 @@ ACMD(resetstat) ACMD(resetskill) { pc->resetskill(sd, PCRESETSKILL_RESYNC); - sprintf(atcmd_output, msg_fd(fd,206), sd->status.name); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,206), sd->status.name); clif->message(fd, atcmd_output); return true; } @@ -8226,13 +8230,13 @@ ACMD(delitem) { int nameid, amount = 0, total, idx; struct item_data* id; - if( !message || !*message || ( sscanf(message, "\"%99[^\"]\" %d", item_name, &amount) < 2 && sscanf(message, "%99s %d", item_name, &amount) < 2 ) || amount < 1 ) + if (!*message || (sscanf(message, "\"%99[^\"]\" %12d", item_name, &amount) < 2 && sscanf(message, "%99s %12d", item_name, &amount) < 2) || amount < 1) { clif->message(fd, msg_fd(fd,1355)); // Please enter an item name/ID, a quantity, and a player name (usage: #delitem <player> <item_name_or_ID> <quantity>). return false; } - if( ( id = itemdb->search_name(item_name) ) != NULL || ( id = itemdb->exists(atoi(item_name)) ) != NULL ) + if ((id = itemdb->search_name(item_name)) != NULL || (id = itemdb->exists(atoi(item_name))) != NULL) { nameid = id->nameid; } @@ -8258,7 +8262,7 @@ ACMD(delitem) { } // notify target - sprintf(atcmd_output, msg_fd(fd,113), total-amount); // %d item(s) removed by a GM. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,113), total-amount); // %d item(s) removed by a GM. clif->message(sd->fd, atcmd_output); // notify source @@ -8268,12 +8272,12 @@ ACMD(delitem) { } else if( amount ) { - sprintf(atcmd_output, msg_fd(fd,115), total-amount, total-amount, total); // %d item(s) removed. Player had only %d on %d items. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,115), total-amount, total-amount, total); // %d item(s) removed. Player had only %d on %d items. clif->message(fd, atcmd_output); } else { - sprintf(atcmd_output, msg_fd(fd,114), total); // %d item(s) removed from the player. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,114), total); // %d item(s) removed from the player. clif->message(fd, atcmd_output); } return true; @@ -8365,7 +8369,7 @@ void atcommand_commands_sub(struct map_session_data* sd, const int fd, AtCommand dbi_destroy(iter); clif->message(fd,line_buff); - sprintf(atcmd_output, msg_fd(fd,274), count); // "%d commands found." + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,274), count); // "%d commands found." clif->message(fd, atcmd_output); return; @@ -8410,7 +8414,7 @@ ACMD(cashmount) ACMD(accinfo) { char query[NAME_LENGTH]; - if (!message || !*message || strlen(message) > NAME_LENGTH ) { + if (!*message || strlen(message) > NAME_LENGTH ) { clif->message(fd, msg_fd(fd,1365)); // Usage: @accinfo/@accountinfo <account_id/char name> clif->message(fd, msg_fd(fd,1366)); // You may search partial name by making use of '%' in the search, ex. "@accinfo %Mario%" lists all characters whose name contains "Mario". return false; @@ -8431,7 +8435,7 @@ ACMD(set) { bool is_str = false; size_t len; - if( !message || !*message || (toset = sscanf(message, "%31s %127[^\n]s", reg, val)) < 1 ) { + if (!*message || (toset = sscanf(message, "%31s %127[^\n]s", reg, val)) < 1) { clif->message(fd, msg_fd(fd,1367)); // Usage: @set <variable name> <value> clif->message(fd, msg_fd(fd,1368)); // Usage: ex. "@set PoringCharVar 50" clif->message(fd, msg_fd(fd,1369)); // Usage: ex. "@set PoringCharVarSTR$ Super Duper String" @@ -8514,16 +8518,16 @@ ACMD(set) { switch( data->type ) { case C_INT: - sprintf(atcmd_output,msg_fd(fd,1373),reg,data->u.num); // %s value is now :%d + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1373),reg,data->u.num); // %s value is now :%d break; case C_STR: - sprintf(atcmd_output,msg_fd(fd,1374),reg,data->u.str); // %s value is now :%s + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1374),reg,data->u.str); // %s value is now :%s break; case C_CONSTSTR: - sprintf(atcmd_output,msg_fd(fd,1375),reg); // %s is empty + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1375),reg); // %s is empty break; default: - sprintf(atcmd_output,msg_fd(fd,1376),reg,data->type); // %s data type is not supported :%u + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1376),reg,data->type); // %s data type is not supported :%u break; } clif->message(fd, atcmd_output); @@ -8541,12 +8545,12 @@ ACMD(addperm) { bool add = (strcmpi(info->command, "addperm") == 0) ? true : false; int i; - if( !message || !*message ) { - sprintf(atcmd_output, msg_fd(fd,1378),command); // Usage: %s <permission_name> + if (!*message) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1378),command); // Usage: %s <permission_name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1379)); // -- Permission List for( i = 0; i < perm_size; i++ ) { - sprintf(atcmd_output,"- %s",pcg->permissions[i].name); + safesnprintf(atcmd_output, sizeof(atcmd_output),"- %s",pcg->permissions[i].name); clif->message(fd, atcmd_output); } return false; @@ -8554,28 +8558,28 @@ ACMD(addperm) { ARR_FIND(0, perm_size, i, strcmpi(pcg->permissions[i].name, message) == 0); if( i == perm_size ) { - sprintf(atcmd_output,msg_fd(fd,1380),message); // '%s' is not a known permission. + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1380),message); // '%s' is not a known permission. clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1379)); // -- Permission List for( i = 0; i < perm_size; i++ ) { - sprintf(atcmd_output,"- %s",pcg->permissions[i].name); + safesnprintf(atcmd_output, sizeof(atcmd_output),"- %s",pcg->permissions[i].name); clif->message(fd, atcmd_output); } return false; } if( add && (sd->extra_temp_permissions&pcg->permissions[i].permission) ) { - sprintf(atcmd_output, msg_fd(fd,1381),sd->status.name,pcg->permissions[i].name); // User '%s' already possesses the '%s' permission. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1381),sd->status.name,pcg->permissions[i].name); // User '%s' already possesses the '%s' permission. clif->message(fd, atcmd_output); return false; } else if ( !add && !(sd->extra_temp_permissions&pcg->permissions[i].permission) ) { - sprintf(atcmd_output, msg_fd(fd,1382),sd->status.name,pcg->permissions[i].name); // User '%s' doesn't possess the '%s' permission. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1382),sd->status.name,pcg->permissions[i].name); // User '%s' doesn't possess the '%s' permission. clif->message(fd, atcmd_output); - sprintf(atcmd_output,msg_fd(fd,1383),sd->status.name); // -- User '%s' Permissions + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1383),sd->status.name); // -- User '%s' Permissions clif->message(fd, atcmd_output); for( i = 0; i < perm_size; i++ ) { if( sd->extra_temp_permissions&pcg->permissions[i].permission ) { - sprintf(atcmd_output,"- %s",pcg->permissions[i].name); + safesnprintf(atcmd_output, sizeof(atcmd_output),"- %s",pcg->permissions[i].name); clif->message(fd, atcmd_output); } } @@ -8587,21 +8591,21 @@ ACMD(addperm) { else sd->extra_temp_permissions &=~ pcg->permissions[i].permission; - sprintf(atcmd_output, msg_fd(fd,1384),sd->status.name); // User '%s' permissions updated successfully. The changes are temporary. + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1384),sd->status.name); // User '%s' permissions updated successfully. The changes are temporary. clif->message(fd, atcmd_output); return true; } ACMD(unloadnpcfile) { - if( !message || !*message ) { + if (!*message) { clif->message(fd, msg_fd(fd,1385)); // Usage: @unloadnpcfile <file name> return false; } - if( npc->unloadfile(message) ) + if (npc->unloadfile(message)) { clif->message(fd, msg_fd(fd,1386)); // File unloaded. Be aware that mapflags and monsters spawned directly are not removed. - else { + } else { clif->message(fd, msg_fd(fd,1387)); // File not found. return false; } @@ -8614,14 +8618,12 @@ ACMD(cart) { sd->status.skill[idx].flag = (x)?1:0; \ } while(0) - int val; + int val = atoi(message); bool need_skill = pc->checkskill(sd, MC_PUSHCART) ? false : true; unsigned int index = skill->get_index(MC_PUSHCART); - if (message) - val = atoi(message); - if( !message || !*message || val < 0 || val > MAX_CARTS ) { - sprintf(atcmd_output, msg_fd(fd,1390),command,MAX_CARTS); // Unknown Cart (usage: %s <0-%d>). + if (!*message || val < 0 || val > MAX_CARTS) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1390),command,MAX_CARTS); // Unknown Cart (usage: %s <0-%d>). clif->message(fd, atcmd_output); return false; } @@ -8658,16 +8660,16 @@ ACMD(join) char name[HCS_NAME_LENGTH], pass[HCS_NAME_LENGTH]; enum channel_operation_status ret = HCS_STATUS_OK; - if (!message || !*message || sscanf(message, "%19s %19s", name, pass) < 1) { - sprintf(atcmd_output, msg_fd(fd,1399),command); // Unknown Channel (usage: %s <#channel_name>) + if (!*message || sscanf(message, "%19s %19s", name, pass) < 1) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1399),command); // Unknown Channel (usage: %s <#channel_name>) clif->message(fd, atcmd_output); return false; } chan = channel->search(name, sd); - if(!chan) { - sprintf(atcmd_output, msg_fd(fd,1400),name,command); // Unknown Channel '%s' (usage: %s <#channel_name>) + if (!chan) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1400),name,command); // Unknown Channel '%s' (usage: %s <#channel_name>) clif->message(fd, atcmd_output); return false; } @@ -8675,19 +8677,19 @@ ACMD(join) ret = channel->join(chan, sd, pass, false); if (ret == HCS_STATUS_ALREADY) { - sprintf(atcmd_output, msg_fd(fd,1436),name); // You're already in the '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1436),name); // You're already in the '%s' channel clif->message(fd, atcmd_output); return false; } if (ret == HCS_STATUS_NOPERM) { - sprintf(atcmd_output, msg_fd(fd,1401),name,command); // '%s' Channel is password protected (usage: %s <#channel_name> <password>) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1401),name,command); // '%s' Channel is password protected (usage: %s <#channel_name> <password>) clif->message(fd, atcmd_output); return false; } if (ret == HCS_STATUS_BANNED) { - sprintf(atcmd_output, msg_fd(fd,1438),name); // You cannot join the '%s' channel because you've been banned from it + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1438),name); // You cannot join the '%s' channel because you've been banned from it clif->message(fd, atcmd_output); return false; } @@ -8695,51 +8697,52 @@ ACMD(join) return true; } /* [Ind/Hercules] */ -static inline void atcmd_channel_help(int fd, const char *command, bool can_create) { - sprintf(atcmd_output, msg_fd(fd,1404),command); // %s failed. +void atcommand_channel_help(int fd, const char *command, bool can_create) { + nullpo_retv(command); + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1404),command); // %s failed. clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1414));// --- Available options: if( can_create ) { - sprintf(atcmd_output, msg_fd(fd,1415),command);// -- %s create <channel name> <channel password> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1415),command);// -- %s create <channel name> <channel password> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1416));// - creates a new channel } - sprintf(atcmd_output, msg_fd(fd,1417),command);// -- %s list + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1417),command);// -- %s list clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1418));// - lists public channels if( can_create ) { - sprintf(atcmd_output, msg_fd(fd,1419),command);// -- %s list colors + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1419),command);// -- %s list colors clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1420));// - lists colors available to select for custom channels - sprintf(atcmd_output, msg_fd(fd,1421),command);// -- %s setcolor <channel name> <color name> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1421),command);// -- %s setcolor <channel name> <color name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1422));// - changes <channel name> color to <color name> } - sprintf(atcmd_output, msg_fd(fd,1423),command);// -- %s leave <channel name> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1423),command);// -- %s leave <channel name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1424));// - leaves <channel name> - sprintf(atcmd_output, msg_fd(fd,1427),command);// -- %s bindto <channel name> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1427),command);// -- %s bindto <channel name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1428));// - binds global chat to <channel name>, making anything you type in global be sent to the channel - sprintf(atcmd_output, msg_fd(fd,1429),command);// -- %s unbind + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1429),command);// -- %s unbind clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1430));// - unbinds your global chat from its attached channel (if binded) - sprintf(atcmd_output, msg_fd(fd,1429),command);// -- %s unbind + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1429),command);// -- %s unbind clif->message(fd, atcmd_output); if( can_create ) { - sprintf(atcmd_output, msg_fd(fd,1456),command);// -- %s ban <channel name> <character name> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1456),command);// -- %s ban <channel name> <character name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1457));// - bans <character name> from <channel name> channel - sprintf(atcmd_output, msg_fd(fd,1458),command);// -- %s banlist <channel name> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1458),command);// -- %s banlist <channel name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1459));// - lists all banned characters from <channel name> channel - sprintf(atcmd_output, msg_fd(fd,1460),command);// -- %s unban <channel name> <character name> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1460),command);// -- %s unban <channel name> <character name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1461));// - unbans <character name> from <channel name> channel - sprintf(atcmd_output, msg_fd(fd,1467),command);// -- %s unbanall <channel name> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1467),command);// -- %s unbanall <channel name> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1468));// - unbans everyone from <channel name> - sprintf(atcmd_output, msg_fd(fd,1462),command);// -- %s setopt <channel name> <option name> <option value> + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1462),command);// -- %s setopt <channel name> <option name> <option value> clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1463));// - adds or removes <option name> with <option value> to <channel name> channel } @@ -8751,20 +8754,20 @@ ACMD(channel) { unsigned char k = 0; sub1[0] = sub2[0] = sub3[0] = '\0'; - if (!message || !*message || sscanf(message, "%19s %19s %19s %19s", subcmd, sub1, sub2, sub3) < 1) { - atcmd_channel_help(fd,command, (channel->config->allow_user_channel_creation || pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN))); + if (!*message || sscanf(message, "%19s %19s %19s %19s", subcmd, sub1, sub2, sub3) < 1) { + atcommand->channel_help(fd,command, (channel->config->allow_user_channel_creation || pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN))); return true; } if (strcmpi(subcmd,"create") == 0 && (channel->config->allow_user_channel_creation || pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN))) { // sub1 = channel name; sub2 = password; sub3 = unused size_t len = strlen(sub1); - const char *pass = *sub2 ? sub2 : NULL; + const char *pass = *sub2 ? sub2 : ""; if (sub1[0] != '#') { clif->message(fd, msg_fd(fd,1405));// Channel name must start with a '#' return false; } else if (len < 3 || len > HCS_NAME_LENGTH) { - sprintf(atcmd_output, msg_fd(fd,1406), HCS_NAME_LENGTH);// Channel length must be between 3 and %d + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1406), HCS_NAME_LENGTH);// Channel length must be between 3 and %d clif->message(fd, atcmd_output); return false; } else if (sub3[0] != '\0') { @@ -8772,7 +8775,7 @@ ACMD(channel) { return false; } if (strcmpi(sub1 + 1, channel->config->local_name) == 0 || strcmpi(sub1 + 1, channel->config->ally_name) == 0 || strdb_exists(channel->db, sub1 + 1)) { - sprintf(atcmd_output, msg_fd(fd,1407), sub1);// Channel '%s' is not available + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1407), sub1);// Channel '%s' is not available clif->message(fd, atcmd_output); return false; } @@ -8786,7 +8789,7 @@ ACMD(channel) { // sub1 = list type; sub2 = unused; sub3 = unused if (sub1[0] != '\0' && strcmpi(sub1,"colors") == 0) { for (k = 0; k < channel->config->colors_count; k++) { - sprintf(atcmd_output, "[ %s list colors ] : %s", command, channel->config->colors_name[k]); + safesnprintf(atcmd_output, sizeof(atcmd_output), "[ %s list colors ] : %s", command, channel->config->colors_name[k]); clif->messagecolor_self(fd, channel->config->colors[k], atcmd_output); } @@ -8795,18 +8798,18 @@ ACMD(channel) { bool show_all = pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN) ? true : false; clif->message(fd, msg_fd(fd,1410)); // -- Public Channels if (channel->config->local) { - sprintf(atcmd_output, msg_fd(fd,1409), channel->config->local_name, map->list[sd->bl.m].channel ? db_size(map->list[sd->bl.m].channel->users) : 0);// - #%s ( %d users ) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1409), channel->config->local_name, map->list[sd->bl.m].channel ? db_size(map->list[sd->bl.m].channel->users) : 0);// - #%s ( %d users ) clif->message(fd, atcmd_output); } if (channel->config->ally && sd->status.guild_id) { struct guild *g = sd->guild; if( !g ) { dbi_destroy(iter); return false; } - sprintf(atcmd_output, msg_fd(fd,1409), channel->config->ally_name, db_size(g->channel->users));// - #%s ( %d users ) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1409), channel->config->ally_name, db_size(g->channel->users));// - #%s ( %d users ) clif->message(fd, atcmd_output); } for (chan = dbi_first(iter); dbi_exists(iter); chan = dbi_next(iter)) { if (show_all || chan->type == HCS_TYPE_PUBLIC || chan->type == HCS_TYPE_IRC) { - sprintf(atcmd_output, msg_fd(fd,1409), chan->name, db_size(chan->users));// - #%s ( %d users ) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1409), chan->name, db_size(chan->users));// - #%s ( %d users ) clif->message(fd, atcmd_output); } } @@ -8820,13 +8823,13 @@ ACMD(channel) { } if (!(chan = channel->search(sub1, sd))) { - sprintf(atcmd_output, msg_fd(fd,1407), sub1);// Channel '%s' is not available + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1407), sub1);// Channel '%s' is not available clif->message(fd, atcmd_output); return false; } if (chan->owner != sd->status.char_id && !pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN)) { - sprintf(atcmd_output, msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' clif->message(fd, atcmd_output); return false; } @@ -8836,12 +8839,12 @@ ACMD(channel) { break; } if (k == channel->config->colors_count) { - sprintf(atcmd_output, msg_fd(fd,1411), sub2);// Unknown color '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1411), sub2);// Unknown color '%s' clif->message(fd, atcmd_output); return false; } chan->color = k; - sprintf(atcmd_output, msg_fd(fd,1413), sub1, channel->config->colors_name[k]);// '%s' channel color updated to '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1413), sub1, channel->config->colors_name[k]);// '%s' channel color updated to '%s' clif->message(fd, atcmd_output); } else if (strcmpi(subcmd,"leave") == 0) { // sub1 = channel name; sub2 = unused; sub3 = unused @@ -8854,7 +8857,7 @@ ACMD(channel) { break; } if (k == sd->channel_count) { - sprintf(atcmd_output, msg_fd(fd,1425),sub1);// You're not part of the '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1425),sub1);// You're not part of the '%s' channel clif->message(fd, atcmd_output); return false; } @@ -8870,7 +8873,7 @@ ACMD(channel) { } else { channel->leave(sd->channels[k],sd); } - sprintf(atcmd_output, msg_fd(fd,1426),sub1); // You've left the '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1426),sub1); // You've left the '%s' channel clif->message(fd, atcmd_output); } else if (strcmpi(subcmd,"bindto") == 0) { // sub1 = channel name; sub2 = unused; sub3 = unused @@ -8884,13 +8887,13 @@ ACMD(channel) { break; } if (k == sd->channel_count) { - sprintf(atcmd_output, msg_fd(fd,1425),sub1);// You're not part of the '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1425),sub1);// You're not part of the '%s' channel clif->message(fd, atcmd_output); return false; } sd->gcbind = sd->channels[k]; - sprintf(atcmd_output, msg_fd(fd,1431),sub1); // Your global chat is now bound to the '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1431),sub1); // Your global chat is now bound to the '%s' channel clif->message(fd, atcmd_output); } else if (strcmpi(subcmd,"unbind") == 0) { // sub1 = unused; sub2 = unused; sub3 = unused @@ -8899,7 +8902,7 @@ ACMD(channel) { return false; } - sprintf(atcmd_output, msg_fd(fd,1433),sd->gcbind->name); // Your global chat is no longer bound to the '#%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1433),sd->gcbind->name); // Your global chat is no longer bound to the '#%s' channel clif->message(fd, atcmd_output); sd->gcbind = NULL; @@ -8915,19 +8918,19 @@ ACMD(channel) { } if (!(chan = channel->search(sub1, sd))) { - sprintf(atcmd_output, msg_fd(fd,1407), sub1);// Channel '%s' is not available + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1407), sub1);// Channel '%s' is not available clif->message(fd, atcmd_output); return false; } - if (!message || !*message || sscanf(message, "%19s %19s %23[^\n]", subcmd, sub1, sub4) < 3) { - sprintf(atcmd_output, msg_fd(fd,1434), sub4);// Player '%s' was not found + if (!*message || sscanf(message, "%19s %19s %23[^\n]", subcmd, sub1, sub4) < 3) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1434), sub4);// Player '%s' was not found clif->message(fd, atcmd_output); return false; } if (sub4[0] == '\0' || (pl_sd = map->nick2sd(sub4)) == NULL) { - sprintf(atcmd_output, msg_fd(fd,1434), sub4);// Player '%s' was not found + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1434), sub4);// Player '%s' was not found clif->message(fd, atcmd_output); return false; } @@ -8935,13 +8938,13 @@ ACMD(channel) { ret = channel->ban(chan, sd, pl_sd); if (ret == HCS_STATUS_NOPERM) { - sprintf(atcmd_output, msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' clif->message(fd, atcmd_output); return false; } if (ret == HCS_STATUS_ALREADY) { - sprintf(atcmd_output, msg_fd(fd,1465), pl_sd->status.name);// Player '%s' is already banned from this channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1465), pl_sd->status.name);// Player '%s' is already banned from this channel clif->message(fd, atcmd_output); return false; } @@ -8951,7 +8954,7 @@ ACMD(channel) { return false; } - sprintf(atcmd_output, msg_fd(fd,1437),pl_sd->status.name,sub1); // Player '%s' has now been banned from '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1437),pl_sd->status.name,sub1); // Player '%s' has now been banned from '%s' channel clif->message(fd, atcmd_output); } else if (strcmpi(subcmd,"unban") == 0) { // sub1 = channel name; sub2 = unused; sub3 = unused @@ -8964,34 +8967,34 @@ ACMD(channel) { return false; } if (!(chan = channel->search(sub1, sd))) { - sprintf(atcmd_output, msg_fd(fd,1407), sub1);// Channel '%s' is not available + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1407), sub1);// Channel '%s' is not available clif->message(fd, atcmd_output); return false; } - if (!message || !*message || sscanf(message, "%19s %19s %23[^\n]", subcmd, sub1, sub4) < 3) { - sprintf(atcmd_output, msg_fd(fd,1434), sub4);// Player '%s' was not found + if (!*message || sscanf(message, "%19s %19s %23[^\n]", subcmd, sub1, sub4) < 3) { + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1434), sub4);// Player '%s' was not found clif->message(fd, atcmd_output); return false; } if (sub4[0] == '\0' || (pl_sd = map->nick2sd(sub4)) == NULL) { - sprintf(atcmd_output, msg_fd(fd,1434), sub4);// Player '%s' was not found + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1434), sub4);// Player '%s' was not found clif->message(fd, atcmd_output); return false; } ret = channel->unban(chan, sd, pl_sd); if (ret == HCS_STATUS_NOPERM) { - sprintf(atcmd_output, msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' clif->message(fd, atcmd_output); return false; } if (ret == HCS_STATUS_ALREADY) { - sprintf(atcmd_output, msg_fd(fd,1440), pl_sd->status.name);// Player '%s' is not banned from this channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1440), pl_sd->status.name);// Player '%s' is not banned from this channel clif->message(fd, atcmd_output); return false; } - sprintf(atcmd_output, msg_fd(fd,1441),pl_sd->status.name,sub1); // Player '%s' has now been unbanned from the '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1441),pl_sd->status.name,sub1); // Player '%s' has now been unbanned from the '%s' channel clif->message(fd, atcmd_output); } else if (strcmpi(subcmd,"unbanall") == 0) { enum channel_operation_status ret = HCS_STATUS_OK; @@ -9001,23 +9004,23 @@ ACMD(channel) { return false; } if (!(chan = channel->search(sub1, sd))) { - sprintf(atcmd_output, msg_fd(fd,1407), sub1);// Channel '%s' is not available + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1407), sub1);// Channel '%s' is not available clif->message(fd, atcmd_output); return false; } ret = channel->unban(chan, sd, NULL); if (ret == HCS_STATUS_NOPERM) { - sprintf(atcmd_output, msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' clif->message(fd, atcmd_output); return false; } if (ret == HCS_STATUS_ALREADY) { - sprintf(atcmd_output, msg_fd(fd,1439), sub1);// Channel '%s' has no banned players + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1439), sub1);// Channel '%s' has no banned players clif->message(fd, atcmd_output); return false; } - sprintf(atcmd_output, msg_fd(fd,1442),sub1); // Removed all bans from '%s' channel + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1442),sub1); // Removed all bans from '%s' channel clif->message(fd, atcmd_output); } else if (strcmpi(subcmd,"banlist") == 0) { // sub1 = channel name; sub2 = unused; sub3 = unused @@ -9030,21 +9033,21 @@ ACMD(channel) { return false; } if (!(chan = channel->search(sub1, sd))) { - sprintf(atcmd_output, msg_fd(fd,1407), sub1);// Channel '%s' is not available + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1407), sub1);// Channel '%s' is not available clif->message(fd, atcmd_output); return false; } if (chan->owner != sd->status.char_id && !isA) { - sprintf(atcmd_output, msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' clif->message(fd, atcmd_output); return false; } if (!chan->banned) { - sprintf(atcmd_output, msg_fd(fd,1439), sub1);// Channel '%s' has no banned players + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1439), sub1);// Channel '%s' has no banned players clif->message(fd, atcmd_output); return false; } - sprintf(atcmd_output, msg_fd(fd,1443), chan->name);// -- '%s' ban list + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1443), chan->name);// -- '%s' ban list clif->message(fd, atcmd_output); iter = db_iterator(chan->banned); @@ -9052,9 +9055,9 @@ ACMD(channel) { struct channel_ban_entry *entry = DB->data2ptr(data); if (!isA) - sprintf(atcmd_output, msg_fd(fd,1444), entry->name);// - %s %s + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1444), entry->name);// - %s %s else - sprintf(atcmd_output, msg_fd(fd,1445), entry->name, key.i);// - %s (%d) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1445), entry->name, key.i);// - %s (%d) clif->message(fd, atcmd_output); } @@ -9071,12 +9074,12 @@ ACMD(channel) { return false; } if (!(chan = channel->search(sub1, sd))) { - sprintf(atcmd_output, msg_fd(fd,1407), sub1);// Channel '%s' is not available + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1407), sub1);// Channel '%s' is not available clif->message(fd, atcmd_output); return false; } if (chan->owner != sd->status.char_id && !pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN)) { - sprintf(atcmd_output, msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1412), sub1);// You're not the owner of channel '%s' clif->message(fd, atcmd_output); return false; } @@ -9089,27 +9092,27 @@ ACMD(channel) { break; } if (k == 3) { - sprintf(atcmd_output, msg_fd(fd,1447), sub2);// '%s' is not a known channel option + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1447), sub2);// '%s' is not a known channel option clif->message(fd, atcmd_output); clif->message(fd, msg_fd(fd,1448)); // -- Available options for (k = 1; k < 3; k++) { - sprintf(atcmd_output, msg_fd(fd,1444), opt_str[k]);// - '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1444), opt_str[k]);// - '%s' clif->message(fd, atcmd_output); } return false; } if (sub3[0] == '\0') { if (k == HCS_OPT_MSG_DELAY) { - sprintf(atcmd_output, msg_fd(fd,1466), opt_str[k]);// For '%s' you need the amount of seconds (from 0 to 10) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1466), opt_str[k]);// For '%s' you need the amount of seconds (from 0 to 10) clif->message(fd, atcmd_output); return false; } else if (chan->options & k) { - sprintf(atcmd_output, msg_fd(fd,1449), opt_str[k],opt_str[k]); // option '%s' is already enabled, if you'd like to disable it type '@channel setopt %s 0' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1449), opt_str[k],opt_str[k]); // option '%s' is already enabled, if you'd like to disable it type '@channel setopt %s 0' clif->message(fd, atcmd_output); return false; } else { channel->set_options(chan, chan->options | k); - sprintf(atcmd_output, msg_fd(fd,1450), opt_str[k],chan->name);//option '%s' is now enabled for channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1450), opt_str[k],chan->name);//option '%s' is now enabled for channel '%s' clif->message(fd, atcmd_output); return true; } @@ -9117,42 +9120,42 @@ ACMD(channel) { int v = atoi(sub3); if (k == HCS_OPT_MSG_DELAY) { if (v < 0 || v > 10) { - sprintf(atcmd_output, msg_fd(fd,1451), v, opt_str[k]);// value '%d' for option '%s' is out of range (limit is 0-10) + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1451), v, opt_str[k]);// value '%d' for option '%s' is out of range (limit is 0-10) clif->message(fd, atcmd_output); return false; } if (v == 0) { channel->set_options(chan, chan->options&~k); chan->msg_delay = 0; - sprintf(atcmd_output, msg_fd(fd,1453), opt_str[k],chan->name,v);// option '%s' is now disabled for channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1453), opt_str[k],chan->name,v);// option '%s' is now disabled for channel '%s' clif->message(fd, atcmd_output); return true; } else { channel->set_options(chan, chan->options | k); chan->msg_delay = v; - sprintf(atcmd_output, msg_fd(fd,1452), opt_str[k],chan->name,v);// option '%s' is now enabled for channel '%s' with %d seconds + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1452), opt_str[k],chan->name,v);// option '%s' is now enabled for channel '%s' with %d seconds clif->message(fd, atcmd_output); return true; } } else { if (v) { if (chan->options & k) { - sprintf(atcmd_output, msg_fd(fd,1449), opt_str[k],opt_str[k]); // option '%s' is already enabled, if you'd like to disable it type '@channel opt %s 0' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1449), opt_str[k],opt_str[k]); // option '%s' is already enabled, if you'd like to disable it type '@channel opt %s 0' clif->message(fd, atcmd_output); return false; } else { channel->set_options(chan, chan->options | k); - sprintf(atcmd_output, msg_fd(fd,1450), opt_str[k],chan->name);//option '%s' is now enabled for channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1450), opt_str[k],chan->name);//option '%s' is now enabled for channel '%s' clif->message(fd, atcmd_output); } } else { if (!(chan->options & k)) { - sprintf(atcmd_output, msg_fd(fd,1454), opt_str[k],chan->name); // option '%s' is not enabled on channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1454), opt_str[k],chan->name); // option '%s' is not enabled on channel '%s' clif->message(fd, atcmd_output); return false; } else { channel->set_options(chan, chan->options&~k); - sprintf(atcmd_output, msg_fd(fd,1453), opt_str[k],chan->name);// option '%s' is now disabled for channel '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1453), opt_str[k],chan->name);// option '%s' is now disabled for channel '%s' clif->message(fd, atcmd_output); return true; } @@ -9160,7 +9163,7 @@ ACMD(channel) { } } } else { - atcmd_channel_help(fd, command, (channel->config->allow_user_channel_creation || pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN))); + atcommand->channel_help(fd, command, (channel->config->allow_user_channel_creation || pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN))); } return true; } @@ -9168,9 +9171,9 @@ ACMD(channel) { ACMD(fontcolor) { unsigned char k; - if (!message || !*message) { + if (!*message) { for (k = 0; k < channel->config->colors_count; k++) { - sprintf(atcmd_output, "[ %s ] : %s", command, channel->config->colors_name[k]); + safesnprintf(atcmd_output, sizeof(atcmd_output), "[ %s ] : %s", command, channel->config->colors_name[k]); clif->messagecolor_self(fd, channel->config->colors[k], atcmd_output); } return false; @@ -9186,13 +9189,13 @@ ACMD(fontcolor) { break; } if( k == channel->config->colors_count ) { - sprintf(atcmd_output, msg_fd(fd,1411), message);// Unknown color '%s' + safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1411), message);// Unknown color '%s' clif->message(fd, atcmd_output); return false; } sd->fontcolor = k + 1; - sprintf(atcmd_output, "Color changed to '%s'", channel->config->colors_name[k]); + safesnprintf(atcmd_output, sizeof(atcmd_output), "Color changed to '%s'", channel->config->colors_name[k]); clif->messagecolor_self(fd, channel->config->colors[k], atcmd_output); return true; @@ -9200,7 +9203,7 @@ ACMD(fontcolor) { ACMD(searchstore){ int val = atoi(message); - switch( val ) { + switch (val) { case 0://EFFECTTYPE_NORMAL case 1://EFFECTTYPE_CASH break; @@ -9233,10 +9236,10 @@ ACMD(costume){ }; unsigned short k = 0, len = ARRAYLENGTH(names); - if( !message || !*message ) { + if (!*message) { for( k = 0; k < len; k++ ) { if( sd->sc.data[name2id[k]] ) { - sprintf(atcmd_output,msg_fd(fd,1473),names[k]);//Costume '%s' removed. + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1473),names[k]);//Costume '%s' removed. clif->message(sd->fd,atcmd_output); status_change_end(&sd->bl,name2id[k],INVALID_TIMER); return true; @@ -9244,7 +9247,7 @@ ACMD(costume){ } clif->message(sd->fd,msg_fd(fd,1472)); for( k = 0; k < len; k++ ) { - sprintf(atcmd_output,msg_fd(fd,1471),names[k]);//-- %s + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1471),names[k]);//-- %s clif->message(sd->fd,atcmd_output); } return false; @@ -9252,7 +9255,7 @@ ACMD(costume){ for( k = 0; k < len; k++ ) { if( sd->sc.data[name2id[k]] ) { - sprintf(atcmd_output,msg_fd(fd,1470),names[k]);// You're already with a '%s' costume, type '@costume' to remove it. + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1470),names[k]);// You're already with a '%s' costume, type '@costume' to remove it. clif->message(sd->fd,atcmd_output); return false; } @@ -9263,7 +9266,7 @@ ACMD(costume){ break; } if( k == len ) { - sprintf(atcmd_output,msg_fd(fd,1469),message);// '%s' is not a known costume + safesnprintf(atcmd_output, sizeof(atcmd_output),msg_fd(fd,1469),message);// '%s' is not a known costume clif->message(sd->fd,atcmd_output); return false; } @@ -9275,13 +9278,13 @@ ACMD(costume){ /* for debugging purposes (so users can easily provide us with debug info) */ /* should be trashed as soon as its no longer necessary */ ACMD(skdebug) { - sprintf(atcmd_output,"second: %u; third: %u", sd->sktree.second, sd->sktree.third); + safesnprintf(atcmd_output, sizeof(atcmd_output),"second: %u; third: %u", sd->sktree.second, sd->sktree.third); clif->message(fd,atcmd_output); - sprintf(atcmd_output,"pc_calc_skilltree_normalize_job: %d",pc->calc_skilltree_normalize_job(sd)); + safesnprintf(atcmd_output, sizeof(atcmd_output),"pc_calc_skilltree_normalize_job: %d",pc->calc_skilltree_normalize_job(sd)); clif->message(fd,atcmd_output); - sprintf(atcmd_output,"change_lv_2nd/3rd: %d/%d",sd->change_level_2nd,sd->change_level_3rd); + safesnprintf(atcmd_output, sizeof(atcmd_output),"change_lv_2nd/3rd: %d/%d",sd->change_level_2nd,sd->change_level_3rd); clif->message(fd,atcmd_output); - sprintf(atcmd_output,"pc_calc_skillpoint:%d",pc->calc_skillpoint(sd)); + safesnprintf(atcmd_output, sizeof(atcmd_output),"pc_calc_skillpoint:%d",pc->calc_skillpoint(sd)); clif->message(fd,atcmd_output); return true; } @@ -9291,15 +9294,15 @@ ACMD(skdebug) { ACMD(cddebug) { int i; struct skill_cd* cd = NULL; - - if( !(cd = idb_get(skill->cd_db,sd->status.char_id)) ) { + + if (!(cd = idb_get(skill->cd_db,sd->status.char_id))) { clif->message(fd,"No cool down list found"); } else { clif->messages(fd,"Found %d registered cooldowns",cd->cursor); for(i = 0; i < cd->cursor; i++) { if( cd->entry[i] ) { const struct TimerData *td = timer->get(cd->entry[i]->timer); - + if( !td || td->func != skill->blockpc_end ) { clif->messages(fd,"Found invalid entry in slot %d for skill %s",i,skill->dbs->db[cd->entry[i]->skidx].name); sd->blockskill[cd->entry[i]->skidx] = false; @@ -9307,8 +9310,8 @@ ACMD(cddebug) { } } } - - if( !cd || (message && *message && !strcmpi(message,"reset")) ) { + + if (!cd || (*message && !strcmpi(message,"reset"))) { for(i = 0; i < MAX_SKILL; i++) { if( sd->blockskill[i] ) { clif->messages(fd,"Found skill '%s', unblocking...",skill->dbs->db[i].name); @@ -9321,12 +9324,12 @@ ACMD(cddebug) { timer->delete(cd->entry[i]->timer,skill->blockpc_end); ers_free(skill->cd_entry_ers, cd->entry[i]); } - + idb_remove(skill->cd_db,sd->status.char_id); ers_free(skill->cd_ers, cd); } } - + return true; } @@ -9335,15 +9338,15 @@ ACMD(cddebug) { **/ ACMD(lang) { uint8 i; - - if( !message || !*message ) { + + if (!*message) { clif->messages(fd,"Usage: @%s <Language>",info->command); clif->messages(fd,"There are %d languages available:",script->max_lang_id); for(i = 0; i < script->max_lang_id; i++) clif->messages(fd,"- %s",script->languages[i]); return false; } - + for(i = 0; i < script->max_lang_id; i++) { if( strcmpi(message,script->languages[i]) == 0 ) { if( i == sd->lang_id ) { @@ -9355,14 +9358,14 @@ ACMD(lang) { break; } } - + if( i == script->max_lang_id ) { clif->messages(fd,"'%s' did not match any language available",message); clif->messages(fd,"There are %d languages available:",script->max_lang_id); for(i = 0; i < script->max_lang_id; i++) clif->messages(fd,"- %s",script->languages[i]); } - + return true; } /** @@ -9654,9 +9657,10 @@ void atcommand_basecommands(void) { #undef ACMD_DEF #undef ACMD_DEF2 -bool atcommand_add(char *name,AtCommandFunc func, bool replace) { +bool atcommand_add(char *name, AtCommandFunc func, bool replace) { AtCommandInfo* cmd; + nullpo_retr(false, name); if( (cmd = atcommand->exists(name)) ) { //caller will handle/display on false if( !replace ) return false; @@ -9979,6 +9983,7 @@ void atcommand_config_read(const char* config_filename) { const char *symbol = NULL; int num_aliases = 0; + nullpo_retv(config_filename); if (libconfig->read_file(&atcommand_config, config_filename)) return; @@ -10101,7 +10106,11 @@ void atcommand_config_read(const char* config_filename) { * COMMAND_ATCOMMAND (1) being index 0, COMMAND_CHARCOMMAND (2) being index 1. * @private */ -static inline int AtCommandType2idx(AtCommandType type) { return (type-1); } +static inline int atcommand_command_type2idx(AtCommandType type) +{ + Assert_retr(0, type > 0); + return (type-1); +} /** * Loads permissions for groups to use commands. @@ -10112,6 +10121,8 @@ void atcommand_db_load_groups(GroupSettings **groups, config_setting_t **command DBIterator *iter = db_iterator(atcommand->db); AtCommandInfo *atcmd; + nullpo_retv(groups); + nullpo_retv(commands_); for (atcmd = dbi_first(iter); dbi_exists(iter); atcmd = dbi_next(iter)) { int i; CREATE(atcmd->at_groups, char, sz); @@ -10151,10 +10162,10 @@ void atcommand_db_load_groups(GroupSettings **groups, config_setting_t **command config_setting_is_aggregate(cmd) && config_setting_length(cmd) == 2 ) { - if (config_setting_get_bool_elem(cmd, AtCommandType2idx(COMMAND_ATCOMMAND))) { + if (config_setting_get_bool_elem(cmd, atcommand_command_type2idx(COMMAND_ATCOMMAND))) { atcmd->at_groups[idx] = 1; } - if (config_setting_get_bool_elem(cmd, AtCommandType2idx(COMMAND_CHARCOMMAND))) { + if (config_setting_get_bool_elem(cmd, atcommand_command_type2idx(COMMAND_CHARCOMMAND))) { atcmd->char_groups[idx] = 1; } } @@ -10168,6 +10179,8 @@ void atcommand_db_load_groups(GroupSettings **groups, config_setting_t **command bool atcommand_can_use(struct map_session_data *sd, const char *command) { AtCommandInfo *info = atcommand->get_info_byname(atcommand->check_alias(command + 1)); + nullpo_retr(false, sd); + nullpo_retr(false, command); if (info == NULL) return false; @@ -10181,6 +10194,8 @@ bool atcommand_can_use(struct map_session_data *sd, const char *command) { bool atcommand_can_use2(struct map_session_data *sd, const char *command, AtCommandType type) { AtCommandInfo *info = atcommand->get_info_byname(atcommand->check_alias(command)); + nullpo_retr(false, sd); + nullpo_retr(false, command); if (info == NULL) return false; @@ -10287,6 +10302,8 @@ void atcommand_defaults(void) { atcommand->cleanfloor_sub = atcommand_cleanfloor_sub; atcommand->mutearea_sub = atcommand_mutearea_sub; atcommand->commands_sub = atcommand_commands_sub; + atcommand->getring = atcommand_getring; + atcommand->channel_help = atcommand_channel_help; atcommand->cmd_db_clear = atcommand_db_clear; atcommand->cmd_db_clear_sub = atcommand_db_clear_sub; atcommand->doload = atcommand_doload; diff --git a/src/map/atcommand.h b/src/map/atcommand.h index ccc7d3725..6c8dbf9ef 100644 --- a/src/map/atcommand.h +++ b/src/map/atcommand.h @@ -114,6 +114,8 @@ struct atcommand_interface { void (*get_jail_time) (int jailtime, int* year, int* month, int* day, int* hour, int* minute); int (*cleanfloor_sub) (struct block_list *bl, va_list ap); int (*mutearea_sub) (struct block_list *bl,va_list ap); + void (*getring) (struct map_session_data* sd); + void (*channel_help) (int fd, const char *command, bool can_create); /* */ void (*commands_sub) (struct map_session_data* sd, const int fd, AtCommandType type); void (*cmd_db_clear) (void); @@ -134,6 +136,7 @@ void atcommand_defaults(void); HPShared struct atcommand_interface *atcommand; /* stay here */ -#define ACMD(x) static bool atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message, struct AtCommandInfo *info) +#define ACMD(x) static bool atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message, struct AtCommandInfo *info) __attribute__((nonnull (2, 3, 4, 5))); \ + static bool atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message, struct AtCommandInfo *info) #endif /* MAP_ATCOMMAND_H */ diff --git a/src/map/battle.c b/src/map/battle.c index 671d63200..5b147de9c 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -48,7 +48,8 @@ struct battle_interface *battle; int battle_getcurrentskill(struct block_list *bl) { //Returns the current/last skill in use by this bl. struct unit_data *ud; - if( bl->type == BL_SKILL ) { + nullpo_ret(bl); + if (bl->type == BL_SKILL) { struct skill_unit * su = (struct skill_unit*)bl; return su->group?su->group->skill_id:0; } @@ -67,6 +68,7 @@ int battle_gettargeted_sub(struct block_list *bl, va_list ap) { int target_id; int *c; + nullpo_ret(bl); bl_list = va_arg(ap, struct block_list **); c = va_arg(ap, int *); target_id = va_arg(ap, int); @@ -77,7 +79,7 @@ int battle_gettargeted_sub(struct block_list *bl, va_list ap) { if (*c >= 24) return 0; - if ( !(ud = unit->bl2ud(bl)) ) + if (!(ud = unit->bl2ud(bl))) return 0; if (ud->target == target_id || ud->skilltarget == target_id) { @@ -102,10 +104,10 @@ struct block_list* battle_gettargeted(struct block_list *target) { return bl_list[rnd()%c]; } - //Returns the id of the current targeted character of the passed bl. [Skotlex] int battle_gettarget(struct block_list* bl) { + nullpo_ret(bl); switch (bl->type) { case BL_PC: return ((struct map_session_data*)bl)->ud.target; case BL_MOB: return ((struct mob_data*)bl)->target_id; @@ -123,6 +125,7 @@ int battle_getenemy_sub(struct block_list *bl, va_list ap) { struct block_list *target; int *c; + nullpo_ret(bl); bl_list = va_arg(ap, struct block_list **); c = va_arg(ap, int *); target = va_arg(ap, struct block_list *); @@ -149,6 +152,7 @@ struct block_list* battle_getenemy(struct block_list *target, int type, int rang struct block_list *bl_list[24]; int c = 0; + nullpo_retr(NULL, target); memset(bl_list, 0, sizeof(bl_list)); map->foreachinrange(battle->get_enemy_sub, target, range, type, bl_list, &c, target); @@ -164,8 +168,11 @@ int battle_getenemyarea_sub(struct block_list *bl, va_list ap) { struct block_list **bl_list, *src; int *c, ignore_id; + nullpo_ret(bl); bl_list = va_arg(ap, struct block_list **); + nullpo_ret(bl_list); c = va_arg(ap, int *); + nullpo_ret(c); src = va_arg(ap, struct block_list *); ignore_id = va_arg(ap, int); @@ -191,6 +198,7 @@ struct block_list* battle_getenemyarea(struct block_list *src, int x, int y, int struct block_list *bl_list[24]; int c = 0; + nullpo_retr(NULL, src); memset(bl_list, 0, sizeof(bl_list)); map->foreachinarea(battle->get_enemy_area_sub, src->m, x - range, y - range, x + range, y + range, type, bl_list, &c, src, ignore_id); @@ -210,7 +218,7 @@ int battle_delay_damage_sub(int tid, int64 tick, int id, intptr_t data) { struct block_list* target = map->id2bl(dat->target_id); if( !target || status->isdead(target) ) {/* nothing we can do */ - if( dat->src_type == BL_PC && ( src = map->id2bl(dat->src_id) ) && --((TBL_PC*)src)->delayed_damage == 0 && ((TBL_PC*)src)->state.hold_recalc ) { + if( dat->src_type == BL_PC && (src = map->id2bl(dat->src_id)) != NULL && --((TBL_PC*)src)->delayed_damage == 0 && ((TBL_PC*)src)->state.hold_recalc ) { ((TBL_PC*)src)->state.hold_recalc = 0; status_calc_pc(((TBL_PC*)src),SCO_FORCE); } @@ -264,7 +272,7 @@ int battle_delay_damage(int64 tick, int amotion, struct block_list *src, struct if (d_tbl && sc && check_distance_bl(target, d_tbl, sc->data[SC_DEVOTION]->val3) && damage > 0 && skill_id != PA_PRESSURE && skill_id != CR_REFLECTSHIELD) damage = 0; - + if ( !battle_config.delay_battle_damage || amotion <= 1 ) { map->freeblock_lock(); status_fix_damage(src, target, damage, ddelay); // We have to separate here between reflect damage and others [icescope] @@ -300,7 +308,6 @@ int battle_delay_damage(int64 tick, int amotion, struct block_list *src, struct } int battle_attr_ratio(int atk_elem,int def_type, int def_lv) { - if (atk_elem < ELE_NEUTRAL || atk_elem >= ELE_MAX) return 100; @@ -452,7 +459,7 @@ int64 battle_calc_weapon_damage(struct block_list *src, struct block_list *bl, u if( sc->data[SC_ZENKAI] && watk->ele == sc->data[SC_ZENKAI]->val2 ) eatk += 200; } - + #ifdef RENEWAL_EDP if ( sc && sc->data[SC_EDP] && skill_id != AS_GRIMTOOTH && skill_id != AS_VENOMKNIFE && skill_id != ASC_BREAKER ) { struct status_data *tstatus; @@ -462,9 +469,8 @@ int64 battle_calc_weapon_damage(struct block_list *src, struct block_list *bl, u } else /* fall through */ #endif damage += eatk; - damage = battle->calc_elefix(src, bl, skill_id, skill_lv, damage, nk, n_ele, s_ele, s_ele_, type == EQI_HAND_L, flag); - + /** * In RE Shield Boomerang takes weapon element only for damage calculation, * - resist calculation is always against neutral @@ -501,7 +507,8 @@ int64 battle_calc_base_damage(struct block_list *src, struct block_list *bl, uin int64 damage; struct status_data *st = status->get_status_data(src); struct status_change *sc = status->get_sc(src); - + + nullpo_retr(0, src); if ( !skill_id ) { s_ele = st->rhw.ele; s_ele_ = st->lhw.ele; @@ -536,6 +543,8 @@ int64 battle_calc_base_damage2(struct status_data *st, struct weapon_atk *wa, st short type = 0; int64 damage = 0; + nullpo_retr(damage, st); + nullpo_retr(damage, wa); if (!sd) { //Mobs/Pets if(flag&4) { atkmin = st->matk_min; @@ -612,6 +621,7 @@ int64 battle_calc_base_damage2(struct status_data *st, struct weapon_atk *wa, st int64 battle_calc_sizefix(struct map_session_data *sd, int64 damage, int type, int size, bool ignore){ //SizeFix only for players + nullpo_retr(damage, sd); if (!(sd->special_state.no_sizefix || (ignore))) damage = damage * ( type == EQI_HAND_L ? sd->left_weapon.atkmods[size] : sd->right_weapon.atkmods[size] ) / 100; return damage; @@ -627,8 +637,8 @@ int64 battle_addmastery(struct map_session_data *sd,struct block_list *target,in int weapon, skill_lv; damage = dmg; - nullpo_ret(sd); - + nullpo_retr(damage, sd); + nullpo_retr(damage, target); if((skill_lv = pc->checkskill(sd,AL_DEMONBANE)) > 0 && target->type == BL_MOB && //This bonus doesn't work against players. (battle->check_undead(st->race,st->def_ele) || st->race==RC_DEMON) ) @@ -848,7 +858,7 @@ int64 battle_calc_masteryfix(struct block_list *src, struct block_list *target, i = 2; //Star anger else ARR_FIND(0, MAX_PC_FEELHATE, i, status->get_class(target) == sd->hate_mob[i]); - if ( i < MAX_PC_FEELHATE && (skill2_lv=pc->checkskill(sd,pc->sg_info[i].anger_id)) && weapon ) { + if (i < MAX_PC_FEELHATE && (skill2_lv=pc->checkskill(sd,pc->sg_info[i].anger_id)) > 0 && weapon) { int ratio = sd->status.base_level + status_get_dex(src) + status_get_luk(src); if ( i == 2 ) ratio += status_get_str(src); //Star Anger if (skill2_lv < 4 ) @@ -957,11 +967,10 @@ int64 battle_calc_cardfix2(struct block_list *src, struct block_list *bl, int64 // FIXME: wflag is undocumented int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_list *target, int nk, int s_ele, int s_ele_, int64 damage, int cflag, int wflag){ struct map_session_data *sd, *tsd; - short cardfix = #ifdef RENEWAL - 100; + short cardfix = 100; #else - 1000; + short cardfix = 1000; #endif short t_class, s_class, s_race2, t_race2; struct status_data *sstatus, *tstatus; @@ -2688,9 +2697,12 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam struct map_session_data *sd = NULL; struct status_change *sc, *tsc; struct status_change_entry *sce; - int div_ = d->div_, flag = d->flag; + int div_, flag; nullpo_ret(bl); + nullpo_ret(d); + div_ = d->div_; + flag = d->flag; // need check src for null pointer? @@ -2802,7 +2814,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } if( sc->data[SC__MAELSTROM] && (flag&BF_MAGIC) && skill_id && (skill->get_inf(skill_id)&INF_GROUND_SKILL) ) { // {(Maelstrom Skill LevelxAbsorbed Skill Level)+(Caster's Job/5)}/2 - int sp = (sc->data[SC__MAELSTROM]->val1 * skill_lv + sd->status.job_level / 5) / 2; + int sp = (sc->data[SC__MAELSTROM]->val1 * skill_lv + (sd ? sd->status.job_level / 5 : 0)) / 2; status->heal(bl, 0, sp, 3); d->dmg_lv = ATK_BLOCK; return 0; @@ -2869,7 +2881,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam return 0; } - if( (sce=sc->data[SC_PARRYING]) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd()%100 < sce->val2 ) { // attack blocked by Parrying clif->skill_nodamage(bl, bl, LK_PARRYING, sce->val1,1); @@ -2902,7 +2913,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam return 0; } - if( flag&BF_MAGIC && (sce=sc->data[SC_PRESTIGE]) && rnd()%100 < sce->val2) { + if (flag&BF_MAGIC && (sce=sc->data[SC_PRESTIGE]) != NULL && rnd()%100 < sce->val2) { clif->specialeffect(bl, 462, AREA); // Still need confirm it. return 0; } @@ -3121,7 +3132,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if( sc->data[SC_MEIKYOUSISUI] && rnd()%100 < 40 ) // custom value damage = 0; - if (!damage) return 0; if( (sce = sc->data[SC_LIGHTNINGWALK]) && flag&BF_LONG && rnd()%100 < sce->val1 ) { @@ -3155,7 +3165,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if( sc->data[SC__DEADLYINFECT] && flag&BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 && !is_boss(src) ) status->change_spread(bl, src); // Deadly infect attacked side - if ( sd && damage > 0 && (sce = sc->data[SC_GENTLETOUCH_ENERGYGAIN]) ) { + if (sd && damage > 0 && (sce = sc->data[SC_GENTLETOUCH_ENERGYGAIN]) != NULL) { if ( rnd() % 100 < sce->val2 ) pc->addspiritball(sd, skill->get_time(MO_CALLSPIRITS, 1), pc->getmaxspiritball(sd, 0)); } @@ -3203,7 +3213,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam TBL_HOM *hd = BL_CAST(BL_HOM,bl); if (hd) homun->addspiritball(hd, 10); } - if ( src->type == BL_PC && damage > 0 && (sce = tsc->data[SC_GENTLETOUCH_ENERGYGAIN]) ) { + if (src->type == BL_PC && damage > 0 && (sce = tsc->data[SC_GENTLETOUCH_ENERGYGAIN]) != NULL) { struct map_session_data *tsd = (struct map_session_data *)src; if ( tsd && rnd() % 100 < sce->val2 ) pc->addspiritball(tsd, skill->get_time(MO_CALLSPIRITS, 1), pc->getmaxspiritball(tsd, 0)); @@ -3251,24 +3261,27 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (skill_id) mob->skill_event((TBL_MOB*)bl,src,timer->gettick(),MSC_SKILLUSED|(skill_id<<16)); } - if( sd ) { - if( pc_ismadogear(sd) && rnd()%100 < 50 ) { - short element = skill->get_ele(skill_id, skill_lv); - if( !skill_id || element == -1 ) { //Take weapon's element - struct status_data *sstatus = NULL; - if( src->type == BL_PC && ((TBL_PC*)src)->bonus.arrow_ele ) - element = ((TBL_PC*)src)->bonus.arrow_ele; - else if( (sstatus = status->get_status_data(src)) ) { - element = sstatus->rhw.ele; - } + if (sd && pc_ismadogear(sd) && rnd()%100 < 50) { + int element = -1; + if (!skill_id || (element = skill->get_ele(skill_id, skill_lv)) == -1) { + // Take weapon's element + struct status_data *sstatus = NULL; + if (src->type == BL_PC && ((TBL_PC*)src)->bonus.arrow_ele) { + element = ((TBL_PC*)src)->bonus.arrow_ele; + } else if ((sstatus = status->get_status_data(src)) != NULL) { + element = sstatus->rhw.ele; } - else if( element == -2 ) //Use enchantment's element - element = status_get_attack_sc_element(src,status->get_sc(src)); - else if( element == -3 ) //Use random element - element = rnd()%ELE_MAX; - if( element == ELE_FIRE || element == ELE_WATER ) - pc->overheat(sd,element == ELE_FIRE ? 1 : -1); - } + } else if (element == -2) { + // Use enchantment's element + element = status_get_attack_sc_element(src,status->get_sc(src)); + } else if (element == -3) { + // Use random element + element = rnd()%ELE_MAX; + } + if (element == ELE_FIRE) + pc->overheat(sd, 1); + else if (element == ELE_WATER) + pc->overheat(sd, -1); } return damage; @@ -3283,6 +3296,7 @@ int64 battle_calc_bg_damage(struct block_list *src, struct block_list *bl, int64 if( !damage ) return 0; + nullpo_retr(damage, bl); if( bl->type == BL_MOB ) { struct mob_data* md = BL_CAST(BL_MOB, bl); @@ -3303,6 +3317,8 @@ int64 battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int64 if (!damage) //No reductions to make. return 0; + nullpo_retr(damage, src); + nullpo_retr(damage, bl); if(md && md->guardian_data) { if(class_ == MOBID_EMPERIUM && flag&BF_SKILL) { @@ -3370,6 +3386,8 @@ int battle_calc_drain(int64 damage, int rate, int per) { *------------------------------------------*/ void battle_consume_ammo(TBL_PC*sd, int skill_id, int lv) { int qty=1; + + nullpo_retv(sd); if (!battle_config.arrow_decrement) return; @@ -3383,8 +3401,12 @@ void battle_consume_ammo(TBL_PC*sd, int skill_id, int lv) { sd->state.arrow_atk = 0; } + //Skill Range Criteria int battle_range_type(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv) { + nullpo_retr(BF_SHORT, src); + nullpo_retr(BF_SHORT, target); + if (battle_config.skillrange_by_distance && (src->type&battle_config.skillrange_by_distance) ) { //based on distance between src/target [Skotlex] @@ -3417,8 +3439,10 @@ int battle_adjust_skill_damage(int m, unsigned short skill_id) { return 0; } + int battle_blewcount_bonus(struct map_session_data *sd, uint16 skill_id) { int i; + nullpo_ret(sd); if (!sd->skillblown[0].id) return 0; //Apply the bonus blow count. [Skotlex] @@ -4131,7 +4155,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * default: rskill = skill_id; } - if (sd && (i = pc->skillatk_bonus(sd, rskill))) + if (sd && (i = pc->skillatk_bonus(sd, rskill)) != 0) md.damage += md.damage*i/100; } if( (i = battle->adjust_skill_damage(src->m,skill_id)) ) @@ -4497,13 +4521,19 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list skill_id == NJ_KIRIKAGE)) { short cri = sstatus->cri; - if (sd) - { + if (sd) { + // Check for katar here as katar crit bonus should not be displayed + if (sd->status.weapon == W_KATAR) { + cri <<= 1; + } + cri+= sd->critaddrace[tstatus->race]; - if(flag.arrow) + + if (flag.arrow) { cri += sd->bonus.arrow_cri; + } } - if( sc && sc->data[SC_CAMOUFLAGE] ) + if (sc && sc->data[SC_CAMOUFLAGE]) cri += 10 * (10-sc->data[SC_CAMOUFLAGE]->val4); #ifndef RENEWAL //The official equation is *2, but that only applies when sd's do critical. @@ -4875,7 +4905,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list else wd.dmg_lv = ATK_DEF; break; - + case KO_BAKURETSU: { #ifdef RENEWAL @@ -5513,7 +5543,6 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list #endif } - if( src != target ) { // Don't reflect your own damage (Grand Cross) if( wd.dmg_lv == ATK_MISS || wd.dmg_lv == ATK_BLOCK ) { int64 prev1 = wd.damage, prev2 = wd.damage2; @@ -5573,6 +5602,7 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl break; } + nullpo_retr(d, target); #ifdef HMAP_ZONE_DAMAGE_CAP_TYPE if( target && skill_id ) { int i; @@ -5610,9 +5640,10 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl } return d; } + //Performs reflect damage (magic (maya) is performed over skill.c). void battle_reflect_damage(struct block_list *target, struct block_list *src, struct Damage *wd,uint16 skill_id) { - int64 damage = wd->damage + wd->damage2, rdamage = 0, trdamage = 0; + int64 damage, rdamage = 0, trdamage = 0; struct map_session_data *sd, *tsd; struct status_change *sc; int64 tick = timer->gettick(); @@ -5623,6 +5654,10 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st max_reflect_damage = max(status_get_max_hp(target), status_get_max_hp(target) * status->get_lv(target) / 100); #endif + damage = wd->damage + wd->damage2; + + nullpo_retv(wd); + sd = BL_CAST(BL_PC, src); tsd = BL_CAST(BL_PC, target); @@ -5803,11 +5838,14 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st return; #undef NORMALIZE_RDAMAGE } + void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int boss) { struct weapon_data *wd; int type, thp = 0, tsp = 0, rhp = 0, rsp = 0, hp, sp, i; int64 *damage; + + nullpo_retv(sd); for (i = 0; i < 4; i++) { //First two iterations: Right hand if (i < 2) { wd = &sd->right_weapon; damage = &rdamage; } @@ -5870,6 +5908,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) { if( bl->type == BL_MOB && ((TBL_MOB*)bl)->class_ == MOBID_EMPERIUM ) return 0; if( bl != src && battle->check_target(src,bl,BCT_ENEMY) > 0 ) { + nullpo_ret(src); map->freeblock_lock(); if( src->type == BL_PC ) battle->drain((TBL_PC*)src, bl, damage, damage, status_get_race(bl), is_boss(bl)); @@ -6270,6 +6309,7 @@ bool battle_check_undead(int race,int element) //Returns the upmost level master starting with the given object struct block_list* battle_get_master(struct block_list *src) { struct block_list *prev; //Used for infinite loop check (master of yourself?) + nullpo_retr(NULL, src); do { prev = src; switch (src->type) { @@ -6324,7 +6364,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f m = target->m; - if (flag&BCT_ENEMY && ( map->getcell(m,src->x,src->y,CELL_CHKBASILICA) || map->getcell(m,target->x,target->y,CELL_CHKBASILICA) ) ) { + if (flag & BCT_ENEMY && (map->getcell(m, src, src->x, src->y, CELL_CHKBASILICA) || map->getcell(m, src, target->x, target->y, CELL_CHKBASILICA))) { return -1; } @@ -6354,7 +6394,6 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f switch( target->type ) { // Checks on actual target case BL_PC: { struct status_change* sc = status->get_sc(src); - if( ((TBL_PC*)target)->invincible_timer != INVALID_TIMER ) { switch( battle->get_current_skill(src) ) { /* TODO a proper distinction should be established bugreport:8397 */ @@ -6393,7 +6432,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f TBL_SKILL *su = (TBL_SKILL*)target; if( !su->group ) return 0; - if( skill->get_inf2(su->group->skill_id)&INF2_TRAP && + if( skill->get_inf2(su->group->skill_id)&INF2_TRAP && su->group->unit_id != UNT_USED_TRAPS && su->group->unit_id != UNT_NETHERWORLD ) { //Only a few skills can target traps... switch( battle->get_current_skill(src) ) { @@ -6686,7 +6725,7 @@ bool battle_check_range(struct block_list *src, struct block_list *bl, int range if( d > AREA_SIZE ) return false; // Avoid targeting objects beyond your range of sight. - return path->search_long(NULL,src->m,src->x,src->y,bl->x,bl->y,CELL_CHKWALL); + return path->search_long(NULL,src,src->m,src->x,src->y,bl->x,bl->y,CELL_CHKWALL); } static const struct battle_data { @@ -7045,7 +7084,6 @@ static const struct battle_data { { "mail_show_status", &battle_config.mail_show_status, 0, 0, 2, }, { "client_limit_unit_lv", &battle_config.client_limit_unit_lv, 0, 0, BL_ALL, }, { "client_emblem_max_blank_percent", &battle_config.client_emblem_max_blank_percent, 100, 0, 100, }, - // BattleGround Settings { "bg_update_interval", &battle_config.bg_update_interval, 1000, 100, INT_MAX, }, { "bg_flee_penalty", &battle_config.bg_flee_penalty, 20, 0, INT_MAX, }, @@ -7081,7 +7119,6 @@ static const struct battle_data { { "feature.banking", &battle_config.feature_banking, 1, 0, 1, }, { "feature.auction", &battle_config.feature_auction, 0, 0, 2, }, { "idletime_criteria", &battle_config.idletime_criteria, 0x25, 1, INT_MAX, }, - { "mon_trans_disable_in_gvg", &battle_config.mon_trans_disable_in_gvg, 0, 0, 1, }, { "case_sensitive_aegisnames", &battle_config.case_sensitive_aegisnames, 1, 0, 1, }, { "guild_castle_invite", &battle_config.guild_castle_invite, 0, 0, 1, }, @@ -7093,6 +7130,7 @@ static const struct battle_data { { "mob_icewall_walk_block", &battle_config.mob_icewall_walk_block, 75, 0, 255, }, { "boss_icewall_walk_block", &battle_config.boss_icewall_walk_block, 0, 0, 255, }, { "feature.roulette", &battle_config.feature_roulette, 1, 0, 1, }, + { "show_monster_hp_bar", &battle_config.show_monster_hp_bar, 1, 0, 1, }, }; #ifndef STATS_OPT_OUT /** @@ -7267,8 +7305,10 @@ static int Hercules_report_timer(int tid, int64 tick, int id, intptr_t data) { int battle_set_value(const char* w1, const char* w2) { int val = config_switch(w2); - int i; + + nullpo_retr(1, w1); + nullpo_retr(1, w2); ARR_FIND(0, ARRAYLENGTH(battle_data), i, strcmpi(w1, battle_data[i].str) == 0); if (i == ARRAYLENGTH(battle_data)) { if( HPM->parseConf(w1,w2,HPCT_BATTLE) ) /* if plugin-owned, succeed */ @@ -7289,6 +7329,7 @@ int battle_set_value(const char* w1, const char* w2) int battle_get_value(const char* w1) { int i; + nullpo_retr(1, w1); ARR_FIND(0, ARRAYLENGTH(battle_data), i, strcmpi(w1, battle_data[i].str) == 0); if (i == ARRAYLENGTH(battle_data)) return 0; // not found @@ -7359,7 +7400,6 @@ void battle_adjust_conf(void) { } #endif - #ifndef CELL_NOSTACK if (battle_config.custom_cell_stack_limit != 1) ShowWarning("Battle setting 'custom_cell_stack_limit' takes no effect as this server was compiled without Cell Stack Limit support.\n"); @@ -7371,6 +7411,8 @@ int battle_config_read(const char* cfgName) FILE* fp; static int count = 0; + nullpo_ret(cfgName); + if (count == 0) battle->config_set_defaults(); diff --git a/src/map/battle.h b/src/map/battle.h index b211afff5..0ebc0aeb9 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -507,6 +507,8 @@ struct Battle_Config { int stormgust_knockback; int feature_roulette; + + int show_monster_hp_bar; // [Frost] }; /* criteria for battle_config.idletime_critera */ diff --git a/src/map/battleground.c b/src/map/battleground.c index 915ccc851..5df05d301 100644 --- a/src/map/battleground.c +++ b/src/map/battleground.c @@ -236,6 +236,7 @@ bool bg_send_message(struct map_session_data *sd, const char *mes, int len) { struct battleground_data *bgd; nullpo_ret(sd); + nullpo_ret(mes); if( sd->bg_id == 0 || (bgd = bg->team_search(sd->bg_id)) == NULL ) return false; // Couldn't send message clif->bg_message(bgd, sd->bl.id, sd->status.name, mes, len); @@ -271,6 +272,7 @@ enum bg_queue_types bg_str2teamtype (const char *str) { char temp[200], *parse; enum bg_queue_types type = BGQT_INVALID; + nullpo_retr(type, str); safestrncpy(temp, str, 200); parse = strtok(temp,"|"); @@ -457,11 +459,12 @@ void bg_config_read(void) { } bg->arenas = arena_count; } - libconfig->destroy(&bg_conf); } + libconfig->destroy(&bg_conf); } struct bg_arena *bg_name2arena (char *name) { int i; + nullpo_retr(NULL, name); for(i = 0; i < bg->arenas; i++) { if( strcmpi(bg->arena[i]->name,name) == 0 ) return bg->arena[i]; @@ -484,6 +487,8 @@ int bg_id2pos ( int queue_id, int account_id ) { return 0; } void bg_queue_ready_ack (struct bg_arena *arena, struct map_session_data *sd, bool response) { + nullpo_retv(arena); + nullpo_retv(sd); if( arena->begin_timer == INVALID_TIMER || !sd->bg_queue.arena || sd->bg_queue.arena != arena ) { bg->queue_pc_cleanup(sd); return; @@ -496,7 +501,7 @@ void bg_queue_ready_ack (struct bg_arena *arena, struct map_session_data *sd, bo sd->bg_queue.ready = 1; for( i = 0; i < queue->size; i++ ) { - if( queue->item[i] > 0 && ( sd = map->id2sd(queue->item[i]) ) ) { + if (queue->item[i] > 0 && (sd = map->id2sd(queue->item[i])) != NULL) { if( sd->bg_queue.ready == 1 ) count++; } @@ -511,6 +516,7 @@ void bg_queue_ready_ack (struct bg_arena *arena, struct map_session_data *sd, bo } void bg_queue_player_cleanup(struct map_session_data *sd) { + nullpo_retv(sd); if ( sd->bg_queue.client_has_bg_data ) { if( sd->bg_queue.arena ) clif->bgqueue_notice_delete(sd,BGQND_CLOSEWINDOW,sd->bg_queue.arena->name); @@ -528,6 +534,7 @@ void bg_match_over(struct bg_arena *arena, bool canceled) { struct hQueue *queue = &script->hq[arena->queue_id]; int i; + nullpo_retv(arena); if( !arena->ongoing ) return; arena->ongoing = false; @@ -535,7 +542,7 @@ void bg_match_over(struct bg_arena *arena, bool canceled) { for( i = 0; i < queue->size; i++ ) { struct map_session_data * sd = NULL; - if( queue->item[i] > 0 && ( sd = map->id2sd(queue->item[i]) ) ) { + if (queue->item[i] > 0 && (sd = map->id2sd(queue->item[i])) != NULL) { if( sd->bg_queue.arena ) { bg->team_leave(sd, 0); bg->queue_pc_cleanup(sd); @@ -556,10 +563,11 @@ void bg_begin(struct bg_arena *arena) { struct hQueue *queue = &script->hq[arena->queue_id]; int i, count = 0; + nullpo_retv(arena); for( i = 0; i < queue->size; i++ ) { struct map_session_data * sd = NULL; - if( queue->item[i] > 0 && ( sd = map->id2sd(queue->item[i]) ) ) { + if (queue->item[i] > 0 && (sd = map->id2sd(queue->item[i])) != NULL) { if( sd->bg_queue.ready == 1 ) count++; else @@ -586,7 +594,7 @@ void bg_begin(struct bg_arena *arena) { for( i = 0; i < queue->size; i++ ) { struct map_session_data * sd = NULL; - if( queue->item[i] > 0 && ( sd = map->id2sd(queue->item[i]) ) ) { + if (queue->item[i] > 0 && (sd = map->id2sd(queue->item[i])) != NULL) { if( sd->bg_queue.ready == 1 ) { mapreg->setreg(reference_uid(script->add_str("$@bg_member"), count), sd->status.account_id); mapreg->setreg(reference_uid(script->add_str("$@bg_member_group"), count), @@ -637,13 +645,15 @@ int bg_afk_timer(int tid, int64 tick, int id, intptr_t data) { } void bg_queue_pregame(struct bg_arena *arena) { - struct hQueue *queue = &script->hq[arena->queue_id]; + struct hQueue *queue; int i; + nullpo_retv(arena); + queue = &script->hq[arena->queue_id]; for( i = 0; i < queue->size; i++ ) { struct map_session_data * sd = NULL; - if( queue->item[i] > 0 && ( sd = map->id2sd(queue->item[i]) ) ) { + if (queue->item[i] > 0 && (sd = map->id2sd(queue->item[i])) != NULL) { clif->bgqueue_battlebegins(sd,arena->id,SELF); } } @@ -656,7 +666,10 @@ int bg_fillup_timer(int tid, int64 tick, int id, intptr_t data) { } void bg_queue_check(struct bg_arena *arena) { - int count = script->hq[arena->queue_id].items; + int count; + + nullpo_retv(arena); + count = script->hq[arena->queue_id].items; if( count == arena->max_players ) { if( arena->fillup_timer != INVALID_TIMER ) { timer->delete(arena->fillup_timer,bg->fillup_timer); @@ -672,6 +685,8 @@ void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, enum bg_q struct hQueue *queue; int i, count = 0; + nullpo_retv(sd); + nullpo_retv(arena); if( arena->begin_timer != INVALID_TIMER || arena->ongoing ) { clif->bgqueue_ack(sd,BGQA_FAIL_QUEUING_FINISHED,arena->id); return; @@ -750,6 +765,8 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_ int tick; unsigned int tsec; + nullpo_retr(BGQA_FAIL_TYPE_INVALID, sd); + nullpo_retr(BGQA_FAIL_TYPE_INVALID, arena); if( !(arena->allowed_types & type) ) return BGQA_FAIL_TYPE_INVALID; @@ -864,6 +881,7 @@ void do_init_battleground(bool minimal) { int bg_team_db_final(DBKey key, DBData *data, va_list ap) { struct battleground_data* bgd = DB->data2ptr(data); int i; + nullpo_ret(bgd); for(i = 0; i < bgd->hdatac; i++ ) { if( bgd->hdata[i]->flag.free ) { aFree(bgd->hdata[i]->data); @@ -888,7 +906,6 @@ void do_final_battleground(void) } aFree(bg->arena); } - } void battleground_defaults(void) { bg = &bg_s; diff --git a/src/map/buyingstore.c b/src/map/buyingstore.c index a1b6e9e65..67018ec1f 100644 --- a/src/map/buyingstore.c +++ b/src/map/buyingstore.c @@ -14,6 +14,7 @@ #include "map/pc.h" // struct map_session_data #include "common/cbasetypes.h" #include "common/db.h" // ARR_FIND +#include "common/nullpo.h" // nullpo_* #include "common/showmsg.h" // ShowWarning #include "common/socket.h" // RBUF* #include "common/strlib.h" // safestrncpy @@ -28,6 +29,7 @@ unsigned int buyingstore_getuid(void) { bool buyingstore_setup(struct map_session_data* sd, unsigned char slots) { + nullpo_retr(false, sd); if( !battle_config.feature_buying_store || sd->state.vending || sd->state.buyingstore || sd->state.trading || slots == 0 ) { return false; @@ -44,7 +46,7 @@ bool buyingstore_setup(struct map_session_data* sd, unsigned char slots) return false; } - if( map->getcell(sd->bl.m, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING) ) { + if (map->getcell(sd->bl.m, &sd->bl, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING)) { // custom: no vending cells clif->message(sd->fd, msg_sd(sd,204)); // "You can't open a shop on this cell." return false; @@ -62,11 +64,11 @@ bool buyingstore_setup(struct map_session_data* sd, unsigned char slots) return true; } - void buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned char result, const char* storename, const uint8* itemlist, unsigned int count) { unsigned int i, weight, listidx; + nullpo_retv(sd); if (!result || count == 0) { // canceled, or no items return; @@ -98,7 +100,7 @@ void buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned cha return; } - if( map->getcell(sd->bl.m, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING) ) { + if (map->getcell(sd->bl.m, &sd->bl, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING)) { // custom: no vending cells clif->message(sd->fd, msg_sd(sd,204)); // "You can't open a shop on this cell." return; @@ -178,10 +180,10 @@ void buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned cha clif->buyingstore_entry(sd); } - void buyingstore_close(struct map_session_data* sd) { - if( sd->state.buyingstore ) + nullpo_retv(sd); + if (sd->state.buyingstore) { // invalidate data sd->state.buyingstore = false; @@ -192,11 +194,11 @@ void buyingstore_close(struct map_session_data* sd) } } - void buyingstore_open(struct map_session_data* sd, int account_id) { struct map_session_data* pl_sd; + nullpo_retv(sd); if( !battle_config.feature_buying_store || pc_istrading(sd) ) {// not allowed to sell return; @@ -229,6 +231,7 @@ void buyingstore_trade(struct map_session_data* sd, int account_id, unsigned int unsigned int i, weight, listidx, k; struct map_session_data* pl_sd; + nullpo_retv(sd); if( count == 0 ) {// nothing to do return; @@ -402,7 +405,8 @@ bool buyingstore_search(struct map_session_data* sd, unsigned short nameid) { unsigned int i; - if( !sd->state.buyingstore ) + nullpo_retr(false, sd); + if (!sd->state.buyingstore) {// not buying return false; } @@ -424,6 +428,8 @@ bool buyingstore_searchall(struct map_session_data* sd, const struct s_search_st unsigned int i, idx; struct s_buyingstore_item* it; + nullpo_retr(true, sd); + if( !sd->state.buyingstore ) {// not buying return true; diff --git a/src/map/channel.c b/src/map/channel.c index 337d05504..196e5f770 100644 --- a/src/map/channel.c +++ b/src/map/channel.c @@ -255,6 +255,7 @@ void channel_send(struct channel_data *chan, struct map_session_data *sd, const { char message[150]; nullpo_retv(chan); + nullpo_retv(msg); if (sd && chan->msg_delay != 0 && DIFF_TICK(sd->hchsysch_tick + chan->msg_delay*1000, timer->gettick()) > 0 @@ -262,14 +263,14 @@ void channel_send(struct channel_data *chan, struct map_session_data *sd, const clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,1455)); return; } else if (sd) { - snprintf(message, 150, "[ #%s ] %s : %s",chan->name,sd->status.name, msg); + safesnprintf(message, 150, "[ #%s ] %s : %s", chan->name, sd->status.name, msg); clif->channel_msg(chan,sd,message); if (chan->type == HCS_TYPE_IRC) ircbot->relay(sd->status.name,msg); if (chan->msg_delay != 0) sd->hchsysch_tick = timer->gettick(); } else { - snprintf(message, 150, "[ #%s ] %s",chan->name, msg); + safesnprintf(message, 150, "[ #%s ] %s", chan->name, msg); clif->channel_msg2(chan, message); if (chan->type == HCS_TYPE_IRC) ircbot->relay(NULL, msg); @@ -329,6 +330,7 @@ enum channel_operation_status channel_join(struct channel_data *chan, struct map nullpo_retr(HCS_STATUS_FAIL, chan); nullpo_retr(HCS_STATUS_FAIL, sd); + nullpo_retr(HCS_STATUS_FAIL, password); if (idb_exists(chan->users, sd->status.char_id)) { return HCS_STATUS_ALREADY; @@ -361,7 +363,7 @@ enum channel_operation_status channel_join(struct channel_data *chan, struct map int i; for (i = 0; i < MAX_GUILDALLIANCE; i++) { struct guild *sg = NULL; - if (g->alliance[i].opposition == 0 && g->alliance[i].guild_id && (sg = guild->search(g->alliance[i].guild_id))) { + if (g->alliance[i].opposition == 0 && g->alliance[i].guild_id && (sg = guild->search(g->alliance[i].guild_id)) != NULL) { if (!(sg->channel->banned && idb_exists(sg->channel->banned, sd->status.account_id))) { channel->join_sub(sg->channel, sd, stealth); } @@ -445,6 +447,7 @@ void channel_leave(struct channel_data *chan, struct map_session_data *sd) */ void channel_quit(struct map_session_data *sd) { + nullpo_retv(sd); while (sd->channel_count > 0) { // Loop downward to avoid unnecessary array compactions by channel_leave struct channel_data *chan = sd->channels[sd->channel_count-1]; @@ -461,10 +464,11 @@ void channel_quit(struct map_session_data *sd) /** * Joins the local map channel. * - * @param sd The target character + * @param sd The target character (sd must be non null) */ void channel_map_join(struct map_session_data *sd) { + nullpo_retv(sd); if (sd->state.autotrade || sd->state.standalone) return; if (!map->list[sd->bl.m].channel) { @@ -475,18 +479,20 @@ void channel_map_join(struct map_session_data *sd) map->list[sd->bl.m].channel->m = sd->bl.m; } - channel->join(map->list[sd->bl.m].channel, sd, NULL, false); + channel->join(map->list[sd->bl.m].channel, sd, "", false); } void channel_irc_join(struct map_session_data *sd) { struct channel_data *chan = ircbot->channel; + + nullpo_retv(sd); if (sd->state.autotrade || sd->state.standalone) return; if (channel->config->irc_name[0] == '\0') return; if (chan) - channel->join(chan, sd, NULL, false); + channel->join(chan, sd, "", false); } /** @@ -548,12 +554,13 @@ void channel_guild_leave_alliance(const struct guild *g_source, const struct gui /** * Makes a character quit all guild-related channels. * - * @param sd The character + * @param sd The character (must be non null) */ void channel_quit_guild(struct map_session_data *sd) { unsigned char i; + nullpo_retv(sd); for (i = 0; i < sd->channel_count; i++) { struct channel_data *chan = sd->channels[i]; @@ -770,8 +777,8 @@ void read_channels_config(void) } ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' channels in '"CL_WHITE"%s"CL_RESET"'.\n", db_size(channel->db), config_filename); - libconfig->destroy(&channels_conf); } + libconfig->destroy(&channels_conf); } /*========================================== diff --git a/src/map/chat.c b/src/map/chat.c index ed9d9c598..976b1ce8e 100644 --- a/src/map/chat.c +++ b/src/map/chat.c @@ -32,6 +32,9 @@ struct chat_data* chat_createchat(struct block_list* bl, const char* title, cons { struct chat_data* cd; nullpo_retr(NULL, bl); + nullpo_retr(NULL, title); + nullpo_retr(NULL, pass); + nullpo_retr(NULL, ev); /* Given the overhead and the numerous instances (npc allocated or otherwise) wouldn't it be beneficial to have it use ERS? [Ind] */ cd = (struct chat_data *) aMalloc(sizeof(struct chat_data)); @@ -75,6 +78,8 @@ struct chat_data* chat_createchat(struct block_list* bl, const char* title, cons bool chat_createpcchat(struct map_session_data* sd, const char* title, const char* pass, int limit, bool pub) { struct chat_data* cd; nullpo_ret(sd); + nullpo_ret(title); + nullpo_ret(pass); if( sd->chatID ) return false; //Prevent people abusing the chat system by creating multiple chats, as pointed out by End of Exam. [Skotlex] @@ -89,7 +94,7 @@ bool chat_createpcchat(struct map_session_data* sd, const char* title, const cha return false; //Can't create chatrooms on this map. } - if( map->getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOCHAT) ) { + if (map->getcell(sd->bl.m, &sd->bl, sd->bl.x, sd->bl.y, CELL_CHKNOCHAT) ) { clif->message (sd->fd, msg_sd(sd,865)); // "Can't create chat rooms in this area." return false; } @@ -118,6 +123,7 @@ bool chat_joinchat(struct map_session_data* sd, int chatid, const char* pass) { struct chat_data* cd; nullpo_ret(sd); + nullpo_ret(pass); cd = (struct chat_data*)map->id2bl(chatid); if( cd == NULL || cd->bl.type != BL_CHAT || cd->bl.m != sd->bl.m || sd->state.vending || sd->state.buyingstore || sd->chatID || ((cd->owner->type == BL_NPC) ? cd->users+1 : cd->users) >= cd->limit ) @@ -255,6 +261,7 @@ bool chat_changechatowner(struct map_session_data* sd, const char* nextownername int i; nullpo_ret(sd); + nullpo_ret(nextownername); cd = (struct chat_data*)map->id2bl(sd->chatID); if( cd == NULL || (struct block_list*) sd != cd->owner ) @@ -298,6 +305,8 @@ bool chat_changechatstatus(struct map_session_data* sd, const char* title, const struct chat_data* cd; nullpo_ret(sd); + nullpo_ret(title); + nullpo_ret(pass); cd = (struct chat_data*)map->id2bl(sd->chatID); if( cd==NULL || (struct block_list *)sd != cd->owner ) @@ -325,6 +334,7 @@ bool chat_kickchat(struct map_session_data* sd, const char* kickusername) { int i; nullpo_ret(sd); + nullpo_ret(kickusername); cd = (struct chat_data *)map->id2bl(sd->chatID); diff --git a/src/map/chrif.c b/src/map/chrif.c index 65c042533..1e376e3bc 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -150,6 +150,7 @@ bool chrif_auth_delete(int account_id, int char_id, enum sd_state state) { bool chrif_sd_to_auth(TBL_PC* sd, enum sd_state state) { struct auth_node *node; + nullpo_retr(false, sd); if ( chrif->search(sd->status.account_id) ) return false; //Already exists? @@ -176,6 +177,7 @@ bool chrif_sd_to_auth(TBL_PC* sd, enum sd_state state) { bool chrif_auth_logout(TBL_PC* sd, enum sd_state state) { + nullpo_retr(false, sd); if(sd->fd && state == ST_LOGOUT) { //Disassociate player, and free it after saving ack returns. [Skotlex] //fd info must not be lost for ST_MAPCHANGE as a final packet needs to be sent to the player. if ( sockt->session[sd->fd] ) @@ -187,8 +189,10 @@ bool chrif_auth_logout(TBL_PC* sd, enum sd_state state) } bool chrif_auth_finished(TBL_PC* sd) { - struct auth_node *node= chrif->search(sd->status.account_id); + struct auth_node *node; + nullpo_retr(false, sd); + node = chrif->search(sd->status.account_id); if ( node && node->sd == sd && node->state == ST_LOGIN ) { node->sd = NULL; @@ -197,13 +201,16 @@ bool chrif_auth_finished(TBL_PC* sd) { return false; } + // sets char-server's user id void chrif_setuserid(char *id) { + nullpo_retv(id); memcpy(chrif->userid, id, NAME_LENGTH); } // sets char-server's password void chrif_setpasswd(char *pwd) { + nullpo_retv(pwd); memcpy(chrif->passwd, pwd, NAME_LENGTH); } @@ -220,6 +227,7 @@ void chrif_checkdefaultlogin(void) { bool chrif_setip(const char* ip) { char ip_str[16]; + nullpo_retr(false, ip); if (!(chrif->ip = sockt->host2ip(ip))) { ShowWarning("Failed to Resolve Char Server Address! (%s)\n", ip); return false; @@ -446,6 +454,7 @@ void chrif_connectack(int fd) { int chrif_reconnect(DBKey key, DBData *data, va_list ap) { struct auth_node *node = DB->data2ptr(data); + nullpo_ret(node); switch (node->state) { case ST_LOGIN: if ( node->sd ) {//Since there is no way to request the char auth, make it fail. @@ -473,7 +482,6 @@ int chrif_reconnect(DBKey key, DBData *data, va_list ap) { return 0; } - /// Called when all the connection steps are completed. void chrif_on_ready(void) { static bool once = false; @@ -503,7 +511,6 @@ void chrif_on_ready(void) { } } - /*========================================== * *------------------------------------------*/ @@ -542,6 +549,7 @@ bool chrif_scdata_request(int account_id, int char_id) void chrif_authreq(struct map_session_data *sd, bool hstandalone) { struct auth_node *node= chrif->search(sd->bl.id); + nullpo_retv(sd); if( node != NULL || !chrif->isconnected() ) { sockt->eof(sd->fd); return; @@ -649,7 +657,6 @@ void chrif_authfail(int fd) {/* HELLO WORLD. ip in RFIFOL 15 is not being used ( } } - /** * This can still happen (client times out while waiting for char to confirm auth data) * @see DBApply @@ -657,6 +664,7 @@ void chrif_authfail(int fd) {/* HELLO WORLD. ip in RFIFOL 15 is not being used ( int auth_db_cleanup_sub(DBKey key, DBData *data, va_list ap) { struct auth_node *node = DB->data2ptr(data); + nullpo_retr(1, node); if(DIFF_TICK(timer->gettick(),node->node_created)>60000) { const char* states[] = { "Login", "Logout", "Map change" }; switch (node->state) { @@ -732,6 +740,8 @@ bool chrif_changeemail(int id, const char *actual_email, const char *new_email) if (battle_config.etc_log) ShowInfo("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", id, actual_email, new_email); + nullpo_retr(false, actual_email); + nullpo_retr(false, new_email); chrif_check(false); WFIFOHEAD(chrif->fd,86); @@ -760,6 +770,7 @@ bool chrif_changeemail(int id, const char *actual_email, const char *new_email) *------------------------------------------*/ bool chrif_char_ask_name(int acc, const char* character_name, unsigned short operation_type, int year, int month, int day, int hour, int minute, int second) { + nullpo_retr(false, character_name); chrif_check(false); WFIFOHEAD(chrif->fd,44); @@ -783,13 +794,14 @@ bool chrif_char_ask_name(int acc, const char* character_name, unsigned short ope /** * Requests a sex change (either per character or per account). - * + * * @param sd The character's data. * @param change_account Whether to change the per-account sex. * @retval true. */ bool chrif_changesex(struct map_session_data *sd, bool change_account) { + nullpo_retr(false, sd); chrif_check(false); WFIFOHEAD(chrif->fd,44); @@ -822,6 +834,7 @@ bool chrif_char_ask_name_answer(int acc, const char* player_name, uint16 type, u char output[256]; bool charsrv = ( type == CHAR_ASK_NAME_CHARBAN || type == CHAR_ASK_NAME_CHARUNBAN ) ? true : false; + nullpo_retr(false, player_name); sd = map->id2sd(acc); if( acc < 0 || sd == NULL ) { @@ -1025,6 +1038,7 @@ int chrif_disconnectplayer(int fd) { int chrif_updatefamelist(struct map_session_data* sd) { char type; + nullpo_retr(0, sd); chrif_check(-1); switch(sd->class_ & MAPID_UPPERMASK) { @@ -1115,9 +1129,11 @@ bool chrif_save_scdata(struct map_session_data *sd) { //parses the sc_data of th int i, count=0; int64 tick; struct status_change_data data; - struct status_change *sc = &sd->sc; + struct status_change *sc; const struct TimerData *td; + nullpo_retr(false, sd); + sc = &sd->sc; chrif_check(false); tick = timer->gettick(); @@ -1211,7 +1227,6 @@ bool chrif_ragsrvinfo(int base_rate, int job_rate, int drop_rate) { return true; } - /*========================================= * Tell char-server character disconnected [Wizputer] *-----------------------------------------*/ @@ -1254,11 +1269,12 @@ bool chrif_char_reset_offline(void) { } /*========================================= - * Tell char-server character is online [Wizputer] + * Tell char-server character is online [Wizputer]. Look like unused. *-----------------------------------------*/ bool chrif_char_online(struct map_session_data *sd) { chrif_check(false); + nullpo_retr(false, sd); WFIFOHEAD(chrif->fd,10); WFIFOW(chrif->fd,0) = 0x2b19; WFIFOL(chrif->fd,2) = sd->status.char_id; @@ -1281,7 +1297,6 @@ void chrif_on_disconnect(void) { timer->add(timer->gettick() + 1000, chrif->check_connect_char_server, 0, 0); } - void chrif_update_ip(int fd) { uint32 new_ip; @@ -1523,6 +1538,7 @@ bool chrif_removefriend(int char_id, int friend_id) void chrif_send_report(char* buf, int len) { #ifndef STATS_OPT_OUT if( chrif->fd > 0 ) { + nullpo_retv(buf); WFIFOHEAD(chrif->fd,len + 2); WFIFOW(chrif->fd,0) = 0x3008; @@ -1543,6 +1559,7 @@ void chrif_save_scdata_single(int account_id, int char_id, short type, struct st if( !chrif->isconnected() ) return; + nullpo_retv(sce); WFIFOHEAD(chrif->fd, 28); WFIFOW(chrif->fd, 0) = 0x2740; @@ -1582,6 +1599,7 @@ void chrif_del_scdata_single(int account_id, int char_id, short type) int auth_db_final(DBKey key, DBData *data, va_list ap) { struct auth_node *node = DB->data2ptr(data); + nullpo_ret(node); if (node->sd) { if( node->sd->regs.vars ) node->sd->regs.vars->destroy(node->sd->regs.vars, script->reg_destroy); @@ -1635,7 +1653,6 @@ void do_init_chrif(bool minimal) { timer->add_interval(timer->gettick() + 1000, chrif->send_usercount_tochar, 0, 0, UPDATE_INTERVAL); } - /*===================================== * Default Functions : chrif.h * Generated by HerculesInterfaceMaker @@ -1706,7 +1723,7 @@ void chrif_defaults(void) { chrif->char_offline_nsd = chrif_char_offline_nsd; chrif->char_reset_offline = chrif_char_reset_offline; chrif->send_users_tochar = send_users_tochar; - chrif->char_online = chrif_char_online; + chrif->char_online = chrif_char_online; // look like unused chrif->changesex = chrif_changesex; //chrif->chardisconnect = chrif_chardisconnect; chrif->divorce = chrif_divorce; diff --git a/src/map/clif.c b/src/map/clif.c index 12565de3c..59c8a7197 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -92,7 +92,6 @@ static inline int itemtype(int type) { } } - static inline void WBUFPOS(uint8* p, unsigned short pos, short x, short y, unsigned char dir) { p += pos; p[0] = (uint8)(x>>2); @@ -100,7 +99,6 @@ static inline void WBUFPOS(uint8* p, unsigned short pos, short x, short y, unsig p[2] = (uint8)((y<<4) | (dir&0xf)); } - // client-side: x0+=sx0*0.0625-0.5 and y0+=sy0*0.0625-0.5 static inline void WBUFPOS2(uint8* p, unsigned short pos, short x0, short y0, short x1, short y1, unsigned char sx0, unsigned char sy0) { p += pos; @@ -180,9 +178,14 @@ static inline bool disguised(struct block_list* bl) { return (bool)( bl->type == BL_PC && ((TBL_PC*)bl)->disguise != -1 ); } - //Guarantees that the given string does not exceeds the allowed size, as well as making sure it's null terminated. [Skotlex] static inline unsigned int mes_len_check(char* mes, unsigned int len, unsigned int max) { + nullpo_retr(0, mes); + if (len <= 0) + { + mes[0] = '\0'; + Assert_retr(0, len > 0); + } if( len > max ) len = max; @@ -196,6 +199,7 @@ static inline unsigned int mes_len_check(char* mes, unsigned int len, unsigned i *------------------------------------------*/ bool clif_setip(const char* ip) { char ip_str[16]; + nullpo_retr(false, ip); clif->map_ip = sockt->host2ip(ip); if ( !clif->map_ip ) { ShowWarning("Failed to Resolve Map Server Address! (%s)\n", ip); @@ -208,6 +212,7 @@ bool clif_setip(const char* ip) { } bool clif_setbindip(const char* ip) { + nullpo_retr(false, ip); clif->bind_ip = sockt->host2ip(ip); if ( clif->bind_ip ) { char ip_str[16]; @@ -258,6 +263,7 @@ uint32 clif_refresh_ip(void) #if PACKETVER >= 20071106 static inline unsigned char clif_bl_type(struct block_list *bl) { + nullpo_retr(0x1, bl); switch (bl->type) { case BL_PC: return (disguised(bl) && !pc->db_checkid(status->get_viewdata(bl)->class_))? 0x1:0x0; //PC_TYPE case BL_ITEM: return 0x2; //ITEM_TYPE @@ -342,6 +348,7 @@ int clif_send_sub(struct block_list *bl, va_list ap) { int clif_send_actual(int fd, void *buf, int len) { + nullpo_retr(0, buf); WFIFOHEAD(fd, len); if (WFIFOP(fd,0) == buf) { ShowError("WARNING: Invalid use of clif->send function\n"); @@ -391,8 +398,8 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target case ALL_SAMEMAP: //All players on the same map iter = mapit_getallusers(); - while( (tsd = (TBL_PC*)mapit->next(iter)) != NULL ) { - if( bl->m == tsd->bl.m ) { + while ((tsd = (TBL_PC*)mapit->next(iter)) != NULL) { + if (bl && bl->m == tsd->bl.m) { WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); @@ -408,16 +415,19 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target /* Fall through */ case AREA_WOC: case AREA_WOS: + nullpo_retr(true, bl); map->foreachinarea(clif->send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE, BL_PC, buf, len, bl, type); break; case AREA_CHAT_WOC: + nullpo_retr(true, bl); map->foreachinarea(clif->send_sub, bl->m, bl->x-(AREA_SIZE-5), bl->y-(AREA_SIZE-5), bl->x+(AREA_SIZE-5), bl->y+(AREA_SIZE-5), BL_PC, buf, len, bl, AREA_WOC); break; case CHAT: case CHAT_WOS: + nullpo_retr(true, bl); { struct chat_data *cd; if (sd) { @@ -441,6 +451,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target case PARTY_AREA: case PARTY_AREA_WOS: + nullpo_retr(true, bl); x0 = bl->x - AREA_SIZE; y0 = bl->y - AREA_SIZE; x1 = bl->x + AREA_SIZE; @@ -507,7 +518,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target break; case SELF: - if (sd && (fd=sd->fd) ) { + if (sd && (fd=sd->fd) != 0) { WFIFOHEAD(fd,len); memcpy(WFIFOP(fd,0), buf, len); WFIFOSET(fd,len); @@ -517,6 +528,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target // New definitions for guilds [Valaris] - Cleaned up and reorganized by [Skotlex] case GUILD_AREA: case GUILD_AREA_WOS: + nullpo_retr(true, bl); x0 = bl->x - AREA_SIZE; y0 = bl->y - AREA_SIZE; x1 = bl->x + AREA_SIZE; @@ -569,6 +581,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target case BG_AREA: case BG_AREA_WOS: + nullpo_retr(true, bl); x0 = bl->x - AREA_SIZE; y0 = bl->y - AREA_SIZE; x1 = bl->x + AREA_SIZE; @@ -602,7 +615,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target for( i = 0; i < queue->size; i++ ) { struct map_session_data *qsd = NULL; - if( queue->item[i] > 0 && ( qsd = map->id2sd(queue->item[i]) ) ) { + if (queue->item[i] > 0 && (qsd = map->id2sd(queue->item[i])) != NULL) { WFIFOHEAD(qsd->fd,len); memcpy(WFIFOP(qsd->fd,0), buf, len); WFIFOSET(qsd->fd,len); @@ -626,11 +639,11 @@ void clif_authok(struct map_session_data *sd) { struct packet_authok p; + nullpo_retv(sd); p.PacketType = authokType; p.startTime = (unsigned int)timer->gettick(); WBUFPOS(&p.PosDir[0],0,sd->bl.x,sd->bl.y,sd->ud.dir); /* do the stupid client math */ p.xSize = p.ySize = 5; /* not-used */ - #if PACKETVER >= 20080102 p.font = sd->status.font; #endif @@ -640,7 +653,6 @@ void clif_authok(struct map_session_data *sd) clif->send(&p,sizeof(p),&sd->bl,SELF); } - /// Notifies the client, that it's connection attempt was refused (ZC_REFUSE_ENTER). /// 0074 <error code>.B /// error code: @@ -657,7 +669,6 @@ void clif_authrefuse(int fd, uint8 error_code) WFIFOSET(fd,packet_len(0x74)); } - /// Notifies the client of a ban or forced disconnect (SC_NOTIFY_BAN). /// 0081 <error code>.B /// error code: @@ -704,7 +715,6 @@ void clif_authfail_fd(int fd, int type) } - /// Notifies the client, whether it can disconnect and change servers (ZC_RESTART_ACK). /// 00b3 <type>.B /// type: @@ -752,8 +762,6 @@ void clif_dropflooritem(struct flooritem_data* fitem) { clif->send(&p, sizeof(p), &fitem->bl, AREA); } - - /// Makes an item disappear from the ground. /// 00a1 <id>.L (ZC_ITEM_DISAPPEAR) void clif_clearflooritem(struct flooritem_data *fitem, int fd) @@ -774,7 +782,6 @@ void clif_clearflooritem(struct flooritem_data *fitem, int fd) } } - /// Makes a unit (char, npc, mob, homun) disappear to one client (ZC_NOTIFY_VANISH). /// 0080 <id>.L <type>.B /// type: @@ -818,7 +825,6 @@ void clif_clearunit_area(struct block_list* bl, clr_type type) } } - /// Used to make monsters with player-sprites disappear after dying /// like normal monsters, because the client does not remove those /// automatically. @@ -830,7 +836,10 @@ int clif_clearunit_delayed_sub(int tid, int64 tick, int id, intptr_t data) { } void clif_clearunit_delayed(struct block_list* bl, clr_type type, int64 tick) { - struct block_list *tbl = ers_alloc(clif->delay_clearunit_ers, struct block_list); + struct block_list *tbl; + + nullpo_retv(bl); + tbl = ers_alloc(clif->delay_clearunit_ers, struct block_list); memcpy (tbl, bl, sizeof (struct block_list)); timer->add(tick, clif->clearunit_delayed_sub, (int)type, (intptr_t)tbl); } @@ -838,6 +847,9 @@ void clif_clearunit_delayed(struct block_list* bl, clr_type type, int64 tick) { /// Gets weapon view info from sd's inventory_data and points (*rhand,*lhand) void clif_get_weapon_view(struct map_session_data* sd, unsigned short *rhand, unsigned short *lhand) { + nullpo_retv(sd); + nullpo_retv(rhand); + nullpo_retv(lhand); if(sd->sc.option&OPTION_COSTUME) { *rhand = *lhand = 0; return; @@ -887,6 +899,7 @@ static int clif_setlevel_sub(int lv) { static int clif_setlevel(struct block_list* bl) { int lv = status->get_lv(bl); + nullpo_retr(0, bl); if( battle_config.client_limit_unit_lv&bl->type ) return clif_setlevel_sub(lv); switch( bl->type ) { @@ -906,6 +919,7 @@ void clif_set_unit_idle2(struct block_list* bl, struct map_session_data *tsd, en struct packet_idle_unit2 p; int g_id = status->get_guild_id(bl); + nullpo_retv(bl); sd = BL_CAST(BL_PC, bl); p.PacketType = idle_unit2Type; @@ -959,7 +973,7 @@ void clif_set_unit_idle(struct block_list* bl, struct map_session_data *tsd, enu int g_id = status->get_guild_id(bl); nullpo_retv(bl); - + #if PACKETVER < 20091103 if( !pc->db_checkid(vd->class_) ) { clif->set_unit_idle2(bl,tsd,target); @@ -1046,6 +1060,7 @@ void clif_spawn_unit2(struct block_list* bl, enum send_target target) { struct packet_spawn_unit2 p; int g_id = status->get_guild_id(bl); + nullpo_retv(bl); sd = BL_CAST(BL_PC, bl); p.PacketType = spawn_unit2Type; @@ -1180,6 +1195,7 @@ void clif_set_unit_walking(struct block_list* bl, struct map_session_data *tsd, int g_id = status->get_guild_id(bl); nullpo_retv(bl); + nullpo_retv(ud); sd = BL_CAST(BL_PC, bl); @@ -1252,7 +1268,7 @@ void clif_set_unit_walking(struct block_list* bl, struct map_session_data *tsd, /// 01b0 <id>.L <type>.B <value>.L /// type: /// unused -void clif_class_change(struct block_list *bl,int class_,int type) +void clif_class_change(struct block_list *bl, int class_, int type) { nullpo_retv(bl); @@ -1267,11 +1283,11 @@ void clif_class_change(struct block_list *bl,int class_,int type) } } - /// Notifies the client of an object's spirits. /// 01d0 <id>.L <amount>.W (ZC_SPIRITS) /// 01e1 <id>.L <amount>.W (ZC_SPIRITS2) void clif_spiritball_single(int fd, struct map_session_data *sd) { + nullpo_retv(sd); WFIFOHEAD(fd, packet_len(0x1e1)); WFIFOW(fd,0)=0x1e1; WFIFOL(fd,2)=sd->bl.id; @@ -1284,6 +1300,7 @@ void clif_spiritball_single(int fd, struct map_session_data *sd) { *------------------------------------------*/ void clif_charm_single(int fd, struct map_session_data *sd) { + nullpo_retv(sd); WFIFOHEAD(fd, packet_len(0x08cf)); WFIFOW(fd,0) = 0x08cf; WFIFOL(fd,2) = sd->bl.id; @@ -1297,9 +1314,12 @@ void clif_charm_single(int fd, struct map_session_data *sd) * Tells its client to display all weather settings being used by this map *------------------------------------------*/ void clif_weather_check(struct map_session_data *sd) { - int16 m = sd->bl.m; - int fd = sd->fd; + int16 m; + int fd; + nullpo_retv(sd); + m = sd->bl.m; + fd = sd->fd; if (map->list[m].flag.snow) clif->specialeffect_single(&sd->bl, 162, fd); if (map->list[m].flag.clouds) @@ -1341,6 +1361,7 @@ bool clif_spawn(struct block_list *bl) { struct view_data *vd; + nullpo_retr(false, bl); vd = status->get_viewdata(bl); if( !vd ) return false; @@ -1357,7 +1378,6 @@ bool clif_spawn(struct block_list *bl) if (vd->cloth_color) clif->refreshlook(bl,bl->id,LOOK_CLOTHES_COLOR,vd->cloth_color,AREA_WOS); - switch (bl->type) { case BL_PC: { @@ -1413,6 +1433,7 @@ void clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag) unsigned char buf[128]; enum homun_type htype; + nullpo_retv(sd); nullpo_retv(hd); hstatus = &hd->battle_status; @@ -1479,7 +1500,6 @@ void clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag) clif->send(buf,packet_len(0x22e),&sd->bl,SELF); } - /// Notification about a change in homunuculus' state (ZC_CHANGESTATE_MER). /// 0230 <type>.B <state>.B <id>.L <data>.L /// type: @@ -1492,8 +1512,12 @@ void clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag) /// ? = ignored void clif_send_homdata(struct map_session_data *sd, int state, int param) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + nullpo_retv(sd->hd); + fd = sd->fd; if ( (state == SP_INTIMATE) && (param >= 910) && (sd->hd->homunculus.class_ == sd->hd->homunculusDB->evo_class) ) homun->calc_skilltree(sd->hd, 0); @@ -1553,6 +1577,7 @@ void clif_homskillup(struct map_session_data *sd, uint16 skill_id) { //[orn] struct homun_data *hd; int fd, idx; nullpo_retv(sd); + nullpo_retv(sd->hd); idx = skill_id - HM_SKILLBASE; fd=sd->fd; @@ -1583,13 +1608,14 @@ void clif_hom_food(struct map_session_data *sd,int foodid,int fail) return; } - /// Notifies the client, that it is walking (ZC_NOTIFY_PLAYERMOVE). /// 0087 <walk start time>.L <walk data>.6B void clif_walkok(struct map_session_data *sd) { - int fd=sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd, packet_len(0x87)); WFIFOW(fd,0)=0x87; WFIFOL(fd,2)=(unsigned int)timer->gettick(); @@ -1597,14 +1623,20 @@ void clif_walkok(struct map_session_data *sd) WFIFOSET(fd,packet_len(0x87)); } - void clif_move2(struct block_list *bl, struct view_data *vd, struct unit_data *ud) { #ifdef ANTI_MAYAP_CHEAT struct status_change *sc = NULL; +#endif + + nullpo_retv(bl); + nullpo_retv(vd); + nullpo_retv(ud); +#ifdef ANTI_MAYAP_CHEAT if( (sc = status->get_sc(bl)) && sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_INVISIBLE|OPTION_CHASEWALK) ) clif->ally_only = true; #endif + clif->set_unit_walking(bl,NULL,ud,AREA_WOS); if(vd->cloth_color) @@ -1640,7 +1672,6 @@ void clif_move2(struct block_list *bl, struct view_data *vd, struct unit_data *u #endif } - /// Notifies clients in an area, that an other visible object is walking (ZC_NOTIFY_PLAYERMOVE). /// 0086 <id>.L <walk data>.6B <walk start time>.L /// Note: unit must not be self @@ -1648,10 +1679,14 @@ void clif_move(struct unit_data *ud) { unsigned char buf[16]; struct view_data *vd; - struct block_list *bl = ud->bl; + struct block_list *bl; #ifdef ANTI_MAYAP_CHEAT struct status_change *sc = NULL; #endif + + nullpo_retv(ud); + bl = ud->bl; + nullpo_retv(bl); vd = status->get_viewdata(bl); if (!vd || vd->class_ == INVISIBLE_CLASS) return; //This performance check is needed to keep GM-hidden objects from being notified to bots. @@ -1690,7 +1725,6 @@ void clif_move(struct unit_data *ud) #endif } - /*========================================== * Delays the map->quit of a player after they are disconnected. [Skotlex] *------------------------------------------*/ @@ -1706,7 +1740,8 @@ int clif_delayquit(int tid, int64 tick, int id, intptr_t data) { /*========================================== * *------------------------------------------*/ -void clif_quitsave(int fd,struct map_session_data *sd) { +void clif_quitsave(int fd, struct map_session_data *sd) { + nullpo_retv(sd); if (!battle_config.prevent_logout || DIFF_TICK(timer->gettick(), sd->canlog_tick) > battle_config.prevent_logout) map->quit(sd); @@ -1734,7 +1769,6 @@ void clif_changemap(struct map_session_data *sd, short m, int x, int y) { WFIFOSET(fd,packet_len(0x91)); } - /// Notifies the client of a position change to coordinates on given map, which is on another map-server (ZC_NPCACK_SERVERMOVE). /// 0092 <map name>.16B <x>.W <y>.W <ip>.L <port>.W void clif_changemapserver(struct map_session_data* sd, unsigned short map_index, int x, int y, uint32 ip, uint16 port) { @@ -1752,15 +1786,14 @@ void clif_changemapserver(struct map_session_data* sd, unsigned short map_index, WFIFOSET(fd,packet_len(0x92)); } - void clif_blown(struct block_list *bl) { //Aegis packets says fixpos, but it's unsure whether slide works better or not. + nullpo_retv(bl); clif->fixpos(bl); clif->slide(bl, bl->x, bl->y); } - /// Visually moves(slides) a character to x,y. If the target cell /// isn't walkable, the char doesn't move at all. If the char is /// sitting it will stand up (ZC_STOPMOVE). @@ -1782,7 +1815,6 @@ void clif_fixpos(struct block_list *bl) { } } - /// Displays the buy/sell dialog of an NPC shop (ZC_SELECT_DEALTYPE). /// 00c4 <shop id>.L void clif_npcbuysell(struct map_session_data* sd, int id) @@ -1798,7 +1830,6 @@ void clif_npcbuysell(struct map_session_data* sd, int id) WFIFOSET(fd,packet_len(0xc4)); } - /// Presents list of items, that can be bought in an NPC shop (ZC_PC_PURCHASE_ITEMLIST). /// 00c6 <packet len>.W { <price>.L <discount price>.L <item type>.B <name id>.W }* void clif_buylist(struct map_session_data *sd, struct npc_data *nd) { @@ -1861,7 +1892,7 @@ void clif_selllist(struct map_session_data *sd) if( sd->status.inventory[i].expire_time ) continue; // Cannot Sell Rental Items - + if( sd->status.inventory[i].bound && !pc_can_give_bound_items(sd)) continue; // Don't allow sale of bound items @@ -1878,7 +1909,6 @@ void clif_selllist(struct map_session_data *sd) WFIFOSET(fd,WFIFOW(fd,2)); } - /// Displays an NPC dialog message (ZC_SAY_DIALOG). /// 00b4 <packet len>.W <npc id>.L <message>.?B /// Client behavior (dialog window): @@ -1889,7 +1919,11 @@ void clif_selllist(struct map_session_data *sd) /// - append this text void clif_scriptmes(struct map_session_data *sd, int npcid, const char *mes) { int fd = sd->fd; - size_t slen = strlen(mes) + 9; + size_t slen; + + nullpo_retv(sd); + nullpo_retv(mes); + slen = strlen(mes) + 9; sd->state.dialog = 1; @@ -1901,7 +1935,6 @@ void clif_scriptmes(struct map_session_data *sd, int npcid, const char *mes) { WFIFOSET(fd,WFIFOW(fd,2)); } - /// Adds a 'next' button to an NPC dialog (ZC_WAIT_DIALOG). /// 00b5 <npc id>.L /// Client behavior (dialog window): @@ -1912,7 +1945,7 @@ void clif_scriptmes(struct map_session_data *sd, int npcid, const char *mes) { /// - 00B9 <npcid of dialog window>.L /// - set to clear on next mes /// - remove 'next' button -void clif_scriptnext(struct map_session_data *sd,int npcid) +void clif_scriptnext(struct map_session_data *sd, int npcid) { int fd; @@ -1925,7 +1958,6 @@ void clif_scriptnext(struct map_session_data *sd,int npcid) WFIFOSET(fd,packet_len(0xb5)); } - /// Adds a 'close' button to an NPC dialog (ZC_CLOSE_DIALOG). /// 00b6 <npc id>.L /// Client behavior: @@ -1959,9 +1991,11 @@ void clif_scriptclose(struct map_session_data *sd, int npcid) *------------------------------------------*/ void clif_sendfakenpc(struct map_session_data *sd, int npcid) { unsigned char *buf; - int fd = sd->fd; - sd->state.using_fake_npc = 1; + int fd; + nullpo_retv(sd); + fd = sd->fd; + sd->state.using_fake_npc = 1; WFIFOHEAD(fd, packet_len(0x78)); buf = WFIFOP(fd,0); memset(WBUFP(buf,0), 0, packet_len(0x78)); @@ -1978,7 +2012,6 @@ void clif_sendfakenpc(struct map_session_data *sd, int npcid) { WFIFOSET(fd, packet_len(0x78)); } - /// Displays an NPC dialog menu (ZC_MENU_LIST). /// 00b7 <packet len>.W <npc id>.L <menu items>.?B /// Client behavior: @@ -2000,11 +2033,15 @@ void clif_sendfakenpc(struct map_session_data *sd, int npcid) { /// Which suggests their have intertwined behavior. (probably the mouse targeting) /// TODO investigate behavior of other windows [FlavioJS] void clif_scriptmenu(struct map_session_data* sd, int npcid, const char* mes) { - int fd = sd->fd; - size_t slen = strlen(mes) + 9; + int fd; + size_t slen; struct block_list *bl = NULL; - if (!sd->state.using_fake_npc && (npcid == npc->fake_nd->bl.id || ((bl = map->id2bl(npcid)) && (bl->m!=sd->bl.m || + nullpo_retv(sd); + nullpo_retv(mes); + fd = sd->fd; + slen = strlen(mes) + 9; + if (!sd->state.using_fake_npc && (npcid == npc->fake_nd->bl.id || ((bl = map->id2bl(npcid)) != NULL && (bl->m!=sd->bl.m || bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 || bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1)))) clif->sendfakenpc(sd, npcid); @@ -2017,7 +2054,6 @@ void clif_scriptmenu(struct map_session_data* sd, int npcid, const char* mes) { WFIFOSET(fd,WFIFOW(fd,2)); } - /// Displays an NPC dialog input box for numbers (ZC_OPEN_EDITDLG). /// 0142 <npc id>.L /// Client behavior (inputnum window): @@ -2035,7 +2071,7 @@ void clif_scriptinput(struct map_session_data *sd, int npcid) { nullpo_retv(sd); - if (!sd->state.using_fake_npc && (npcid == npc->fake_nd->bl.id || ((bl = map->id2bl(npcid)) && (bl->m!=sd->bl.m || + if (!sd->state.using_fake_npc && (npcid == npc->fake_nd->bl.id || ((bl = map->id2bl(npcid)) != NULL && (bl->m!=sd->bl.m || bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 || bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1)))) clif->sendfakenpc(sd, npcid); @@ -2047,7 +2083,6 @@ void clif_scriptinput(struct map_session_data *sd, int npcid) { WFIFOSET(fd,packet_len(0x142)); } - /// Displays an NPC dialog input box for numbers (ZC_OPEN_EDITDLGSTR). /// 01d4 <npc id>.L /// Client behavior (inputstr window): @@ -2065,7 +2100,7 @@ void clif_scriptinputstr(struct map_session_data *sd, int npcid) { nullpo_retv(sd); - if (!sd->state.using_fake_npc && (npcid == npc->fake_nd->bl.id || ((bl = map->id2bl(npcid)) && (bl->m!=sd->bl.m || + if (!sd->state.using_fake_npc && (npcid == npc->fake_nd->bl.id || ((bl = map->id2bl(npcid)) != NULL && (bl->m!=sd->bl.m || bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 || bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1)))) clif->sendfakenpc(sd, npcid); @@ -2077,7 +2112,6 @@ void clif_scriptinputstr(struct map_session_data *sd, int npcid) { WFIFOSET(fd,packet_len(0x1d4)); } - /// Marks a position on client's minimap (ZC_COMPASS). /// 0144 <npc id>.L <type>.L <x>.L <y>.L <id>.B <color>.L /// npc id: @@ -2129,12 +2163,12 @@ void clif_cutin(struct map_session_data* sd, const char* image, int type) WFIFOSET(fd,packet_len(0x1b3)); } - /*========================================== * Fills in card data from the given item and into the buffer. [Skotlex] *------------------------------------------*/ void clif_addcards(unsigned char* buf, struct item* item) { int i=0,j; + nullpo_retv(buf); if( item == NULL ) { //Blank data WBUFW(buf,0) = 0; WBUFW(buf,2) = 0; @@ -2184,6 +2218,7 @@ void clif_addcards(unsigned char* buf, struct item* item) { void clif_addcards2(unsigned short *cards, struct item* item) { int i=0,j; + nullpo_retv(cards); if( item == NULL ) { //Blank data cards[0] = 0; cards[1] = 0; @@ -2243,6 +2278,7 @@ void clif_addcards2(unsigned short *cards, struct item* item) { void clif_add_random_options(unsigned char* buf, struct item* item) { int i; + nullpo_retv(buf); for (i = 0; i < 5; i++){ WBUFW(buf,i*5+0) = 0; // OptIndex WBUFW(buf,i*5+2) = 0; // Value @@ -2250,7 +2286,6 @@ void clif_add_random_options(unsigned char* buf, struct item* item) } } - /// Notifies the client, about a received inventory item or the result of a pick-up request. /// 00a0 <index>.W <amount>.W <name id>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W <equip location>.W <item type>.B <result>.B (ZC_ITEM_PICKUP_ACK) /// 029a <index>.W <amount>.W <name id>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W <equip location>.W <item type>.B <result>.B <expire time>.L (ZC_ITEM_PICKUP_ACK2) @@ -2311,7 +2346,6 @@ void clif_additem(struct map_session_data *sd, int n, int amount, int fail) { clif->send(&p,sizeof(p),&sd->bl,SELF); } - /// Notifies the client, that an inventory item was deleted or dropped (ZC_ITEM_THROW_ACK). /// 00af <index>.W <amount>.W void clif_dropitem(struct map_session_data *sd,int n,int amount) @@ -2328,7 +2362,6 @@ void clif_dropitem(struct map_session_data *sd,int n,int amount) WFIFOSET(fd,packet_len(0xaf)); } - /// Notifies the client, that an inventory item was deleted (ZC_DELETE_ITEM_FROM_BODY). /// 07fa <delete type>.W <index>.W <amount>.W /// delete type: @see enum delitem_reason @@ -2352,10 +2385,10 @@ void clif_delitem(struct map_session_data *sd,int n,int amount, short reason) #endif } - // Simplifies inventory/cart/storage packets by handling the packet section relevant to items. [Skotlex] // Equip is >= 0 for equippable items (holds the equip-point, is 0 for pet // armor/egg) -1 for stackable items, -2 for stackable items where arrows must send in the equip-point. +// look like unused, not adding checks void clif_item_sub(unsigned char *buf, int n, struct item *i, struct item_data *id, int equip) { if (id->view_id > 0) WBUFW(buf,n)=id->view_id; @@ -2377,10 +2410,14 @@ void clif_item_sub(unsigned char *buf, int n, struct item *i, struct item_data * } } + void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct item_data *id, int eqp_pos) { #if PACKETVER >= 20150226 int j; #endif + nullpo_retv(p); + nullpo_retv(i); + nullpo_retv(id); p->index = idx; if (id->view_id > 0) @@ -2396,7 +2433,6 @@ void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct p->location = eqp_pos; p->WearState = i->equip; - #if PACKETVER < 20120925 p->IsDamaged = i->attribute ? 1 : 0; #endif @@ -2407,7 +2443,7 @@ void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct #if PACKETVER >= 20071002 p->HireExpireDate = i->expire_time; #endif - + #if PACKETVER >= 20080102 p->bindOnEquipType = i->bound ? 2 : id->flag.bindonequip ? 1 : 0; #endif @@ -2432,7 +2468,12 @@ void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct } #endif } + void clif_item_normal(short idx, struct NORMALITEM_INFO *p, struct item *i, struct item_data *id) { + nullpo_retv(p); + nullpo_retv(i); + nullpo_retv(id); + p->index = idx; if (id->view_id > 0) @@ -2441,18 +2482,18 @@ void clif_item_normal(short idx, struct NORMALITEM_INFO *p, struct item *i, stru p->ITID = i->nameid; p->type = itemtype(id->type); - + #if PACKETVER < 20120925 p->IsIdentified = i->identify ? 1 : 0; #endif p->count = i->amount; p->WearState = id->equip; - + #if PACKETVER >= 5 clif->addcards2(&p->slot.card[0], i); #endif - + #if PACKETVER >= 20080102 p->HireExpireDate = i->expire_time; #endif @@ -2463,17 +2504,19 @@ void clif_item_normal(short idx, struct NORMALITEM_INFO *p, struct item *i, stru p->Flag.SpareBits = 0; #endif } + void clif_inventorylist(struct map_session_data *sd) { int i, normal = 0, equip = 0; + nullpo_retv(sd); for( i = 0; i < MAX_INVENTORY; i++ ) { if( sd->status.inventory[i].nameid <= 0 || sd->inventory_data[i] == NULL ) continue; if( !itemdb->isstackable2(sd->inventory_data[i]) ) //Non-stackable (Equippable) - clif_item_equip(i+2,&itemlist_equip.list[equip++],&sd->status.inventory[i],sd->inventory_data[i],pc->equippoint(sd,i)); + clif->item_equip(i+2,&itemlist_equip.list[equip++],&sd->status.inventory[i],sd->inventory_data[i],pc->equippoint(sd,i)); else //Stackable (Normal) - clif_item_normal(i+2,&itemlist_normal.list[normal++],&sd->status.inventory[i],sd->inventory_data[i]); + clif->item_normal(i+2,&itemlist_normal.list[normal++],&sd->status.inventory[i],sd->inventory_data[i]); } if( normal ) { @@ -2508,12 +2551,13 @@ void clif_inventorylist(struct map_session_data *sd) { void clif_equiplist(struct map_session_data *sd) { int i, equip = 0; + nullpo_retv(sd); for( i = 0; i < MAX_INVENTORY; i++ ) { if( sd->status.inventory[i].nameid <= 0 || sd->inventory_data[i] == NULL ) continue; if( !itemdb->isstackable2(sd->inventory_data[i]) ) //Non-stackable (Equippable) - clif_item_equip(i+2,&itemlist_equip.list[equip++],&sd->status.inventory[i],sd->inventory_data[i],pc->equippoint(sd,i)); + clif->item_equip(i+2,&itemlist_equip.list[equip++],&sd->status.inventory[i],sd->inventory_data[i],pc->equippoint(sd,i)); } if( equip ) { @@ -2539,6 +2583,8 @@ void clif_storagelist(struct map_session_data* sd, struct item* items, int items int i = 0; struct item_data *id; + nullpo_retv(sd); + nullpo_retv(items); do { int normal = 0, equip = 0, k = 0; @@ -2550,9 +2596,9 @@ void clif_storagelist(struct map_session_data* sd, struct item* items, int items id = itemdb->search(items[i].nameid); if( !itemdb->isstackable2(id) ) //Non-stackable (Equippable) - clif_item_equip(i+1,&storelist_equip.list[equip++],&items[i],id,id->equip); + clif->item_equip(i+1,&storelist_equip.list[equip++],&items[i],id,id->equip); else //Stackable (Normal) - clif_item_normal(i+1,&storelist_normal.list[normal++],&items[i],id); + clif->item_normal(i+1,&storelist_normal.list[normal++],&items[i],id); } if( normal ) { @@ -2585,17 +2631,17 @@ void clif_cartlist(struct map_session_data *sd) { int i, normal = 0, equip = 0; struct item_data *id; + nullpo_retv(sd); for( i = 0; i < MAX_CART; i++ ) { if( sd->status.cart[i].nameid <= 0 ) continue; id = itemdb->search(sd->status.cart[i].nameid); - if( !itemdb->isstackable2(id) ) //Non-stackable (Equippable) - clif_item_equip(i+2,&itemlist_equip.list[equip++],&sd->status.cart[i],id,id->equip); + clif->item_equip(i+2,&itemlist_equip.list[equip++],&sd->status.cart[i],id,id->equip); else //Stackable (Normal) - clif_item_normal(i+2,&itemlist_normal.list[normal++],&sd->status.cart[i],id); + clif->item_normal(i+2,&itemlist_normal.list[normal++],&sd->status.cart[i],id); } if( normal ) { @@ -2613,7 +2659,6 @@ void clif_cartlist(struct map_session_data *sd) { } } - /// Removes cart (ZC_CARTOFF). /// 012b /// Client behavior: @@ -2627,7 +2672,6 @@ void clif_clearcart(int fd) } - /// Guild XY locators (ZC_NOTIFY_POSITION_TO_GUILDM) [Valaris] /// 01eb <account id>.L <x>.W <y>.W void clif_guild_xy(struct map_session_data *sd) @@ -2651,6 +2695,7 @@ void clif_guild_xy_single(int fd, struct map_session_data *sd) if( sd->bg_id ) return; + nullpo_retv(sd); WFIFOHEAD(fd,packet_len(0x1eb)); WFIFOW(fd,0)=0x1eb; WFIFOL(fd,2)=sd->status.account_id; @@ -2843,13 +2888,11 @@ void clif_updatestatus(struct map_session_data *sd,int type) WFIFOL(fd,4)=sd->battle_status.cri/10; break; case SP_MATK1: - WFIFOL(fd,4)=pc_rightside_matk(sd); + WFIFOL(fd,4)=pc_rightside_matk(sd); break; case SP_MATK2: - WFIFOL(fd,4)=pc_leftside_matk(sd); + WFIFOL(fd,4)=pc_leftside_matk(sd); break; - - case SP_ZENY: WFIFOW(fd,0)=0xb1; WFIFOL(fd,4)=sd->status.zeny; @@ -3149,7 +3192,6 @@ void clif_refreshlook(struct block_list *bl,int id,int type,int val,enum send_ta clif->sendlook(bl, id, type, val, 0, target); } - /// Character status (ZC_STATUS). /// 00bd <stpoint>.W <str>.B <need str>.B <agi>.B <need agi>.B <vit>.B <need vit>.B /// <int>.B <need int>.B <dex>.B <need dex>.B <luk>.B <need luk>.B <atk>.W <atk2>.W @@ -3213,7 +3255,6 @@ void clif_initialstatus(struct map_session_data *sd) { clif->updatestatus(sd,SP_ASPD); } - /// Marks an ammunition item in inventory as equipped (ZC_EQUIP_ARROW). /// 013c <index>.W void clif_arrowequip(struct map_session_data *sd,int val) @@ -3232,7 +3273,6 @@ void clif_arrowequip(struct map_session_data *sd,int val) WFIFOSET(fd,packet_len(0x013c)); } - /// Ammunition action message (ZC_ACTION_FAILURE). /// 013b <type>.W /// type: @@ -3255,7 +3295,6 @@ void clif_arrow_fail(struct map_session_data *sd,int type) WFIFOSET(fd,packet_len(0x013b)); } - /// Presents a list of items, that can be processed by Arrow Crafting (ZC_MAKINGARROW_LIST). /// 01ad <packet len>.W { <name id>.W }* void clif_arrow_create_list(struct map_session_data *sd) @@ -3290,7 +3329,6 @@ void clif_arrow_create_list(struct map_session_data *sd) } } - /// Notifies the client, about the result of an status change request (ZC_STATUS_CHANGE_ACK). /// 00bc <status id>.W <result>.B <value>.B /// status id: @@ -3313,7 +3351,6 @@ void clif_statusupack(struct map_session_data *sd,int type,int ok,int val) WFIFOSET(fd,packet_len(0xbc)); } - /// Notifies the client about the result of a request to equip an item (ZC_REQ_WEAR_EQUIP_ACK). /// 00aa <index>.W <equip location>.W <result>.B /// 00aa <index>.W <equip location>.W <view id>.W <result>.B (PACKETVER >= 20100629) @@ -3336,7 +3373,6 @@ void clif_equipitemack(struct map_session_data *sd,int n,int pos,enum e_EQUIP_IT clif->send(&p, sizeof(p), &sd->bl, SELF); } - /// Notifies the client about the result of a request to take off an item (ZC_REQ_TAKEOFF_EQUIP_ACK). /// 00ac <index>.W <equip location>.W <result>.B void clif_unequipitemack(struct map_session_data *sd,int n,int pos,enum e_UNEQUIP_ITEM_ACK result) { @@ -3352,7 +3388,6 @@ void clif_unequipitemack(struct map_session_data *sd,int n,int pos,enum e_UNEQUI clif->send(&p, sizeof(p), &sd->bl, SELF); } - /// Notifies clients in the area about an special/visual effect (ZC_NOTIFY_EFFECT). /// 019b <id>.L <effect id>.L /// effect id: @@ -3379,7 +3414,6 @@ void clif_misceffect(struct block_list* bl,int type) clif->send(buf,packet_len(0x19b),bl,AREA); } - /// Notifies clients in the area of a state change. /// 0119 <id>.L <body state>.W <health state>.W <effect state>.W <pk mode>.B (ZC_STATE_CHANGE) /// 0229 <id>.L <body state>.W <health state>.W <effect state>.L <pk mode>.B (ZC_STATE_CHANGE3) @@ -3430,13 +3464,13 @@ void clif_changeoption(struct block_list* bl) #endif } - /// Displays status change effects on NPCs/monsters (ZC_NPC_SHOWEFST_UPDATE). /// 028a <id>.L <effect state>.L <level>.L <showEFST>.L void clif_changeoption2(struct block_list* bl) { unsigned char buf[20]; struct status_change *sc; + nullpo_retv(bl); if ( !(sc = status->get_sc(bl)) && bl->type != BL_NPC ) return; //How can an option change if there's no sc? WBUFW(buf,0) = 0x28a; @@ -3455,7 +3489,6 @@ void clif_changeoption2(struct block_list* bl) { clif->send(buf,packet_len(0x28a),bl,AREA); } - /// Notifies the client about the result of an item use request. /// 00a8 <index>.W <amount>.W <result>.B (ZC_USE_ITEM_ACK) /// 01c8 <index>.W <name id>.W <id>.L <amount>.W <result>.B (ZC_USE_ITEM_ACK2) @@ -3518,7 +3551,6 @@ void clif_createchat(struct map_session_data* sd, int flag) WFIFOSET(fd,packet_len(0xd6)); } - /// Display a chat above the owner (ZC_ROOM_NEWENTRY). /// 00d7 <packet len>.W <owner id>.L <char id>.L <limit>.W <users>.W <type>.B <title>.?B /// type: @@ -3556,7 +3588,6 @@ void clif_dispchat(struct chat_data* cd, int fd) } } - /// Chatroom properties adjustment (ZC_CHANGE_CHATROOM). /// 00df <packet len>.W <owner id>.L <chat id>.L <limit>.W <users>.W <type>.B <title>.?B /// type: @@ -3588,7 +3619,6 @@ void clif_changechatstatus(struct chat_data* cd) clif->send(buf,WBUFW(buf,2),cd->owner,CHAT); } - /// Removes the chatroom (ZC_DESTROY_ROOM). /// 00d8 <chat id>.L void clif_clearchat(struct chat_data *cd,int fd) @@ -3608,7 +3638,6 @@ void clif_clearchat(struct chat_data *cd,int fd) } } - /// Displays messages regarding join chat failures (ZC_REFUSE_ENTER_ROOM). /// 00da <result>.B /// result: @@ -3634,7 +3663,6 @@ void clif_joinchatfail(struct map_session_data *sd,int flag) WFIFOSET(fd,packet_len(0xda)); } - /// Notifies the client about entering a chatroom (ZC_ENTER_ROOM). /// 00db <packet len>.W <chat id>.L { <role>.L <name>.24B }* /// role: @@ -3673,7 +3701,6 @@ void clif_joinchatok(struct map_session_data *sd,struct chat_data* cd) WFIFOSET(fd, WFIFOW(fd, 2)); } - /// Notifies clients in a chat about a new member (ZC_MEMBER_NEWENTRY). /// 00dc <users>.W <name>.24B void clif_addchat(struct chat_data* cd,struct map_session_data *sd) @@ -3689,7 +3716,6 @@ void clif_addchat(struct chat_data* cd,struct map_session_data *sd) clif->send(buf,packet_len(0xdc),&sd->bl,CHAT_WOS); } - /// Announce the new owner (ZC_ROLE_CHANGE). /// 00e1 <role>.L <nick>.24B /// role: @@ -3713,7 +3739,6 @@ void clif_changechatowner(struct chat_data* cd, struct map_session_data* sd) clif->send(buf,packet_len(0xe1)*2,&sd->bl,CHAT); } - /// Notify about user leaving the chatroom (ZC_MEMBER_EXIT). /// 00dd <users>.W <nick>.24B <flag>.B /// flag: @@ -3734,21 +3759,28 @@ void clif_leavechat(struct chat_data* cd, struct map_session_data* sd, bool flag clif->send(buf,packet_len(0xdd),&sd->bl,CHAT); } - /// Opens a trade request window from char 'name'. /// 00e5 <nick>.24B (ZC_REQ_EXCHANGE_ITEM) /// 01f4 <nick>.24B <charid>.L <baselvl>.W (ZC_REQ_EXCHANGE_ITEM2) -void clif_traderequest(struct map_session_data* sd, const char* name) { - int fd = sd->fd; +void clif_traderequest(struct map_session_data *sd, const char *name) +{ + int fd; +#if PACKETVER >= 6 + struct map_session_data* tsd = NULL; +#endif // PACKETVER >= 6 + nullpo_retv(sd); + nullpo_retv(name); + fd = sd->fd; #if PACKETVER < 6 WFIFOHEAD(fd,packet_len(0xe5)); WFIFOW(fd,0) = 0xe5; safestrncpy((char*)WFIFOP(fd,2), name, NAME_LENGTH); WFIFOSET(fd,packet_len(0xe5)); #else // PACKETVER >= 6 - struct map_session_data* tsd = map->id2sd(sd->trade_partner); - if( !tsd ) return; + tsd = map->id2sd(sd->trade_partner); + if (!tsd) + return; WFIFOHEAD(fd,packet_len(0x1f4)); WFIFOW(fd,0) = 0x1f4; @@ -3759,7 +3791,6 @@ void clif_traderequest(struct map_session_data* sd, const char* name) { #endif // PACKETVER < 6 } - /// Reply to a trade-request. /// 00e7 <result>.B (ZC_ACK_EXCHANGE_ITEM) /// 01f5 <result>.B <charid>.L <baselvl>.W (ZC_ACK_EXCHANGE_ITEM2) @@ -3770,11 +3801,18 @@ void clif_traderequest(struct map_session_data* sd, const char* name) { /// 3 = Accept /// 4 = Cancel /// 5 = Busy -void clif_tradestart(struct map_session_data* sd, uint8 type) { - int fd = sd->fd; +void clif_tradestart(struct map_session_data *sd, uint8 type) +{ + int fd; +#if PACKETVER >= 6 + struct map_session_data *tsd = NULL; +#endif // PACKETVER >= 6 + nullpo_retv(sd); + + fd = sd->fd; #if PACKETVER >= 6 - struct map_session_data* tsd = map->id2sd(sd->trade_partner); - if( tsd ) { + tsd = map->id2sd(sd->trade_partner); + if (tsd) { WFIFOHEAD(fd,packet_len(0x1f5)); WFIFOW(fd,0) = 0x1f5; WFIFOB(fd,2) = type; @@ -3790,7 +3828,6 @@ void clif_tradestart(struct map_session_data* sd, uint8 type) { WFIFOSET(fd,packet_len(0xe7)); } - /// Notifies the client about an item from other player in current trade. /// 00e9 <amount>.L <nameid>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W (ZC_ADD_EXCHANGE_ITEM) /// 080f <nameid>.W <item type>.B <amount>.L <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W (ZC_ADD_EXCHANGE_ITEM2) @@ -3856,7 +3893,6 @@ void clif_tradeadditem(struct map_session_data* sd, struct map_session_data* tsd WFIFOSET(fd,packet_len(tradeaddType)); } - /// Notifies the client about the result of request to add an item to the current trade (ZC_ACK_ADD_EXCHANGE_ITEM). /// 00ea <index>.W <result>.B /// result: @@ -3876,7 +3912,6 @@ void clif_tradeitemok(struct map_session_data* sd, int index, int fail) WFIFOSET(fd,packet_len(0xea)); } - /// Notifies the client about finishing one side of the current trade (ZC_CONCLUDE_EXCHANGE_ITEM). /// 00ec <who>.B /// who: @@ -3894,7 +3929,6 @@ void clif_tradedeal_lock(struct map_session_data* sd, int fail) WFIFOSET(fd,packet_len(0xec)); } - /// Notifies the client about the trade being canceled (ZC_CANCEL_EXCHANGE_ITEM). /// 00ee void clif_tradecancelled(struct map_session_data* sd) @@ -3908,7 +3942,6 @@ void clif_tradecancelled(struct map_session_data* sd) WFIFOSET(fd,packet_len(0xee)); } - /// Result of a trade (ZC_EXEC_EXCHANGE_ITEM). /// 00f0 <result>.B /// result: @@ -3926,21 +3959,22 @@ void clif_tradecompleted(struct map_session_data* sd, int fail) WFIFOSET(fd,packet_len(0xf0)); } - /// Resets the trade window on the send side (ZC_EXCHANGEITEM_UNDO). /// 00f1 /// NOTE: Unknown purpose. Items are not removed until the window is /// refreshed (ex. by putting another item in there). +/// unused void clif_tradeundo(struct map_session_data* sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0xf1)); WFIFOW(fd,0) = 0xf1; WFIFOSET(fd,packet_len(0xf1)); } - /// Updates storage total amount (ZC_NOTIFY_STOREITEM_COUNTINFO). /// 00f2 <current count>.W <max count>.W void clif_updatestorageamount(struct map_session_data* sd, int amount, int max_amount) @@ -3957,7 +3991,6 @@ void clif_updatestorageamount(struct map_session_data* sd, int amount, int max_a WFIFOSET(fd,packet_len(0xf2)); } - /// Notifies the client of an item being added to the storage. /// 00f4 <index>.W <amount>.L <nameid>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W (ZC_ADD_ITEM_TO_STORE) /// 01c4 <index>.W <amount>.L <nameid>.W <type>.B <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W (ZC_ADD_ITEM_TO_STORE2) @@ -3971,7 +4004,6 @@ void clif_storageitemadded(struct map_session_data* sd, struct item* i, int inde fd=sd->fd; view = itemdb_viewid(i->nameid); - WFIFOHEAD(fd,packet_len(storageaddType)); WFIFOW(fd, 0) = storageaddType; // Storage item added WFIFOW(fd, 2) = index+1; // index @@ -3991,7 +4023,6 @@ void clif_storageitemadded(struct map_session_data* sd, struct item* i, int inde WFIFOSET(fd,packet_len(storageaddType)); } - /// Notifies the client of an item being deleted from the storage (ZC_DELETE_ITEM_FROM_STORE). /// 00f6 <index>.W <amount>.L void clif_storageitemremoved(struct map_session_data* sd, int index, int amount) @@ -4008,7 +4039,6 @@ void clif_storageitemremoved(struct map_session_data* sd, int index, int amount) WFIFOSET(fd,packet_len(0xf6)); } - /// Closes storage (ZC_CLOSE_STORE). /// 00f8 void clif_storageclose(struct map_session_data* sd) @@ -4030,6 +4060,8 @@ void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* ds struct block_list *d_bl; int i; + nullpo_retv(sd); + nullpo_retv(dstsd); if( dstsd->chatID ) { struct chat_data *cd = NULL; if( (cd = (struct chat_data*)map->id2bl(dstsd->chatID)) && cd->usersd[0]==dstsd) @@ -4068,6 +4100,9 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) { struct unit_data *ud; struct view_data *vd; + nullpo_retv(sd); + nullpo_retv(bl); + vd = status->get_viewdata(bl); if (!vd || vd->class_ == INVISIBLE_CLASS) return; @@ -4123,10 +4158,10 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) { else if(md->special_state.size==SZ_MEDIUM) clif->specialeffect_single(bl,421,sd->fd); #if PACKETVER >= 20120404 - if( !(md->status.mode&MD_BOSS) ){ + if (battle_config.show_monster_hp_bar && !(md->status.mode&MD_BOSS)) { int i; for(i = 0; i < DAMAGELOG_SIZE; i++) {// must show hp bar to all char who already hit the mob. - if( md->dmglog[i].id == sd->status.char_id ) { + if (md->dmglog[i].id == sd->status.char_id) { clif->monster_hp_bar(md, sd); break; } @@ -4156,6 +4191,7 @@ int clif_calc_walkdelay(struct block_list *bl,int delay, int type, int damage, i if (type == 4 || type == 9 || damage <=0) return 0; + nullpo_retr(delay, bl); if (bl->type == BL_PC) { if (battle_config.pc_walk_delay_rate != 100) delay = delay*battle_config.pc_walk_delay_rate/100; @@ -4169,7 +4205,6 @@ int clif_calc_walkdelay(struct block_list *bl,int delay, int type, int damage, i return delay>0?delay:1; //Return 1 to specify there should be no noticeable delay, but you should stop walking. } - /// Sends a 'damage' packet (src performs action on dst) /// 008a <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.W <div>.W <type>.B <damage2>.W (ZC_NOTIFY_ACT) /// 02e1 <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.L <div>.W <type>.B <damage2>.L (ZC_NOTIFY_ACT2) @@ -4193,7 +4228,7 @@ int clif_damage(struct block_list* src, struct block_list* dst, int sdelay, int if(in_damage) in_damage = in_damage*(sc->data[SC_ILLUSION]->val2) + rnd()%100; if(in_damage2) in_damage2 = in_damage2*(sc->data[SC_ILLUSION]->val2) + rnd()%100; } - + #if PACKETVER < 20071113 damage = (short)min(in_damage,INT16_MAX); damage2 = (short)min(in_damage2,INT16_MAX); @@ -4304,7 +4339,6 @@ void clif_standing(struct block_list* bl) } } - /// Inform client(s) about a map-cell change (ZC_UPDATE_MAPINFO). /// 0192 <x>.W <y>.W <type>.W <map name>.16B void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_target target) { @@ -4330,11 +4364,13 @@ void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_targe } } - /// Notifies the client about an item on floor (ZC_ITEM_ENTRY). /// 009d <id>.L <name id>.W <identified>.B <x>.W <y>.W <amount>.W <subX>.B <subY>.B void clif_getareachar_item(struct map_session_data* sd,struct flooritem_data* fitem) { int view,fd; + + nullpo_retv(sd); + nullpo_retv(fitem); fd=sd->fd; WFIFOHEAD(fd,packet_len(0x9d)); @@ -4356,6 +4392,9 @@ void clif_getareachar_item(struct map_session_data* sd,struct flooritem_data* fi void clif_graffiti_entry(struct block_list *bl, struct skill_unit *su, enum send_target target) { struct packet_graffiti_entry p; + nullpo_retv(bl); + nullpo_retv(su); + nullpo_retv(su->group); p.PacketType = graffiti_entryType; p.AID = su->bl.id; p.creatorAID = su->group->src_id; @@ -4391,7 +4430,6 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *su, en #endif p.PacketType = skill_entryType; - #if PACKETVER >= 20110718 p.PacketLength = sizeof(p); #endif @@ -4407,7 +4445,7 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *su, en p.job = UNT_DUMMYSKILL; else p.job = su->group->unit_id; - + #if PACKETVER >= 20110718 p.RadiusRange = (unsigned char)su->range; #endif @@ -4424,7 +4462,6 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *su, en clif->changemapcell(bl->type == BL_PC ? ((TBL_PC*)bl)->fd : 0,su->bl.m,su->bl.x,su->bl.y,5,SELF); } - /*========================================== * Server tells client to remove unit of id 'unit->bl.id' *------------------------------------------*/ @@ -4440,7 +4477,6 @@ void clif_clearchar_skillunit(struct skill_unit *su, int fd) { clif->changemapcell(fd,su->bl.m,su->bl.x,su->bl.y,su->val2,SELF); } - /// Removes a skill unit (ZC_SKILL_DISAPPEAR). /// 0120 <id>.L void clif_skill_delunit(struct skill_unit *su) { @@ -4453,7 +4489,6 @@ void clif_skill_delunit(struct skill_unit *su) { clif->send(buf,packet_len(0x120),&su->bl,AREA); } - /// Sent when an object gets ankle-snared (ZC_SKILL_UPDATE). /// 01ac <id>.L /// Only affects units with class [139,153] client-side. @@ -4468,7 +4503,6 @@ void clif_skillunit_update(struct block_list* bl) clif->send(buf,packet_len(0x1ac),bl,AREA); } - /*========================================== * *------------------------------------------*/ @@ -4590,7 +4624,6 @@ int clif_insight(struct block_list *bl,va_list ap) return 0; } - /// Updates whole skill tree (ZC_SKILLINFO_LIST). /// 010f <packet len>.W { <skill id>.W <type>.L <level>.W <sp cost>.W <attack range>.W <skill name>.24B <upgradable>.B }* void clif_skillinfoblock(struct map_session_data *sd) @@ -4683,7 +4716,6 @@ void clif_addskill(struct map_session_data *sd, int id) WFIFOSET(fd,packet_len(0x111)); } - /// Deletes a skill from the skill tree (ZC_SKILLINFO_DELETE). /// 0441 <skill id>.W void clif_deleteskill(struct map_session_data *sd, int id) @@ -4730,14 +4762,18 @@ void clif_skillup(struct map_session_data *sd, uint16 skill_id, int skill_lv, in WFIFOSET(fd, packet_len(0x10e)); } - /// Updates a skill in the skill tree (ZC_SKILLINFO_UPDATE2). /// 07e1 <skill id>.W <type>.L <level>.W <sp cost>.W <attack range>.W <upgradable>.B void clif_skillinfo(struct map_session_data *sd,int skill_id, int inf) { const int fd = sd->fd; int idx = skill->get_index(skill_id); - int skill_lv = sd->status.skill[idx].lv; + int skill_lv; + + nullpo_retv(sd); + Assert_retv(idx >= 0 && idx < MAX_SKILL); + + skill_lv = sd->status.skill[idx].lv; WFIFOHEAD(fd,packet_len(0x7e1)); WFIFOW(fd,0) = 0x7e1; @@ -4758,7 +4794,6 @@ void clif_skillinfo(struct map_session_data *sd,int skill_id, int inf) WFIFOSET(fd,packet_len(0x7e1)); } - /// Notifies clients in area, that an object is about to use a skill. /// 013e <src id>.L <dst id>.L <x>.W <y>.W <skill id>.W <property>.L <delaytime>.L (ZC_USESKILL_ACK) /// 07fb <src id>.L <dst id>.L <x>.W <y>.W <skill id>.W <property>.L <delaytime>.L <is disposable>.B (ZC_USESKILL_ACK2) @@ -4803,7 +4838,6 @@ void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, clif->send(buf,packet_len(cmd), bl, AREA); } - /// Notifies clients in area, that an object canceled casting (ZC_DISPEL). /// 01b9 <id>.L void clif_skillcastcancel(struct block_list* bl) @@ -4817,7 +4851,6 @@ void clif_skillcastcancel(struct block_list* bl) clif->send(buf,packet_len(0x1b9), bl, AREA); } - /// Notifies the client about the result of a skill use request (ZC_ACK_TOUSESKILL). /// 0110 <skill id>.W <num>.L <result>.B <cause>.B /// num (only used when skill id = NV_BASIC and cause = 0): @@ -4875,7 +4908,6 @@ void clif_skill_fail(struct map_session_data *sd,uint16 skill_id,enum useskill_f WFIFOSET(fd,packet_len(0x110)); } - /// Skill cooldown display icon (ZC_SKILL_POSTDELAY). /// 043d <skill ID>.W <tick>.L void clif_skill_cooldown(struct map_session_data *sd, uint16 skill_id, unsigned int duration) @@ -4894,7 +4926,6 @@ void clif_skill_cooldown(struct map_session_data *sd, uint16 skill_id, unsigned #endif } - /// Skill attack effect and damage. /// 0114 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.W <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL) /// 01de <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.L <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL2) @@ -4908,11 +4939,11 @@ int clif_skill_damage(struct block_list *src, struct block_list *dst, int64 tick damage = (int)cap_value(in_damage,INT_MIN,INT_MAX); type = clif_calc_delay(type,div,damage,ddelay); - + #if PACKETVER >= 20131223 if( type == 6 ) type = 8; //bugreport:8263 #endif - + if( ( sc = status->get_sc(dst) ) && sc->count ) { if(sc->data[SC_ILLUSION] && damage) damage = damage*(sc->data[SC_ILLUSION]->val2) + rnd()%100; @@ -4986,7 +5017,6 @@ int clif_skill_damage(struct block_list *src, struct block_list *dst, int64 tick return clif->calc_walkdelay(dst,ddelay,type,damage,div); } - /// Ground skill attack effect and damage (ZC_NOTIFY_SKILL_POSITION). /// 0115 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <x>.W <y>.W <damage>.W <level>.W <div>.W <type>.B #if 0 @@ -5044,7 +5074,6 @@ int clif_skill_damage2(struct block_list *src, struct block_list *dst, int64 tic } #endif // 0 - /// Non-damaging skill effect (ZC_USE_SKILL). /// 011a <skill id>.W <skill lv>.W <dst id>.L <src id>.L <result>.B int clif_skill_nodamage(struct block_list *src,struct block_list *dst,uint16 skill_id,int heal,int fail) @@ -5077,7 +5106,6 @@ int clif_skill_nodamage(struct block_list *src,struct block_list *dst,uint16 ski return fail; } - /// Non-damaging ground skill effect (ZC_NOTIFY_GROUNDSKILL). /// 0117 <skill id>.W <src id>.L <level>.W <x>.W <y>.W <tick>.L void clif_skill_poseffect(struct block_list *src, uint16 skill_id, int val, int x, int y, int64 tick) { @@ -5105,6 +5133,7 @@ void clif_skill_poseffect(struct block_list *src, uint16 skill_id, int val, int void clif_skill_warppoint(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv, unsigned short map1, unsigned short map2, unsigned short map3, unsigned short map4) { int fd; + nullpo_retv(sd); fd = sd->fd; @@ -5128,7 +5157,6 @@ void clif_skill_warppoint(struct map_session_data* sd, uint16 skill_id, uint16 s sd->menuskill_val = skill_lv; } - /// Memo message (ZC_ACK_REMEMBER_WARPPOINT). /// 011e <type>.B /// type: @@ -5151,7 +5179,6 @@ void clif_skill_memomessage(struct map_session_data* sd, int type) WFIFOSET(fd,packet_len(0x11e)); } - /// Teleport message (ZC_NOTIFY_MAPINFO). /// 0189 <type>.W /// type: @@ -5174,7 +5201,6 @@ void clif_skill_mapinfomessage(struct map_session_data *sd, int type) WFIFOSET(fd,packet_len(0x189)); } - /// Displays Sense (WZ_ESTIMATION) information window (ZC_MONSTER_INFO). /// 018c <class>.W <level>.W <size>.W <hp>.L <def>.W <race>.W <mdef>.W <element>.W /// <water%>.B <earth%>.B <fire%>.B <wind%>.B <poison%>.B <holy%>.B <shadow%>.B <ghost%>.B <undead%>.B @@ -5211,7 +5237,6 @@ void clif_skill_estimation(struct map_session_data *sd,struct block_list *dst) { clif->send(buf,packet_len(0x18c),&sd->bl,sd->status.party_id>0?PARTY_SAMEMAP:SELF); } - /// Presents a textual list of producible items (ZC_MAKABLEITEMLIST). /// 018d <packet len>.W { <name id>.W { <material id>.W }*3 }* /// material id: @@ -5253,7 +5278,6 @@ void clif_skill_produce_mix_list(struct map_session_data *sd, int skill_id , int } } - /// Present a list of producible items (ZC_MAKINGITEM_LIST). /// 025a <packet len>.W <mk type>.W { <name id>.W }* /// mk type: @@ -5366,7 +5390,7 @@ void clif_status_change(struct block_list *bl,int type,int flag,int tick,int val p.index = type; p.AID = bl->id; p.state = (unsigned char)flag; - + #if PACKETVER >= 20120618 p.Total = tick; /* at this stage remain and total are the same value I believe */ #endif @@ -5404,8 +5428,8 @@ void clif_displaymessage(const int fd, const char* mes) { #endif } } + void clif_displaymessage2(const int fd, const char* mes) { - // invalid pointer? nullpo_retv(mes); //Scrapped, as these are shared by disconnected players =X [Skotlex] @@ -5442,6 +5466,7 @@ void clif_displaymessage_sprintf(const int fd, const char *mes, ...) __attribute void clif_displaymessage_sprintf(const int fd, const char *mes, ...) { va_list ap; + nullpo_retv(mes); if (map->cpsd_active && fd == 0) { ShowInfo("HCP: "); va_start(ap,mes); @@ -5472,10 +5497,13 @@ void clif_displaymessage_sprintf(const int fd, const char *mes, ...) { } /// Send broadcast message in yellow or blue without font formatting (ZC_BROADCAST). /// 009a <packet len>.W <message>.?B -void clif_broadcast(struct block_list* bl, const char* mes, size_t len, int type, enum send_target target) +void clif_broadcast(struct block_list *bl, const char *mes, size_t len, int type, enum send_target target) { int lp = (type&BC_COLOR_MASK) ? 4 : 0; - unsigned char *buf = (unsigned char*)aMalloc((4 + lp + len)*sizeof(unsigned char)); + unsigned char *buf = NULL; + nullpo_retv(mes); + + buf = aMalloc((4 + lp + len)*sizeof(unsigned char)); WBUFW(buf,0) = 0x9a; WBUFW(buf,2) = 4 + lp + len; @@ -5520,8 +5548,11 @@ void clif_GlobalMessage(struct block_list* bl, const char* message) { /// 01c3 <packet len>.W <fontColor>.L <fontType>.W <fontSize>.W <fontAlign>.W <fontY>.W <message>.?B void clif_broadcast2(struct block_list* bl, const char* mes, size_t len, unsigned int fontColor, short fontType, short fontSize, short fontAlign, short fontY, enum send_target target) { - unsigned char *buf = (unsigned char*)aMalloc((16 + len)*sizeof(unsigned char)); + unsigned char *buf; + + nullpo_retv(mes); + buf = (unsigned char*)aMalloc((16 + len)*sizeof(unsigned char)); WBUFW(buf,0) = 0x1c3; WBUFW(buf,2) = len + 16; WBUFL(buf,4) = fontColor; @@ -5535,7 +5566,6 @@ void clif_broadcast2(struct block_list* bl, const char* mes, size_t len, unsigne aFree(buf); } - /// Displays heal effect (ZC_RECOVERY). /// 013d <var id>.W <amount>.W /// var id: @@ -5551,7 +5581,6 @@ void clif_heal(int fd,int type,int val) WFIFOSET(fd,packet_len(0x13d)); } - /// Displays resurrection effect (ZC_RESURRECTION). /// 0148 <id>.L <type>.W /// type: @@ -5576,7 +5605,6 @@ void clif_resurrection(struct block_list *bl,int type) } } - /// Sets the map property (ZC_NOTIFY_MAPPROPERTY). /// 0199 <type>.W void clif_map_property(struct map_session_data* sd, enum map_property property) @@ -5592,7 +5620,6 @@ void clif_map_property(struct map_session_data* sd, enum map_property property) WFIFOSET(fd,packet_len(0x199)); } - /// Set the map type (ZC_NOTIFY_MAPPROPERTY2). /// 01d6 <type>.W void clif_map_type(struct map_session_data* sd, enum map_type type) { @@ -5607,12 +5634,13 @@ void clif_map_type(struct map_session_data* sd, enum map_type type) { WFIFOSET(fd,packet_len(0x1D6)); } - /// Updates PvP ranking (ZC_NOTIFY_RANKING). /// 019a <id>.L <ranking>.L <total>.L // FIXME: missing documentation for the 'type' parameter void clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type) { + nullpo_retv(sd); + if(type == 2) { int fd = sd->fd; WFIFOHEAD(fd,packet_len(0x19a)); @@ -5639,7 +5667,6 @@ void clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type) } } - /*========================================== * *------------------------------------------*/ @@ -5656,7 +5683,6 @@ void clif_map_property_mapall(int mapid, enum map_property property) clif->send(buf,packet_len(0x199),&bl,ALL_SAMEMAP); } - /// Notifies the client about the result of a refine attempt (ZC_ACK_ITEMREFINING). /// 0188 <result>.W <index>.W <refine>.W /// result: @@ -5673,7 +5699,6 @@ void clif_refine(int fd, int fail, int index, int val) WFIFOSET(fd,packet_len(0x188)); } - /// Notifies the client about the result of a weapon refine attempt (ZC_ACK_WEAPONREFINE). /// 0223 <result>.L <nameid>.W /// result: @@ -5690,11 +5715,17 @@ void clif_upgrademessage(int fd, int result, int item_id) WFIFOSET(fd,packet_len(0x223)); } - /// Whisper is transmitted to the destination player (ZC_WHISPER). /// 0097 <packet len>.W <nick>.24B <message>.?B /// 0097 <packet len>.W <nick>.24B <isAdmin>.L <message>.?B (PACKETVER >= 20091104) -void clif_wis_message(int fd, const char* nick, const char* mes, size_t mes_len) { +void clif_wis_message(int fd, const char *nick, const char *mes, size_t mes_len) +{ +#if PACKETVER >= 20091104 + struct map_session_data *ssd = NULL; +#endif // PACKETVER >= 20091104 + nullpo_retv(nick); + nullpo_retv(mes); + #if PACKETVER < 20091104 WFIFOHEAD(fd, mes_len + NAME_LENGTH + 4); WFIFOW(fd,0) = 0x97; @@ -5703,7 +5734,7 @@ void clif_wis_message(int fd, const char* nick, const char* mes, size_t mes_len) safestrncpy((char*)WFIFOP(fd,28), mes, mes_len); WFIFOSET(fd,WFIFOW(fd,2)); #else - struct map_session_data *ssd = map->nick2sd(nick); + ssd = map->nick2sd(nick); WFIFOHEAD(fd, mes_len + NAME_LENGTH + 8); WFIFOW(fd,0) = 0x97; @@ -5715,7 +5746,6 @@ void clif_wis_message(int fd, const char* nick, const char* mes, size_t mes_len) #endif } - /// Inform the player about the result of his whisper action (ZC_ACK_WHISPER). /// 0098 <result>.B /// result: @@ -5735,15 +5765,15 @@ void clif_wis_end(int fd, int flag) { #if PACKETVER >= 20131223 p.unknown = 0; #endif - + clif->send(&p, sizeof(p), &sd->bl, SELF); } - /// Returns character name requested by char_id (ZC_ACK_REQNAME_BYGID). /// 0194 <char id>.L <name>.24B void clif_solved_charname(int fd, int charid, const char* name) { + nullpo_retv(name); WFIFOHEAD(fd,packet_len(0x194)); WFIFOW(fd,0)=0x194; WFIFOL(fd,2)=charid; @@ -5751,7 +5781,6 @@ void clif_solved_charname(int fd, int charid, const char* name) WFIFOSET(fd,packet_len(0x194)); } - /// Presents a list of items that can be carded/composed (ZC_ITEMCOMPOSITION_LIST). /// 017b <packet len>.W { <name id>.W }* void clif_use_card(struct map_session_data *sd,int idx) @@ -5782,7 +5811,6 @@ void clif_use_card(struct map_session_data *sd,int idx) WFIFOSET(fd, WFIFOW(fd, 2)); } - /// Notifies the client about the result of item carding/composition (ZC_ACK_ITEMCOMPOSITION). /// 017d <equip index>.W <card index>.W <result>.B /// result: @@ -5803,7 +5831,6 @@ void clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int WFIFOSET(fd,packet_len(0x17d)); } - /// Presents a list of items that can be identified (ZC_ITEMIDENTIFY_LIST). /// 0177 <packet len>.W { <name id>.W }* void clif_item_identify_list(struct map_session_data *sd) @@ -5832,7 +5859,6 @@ void clif_item_identify_list(struct map_session_data *sd) } } - /// Notifies the client about the result of a item identify request (ZC_ACK_ITEMIDENTIFY). /// 0179 <index>.W <result>.B void clif_item_identified(struct map_session_data *sd,int idx,int flag) @@ -5849,7 +5875,6 @@ void clif_item_identified(struct map_session_data *sd,int idx,int flag) WFIFOSET(fd,packet_len(0x179)); } - /// Presents a list of items that can be repaired (ZC_REPAIRITEMLIST). /// 01fc <packet len>.W { <index>.W <name id>.W <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W }* void clif_item_repair_list(struct map_session_data *sd,struct map_session_data *dstsd, int lv) @@ -5884,7 +5909,6 @@ void clif_item_repair_list(struct map_session_data *sd,struct map_session_data * clif->skill_fail(sd,sd->ud.skill_id,USESKILL_FAIL_LEVEL,0); } - /// Notifies the client about the result of a item repair request (ZC_ACK_ITEMREPAIR). /// 01fe <index>.W <result>.B /// index: @@ -5908,12 +5932,14 @@ void clif_item_repaireffect(struct map_session_data *sd,int idx,int flag) } - /// Displays a message, that an equipment got damaged (ZC_EQUIPITEM_DAMAGED). /// 02bb <equip location>.W <account id>.L void clif_item_damaged(struct map_session_data* sd, unsigned short position) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x2bb)); WFIFOW(fd,0) = 0x2bb; @@ -5922,7 +5948,6 @@ void clif_item_damaged(struct map_session_data* sd, unsigned short position) WFIFOSET(fd,packet_len(0x2bb)); } - /// Presents a list of weapon items that can be refined [Taken from jAthena] (ZC_NOTIFY_WEAPONITEMLIST). /// 0221 <packet len>.W { <index>.W <name id>.W <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W }* void clif_item_refine_list(struct map_session_data *sd) @@ -5959,7 +5984,6 @@ void clif_item_refine_list(struct map_session_data *sd) } } - /// Notification of an auto-casted skill (ZC_AUTORUN_SKILL). /// 0147 <skill id>.W <type>.L <level>.W <sp cost>.W <atk range>.W <skill name>.24B <upgradeable>.B void clif_item_skill(struct map_session_data *sd,uint16 skill_id,uint16 skill_lv) @@ -5982,7 +6006,6 @@ void clif_item_skill(struct map_session_data *sd,uint16 skill_id,uint16 skill_lv WFIFOSET(fd,packet_len(0x147)); } - /// Adds an item to character's cart. /// 0124 <index>.W <amount>.L <name id>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W (ZC_ADD_ITEM_TO_CART) /// 01c5 <index>.W <amount>.L <name id>.W <type>.B <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W (ZC_ADD_ITEM_TO_CART2) @@ -6021,7 +6044,6 @@ void clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail) WFIFOSET(fd,packet_len(cartaddType)); } - /// Deletes an item from character's cart (ZC_DELETE_ITEM_FROM_CART). /// 0125 <index>.W <amount>.L void clif_cart_delitem(struct map_session_data *sd,int n,int amount) @@ -6039,7 +6061,6 @@ void clif_cart_delitem(struct map_session_data *sd,int n,int amount) WFIFOSET(fd,packet_len(0x125)); } - /// Opens the shop creation menu (ZC_OPENSTORE). /// 012d <num>.W /// num: @@ -6057,7 +6078,6 @@ void clif_openvendingreq(struct map_session_data* sd, int num) WFIFOSET(fd,packet_len(0x12d)); } - /// Displays a vending board to target/area (ZC_STORE_ENTRY). /// 0131 <owner id>.L <message>.80B void clif_showvendingboard(struct block_list* bl, const char* message, int fd) @@ -6079,7 +6099,6 @@ void clif_showvendingboard(struct block_list* bl, const char* message, int fd) } } - /// Removes a vending board from screen (ZC_DISAPPEAR_ENTRY). /// 0132 <owner id>.L void clif_closevendingboard(struct block_list* bl, int fd) @@ -6099,7 +6118,6 @@ void clif_closevendingboard(struct block_list* bl, int fd) } } - /// Sends a list of items in a shop. /// R 0133 <packet len>.W <owner id>.L { <price>.L <amount>.W <index>.W <type>.B <name id>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W }* (ZC_PC_PURCHASE_ITEMLIST_FROMMC) /// R 0800 <packet len>.W <owner id>.L <unique id>.L { <price>.L <amount>.W <index>.W <type>.B <name id>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W }* (ZC_PC_PURCHASE_ITEMLIST_FROMMC2) @@ -6155,7 +6173,6 @@ void clif_vendinglist(struct map_session_data* sd, unsigned int id, struct s_ven WFIFOSET(fd,WFIFOW(fd,2)); } - /// Shop purchase failure (ZC_PC_PURCHASE_RESULT_FROMMC). /// 0135 <index>.W <amount>.W <result>.B /// result: @@ -6181,13 +6198,12 @@ void clif_buyvending(struct map_session_data* sd, int index, int amount, int fai WFIFOSET(fd,packet_len(0x135)); } - /// Shop creation success (ZC_PC_PURCHASE_MYITEMLIST). /// 0136 <packet len>.W <owner id>.L { <price>.L <index>.W <amount>.W <type>.B <name id>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W }* void clif_openvending(struct map_session_data* sd, int id, struct s_vending* vending_items) { int i,fd; int count; - + #if PACKETVER >= 20150226 const int item_length = 47; #else @@ -6195,6 +6211,7 @@ void clif_openvending(struct map_session_data* sd, int id, struct s_vending* ven #endif nullpo_retv(sd); + nullpo_retv(vending_items); fd = sd->fd; count = sd->vend_num; @@ -6220,7 +6237,7 @@ void clif_openvending(struct map_session_data* sd, int id, struct s_vending* ven #endif } WFIFOSET(fd,WFIFOW(fd,2)); - + #if PACKETVER >= 20141022 /** should go elsewhere perhaps? it has to be bundled with this however. **/ WFIFOHEAD(fd, 3); @@ -6230,7 +6247,6 @@ void clif_openvending(struct map_session_data* sd, int id, struct s_vending* ven #endif } - /// Inform merchant that someone has bought an item (ZC_DELETEITEM_FROM_MCSTORE). /// 0137 <index>.W <amount>.W void clif_vendingreport(struct map_session_data* sd, int index, int amount) @@ -6247,7 +6263,6 @@ void clif_vendingreport(struct map_session_data* sd, int index, int amount) WFIFOSET(fd,packet_len(0x137)); } - /// Result of organizing a party (ZC_ACK_MAKE_GROUP). /// 00fa <result>.B /// result: @@ -6269,7 +6284,6 @@ void clif_party_created(struct map_session_data *sd,int result) WFIFOSET(fd,packet_len(0xfa)); } - /// Adds new member to a party. /// 0104 <account id>.L <role>.L <x>.W <y>.W <state>.B <party name>.24B <char name>.24B <map name>.16B (ZC_ADD_MEMBER_TO_GROUP) /// 01e9 <account id>.L <role>.L <x>.W <y>.W <state>.B <party name>.24B <char name>.24B <map name>.16B <item pickup rule>.B <item share rule>.B (ZC_ADD_MEMBER_TO_GROUP2) @@ -6284,6 +6298,8 @@ void clif_party_member_info(struct party_data *p, struct map_session_data *sd) unsigned char buf[81]; int i; + nullpo_retv(p); + nullpo_retv(sd); if (!sd) { //Pick any party member (this call is used when changing item share rules) ARR_FIND( 0, MAX_PARTY, i, p->data[i].sd != 0 ); } else { @@ -6306,7 +6322,6 @@ void clif_party_member_info(struct party_data *p, struct map_session_data *sd) clif->send(buf,packet_len(0x1e9),&sd->bl,PARTY); } - /// Sends party information (ZC_GROUP_LIST). /// 00fb <packet len>.W <party name>.24B { <account id>.L <nick>.24B <map name>.16B <role>.B <state>.B }* /// role: @@ -6348,7 +6363,6 @@ void clif_party_info(struct party_data* p, struct map_session_data *sd) } } - /// The player's 'party invite' state, sent during login (ZC_PARTY_CONFIG). /// 02c9 <flag>.B /// flag: @@ -6366,7 +6380,6 @@ void clif_partyinvitationstate(struct map_session_data* sd) WFIFOSET(fd, packet_len(0x2c9)); } - /// Party invitation request. /// 00fe <party id>.L <party name>.24B (ZC_REQ_JOIN_GROUP) /// 02c6 <party id>.L <party name>.24B (ZC_PARTY_JOIN_REQ) @@ -6395,7 +6408,6 @@ void clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd) WFIFOSET(fd,packet_len(cmd)); } - /// Party invite result. /// 00fd <nick>.24S <result>.B (ZC_ACK_REQ_JOIN_GROUP) /// 02c5 <nick>.24S <result>.L (ZC_PARTY_JOIN_REQ_ACK) @@ -6412,6 +6424,7 @@ void clif_party_inviteack(struct map_session_data* sd, const char* nick, int res { int fd; nullpo_retv(sd); + nullpo_retv(nick); fd=sd->fd; #if PACKETVER < 20070904 @@ -6436,7 +6449,6 @@ void clif_party_inviteack(struct map_session_data* sd, const char* nick, int res #endif } - /// Updates party settings. /// 0101 <exp option>.L (ZC_GROUPINFO_CHANGE) /// 07d8 <exp option>.L <item pick rule>.B <item share rule>.B (ZC_REQ_GROUPINFO_CHANGE_V2) @@ -6479,7 +6491,6 @@ void clif_party_option(struct party_data *p,struct map_session_data *sd,int flag clif->send(buf,packet_len(cmd),&sd->bl,SELF); } - /// 0105 <account id>.L <char name>.24B <result>.B (ZC_DELETE_MEMBER_FROM_GROUP). /// result: /// 0 = leave @@ -6491,17 +6502,18 @@ void clif_party_withdraw(struct party_data* p, struct map_session_data* sd, int unsigned char buf[64]; nullpo_retv(p); + nullpo_retv(name); - if(!sd && (flag&0xf0)==0) - { + if(!sd && (flag&0xf0)==0) { // TODO: Document this flag int i; - for(i=0;i<MAX_PARTY && !p->data[i].sd;i++) - ; - if (i < MAX_PARTY) - sd = p->data[i].sd; + // Search for any online party member + ARR_FIND(0, MAX_PARTY, i, p->data[i].sd != NULL); + if (i != MAX_PARTY) + sd = p->data[i].sd; } - if(!sd) return; + if (!sd) + return; WBUFW(buf,0)=0x105; WBUFL(buf,2)=account_id; @@ -6513,7 +6525,6 @@ void clif_party_withdraw(struct party_data* p, struct map_session_data* sd, int clif->send(buf,packet_len(0x105),&sd->bl,SELF); } - /// Party chat message (ZC_NOTIFY_CHAT_PARTY). /// 0109 <packet len>.W <account id>.L <message>.?B void clif_party_message(struct party_data* p, int account_id, const char* mes, int len) @@ -6522,6 +6533,7 @@ void clif_party_message(struct party_data* p, int account_id, const char* mes, i int i; nullpo_retv(p); + nullpo_retv(mes); for(i=0; i < MAX_PARTY && !p->data[i].sd;i++); if(i < MAX_PARTY){ @@ -6542,7 +6554,6 @@ void clif_party_message(struct party_data* p, int account_id, const char* mes, i } } - /// Updates the position of a party member on the minimap (ZC_NOTIFY_POSITION_TO_GROUPM). /// 0107 <account id>.L <x>.W <y>.W void clif_party_xy(struct map_session_data *sd) @@ -6558,12 +6569,12 @@ void clif_party_xy(struct map_session_data *sd) clif->send(buf,packet_len(0x107),&sd->bl,PARTY_SAMEMAP_WOS); } - /*========================================== * Sends x/y dot to a single fd. [Skotlex] *------------------------------------------*/ void clif_party_xy_single(int fd, struct map_session_data *sd) { + nullpo_retv(sd); WFIFOHEAD(fd,packet_len(0x107)); WFIFOW(fd,0)=0x107; WFIFOL(fd,2)=sd->status.account_id; @@ -6572,7 +6583,6 @@ void clif_party_xy_single(int fd, struct map_session_data *sd) WFIFOSET(fd,packet_len(0x107)); } - /// Updates HP bar of a party member. /// 0106 <account id>.L <hp>.W <max hp>.W (ZC_NOTIFY_HP_TO_GROUPM) /// 080e <account id>.L <hp>.L <max hp>.L (ZC_NOTIFY_HP_TO_GROUPM_R2) @@ -6604,7 +6614,6 @@ void clif_party_hp(struct map_session_data *sd) clif->send(buf,packet_len(cmd),&sd->bl,PARTY_AREA_WOS); } - /*========================================== * Sends HP bar to a single fd. [Skotlex] *------------------------------------------*/ @@ -6655,7 +6664,6 @@ void clif_movetoattack(struct map_session_data *sd,struct block_list *bl) WFIFOSET(fd,packet_len(0x139)); } - /// Notifies the client about the result of an item produce request (ZC_ACK_REQMAKINGITEM). /// 018f <result>.W <name id>.W /// result: @@ -6681,7 +6689,6 @@ void clif_produceeffect(struct map_session_data* sd,int flag,int nameid) WFIFOSET(fd,packet_len(0x18f)); } - /// Initiates the pet taming process (ZC_START_CAPTURE). /// 019e void clif_catch_process(struct map_session_data *sd) @@ -6696,7 +6703,6 @@ void clif_catch_process(struct map_session_data *sd) WFIFOSET(fd,packet_len(0x19e)); } - /// Displays the result of a pet taming attempt (ZC_TRYCAPTURE_MONSTER). /// 01a0 <result>.B /// 0 = failure @@ -6714,7 +6720,6 @@ void clif_pet_roulette(struct map_session_data *sd,int data) WFIFOSET(fd,packet_len(0x1a0)); } - /// Presents a list of pet eggs that can be hatched (ZC_PETEGG_LIST). /// 01a6 <packet len>.W { <index>.W }* void clif_sendegg(struct map_session_data *sd) @@ -6745,7 +6750,6 @@ void clif_sendegg(struct map_session_data *sd) sd->menuskill_val = -1; } - /// Sends a specific pet data update (ZC_CHANGESTATE_PET). /// 01a4 <type>.B <id>.L <data>.L /// type: @@ -6772,7 +6776,6 @@ void clif_send_petdata(struct map_session_data* sd, struct pet_data* pd, int typ clif->send(buf, packet_len(0x1a4), &pd->bl, AREA); } - /// Pet's base data (ZC_PROPERTY_PET). /// 01a2 <name>.24B <renamed>.B <level>.W <hunger>.W <intimacy>.W <accessory id>.W <class>.W void clif_send_petstatus(struct map_session_data *sd) @@ -6799,7 +6802,6 @@ void clif_send_petstatus(struct map_session_data *sd) WFIFOSET(fd,packet_len(0x1a2)); } - /// Notification about a pet's emotion/talk (ZC_PET_ACT). /// 01aa <id>.L <data>.L /// data: @@ -6828,7 +6830,6 @@ void clif_pet_emotion(struct pet_data *pd,int param) clif->send(buf,packet_len(0x1aa),&pd->bl,AREA); } - /// Result of request to feed a pet (ZC_FEED_PET). /// 01a3 <result>.B <name id>.W /// result: @@ -6848,7 +6849,6 @@ void clif_pet_food(struct map_session_data *sd,int foodid,int fail) WFIFOSET(fd,packet_len(0x1a3)); } - /// Presents a list of skills that can be auto-spelled (ZC_AUTOSPELLLIST). /// 01cd { <skill id>.L }*7 void clif_autospell(struct map_session_data *sd,uint16 skill_lv) @@ -6895,7 +6895,6 @@ void clif_autospell(struct map_session_data *sd,uint16 skill_lv) sd->menuskill_val = skill_lv; } - /// Devotion's visual effect (ZC_DEVOTIONLIST). /// 01cf <devoter id>.L { <devotee id>.L }*5 <max distance>.W void clif_devotion(struct block_list *src, struct map_session_data *tsd) @@ -6956,7 +6955,6 @@ void clif_spiritball(struct block_list *bl) { clif->send(buf, packet_len(0x1d0), bl, AREA); } - /// Notifies clients in area of a character's combo delay (ZC_COMBODELAY). /// 01d2 <account id>.L <delay>.L void clif_combo_delay(struct block_list *bl,int wait) @@ -6971,7 +6969,6 @@ void clif_combo_delay(struct block_list *bl,int wait) clif->send(buf,packet_len(0x1d2),bl,AREA); } - /// Notifies clients in area that a character has blade-stopped another (ZC_BLADESTOP). /// 01d1 <src id>.L <dst id>.L <flag>.L /// flag: @@ -6991,7 +6988,6 @@ void clif_bladestop(struct block_list *src, int dst_id, int active) clif->send(buf,packet_len(0x1d1),src,AREA); } - /// MVP effect (ZC_MVP). /// 010c <account id>.L void clif_mvp_effect(struct map_session_data *sd) @@ -7005,7 +7001,6 @@ void clif_mvp_effect(struct map_session_data *sd) clif->send(buf,packet_len(0x10c),&sd->bl,AREA); } - /// MVP item reward message (ZC_MVP_GETTING_ITEM). /// 010a <name id>.W void clif_mvp_item(struct map_session_data *sd,int nameid) @@ -7024,7 +7019,6 @@ void clif_mvp_item(struct map_session_data *sd,int nameid) WFIFOSET(fd,packet_len(0x10a)); } - /// MVP EXP reward message (ZC_MVP_GETTING_SPECIAL_EXP). /// 010b <exp>.L void clif_mvp_exp(struct map_session_data *sd, unsigned int exp) @@ -7040,7 +7034,6 @@ void clif_mvp_exp(struct map_session_data *sd, unsigned int exp) WFIFOSET(fd,packet_len(0x10b)); } - /// Dropped MVP item reward message (ZC_THROW_MVPITEM). /// 010d /// @@ -7055,7 +7048,6 @@ void clif_mvp_noitem(struct map_session_data* sd) WFIFOSET(fd,packet_len(0x10d)); } - /// Guild creation result (ZC_RESULT_MAKE_GUILD). /// 0167 <result>.B /// result: @@ -7076,7 +7068,6 @@ void clif_guild_created(struct map_session_data *sd,int flag) WFIFOSET(fd,packet_len(0x167)); } - /// Notifies the client that it is belonging to a guild (ZC_UPDATE_GDID). /// 016c <guild id>.L <emblem id>.L <mode>.L <ismaster>.B <inter sid>.L <guild name>.24B /// mode: @see enum guild_permission @@ -7099,7 +7090,6 @@ void clif_guild_belonginfo(struct map_session_data *sd, struct guild *g) WFIFOSET(fd,packet_len(0x16c)); } - /// Guild member login notice. /// 016d <account id>.L <char id>.L <status>.L (ZC_UPDATE_CHARSTAT) /// 01f2 <account id>.L <char id>.L <status>.L <gender>.W <hair style>.W <hair color>.W (ZC_UPDATE_CHARSTAT2) @@ -7172,7 +7162,6 @@ void clif_guild_send_onlineinfo(struct map_session_data *sd) clif->send(buf, p_len*count, &sd->bl, SELF); } - /// Bitmask of enabled guild window tabs (ZC_ACK_GUILD_MENUINTERFACE). /// 014e <menu flag>.L /// menu flag: @@ -7196,7 +7185,6 @@ void clif_guild_masterormember(struct map_session_data *sd) WFIFOSET(fd,packet_len(0x14e)); } - /// Guild basic information (Territories [Valaris]) /// 0150 <guild id>.L <level>.L <member num>.L <member max>.L <exp>.L <max exp>.L <points>.L <honor>.L <virtue>.L <emblem id>.L <name>.24B <master name>.24B <manage land>.16B (ZC_GUILD_INFO) /// 01b6 <guild id>.L <level>.L <member num>.L <member max>.L <exp>.L <max exp>.L <points>.L <honor>.L <virtue>.L <emblem id>.L <name>.24B <master name>.24B <manage land>.16B <zeny>.L (ZC_GUILD_INFO2) @@ -7232,7 +7220,6 @@ void clif_guild_basicinfo(struct map_session_data *sd) { WFIFOSET(fd,packet_len(0x1b6)); } - /// Guild alliance and opposition list (ZC_MYGUILD_BASIC_INFO). /// 014c <packet len>.W { <relation>.L <guild id>.L <guild name>.24B }* void clif_guild_allianceinfo(struct map_session_data *sd) @@ -7260,7 +7247,6 @@ void clif_guild_allianceinfo(struct map_session_data *sd) WFIFOSET(fd,WFIFOW(fd,2)); } - /// Guild member manager information (ZC_MEMBERMGR_INFO). /// 0154 <packet len>.W { <account>.L <char id>.L <hair style>.W <hair color>.W <gender>.W <class>.W <level>.W <contrib exp>.L <state>.L <position>.L <memo>.50B <name>.24B }* /// state: @@ -7304,7 +7290,6 @@ void clif_guild_memberlist(struct map_session_data *sd) WFIFOSET(fd,WFIFOW(fd,2)); } - /// Guild position name information (ZC_POSITION_ID_NAME_INFO). /// 0166 <packet len>.W { <position id>.L <position name>.24B }* void clif_guild_positionnamelist(struct map_session_data *sd) { @@ -7326,7 +7311,6 @@ void clif_guild_positionnamelist(struct map_session_data *sd) { WFIFOSET(fd,WFIFOW(fd,2)); } - /// Guild position information (ZC_POSITION_INFO). /// 0160 <packet len>.W { <position id>.L <mode>.L <ranking>.L <pay rate>.L }* /// mode: @see enum guild_permission @@ -7354,7 +7338,6 @@ void clif_guild_positioninfolist(struct map_session_data *sd) { WFIFOSET(fd,WFIFOW(fd,2)); } - /// Notifies clients in a guild about updated position information (ZC_ACK_CHANGE_GUILD_POSITIONINFO). /// 0174 <packet len>.W { <position id>.L <mode>.L <ranking>.L <pay rate>.L <position name>.24B }* /// mode: @see enum guild_permission @@ -7383,7 +7366,6 @@ void clif_guild_positionchanged(struct guild *g,int idx) clif->send(buf,WBUFW(buf,2),&sd->bl,GUILD); } - /// Notifies clients in a guild about updated member position assignments (ZC_ACK_REQ_CHANGE_MEMBERS). /// 0156 <packet len>.W { <account id>.L <char id>.L <position id>.L }* void clif_guild_memberpositionchanged(struct guild *g,int idx) @@ -7407,7 +7389,6 @@ void clif_guild_memberpositionchanged(struct guild *g,int idx) clif->send(buf,WBUFW(buf,2),&sd->bl,GUILD); } - /// Sends emblems bitmap data to the client that requested it (ZC_GUILD_EMBLEM_IMG). /// 0152 <packet len>.W <guild id>.L <emblem id>.L <emblem data>.?B void clif_guild_emblem(struct map_session_data *sd,struct guild *g) @@ -7429,7 +7410,6 @@ void clif_guild_emblem(struct map_session_data *sd,struct guild *g) WFIFOSET(fd,WFIFOW(fd,2)); } - /// Sends update of the guild id/emblem id to everyone in the area (ZC_CHANGE_GUILD). /// 01b4 <id>.L <guild id>.L <emblem id>.W void clif_guild_emblem_area(struct block_list* bl) @@ -7447,7 +7427,6 @@ void clif_guild_emblem_area(struct block_list* bl) clif->send(buf, 12, bl, AREA_WOS); } - /// Sends guild skills (ZC_GUILD_SKILLINFO). /// 0162 <packet len>.W <skill points>.W { <skill id>.W <type>.L <level>.W <sp cost>.W <atk range>.W <skill name>.24B <upgradeable>.B }* void clif_guild_skillinfo(struct map_session_data* sd) @@ -7487,7 +7466,6 @@ void clif_guild_skillinfo(struct map_session_data* sd) WFIFOSET(fd,WFIFOW(fd,2)); } - /// Sends guild notice to client (ZC_GUILD_NOTICE). /// 016f <subject>.60B <notice>.120B void clif_guild_notice(struct map_session_data* sd, struct guild* g) @@ -7512,7 +7490,6 @@ void clif_guild_notice(struct map_session_data* sd, struct guild* g) WFIFOSET(fd,packet_len(0x16f)); } - /// Guild invite (ZC_REQ_JOIN_GUILD). /// 016a <guild id>.L <guild name>.24B void clif_guild_invite(struct map_session_data *sd,struct guild *g) @@ -7530,7 +7507,6 @@ void clif_guild_invite(struct map_session_data *sd,struct guild *g) WFIFOSET(fd,packet_len(0x16a)); } - /// Reply to invite request (ZC_ACK_REQ_JOIN_GUILD). /// 0169 <answer>.B /// answer: @@ -7551,7 +7527,6 @@ void clif_guild_inviteack(struct map_session_data *sd,int flag) WFIFOSET(fd,packet_len(0x169)); } - /// Notifies clients of a guild of a leaving member (ZC_ACK_LEAVE_GUILD). /// 015a <char name>.24B <reason>.40B void clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes) @@ -7566,7 +7541,6 @@ void clif_guild_leave(struct map_session_data *sd,const char *name,const char *m clif->send(buf,packet_len(0x15a),&sd->bl,GUILD_NOBG); } - /// Notifies clients of a guild of an expelled member. /// 015c <char name>.24B <reason>.40B <account name>.24B (ZC_ACK_BAN_GUILD) /// 0839 <char name>.24B <reason>.40B (ZC_ACK_BAN_GUILD_SSO) @@ -7580,6 +7554,8 @@ void clif_guild_expulsion(struct map_session_data* sd, const char* name, const c #endif nullpo_retv(sd); + nullpo_retv(name); + nullpo_retv(mes); WBUFW(buf,0) = cmd; safestrncpy((char*)WBUFP(buf,2), name, NAME_LENGTH); @@ -7590,7 +7566,6 @@ void clif_guild_expulsion(struct map_session_data* sd, const char* name, const c clif->send(buf, packet_len(cmd), &sd->bl, GUILD_NOBG); } - /// Guild expulsion list (ZC_BAN_LIST). /// 0163 <packet len>.W { <char name>.24B <account name>.24B <reason>.40B }* /// 0163 <packet len>.W { <char name>.24B <reason>.40B }* (PACKETVER >= 20100803) @@ -7633,7 +7608,6 @@ void clif_guild_expulsionlist(struct map_session_data* sd) { WFIFOSET(fd,WFIFOW(fd,2)); } - /// Guild chat message (ZC_GUILD_CHAT). /// 017f <packet len>.W <message>.?B void clif_guild_message(struct guild *g,int account_id,const char *mes,int len) @@ -7641,6 +7615,7 @@ void clif_guild_message(struct guild *g,int account_id,const char *mes,int len) struct map_session_data *sd; uint8 buf[256]; + nullpo_retv(mes); if (len == 0) return; @@ -7664,6 +7639,7 @@ void clif_guild_reqalliance(struct map_session_data *sd,int account_id,const cha int fd; nullpo_retv(sd); + nullpo_retv(name); fd=sd->fd; WFIFOHEAD(fd,packet_len(0x171)); @@ -7673,7 +7649,6 @@ void clif_guild_reqalliance(struct map_session_data *sd,int account_id,const cha WFIFOSET(fd,packet_len(0x171)); } - /// Notifies the client about the result of a alliance request (ZC_ACK_REQ_ALLY_GUILD). /// 0173 <answer>.B /// answer: @@ -7696,7 +7671,6 @@ void clif_guild_allianceack(struct map_session_data *sd,int flag) WFIFOSET(fd,packet_len(0x173)); } - /// Notifies the client that a alliance or opposition has been removed (ZC_DELETE_RELATED_GUILD). /// 0184 <other guild id>.L <relation>.L /// relation: @@ -7718,7 +7692,6 @@ void clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag) WFIFOSET(fd,packet_len(0x184)); } - /// Notifies the client about the result of a opposition request (ZC_ACK_REQ_HOSTILE_GUILD). /// 0181 <result>.B /// result: @@ -7739,7 +7712,6 @@ void clif_guild_oppositionack(struct map_session_data *sd,int flag) WFIFOSET(fd,packet_len(0x181)); } - /// Adds alliance or opposition (ZC_ADD_RELATED_GUILD). /// 0185 <relation>.L <guild id>.L <guild name>.24B /* @@ -7754,7 +7726,6 @@ void clif_guild_allianceadded(struct guild *g,int idx) } */ - /// Notifies the client about the result of a guild break (ZC_ACK_DISORGANIZE_GUILD_RESULT). /// 015e <reason>.L /// 0 = success @@ -7773,7 +7744,6 @@ void clif_guild_broken(struct map_session_data *sd,int flag) WFIFOSET(fd,packet_len(0x15e)); } - /// Displays emotion on an object (ZC_EMOTION). /// 00c0 <id>.L <type>.B /// type: @@ -7790,13 +7760,13 @@ void clif_emotion(struct block_list *bl,int type) clif->send(buf,packet_len(0xc0),bl,AREA); } - /// Displays the contents of a talkiebox trap (ZC_TALKBOX_CHATCONTENTS). /// 0191 <id>.L <contents>.80B void clif_talkiebox(struct block_list* bl, const char* talkie) { unsigned char buf[MESSAGE_SIZE+6]; nullpo_retv(bl); + nullpo_retv(talkie); WBUFW(buf,0) = 0x191; WBUFL(buf,2) = bl->id; @@ -7804,7 +7774,6 @@ void clif_talkiebox(struct block_list* bl, const char* talkie) clif->send(buf,packet_len(0x191),bl,AREA); } - /// Displays wedding effect centered on an object (ZC_CONGRATULATION). /// 01ea <id>.L void clif_wedding_effect(struct block_list *bl) @@ -7818,7 +7787,6 @@ void clif_wedding_effect(struct block_list *bl) clif->send(buf, packet_len(0x1ea), bl, AREA); } - /// Notifies the client of the name of the partner character (ZC_COUPLENAME). /// 01e6 <partner name>.24B void clif_callpartner(struct map_session_data *sd) { @@ -7843,7 +7811,6 @@ void clif_callpartner(struct map_session_data *sd) { clif->send(buf, packet_len(0x1e6), &sd->bl, AREA); } - /// Initiates the partner "taming" process [DracoRPG] (ZC_START_COUPLE). /// 01e4 /// This packet while still implemented by the client is no longer being officially used. @@ -7860,7 +7827,6 @@ void clif_marriage_process(struct map_session_data *sd) } */ - /// Notice of divorce (ZC_DIVORCE). /// 0205 <partner name>.24B void clif_divorced(struct map_session_data* sd, const char* name) @@ -7875,7 +7841,6 @@ void clif_divorced(struct map_session_data* sd, const char* name) WFIFOSET(fd, packet_len(0x205)); } - /// Marriage proposal (ZC_REQ_COUPLE). /// 01e2 <account id>.L <char id>.L <char name>.24B /// This packet while still implemented by the client is no longer being officially used. @@ -7903,6 +7868,9 @@ void clif_disp_message(struct block_list* src, const char* mes, size_t len, enum if (len == 0) return; + nullpo_retv(src); + nullpo_retv(mes); + if (len > sizeof(buf)-5) { ShowWarning("clif_disp_message: Truncated message '%s' (len=%"PRIuS", max=%"PRIuS", aid=%d).\n", mes, len, sizeof(buf)-5, src->id); len = sizeof(buf)-5; @@ -7914,7 +7882,6 @@ void clif_disp_message(struct block_list* src, const char* mes, size_t len, enum clif->send(buf, WBUFW(buf,2), src, target); } - /// Notifies the client about the result of a request to disconnect another player (ZC_ACK_DISCONNECT_CHARACTER). /// 00cd <result>.L (unknown packet version or invalid information at packet_len_table) /// 00cd <result>.B @@ -7934,20 +7901,21 @@ void clif_GM_kickack(struct map_session_data *sd, int result) WFIFOSET(fd, packet_len(0xcd)); } - void clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd) { - int fd = tsd->fd; + int fd; + + nullpo_retv(tsd); + fd = tsd->fd; - if( fd > 0 ) + if (fd > 0) clif->authfail_fd(fd, 15); else map->quit(tsd); - if( sd ) + if (sd) clif->GM_kickack(sd, 1); } - /// Displays various manner-related status messages (ZC_ACK_GIVE_MANNER_POINT). /// 014a <result>.L /// result: @@ -7969,7 +7937,6 @@ void clif_manner_message(struct map_session_data* sd, uint32 type) WFIFOSET(fd, packet_len(0x14a)); } - /// Follow-up to 0x14a type 3/5, informs who did the manner adjustment action (ZC_NOTIFY_MANNER_POINT_GIVEN). /// 014b <type>.B <GM name>.24B /// type: @@ -7989,7 +7956,6 @@ void clif_GM_silence(struct map_session_data* sd, struct map_session_data* tsd, WFIFOSET(fd, packet_len(0x14b)); } - /// Notifies the client about the result of a request to allow/deny whispers from a player (ZC_SETTING_WHISPER_PC). /// 00d1 <type>.B <result>.B /// type: @@ -8033,7 +7999,6 @@ void clif_wisall(struct map_session_data *sd,int type,int flag) { WFIFOSET(fd,packet_len(0xd2)); } - /// Play a BGM! [Rikter/Yommy] (ZC_PLAY_NPC_BGM). /// 07fe <bgm>.24B void clif_playBGM(struct map_session_data* sd, const char* name) @@ -8049,7 +8014,6 @@ void clif_playBGM(struct map_session_data* sd, const char* name) WFIFOSET(fd,packet_len(0x7fe)); } - /// Plays/stops a wave sound (ZC_SOUND). /// 01d3 <file name>.24B <act>.B <term>.L <npc id>.L /// file name: @@ -8069,6 +8033,7 @@ void clif_soundeffect(struct map_session_data* sd, struct block_list* bl, const nullpo_retv(sd); nullpo_retv(bl); + nullpo_retv(name); fd = sd->fd; WFIFOHEAD(fd,packet_len(0x1d3)); @@ -8085,6 +8050,7 @@ void clif_soundeffectall(struct block_list* bl, const char* name, int type, enum unsigned char buf[40]; nullpo_retv(bl); + nullpo_retv(name); WBUFW(buf,0) = 0x1d3; safestrncpy((char*)WBUFP(buf,2), name, NAME_LENGTH); @@ -8094,7 +8060,6 @@ void clif_soundeffectall(struct block_list* bl, const char* name, int type, enum clif->send(buf, packet_len(0x1d3), bl, coverage); } - /// Displays special effects (npcs, weather, etc) [Valaris] (ZC_NOTIFY_EFFECT2). /// 01f3 <id>.L <effect id>.L /// effect id: @@ -8120,6 +8085,7 @@ void clif_specialeffect(struct block_list* bl, int type, enum send_target target } void clif_specialeffect_single(struct block_list* bl, int type, int fd) { + nullpo_retv(bl); WFIFOHEAD(fd,10); WFIFOW(fd,0) = 0x1f3; WFIFOL(fd,2) = bl->id; @@ -8127,7 +8093,6 @@ void clif_specialeffect_single(struct block_list* bl, int type, int fd) { WFIFOSET(fd,10); } - /// Notifies clients of an special/visual effect that accepts an value (ZC_NOTIFY_EFFECT3). /// 0284 <id>.L <effect id>.L <num data>.L /// effect id: @@ -8162,7 +8127,10 @@ void clif_specialeffect_value(struct block_list* bl, int effect_id, int num, sen */ void clif_messagecolor_self(int fd, uint32 color, const char *msg) { - size_t msg_len = strlen(msg) + 1; + size_t msg_len; + + nullpo_retv(msg); + msg_len = strlen(msg) + 1; WFIFOHEAD(fd,msg_len + 12); WFIFOW(fd,0) = 0x2C1; @@ -8188,6 +8156,7 @@ void clif_messagecolor(struct block_list* bl, uint32 color, const char *msg) uint8 buf[256]; nullpo_retv(bl); + nullpo_retv(msg); if (msg_len > sizeof(buf)-12) { ShowWarning("clif_messagecolor: Truncating too long message '%s' (len=%"PRIuS").\n", msg, msg_len); @@ -8211,6 +8180,7 @@ void clif_messagecolor(struct block_list* bl, uint32 color, const char *msg) **/ void clif_refresh_storagewindow(struct map_session_data *sd) { + nullpo_retv(sd); // Notify the client that the storage is open if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) { storage->sortitem(sd->status.storage.items, ARRAYLENGTH(sd->status.storage.items)); @@ -8293,7 +8263,6 @@ void clif_refresh(struct map_session_data *sd) clif->refresh_storagewindow(sd); } - /// Updates the object's (bl) name on client. /// 0095 <id>.L <char name>.24B (ZC_ACK_REQNAME) /// 0195 <id>.L <char name>.24B <party name>.24B <guild name>.24B <position name>.24B (ZC_ACK_REQNAMEALL) @@ -8433,7 +8402,6 @@ void clif_charnameack (int fd, struct block_list *bl) } } - //Used to update when a char leaves a party/guild. [Skotlex] //Needed because when you send a 0x95 packet, the client will not remove the cached party/guild info that is not sent. void clif_charnameupdate (struct map_session_data *ssd) @@ -8488,7 +8456,6 @@ void clif_charnameupdate (struct map_session_data *ssd) clif->send(buf, packet_len(cmd), &ssd->bl, AREA); } - /// Taekwon Jump (TK_HIGHJUMP) effect (ZC_HIGHJUMP). /// 01ff <id>.L <x>.W <y>.W /// @@ -8513,13 +8480,16 @@ void clif_slide(struct block_list *bl, int x, int y) } } - /// Public chat message (ZC_NOTIFY_CHAT). lordalfa/Skotlex - used by @me as well /// 008d <packet len>.W <id>.L <message>.?B void clif_disp_overhead(struct block_list *bl, const char* mes) { unsigned char buf[256]; //This should be more than sufficient, the theoretical max is CHAT_SIZE + 8 (pads and extra inserted crap) - size_t len_mes = strlen(mes)+1; //Account for \0 + size_t len_mes; + + nullpo_retv(bl); + nullpo_retv(mes); + len_mes = strlen(mes)+1; //Account for \0 if (len_mes > sizeof(buf)-8) { ShowError("clif_disp_overhead: Message too long (length %"PRIuS")\n", len_mes); @@ -8557,7 +8527,6 @@ void clif_party_xy_remove(struct map_session_data *sd) clif->send(buf,packet_len(0x107),&sd->bl,PARTY_SAMEMAP_WOS); } - /// Displays a skill message (thanks to Rayce) (ZC_SKILLMSG). /// 0215 <msg id>.L /// msg id: @@ -8575,7 +8544,10 @@ void clif_party_xy_remove(struct map_session_data *sd) /// ? = nothing void clif_gospel_info(struct map_session_data *sd, int type) { - int fd=sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x215)); WFIFOW(fd,0)=0x215; WFIFOL(fd,2)=type; @@ -8583,7 +8555,6 @@ void clif_gospel_info(struct map_session_data *sd, int type) } - /// Multi-purpose mission information packet (ZC_STARSKILL). /// 020e <mapname>.24B <monster_id>.L <star>.B <result>.B /// result: @@ -8614,7 +8585,11 @@ void clif_gospel_info(struct map_session_data *sd, int type) /// 40 = Target HP : <monster_id used as HP> void clif_starskill(struct map_session_data* sd, const char* mapname, int monster_id, unsigned char star, unsigned char result) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + nullpo_retv(mapname); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x20e)); WFIFOW(fd,0) = 0x20e; @@ -8633,6 +8608,8 @@ void clif_feel_info(struct map_session_data* sd, unsigned char feel_level, unsig { char mapname[MAP_NAME_LENGTH_EXT]; + nullpo_retv(sd); + Assert_retv(feel_level < MAX_PC_FEELHATE); mapindex->getmapname_ext(mapindex_id2name(sd->feel_map[feel_level].index), mapname); clif->starskill(sd, mapname, 0, feel_level, type ? 1 : 0); } @@ -8668,7 +8645,6 @@ void clif_feel_hate_reset(struct map_session_data *sd) clif->starskill(sd, "", 0, 0, 30); } - /// Equip window (un)tick ack (ZC_CONFIG). /// 02d9 <type>.L <value>.L /// type: @@ -8689,7 +8665,6 @@ void clif_equiptickack(struct map_session_data* sd, int flag) WFIFOSET(fd, packet_len(0x2d9)); } - /// The player's 'view equip' state, sent during login (ZC_CONFIG_NOTIFY). /// 02da <open equip window>.B /// open equip window: @@ -8707,7 +8682,6 @@ void clif_equpcheckbox(struct map_session_data* sd) WFIFOSET(fd, packet_len(0x2da)); } - /// Sends info about a player's equipped items. /// 02d7 <packet len>.W <name>.24B <class>.W <hairstyle>.W <up-viewid>.W <mid-viewid>.W <low-viewid>.W <haircolor>.W <cloth-dye>.W <gender>.B {equip item}.26B* (ZC_EQUIPWIN_MICROSCOPE) /// 02d7 <packet len>.W <name>.24B <class>.W <hairstyle>.W <bottom-viewid>.W <mid-viewid>.W <up-viewid>.W <haircolor>.W <cloth-dye>.W <gender>.B {equip item}.28B* (ZC_EQUIPWIN_MICROSCOPE, PACKETVER >= 20100629) @@ -8725,7 +8699,7 @@ void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* ts if (tsd->status.inventory[k].nameid <= 0 || tsd->inventory_data[k] == NULL) // Item doesn't exist continue; - clif_item_equip(k+2,&viewequip_list.list[equip++],&tsd->status.inventory[k],tsd->inventory_data[k],pc->equippoint(tsd,k)); + clif->item_equip(k+2,&viewequip_list.list[equip++],&tsd->status.inventory[k],tsd->inventory_data[k],pc->equippoint(tsd,k)); } } @@ -8749,7 +8723,6 @@ void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* ts clif->send(&viewequip_list, viewequip_list.PacketLength, &sd->bl, SELF); } - /** * Displays a string from msgstringtable.txt (ZC_MSG). * @@ -8808,7 +8781,10 @@ void clif_msgtable_num(struct map_session_data *sd, unsigned short msg_id, int v */ void clif_msgtable_skill(struct map_session_data* sd, uint16 skill_id, int msg_id) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd, packet_len(0x7e6)); WFIFOW(fd,0) = 0x7e6; @@ -8827,6 +8803,12 @@ bool clif_process_message(struct map_session_data *sd, int format, char **name_, size_t namelen, messagelen; int fd = sd->fd; + nullpo_retr(false, sd); + nullpo_retr(false, name_); + nullpo_retr(false, namelen_); + nullpo_retr(false, message_); + nullpo_retr(false, messagelen_); + *name_ = NULL; *namelen_ = 0; *message_ = NULL; @@ -8914,10 +8896,17 @@ bool clif_process_message(struct map_session_data *sd, int format, char **name_, void clif_channel_msg(struct channel_data *chan, struct map_session_data *sd, char *msg) { - DBIterator *iter = db_iterator(chan->users); + DBIterator *iter; struct map_session_data *user; - unsigned short msg_len = strlen(msg) + 1; - uint32 color = channel->config->colors[chan->color]; + unsigned short msg_len; + uint32 color; + + nullpo_retv(chan); + nullpo_retv(sd); + nullpo_retv(msg); + iter = db_iterator(chan->users); + msg_len = strlen(msg) + 1; + color = channel->config->colors[chan->color]; WFIFOHEAD(sd->fd,msg_len + 12); WFIFOW(sd->fd,0) = 0x2C1; @@ -8941,11 +8930,17 @@ void clif_channel_msg(struct channel_data *chan, struct map_session_data *sd, ch void clif_channel_msg2(struct channel_data *chan, char *msg) { - DBIterator *iter = db_iterator(chan->users); + DBIterator *iter; struct map_session_data *user; unsigned char buf[210]; - unsigned short msg_len = strlen(msg) + 1; - uint32 color = channel->config->colors[chan->color]; + unsigned short msg_len; + uint32 color; + + nullpo_retv(chan); + nullpo_retv(msg); + iter = db_iterator(chan->users); + msg_len = strlen(msg) + 1; + color = channel->config->colors[chan->color]; WBUFW(buf,0) = 0x2C1; WBUFW(buf,2) = msg_len + 12; @@ -8967,7 +8962,6 @@ void clif_channel_msg2(struct channel_data *chan, char *msg) // ------------ // Parses incoming (player) connection - /// Request to connect to map-server. /// 0072 <account id>.L <char id>.L <auth code>.L <client time>.L <gender>.B (CZ_ENTER) /// 0436 <account id>.L <char id>.L <auth code>.L <client time>.L <gender>.B (CZ_ENTER2) @@ -9043,9 +9037,10 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) { chrif->authreq(sd,false); } +void clif_parse_LoadEndAck(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Notification from the client, that it has finished map loading and is about to display player's character (CZ_NOTIFY_ACTORINIT). /// 007d -void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) { +void clif_parse_LoadEndAck(int fd, struct map_session_data *sd) { bool first_time = false; if(sd->bl.prev != NULL) @@ -9361,7 +9356,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) { clif->guild_notice(sd, sd->guild); // For automatic triggering of NPCs after map loading (so you don't need to walk 1 step first) - if (map->getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNPC)) + if (map->getcell(sd->bl.m, &sd->bl, sd->bl.x, sd->bl.y, CELL_CHKNPC)) npc->touch_areanpc(sd,sd->bl.m,sd->bl.x,sd->bl.y); else npc->untouch_areanpc(sd, sd->bl.m, sd->bl.x, sd->bl.y); @@ -9401,11 +9396,13 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) { #endif } - /// Server's tick (ZC_NOTIFY_TIME). /// 007f <time>.L void clif_notify_time(struct map_session_data* sd, int64 time) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x7f)); WFIFOW(fd,0) = 0x7f; @@ -9413,7 +9410,7 @@ void clif_notify_time(struct map_session_data* sd, int64 time) { WFIFOSET(fd,packet_len(0x7f)); } - +void clif_parse_TickSend(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request for server's tick. /// 007e <client tick>.L (CZ_REQUEST_TIME) /// 0360 <client tick>.L (CZ_REQUEST_TIME2) @@ -9425,7 +9422,6 @@ void clif_parse_TickSend(int fd, struct map_session_data *sd) clif->notify_time(sd, timer->gettick()); } - /// Sends hotkey bar. /// 02b9 { <is skill>.B <id>.L <count>.W }*27 (ZC_SHORTCUT_KEY_LIST) /// 07d9 { <is skill>.B <id>.L <count>.W }*36 (ZC_SHORTCUT_KEY_LIST_V2, PACKETVER >= 20090603) @@ -9435,6 +9431,7 @@ void clif_hotkeys_send(struct map_session_data *sd) { #ifdef HOTKEY_SAVING struct packet_hotkey p; int i; + nullpo_retv(sd); p.PacketType = hotkeyType; #if PACKETVER >= 20141022 p.Rotate = sd->status.hotkey_rowshift; @@ -9448,12 +9445,14 @@ void clif_hotkeys_send(struct map_session_data *sd) { #endif } +void clif_parse_HotkeyRowShift(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_HotkeyRowShift(int fd, struct map_session_data *sd) { int cmd = RFIFOW(fd, 0); sd->status.hotkey_rowshift = RFIFOB(fd, packet_db[cmd].pos[0]); } +void clif_parse_Hotkey(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to update a position on the hotkey bar (CZ_SHORTCUT_KEY_CHANGE). /// 02ba <index>.W <is skill>.B <id>.L <count>.W void clif_parse_Hotkey(int fd, struct map_session_data *sd) { @@ -9471,13 +9470,15 @@ void clif_parse_Hotkey(int fd, struct map_session_data *sd) { #endif } - /// Displays cast-like progress bar (ZC_PROGRESS). /// 02f0 <color>.L <time>.L /* TODO ZC_PROGRESS_ACTOR <account_id>.L */ void clif_progressbar(struct map_session_data * sd, unsigned int color, unsigned int second) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x2f0)); WFIFOW(fd,0) = 0x2f0; @@ -9486,19 +9487,21 @@ void clif_progressbar(struct map_session_data * sd, unsigned int color, unsigned WFIFOSET(fd,packet_len(0x2f0)); } - /// Removes an ongoing progress bar (ZC_PROGRESS_CANCEL). /// 02f2 void clif_progressbar_abort(struct map_session_data * sd) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x2f2)); WFIFOW(fd,0) = 0x2f2; WFIFOSET(fd,packet_len(0x2f2)); } - +void clif_parse_progressbar(int fd, struct map_session_data * sd) __attribute__((nonnull (2))); /// Notification from the client, that the progress bar has reached 100% (CZ_PROGRESS). /// 02f1 void clif_parse_progressbar(int fd, struct map_session_data * sd) @@ -9512,7 +9515,7 @@ void clif_parse_progressbar(int fd, struct map_session_data * sd) npc->scriptcont(sd, npc_id, false); } - +void clif_parse_WalkToXY(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to walk to a certain position on the current map. /// 0085 <dest>.3B (CZ_REQUEST_MOVE) /// 035f <dest>.3B (CZ_REQUEST_MOVE2) @@ -9547,7 +9550,6 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) unit->walktoxy(&sd->bl, x, y, 4); } - /// Notification about the result of a disconnect request (ZC_ACK_REQ_DISCONNECT). /// 018b <result>.W /// result: @@ -9556,7 +9558,10 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) /// ? = ignored void clif_disconnect_ack(struct map_session_data* sd, short result) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x18b)); WFIFOW(fd,0) = 0x18b; @@ -9564,7 +9569,7 @@ void clif_disconnect_ack(struct map_session_data* sd, short result) WFIFOSET(fd,packet_len(0x18b)); } - +void clif_parse_QuitGame(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to disconnect from server (CZ_REQ_DISCONNECT). /// 018a <type>.W /// type: @@ -9583,7 +9588,7 @@ void clif_parse_QuitGame(int fd, struct map_session_data *sd) } } - +void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Requesting unit's name. /// 0094 <id>.L (CZ_REQNAME) /// 0368 <id>.L (CZ_REQNAME2) @@ -9631,6 +9636,7 @@ int clif_undisguise_timer(int tid, int64 tick, int id, intptr_t data) { return 0; } +void clif_parse_GlobalMessage(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Validates and processes global messages /// 008c <packet len>.W <text>.?B (<name> : <message>) 00 (CZ_REQUEST_CHAT) /// There are various variants of this packet. @@ -9762,17 +9768,17 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data* sd) WFIFOW(fd,0) = 0x8e; } WFIFOSET(fd, WFIFOW(fd,2)); - + // Chat logging type 'O' / Global Chat logs->chat(LOG_CHAT_GLOBAL, 0, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, message); - + #ifdef PCRE_SUPPORT // trigger listening npcs map->foreachinrange(npc_chat->sub, &sd->bl, AREA_SIZE, BL_NPC, text, textlen, &sd->bl); #endif } - +void clif_parse_MapMove(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /mm /mapmove (as @rura GM command) (CZ_MOVETO_MAP). /// Request to warp to a map on given coordinates. /// 0140 <map name>.16B <x>.W <y>.W @@ -9787,7 +9793,6 @@ void clif_parse_MapMove(int fd, struct map_session_data *sd) atcommand->exec(fd, sd, command, true); } - /// Updates body and head direction of an object (ZC_CHANGE_DIRECTION). /// 009c <id>.L <head dir>.W <dir>.B /// head dir: @@ -9807,6 +9812,7 @@ void clif_changed_dir(struct block_list *bl, enum send_target target) { unsigned char buf[64]; + nullpo_retv(bl); WBUFW(buf,0) = 0x9c; WBUFL(buf,2) = bl->id; WBUFW(buf,6) = bl->type==BL_PC?((TBL_PC*)bl)->head_dir:0; @@ -9821,7 +9827,7 @@ void clif_changed_dir(struct block_list *bl, enum send_target target) } } - +void clif_parse_ChangeDir(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to change own body and head direction. /// 009b <head dir>.W <dir>.B (CZ_CHANGE_DIRECTION) /// 0361 <head dir>.W <dir>.B (CZ_CHANGE_DIRECTION2) @@ -9837,7 +9843,7 @@ void clif_parse_ChangeDir(int fd, struct map_session_data *sd) clif->changed_dir(&sd->bl, AREA_WOS); } - +void clif_parse_Emotion(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to show an emotion (CZ_REQ_EMOTION). /// 00bf <type>.B /// type: @@ -9871,11 +9877,13 @@ void clif_parse_Emotion(int fd, struct map_session_data *sd) clif->skill_fail(sd, 1, USESKILL_FAIL_LEVEL, 1); } - /// Amount of currently online players, reply to /w /who (ZC_USER_COUNT). /// 00c2 <count>.L void clif_user_count(struct map_session_data* sd, int count) { - int fd = sd->fd; + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0xc2)); WFIFOW(fd,0) = 0xc2; @@ -9883,7 +9891,7 @@ void clif_user_count(struct map_session_data* sd, int count) { WFIFOSET(fd,packet_len(0xc2)); } - +void clif_parse_HowManyConnections(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /w /who (CZ_REQ_USER_COUNT). /// Request to display amount of currently connected players. /// 00c1 @@ -9891,10 +9899,10 @@ void clif_parse_HowManyConnections(int fd, struct map_session_data *sd) { clif->user_count(sd, map->getusers()); } - void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, int64 tick) { struct block_list *target = NULL; - + + nullpo_retv(sd); if (pc_isdead(sd)) { clif->clearunit_area(&sd->bl, CLR_DEAD); return; @@ -9920,12 +9928,11 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, switch(action_type) { case 0x00: // once attack case 0x07: // continuous attack - if( (target = map->id2bl(target_id)) && target->type == BL_NPC ) { npc->click(sd,(TBL_NPC*)target); return; } - + if( pc_cant_act(sd) || pc_issit(sd) || sd->sc.option&OPTION_HIDE ) return; @@ -9990,6 +9997,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, } } +void clif_parse_ActionRequest(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request for an action. /// 0089 <target id>.L <action>.B (CZ_REQUEST_ACT) /// 0437 <target id>.L <action>.B (CZ_REQUEST_ACT2) @@ -10010,7 +10018,7 @@ void clif_parse_ActionRequest(int fd, struct map_session_data *sd) ); } - +void clif_parse_Restart(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Response to the death/system menu (CZ_RESTART). /// 00b2 <type>.B /// type: @@ -10036,7 +10044,7 @@ void clif_parse_Restart(int fd, struct map_session_data *sd) { } } - +void clif_parse_WisMessage(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Validates and processes whispered messages (CZ_WHISPER). /// 0096 <packet len>.W <nick>.24B <message>.?B void clif_parse_WisMessage(int fd, struct map_session_data* sd) @@ -10116,7 +10124,7 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd) if (chan) { int k; ARR_FIND(0, sd->channel_count, k, sd->channels[k] == chan); - if (k < sd->channel_count || channel->join(chan, sd, NULL, true) == HCS_STATUS_OK) { + if (k < sd->channel_count || channel->join(chan, sd, "", true) == HCS_STATUS_OK) { channel->send(chan,sd,message); } else { clif->message(fd, msg_fd(fd,1402)); @@ -10171,7 +10179,7 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd) clif->wis_message(dstsd->fd, sd->status.name, message, messagelen); } - +void clif_parse_Broadcast(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// /b /nb (CZ_BROADCAST). /// Request to broadcast a message on whole server. /// 0099 <packet len>.W <text>.?B 00 @@ -10187,7 +10195,7 @@ void clif_parse_Broadcast(int fd, struct map_session_data* sd) { atcommand->exec(fd, sd, command, true); } - +void clif_parse_TakeItem(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to pick up an item. /// 009f <id>.L (CZ_ITEM_PICKUP) /// 0362 <id>.L (CZ_ITEM_PICKUP2) @@ -10231,7 +10239,7 @@ void clif_parse_TakeItem(int fd, struct map_session_data *sd) { clif->additem(sd,0,0,6); } - +void clif_parse_DropItem(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to drop an item. /// 00a2 <index>.W <amount>.W (CZ_ITEM_THROW) /// 0363 <index>.W <amount>.W (CZ_ITEM_THROW2) @@ -10265,10 +10273,10 @@ void clif_parse_DropItem(int fd, struct map_session_data *sd) } //Because the client does not like being ignored. - clif->dropitem(sd, item_index,0); + clif->dropitem(sd, item_index, 0); } - +void clif_parse_UseItem(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to use an item. /// 00a7 <index>.W <account id>.L (CZ_USE_ITEM) /// 0439 <index>.W <account id>.L (CZ_USE_ITEM2) @@ -10290,13 +10298,13 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd) sd->idletime = sockt->last_tick; n = RFIFOW(fd,packet_db[RFIFOW(fd,0)].pos[0])-2; - if(n <0 || n >= MAX_INVENTORY) + if (n < 0 || n >= MAX_INVENTORY) return; if (!pc->useitem(sd,n)) clif->useitemack(sd,n,0,false); //Send an empty ack packet or the client gets stuck. } - +void clif_parse_EquipItem(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to equip an item (CZ_REQ_WEAR_EQUIP). /// 00a9 <index>.W <position>.W /// 0998 <index>.W <position>.L @@ -10343,6 +10351,7 @@ void clif_parse_EquipItem(int fd,struct map_session_data *sd) { pc->equipitem(sd,p->index,p->wearLocation); } +void clif_parse_UnequipItem(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to take off an equip (CZ_REQ_TAKEOFF_EQUIP). /// 00ab <index>.W void clif_parse_UnequipItem(int fd,struct map_session_data *sd) @@ -10370,7 +10379,7 @@ void clif_parse_UnequipItem(int fd,struct map_session_data *sd) pc->unequipitem(sd,index, PCUNEQUIPITEM_RECALC); } - +void clif_parse_NpcClicked(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to start a conversation with an NPC (CZ_CONTACTNPC). /// 0090 <id>.L <type>.B /// type: @@ -10410,20 +10419,19 @@ void clif_parse_NpcClicked(int fd,struct map_session_data *sd) } } - +void clif_parse_NpcBuySellSelected(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Selection between buy/sell was made (CZ_ACK_SELECT_DEALTYPE). /// 00c5 <id>.L <type>.B /// type: /// 0 = buy /// 1 = sell -void clif_parse_NpcBuySellSelected(int fd,struct map_session_data *sd) +void clif_parse_NpcBuySellSelected(int fd, struct map_session_data *sd) { if (sd->state.trading) return; - npc->buysellsel(sd,RFIFOL(fd,2),RFIFOB(fd,6)); + npc->buysellsel(sd, RFIFOL(fd,2), RFIFOB(fd,6)); } - /// Notification about the result of a purchase attempt from an NPC shop (ZC_PC_PURCHASE_RESULT). /// 00ca <result>.B /// result: @@ -10432,15 +10440,17 @@ void clif_parse_NpcBuySellSelected(int fd,struct map_session_data *sd) /// 2 = "You are over your Weight Limit." /// 3 = "Out of the maximum capacity, you have too many items." void clif_npc_buy_result(struct map_session_data* sd, unsigned char result) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0xca)); WFIFOW(fd,0) = 0xca; WFIFOB(fd,2) = result; WFIFOSET(fd,packet_len(0xca)); } - +void clif_parse_NpcBuyListSend(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to buy chosen items from npc shop (CZ_PC_PURCHASE_ITEMLIST). /// 00c8 <packet len>.W { <amount>.W <name id>.W }* void clif_parse_NpcBuyListSend(int fd, struct map_session_data* sd) @@ -10459,22 +10469,23 @@ void clif_parse_NpcBuyListSend(int fd, struct map_session_data* sd) clif->npc_buy_result(sd, result); } - /// Notification about the result of a sell attempt to an NPC shop (ZC_PC_SELL_RESULT). /// 00cb <result>.B /// result: /// 0 = "The deal has successfully completed." /// 1 = "The deal has failed." void clif_npc_sell_result(struct map_session_data* sd, unsigned char result) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0xcb)); WFIFOW(fd,0) = 0xcb; WFIFOB(fd,2) = result; WFIFOSET(fd,packet_len(0xcb)); } - +void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to sell chosen items to npc shop (CZ_PC_SELL_ITEMLIST). /// 00c9 <packet len>.W { <index>.W <amount>.W }* void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd) @@ -10495,7 +10506,7 @@ void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd) clif->npc_sell_result(sd, fail); } - +void clif_parse_CreateChatRoom(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Chatroom creation request (CZ_CREATE_CHATROOM). /// 00d5 <packet len>.W <limit>.W <type>.B <passwd>.8B <title>.?B /// type: @@ -10535,7 +10546,7 @@ void clif_parse_CreateChatRoom(int fd, struct map_session_data* sd) chat->create_pc_chat(sd, s_title, s_password, limit, pub); } - +void clif_parse_ChatAddMember(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Chatroom join request (CZ_REQ_ENTER_ROOM). /// 00d9 <chat ID>.L <passwd>.8B void clif_parse_ChatAddMember(int fd, struct map_session_data* sd) @@ -10546,7 +10557,7 @@ void clif_parse_ChatAddMember(int fd, struct map_session_data* sd) chat->join(sd,chatid,password); } - +void clif_parse_ChatRoomStatusChange(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Chatroom properties adjustment request (CZ_CHANGE_CHATROOM). /// 00de <packet len>.W <limit>.W <type>.B <passwd>.8B <title>.?B /// type: @@ -10571,7 +10582,7 @@ void clif_parse_ChatRoomStatusChange(int fd, struct map_session_data* sd) chat->change_status(sd, s_title, s_password, limit, pub); } - +void clif_parse_ChangeChatOwner(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to change the chat room ownership (CZ_REQ_ROLE_CHANGE). /// 00e0 <role>.L <nick>.24B /// role: @@ -10582,7 +10593,7 @@ void clif_parse_ChangeChatOwner(int fd, struct map_session_data* sd) chat->change_owner(sd,(char*)RFIFOP(fd,6)); } - +void clif_parse_KickFromChat(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to expel a player from chat room (CZ_REQ_EXPEL_MEMBER). /// 00e2 <name>.24B void clif_parse_KickFromChat(int fd,struct map_session_data *sd) @@ -10590,7 +10601,7 @@ void clif_parse_KickFromChat(int fd,struct map_session_data *sd) chat->kick(sd,(char*)RFIFOP(fd,2)); } - +void clif_parse_ChatLeave(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to leave the current chatroom (CZ_EXIT_ROOM). /// 00e3 void clif_parse_ChatLeave(int fd, struct map_session_data* sd) @@ -10598,13 +10609,13 @@ void clif_parse_ChatLeave(int fd, struct map_session_data* sd) chat->leave(sd, false); } - //Handles notifying asker and rejecter of what has just occurred. //Type is used to determine the correct msg_txt to use: //0: void clif_noask_sub(struct map_session_data *src, struct map_session_data *target, int type) { const char* msg; char output[256]; + nullpo_retv(src); // Your request has been rejected by autoreject option. msg = msg_sd(src,392); clif_disp_onlyself(src, msg, strlen(msg)); @@ -10613,7 +10624,7 @@ void clif_noask_sub(struct map_session_data *src, struct map_session_data *targe clif_disp_onlyself(target, output, strlen(output)); } - +void clif_parse_TradeRequest(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to begin a trade (CZ_REQ_EXCHANGE_ITEM). /// 00e4 <account id>.L void clif_parse_TradeRequest(int fd,struct map_session_data *sd) { @@ -10638,7 +10649,7 @@ void clif_parse_TradeRequest(int fd,struct map_session_data *sd) { trade->request(sd,t_sd); } - +void clif_parse_TradeAck(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to a trade request (CZ_ACK_EXCHANGE_ITEM). /// 00e6 <result>.B /// result: @@ -10649,7 +10660,7 @@ void clif_parse_TradeAck(int fd,struct map_session_data *sd) trade->ack(sd,RFIFOB(fd,2)); } - +void clif_parse_TradeAddItem(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to add an item to current trade (CZ_ADD_EXCHANGE_ITEM). /// 00e8 <index>.W <amount>.L void clif_parse_TradeAddItem(int fd,struct map_session_data *sd) @@ -10663,7 +10674,7 @@ void clif_parse_TradeAddItem(int fd,struct map_session_data *sd) trade->additem(sd, index, (short)amount); } - +void clif_parse_TradeOk(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to lock items in current trade (CZ_CONCLUDE_EXCHANGE_ITEM). /// 00eb void clif_parse_TradeOk(int fd,struct map_session_data *sd) @@ -10671,7 +10682,7 @@ void clif_parse_TradeOk(int fd,struct map_session_data *sd) trade->ok(sd); } - +void clif_parse_TradeCancel(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to cancel current trade (CZ_CANCEL_EXCHANGE_ITEM). /// 00ed void clif_parse_TradeCancel(int fd,struct map_session_data *sd) @@ -10679,7 +10690,7 @@ void clif_parse_TradeCancel(int fd,struct map_session_data *sd) trade->cancel(sd); } - +void clif_parse_TradeCommit(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to commit current trade (CZ_EXEC_EXCHANGE_ITEM). /// 00ef void clif_parse_TradeCommit(int fd,struct map_session_data *sd) @@ -10687,7 +10698,7 @@ void clif_parse_TradeCommit(int fd,struct map_session_data *sd) trade->commit(sd); } - +void clif_parse_StopAttack(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to stop chasing/attacking an unit (CZ_CANCEL_LOCKON). /// 0118 void clif_parse_StopAttack(int fd,struct map_session_data *sd) @@ -10695,7 +10706,7 @@ void clif_parse_StopAttack(int fd,struct map_session_data *sd) pc_stop_attack(sd); } - +void clif_parse_PutItemToCart(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to move an item from inventory to cart (CZ_MOVE_ITEM_FROM_BODY_TO_CART). /// 0126 <index>.W <amount>.L void clif_parse_PutItemToCart(int fd,struct map_session_data *sd) { @@ -10710,7 +10721,7 @@ void clif_parse_PutItemToCart(int fd,struct map_session_data *sd) { } } - +void clif_parse_GetItemFromCart(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to move an item from cart to inventory (CZ_MOVE_ITEM_FROM_CART_TO_BODY). /// 0127 <index>.W <amount>.L void clif_parse_GetItemFromCart(int fd,struct map_session_data *sd) @@ -10720,7 +10731,7 @@ void clif_parse_GetItemFromCart(int fd,struct map_session_data *sd) pc->getitemfromcart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4)); } - +void clif_parse_RemoveOption(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to remove cart/falcon/peco/dragon (CZ_REQ_CARTOFF). /// 012a void clif_parse_RemoveOption(int fd,struct map_session_data *sd) @@ -10738,15 +10749,13 @@ void clif_parse_RemoveOption(int fd,struct map_session_data *sd) } } - +void clif_parse_ChangeCart(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to change cart's visual look (CZ_REQ_CHANGECART). /// 01af <num>.W void clif_parse_ChangeCart(int fd,struct map_session_data *sd) {// TODO: State tracking? int type; - nullpo_retv(sd); - if( pc->checkskill(sd, MC_CHANGECART) < 1 ) return; @@ -10778,7 +10787,7 @@ void clif_parse_ChangeCart(int fd,struct map_session_data *sd) pc->setcart(sd,type); } - +void clif_parse_StatusUp(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to increase status (CZ_STATUS_CHANGE). /// 00bb <status id>.W <amount>.B /// status id: @@ -10798,7 +10807,7 @@ void clif_parse_StatusUp(int fd,struct map_session_data *sd) { pc->statusup(sd, RFIFOW(fd,2), increase_amount); } - +void clif_parse_SkillUp(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to increase level of a skill (CZ_UPGRADE_SKILLLEVEL). /// 0112 <skill id>.W void clif_parse_SkillUp(int fd,struct map_session_data *sd) @@ -10809,6 +10818,7 @@ void clif_parse_SkillUp(int fd,struct map_session_data *sd) void clif_parse_UseSkillToId_homun(struct homun_data *hd, struct map_session_data *sd, int64 tick, uint16 skill_id, uint16 skill_lv, int target_id) { int lv; + nullpo_retv(sd); if( !hd ) return; if (skill->not_ok_hom(skill_id, hd)){ @@ -10837,6 +10847,7 @@ void clif_parse_UseSkillToId_homun(struct homun_data *hd, struct map_session_dat void clif_parse_UseSkillToPos_homun(struct homun_data *hd, struct map_session_data *sd, int64 tick, uint16 skill_id, uint16 skill_lv, short x, short y, int skillmoreinfo) { int lv; + nullpo_retv(sd); if( !hd ) return; if (skill->not_ok_hom(skill_id, hd)){ @@ -10865,6 +10876,7 @@ void clif_parse_UseSkillToPos_homun(struct homun_data *hd, struct map_session_da void clif_parse_UseSkillToId_mercenary(struct mercenary_data *md, struct map_session_data *sd, int64 tick, uint16 skill_id, uint16 skill_lv, int target_id) { int lv; + nullpo_retv(sd); if( !md ) return; if( skill->not_ok_mercenary(skill_id, md) ) @@ -10885,6 +10897,7 @@ void clif_parse_UseSkillToId_mercenary(struct mercenary_data *md, struct map_ses void clif_parse_UseSkillToPos_mercenary(struct mercenary_data *md, struct map_session_data *sd, int64 tick, uint16 skill_id, uint16 skill_lv, short x, short y, int skillmoreinfo) { int lv; + nullpo_retv(sd); if( !md ) return; if( skill->not_ok_mercenary(skill_id, md) ) @@ -10905,7 +10918,7 @@ void clif_parse_UseSkillToPos_mercenary(struct mercenary_data *md, struct map_se unit->skilluse_pos(&md->bl, x, y, skill_id, skill_lv); } - +void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to use a targeted skill. /// 0113 <skill lv>.W <skill id>.W <target id>.L (CZ_USE_SKILL) /// 0438 <skill lv>.W <skill id>.W <target id>.L (CZ_USE_SKILL2) @@ -11023,6 +11036,7 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uint16 ski { int64 tick = timer->gettick(); + nullpo_retv(sd); if( !(skill->get_inf(skill_id)&INF_GROUND_SKILL) ) return; //Using a target skill on the ground? WRONG. @@ -11035,7 +11049,7 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uint16 ski clif->pUseSkillToPos_mercenary(sd->md, sd, tick, skill_id, skill_lv, x, y, skillmoreinfo); return; } - + #ifdef RENEWAL if( sd->state.workinprogress&1 ){ clif->msgtable(sd, MSG_NPC_WORK_IN_PROGRESS); // TODO look for the client date that has this message. @@ -11098,7 +11112,7 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uint16 ski } } - +void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to use a ground skill. /// 0116 <skill lv>.W <skill id>.W <x>.W <y>.W (CZ_USE_SKILL_TOGROUND) /// 0366 <skill lv>.W <skill id>.W <x>.W <y>.W (CZ_USE_SKILL_TOGROUND2) @@ -11119,7 +11133,7 @@ void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) ); } - +void clif_parse_UseSkillToPosMoreInfo(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to use a ground skill with text. /// 0190 <skill lv>.W <skill id>.W <x>.W <y>.W <contents>.80B (CZ_USE_SKILL_TOGROUND_WITHTALKBOX) /// 0367 <skill lv>.W <skill id>.W <x>.W <y>.W <contents>.80B (CZ_USE_SKILL_TOGROUND_WITHTALKBOX2) @@ -11140,7 +11154,7 @@ void clif_parse_UseSkillToPosMoreInfo(int fd, struct map_session_data *sd) ); } - +void clif_parse_UseSkillMap(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Answer to map selection dialog (CZ_SELECT_WARPPOINT). /// 011b <skill id>.W <map name>.16B void clif_parse_UseSkillMap(int fd, struct map_session_data* sd) @@ -11164,7 +11178,7 @@ void clif_parse_UseSkillMap(int fd, struct map_session_data* sd) skill->castend_map(sd,skill_id,map_name); } - +void clif_parse_RequestMemo(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to set a memo on current map (CZ_REMEMBER_WARPPOINT). /// 011d void clif_parse_RequestMemo(int fd,struct map_session_data *sd) @@ -11173,7 +11187,7 @@ void clif_parse_RequestMemo(int fd,struct map_session_data *sd) pc->memo(sd,-1); } - +void clif_parse_ProduceMix(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to pharmacy item selection dialog (CZ_REQMAKINGITEM). /// 018e <name id>.W { <material id>.W }*3 void clif_parse_ProduceMix(int fd,struct map_session_data *sd) @@ -11198,7 +11212,7 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd) clif_menuskill_clear(sd); } - +void clif_parse_Cooking(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to mixing item selection dialog (CZ_REQ_MAKINGITEM). /// 025b <mk type>.W <name id>.W /// mk type: @@ -11226,7 +11240,7 @@ void clif_parse_Cooking(int fd,struct map_session_data *sd) { clif_menuskill_clear(sd); } - +void clif_parse_RepairItem(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to repair weapon item selection dialog (CZ_REQ_ITEMREPAIR). /// 01fd <index>.W <name id>.W <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W void clif_parse_RepairItem(int fd, struct map_session_data *sd) @@ -11243,7 +11257,7 @@ void clif_parse_RepairItem(int fd, struct map_session_data *sd) clif_menuskill_clear(sd); } - +void clif_parse_WeaponRefine(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to refine weapon item selection dialog (CZ_REQ_WEAPONREFINE). /// 0222 <index>.L void clif_parse_WeaponRefine(int fd, struct map_session_data *sd) @@ -11265,7 +11279,7 @@ void clif_parse_WeaponRefine(int fd, struct map_session_data *sd) clif_menuskill_clear(sd); } - +void clif_parse_NpcSelectMenu(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to script menu dialog (CZ_CHOOSE_MENU). /// 00b8 <npc id>.L <choice>.B /// choice: @@ -11295,7 +11309,7 @@ void clif_parse_NpcSelectMenu(int fd,struct map_session_data *sd) npc->scriptcont(sd,npc_id, false); } - +void clif_parse_NpcNextClicked(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// NPC dialog 'next' click (CZ_REQ_NEXT_SCRIPT). /// 00b9 <npc id>.L void clif_parse_NpcNextClicked(int fd,struct map_session_data *sd) @@ -11303,7 +11317,7 @@ void clif_parse_NpcNextClicked(int fd,struct map_session_data *sd) npc->scriptcont(sd,RFIFOL(fd,2), false); } - +void clif_parse_NpcAmountInput(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// NPC numeric input dialog value (CZ_INPUT_EDITDLG). /// 0143 <npc id>.L <value>.L void clif_parse_NpcAmountInput(int fd,struct map_session_data *sd) @@ -11311,11 +11325,14 @@ void clif_parse_NpcAmountInput(int fd,struct map_session_data *sd) int npcid = RFIFOL(fd,2); int amount = (int)RFIFOL(fd,6); - sd->npc_amount = amount; + if (amount >= 0) + sd->npc_amount = amount; + else + sd->npc_amount = 0; npc->scriptcont(sd, npcid, false); } - +void clif_parse_NpcStringInput(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// NPC text input dialog value (CZ_INPUT_EDITDLGSTR). /// 01d5 <packet len>.W <npc id>.L <string>.?B void clif_parse_NpcStringInput(int fd, struct map_session_data* sd) @@ -11331,7 +11348,7 @@ void clif_parse_NpcStringInput(int fd, struct map_session_data* sd) npc->scriptcont(sd, npcid, false); } - +void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// NPC dialog 'close' click (CZ_CLOSE_DIALOG). /// 0146 <npc id>.L void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd) @@ -11342,7 +11359,7 @@ void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd) npc->scriptcont(sd, RFIFOL(fd,2), true); } - +void clif_parse_ItemIdentify(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to identify item selection dialog (CZ_REQ_ITEMIDENTIFY). /// 0178 <index>.W /// index: @@ -11363,7 +11380,7 @@ void clif_parse_ItemIdentify(int fd,struct map_session_data *sd) clif_menuskill_clear(sd); } - +void clif_parse_SelectArrow(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to arrow crafting item selection dialog (CZ_REQ_MAKINGARROW). /// 01ae <name id>.W void clif_parse_SelectArrow(int fd,struct map_session_data *sd) @@ -11395,7 +11412,7 @@ void clif_parse_SelectArrow(int fd,struct map_session_data *sd) clif_menuskill_clear(sd); } - +void clif_parse_AutoSpell(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to SA_AUTOSPELL skill selection dialog (CZ_SELECTAUTOSPELL). /// 01ce <skill id>.L void clif_parse_AutoSpell(int fd,struct map_session_data *sd) @@ -11414,7 +11431,7 @@ void clif_parse_AutoSpell(int fd,struct map_session_data *sd) clif_menuskill_clear(sd); } - +void clif_parse_UseCard(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to display item carding/composition list (CZ_REQ_ITEMCOMPOSITION_LIST). /// 017a <card index>.W void clif_parse_UseCard(int fd,struct map_session_data *sd) @@ -11422,7 +11439,7 @@ void clif_parse_UseCard(int fd,struct map_session_data *sd) clif->use_card(sd,RFIFOW(fd,2)-2); } - +void clif_parse_InsertCard(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to carding/composing item selection dialog (CZ_REQ_ITEMCOMPOSITION). /// 017c <card index>.W <equip index>.W void clif_parse_InsertCard(int fd,struct map_session_data *sd) @@ -11430,7 +11447,7 @@ void clif_parse_InsertCard(int fd,struct map_session_data *sd) pc->insert_card(sd,RFIFOW(fd,2)-2,RFIFOW(fd,4)-2); } - +void clif_parse_SolveCharName(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request of character's name by char ID. /// 0193 <char id>.L (CZ_REQNAME_BYGID) /// 0369 <char id>.L (CZ_REQNAME_BYGID2) @@ -11442,7 +11459,7 @@ void clif_parse_SolveCharName(int fd, struct map_session_data *sd) { map->reqnickdb(sd, charid); } - +void clif_parse_ResetChar(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /resetskill /resetstate (CZ_RESET). /// Request to reset stats or skills. /// 0197 <type>.W @@ -11460,7 +11477,7 @@ void clif_parse_ResetChar(int fd, struct map_session_data *sd) { atcommand->exec(fd, sd, cmd, true); } - +void clif_parse_LocalBroadcast(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// /lb /nlb (CZ_LOCALBROADCAST). /// Request to broadcast a message on current map. /// 019c <packet len>.W <text>.?B @@ -11477,7 +11494,7 @@ void clif_parse_LocalBroadcast(int fd, struct map_session_data* sd) atcommand->exec(fd, sd, command, true); } - +void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to move an item from inventory to storage. /// 00f3 <index>.W <amount>.L (CZ_MOVE_ITEM_FROM_BODY_TO_STORE) /// 0364 <index>.W <amount>.L (CZ_MOVE_ITEM_FROM_BODY_TO_STORE2) @@ -11500,7 +11517,7 @@ void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) gstorage->add(sd, item_index, item_amount); } - +void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to move an item from storage to inventory. /// 00f5 <index>.W <amount>.L (CZ_MOVE_ITEM_FROM_STORE_TO_BODY) /// 0365 <index>.W <amount>.L (CZ_MOVE_ITEM_FROM_STORE_TO_BODY2) @@ -11518,7 +11535,7 @@ void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd) gstorage->get(sd, item_index, item_amount); } - +void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to move an item from cart to storage (CZ_MOVE_ITEM_FROM_CART_TO_STORE). /// 0129 <index>.W <amount>.L void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) @@ -11534,7 +11551,7 @@ void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) gstorage->addfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4)); } - +void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to move an item from storage to cart (CZ_MOVE_ITEM_FROM_STORE_TO_CART). /// 0128 <index>.W <amount>.L void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) @@ -11550,7 +11567,7 @@ void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) gstorage->gettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4)); } - +void clif_parse_CloseKafra(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to close storage (CZ_CLOSE_STORE). /// 00f7 void clif_parse_CloseKafra(int fd, struct map_session_data *sd) @@ -11561,7 +11578,6 @@ void clif_parse_CloseKafra(int fd, struct map_session_data *sd) gstorage->close(sd); } - /// Displays kafra storage password dialog (ZC_REQ_STORE_PASSWORD). /// 023a <info>.W /// info: @@ -11572,15 +11588,17 @@ void clif_parse_CloseKafra(int fd, struct map_session_data *sd) /// NOTE: This packet is only available on certain non-kRO clients. void clif_storagepassword(struct map_session_data* sd, short info) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x23a)); WFIFOW(fd,0) = 0x23a; WFIFOW(fd,2) = info; WFIFOSET(fd,packet_len(0x23a)); } - +void clif_parse_StoragePassword(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to the kafra storage password dialog (CZ_ACK_STORE_PASSWORD). /// 023b <type>.W <password>.16B <new password>.16B /// type: @@ -11592,7 +11610,6 @@ void clif_parse_StoragePassword(int fd, struct map_session_data *sd) //TODO } - /// Result of kafra storage password validation (ZC_RESULT_STORE_PASSWORD). /// 023c <result>.W <error count>.W /// result: @@ -11605,8 +11622,10 @@ void clif_parse_StoragePassword(int fd, struct map_session_data *sd) /// NOTE: This packet is only available on certain non-kRO clients. void clif_storagepassword_result(struct map_session_data* sd, short result, short error_count) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x23c)); WFIFOW(fd,0) = 0x23c; WFIFOW(fd,2) = result; @@ -11614,7 +11633,7 @@ void clif_storagepassword_result(struct map_session_data* sd, short result, shor WFIFOSET(fd,packet_len(0x23c)); } - +void clif_parse_CreateParty(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Party creation request /// 00f9 <party name>.24B (CZ_MAKE_GROUP) /// 01e8 <party name>.24B <item pickup rule>.B <item share rule>.B (CZ_MAKE_GROUP2) @@ -11635,6 +11654,7 @@ void clif_parse_CreateParty(int fd, struct map_session_data *sd) { party->create(sd,name,0,0); } +void clif_parse_CreateParty2(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_CreateParty2(int fd, struct map_session_data *sd) { char* name = (char*)RFIFOP(fd,2); int item1 = RFIFOB(fd,26); @@ -11654,7 +11674,7 @@ void clif_parse_CreateParty2(int fd, struct map_session_data *sd) { party->create(sd,name,item1,item2); } - +void clif_parse_PartyInvite(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Party invitation request /// 00fc <account id>.L (CZ_REQ_JOIN_GROUP) /// 02c4 <char name>.24B (CZ_PARTY_JOIN_REQ) @@ -11677,6 +11697,7 @@ void clif_parse_PartyInvite(int fd, struct map_session_data *sd) { party->invite(sd, t_sd); } +void clif_parse_PartyInvite2(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_PartyInvite2(int fd, struct map_session_data *sd) { struct map_session_data *t_sd; char *name = (char*)RFIFOP(fd,2); @@ -11698,7 +11719,7 @@ void clif_parse_PartyInvite2(int fd, struct map_session_data *sd) { party->invite(sd, t_sd); } - +void clif_parse_ReplyPartyInvite(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Party invitation reply /// 00ff <party id>.L <flag>.L (CZ_JOIN_GROUP) /// 02c7 <party id>.L <flag>.B (CZ_PARTY_JOIN_REQ_ACK) @@ -11710,12 +11731,13 @@ void clif_parse_ReplyPartyInvite(int fd,struct map_session_data *sd) party->reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6)); } +void clif_parse_ReplyPartyInvite2(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_ReplyPartyInvite2(int fd,struct map_session_data *sd) { party->reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6)); } - +void clif_parse_LeaveParty(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to leave party (CZ_REQ_LEAVE_GROUP). /// 0100 void clif_parse_LeaveParty(int fd, struct map_session_data *sd) { @@ -11727,7 +11749,7 @@ void clif_parse_LeaveParty(int fd, struct map_session_data *sd) { party->leave(sd); } - +void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to expel a party member (CZ_REQ_EXPEL_GROUP_MEMBER). /// 0103 <account id>.L <char name>.24B void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) { @@ -11739,7 +11761,7 @@ void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) { party->removemember(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6)); } - +void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to change party options. /// 0102 <exp share rule>.L (CZ_CHANGE_GROUPEXPOPTION) /// 07d7 <exp share rule>.L <item pickup rule>.B <item share rule>.B (CZ_GROUPINFO_CHANGE_V2) @@ -11770,7 +11792,7 @@ void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) #endif } - +void clif_parse_PartyMessage(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Validates and processes party messages (CZ_REQUEST_CHAT_PARTY). /// 0108 <packet len>.W <text>.?B (<name> : <message>) 00 void clif_parse_PartyMessage(int fd, struct map_session_data* sd) @@ -11803,13 +11825,14 @@ void clif_parse_PartyMessage(int fd, struct map_session_data* sd) party->send_message(sd, text, textlen); } - +void clif_parse_PartyChangeLeader(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Changes Party Leader (CZ_CHANGE_GROUP_MASTER). /// 07da <account id>.L void clif_parse_PartyChangeLeader(int fd, struct map_session_data* sd) { party->changeleader(sd, map->id2sd(RFIFOL(fd,2))); } - + +void clif_parse_PartyBookingRegisterReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Party Booking in KRO [Spiria] /// @@ -11832,7 +11855,6 @@ void clif_parse_PartyBookingRegisterReq(int fd, struct map_session_data* sd) #endif } - /// Result of request to register a party booking advertisement (ZC_PARTY_BOOKING_ACK_REGISTER). /// 0803 <result>.W /// result: @@ -11842,8 +11864,10 @@ void clif_parse_PartyBookingRegisterReq(int fd, struct map_session_data* sd) void clif_PartyBookingRegisterAck(struct map_session_data *sd, int flag) { #ifndef PARTY_RECRUIT - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x803)); WFIFOW(fd,0) = 0x803; WFIFOW(fd,2) = flag; @@ -11853,7 +11877,7 @@ void clif_PartyBookingRegisterAck(struct map_session_data *sd, int flag) #endif } - +void clif_parse_PartyBookingSearchReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to search for party booking advertisement (CZ_PARTY_BOOKING_REQ_SEARCH). /// 0804 <level>.W <map id>.W <job>.W <last index>.L <result count>.W void clif_parse_PartyBookingSearchReq(int fd, struct map_session_data* sd) @@ -11871,7 +11895,6 @@ void clif_parse_PartyBookingSearchReq(int fd, struct map_session_data* sd) #endif } - /// Party booking search results (ZC_PARTY_BOOKING_ACK_SEARCH). /// 0805 <packet len>.W <more results>.B { <index>.L <char name>.24B <expire time>.L <level>.W <map id>.W { <job>.W }*6 }* /// more results: @@ -11883,6 +11906,7 @@ void clif_PartyBookingSearchAck(int fd, struct party_booking_ad_info** results, int i, j; int size = sizeof(struct party_booking_ad_info); // structure size (48) struct party_booking_ad_info *pb_ad; + nullpo_retv(results); WFIFOHEAD(fd,size*count + 5); WFIFOW(fd,0) = 0x805; WFIFOW(fd,2) = size*count + 5; @@ -11904,7 +11928,7 @@ void clif_PartyBookingSearchAck(int fd, struct party_booking_ad_info** results, #endif } - +void clif_parse_PartyBookingDeleteReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to delete own party booking advertisement (CZ_PARTY_BOOKING_REQ_DELETE). /// 0806 void clif_parse_PartyBookingDeleteReq(int fd, struct map_session_data* sd) @@ -11917,7 +11941,6 @@ void clif_parse_PartyBookingDeleteReq(int fd, struct map_session_data* sd) #endif } - /// Result of request to delete own party booking advertisement (ZC_PARTY_BOOKING_ACK_DELETE). /// 0807 <result>.W /// result: @@ -11928,8 +11951,10 @@ void clif_parse_PartyBookingDeleteReq(int fd, struct map_session_data* sd) void clif_PartyBookingDeleteAck(struct map_session_data* sd, int flag) { #ifndef PARTY_RECRUIT - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x807)); WFIFOW(fd,0) = 0x807; WFIFOW(fd,2) = flag; @@ -11939,7 +11964,7 @@ void clif_PartyBookingDeleteAck(struct map_session_data* sd, int flag) #endif } - +void clif_parse_PartyBookingUpdateReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to update party booking advertisement (CZ_PARTY_BOOKING_REQ_UPDATE). /// 0808 { <job>.W }*6 void clif_parse_PartyBookingUpdateReq(int fd, struct map_session_data* sd) @@ -11957,7 +11982,6 @@ void clif_parse_PartyBookingUpdateReq(int fd, struct map_session_data* sd) #endif } - /// Notification about new party booking advertisement (ZC_PARTY_BOOKING_NOTIFY_INSERT). /// 0809 <index>.L <char name>.24B <expire time>.L <level>.W <map id>.W { <job>.W }*6 void clif_PartyBookingInsertNotify(struct map_session_data* sd, struct party_booking_ad_info* pb_ad) @@ -11966,6 +11990,7 @@ void clif_PartyBookingInsertNotify(struct map_session_data* sd, struct party_boo int i; uint8 buf[38+PARTY_BOOKING_JOBS*2]; + nullpo_retv(sd); if(pb_ad == NULL) return; WBUFW(buf,0) = 0x809; @@ -11983,7 +12008,6 @@ void clif_PartyBookingInsertNotify(struct map_session_data* sd, struct party_boo #endif } - /// Notification about updated party booking advertisement (ZC_PARTY_BOOKING_NOTIFY_UPDATE). /// 080a <index>.L { <job>.W }*6 void clif_PartyBookingUpdateNotify(struct map_session_data* sd, struct party_booking_ad_info* pb_ad) @@ -11992,6 +12016,7 @@ void clif_PartyBookingUpdateNotify(struct map_session_data* sd, struct party_boo int i; uint8 buf[6+PARTY_BOOKING_JOBS*2]; + nullpo_retv(sd); if(pb_ad == NULL) return; WBUFW(buf,0) = 0x80a; @@ -12004,7 +12029,6 @@ void clif_PartyBookingUpdateNotify(struct map_session_data* sd, struct party_boo #endif } - /// Notification about deleted party booking advertisement (ZC_PARTY_BOOKING_NOTIFY_DELETE). /// 080b <index>.L void clif_PartyBookingDeleteNotify(struct map_session_data* sd, int index) @@ -12012,6 +12036,7 @@ void clif_PartyBookingDeleteNotify(struct map_session_data* sd, int index) #ifndef PARTY_RECRUIT uint8 buf[6]; + nullpo_retv(sd); WBUFW(buf,0) = 0x80b; WBUFL(buf,2) = index; @@ -12021,6 +12046,7 @@ void clif_PartyBookingDeleteNotify(struct map_session_data* sd, int index) #endif } +void clif_parse_PartyRecruitRegisterReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Modified version of Party Booking System for 2012-04-10 or 2012-04-18 (RagexeRE). /// Code written by mkbu95, Spiria, Yommy and Ind @@ -12050,6 +12076,7 @@ void clif_PartyRecruitSearchAck(int fd, struct party_booking_ad_info** results, int size = sizeof(struct party_booking_ad_info); struct party_booking_ad_info *pb_ad; + nullpo_retv(results); WFIFOHEAD(fd, (size * count) + 5); WFIFOW(fd, 0) = 0x8e8; WFIFOW(fd, 2) = (size * count) + 5; @@ -12080,8 +12107,10 @@ void clif_PartyRecruitSearchAck(int fd, struct party_booking_ad_info** results, void clif_PartyRecruitRegisterAck(struct map_session_data *sd, int flag) { #ifdef PARTY_RECRUIT - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd, packet_len(0x8e6)); WFIFOW(fd, 0) = 0x8e6; WFIFOW(fd, 2) = flag; @@ -12091,6 +12120,7 @@ void clif_PartyRecruitRegisterAck(struct map_session_data *sd, int flag) #endif } +void clif_parse_PartyRecruitSearchReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to search for party booking advertisement (CZ_PARTY_RECRUIT_REQ_SEARCH). /// 08e7 <level>.W <map id>.W <last index>.L <result count>.W void clif_parse_PartyRecruitSearchReq(int fd, struct map_session_data* sd) @@ -12107,6 +12137,7 @@ void clif_parse_PartyRecruitSearchReq(int fd, struct map_session_data* sd) #endif } +void clif_parse_PartyRecruitDeleteReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to delete own party booking advertisement (CZ_PARTY_RECRUIT_REQ_DELETE). /// 08e9 void clif_parse_PartyRecruitDeleteReq(int fd, struct map_session_data* sd) @@ -12129,8 +12160,10 @@ void clif_parse_PartyRecruitDeleteReq(int fd, struct map_session_data* sd) void clif_PartyRecruitDeleteAck(struct map_session_data* sd, int flag) { #ifdef PARTY_RECRUIT - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd, packet_len(0x8ea)); WFIFOW(fd, 0) = 0x8ea; WFIFOW(fd, 2) = flag; @@ -12140,6 +12173,7 @@ void clif_PartyRecruitDeleteAck(struct map_session_data* sd, int flag) #endif } +void clif_parse_PartyRecruitUpdateReq(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to update party booking advertisement (CZ_PARTY_RECRUIT_REQ_UPDATE). /// 08eb <notice>.37B void clif_parse_PartyRecruitUpdateReq(int fd, struct map_session_data *sd) @@ -12162,6 +12196,7 @@ void clif_PartyRecruitInsertNotify(struct map_session_data* sd, struct party_boo #ifdef PARTY_RECRUIT unsigned char buf[2+6+6+24+4+37+1]; + nullpo_retv(sd); if (pb_ad == NULL) return; @@ -12184,6 +12219,8 @@ void clif_PartyRecruitUpdateNotify(struct map_session_data *sd, struct party_boo #ifdef PARTY_RECRUIT unsigned char buf[2+6+37+1]; + nullpo_retv(sd); + nullpo_retv(pb_ad); WBUFW(buf, 0) = 0x8ed; WBUFL(buf, 2) = pb_ad->index; memcpy(WBUFP(buf, 6), pb_ad->p_detail.notice, PB_NOTICE_LENGTH); @@ -12201,6 +12238,7 @@ void clif_PartyRecruitDeleteNotify(struct map_session_data* sd, int index) #ifdef PARTY_RECRUIT unsigned char buf[2+6+1]; + nullpo_retv(sd); WBUFW(buf, 0) = 0x8ee; WBUFL(buf, 2) = index; @@ -12210,6 +12248,7 @@ void clif_PartyRecruitDeleteNotify(struct map_session_data* sd, int index) #endif } +void clif_parse_PartyBookingAddFilteringList(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to add to filtering list (PARTY_RECRUIT_ADD_FILTERLINGLIST). /// 08ef <index>.L void clif_parse_PartyBookingAddFilteringList(int fd, struct map_session_data *sd) @@ -12223,6 +12262,7 @@ void clif_parse_PartyBookingAddFilteringList(int fd, struct map_session_data *sd #endif } +void clif_parse_PartyBookingSubFilteringList(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to remove from filtering list (PARTY_RECRUIT_SUB_FILTERLINGLIST). /// 08f0 <GID>.L void clif_parse_PartyBookingSubFilteringList(int fd, struct map_session_data *sd) @@ -12236,6 +12276,7 @@ void clif_parse_PartyBookingSubFilteringList(int fd, struct map_session_data *sd #endif } +void clif_parse_PartyBookingReqVolunteer(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to recruit volunteer (PARTY_RECRUIT_REQ_VOLUNTEER). /// 08f1 <index>.L void clif_parse_PartyBookingReqVolunteer(int fd, struct map_session_data *sd) @@ -12256,6 +12297,7 @@ void clif_PartyBookingVolunteerInfo(int index, struct map_session_data *sd) #ifdef PARTY_RECRUIT unsigned char buf[2+4+4+2+24+1]; + nullpo_retv(sd); WBUFW(buf, 0) = 0x8f2; WBUFL(buf, 2) = sd->status.account_id; WBUFL(buf, 6) = sd->status.class_; @@ -12274,21 +12316,25 @@ void clif_PartyBookingPersonalSetting(int fd, struct map_session_data *sd) { } +void clif_parse_PartyBookingShowEquipment(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// 08f4 <target GID>.L void clif_parse_PartyBookingShowEquipment(int fd, struct map_session_data *sd) { } +void clif_parse_PartyBookingReqRecall(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// 08f5 <packet len>.W void clif_parse_PartyBookingReqRecall(int fd, struct map_session_data *sd) { } +void clif_PartyBookingRecallCost(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// 08f6 <money>.L <map name>.16B void clif_PartyBookingRecallCost(int fd, struct map_session_data *sd) { } +void clif_parse_PartyBookingAckRecall(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// 08f7 <result>.B void clif_parse_PartyBookingAckRecall(int fd, struct map_session_data *sd) { @@ -12301,11 +12347,13 @@ void clif_parse_PartyBookingAckRecall(int fd, struct map_session_data *sd) /// REASON_REFUSE = 0x2 /// REASON_NOT_PARTY_MEMBER = 0x3 /// REASON_ETC = 0x4 +void clif_PartyBookingFailedRecall(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_PartyBookingFailedRecall(int fd, struct map_session_data *sd) { } #endif //if 0 +void clif_parse_PartyBookingRefuseVolunteer(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// 08f9 <refuse AID>.L void clif_parse_PartyBookingRefuseVolunteer(int fd, struct map_session_data *sd) { @@ -12318,6 +12366,7 @@ void clif_parse_PartyBookingRefuseVolunteer(int fd, struct map_session_data *sd) #endif } +void clif_PartyBookingRefuseVolunteer(unsigned int aid, struct map_session_data *sd) __attribute__((nonnull (2))); /// 08fa <index>.L void clif_PartyBookingRefuseVolunteer(unsigned int aid, struct map_session_data *sd) { @@ -12333,6 +12382,7 @@ void clif_PartyBookingRefuseVolunteer(unsigned int aid, struct map_session_data #endif } +void clif_parse_PartyBookingCancelVolunteer(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// 08fb <index>.L void clif_parse_PartyBookingCancelVolunteer(int fd, struct map_session_data *sd) { @@ -12351,6 +12401,7 @@ void clif_PartyBookingCancelVolunteer(int index, struct map_session_data *sd) #ifdef PARTY_RECRUIT unsigned char buf[2+6+1]; + nullpo_retv(sd); WBUFW(buf, 0) = 0x909; WBUFL(buf, 2) = index; @@ -12366,6 +12417,7 @@ void clif_PartyBookingAddFilteringList(int index, struct map_session_data *sd) #ifdef PARTY_RECRUIT unsigned char buf[2+6+24+1]; + nullpo_retv(sd); WBUFW(buf, 0) = 0x90b; WBUFL(buf, 2) = sd->bl.id; memcpy(WBUFP(buf, 6), sd->status.name, NAME_LENGTH); @@ -12382,6 +12434,7 @@ void clif_PartyBookingSubFilteringList(int gid, struct map_session_data *sd) #ifdef PARTY_RECRUIT unsigned char buf[2+6+24+1]; + nullpo_retv(sd); WBUFW(buf, 0) = 0x90c; WBUFL(buf, 2) = gid; memcpy(WBUFP(buf, 6), sd->status.name, NAME_LENGTH); @@ -12404,6 +12457,7 @@ void clif_PartyBookingRefuseVolunteerToPM(struct map_session_data *sd) } #endif //if 0 +void clif_parse_CloseVending(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to close own vending (CZ_REQ_CLOSESTORE). /// 012e void clif_parse_CloseVending(int fd, struct map_session_data* sd) @@ -12411,7 +12465,7 @@ void clif_parse_CloseVending(int fd, struct map_session_data* sd) vending->close(sd); } - +void clif_parse_VendingListReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to open a vending shop (CZ_REQ_BUY_FROMMC). /// 0130 <account id>.L void clif_parse_VendingListReq(int fd, struct map_session_data* sd) @@ -12422,7 +12476,7 @@ void clif_parse_VendingListReq(int fd, struct map_session_data* sd) vending->list(sd,RFIFOL(fd,2)); } - +void clif_parse_PurchaseReq(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Shop item(s) purchase request (CZ_PC_PURCHASE_ITEMLIST_FROMMC). /// 0134 <packet len>.W <account id>.L { <amount>.W <index>.W }* void clif_parse_PurchaseReq(int fd, struct map_session_data* sd) @@ -12437,7 +12491,7 @@ void clif_parse_PurchaseReq(int fd, struct map_session_data* sd) sd->vended_id = 0; } - +void clif_parse_PurchaseReq2(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Shop item(s) purchase request (CZ_PC_PURCHASE_ITEMLIST_FROMMC2). /// 0801 <packet len>.W <account id>.L <unique id>.L { <amount>.W <index>.W }* void clif_parse_PurchaseReq2(int fd, struct map_session_data* sd) @@ -12453,7 +12507,7 @@ void clif_parse_PurchaseReq2(int fd, struct map_session_data* sd) sd->vended_id = 0; } - +void clif_parse_OpenVending(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Confirm or cancel the shop preparation window. /// 012f <packet len>.W <shop name>.80B { <index>.W <amount>.W <price>.L }* (CZ_REQ_OPENSTORE) /// 01b2 <packet len>.W <shop name>.80B <result>.B { <index>.W <amount>.W <price>.L }* (CZ_REQ_OPENSTORE2) @@ -12475,7 +12529,7 @@ void clif_parse_OpenVending(int fd, struct map_session_data* sd) { clif->message (sd->fd, msg_sd(sd,276)); // "You can't open a shop on this map" return; } - if( map->getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) ) { + if (map->getcell(sd->bl.m, &sd->bl, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING)) { clif->message (sd->fd, msg_sd(sd,204)); // "You can't open a shop on this cell." return; } @@ -12486,6 +12540,7 @@ void clif_parse_OpenVending(int fd, struct map_session_data* sd) { vending->open(sd, message, data, len/8); } +void clif_parse_CreateGuild(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Guild creation request (CZ_REQ_MAKE_GUILD). /// 0165 <char id>.L <guild name>.24B void clif_parse_CreateGuild(int fd,struct map_session_data *sd) { @@ -12501,7 +12556,7 @@ void clif_parse_CreateGuild(int fd,struct map_session_data *sd) { guild->create(sd, name); } - +void clif_parse_GuildCheckMaster(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request for guild window interface permissions (CZ_REQ_GUILD_MENUINTERFACE). /// 014d void clif_parse_GuildCheckMaster(int fd, struct map_session_data *sd) @@ -12509,7 +12564,7 @@ void clif_parse_GuildCheckMaster(int fd, struct map_session_data *sd) clif->guild_masterormember(sd); } - +void clif_parse_GuildRequestInfo(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request for guild window information (CZ_REQ_GUILD_MENU). /// 014f <type>.L /// type: @@ -12550,7 +12605,7 @@ void clif_parse_GuildRequestInfo(int fd, struct map_session_data *sd) } } - +void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to update guild positions (CZ_REG_CHANGE_GUILD_POSITIONINFO). /// 0161 <packet len>.W { <position id>.L <mode>.L <ranking>.L <pay rate>.L <name>.24B }* void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) @@ -12565,7 +12620,7 @@ void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) } } - +void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to update the position of guild members (CZ_REQ_CHANGE_MEMBERPOS). /// 0155 <packet len>.W { <account id>.L <char id>.L <position id>.L }* void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) @@ -12581,7 +12636,7 @@ void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) } } - +void clif_parse_GuildRequestEmblem(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request for guild emblem data (CZ_REQ_GUILD_EMBLEM_IMG). /// 0151 <guild id>.L void clif_parse_GuildRequestEmblem(int fd,struct map_session_data *sd) @@ -12619,6 +12674,7 @@ bool clif_validate_emblem(const uint8 *emblem, unsigned long emblem_len) { unsigned long buf_len = sizeof(buf); int header = 0, bitmap = 0, offbits = 0, palettesize = 0; + nullpo_retr(false, emblem); if( decode_zip(buf, &buf_len, emblem, emblem_len) != 0 || buf_len < BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE || RBUFW(buf,0) != 0x4d42 // BITMAPFILEHEADER.bfType (signature) || RBUFL(buf,2) != buf_len // BITMAPFILEHEADER.bfSize (file size) @@ -12716,7 +12772,7 @@ bool clif_validate_emblem(const uint8 *emblem, unsigned long emblem_len) { return true; } - +void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to update the guild emblem (CZ_REGISTER_GUILD_EMBLEM_IMG). /// 0153 <packet len>.W <emblem data>.?B void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) @@ -12736,7 +12792,7 @@ void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) guild->change_emblem(sd, emblem_len, (const char*)emblem); } - +void clif_parse_GuildChangeNotice(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Guild notice update request (CZ_GUILD_NOTICE). /// 016e <guild id>.L <msg1>.60B <msg2>.120B void clif_parse_GuildChangeNotice(int fd, struct map_session_data* sd) @@ -12761,6 +12817,8 @@ bool clif_sub_guild_invite(int fd, struct map_session_data *sd, struct map_sessi if ( t_sd == NULL )// not online or does not exist return false; + nullpo_retr(false, sd); + nullpo_retr(false, t_sd); if ( map->list[sd->bl.m].flag.guildlock ) { //Guild locked. clif->message(fd, msg_fd(fd,228)); @@ -12776,6 +12834,7 @@ bool clif_sub_guild_invite(int fd, struct map_session_data *sd, struct map_sessi return true; } +void clif_parse_GuildInvite(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Guild invite request (CZ_REQ_JOIN_GUILD). /// 0168 <account id>.L <inviter account id>.L <inviter char id>.L void clif_parse_GuildInvite(int fd,struct map_session_data *sd) { @@ -12785,15 +12844,20 @@ void clif_parse_GuildInvite(int fd,struct map_session_data *sd) { return; } +void clif_parse_GuildInvite2(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Guild invite request (/guildinvite) (CZ_REQ_JOIN_GUILD2). /// 0916 <char name>.24B void clif_parse_GuildInvite2(int fd, struct map_session_data *sd) { - struct map_session_data *t_sd = map->nick2sd((char *)RFIFOP(fd, 2)); + char *nick = (char*)RFIFOP(fd, 2); + struct map_session_data *t_sd = map->nick2sd(nick); + + nick[NAME_LENGTH - 1] = '\0'; if (!clif_sub_guild_invite(fd, sd, t_sd)) return; } +void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to guild invitation (CZ_JOIN_GUILD). /// 016b <guild id>.L <answer>.L /// answer: @@ -12804,7 +12868,7 @@ void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) guild->reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6)); } - +void clif_parse_GuildLeave(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to leave guild (CZ_REQ_LEAVE_GUILD). /// 0159 <guild id>.L <account id>.L <char id>.L <reason>.40B void clif_parse_GuildLeave(int fd,struct map_session_data *sd) { @@ -12821,7 +12885,7 @@ void clif_parse_GuildLeave(int fd,struct map_session_data *sd) { guild->leave(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),(char*)RFIFOP(fd,14)); } - +void clif_parse_GuildExpulsion(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to expel a member of a guild (CZ_REQ_BAN_GUILD). /// 015b <guild id>.L <account id>.L <char id>.L <reason>.40B void clif_parse_GuildExpulsion(int fd,struct map_session_data *sd) { @@ -12833,7 +12897,7 @@ void clif_parse_GuildExpulsion(int fd,struct map_session_data *sd) { guild->expulsion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),(char*)RFIFOP(fd,14)); } - +void clif_parse_GuildMessage(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Validates and processes guild messages (CZ_GUILD_CHAT). /// 017e <packet len>.W <text>.?B (<name> : <message>) 00 void clif_parse_GuildMessage(int fd, struct map_session_data* sd) @@ -12869,7 +12933,7 @@ void clif_parse_GuildMessage(int fd, struct map_session_data* sd) guild->send_message(sd, text, textlen); } - +void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Guild alliance request (CZ_REQ_ALLY_GUILD). /// 0170 <account id>.L <inviter account id>.L <inviter char id>.L void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd) { @@ -12895,7 +12959,7 @@ void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd) { guild->reqalliance(sd,t_sd); } - +void clif_parse_GuildReplyAlliance(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to a guild alliance request (CZ_ALLY_GUILD). /// 0172 <inviter account id>.L <answer>.L /// answer: @@ -12906,7 +12970,7 @@ void clif_parse_GuildReplyAlliance(int fd, struct map_session_data *sd) guild->reply_reqalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6)); } - +void clif_parse_GuildDelAlliance(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to delete a guild alliance or opposition (CZ_REQ_DELETE_RELATED_GUILD). /// 0183 <opponent guild id>.L <relation>.L /// relation: @@ -12924,7 +12988,7 @@ void clif_parse_GuildDelAlliance(int fd, struct map_session_data *sd) { guild->delalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6)); } - +void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to set a guild as opposition (CZ_REQ_HOSTILE_GUILD). /// 0180 <account id>.L void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) { @@ -12950,7 +13014,7 @@ void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) { guild->opposition(sd,t_sd); } - +void clif_parse_GuildBreak(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to delete own guild (CZ_REQ_DISORGANIZE_GUILD). /// 015d <key>.40B /// key: @@ -12965,10 +13029,10 @@ void clif_parse_GuildBreak(int fd, struct map_session_data *sd) { guild->dobreak(sd,(char*)RFIFOP(fd,2)); } - /// Pet /// +void clif_parse_PetMenu(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to invoke a pet menu action (CZ_COMMAND_PET). /// 01a1 <type>.B /// type: @@ -12982,7 +13046,7 @@ void clif_parse_PetMenu(int fd, struct map_session_data *sd) pet->menu(sd,RFIFOB(fd,2)); } - +void clif_parse_CatchPet(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Attempt to tame a monster (CZ_TRYCAPTURE_MONSTER). /// 019f <id>.L void clif_parse_CatchPet(int fd, struct map_session_data *sd) @@ -12990,7 +13054,7 @@ void clif_parse_CatchPet(int fd, struct map_session_data *sd) pet->catch_process2(sd,RFIFOL(fd,2)); } - +void clif_parse_SelectEgg(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to pet incubator egg selection dialog (CZ_SELECT_PETEGG). /// 01a7 <index>.W void clif_parse_SelectEgg(int fd, struct map_session_data *sd) @@ -13002,7 +13066,7 @@ void clif_parse_SelectEgg(int fd, struct map_session_data *sd) clif_menuskill_clear(sd); } - +void clif_parse_SendEmotion(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to display pet's emotion/talk (CZ_PET_ACT). /// 01a9 <data>.L /// data: @@ -13033,7 +13097,7 @@ void clif_parse_SendEmotion(int fd, struct map_session_data *sd) clif->pet_emotion(sd->pd,RFIFOL(fd,2)); } - +void clif_parse_ChangePetName(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to change pet's name (CZ_RENAME_PET). /// 01a5 <name>.24B void clif_parse_ChangePetName(int fd, struct map_session_data *sd) @@ -13041,7 +13105,7 @@ void clif_parse_ChangePetName(int fd, struct map_session_data *sd) pet->change_name(sd,(char*)RFIFOP(fd,2)); } - +void clif_parse_GMKick(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /kill (CZ_DISCONNECT_CHARACTER). /// Request to disconnect a character. /// 00cc <account id>.L @@ -13100,7 +13164,7 @@ void clif_parse_GMKick(int fd, struct map_session_data *sd) { } } - +void clif_parse_GMKickAll(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// /killall (CZ_DISCONNECT_ALL_CHARACTER). /// Request to disconnect all characters. /// 00ce @@ -13110,7 +13174,7 @@ void clif_parse_GMKickAll(int fd, struct map_session_data* sd) { atcommand->exec(fd, sd, cmd, true); } - +void clif_parse_GMShift(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /remove (CZ_REMOVE_AID). /// Request to warp to a character with given login ID. /// 01ba <account name>.24B @@ -13130,7 +13194,7 @@ void clif_parse_GMShift(int fd, struct map_session_data *sd) atcommand->exec(fd, sd, command, true); } - +void clif_parse_GMRemove2(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// /remove (CZ_REMOVE_AID_SSO). /// Request to warp to a character with given account ID. /// 0843 <account id>.L @@ -13146,7 +13210,7 @@ void clif_parse_GMRemove2(int fd, struct map_session_data* sd) { } } - +void clif_parse_GMRecall(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /recall (CZ_RECALL). /// Request to summon a player with given login ID to own position. /// 01bc <account name>.24B @@ -13166,7 +13230,7 @@ void clif_parse_GMRecall(int fd, struct map_session_data *sd) atcommand->exec(fd, sd, command, true); } - +void clif_parse_GMRecall2(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// /recall (CZ_RECALL_SSO). /// Request to summon a player with given account ID to own position. /// 0842 <account id>.L @@ -13182,7 +13246,7 @@ void clif_parse_GMRecall2(int fd, struct map_session_data* sd) { } } - +void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /item /monster (CZ_ITEM_CREATE). /// Request to execute GM commands. /// usage: @@ -13252,7 +13316,7 @@ void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) { } } - +void clif_parse_GMHide(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /hide (CZ_CHANGE_EFFECTSTATE). /// 019d <effect state>.L /// effect state: @@ -13265,7 +13329,7 @@ void clif_parse_GMHide(int fd, struct map_session_data *sd) { atcommand->exec(fd, sd, cmd, true); } - +void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to adjust player's manner points (CZ_REQ_GIVE_MANNER_POINT). /// 0149 <account id>.L <type>.B <value>.W /// type: @@ -13319,7 +13383,7 @@ void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd) { atcommand->exec(fd, sd, command, true); } - +void clif_parse_GMRc(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// /rc (CZ_REQ_GIVE_MANNER_BYNAME). /// GM adjustment of a player's manner value by -60. /// 0212 <char name>.24B @@ -13333,12 +13397,13 @@ void clif_parse_GMRc(int fd, struct map_session_data* sd) atcommand->exec(fd, sd, command, true); } - /// Result of request to resolve account name (ZC_ACK_ACCOUNTNAME). /// 01e0 <account id>.L <account name>.24B void clif_account_name(struct map_session_data* sd, int account_id, const char* accname) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x1e0)); WFIFOW(fd,0) = 0x1e0; WFIFOL(fd,2) = account_id; @@ -13346,7 +13411,7 @@ void clif_account_name(struct map_session_data* sd, int account_id, const char* WFIFOSET(fd,packet_len(0x1e0)); } - +void clif_parse_GMReqAccountName(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// GM requesting account name (for right-click gm menu) (CZ_REQ_ACCOUNTNAME). /// 01df <account id>.L void clif_parse_GMReqAccountName(int fd, struct map_session_data *sd) @@ -13357,7 +13422,7 @@ void clif_parse_GMReqAccountName(int fd, struct map_session_data *sd) clif->account_name(sd, account_id, ""); // insert account name here >_< } - +void clif_parse_GMChangeMapType(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /changemaptype <x> <y> <type> (CZ_CHANGE_MAPTYPE). /// GM single cell type change request. /// 0198 <x>.W <y>.W <type>.W @@ -13379,7 +13444,7 @@ void clif_parse_GMChangeMapType(int fd, struct map_session_data *sd) { //FIXME: once players leave the map, the client 'forgets' this information. } - +void clif_parse_PMIgnore(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// /in /ex (CZ_SETTING_WHISPER_PC). /// Request to allow/deny whispers from a nick. /// 00cf <nick>.24B <type>.B @@ -13432,7 +13497,7 @@ void clif_parse_PMIgnore(int fd, struct map_session_data* sd) { clif->wisexin(sd, type, 0); // success } - +void clif_parse_PMIgnoreAll(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /inall /exall (CZ_SETTING_WHISPER_STATE). /// Request to allow/deny all whispers. /// 00d0 <type>.B @@ -13468,12 +13533,13 @@ void clif_parse_PMIgnoreAll(int fd, struct map_session_data *sd) clif->wisall(sd, type, flag); } - /// Whisper ignore list (ZC_WHISPER_LIST). /// 00d4 <packet len>.W { <char name>.24B }* void clif_PMIgnoreList(struct map_session_data* sd) { - int i, fd = sd->fd; + int i, fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,4+ARRAYLENGTH(sd->ignore)*NAME_LENGTH); WFIFOW(fd,0) = 0xd4; @@ -13485,7 +13551,7 @@ void clif_PMIgnoreList(struct map_session_data* sd) { WFIFOSET(fd,WFIFOW(fd,2)); } - +void clif_parse_PMIgnoreList(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Whisper ignore list request (CZ_REQ_WHISPER_LIST). /// 00d3 void clif_parse_PMIgnoreList(int fd,struct map_session_data *sd) @@ -13493,7 +13559,7 @@ void clif_parse_PMIgnoreList(int fd,struct map_session_data *sd) clif->PMIgnoreList(sd); } - +void clif_parse_NoviceDoriDori(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to invoke the /doridori recovery bonus (CZ_DORIDORI). /// 01e7 void clif_parse_NoviceDoriDori(int fd, struct map_session_data *sd) @@ -13512,7 +13578,7 @@ void clif_parse_NoviceDoriDori(int fd, struct map_session_data *sd) } } - +void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to invoke the effect of super novice's guardian angel prayer (CZ_CHOPOKGI). /// 01ed /// Note: This packet is caused by 7 lines of any text, followed by @@ -13541,7 +13607,6 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd) } } - /// Friends List /// @@ -13551,8 +13616,10 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd) /// 0 = online /// 1 = offline void clif_friendslist_toggle(struct map_session_data *sd,int account_id, int char_id, int online) { - int i, fd = sd->fd; + int i, fd; + nullpo_retv(sd); + fd = sd->fd; //Seek friend. for (i = 0; i < MAX_FRIENDS && sd->status.friends[i].char_id && (sd->status.friends[i].char_id != char_id || sd->status.friends[i].account_id != account_id); i++); @@ -13568,7 +13635,6 @@ void clif_friendslist_toggle(struct map_session_data *sd,int account_id, int cha WFIFOSET(fd, packet_len(0x206)); } - //Sub-function called from clif_foreachclient to toggle friends on/off [Skotlex] int clif_friendslist_toggle_sub(struct map_session_data *sd,va_list ap) { @@ -13580,13 +13646,13 @@ int clif_friendslist_toggle_sub(struct map_session_data *sd,va_list ap) return 0; } - /// Sends the whole friends list (ZC_FRIENDS_LIST). /// 0201 <packet len>.W { <account id>.L <char id>.L <name>.24B }* void clif_friendslist_send(struct map_session_data *sd) { int i = 0, n, fd = sd->fd; + nullpo_retv(sd); // Send friends list WFIFOHEAD(fd, MAX_FRIENDS * 32 + 4); WFIFOW(fd, 0) = 0x201; @@ -13607,7 +13673,6 @@ void clif_friendslist_send(struct map_session_data *sd) } } - /// Notification about the result of a friend add request (ZC_ADD_FRIENDS_LIST). /// 0209 <result>.W <account id>.L <char id>.L <name>.24B /// result: @@ -13632,12 +13697,13 @@ void clif_friendslist_reqack(struct map_session_data *sd, struct map_session_dat WFIFOSET(fd, packet_len(0x209)); } - /// Asks a player for permission to be added as friend (ZC_REQ_ADD_FRIENDS). /// 0207 <req account id>.L <req char id>.L <req char name>.24B void clif_friendlist_req(struct map_session_data* sd, int account_id, int char_id, const char* name) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x207)); WFIFOW(fd,0) = 0x207; WFIFOL(fd,2) = account_id; @@ -13646,14 +13712,16 @@ void clif_friendlist_req(struct map_session_data* sd, int account_id, int char_i WFIFOSET(fd,packet_len(0x207)); } - +void clif_parse_FriendsListAdd(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to add a player as friend (CZ_ADD_FRIENDS). /// 0202 <name>.24B void clif_parse_FriendsListAdd(int fd, struct map_session_data *sd) { struct map_session_data *f_sd; int i; + char *nick = (char*)RFIFOP(fd,2); - f_sd = map->nick2sd((char*)RFIFOP(fd,2)); + nick[NAME_LENGTH - 1] = '\0'; + f_sd = map->nick2sd(nick); // ensure that the request player's friend list is not full ARR_FIND(0, MAX_FRIENDS, i, sd->status.friends[i].char_id == 0); @@ -13693,7 +13761,7 @@ void clif_parse_FriendsListAdd(int fd, struct map_session_data *sd) { clif->friendlist_req(f_sd, sd->status.account_id, sd->status.char_id, sd->status.name); } - +void clif_parse_FriendsListReply(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to a friend add request (CZ_ACK_REQ_ADD_FRIENDS). /// 0208 <inviter account id>.L <inviter char id>.L <result>.B /// 0208 <inviter account id>.L <inviter char id>.L <result>.L (PACKETVER >= 6) @@ -13761,7 +13829,7 @@ void clif_parse_FriendsListReply(int fd, struct map_session_data *sd) } } - +void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to delete a friend (CZ_DELETE_FRIENDS). /// 0203 <account id>.L <char id>.L void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd) @@ -13825,12 +13893,13 @@ void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd) WFIFOSET(fd, packet_len(0x20a)); } - /// /pvpinfo list (ZC_ACK_PVPPOINT). /// 0210 <char id>.L <account id>.L <win point>.L <lose point>.L <point>.L void clif_PVPInfo(struct map_session_data* sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x210)); WFIFOW(fd,0) = 0x210; WFIFOL(fd,2) = sd->status.char_id; @@ -13841,7 +13910,7 @@ void clif_PVPInfo(struct map_session_data* sd) { WFIFOSET(fd, packet_len(0x210)); } - +void clif_parse_PVPInfo(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// /pvpinfo (CZ_REQ_PVPPOINT). /// 020f <char id>.L <account id>.L void clif_parse_PVPInfo(int fd,struct map_session_data *sd) @@ -13858,6 +13927,7 @@ void clif_ranklist_sub(unsigned char *buf, enum fame_list_type type) { struct fame_list* list; int i; + nullpo_retv(buf); switch( type ) { case RANKTYPE_BLACKSMITH: list = pc->smith_fame_list; break; case RANKTYPE_ALCHEMIST: list = pc->chemist_fame_list; break; @@ -13886,10 +13956,13 @@ void clif_ranklist_sub(unsigned char *buf, enum fame_list_type type) { /// 097d <RankingType>.W {<CharName>.24B <point>L}*10 <mypoint>L (ZC_ACK_RANKING) void clif_ranklist(struct map_session_data *sd, enum fame_list_type type) { - int fd = sd->fd; + int fd; int mypoint = 0; - int upperMask = sd->class_&MAPID_UPPERMASK; + int upperMask; + nullpo_retv(sd); + fd = sd->fd; + upperMask = sd->class_&MAPID_UPPERMASK; WFIFOHEAD(fd, 288); WFIFOW(fd, 0) = 0x97d; WFIFOW(fd, 2) = type; @@ -13908,6 +13981,7 @@ void clif_ranklist(struct map_session_data *sd, enum fame_list_type type) { WFIFOSET(fd, 288); } +void clif_parse_ranklist(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /* * 097c <type> (CZ_REQ_RANKING) * */ @@ -13932,7 +14006,11 @@ void clif_update_rankingpoint(struct map_session_data *sd, enum fame_list_type t case RANKTYPE_TAEKWON: clif->fame_taekwon(sd,points); break; } #else - int fd = sd->fd; + + int fd; + + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd, 12); WFIFOW(fd, 0) = 0x97e; WFIFOW(fd, 2) = type; @@ -13945,14 +14023,17 @@ void clif_update_rankingpoint(struct map_session_data *sd, enum fame_list_type t /// /blacksmith list (ZC_BLACKSMITH_RANK). /// 0219 { <name>.24B }*10 { <point>.L }*10 void clif_blacksmith(struct map_session_data* sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x219)); WFIFOW(fd,0) = 0x219; clif_ranklist_sub(WFIFOP(fd, 2), RANKTYPE_BLACKSMITH); WFIFOSET(fd, packet_len(0x219)); } +void clif_parse_Blacksmith(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// /blacksmith (CZ_BLACKSMITH_RANK). /// 0217 void clif_parse_Blacksmith(int fd,struct map_session_data *sd) { @@ -13962,8 +14043,10 @@ void clif_parse_Blacksmith(int fd,struct map_session_data *sd) { /// Notification about backsmith points (ZC_BLACKSMITH_POINT). /// 021b <points>.L <total points>.L void clif_fame_blacksmith(struct map_session_data *sd, int points) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x21b)); WFIFOW(fd,0) = 0x21b; WFIFOL(fd,2) = points; @@ -13974,14 +14057,17 @@ void clif_fame_blacksmith(struct map_session_data *sd, int points) { /// /alchemist list (ZC_ALCHEMIST_RANK). /// 021a { <name>.24B }*10 { <point>.L }*10 void clif_alchemist(struct map_session_data* sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x21a)); WFIFOW(fd,0) = 0x21a; clif_ranklist_sub(WFIFOP(fd,2), RANKTYPE_ALCHEMIST); WFIFOSET(fd, packet_len(0x21a)); } +void clif_parse_Alchemist(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// /alchemist (CZ_ALCHEMIST_RANK). /// 0218 void clif_parse_Alchemist(int fd,struct map_session_data *sd) { @@ -13991,8 +14077,10 @@ void clif_parse_Alchemist(int fd,struct map_session_data *sd) { /// Notification about alchemist points (ZC_ALCHEMIST_POINT). /// 021c <points>.L <total points>.L void clif_fame_alchemist(struct map_session_data *sd, int points) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x21c)); WFIFOW(fd,0) = 0x21c; WFIFOL(fd,2) = points; @@ -14003,14 +14091,17 @@ void clif_fame_alchemist(struct map_session_data *sd, int points) { /// /taekwon list (ZC_TAEKWON_RANK). /// 0226 { <name>.24B }*10 { <point>.L }*10 void clif_taekwon(struct map_session_data* sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x226)); WFIFOW(fd,0) = 0x226; clif_ranklist_sub(WFIFOP(fd,2), RANKTYPE_TAEKWON); WFIFOSET(fd, packet_len(0x226)); } +void clif_parse_Taekwon(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// /taekwon (CZ_TAEKWON_RANK). /// 0225 void clif_parse_Taekwon(int fd,struct map_session_data *sd) { @@ -14020,8 +14111,10 @@ void clif_parse_Taekwon(int fd,struct map_session_data *sd) { /// Notification about taekwon points (ZC_TAEKWON_POINT). /// 0224 <points>.L <total points>.L void clif_fame_taekwon(struct map_session_data *sd, int points) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x224)); WFIFOW(fd,0) = 0x224; WFIFOL(fd,2) = points; @@ -14032,8 +14125,10 @@ void clif_fame_taekwon(struct map_session_data *sd, int points) { /// /pk list (ZC_KILLER_RANK). /// 0238 { <name>.24B }*10 { <point>.L }*10 void clif_ranking_pk(struct map_session_data* sd) { - int i, fd = sd->fd; + int i, fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x238)); WFIFOW(fd,0) = 0x238; for (i = 0; i < 10;i ++) { @@ -14043,14 +14138,14 @@ void clif_ranking_pk(struct map_session_data* sd) { WFIFOSET(fd, packet_len(0x238)); } - +void clif_parse_RankingPk(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// /pk (CZ_KILLER_RANK). /// 0237 void clif_parse_RankingPk(int fd,struct map_session_data *sd) { clif->ranking_pk(sd); } - +void clif_parse_FeelSaveOk(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// SG Feel save OK [Komurka] (CZ_AGREE_STARPLACE). /// 0254 <which>.B /// which: @@ -14077,7 +14172,6 @@ void clif_parse_FeelSaveOk(int fd,struct map_session_data *sd) clif_menuskill_clear(sd); } - /// Star Gladiator's Feeling map confirmation prompt (ZC_STARPLACE). /// 0253 <which>.B /// which: @@ -14086,6 +14180,7 @@ void clif_parse_FeelSaveOk(int fd,struct map_session_data *sd) /// 2 = star void clif_feel_req(int fd, struct map_session_data *sd, uint16 skill_lv) { + nullpo_retv(sd); WFIFOHEAD(fd,packet_len(0x253)); WFIFOW(fd,0)=0x253; WFIFOB(fd,2)=TOB(skill_lv-1); @@ -14094,14 +14189,14 @@ void clif_feel_req(int fd, struct map_session_data *sd, uint16 skill_lv) sd->menuskill_val = skill_lv; } - +void clif_parse_ChangeHomunculusName(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to change homunculus' name (CZ_RENAME_MER). /// 0231 <name>.24B void clif_parse_ChangeHomunculusName(int fd, struct map_session_data *sd) { homun->change_name(sd,(char*)RFIFOP(fd,2)); } - +void clif_parse_HomMoveToMaster(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to warp/move homunculus/mercenary to it's owner (CZ_REQUEST_MOVETOOWNER). /// 0234 <id>.L void clif_parse_HomMoveToMaster(int fd, struct map_session_data *sd) @@ -14110,9 +14205,9 @@ void clif_parse_HomMoveToMaster(int fd, struct map_session_data *sd) struct block_list *bl = NULL; struct unit_data *ud = NULL; - if( sd->md && sd->md->bl.id == id ) + if (sd->md && sd->md->bl.id == id) bl = &sd->md->bl; - else if( homun_alive(sd->hd) && sd->hd->bl.id == id ) + else if (homun_alive(sd->hd) && sd->hd->bl.id == id) bl = &sd->hd->bl; // Moving Homunculus else return; @@ -14122,7 +14217,7 @@ void clif_parse_HomMoveToMaster(int fd, struct map_session_data *sd) unit->walktoxy(bl, ud->to_x, ud->to_y, 4); } - +void clif_parse_HomMoveTo(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to move homunculus/mercenary (CZ_REQUEST_MOVENPC). /// 0232 <id>.L <position data>.3B void clif_parse_HomMoveTo(int fd, struct map_session_data *sd) @@ -14143,7 +14238,7 @@ void clif_parse_HomMoveTo(int fd, struct map_session_data *sd) unit->walktoxy(bl, x, y, 4); } - +void clif_parse_HomAttack(int fd,struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to do an action with homunculus/mercenary (CZ_REQUEST_ACTNPC). /// 0233 <id>.L <target id>.L <action>.B /// action: @@ -14165,7 +14260,7 @@ void clif_parse_HomAttack(int fd,struct map_session_data *sd) unit->attack(bl, target_id, action_type != 0); } - +void clif_parse_HomMenu(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to invoke a homunculus menu action (CZ_COMMAND_MER). /// 022d <type>.W <command>.B /// type: @@ -14185,7 +14280,7 @@ void clif_parse_HomMenu(int fd, struct map_session_data *sd) { //[orn] homun->menu(sd,RFIFOB(fd,packet_db[cmd].pos[1])); } - +void clif_parse_AutoRevive(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to resurrect oneself using Token of Siegfried (CZ_STANDING_RESURRECTION). /// 0292 void clif_parse_AutoRevive(int fd, struct map_session_data *sd) { @@ -14213,7 +14308,6 @@ void clif_parse_AutoRevive(int fd, struct map_session_data *sd) { clif->skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1); } - /// Information about character's status values (ZC_ACK_STATUS_GM). /// 0214 <str>.B <standardStr>.B <agi>.B <standardAgi>.B <vit>.B <standardVit>.B /// <int>.B <standardInt>.B <dex>.B <standardDex>.B <luk>.B <standardLuk>.B @@ -14222,6 +14316,7 @@ void clif_parse_AutoRevive(int fd, struct map_session_data *sd) { /// <hitSuccessValue>.W <avoidSuccessValue>.W <plusAvoidSuccessValue>.W /// <criticalSuccessValue>.W <ASPD>.W <plusASPD>.W void clif_check(int fd, struct map_session_data* pl_sd) { + nullpo_retv(pl_sd); WFIFOHEAD(fd,packet_len(0x214)); WFIFOW(fd, 0) = 0x214; WFIFOB(fd, 2) = min(pl_sd->status.str, UINT8_MAX); @@ -14253,7 +14348,7 @@ void clif_check(int fd, struct map_session_data* pl_sd) { WFIFOSET(fd,packet_len(0x214)); } - +void clif_parse_Check(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// /check (CZ_REQ_STATUS_GM). /// Request character's status values. /// 0213 <char name>.24B @@ -14274,8 +14369,6 @@ void clif_parse_Check(int fd, struct map_session_data *sd) clif->check(fd, pl_sd); } - - /// MAIL SYSTEM /// By Zephyrus /// @@ -14294,7 +14387,6 @@ void clif_Mail_setattachment(int fd, int index, uint8 flag) WFIFOSET(fd,packet_len(0x255)); } - /// Notification about the result of retrieving a mail attachment (ZC_MAIL_REQ_GET_ITEM). /// 0245 <result>.B /// result: @@ -14309,7 +14401,6 @@ void clif_Mail_getattachment(int fd, uint8 flag) WFIFOSET(fd,packet_len(0x245)); } - /// Notification about the result of sending a mail (ZC_MAIL_REQ_SEND). /// 0249 <result>.B /// result: @@ -14323,7 +14414,6 @@ void clif_Mail_send(int fd, bool fail) WFIFOSET(fd,packet_len(0x249)); } - /// Notification about the result of deleting a mail (ZC_ACK_MAIL_DELETE). /// 0257 <mail id>.L <result>.W /// result: @@ -14338,7 +14428,6 @@ void clif_Mail_delete(int fd, int mail_id, short fail) WFIFOSET(fd, packet_len(0x257)); } - /// Notification about the result of returning a mail (ZC_ACK_MAIL_RETURN). /// 0274 <mail id>.L <result>.W /// result: @@ -14353,11 +14442,12 @@ void clif_Mail_return(int fd, int mail_id, short fail) WFIFOSET(fd,packet_len(0x274)); } - /// Notification about new mail (ZC_MAIL_RECEIVE). /// 024a <mail id>.L <title>.40B <sender>.24B void clif_Mail_new(int fd, int mail_id, const char *sender, const char *title) { + nullpo_retv(sender); + nullpo_retv(title); WFIFOHEAD(fd,packet_len(0x24a)); WFIFOW(fd,0) = 0x24a; WFIFOL(fd,2) = mail_id; @@ -14366,7 +14456,6 @@ void clif_Mail_new(int fd, int mail_id, const char *sender, const char *title) WFIFOSET(fd,packet_len(0x24a)); } - /// Opens/closes the mail window (ZC_MAIL_WINDOWS). /// 0260 <type>.L /// type: @@ -14380,7 +14469,6 @@ void clif_Mail_window(int fd, int flag) WFIFOSET(fd,packet_len(0x260)); } - /// Lists mails stored in inbox (ZC_MAIL_REQ_GET_LIST). /// 0240 <packet len>.W <amount>.L { <mail id>.L <title>.40B <read>.B <sender>.24B <time>.L }*amount /// read: @@ -14389,10 +14477,12 @@ void clif_Mail_window(int fd, int flag) void clif_Mail_refreshinbox(struct map_session_data *sd) { int fd = sd->fd; - struct mail_data *md = &sd->mail.inbox; + struct mail_data *md; struct mail_message *msg; int len, i, j; + nullpo_retv(sd); + md = &sd->mail.inbox; len = 8 + (73 * md->amount); WFIFOHEAD(fd,len); @@ -14421,7 +14511,7 @@ void clif_Mail_refreshinbox(struct map_session_data *sd) } } - +void clif_parse_Mail_refreshinbox(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Mail inbox list request (CZ_MAIL_GET_LIST). /// 023f void clif_parse_Mail_refreshinbox(int fd, struct map_session_data *sd) @@ -14437,7 +14527,6 @@ void clif_parse_Mail_refreshinbox(int fd, struct map_session_data *sd) mail->removezeny(sd, 0); } - /// Opens a mail (ZC_MAIL_REQ_OPEN). /// 0242 <packet len>.W <mail id>.L <title>.40B <sender>.24B <time>.L <zeny>.L /// <amount>.L <name id>.W <item type>.W <identified>.B <damaged>.B <refine>.B @@ -14446,6 +14535,7 @@ void clif_Mail_read(struct map_session_data *sd, int mail_id) { int i, fd = sd->fd; + nullpo_retv(sd); ARR_FIND(0, MAIL_MAX_INBOX, i, sd->mail.inbox.msg[i].id == mail_id); if( i == MAIL_MAX_INBOX ) { clif->mail_return(sd->fd, mail_id, 1); // Mail doesn't exist @@ -14499,7 +14589,7 @@ void clif_Mail_read(struct map_session_data *sd, int mail_id) } } - +void clif_parse_Mail_read(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to open a mail (CZ_MAIL_OPEN). /// 0241 <mail id>.L void clif_parse_Mail_read(int fd, struct map_session_data *sd) @@ -14514,7 +14604,7 @@ void clif_parse_Mail_read(int fd, struct map_session_data *sd) clif->mail_read(sd, RFIFOL(fd,2)); } - +void clif_parse_Mail_getattach(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to receive mail's attachment (CZ_MAIL_GET_ITEM). /// 0244 <mail id>.L void clif_parse_Mail_getattach(int fd, struct map_session_data *sd) @@ -14576,12 +14666,13 @@ void clif_parse_Mail_getattach(int fd, struct map_session_data *sd) sd->mail.inbox.msg[i].zeny = 0; memset(&sd->mail.inbox.msg[i].item, 0, sizeof(struct item)); - clif->mail_read(sd, mail_id); + mail->clear(sd); + clif->mail_read(sd, mail_id); intif->Mail_getattach(sd->status.char_id, mail_id); } - +void clif_parse_Mail_delete(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to delete a mail (CZ_MAIL_DELETE). /// 0243 <mail id>.L void clif_parse_Mail_delete(int fd, struct map_session_data *sd) @@ -14605,11 +14696,14 @@ void clif_parse_Mail_delete(int fd, struct map_session_data *sd) return; } + sd->mail.inbox.msg[i].zeny = 0; + memset(&sd->mail.inbox.msg[i].item, 0, sizeof(struct item)); + mail->clear(sd); intif->Mail_delete(sd->status.char_id, mail_id); } } - +void clif_parse_Mail_return(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to return a mail (CZ_REQ_MAIL_RETURN). /// 0273 <mail id>.L <receive name>.24B void clif_parse_Mail_return(int fd, struct map_session_data *sd) @@ -14623,13 +14717,17 @@ void clif_parse_Mail_return(int fd, struct map_session_data *sd) return; ARR_FIND(0, MAIL_MAX_INBOX, i, sd->mail.inbox.msg[i].id == mail_id); - if( i < MAIL_MAX_INBOX && sd->mail.inbox.msg[i].send_id != 0 ) + if (i < MAIL_MAX_INBOX && sd->mail.inbox.msg[i].send_id != 0) { + sd->mail.inbox.msg[i].zeny = 0; + memset(&sd->mail.inbox.msg[i].item, 0, sizeof(struct item)); + mail->clear(sd); intif->Mail_return(sd->status.char_id, mail_id); - else + } else { clif->mail_return(sd->fd, mail_id, 1); + } } - +void clif_parse_Mail_setattach(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to add an item or Zeny to mail (CZ_MAIL_ADD_ITEM). /// 0247 <index>.W <amount>.L void clif_parse_Mail_setattach(int fd, struct map_session_data *sd) @@ -14647,7 +14745,7 @@ void clif_parse_Mail_setattach(int fd, struct map_session_data *sd) clif->mail_setattachment(fd,idx,flag); } - +void clif_parse_Mail_winopen(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to reset mail item and/or Zeny (CZ_MAIL_RESET_ITEM). /// 0246 <type>.W /// type: @@ -14664,7 +14762,7 @@ void clif_parse_Mail_winopen(int fd, struct map_session_data *sd) mail->removezeny(sd, 0); } - +void clif_parse_Mail_send(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to send mail (CZ_MAIL_SEND). /// 0248 <packet len>.W <recipient>.24B <title>.40B <body len>.B <body>.?B void clif_parse_Mail_send(int fd, struct map_session_data *sd) @@ -14724,7 +14822,6 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd) sd->cansendmail_tick = timer->gettick() + 1000; // 1 Second flood Protection } - /// AUCTION SYSTEM /// By Zephyrus /// @@ -14736,8 +14833,10 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd) /// 1 = close void clif_Auction_openwindow(struct map_session_data *sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; if (sd->state.storage_flag != STORAGE_FLAG_CLOSED || sd->state.vending || sd->state.buyingstore || sd->state.trading) return; @@ -14750,15 +14849,16 @@ void clif_Auction_openwindow(struct map_session_data *sd) WFIFOSET(fd,packet_len(0x25f)); } - /// Returns auction item search results (ZC_AUCTION_ITEM_REQ_SEARCH). /// 0252 <packet len>.W <pages>.L <count>.L { <auction id>.L <seller name>.24B <name id>.W <type>.L <amount>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W <now price>.L <max price>.L <buyer name>.24B <delete time>.L }* void clif_Auction_results(struct map_session_data *sd, short count, short pages, uint8 *buf) { - int i, fd = sd->fd, len = sizeof(struct auction_data); + int i, fd, len = sizeof(struct auction_data); struct auction_data auction; struct item_data *item; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,12 + (count * 83)); WFIFOW(fd,0) = 0x252; WFIFOW(fd,2) = 12 + (count * 83); @@ -14794,7 +14894,6 @@ void clif_Auction_results(struct map_session_data *sd, short count, short pages, WFIFOSET(fd,WFIFOW(fd,2)); } - /// Result from request to add an item (ZC_ACK_AUCTION_ADD_ITEM). /// 0256 <index>.W <result>.B /// result: @@ -14808,7 +14907,7 @@ void clif_Auction_setitem(int fd, int index, bool fail) { WFIFOSET(fd,packet_len(0x256)); } - +void clif_parse_Auction_cancelreg(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to initialize 'new auction' data (CZ_AUCTION_CREATE). /// 024b <type>.W /// type: @@ -14823,7 +14922,7 @@ void clif_parse_Auction_cancelreg(int fd, struct map_session_data *sd) sd->auction.amount = 0; } - +void clif_parse_Auction_setitem(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to add an item to the action (CZ_AUCTION_ADD_ITEM). /// 024c <index>.W <count>.L void clif_parse_Auction_setitem(int fd, struct map_session_data *sd) @@ -14888,7 +14987,6 @@ void clif_Auction_message(int fd, unsigned char flag) WFIFOSET(fd,packet_len(0x250)); } - /// Result of the auction close request (ZC_AUCTION_ACK_MY_SELL_STOP). /// 025e <result>.W /// result: @@ -14903,7 +15001,7 @@ void clif_Auction_close(int fd, unsigned char flag) WFIFOSET(fd,packet_len(0x25e)); } - +void clif_parse_Auction_register(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to add an auction (CZ_AUCTION_ADD). /// 024d <now money>.L <max money>.L <delete hour>.W void clif_parse_Auction_register(int fd, struct map_session_data *sd) @@ -14914,12 +15012,19 @@ void clif_parse_Auction_register(int fd, struct map_session_data *sd) if (!battle_config.feature_auction) return; + Assert_retv(sd->auction.index >= 0 && sd->auction.index < MAX_INVENTORY); + memset(&auction, 0, sizeof(auction)); auction.price = RFIFOL(fd,2); auction.buynow = RFIFOL(fd,6); auction.hours = RFIFOW(fd,10); // Invalid Situations... + if (auction.price <= 0 || auction.buynow <= 0) { + ShowWarning("Character %s trying to register auction wit wrong price.\n", sd->status.name); + return; + } + if( sd->auction.amount < 1 ) { ShowWarning("Character %s trying to register auction without item.\n", sd->status.name); return; @@ -14991,7 +15096,7 @@ void clif_parse_Auction_register(int fd, struct map_session_data *sd) } } - +void clif_parse_Auction_cancel(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Cancels an auction (CZ_AUCTION_ADD_CANCEL). /// 024e <auction id>.L void clif_parse_Auction_cancel(int fd, struct map_session_data *sd) @@ -15001,7 +15106,7 @@ void clif_parse_Auction_cancel(int fd, struct map_session_data *sd) intif->Auction_cancel(sd->status.char_id, auction_id); } - +void clif_parse_Auction_close(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Closes an auction (CZ_AUCTION_REQ_MY_SELL_STOP). /// 025d <auction id>.L void clif_parse_Auction_close(int fd, struct map_session_data *sd) @@ -15011,7 +15116,7 @@ void clif_parse_Auction_close(int fd, struct map_session_data *sd) intif->Auction_close(sd->status.char_id, auction_id); } - +void clif_parse_Auction_bid(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Places a bid on an auction (CZ_AUCTION_BUY). /// 024f <auction id>.L <money>.L void clif_parse_Auction_bid(int fd, struct map_session_data *sd) @@ -15036,7 +15141,7 @@ void clif_parse_Auction_bid(int fd, struct map_session_data *sd) } } - +void clif_parse_Auction_search(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Auction Search (CZ_AUCTION_ITEM_SEARCH). /// 0251 <search type>.W <auction id>.L <search text>.24B <page number>.W /// search type: @@ -15061,7 +15166,7 @@ void clif_parse_Auction_search(int fd, struct map_session_data* sd) intif->Auction_requestlist(sd->status.char_id, type, price, search_text, page); } - +void clif_parse_Auction_buysell(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Requests list of own currently active bids or auctions (CZ_AUCTION_REQ_MY_INFO). /// 025c <type>.W /// type: @@ -15079,7 +15184,6 @@ void clif_parse_Auction_buysell(int fd, struct map_session_data* sd) intif->Auction_requestlist(sd->status.char_id, type, 0, "", 1); } - /// CASH/POINT SHOP /// @@ -15146,9 +15250,11 @@ void clif_cashshop_show(struct map_session_data *sd, struct npc_data *nd) { /// For error return codes see enum cashshop_error@clif.h void clif_cashshop_ack(struct map_session_data* sd, int error) { struct npc_data *nd; - int fd = sd->fd; + int fd; int currency[2] = { 0,0 }; + nullpo_retv(sd); + fd = sd->fd; if( (nd = map->id2nd(sd->npc_shopid)) && nd->subtype == SCRIPT ) { npc->trader_count_funds(nd,sd); currency[0] = npc->trader_funds[0]; @@ -15170,7 +15276,7 @@ void clif_cashshop_ack(struct map_session_data* sd, int error) { WFIFOSET(fd, packet_len(0x289)); } - +void clif_parse_cashshop_buy(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to buy item(s) from cash shop (CZ_PC_BUY_CASH_POINT_ITEM). /// 0288 <name id>.W <amount>.W /// 0288 <name id>.W <amount>.W <kafra points>.L (PACKETVER >= 20070711) @@ -15178,7 +15284,6 @@ void clif_cashshop_ack(struct map_session_data* sd, int error) { void clif_parse_cashshop_buy(int fd, struct map_session_data *sd) { int fail = 0; - nullpo_retv(sd); if( sd->state.trading || !sd->npc_shopid || pc_has_permission(sd,PC_PERM_DISABLE_STORE) ) fail = 1; @@ -15206,7 +15311,6 @@ void clif_parse_cashshop_buy(int fd, struct map_session_data *sd) clif->cashshop_ack(sd,fail); } - /// Adoption System /// @@ -15218,20 +15322,24 @@ void clif_parse_cashshop_buy(int fd, struct map_session_data *sd) /// 2 = "You cannot adopt a married person." void clif_Adopt_reply(struct map_session_data *sd, int type) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,6); WFIFOW(fd,0) = 0x216; WFIFOL(fd,2) = type; WFIFOSET(fd,6); } - /// Adoption confirmation (ZC_REQ_BABY). /// 01f6 <account id>.L <char id>.L <name>.B void clif_Adopt_request(struct map_session_data *sd, struct map_session_data *src, int p_id) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + nullpo_retv(src); + fd = sd->fd; WFIFOHEAD(fd,34); WFIFOW(fd,0) = 0x1f6; WFIFOL(fd,2) = src->status.account_id; @@ -15240,7 +15348,7 @@ void clif_Adopt_request(struct map_session_data *sd, struct map_session_data *sr WFIFOSET(fd,34); } - +void clif_parse_Adopt_request(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to adopt a player (CZ_REQ_JOIN_BABY). /// 01f9 <account id>.L void clif_parse_Adopt_request(int fd, struct map_session_data *sd) { @@ -15252,7 +15360,7 @@ void clif_parse_Adopt_request(int fd, struct map_session_data *sd) { } } - +void clif_parse_Adopt_reply(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Answer to adopt confirmation (CZ_JOIN_BABY). /// 01f7 <account id>.L <char id>.L <answer>.L /// answer: @@ -15280,7 +15388,6 @@ void clif_parse_Adopt_reply(int fd, struct map_session_data *sd) { pc->adoption(p1_sd, p2_sd, sd); } - /// Convex Mirror (ZC_BOSS_INFO). /// 0293 <infoType>.B <x>.L <y>.L <minHours>.W <minMinutes>.W <maxHours>.W <maxMinutes>.W <monster name>.51B /// infoType: @@ -15322,7 +15429,7 @@ void clif_bossmapinfo(int fd, struct mob_data *md, short flag) WFIFOSET(fd,70); } - +void clif_parse_ViewPlayerEquip(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Requesting equip of a player (CZ_EQUIPWIN_MICROSCOPE). /// 02d6 <account id>.L void clif_parse_ViewPlayerEquip(int fd, struct map_session_data* sd) { @@ -15338,7 +15445,7 @@ void clif_parse_ViewPlayerEquip(int fd, struct map_session_data* sd) { clif->msgtable(sd, MSG_EQUIP_NOT_PUBLIC); } - +void clif_parse_EquipTick(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to change equip window tick (CZ_CONFIG). /// 02d8 <type>.L <value>.L /// type: @@ -15353,6 +15460,7 @@ void clif_parse_EquipTick(int fd, struct map_session_data* sd) clif->equiptickack(sd, flag); } +void clif_parse_PartyTick(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to change party invitation tick. /// value: /// 0 = disabled @@ -15375,12 +15483,16 @@ void clif_quest_send_list(struct map_session_data *sd) int i; #if PACKETVER >= 20141022 int info_len = 15; - int len = sd->avail_quests*info_len+8; + int len; + nullpo_retv(sd); + len = sd->avail_quests*info_len+8; WFIFOHEAD(fd,len); WFIFOW(fd, 0) = 0x97a; #else int info_len = 5; - int len = sd->avail_quests*info_len+8; + int len; + nullpo_retv(sd); + len = sd->avail_quests*info_len+8; WFIFOHEAD(fd,len); WFIFOW(fd, 0) = 0x2b1; #endif @@ -15399,20 +15511,20 @@ void clif_quest_send_list(struct map_session_data *sd) WFIFOW(fd, i*info_len+21) = qi->objectives_count; #endif } - WFIFOSET(fd, len); } - /// Sends list of all quest missions (ZC_ALL_QUEST_MISSION). /// 02b2 <packet len>.W <num>.L { <quest id>.L <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3 }*num void clif_quest_send_mission(struct map_session_data *sd) { int fd = sd->fd; int i, j; - int len = sd->avail_quests*104+8; + int len; struct mob_db *monster; + nullpo_retv(sd); + len = sd->avail_quests*104+8; WFIFOHEAD(fd, len); WFIFOW(fd, 0) = 0x2b2; WFIFOW(fd, 2) = len; @@ -15436,15 +15548,18 @@ void clif_quest_send_mission(struct map_session_data *sd) WFIFOSET(fd, len); } - /// Notification about a new quest (ZC_ADD_QUEST). /// 02b3 <quest id>.L <active>.B <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3 void clif_quest_add(struct map_session_data *sd, struct quest *qd) { - int fd = sd->fd; + int fd; int i; - struct quest_db *qi = quest->db(qd->quest_id); + struct quest_db *qi; + nullpo_retv(sd); + nullpo_retv(qd); + fd = sd->fd; + qi = quest->db(qd->quest_id); WFIFOHEAD(fd, packet_len(0x2b3)); WFIFOW(fd, 0) = 0x2b3; WFIFOL(fd, 2) = qd->quest_id; @@ -15464,27 +15579,33 @@ void clif_quest_add(struct map_session_data *sd, struct quest *qd) WFIFOSET(fd, packet_len(0x2b3)); } - /// Notification about a quest being removed (ZC_DEL_QUEST). /// 02b4 <quest id>.L void clif_quest_delete(struct map_session_data *sd, int quest_id) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd, packet_len(0x2b4)); WFIFOW(fd, 0) = 0x2b4; WFIFOL(fd, 2) = quest_id; WFIFOSET(fd, packet_len(0x2b4)); } - /// Notification of an update to the hunting mission counter (ZC_UPDATE_MISSION_HUNT). /// 02b5 <packet len>.W <mobs>.W { <quest id>.L <mob id>.L <total count>.W <current count>.W }*3 void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd) { - int fd = sd->fd; + int fd; int i; - struct quest_db *qi = quest->db(qd->quest_id); - int len = qi->objectives_count*12+6; + struct quest_db *qi; + int len; + + nullpo_retv(sd); + nullpo_retv(qd); + fd = sd->fd; + qi = quest->db(qd->quest_id); + len = qi->objectives_count * 12 + 6; WFIFOHEAD(fd, len); WFIFOW(fd, 0) = 0x2b5; @@ -15501,19 +15622,20 @@ void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd) WFIFOSET(fd, len); } - +void clif_parse_questStateAck(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Request to change the state of a quest (CZ_ACTIVE_QUEST). /// 02b6 <quest id>.L <active>.B void clif_parse_questStateAck(int fd, struct map_session_data *sd) { quest->update_status(sd, RFIFOL(fd,2), RFIFOB(fd,6)?Q_ACTIVE:Q_INACTIVE); } - /// Notification about the change of a quest state (ZC_ACTIVE_QUEST). /// 02b7 <quest id>.L <active>.B void clif_quest_update_status(struct map_session_data *sd, int quest_id, bool active) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd, packet_len(0x2b7)); WFIFOW(fd, 0) = 0x2b7; WFIFOL(fd, 2) = quest_id; @@ -15521,7 +15643,6 @@ void clif_quest_update_status(struct map_session_data *sd, int quest_id, bool ac WFIFOSET(fd, packet_len(0x2b7)); } - /// Notification about an NPC's quest state (ZC_QUEST_NOTIFY_EFFECT). /// 0446 <npc id>.L <x>.W <y>.W <effect>.W <type>.W /// effect: @@ -15536,8 +15657,11 @@ void clif_quest_update_status(struct map_session_data *sd, int quest_id, bool ac void clif_quest_show_event(struct map_session_data *sd, struct block_list *bl, short state, short color) { #if PACKETVER >= 20090218 - int fd = sd->fd; + int fd; + nullpo_retv(sd); + nullpo_retv(bl); + fd = sd->fd; WFIFOHEAD(fd, packet_len(0x446)); WFIFOW(fd, 0) = 0x446; WFIFOL(fd, 2) = bl->id; @@ -15549,7 +15673,6 @@ void clif_quest_show_event(struct map_session_data *sd, struct block_list *bl, s #endif } - /// Mercenary System /// @@ -15617,7 +15740,6 @@ void clif_mercenary_updatestatus(struct map_session_data *sd, int type) { WFIFOSET(fd,packet_len(0x2a2)); } - /// Mercenary base status data (ZC_MER_INIT). /// 029b <id>.L <atk>.W <matk>.W <hit>.W <crit>.W <def>.W <mdef>.W <flee>.W <aspd>.W /// <name>.24B <level>.W <hp>.L <maxhp>.L <sp>.L <maxsp>.L <expire time>.L <faith>.W @@ -15676,7 +15798,6 @@ void clif_mercenary_info(struct map_session_data *sd) { WFIFOSET(fd,packet_len(0x29b)); } - /// Mercenary skill tree (ZC_MER_SKILLINFO_LIST). /// 029d <packet len>.W { <skill id>.W <type>.L <level>.W <sp cost>.W <attack range>.W <skill name>.24B <upgradeable>.B }* void clif_mercenary_skillblock(struct map_session_data *sd) @@ -15714,7 +15835,7 @@ void clif_mercenary_skillblock(struct map_session_data *sd) WFIFOSET(fd,len); } - +void clif_parse_mercenary_action(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to invoke a mercenary menu action (CZ_MER_COMMAND). /// 029f <command>.B /// 1 = mercenary information @@ -15729,7 +15850,6 @@ void clif_parse_mercenary_action(int fd, struct map_session_data* sd) mercenary->delete(sd->md, 2); } - /// Mercenary Message /// message: /// 0 = Mercenary soldier's duty hour is over. @@ -15741,7 +15861,6 @@ void clif_mercenary_message(struct map_session_data* sd, int message) clif->msgtable(sd, MSG_MERCENARY_EXPIRED + message); } - /// Notification about the remaining time of a rental item (ZC_CASH_TIME_COUNTER). /// 0298 <name id>.W <seconds>.L void clif_rental_time(int fd, int nameid, int seconds) @@ -15753,7 +15872,6 @@ void clif_rental_time(int fd, int nameid, int seconds) WFIFOSET(fd,packet_len(0x298)); } - /// Deletes a rental item from client's inventory (ZC_CASH_ITEM_DELETE). /// 0299 <index>.W <name id>.W void clif_rental_expired(int fd, int index, int nameid) @@ -15765,7 +15883,6 @@ void clif_rental_expired(int fd, int index, int nameid) WFIFOSET(fd,packet_len(0x299)); } - /// Book Reading (ZC_READ_BOOK). /// 0294 <book id>.L <page>.L void clif_readbook(int fd, int book_id, int page) @@ -15777,7 +15894,6 @@ void clif_readbook(int fd, int book_id, int page) WFIFOSET(fd,packet_len(0x294)); } - /// Battlegrounds /// @@ -15807,7 +15923,6 @@ void clif_bg_hp(struct map_session_data *sd) clif->send(buf, packet_len(cmd), &sd->bl, BG_AREA_WOS); } - /// Updates the position of a camp member on the minimap (ZC_BATTLEFIELD_NOTIFY_POSITION). /// 02df <account id>.L <name>.24B <class>.W <x>.W <y>.W void clif_bg_xy(struct map_session_data *sd) @@ -15840,14 +15955,16 @@ void clif_bg_xy_remove(struct map_session_data *sd) clif->send(buf, packet_len(0x2df), &sd->bl, BG_SAMEMAP_WOS); } - /// Notifies clients of a battleground message (ZC_BATTLEFIELD_CHAT). /// 02dc <packet len>.W <account id>.L <name>.24B <message>.?B void clif_bg_message(struct battleground_data *bgd, int src_id, const char *name, const char *mes, size_t len) { struct map_session_data *sd; unsigned char *buf; - + + nullpo_retv(bgd); + nullpo_retv(name); + nullpo_retv(mes); if( !bgd->count || (sd = bg->getavailablesd(bgd)) == NULL ) return; @@ -15863,7 +15980,7 @@ void clif_bg_message(struct battleground_data *bgd, int src_id, const char *name aFree(buf); } - +void clif_parse_BattleChat(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Validates and processes battlechat messages [pakpil] (CZ_BATTLEFIELD_CHAT). /// 0x2db <packet len>.W <text>.?B (<name> : <message>) 00 void clif_parse_BattleChat(int fd, struct map_session_data* sd) @@ -15895,7 +16012,6 @@ void clif_parse_BattleChat(int fd, struct map_session_data* sd) bg->send_message(sd, text, textlen); } - /// Notifies client of a battleground score change (ZC_BATTLEFIELD_NOTIFY_POINT). /// 02de <camp A points>.W <camp B points>.W void clif_bg_updatescore(int16 m) { @@ -15924,7 +16040,6 @@ void clif_bg_updatescore_single(struct map_session_data *sd) { WFIFOSET(fd,packet_len(0x2de)); } - /// Battleground camp belong-information (ZC_BATTLEFIELD_NOTIFY_CAMPINFO). /// 02dd <account id>.L <name>.24B <camp>.W void clif_sendbgemblem_area(struct map_session_data *sd) @@ -15950,7 +16065,6 @@ void clif_sendbgemblem_single(int fd, struct map_session_data *sd) WFIFOSET(fd,packet_len(0x2dd)); } - /// Custom Fonts (ZC_NOTIFY_FONT). /// 02ef <account_id>.L <font id>.W void clif_font(struct map_session_data *sd) @@ -15965,7 +16079,6 @@ void clif_font(struct map_session_data *sd) #endif } - /*========================================== * Instancing Window *------------------------------------------*/ @@ -16074,15 +16187,17 @@ void clif_instance_leave(int fd) WFIFOSET(fd,packet_len(0x02CE)); } - /// Notifies clients about item picked up by a party member (ZC_ITEM_PICKUP_PARTY). /// 02b8 <account id>.L <name id>.W <identified>.B <damaged>.B <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W <equip location>.W <item type>.B void clif_party_show_picker(struct map_session_data * sd, struct item * item_data) { #if PACKETVER >= 20071002 unsigned char buf[22]; - struct item_data* id = itemdb->search(item_data->nameid); + struct item_data* id; + nullpo_retv(sd); + nullpo_retv(item_data); + id = itemdb->search(item_data->nameid); WBUFW(buf,0) = 0x2b8; WBUFL(buf,2) = sd->status.account_id; WBUFW(buf,6) = item_data->nameid; @@ -16096,7 +16211,6 @@ void clif_party_show_picker(struct map_session_data * sd, struct item * item_dat #endif } - /// Display gained exp (ZC_NOTIFY_EXP). /// 07f6 <account id>.L <amount>.L <var id>.W <exp type>.W /// var id: @@ -16120,7 +16234,6 @@ void clif_displayexp(struct map_session_data *sd, unsigned int exp, char type, b WFIFOSET(fd,packet_len(0x7f6)); } - /// Displays digital clock digits on top of the screen (ZC_SHOWDIGIT). /// type: /// 0 = Displays 'value' for 5 seconds. @@ -16131,6 +16244,7 @@ void clif_displayexp(struct map_session_data *sd, unsigned int exp, char type, b /// Except for type 3 it is interpreted as seconds for displaying as DD:HH:MM:SS, HH:MM:SS, MM:SS or SS (leftmost '00' is not displayed). void clif_showdigit(struct map_session_data* sd, unsigned char type, int value) { + nullpo_retv(sd); WFIFOHEAD(sd->fd, packet_len(0x1b1)); WFIFOW(sd->fd,0) = 0x1b1; WFIFOB(sd->fd,2) = type; @@ -16138,7 +16252,7 @@ void clif_showdigit(struct map_session_data* sd, unsigned char type, int value) WFIFOSET(sd->fd, packet_len(0x1b1)); } - +void clif_parse_LessEffect(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Notification of the state of client command /effect (CZ_LESSEFFECT). /// 021d <state>.L /// state: @@ -16158,6 +16272,7 @@ void clif_parse_LessEffect(int fd, struct map_session_data* sd) sd->state.lesseffect = ( isLess != 0 ); } +void clif_parse_ItemListWindowSelected(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// S 07e4 <length>.w <option>.l <val>.l {<index>.w <amount>.w).4b* void clif_parse_ItemListWindowSelected(int fd, struct map_session_data* sd) { int n = (RFIFOW(fd,2)-12) / 4; @@ -16246,7 +16361,6 @@ void clif_elemental_info(struct map_session_data *sd) { WFIFOSET(fd,22); } - /// Buying Store System /// @@ -16254,15 +16368,17 @@ void clif_elemental_info(struct map_session_data *sd) { /// 0810 <slots>.B void clif_buyingstore_open(struct map_session_data* sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x810)); WFIFOW(fd,0) = 0x810; WFIFOB(fd,2) = sd->buyingstore.slots; WFIFOSET(fd,packet_len(0x810)); } - +void clif_parse_ReqOpenBuyingStore(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to create a buying store (CZ_REQ_OPEN_BUYING_STORE). /// 0811 <packet len>.W <limit zeny>.L <result>.B <store name>.80B { <name id>.W <amount>.W <price>.L }* /// result: @@ -16304,7 +16420,6 @@ void clif_parse_ReqOpenBuyingStore(int fd, struct map_session_data* sd) { buyingstore->create(sd, zenylimit, result, storename, itemlist, count); } - /// Notification, that the requested buying store could not be created (ZC_FAILED_OPEN_BUYING_STORE_TO_BUYER). /// 0812 <result>.W <total weight>.L /// result: @@ -16314,8 +16429,10 @@ void clif_parse_ReqOpenBuyingStore(int fd, struct map_session_data* sd) { /// ? = nothing void clif_buyingstore_open_failed(struct map_session_data* sd, unsigned short result, unsigned int weight) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x812)); WFIFOW(fd,0) = 0x812; WFIFOW(fd,2) = result; @@ -16323,14 +16440,15 @@ void clif_buyingstore_open_failed(struct map_session_data* sd, unsigned short re WFIFOSET(fd,packet_len(0x812)); } - /// Notification, that the requested buying store was created (ZC_MYITEMLIST_BUYING_STORE). /// 0813 <packet len>.W <account id>.L <limit zeny>.L { <price>.L <count>.W <type>.B <name id>.W }* void clif_buyingstore_myitemlist(struct map_session_data* sd) { - int fd = sd->fd; + int fd; unsigned int i; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,12+sd->buyingstore.slots*9); WFIFOW(fd,0) = 0x813; WFIFOW(fd,2) = 12+sd->buyingstore.slots*9; @@ -16348,13 +16466,13 @@ void clif_buyingstore_myitemlist(struct map_session_data* sd) WFIFOSET(fd,WFIFOW(fd,2)); } - /// Notifies clients in area of a buying store (ZC_BUYING_STORE_ENTRY). /// 0814 <account id>.L <store name>.80B void clif_buyingstore_entry(struct map_session_data* sd) { uint8 buf[86]; + nullpo_retv(sd); WBUFW(buf,0) = 0x814; WBUFL(buf,2) = sd->bl.id; memcpy(WBUFP(buf,6), sd->message, MESSAGE_SIZE); @@ -16363,8 +16481,10 @@ void clif_buyingstore_entry(struct map_session_data* sd) } void clif_buyingstore_entry_single(struct map_session_data* sd, struct map_session_data* pl_sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x814)); WFIFOW(fd,0) = 0x814; WFIFOL(fd,2) = pl_sd->bl.id; @@ -16372,20 +16492,20 @@ void clif_buyingstore_entry_single(struct map_session_data* sd, struct map_sessi WFIFOSET(fd,packet_len(0x814)); } - +void clif_parse_ReqCloseBuyingStore(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to close own buying store (CZ_REQ_CLOSE_BUYING_STORE). /// 0815 void clif_parse_ReqCloseBuyingStore(int fd, struct map_session_data* sd) { buyingstore->close(sd); } - /// Notifies clients in area that a buying store was closed (ZC_DISAPPEAR_BUYING_STORE_ENTRY). /// 0816 <account id>.L void clif_buyingstore_disappear_entry(struct map_session_data* sd) { uint8 buf[6]; + nullpo_retv(sd); WBUFW(buf,0) = 0x816; WBUFL(buf,2) = sd->bl.id; @@ -16393,15 +16513,17 @@ void clif_buyingstore_disappear_entry(struct map_session_data* sd) } void clif_buyingstore_disappear_entry_single(struct map_session_data* sd, struct map_session_data* pl_sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + nullpo_retv(pl_sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x816)); WFIFOW(fd,0) = 0x816; WFIFOL(fd,2) = pl_sd->bl.id; WFIFOSET(fd,packet_len(0x816)); } - /// Request to open someone else's buying store (CZ_REQ_CLICK_TO_BUYING_STORE). /// 0817 <account id>.L void clif_parse_ReqClickBuyingStore(int fd, struct map_session_data* sd) @@ -16413,14 +16535,16 @@ void clif_parse_ReqClickBuyingStore(int fd, struct map_session_data* sd) buyingstore->open(sd, account_id); } - /// Sends buying store item list (ZC_ACK_ITEMLIST_BUYING_STORE). /// 0818 <packet len>.W <account id>.L <store id>.L <limit zeny>.L { <price>.L <amount>.W <type>.B <name id>.W }* void clif_buyingstore_itemlist(struct map_session_data* sd, struct map_session_data* pl_sd) { - int fd = sd->fd; + int fd; unsigned int i; + nullpo_retv(sd); + nullpo_retv(pl_sd); + fd = sd->fd; WFIFOHEAD(fd,16+pl_sd->buyingstore.slots*9); WFIFOW(fd,0) = 0x818; WFIFOW(fd,2) = 16+pl_sd->buyingstore.slots*9; @@ -16439,7 +16563,7 @@ void clif_buyingstore_itemlist(struct map_session_data* sd, struct map_session_d WFIFOSET(fd,WFIFOW(fd,2)); } - +void clif_parse_ReqTradeBuyingStore(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to sell items to a buying store (CZ_REQ_TRADE_BUYING_STORE). /// 0819 <packet len>.W <account id>.L <store id>.L { <index>.W <name id>.W <amount>.W }* void clif_parse_ReqTradeBuyingStore(int fd, struct map_session_data* sd) { @@ -16474,7 +16598,6 @@ void clif_parse_ReqTradeBuyingStore(int fd, struct map_session_data* sd) { buyingstore->trade(sd, account_id, buyer_id, itemlist, count); } - /// Notifies the buyer, that the buying store has been closed due to a post-trade condition (ZC_FAILED_TRADE_BUYING_STORE_TO_BUYER). /// 081a <result>.W /// result: @@ -16483,21 +16606,24 @@ void clif_parse_ReqTradeBuyingStore(int fd, struct map_session_data* sd) { /// ? = nothing void clif_buyingstore_trade_failed_buyer(struct map_session_data* sd, short result) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x81a)); WFIFOW(fd,0) = 0x81a; WFIFOW(fd,2) = result; WFIFOSET(fd,packet_len(0x81a)); } - /// Updates the zeny limit and an item in the buying store item list (ZC_UPDATE_ITEM_FROM_BUYING_STORE). /// 081b <name id>.W <amount>.W <limit zeny>.L void clif_buyingstore_update_item(struct map_session_data* sd, unsigned short nameid, unsigned short amount) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x81b)); WFIFOW(fd,0) = 0x81b; WFIFOW(fd,2) = nameid; @@ -16506,7 +16632,6 @@ void clif_buyingstore_update_item(struct map_session_data* sd, unsigned short na WFIFOSET(fd,packet_len(0x81b)); } - /// Deletes item from inventory, that was sold to a buying store (ZC_ITEM_DELETE_BUYING_STORE). /// 081c <index>.W <amount>.W <price>.L /// message: @@ -16515,8 +16640,10 @@ void clif_buyingstore_update_item(struct map_session_data* sd, unsigned short na /// NOTE: This function has to be called _instead_ of clif_delitem/clif_dropitem. void clif_buyingstore_delete_item(struct map_session_data* sd, short index, unsigned short amount, int price) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x81c)); WFIFOW(fd,0) = 0x81c; WFIFOW(fd,2) = index+2; @@ -16525,7 +16652,6 @@ void clif_buyingstore_delete_item(struct map_session_data* sd, short index, unsi WFIFOSET(fd,packet_len(0x81c)); } - /// Notifies the seller, that a buying store trade failed (ZC_FAILED_TRADE_BUYING_STORE_TO_SELLER). /// 0824 <result>.W <name id>.W /// result: @@ -16535,8 +16661,10 @@ void clif_buyingstore_delete_item(struct map_session_data* sd, short index, unsi /// ? = nothing void clif_buyingstore_trade_failed_seller(struct map_session_data* sd, short result, unsigned short nameid) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x824)); WFIFOW(fd,0) = 0x824; WFIFOW(fd,2) = result; @@ -16544,7 +16672,7 @@ void clif_buyingstore_trade_failed_seller(struct map_session_data* sd, short res WFIFOSET(fd,packet_len(0x824)); } - +void clif_parse_SearchStoreInfo(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Search Store Info System /// @@ -16600,7 +16728,6 @@ void clif_parse_SearchStoreInfo(int fd, struct map_session_data* sd) { searchstore->query(sd, type, min_price, max_price, (const unsigned short*)itemlist, item_count, (const unsigned short*)cardlist, card_count); } - /// Results for a store search request (ZC_SEARCH_STORE_INFO_ACK). /// 0836 <packet len>.W <is first page>.B <is next page>.B <remaining uses>.B { <store id>.L <account id>.L <shop name>.80B <nameid>.W <item type>.B <price>.L <amount>.W <refine>.B <card1>.W <card2>.W <card3>.W <card4>.W }* /// is first page: @@ -16612,9 +16739,11 @@ void clif_parse_SearchStoreInfo(int fd, struct map_session_data* sd) { void clif_search_store_info_ack(struct map_session_data* sd) { const unsigned int blocksize = MESSAGE_SIZE+26; - int fd = sd->fd; + int fd; unsigned int i, start, end; + nullpo_retv(sd); + fd = sd->fd; start = sd->searchstore.pages*SEARCHSTORE_RESULTS_PER_PAGE; end = min(sd->searchstore.count, start+SEARCHSTORE_RESULTS_PER_PAGE); @@ -16650,7 +16779,6 @@ void clif_search_store_info_ack(struct map_session_data* sd) WFIFOSET(fd,WFIFOW(fd,2)); } - /// Notification of failure when searching for stores (ZC_SEARCH_STORE_INFO_FAILED). /// 0837 <reason>.B /// reason: @@ -16661,15 +16789,17 @@ void clif_search_store_info_ack(struct map_session_data* sd) /// 4 = "No sale (purchase) information available." (0x705) void clif_search_store_info_failed(struct map_session_data* sd, unsigned char reason) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x837)); WFIFOW(fd,0) = 0x837; WFIFOB(fd,2) = reason; WFIFOSET(fd,packet_len(0x837)); } - +void clif_parse_SearchStoreInfoNextPage(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to display next page of results (CZ_SEARCH_STORE_INFO_NEXT_PAGE). /// 0838 void clif_parse_SearchStoreInfoNextPage(int fd, struct map_session_data* sd) @@ -16677,7 +16807,6 @@ void clif_parse_SearchStoreInfoNextPage(int fd, struct map_session_data* sd) searchstore->next(sd); } - /// Opens the search store window (ZC_OPEN_SEARCH_STORE_INFO). /// 083a <type>.W <remaining uses>.B /// type: @@ -16685,8 +16814,10 @@ void clif_parse_SearchStoreInfoNextPage(int fd, struct map_session_data* sd) /// 1 = Search Stores (Cash), asks for confirmation, when clicking a store void clif_open_search_store_info(struct map_session_data* sd) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x83a)); WFIFOW(fd,0) = 0x83a; WFIFOW(fd,2) = sd->searchstore.effect; @@ -16696,7 +16827,7 @@ void clif_open_search_store_info(struct map_session_data* sd) WFIFOSET(fd,packet_len(0x83a)); } - +void clif_parse_CloseSearchStoreInfo(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to close the store search window (CZ_CLOSE_SEARCH_STORE_INFO). /// 083b void clif_parse_CloseSearchStoreInfo(int fd, struct map_session_data* sd) @@ -16704,7 +16835,7 @@ void clif_parse_CloseSearchStoreInfo(int fd, struct map_session_data* sd) searchstore->close(sd); } - +void clif_parse_SearchStoreInfoListItemClick(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /// Request to invoke catalog effect on a store from search results (CZ_SSILIST_ITEM_CLICK). /// 083c <account id>.L <store id>.L <nameid>.W void clif_parse_SearchStoreInfoListItemClick(int fd, struct map_session_data* sd) @@ -16720,13 +16851,14 @@ void clif_parse_SearchStoreInfoListItemClick(int fd, struct map_session_data* sd searchstore->click(sd, account_id, store_id, nameid); } - /// Notification of the store position on current map (ZC_SSILIST_ITEM_CLICK_ACK). /// 083d <xPos>.W <yPos>.W void clif_search_store_info_click_ack(struct map_session_data* sd, short x, short y) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x83d)); WFIFOW(fd,0) = 0x83d; WFIFOW(fd,2) = x; @@ -16734,7 +16866,6 @@ void clif_search_store_info_click_ack(struct map_session_data* sd, short x, shor WFIFOSET(fd,packet_len(0x83d)); } - /// Parse function for packet debugging. void clif_parse_debug(int fd,struct map_session_data *sd) { int cmd, packet_len; @@ -16765,7 +16896,6 @@ int clif_elementalconverter_list(struct map_session_data *sd) { nullpo_ret(sd); - /// Main client packet processing function fd=sd->fd; WFIFOHEAD(fd, MAX_SKILL_PRODUCE_DB *2+4); @@ -16796,6 +16926,7 @@ void clif_millenniumshield(struct block_list *bl, short shields ) { #if PACKETVER >= 20081217 unsigned char buf[10]; + nullpo_retv(bl); WBUFW(buf,0) = 0x440; WBUFL(buf,2) = bl->id; WBUFW(buf,6) = shields; @@ -16974,6 +17105,8 @@ int clif_skill_itemlistwindow( struct map_session_data *sd, uint16 skill_id, uin return 1; } + +void clif_parse_SkillSelectMenu(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /*========================================== * used by SC_AUTOSHADOWSPELL * RFIFOL(fd,2) - flag (currently not used) @@ -16993,6 +17126,7 @@ void clif_parse_SkillSelectMenu(int fd, struct map_session_data *sd) { clif_menuskill_clear(sd); } + /*========================================== * Kagerou/Oboro amulet spirit *------------------------------------------*/ @@ -17008,6 +17142,8 @@ void clif_charm(struct map_session_data *sd) WBUFW(buf,8) = sd->charm_count; clif->send(buf,packet_len(0x08cf),&sd->bl,AREA); } + +void clif_parse_MoveItem(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /// Move Item from or to Personal Tab (CZ_WHATSOEVER) [FE] /// 0907 <index>.W /// @@ -17039,6 +17175,7 @@ void clif_parse_MoveItem(int fd, struct map_session_data *sd) { clif->favorite_item(sd, index); #endif } + /* [Ind/Hercules] */ void clif_cashshop_db(void) { config_t cashshop_conf; @@ -17090,7 +17227,6 @@ void clif_cashshop_db(void) { } } - RECREATE(clif->cs.data[i], struct hCSData *, ++clif->cs.item_count[i]); CREATE(clif->cs.data[i][ clif->cs.item_count[i] - 1 ], struct hCSData , 1); @@ -17101,15 +17237,17 @@ void clif_cashshop_db(void) { } } - libconfig->destroy(&cashshop_conf); } + libconfig->destroy(&cashshop_conf); ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", item_count_t, config_filename); } /// Items that are in favorite tab of inventory (ZC_ITEM_FAVORITE). /// 0900 <index>.W <favorite>.B void clif_favorite_item(struct map_session_data* sd, unsigned short index) { - int fd = sd->fd; + int fd; + nullpo_retv(sd); + fd = sd->fd; WFIFOHEAD(fd,packet_len(0x908)); WFIFOW(fd,0) = 0x908; WFIFOW(fd,2) = index+2; @@ -17120,6 +17258,7 @@ void clif_favorite_item(struct map_session_data* sd, unsigned short index) { void clif_snap( struct block_list *bl, short x, short y ) { unsigned char buf[10]; + nullpo_retv(bl); WBUFW(buf,0) = 0x8d2; WBUFL(buf,2) = bl->id; WBUFW(buf,6) = x; @@ -17131,17 +17270,22 @@ void clif_snap( struct block_list *bl, short x, short y ) { void clif_monster_hp_bar( struct mob_data* md, struct map_session_data *sd ) { struct packet_monster_hp p; + nullpo_retv(md); + nullpo_retv(sd); p.PacketType = monsterhpType; p.GID = md->bl.id; p.HP = md->status.hp; p.MaxHP = md->status.max_hp; - clif->send(&p,sizeof(p),&sd->bl,SELF); + clif->send(&p, sizeof(p), &sd->bl, SELF); } + /* [Ind/Hercules] placeholder for unsupported incoming packets (avoids server disconnecting client) */ void __attribute__ ((unused)) clif_parse_dull(int fd,struct map_session_data *sd) { return; } + +void clif_parse_CashShopOpen(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_CashShopOpen(int fd, struct map_session_data *sd) { if (map->list[sd->bl.m].flag.nocashshop) { @@ -17156,10 +17300,12 @@ void clif_parse_CashShopOpen(int fd, struct map_session_data *sd) { WFIFOSET(fd, 10); } +void clif_parse_CashShopClose(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_CashShopClose(int fd, struct map_session_data *sd) { /* TODO apply some state tracking */ } +void clif_parse_CashShopSchedule(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_CashShopSchedule(int fd, struct map_session_data *sd) { int i, j = 0; @@ -17181,6 +17327,8 @@ void clif_parse_CashShopSchedule(int fd, struct map_session_data *sd) { WFIFOSET(fd, 8 + ( clif->cs.item_count[i] * 6 )); } } + +void clif_parse_CashShopBuy(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_CashShopBuy(int fd, struct map_session_data *sd) { unsigned short limit = RFIFOW(fd, 4), i, j; unsigned int kafra_pay = RFIFOL(fd, 6);// [Ryuuzaki] - These are free cash points (strangely #CASH = main cash currently for us, confusing) @@ -17268,6 +17416,8 @@ void clif_parse_CashShopBuy(int fd, struct map_session_data *sd) { } } + +void clif_parse_CashShopReqTab(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /* [Ind/Hercules] */ void clif_parse_CashShopReqTab(int fd, struct map_session_data *sd) { short tab = RFIFOW(fd, 2); @@ -17333,6 +17483,7 @@ void clif_status_change2(struct block_list *bl, int tid, enum send_target target } void clif_partytickack(struct map_session_data* sd, bool flag) { + nullpo_retv(sd); WFIFOHEAD(sd->fd, packet_len(0x2c9)); WFIFOW(sd->fd, 0) = 0x2c9; @@ -17365,6 +17516,8 @@ void clif_ShowScript(struct block_list* bl, const char* message) { void clif_status_change_end(struct block_list *bl, int tid, enum send_target target, int type) { struct packet_status_change_end p; + nullpo_retv(bl); + if( bl->type == BL_PC && !((TBL_PC*)bl)->state.active ) return; @@ -17385,6 +17538,7 @@ void clif_bgqueue_ack(struct map_session_data *sd, enum BATTLEGROUNDS_QUEUE_ACK default: { struct packet_bgqueue_ack p; + nullpo_retv(sd); p.PacketType = bgqueue_ackType; p.type = response; safestrncpy(p.bg_name, bg->arena[arena_id]->name, sizeof(p.bg_name)); @@ -17395,10 +17549,10 @@ void clif_bgqueue_ack(struct map_session_data *sd, enum BATTLEGROUNDS_QUEUE_ACK } } - void clif_bgqueue_notice_delete(struct map_session_data *sd, enum BATTLEGROUNDS_QUEUE_NOTICE_DELETED response, char *name) { struct packet_bgqueue_notice_delete p; + nullpo_retv(sd); p.PacketType = bgqueue_notice_deleteType; p.type = response; safestrncpy(p.bg_name, name, sizeof(p.bg_name)); @@ -17406,6 +17560,7 @@ void clif_bgqueue_notice_delete(struct map_session_data *sd, enum BATTLEGROUNDS_ clif->send(&p,sizeof(p), &sd->bl, SELF); } +void clif_parse_bgqueue_register(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_bgqueue_register(int fd, struct map_session_data *sd) { struct packet_bgqueue_register *p = P2PTR(fd); struct bg_arena *arena = NULL; @@ -17432,6 +17587,8 @@ void clif_parse_bgqueue_register(int fd, struct map_session_data *sd) { void clif_bgqueue_update_info(struct map_session_data *sd, unsigned char arena_id, int position) { struct packet_bgqueue_update_info p; + nullpo_retv(sd); + Assert_retv(arena_id < bg->arenas); p.PacketType = bgqueue_updateinfoType; safestrncpy(p.bg_name, bg->arena[arena_id]->name, sizeof(p.bg_name)); p.position = position; @@ -17441,15 +17598,18 @@ void clif_bgqueue_update_info(struct map_session_data *sd, unsigned char arena_i clif->send(&p,sizeof(p), &sd->bl, SELF); } +void clif_parse_bgqueue_checkstate(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_bgqueue_checkstate(int fd, struct map_session_data *sd) { struct packet_bgqueue_checkstate *p = P2PTR(fd); + nullpo_retv(sd); if ( sd->bg_queue.arena && sd->bg_queue.type ) { clif->bgqueue_update_info(sd,sd->bg_queue.arena->id,bg->id2pos(sd->bg_queue.arena->queue_id,sd->status.account_id)); } else clif->bgqueue_notice_delete(sd, BGQND_FAIL_NOT_QUEUING,p->bg_name); } +void clif_parse_bgqueue_revoke_req(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_bgqueue_revoke_req(int fd, struct map_session_data *sd) { struct packet_bgqueue_revoke_req *p = P2PTR(fd); @@ -17459,6 +17619,7 @@ void clif_parse_bgqueue_revoke_req(int fd, struct map_session_data *sd) { clif->bgqueue_notice_delete(sd, BGQND_FAIL_NOT_QUEUING,p->bg_name); } +void clif_parse_bgqueue_battlebegin_ack(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_bgqueue_battlebegin_ack(int fd, struct map_session_data *sd) { struct packet_bgqueue_battlebegin_ack *p = P2PTR(fd); struct bg_arena *arena; @@ -17475,6 +17636,7 @@ void clif_parse_bgqueue_battlebegin_ack(int fd, struct map_session_data *sd) { void clif_bgqueue_joined(struct map_session_data *sd, int pos) { struct packet_bgqueue_notify_entry p; + nullpo_retv(sd); p.PacketType = bgqueue_notify_entryType; safestrncpy(p.name,sd->status.name,sizeof(p.name)); p.position = pos; @@ -17491,6 +17653,8 @@ void clif_bgqueue_pcleft(struct map_session_data *sd) { void clif_bgqueue_battlebegins(struct map_session_data *sd, unsigned char arena_id, enum send_target target) { struct packet_bgqueue_battlebegins p; + nullpo_retv(sd); + Assert_retv(arena_id < bg->arenas); p.PacketType = bgqueue_battlebeginsType; safestrncpy(p.bg_name, bg->arena[arena_id]->name, sizeof(p.bg_name)); safestrncpy(p.game_name, bg->arena[arena_id]->name, sizeof(p.game_name)); @@ -17501,15 +17665,18 @@ void clif_bgqueue_battlebegins(struct map_session_data *sd, unsigned char arena_ void clif_scriptclear(struct map_session_data *sd, int npcid) { struct packet_script_clear p; + nullpo_retv(sd); p.PacketType = script_clearType; p.NpcID = npcid; clif->send(&p,sizeof(p), &sd->bl, SELF); } + /* Made Possible Thanks to Yommy! */ void clif_package_item_announce(struct map_session_data *sd, unsigned short nameid, unsigned short containerid) { struct packet_package_item_announce p; + nullpo_retv(sd); p.PacketType = package_item_announceType; p.PacketLength = 11+NAME_LENGTH; p.type = 0x0; @@ -17521,10 +17688,12 @@ void clif_package_item_announce(struct map_session_data *sd, unsigned short name clif->send(&p,sizeof(p), &sd->bl, ALL_CLIENT); } + /* Made Possible Thanks to Yommy! */ void clif_item_drop_announce(struct map_session_data *sd, unsigned short nameid, char *monsterName) { struct packet_item_drop_announce p; + nullpo_retv(sd); p.PacketType = item_drop_announceType; p.PacketLength = sizeof(p); p.type = 0x1; @@ -17536,6 +17705,7 @@ void clif_item_drop_announce(struct map_session_data *sd, unsigned short nameid, clif->send(&p,sizeof(p), &sd->bl, ALL_CLIENT); } + /* [Ind/Hercules] special thanks to Yommy~! */ void clif_skill_cooldown_list(int fd, struct skill_cd* cd) { #if PACKETVER >= 20120604 @@ -17545,6 +17715,8 @@ void clif_skill_cooldown_list(int fd, struct skill_cd* cd) { #endif int i, count = 0; + nullpo_retv(cd); + WFIFOHEAD(fd,4+(offset*cd->cursor)); #if PACKETVER >= 20120604 @@ -17570,6 +17742,7 @@ void clif_skill_cooldown_list(int fd, struct skill_cd* cd) { WFIFOSET(fd,4+(offset*count)); } + /* [Ind/Hercules] - Data Thanks to Yommy * - ADDITEM_TO_CART_FAIL_WEIGHT = 0x0 * - ADDITEM_TO_CART_FAIL_COUNT = 0x1 @@ -17577,11 +17750,14 @@ void clif_skill_cooldown_list(int fd, struct skill_cd* cd) { void clif_cart_additem_ack(struct map_session_data *sd, int flag) { struct packet_cart_additem_ack p; + nullpo_retv(sd); p.PacketType = cart_additem_ackType; p.result = (char)flag; clif->send(&p,sizeof(p), &sd->bl, SELF); } + +void clif_parse_BankDeposit(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /* Bank System [Yommy/Hercules] */ void clif_parse_BankDeposit(int fd, struct map_session_data* sd) { struct packet_banking_deposit_req *p = P2PTR(fd); @@ -17597,6 +17773,7 @@ void clif_parse_BankDeposit(int fd, struct map_session_data* sd) { pc->bank_deposit(sd,money); } +void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) { struct packet_banking_withdraw_req *p = P2PTR(fd); int money; @@ -17611,6 +17788,7 @@ void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) { pc->bank_withdraw(sd,money); } +void clif_parse_BankCheck(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); void clif_parse_BankCheck(int fd, struct map_session_data* sd) { struct packet_banking_check p; @@ -17626,10 +17804,12 @@ void clif_parse_BankCheck(int fd, struct map_session_data* sd) { clif->send(&p,sizeof(p), &sd->bl, SELF); } +void clif_parse_BankOpen(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); void clif_parse_BankOpen(int fd, struct map_session_data* sd) { return; } +void clif_parse_BankClose(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); void clif_parse_BankClose(int fd, struct map_session_data* sd) { return; } @@ -17637,6 +17817,7 @@ void clif_parse_BankClose(int fd, struct map_session_data* sd) { void clif_bank_deposit(struct map_session_data *sd, enum e_BANKING_DEPOSIT_ACK reason) { struct packet_banking_deposit_ack p; + nullpo_retv(sd); p.PacketType = banking_deposit_ackType; p.Balance = sd->status.zeny;/* how much zeny char has after operation */ p.Money = (int64)sd->status.bank_vault;/* money in the bank */ @@ -17644,9 +17825,11 @@ void clif_bank_deposit(struct map_session_data *sd, enum e_BANKING_DEPOSIT_ACK r clif->send(&p,sizeof(p), &sd->bl, SELF); } + void clif_bank_withdraw(struct map_session_data *sd,enum e_BANKING_WITHDRAW_ACK reason) { struct packet_banking_withdraw_ack p; + nullpo_retv(sd); p.PacketType = banking_withdraw_ackType; p.Balance = sd->status.zeny;/* how much zeny char has after operation */ p.Money = (int64)sd->status.bank_vault;/* money in the bank */ @@ -17654,9 +17837,11 @@ void clif_bank_withdraw(struct map_session_data *sd,enum e_BANKING_WITHDRAW_ACK clif->send(&p,sizeof(p), &sd->bl, SELF); } + /* TODO: official response packet (tried 0x8cb/0x97b but the display was quite screwed up.) */ /* currently mimicing */ void clif_show_modifiers (struct map_session_data *sd) { + nullpo_retv(sd); if( sd->status.mod_exp != 100 || sd->status.mod_drop != 100 || sd->status.mod_death != 100 ) { char output[128]; @@ -17671,12 +17856,14 @@ void clif_show_modifiers (struct map_session_data *sd) { void clif_notify_bounditem(struct map_session_data *sd, unsigned short index) { struct packet_notify_bounditem p; + nullpo_retv(sd); p.PacketType = notify_bounditemType; p.index = index+2; clif->send(&p,sizeof(p), &sd->bl, SELF); } +void clif_parse_GMFullStrip(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /** * Parses the (GM) right click option 'remove all equipment' **/ @@ -17693,6 +17880,7 @@ void clif_parse_GMFullStrip(int fd, struct map_session_data *sd) { pc->unequipitem(tsd, tsd->equip_index[i], PCUNEQUIPITEM_FORCE); } } + /** * clif_delay_damage timer, sends the stored data and clears the memory afterwards **/ @@ -17705,6 +17893,7 @@ int clif_delay_damage_sub(int tid, int64 tick, int id, intptr_t data) { return 0; } + /** * Delays sending a damage packet in order to avoid the visual display to overlap * @@ -17736,7 +17925,7 @@ int clif_delay_damage(int64 tick, struct block_list *src, struct block_list *dst if(sc && sc->count && sc->data[SC_ILLUSION]) { if(in_damage) in_damage = in_damage*(sc->data[SC_ILLUSION]->val2) + rnd()%100; } - + #if PACKETVER < 20071113 damage = (short)min(in_damage,INT16_MAX); #else @@ -17777,22 +17966,29 @@ int clif_delay_damage(int64 tick, struct block_list *src, struct block_list *dst return clif->calc_walkdelay(dst,ddelay,type,damage,div); } + +void clif_parse_NPCShopClosed(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); /* Thanks to Yommy */ void clif_parse_NPCShopClosed(int fd, struct map_session_data *sd) { /* TODO track the state <3~ */ sd->npc_shopid = 0; } + /* NPC Market (by Ind after an extensive debugging of the packet, only possible thanks to Yommy <3) */ void clif_npc_market_open(struct map_session_data *sd, struct npc_data *nd) { #if PACKETVER >= 20131223 - struct npc_item_list *shop = nd->u.scr.shop->item; - unsigned short shop_size = nd->u.scr.shop->items, i, c; + struct npc_item_list *shop; + unsigned short shop_size, i, c; + nullpo_retv(sd); + nullpo_retv(nd); + shop = nd->u.scr.shop->item; + shop_size = nd->u.scr.shop->items; npcmarket_open.PacketType = npcmarketopenType; for(i = 0, c = 0; i < shop_size; i++) { struct item_data *id = NULL; - if( shop[i].nameid && (id = itemdb->exists(shop[i].nameid)) ) { + if (shop[i].nameid && (id = itemdb->exists(shop[i].nameid)) != NULL) { npcmarket_open.list[c].nameid = shop[i].nameid; npcmarket_open.list[c].price = shop[i].value; npcmarket_open.list[c].qty = shop[i].qty; @@ -17807,14 +18003,19 @@ void clif_npc_market_open(struct map_session_data *sd, struct npc_data *nd) { clif->send(&npcmarket_open,npcmarket_open.PacketLength,&sd->bl,SELF); #endif } + +void clif_parse_NPCMarketClosed(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_NPCMarketClosed(int fd, struct map_session_data *sd) { /* TODO track the state <3~ */ sd->npc_shopid = 0; } + void clif_npc_market_purchase_ack(struct map_session_data *sd, struct packet_npc_market_purchase *req, unsigned char response) { #if PACKETVER >= 20131223 unsigned short c = 0; + nullpo_retv(sd); + nullpo_retv(req); npcmarket_result.PacketType = npcmarketresultackType; npcmarket_result.result = response == 0 ? 1 : 0;/* find other values */ @@ -17847,6 +18048,8 @@ void clif_npc_market_purchase_ack(struct map_session_data *sd, struct packet_npc clif->send(&npcmarket_result,npcmarket_result.PacketLength,&sd->bl,SELF); #endif } + +void clif_parse_NPCMarketPurchase(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); void clif_parse_NPCMarketPurchase(int fd, struct map_session_data *sd) { #if PACKETVER >= 20131223 struct packet_npc_market_purchase *p = P2PTR(fd); @@ -17854,27 +18057,29 @@ void clif_parse_NPCMarketPurchase(int fd, struct map_session_data *sd) { clif->npc_market_purchase_ack(sd,p,npc->market_buylist(sd,(p->PacketLength - 4) / sizeof(p->list[0]),p)); #endif } - + void clif_PartyLeaderChanged(struct map_session_data *sd, int prev_leader_aid, int new_leader_aid) { struct packet_party_leader_changed p; - + + nullpo_retv(sd); p.PacketType = partyleaderchangedType; - + p.prev_leader_aid = prev_leader_aid; p.new_leader_aid = new_leader_aid; - + clif->send(&p,sizeof(p),&sd->bl,PARTY); } +void clif_parse_RouletteOpen(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /* Roulette System [Yommy/Hercules] */ void clif_parse_RouletteOpen(int fd, struct map_session_data* sd) { struct packet_roulette_open_ack p; - + if( !battle_config.feature_roulette ) { clif->message(fd,"Roulette is disabled"); return; } - + p.PacketType = 0xa1a; p.Result = 0; p.Serial = 0; @@ -17887,6 +18092,8 @@ void clif_parse_RouletteOpen(int fd, struct map_session_data* sd) { clif->send(&p,sizeof(p), &sd->bl, SELF); } + +void clif_parse_RouletteInfo(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); void clif_parse_RouletteInfo(int fd, struct map_session_data* sd) { struct packet_roulette_info_ack p; unsigned short i, j, count = 0; @@ -17895,11 +18102,11 @@ void clif_parse_RouletteInfo(int fd, struct map_session_data* sd) { clif->message(fd,"Roulette is disabled"); return; } - + p.PacketType = rouletteinfoackType; p.PacketLength = 8 + (42 * 8); p.RouletteSerial = 1; - + for(i = 0; i < MAX_ROULETTE_LEVEL; i++) { for(j = 0; j < MAX_ROULETTE_COLUMNS-i; j++) { p.ItemInfo[count].Row = i; @@ -17909,45 +18116,44 @@ void clif_parse_RouletteInfo(int fd, struct map_session_data* sd) { count++; } } - clif->send(&p,sizeof(p), &sd->bl, SELF); return; } + +void clif_parse_RouletteClose(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); void clif_parse_RouletteClose(int fd, struct map_session_data* sd) { - if( !battle_config.feature_roulette ) { clif->message(fd,"Roulette is disabled"); return; } - - + /** What do we need this for? (other than state tracking), game client closes the window without our response. **/ - //ShowDebug("clif_parse_RouletteClose\n"); - + return; } + +void clif_parse_RouletteGenerate(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); void clif_parse_RouletteGenerate(int fd, struct map_session_data* sd) { unsigned char result = GENERATE_ROULETTE_SUCCESS; short stage = sd->roulette.stage; - + if( !battle_config.feature_roulette ) { clif->message(fd,"Roulette is disabled"); return; } - + if( sd->roulette.stage >= MAX_ROULETTE_LEVEL ) stage = sd->roulette.stage = 0; - + if( stage == 0 ) { if( pc_readglobalreg(sd, script->add_str("TmpRouletteBronze")) <= 0 && pc_readglobalreg(sd, script->add_str("TmpRouletteSilver")) < 10 && pc_readglobalreg(sd, script->add_str("TmpRouletteGold")) < 10 ) result = GENERATE_ROULETTE_NO_ENOUGH_POINT; } - + if( result == GENERATE_ROULETTE_SUCCESS ) { - if( stage == 0 ) { if( pc_readglobalreg(sd, script->add_str("TmpRouletteBronze")) > 0 ) { pc_setglobalreg(sd, script->add_str("TmpRouletteBronze"), pc_readglobalreg(sd, script->add_str("TmpRouletteBronze")) - 1); @@ -17959,7 +18165,6 @@ void clif_parse_RouletteGenerate(int fd, struct map_session_data* sd) { stage = sd->roulette.stage = 4; } } - sd->roulette.prizeStage = stage; sd->roulette.prizeIdx = rnd()%clif->rd.items[stage]; if( sd->roulette.prizeIdx == 0 ) { @@ -17968,37 +18173,39 @@ void clif_parse_RouletteGenerate(int fd, struct map_session_data* sd) { it.nameid = clif->rd.nameid[stage][0]; it.identify = 1; - + pc->additem(sd, &it, clif->rd.qty[stage][0], LOG_TYPE_OTHER);/** TODO maybe a new log type for roulette items? **/ - + sd->roulette.stage = 0; result = GENERATE_ROULETTE_LOSING; } else sd->roulette.claimPrize = true; } - + clif->roulette_generate_ack(sd,result,stage,sd->roulette.prizeIdx,0); if( result == GENERATE_ROULETTE_SUCCESS ) sd->roulette.stage++; } + +void clif_parse_RouletteRecvItem(int fd, struct map_session_data* sd) __attribute__((nonnull (2))); /** * Request to cash in! **/ void clif_parse_RouletteRecvItem(int fd, struct map_session_data* sd) { struct packet_roulette_itemrecv_ack p; - + if( !battle_config.feature_roulette ) { clif->message(fd,"Roulette is disabled"); return; } - + p.PacketType = roulettercvitemackType; p.AdditionItemID = 0;/** TODO **/ - + if( sd->roulette.claimPrize ) { struct item it; memset(&it, 0, sizeof(it)); - + it.nameid = clif->rd.nameid[sd->roulette.prizeStage][sd->roulette.prizeIdx]; it.identify = 1; @@ -18025,7 +18232,7 @@ void clif_parse_RouletteRecvItem(int fd, struct map_session_data* sd) { } } else p.Result = RECV_ITEM_FAILED; - + clif->send(&p,sizeof(p), &sd->bl, SELF); return; } @@ -18035,39 +18242,38 @@ bool clif_parse_roulette_db(void) { config_setting_t *roulette = NULL, *levels = NULL; const char *config_filename = "db/roulette_db.conf"; // FIXME hardcoded name int i, j, item_count_t = 0; - + for( i = 0; i < MAX_ROULETTE_LEVEL; i++ ) { clif->rd.items[i] = 0; } - + if (libconfig->read_file(&roulette_conf, config_filename)) { ShowError("can't read %s\n", config_filename); return false; } - roulette = libconfig->lookup(&roulette_conf, "roulette"); - + if( roulette != NULL && (levels = libconfig->setting_get_elem(roulette, 0)) != NULL ) { for(i = 0; i < MAX_ROULETTE_LEVEL; i++) { config_setting_t *level; char entry_name[10]; - + sprintf(entry_name,"level_%d",i+1); - + if( (level = libconfig->setting_get_member(levels, entry_name)) != NULL ) { int k, item_count = libconfig->setting_length(level); - + for(k = 0; k < item_count; k++) { config_setting_t *entry = libconfig->setting_get_elem(level,k); const char *name = config_setting_name(entry); int qty = libconfig->setting_get_int(entry); struct item_data * data = NULL; - + if( qty < 1 ) { ShowWarning("roulette_db: unsupported qty '%d' for entry named '%s' in category '%s'\n", qty, name, entry_name); continue; } - + if( name[0] == 'I' && name[1] == 'D' && strlen(name) <= 7 ) { if( !( data = itemdb->exists(atoi(name+2))) ) { ShowWarning("roulette_db: unknown item id '%s' in category '%s'\n", name+2, entry_name); @@ -18079,26 +18285,25 @@ bool clif_parse_roulette_db(void) { continue; } } - + j = clif->rd.items[i]; RECREATE(clif->rd.nameid[i],int,++clif->rd.items[i]); RECREATE(clif->rd.qty[i],int,clif->rd.items[i]); - + clif->rd.nameid[i][j] = data->nameid; clif->rd.qty[i][j] = qty; - + item_count_t++; } } } - - libconfig->destroy(&roulette_conf); } - + libconfig->destroy(&roulette_conf); + for(i = 0; i < MAX_ROULETTE_LEVEL; i++) { int limit = MAX_ROULETTE_COLUMNS-i; if( clif->rd.items[i] == limit ) continue; - + if( clif->rd.items[i] > limit ) { ShowWarning("roulette_db: level %d has %d items, only %d supported, capping...\n",i+1,clif->rd.items[i],limit); clif->rd.items[i] = limit; @@ -18106,23 +18311,20 @@ bool clif_parse_roulette_db(void) { } /** this scenario = clif->rd.items[i] < limit **/ ShowWarning("roulette_db: level %d has %d items, %d are required. filling with apples\n",i+1,clif->rd.items[i],limit); - + clif->rd.items[i] = limit; RECREATE(clif->rd.nameid[i],int,clif->rd.items[i]); RECREATE(clif->rd.qty[i],int,clif->rd.items[i]); - for(j = 0; j < MAX_ROULETTE_COLUMNS-i; j++) { - if( clif->rd.qty[i][j] ) continue; - + if (clif->rd.qty[i][j]) + continue; clif->rd.nameid[i][j] = ITEMID_APPLE; clif->rd.qty[i][j] = 1; } } - - ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", item_count_t, config_filename); - + return true; } @@ -18132,6 +18334,7 @@ bool clif_parse_roulette_db(void) { void clif_roulette_generate_ack(struct map_session_data *sd, unsigned char result, short stage, short prizeIdx, short bonusItemID) { struct packet_roulette_generate_ack p; + nullpo_retv(sd); p.PacketType = roulettgenerateackType; p.Result = result; p.Step = stage; @@ -18140,32 +18343,31 @@ void clif_roulette_generate_ack(struct map_session_data *sd, unsigned char resul p.RemainBronze = pc_readglobalreg(sd, script->add_str("TmpRouletteBronze")); p.RemainGold = pc_readglobalreg(sd, script->add_str("TmpRouletteGold")); p.RemainSilver = pc_readglobalreg(sd, script->add_str("TmpRouletteSilver")); - + clif->send(&p,sizeof(p), &sd->bl, SELF); } -/** -* Stackable items merger -**/ +/** + * Stackable items merger + */ void clif_openmergeitem(int fd, struct map_session_data *sd) { int i = 0, n = 0, j = 0; struct merge_item merge_items[MAX_INVENTORY]; struct merge_item *merge_items_[MAX_INVENTORY] = {0}; + nullpo_retv(sd); memset(&merge_items,'\0',sizeof(merge_items)); for (i = 0; i < MAX_INVENTORY; i++) { struct item *item_data = &sd->status.inventory[i]; - if (item_data->nameid == 0 || !itemdb->isstackable(item_data->nameid)) + if (item_data->nameid == 0 || !itemdb->isstackable(item_data->nameid) || item_data->bound != IBT_NONE) continue; merge_items[n].nameid = item_data->nameid; merge_items[n].position = i + 2; n++; - - } qsort(merge_items,n,sizeof(struct merge_item),clif->comparemergeitem); @@ -18199,8 +18401,10 @@ int clif_comparemergeitem(const void *a, const void *b) const struct merge_item *a_ = a; const struct merge_item *b_ = b; + nullpo_ret(a); + nullpo_ret(b); if (a_->nameid == b_->nameid) - return 0; + return 0; return a_->nameid > b_->nameid ? -1 : 1; } @@ -18210,8 +18414,9 @@ void clif_ackmergeitems(int fd, struct map_session_data *sd) int16 nameid = 0, indexes[MAX_INVENTORY] = {0}, amounts[MAX_INVENTORY] = {0}; struct item item_data; + nullpo_retv(sd); length = (RFIFOW(fd,2) - 4)/2; - + if (length >= MAX_INVENTORY || length < 2) { WFIFOHEAD(fd,7); WFIFOW(fd,0) = 0x96f; @@ -18231,7 +18436,7 @@ void clif_ackmergeitems(int fd, struct map_session_data *sd) it = &sd->status.inventory[idx]; - if (it->nameid == 0 || !itemdb->isstackable(it->nameid)) + if (it->nameid == 0 || !itemdb->isstackable(it->nameid) || it->bound != IBT_NONE) continue; if (nameid == 0) @@ -18246,7 +18451,6 @@ void clif_ackmergeitems(int fd, struct map_session_data *sd) n++; } - if (n < 2 || count == 0) { WFIFOHEAD(fd,7); WFIFOW(fd,0) = 0x96f; @@ -18270,14 +18474,13 @@ void clif_ackmergeitems(int fd, struct map_session_data *sd) for (i = 0; i < n; i++) pc->delitem(sd,indexes[i],amounts[i],0,DELITEM_NORMAL,LOG_TYPE_NPC); - memset(&item_data,'\0',sizeof(item_data)); item_data.nameid = nameid; item_data.identify = 1; item_data.unique_id = itemdb->unique_id(sd); pc->additem(sd,&item_data,count,LOG_TYPE_NPC); - + ARR_FIND(0,MAX_INVENTORY,i,item_data.unique_id == sd->status.inventory[i].unique_id); WFIFOHEAD(fd,7); @@ -18286,7 +18489,6 @@ void clif_ackmergeitems(int fd, struct map_session_data *sd) WFIFOW(fd,4) = count; WFIFOB(fd,6) = MERGEITEM_SUCCESS; WFIFOSET(fd,7); - } void clif_cancelmergeitem (int fd, struct map_session_data *sd) @@ -18302,11 +18504,13 @@ unsigned short clif_decrypt_cmd( int cmd, struct map_session_data *sd ) { } return (cmd ^ (((( clif->cryptKey[0] * clif->cryptKey[1] ) + clif->cryptKey[2]) >> 16) & 0x7FFF)); } + unsigned short clif_parse_cmd_normal( int fd, struct map_session_data *sd ) { unsigned short cmd = RFIFOW(fd,0); return cmd; } + unsigned short clif_parse_cmd_decrypt( int fd, struct map_session_data *sd ) { unsigned short cmd = RFIFOW(fd,0); @@ -18314,6 +18518,7 @@ unsigned short clif_parse_cmd_decrypt( int fd, struct map_session_data *sd ) { return cmd; } + unsigned short clif_parse_cmd_optional( int fd, struct map_session_data *sd ) { unsigned short cmd = RFIFOW(fd,0); @@ -18475,6 +18680,19 @@ int clif_parse(int fd) { return 0; } +/** + * Returns information about the given packet ID. + * + * @param packet_id The packet ID. + * @return The corresponding packet_db entry, if any. + */ +const struct s_packet_db *clif_packet(int packet_id) +{ + if (packet_id < MIN_PACKET_DB || packet_id > MAX_PACKET_DB || packet_db[packet_id].len == 0) + return NULL; + return &packet_db[packet_id]; +} + static void __attribute__ ((unused)) packetdb_addpacket(short cmd, int len, ...) { va_list va; int i; @@ -18515,14 +18733,13 @@ static void __attribute__ ((unused)) packetdb_addpacket(short cmd, int len, ...) va_end(va); } void packetdb_loaddb(void) { - memset(packet_db,0,sizeof(packet_db)); - - #define packet(id, size, ...) packetdb_addpacket((id), (size), ##__VA_ARGS__, 0xFFFF) - #define packetKeys(a,b,c) do { clif->cryptKey[0] = (a); clif->cryptKey[1] = (b); clif->cryptKey[2] = (c); } while(0) - #include "packets.h" /* load structure data */ - #undef packet - #undef packetKeys + +#define packet(id, size, ...) packetdb_addpacket((id), (size), ##__VA_ARGS__, 0xFFFF) +#define packetKeys(a,b,c) do { clif->cryptKey[0] = (a); clif->cryptKey[1] = (b); clif->cryptKey[2] = (c); } while(0) +#include "packets.h" /* load structure data */ +#undef packet +#undef packetKeys } void clif_bc_ready(void) { if( battle_config.display_status_timers ) @@ -18582,7 +18799,7 @@ void do_final_clif(void) } aFree(clif->cs.data[i]); } - + for(i = 0; i < MAX_ROULETTE_LEVEL; i++) { if( clif->rd.nameid[i] ) aFree(clif->rd.nameid[i]); @@ -18611,6 +18828,7 @@ void clif_defaults(void) { clif->parse = clif_parse; clif->parse_cmd = clif_parse_cmd_optional; clif->decrypt_cmd = clif_decrypt_cmd; + clif->packet = clif_packet; /* auth */ clif->authok = clif_authok; clif->authrefuse = clif_authrefuse; @@ -18623,6 +18841,8 @@ void clif_defaults(void) { clif->dropitem = clif_dropitem; clif->delitem = clif_delitem; clif->takeitem = clif_takeitem; + clif->item_equip = clif_item_equip; + clif->item_normal = clif_item_normal; clif->arrowequip = clif_arrowequip; clif->arrow_fail = clif_arrow_fail; clif->use_card = clif_use_card; @@ -18633,7 +18853,7 @@ void clif_defaults(void) { clif->useitemack = clif_useitemack; clif->addcards = clif_addcards; clif->addcards2 = clif_addcards2; - clif->item_sub = clif_item_sub; + clif->item_sub = clif_item_sub; // look like unused clif->getareachar_item = clif_getareachar_item; clif->cart_additem_ack = clif_cart_additem_ack; clif->cashshop_load = clif_cashshop_db; @@ -18867,7 +19087,7 @@ void clif_defaults(void) { clif->tradedeal_lock = clif_tradedeal_lock; clif->tradecancelled = clif_tradecancelled; clif->tradecompleted = clif_tradecompleted; - clif->tradeundo = clif_tradeundo; + clif->tradeundo = clif_tradeundo; // unused /* vending handling */ clif->openvendingreq = clif_openvendingreq; clif->showvendingboard = clif_showvendingboard; diff --git a/src/map/clif.h b/src/map/clif.h index fdcc929e3..40610b7c1 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -597,6 +597,7 @@ struct clif_interface { int (*send_sub) (struct block_list *bl, va_list ap); int (*send_actual) (int fd, void *buf, int len); int (*parse) (int fd); + const struct s_packet_db *(*packet) (int packet_id); unsigned short (*parse_cmd) ( int fd, struct map_session_data *sd ); unsigned short (*decrypt_cmd) ( int cmd, struct map_session_data *sd ); /* auth */ @@ -611,6 +612,8 @@ struct clif_interface { void (*dropitem) (struct map_session_data *sd,int n,int amount); void (*delitem) (struct map_session_data *sd,int n,int amount, short reason); void (*takeitem) (struct block_list* src, struct block_list* dst); + void (*item_equip) (short idx, struct EQUIPITEM_INFO *p, struct item *i, struct item_data *id, int eqp_pos); + void (*item_normal) (short idx, struct NORMALITEM_INFO *p, struct item *i, struct item_data *id); void (*arrowequip) (struct map_session_data *sd,int val); void (*arrow_fail) (struct map_session_data *sd,int type); void (*use_card) (struct map_session_data *sd,int idx); @@ -1321,11 +1324,6 @@ struct clif_interface { }; #ifdef HERCULES_CORE -/** - * Vars - **/ -extern struct s_packet_db packet_db[MAX_PACKET_DB + 1]; - void clif_defaults(void); #endif // HERCULES_CORE diff --git a/src/map/duel.c b/src/map/duel.c index 762745b75..e18e2fc45 100644 --- a/src/map/duel.c +++ b/src/map/duel.c @@ -10,6 +10,7 @@ #include "map/clif.h" #include "map/pc.h" #include "common/cbasetypes.h" +#include "common/nullpo.h" #include <stdio.h> #include <stdlib.h> @@ -25,10 +26,10 @@ struct duel_interface *duel; void duel_savetime(struct map_session_data* sd) { time_t clock; struct tm *t; - + time(&clock); t = localtime(&clock); - + pc_setglobalreg(sd, script->add_str("PC_LAST_DUEL_TIME"), t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); } @@ -36,22 +37,25 @@ int duel_checktime(struct map_session_data* sd) { int diff; time_t clock; struct tm *t; - + time(&clock); t = localtime(&clock); - + diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, script->add_str("PC_LAST_DUEL_TIME") ); - + return !(diff >= 0 && diff < battle_config.duel_time_interval); } + static int duel_showinfo_sub(struct map_session_data* sd, va_list va) { struct map_session_data *ssd = va_arg(va, struct map_session_data*); int *p = va_arg(va, int*); char output[256]; + nullpo_retr(1, sd); + nullpo_retr(1, ssd); if (sd->duel_group != ssd->duel_group) return 0; - + sprintf(output, " %d. %s", ++(*p), sd->status.name); clif_disp_onlyself(ssd, output, strlen(output)); return 1; @@ -80,19 +84,21 @@ void duel_showinfo(const unsigned int did, struct map_session_data* sd) { int duel_create(struct map_session_data* sd, const unsigned int maxpl) { int i=1; char output[256]; - + + nullpo_ret(sd); + while(i < MAX_DUEL && duel->list[i].members_count > 0) i++; if(i == MAX_DUEL) return 0; - + duel->count++; sd->duel_group = i; duel->list[i].members_count++; duel->list[i].invites_count = 0; duel->list[i].max_players_limit = maxpl; - + safestrncpy(output, msg_sd(sd,372), sizeof(output)); // " -- Duel has been created (@invite/@leave) --" clif_disp_onlyself(sd, output, strlen(output)); - + clif->map_property(sd, MAPPROPERTY_FREEPVPZONE); clif->maptypeproperty2(&sd->bl,SELF); return i; @@ -101,13 +107,15 @@ int duel_create(struct map_session_data* sd, const unsigned int maxpl) { void duel_invite(const unsigned int did, struct map_session_data* sd, struct map_session_data* target_sd) { char output[256]; + nullpo_retv(sd); + nullpo_retv(target_sd); // " -- Player %s invites %s to duel --" sprintf(output, msg_sd(sd,373), sd->status.name, target_sd->status.name); clif->disp_message(&sd->bl, output, strlen(output), DUEL_WOS); target_sd->duel_invite = did; duel->list[did].invites_count++; - + // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" sprintf(output, msg_sd(target_sd,374), sd->status.name); clif->broadcast((struct block_list *)target_sd, output, strlen(output)+1, BC_BLUE, SELF); @@ -116,6 +124,7 @@ void duel_invite(const unsigned int did, struct map_session_data* sd, struct map static int duel_leave_sub(struct map_session_data* sd, va_list va) { int did = va_arg(va, int); + nullpo_ret(sd); if (sd->duel_invite == did) sd->duel_invite = 0; return 0; @@ -123,18 +132,18 @@ static int duel_leave_sub(struct map_session_data* sd, va_list va) void duel_leave(const unsigned int did, struct map_session_data* sd) { char output[256]; - + + nullpo_retv(sd); // " <- Player %s has left duel --" sprintf(output, msg_sd(sd,375), sd->status.name); clif->disp_message(&sd->bl, output, strlen(output), DUEL_WOS); - + duel->list[did].members_count--; - if(duel->list[did].members_count == 0) { map->foreachpc(duel_leave_sub, did); duel->count--; } - + sd->duel_group = 0; duel_savetime(sd); clif->map_property(sd, MAPPROPERTY_NOTHING); @@ -143,12 +152,13 @@ void duel_leave(const unsigned int did, struct map_session_data* sd) { void duel_accept(const unsigned int did, struct map_session_data* sd) { char output[256]; - + + nullpo_retv(sd); duel->list[did].members_count++; sd->duel_group = sd->duel_invite; duel->list[did].invites_count--; sd->duel_invite = 0; - + // " -> Player %s has accepted duel --" sprintf(output, msg_sd(sd,376), sd->status.name); clif->disp_message(&sd->bl, output, strlen(output), DUEL_WOS); @@ -159,11 +169,12 @@ void duel_accept(const unsigned int did, struct map_session_data* sd) { void duel_reject(const unsigned int did, struct map_session_data* sd) { char output[256]; - + + nullpo_retv(sd); // " -- Player %s has rejected duel --" sprintf(output, msg_sd(sd,377), sd->status.name); clif->disp_message(&sd->bl, output, strlen(output), DUEL_WOS); - + duel->list[did].invites_count--; sd->duel_invite = 0; } diff --git a/src/map/elemental.c b/src/map/elemental.c index 435dffaf4..b629275e5 100644 --- a/src/map/elemental.c +++ b/src/map/elemental.c @@ -785,7 +785,7 @@ int read_elementaldb(void) { struct status_data *estatus; sprintf(line, "%s/%s", map->db_path, "elemental_db.txt"); - + if( core->runflag == MAPSERVER_ST_RUNNING ) //only necessary after we're up memset(elemental->db,0,sizeof(elemental->db)); @@ -980,27 +980,26 @@ void elemental_defaults(void) { /* */ memset(elemental->db,0,sizeof(elemental->db)); - + /* funcs */ - elemental->class = elemental_class; elemental->get_viewdata = elemental_get_viewdata; - + elemental->create = elemental_create; elemental->data_received = elemental_data_received; elemental->save = elemental_save; - + elemental->change_mode_ack = elemental_change_mode_ack; elemental->change_mode = elemental_change_mode; - + elemental->heal = elemental_heal; elemental->dead = elemental_dead; - + elemental->delete = elemental_delete; elemental->summon_stop = elemental_summon_stop; - + elemental->get_lifetime = elemental_get_lifetime; - + elemental->unlocktarget = elemental_unlocktarget; elemental->skillnotok = elemental_skillnotok; elemental->set_target = elemental_set_target; @@ -1008,11 +1007,11 @@ void elemental_defaults(void) { elemental->clean_effect = elemental_clean_effect; elemental->action = elemental_action; elemental->skill_get_requirements = elemental_skill_get_requirements; - + elemental->read_skilldb = read_elemental_skilldb; elemental->reload_db = reload_elementaldb; elemental->reload_skilldb = reload_elemental_skilldb; - + elemental->search_index = elemental_search_index; elemental->summon_init = elemental_summon_init; elemental->summon_end_timer = elemental_summon_end_timer; diff --git a/src/map/guild.c b/src/map/guild.c index 15c65ec98..7a187b625 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -227,7 +227,7 @@ int guild_getposition(struct guild* g, struct map_session_data* sd) if( g == NULL && (g=sd->guild) == NULL ) return -1; - + ARR_FIND( 0, g->max_member, i, g->member[i].account_id == sd->status.account_id && g->member[i].char_id == sd->status.char_id ); return( i < g->max_member ) ? g->member[i].position : -1; } @@ -263,7 +263,7 @@ int guild_payexp_timer_sub(DBKey key, DBData *data, va_list ap) { struct guild *g; c = DB->data2ptr(data); - + if ( (g = guild->search(c->guild_id)) == NULL || (i = guild->getindex(g, c->account_id, c->char_id)) < 0 @@ -475,7 +475,7 @@ int guild_recv_info(struct guild *sg) { if (channel->config->ally_autojoin) { struct s_mapiterator* iter = mapit_getallusers(); struct guild *tg[MAX_GUILDALLIANCE]; - + for (i = 0; i < MAX_GUILDALLIANCE; i++) { tg[i] = NULL; if( sg->alliance[i].opposition == 0 && sg->alliance[i].guild_id ) @@ -507,11 +507,8 @@ int guild_recv_info(struct guild *sg) { } } } - mapit->free(iter); - } - aChSysSave = chan; } @@ -540,16 +537,16 @@ int guild_recv_info(struct guild *sg) { instances_save = g->instances; } memcpy(g,sg,sizeof(struct guild)); - + g->channel = aChSysSave; g->instance = instance_save; g->instances = instances_save; - + if(g->max_member > MAX_GUILD) { ShowError("guild_recv_info: Received guild with %d members, but MAX_GUILD is only %d. Extra guild-members have been lost!\n", g->max_member, MAX_GUILD); g->max_member = MAX_GUILD; } - + for(i=bm=m=0;i<g->max_member;i++){ if(g->member[i].account_id>0){ sd = g->member[i].sd = guild->sd_check(g->guild_id, g->member[i].account_id, g->member[i].char_id); @@ -623,7 +620,7 @@ int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) { return 0; } } - + if (!tsd->fd) { //You can't invite someone who has already disconnected. clif->guild_inviteack(sd,1); return 0; @@ -735,12 +732,11 @@ void guild_member_joined(struct map_session_data *sd) if (i == -1) sd->status.guild_id = 0; else { - g->member[i].sd = sd; sd->guild = g; - + if (channel->config->ally && channel->config->ally_autojoin) { - channel->join(g->channel, sd, NULL, true); + channel->join(g->channel, sd, "", true); } } @@ -868,7 +864,7 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c if(g == NULL) return 0; // no such guild (error!) - + i = guild->getindex(g, account_id, char_id); if( i == -1 ) return 0; // not a member (inconsistency!) @@ -876,7 +872,7 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c online_member_sd = guild->getavailablesd(g); if(online_member_sd == NULL) return 0; // no one online to inform - + #ifdef GP_BOUND_ITEMS //Guild bound item check guild->retrieveitembound(char_id,account_id,guild_id); @@ -940,9 +936,9 @@ void guild_retrieveitembound(int char_id,int aid,int guild_id) { int guild_send_memberinfoshort(struct map_session_data *sd,int online) { // cleaned up [LuzZza] struct guild *g; - + nullpo_ret(sd); - + if(sd->status.guild_id <= 0) return 0; @@ -960,7 +956,7 @@ int guild_send_memberinfoshort(struct map_session_data *sd,int online) ShowError("guild_send_memberinfoshort: Failed to locate member %d:%d in guild %d!\n", sd->status.account_id, sd->status.char_id, g->guild_id); return 0; } - + if (sd->state.connect_new) { //Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared. clif->guild_belonginfo(sd,g); @@ -971,13 +967,12 @@ 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_) { // cleaned up [LuzZza] - int i,alv,c,idx=-1,om=0,oldonline=-1; struct guild *g = guild->search(guild_id); - + if(g == NULL) return 0; - + for(i=0,alv=0,c=0,om=0;i<g->max_member;i++){ struct guild_member *m=&g->member[i]; if(!m->account_id) continue; @@ -993,7 +988,7 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin if(m->online) om++; } - + if(idx == -1 || c == 0) { //Treat char_id who doesn't match guild_id (not found as member) struct map_session_data *sd = map->id2sd(account_id); @@ -1004,7 +999,7 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin ShowWarning("guild: not found member %d,%d on %d[%s]\n", account_id,char_id,guild_id,g->name); return 0; } - + g->average_lv=alv/c; g->connect_member=om; @@ -1013,14 +1008,14 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin if(oldonline!=online) clif->guild_memberlogin_notice(g, idx, online); - + if(!g->member[idx].sd) return 0; //Send XY dot updates. [Skotlex] //Moved from guild_send_memberinfoshort [LuzZza] for(i=0; i < g->max_member; i++) { - + if(!g->member[i].sd || i == idx || g->member[i].sd->bl.m != g->member[idx].sd->bl.m) continue; @@ -1079,7 +1074,7 @@ int guild_memberposition_changed(struct guild *g,int idx,int pos) g->member[idx].position=pos; clif->guild_memberpositionchanged(g,idx); - + // Update char position in client [LuzZza] if(g->member[idx].sd != NULL) clif->charnameupdate(g->member[idx].sd); @@ -1111,7 +1106,7 @@ int guild_position_changed(int guild_id,int idx,struct guild_position *p) return 0; memcpy(&g->position[idx],p,sizeof(struct guild_position)); clif->guild_positionchanged(g,idx); - + // Update char name in client [LuzZza] for(i=0;i<g->max_member;i++) if(g->member[i].position == idx && g->member[i].sd != NULL) @@ -1251,29 +1246,27 @@ unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp) { struct guild *g; struct guild_expcache *c; int per; - + nullpo_ret(sd); if (!exp) return 0; - + if (sd->status.guild_id == 0 || (g = sd->guild) == NULL || (per = guild->getposition(g,sd)) < 0 || (per = g->position[per].exp_mode) < 1) return 0; - if (per < 100) exp = exp * per / 100; //Otherwise tax everything. - c = DB->data2ptr(guild->expcache_db->ensure(guild->expcache_db, DB->i2key(sd->status.char_id), guild->create_expcache, sd)); if (c->exp > UINT64_MAX - exp) c->exp = UINT64_MAX; else c->exp += exp; - + return exp; } @@ -1361,7 +1354,7 @@ void guild_guildaura_refresh(struct map_session_data *sd, uint16 skill_id, uint1 return; if( !skill_lv ) return; - if( sd->sc.data[type] && (group = skill->id2group(sd->sc.data[type]->val4)) ) { + if (sd->sc.data[type] && (group = skill->id2group(sd->sc.data[type]->val4)) != NULL) { skill->del_unitgroup(group,ALC_MARK); status_change_end(&sd->bl,type,INVALID_TIMER); } @@ -1433,7 +1426,6 @@ int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd) return 0; } - nullpo_ret(sd); if(tsd==NULL || tsd->status.guild_id<=0) @@ -1499,7 +1491,7 @@ int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag) struct guild *g, *tg; // Reconfirm the number of alliance g=sd->guild; tg=tsd->guild; - + if(g==NULL || guild->get_alliance_count(g,0) >= battle_config.max_guild_alliance){ clif->guild_allianceack(sd,4); clif->guild_allianceack(tsd,3); @@ -1639,7 +1631,7 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id channel->guild_leave_alliance(g[1],g[0]); } } - + if (!(flag & 0x08)) { // new relationship for(i=0;i<2-(flag&1);i++) { if(g[i]!=NULL) { @@ -1671,7 +1663,6 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id clif->guild_oppositionack(sd[0],0); } - for (i = 0; i < 2 - (flag & 1); i++) { // Retransmission of the relationship list to all members if (g[i] != NULL) { for (j = 0; j < g[i]->max_member; j++) { @@ -1771,7 +1762,7 @@ int guild_broken(int guild_id,int flag) } if( g->instance ) aFree(g->instance); - + if( g->hdata ) { for( i = 0; i < g->hdatac; i++ ) { @@ -1782,7 +1773,7 @@ int guild_broken(int guild_id,int flag) } aFree(g->hdata); } - + idb_remove(guild->db,guild_id); return 0; } @@ -1795,7 +1786,7 @@ int guild_gm_change(int guild_id, struct map_session_data *sd) if (sd->status.guild_id != guild_id) return 0; - + g=guild->search(guild_id); nullpo_ret(g); @@ -1839,7 +1830,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id) clif->message(g->member[pos].sd->fd, msg_sd(g->member[pos].sd,878)); //"You no longer are the Guild Master." g->member[pos].sd->state.gmaster_flag = 0; } - + if (g->member[0].sd && g->member[0].sd->fd) { clif->message(g->member[0].sd->fd, msg_sd(g->member[0].sd,879)); //"You have become the Guild Master!" g->member[0].sd->state.gmaster_flag = 1; @@ -1867,7 +1858,7 @@ int guild_break(struct map_session_data *sd,char *name) { struct guild *g; struct unit_data *ud; int i; - + nullpo_ret(sd); if( (g=sd->guild)==NULL ) @@ -1888,7 +1879,7 @@ int guild_break(struct map_session_data *sd,char *name) { clif->guild_broken(sd,2); return 0; } - + /* regardless of char server allowing it, we clear the guild master's auras */ if( (ud = unit->bl2ud(&sd->bl)) ) { int count = 0; @@ -1905,7 +1896,6 @@ int guild_break(struct map_session_data *sd,char *name) { groups[count++] = ud->skillunit[i]; break; } - } for(i = 0; i < count; i++) { // FIXME: Why is this not done in the above loop? skill->del_unitgroup(groups[i],ALC_MARK); @@ -1915,7 +1905,7 @@ int guild_break(struct map_session_data *sd,char *name) { #ifdef GP_BOUND_ITEMS pc->bound_clear(sd,IBT_GUILD); #endif - + intif->guild_break(g->guild_id); return 1; } @@ -2153,7 +2143,7 @@ bool guild_isallied(int guild_id, int guild_id2) void guild_flag_add(struct npc_data *nd) { int i; - + /* check */ for( i = 0; i < guild->flags_count; i++ ) { if( guild->flags[i] && guild->flags[i]->bl.id == nd->bl.id ) { @@ -2184,11 +2174,10 @@ void guild_flag_remove(struct npc_data *nd) { for( i = 0, cursor = 0; i < guild->flags_count; i++ ) { if( guild->flags[i] == NULL ) continue; - + if( cursor != i ) { memmove(&guild->flags[cursor], &guild->flags[i], sizeof(struct npc_data*)); } - cursor++; } @@ -2234,7 +2223,7 @@ void guild_flags_clear(void) { if( guild->flags[i] ) guild->flags[i] = NULL; } - + guild->flags_count = 0; } @@ -2247,7 +2236,7 @@ void do_init_guild(bool minimal) { guild->expcache_db = idb_alloc(DB_OPT_BASE); guild->infoevent_db = idb_alloc(DB_OPT_BASE); guild->expcache_ers = ers_new(sizeof(struct guild_expcache),"guild.c::expcache_ers",ERS_OPT_NONE); - + sv->readdb(map->db_path, "castle_db.txt", ',', 4, 5, -1, guild->read_castledb); sv->readdb(map->db_path, "guild_skill_tree.txt", ',', 2+MAX_GUILD_SKILL_REQUIRE*2, 2+MAX_GUILD_SKILL_REQUIRE*2, -1, guild->read_guildskill_tree_db); //guild skill tree [Komurka] @@ -2262,7 +2251,7 @@ void do_final_guild(void) { DBIterator *iter = db_iterator(guild->db); struct guild *g; int i; - + for( g = dbi_first(iter); dbi_exists(iter); g = dbi_next(iter) ) { if( g->channel != NULL ) channel->delete(g->channel); @@ -2281,21 +2270,21 @@ void do_final_guild(void) { aFree(g->hdata); } } - + dbi_destroy(iter); - + db_destroy(guild->db); guild->castle_db->destroy(guild->castle_db,guild->castle_db_final); guild->expcache_db->destroy(guild->expcache_db,guild->expcache_db_final); guild->infoevent_db->destroy(guild->infoevent_db,guild->eventlist_db_final); ers_destroy(guild->expcache_ers); - + if( guild->flags ) aFree(guild->flags); } void guild_defaults(void) { guild = &guild_s; - + guild->init = do_init_guild; guild->final = do_final_guild; /* */ diff --git a/src/map/homunculus.c b/src/map/homunculus.c index cc736708d..d0a4f6679 100644 --- a/src/map/homunculus.c +++ b/src/map/homunculus.c @@ -297,10 +297,10 @@ bool homunculus_levelup(struct homun_data *hd) { ShowError("homunculus_levelup: Invalid class %d. \n", hd->homunculus.class_); return false; } - + if( !hd->exp_next || hd->homunculus.exp < hd->exp_next ) return false; - + switch( htype ) { case HT_REG: case HT_EVO: @@ -312,7 +312,7 @@ bool homunculus_levelup(struct homun_data *hd) { return false; break; } - + hom = &hd->homunculus; hom->level++ ; if (!(hom->level % 3)) @@ -385,7 +385,7 @@ bool homunculus_evolve(struct homun_data *hd) { sd = hd->master; if (!sd) return false; - + if(!hd->homunculusDB->evo_class || hd->homunculus.class_ == hd->homunculusDB->evo_class) { clif->emotion(&hd->bl, E_SWT); return false; @@ -438,7 +438,7 @@ bool homunculus_mutate(struct homun_data *hd, int homun_id) { sd = hd->master; if (!sd) return false; - + m_class = homun->class2type(hd->homunculus.class_); m_id = homun->class2type(homun_id); @@ -461,7 +461,6 @@ bool homunculus_mutate(struct homun_data *hd, int homun_id) { clif->emotion(&sd->bl, E_NO1); clif->specialeffect(&hd->bl,568,AREA); - //status_Calc flag&1 will make current HP/SP be reloaded from hom structure hom = &hd->homunculus; hom->hp = hd->battle_status.hp; @@ -480,12 +479,12 @@ int homunculus_gainexp(struct homun_data *hd,unsigned int exp) { if(hd->homunculus.vaporize != HOM_ST_ACTIVE) return 1; - + if( (htype = homun->class2type(hd->homunculus.class_)) == HT_INVALID ) { ShowError("homunculus_gainexp: Invalid class %d. \n", hd->homunculus.class_); return 0; } - + switch( htype ) { case HT_REG: case HT_EVO: @@ -763,7 +762,7 @@ bool homunculus_create(struct map_session_data *sd, struct s_homunculus *hom) { hd->bl.x = hd->ud.to_x; hd->bl.y = hd->ud.to_y; hd->masterteleport_timer = 0; - + map->addiddb(&hd->bl); status_calc_homunculus(hd,SCO_FIRST); status_percent_heal(&hd->bl, 100, 100); @@ -835,7 +834,7 @@ bool homunculus_recv_data(int account_id, struct s_homunculus *sh, int flag) { if (!sd->status.hom_id) //Hom just created. sd->status.hom_id = sh->hom_id; - + if (sd->hd) //uh? Overwrite the data. memcpy(&sd->hd->homunculus, sh, sizeof(struct s_homunculus)); else @@ -985,10 +984,10 @@ bool homunculus_shuffle(struct homun_data *hd) { exp = hd->homunculus.exp; memcpy(&b_skill, &hd->homunculus.hskill, sizeof(b_skill)); skillpts = hd->homunculus.skillpts; - + //Reset values to level 1. homun->stat_reset(hd); - + //Level it back up do { hd->homunculus.exp += hd->exp_next; @@ -1159,7 +1158,7 @@ bool homunculus_read_skill_db_sub(char* split[], int columns, int current) { // check for bounds [celest] classid = atoi(split[0]) - HM_CLASS_BASE; - + if ( classid >= MAX_HOMUNCULUS_CLASS ) { ShowWarning("homunculus_read_skill_db_sub: Invalid homunculus class %d.\n", atoi(split[0])); return false; @@ -1273,7 +1272,7 @@ void do_init_homunculus(bool minimal) { } void do_final_homunculus(void) { - + } void homunculus_defaults(void) { diff --git a/src/map/instance.c b/src/map/instance.c index 1fc396325..300247fe7 100644 --- a/src/map/instance.c +++ b/src/map/instance.c @@ -47,7 +47,6 @@ bool instance_is_valid(int instance_id) { return true; } - /*-------------------------------------- * name : instance name * Return value could be @@ -61,7 +60,7 @@ int instance_create(int owner_id, const char *name, enum instance_owner_type typ struct guild *g = NULL; short *iptr = NULL; int i; - + switch ( type ) { case IOT_NONE: break; @@ -93,15 +92,15 @@ int instance_create(int owner_id, const char *name, enum instance_owner_type typ ShowError("instance_create: unknown type %d for owner_id %d and name %s.\n", type,owner_id,name); return -1; } - + if( type != IOT_NONE && *icptr ) { ARR_FIND(0, *icptr, i, strcmp(instance->list[iptr[i]].name,name) == 0 ); if( i != *icptr ) return -4;/* already got this instance */ } - + ARR_FIND(0, instance->instances, i, instance->list[i].state == INSTANCE_FREE); - + if( i == instance->instances ) RECREATE(instance->list, struct instance_data, ++instance->instances); @@ -121,9 +120,9 @@ int instance_create(int owner_id, const char *name, enum instance_owner_type typ instance->list[i].respawn.map = 0; instance->list[i].respawn.y = 0; instance->list[i].respawn.x = 0; - + safestrncpy( instance->list[i].name, name, sizeof(instance->list[i].name) ); - + if( type != IOT_NONE ) { int j; ARR_FIND(0, *icptr, j, iptr[j] == -1); @@ -146,7 +145,7 @@ int instance_create(int owner_id, const char *name, enum instance_owner_type typ iptr[j] = i; } } - + clif->instance(i, 1, 0); // Start instancing window return i; } @@ -166,27 +165,27 @@ int instance_add_map(const char *name, int instance_id, bool usebasename, const ShowError("instance_add_map: trying to attach '%s' map to non-existing instance %d.\n", name, instance_id); return -1; } - + if( map_name != NULL && strdb_iget(mapindex->db, map_name) ) { ShowError("instance_add_map: trying to create instanced map with existent name '%s'\n", map_name); return -2; } - + if( map->list[m].instance_id >= 0 ) { // Source map already belong to a Instance. ShowError("instance_add_map: trying to instance already instanced map %s.\n", name); return -4; } - + ARR_FIND( instance->start_id, map->count, i, map->list[i].name[0] == 0 ); // Searching for a Free Map - + if( i < map->count ) im = i; // Unused map found (old instance) else { im = map->count; // Using next map index RECREATE(map->list,struct map_data,++map->count); } - + if( map->list[m].cell == (struct mapcell *)0xdeadbeaf ) map->cellfromcache(&map->list[m]); @@ -199,13 +198,13 @@ int instance_add_map(const char *name, int instance_id, bool usebasename, const map->list[im].index = mapindex->addmap(-1, map->list[im].name); // Add map index map->list[im].channel = NULL; - + if( !map->list[im].index ) { map->list[im].name[0] = '\0'; ShowError("instance_add_map: no more free map indexes.\n"); return -3; // No free map index } - + // Reallocate cells num_cell = map->list[im].xs * map->list[im].ys; CREATE( map->list[im].cell, struct mapcell, num_cell ); @@ -221,7 +220,7 @@ int instance_add_map(const char *name, int instance_id, bool usebasename, const map->list[im].cell[j].npc = 0; map->list[im].cell[j].landprotector = 0; } - + size = map->list[im].bxs * map->list[im].bys * sizeof(struct block_list*); map->list[im].block = (struct block_list**)aCalloc(size, 1); map->list[im].block_mob = (struct block_list**)aCalloc(size, 1); @@ -246,7 +245,7 @@ int instance_add_map(const char *name, int instance_id, bool usebasename, const if( map->list[m].skill_count ) { map->list[im].skill_count = map->list[m].skill_count; CREATE( map->list[im].skills, struct mapflag_skill_adjust*, map->list[im].skill_count ); - + for(i = 0; i < map->list[im].skill_count; i++) { CREATE( map->list[im].skills[i], struct mapflag_skill_adjust, 1); memcpy( map->list[im].skills[i],map->list[m].skills[i],sizeof(struct mapflag_skill_adjust)); @@ -256,20 +255,20 @@ int instance_add_map(const char *name, int instance_id, bool usebasename, const if( map->list[m].zone_mf_count ) { map->list[im].zone_mf_count = map->list[m].zone_mf_count; CREATE( map->list[im].zone_mf, char *, map->list[im].zone_mf_count ); - + for(i = 0; i < map->list[im].zone_mf_count; i++) { CREATE(map->list[im].zone_mf[i], char, MAP_ZONE_MAPFLAG_LENGTH); safestrncpy(map->list[im].zone_mf[i],map->list[m].zone_mf[i],MAP_ZONE_MAPFLAG_LENGTH); } } - + //Mimic questinfo if( map->list[m].qi_count ) { map->list[im].qi_count = map->list[m].qi_count; CREATE( map->list[im].qi_data, struct questinfo, map->list[im].qi_count ); memcpy( map->list[im].qi_data, map->list[m].qi_data, map->list[im].qi_count * sizeof(struct questinfo) ); } - + map->list[im].m = im; map->list[im].instance_id = instance_id; map->list[im].instance_src_map = m; @@ -280,7 +279,7 @@ int instance_add_map(const char *name, int instance_id, bool usebasename, const instance->list[instance_id].map[instance->list[instance_id].num_map - 1] = im; // Attach to actual instance map->addmap2db(&map->list[im]); - + return im; } @@ -305,11 +304,11 @@ int instance_map2imap(int16 m, int instance_id) { int instance_mapname2imap(const char *map_name, int instance_id) { int i; - + if( !instance->valid(instance_id) ) { return -1; } - + for( i = 0; i < instance->list[instance_id].num_map; i++ ) { if( instance->list[instance_id].map[i] && !strcmpi(map->list[map->list[instance->list[instance_id].map[i]].instance_src_map].name,map_name) ) return instance->list[instance_id].map[i]; @@ -317,7 +316,6 @@ int instance_mapname2imap(const char *map_name, int instance_id) { return -1; } - /*-------------------------------------- * m : source map * instance_id : where to search @@ -354,7 +352,7 @@ int instance_init_npc(struct block_list* bl, va_list args) { struct npc_data *nd = (struct npc_data*)bl; struct event_data *ev; char evname[EVENT_NAME_LENGTH]; - + snprintf(evname, EVENT_NAME_LENGTH, "%s::OnInstanceInit", nd->exname); if( ( ev = strdb_get(npc->ev_db, evname) ) ) @@ -377,7 +375,7 @@ void instance_init(int instance_id) { /* cant be together with the previous because it will rely on all of them being up */ map->foreachininstance(instance->init_npc, instance_id, BL_NPC); - + instance->list[instance_id].state = INSTANCE_BUSY; } @@ -387,7 +385,7 @@ void instance_init(int instance_id) { *--------------------------------------*/ int instance_del_load(struct map_session_data* sd, va_list args) { int16 m = va_arg(args,int); - + if( !sd || sd->bl.m != m ) return 0; @@ -428,7 +426,7 @@ int instance_cleanup_sub(struct block_list *bl, va_list ap) { *--------------------------------------*/ void instance_del_map(int16 m) { int i; - + if( m <= 0 || map->list[m].instance_id == -1 ) { ShowError("instance_del_map: tried to remove non-existing instance map (%d)\n", m); return; @@ -439,38 +437,38 @@ void instance_del_map(int16 m) { if( map->list[m].mob_delete_timer != INVALID_TIMER ) timer->delete(map->list[m].mob_delete_timer, map->removemobs_timer); - + mapindex->removemap(map_id2index(m)); // Free memory aFree(map->list[m].cell); aFree(map->list[m].block); aFree(map->list[m].block_mob); - + if (map->list[m].unit_count && map->list[m].units) { for(i = 0; i < map->list[m].unit_count; i++) { aFree(map->list[m].units[i]); } aFree(map->list[m].units); } - + if (map->list[m].skill_count && map->list[m].skills) { for(i = 0; i < map->list[m].skill_count; i++) { aFree(map->list[m].skills[i]); } aFree(map->list[m].skills); } - + if (map->list[m].zone_mf_count && map->list[m].zone_mf) { for(i = 0; i < map->list[m].zone_mf_count; i++) { aFree(map->list[m].zone_mf[i]); } aFree(map->list[m].zone_mf); } - + if( map->list[m].qi_data ) aFree(map->list[m].qi_data); - + // Remove from instance for( i = 0; i < instance->list[map->list[m].instance_id].num_map; i++ ) { if( instance->list[map->list[m].instance_id].map[i] == m ) { @@ -481,10 +479,10 @@ void instance_del_map(int16 m) { break; } } - + if( i == instance->list[map->list[m].instance_id].num_map ) ShowError("map_instance_del: failed to remove %s from instance list (%s): %d\n", map->list[m].name, instance->list[map->list[m].instance_id].name, m); - + if( map->list[m].channel ) channel->delete(map->list[m].channel); @@ -514,7 +512,7 @@ void instance_destroy(int instance_id) { short *iptr = NULL; int type, j; unsigned int now = (unsigned int)time(NULL); - + if( !instance->valid(instance_id) ) return; // nothing to do @@ -524,7 +522,7 @@ void instance_destroy(int instance_id) { type = 2; else type = 3; - + clif->instance(instance_id, 5, type); // Report users this instance has been destroyed switch ( instance->list[instance_id].owner_type ) { @@ -555,13 +553,13 @@ void instance_destroy(int instance_id) { ShowError("instance_destroy: unknown type %d for owner_id %d and name '%s'.\n", instance->list[instance_id].owner_type,instance->list[instance_id].owner_id,instance->list[instance_id].name); break; } - + if( iptr != NULL ) { ARR_FIND(0, *icptr, j, iptr[j] == instance_id); if( j != *icptr ) iptr[j] = -1; } - + if (instance->list[instance_id].map) { int last = 0; while (instance->list[instance_id].num_map && last != instance->list[instance_id].map[0]) { @@ -570,7 +568,7 @@ void instance_destroy(int instance_id) { instance->del_map( instance->list[instance_id].map[0] ); } } - + if( instance->list[instance_id].regs.vars ) db_destroy(instance->list[instance_id].regs.vars); if( instance->list[instance_id].regs.arrays ) @@ -585,11 +583,11 @@ void instance_destroy(int instance_id) { if( instance->list[instance_id].map ) aFree(instance->list[instance_id].map); - + instance->list[instance_id].map = NULL; instance->list[instance_id].state = INSTANCE_FREE; instance->list[instance_id].num_map = 0; - + if (instance->list[instance_id].hdata) { for( j = 0; j < instance->list[instance_id].hdatac; j++ ) { @@ -600,7 +598,7 @@ void instance_destroy(int instance_id) { } aFree(instance->list[instance_id].hdata); } - + instance->list[instance_id].hdata = NULL; instance->list[instance_id].hdatac = 0; } @@ -688,13 +686,13 @@ void do_reload_instance(void) { struct s_mapiterator *iter; struct map_session_data *sd; int i, k; - + for(i = 0; i < instance->instances; i++) { for(k = 0; k < instance->list[i].num_map; k++) { if( !map->list[map->list[instance->list[i].map[k]].instance_src_map].flag.src4instance ) break; } - + if( k != instance->list[i].num_map ) /* any (or all) of them were disabled, we destroy */ instance->destroy(i); else { @@ -704,7 +702,7 @@ void do_reload_instance(void) { instance->set_timeout(i,instance->list[i].original_progress_timeout,instance->list[i].idle_timeoutval); } } - + iter = mapit_getallusers(); for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { if(sd && map->list[sd->bl.m].instance_id >= 0) { @@ -714,14 +712,13 @@ void do_reload_instance(void) { mapit->free(iter); } - void do_final_instance(void) { int i; - + for(i = 0; i < instance->instances; i++) { instance->destroy(i); } - + if( instance->list ) aFree(instance->list); @@ -738,7 +735,7 @@ void do_init_instance(bool minimal) { void instance_defaults(void) { instance = &instance_s; - + instance->init = do_init_instance; instance->final = do_final_instance; instance->reload = do_reload_instance; diff --git a/src/map/intif.c b/src/map/intif.c index 12f679552..1795055c4 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -279,7 +279,7 @@ int intif_saveregistry(struct map_session_data *sd) { if (intif->CheckForCharServer() || !sd->regs.vars) return -1; - + WFIFOHEAD(inter_fd, 60000 + 300); WFIFOW(inter_fd,0) = 0x3004; /* 0x2 = length (set later) */ @@ -288,78 +288,76 @@ int intif_saveregistry(struct map_session_data *sd) { WFIFOW(inter_fd,12) = 0;/* count */ plen = 14; - + iter = db_iterator(sd->regs.vars); for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) ) { const char *varname = NULL; struct script_reg_state *src = NULL; - + if( data->type != DB_DATA_PTR ) /* its a @number */ continue; - + varname = script->get_str(script_getvarid(key.i64)); - + if( varname[0] == '@' ) /* @string$ can get here, so we skip */ continue; - + src = DB->data2ptr(data); /* no need! */ if( !src->update ) continue; - + src->update = false; - + len = strlen(varname)+1; - + WFIFOB(inter_fd, plen) = (unsigned char)len;/* won't be higher; the column size is 32 */ plen += 1; - + safestrncpy((char*)WFIFOP(inter_fd,plen), varname, len); plen += len; - + WFIFOL(inter_fd, plen) = script_getvaridx(key.i64); plen += 4; - + if( src->type ) { struct script_reg_str *p = (struct script_reg_str *)src; - + WFIFOB(inter_fd, plen) = p->value ? 2 : 3; plen += 1; - + if( p->value ) { len = strlen(p->value)+1; - + WFIFOB(inter_fd, plen) = (unsigned char)len;/* won't be higher; the column size is 254 */ plen += 1; - + safestrncpy((char*)WFIFOP(inter_fd,plen), p->value, len); plen += len; } else { script->reg_destroy_single(sd,key.i64,&p->flag); } - } else { struct script_reg_num *p = (struct script_reg_num *)src; WFIFOB(inter_fd, plen) = p->value ? 0 : 1; plen += 1; - + if( p->value ) { WFIFOL(inter_fd, plen) = p->value; plen += 4; } else { script->reg_destroy_single(sd,key.i64,&p->flag); } - } - + WFIFOW(inter_fd,12) += 1; - + if( plen > 60000 ) { WFIFOW(inter_fd, 2) = plen; WFIFOSET(inter_fd, plen); - + /* prepare follow up */ WFIFOHEAD(inter_fd, 60000 + 300); WFIFOW(inter_fd,0) = 0x3004; @@ -367,19 +365,18 @@ int intif_saveregistry(struct map_session_data *sd) { WFIFOL(inter_fd,4) = sd->status.account_id; WFIFOL(inter_fd,8) = sd->status.char_id; WFIFOW(inter_fd,12) = 0;/* count */ - + plen = 14; } - } dbi_destroy(iter); /* mark & go. */ WFIFOW(inter_fd, 2) = plen; WFIFOSET(inter_fd, plen); - + sd->vars_dirty = false; - + return 0; } @@ -826,7 +823,6 @@ int intif_guild_castle_dataload(int num, int *castle_ids) return 1; } - // Request change castle guild owner and save data int intif_guild_castle_datasave(int castle_id,int index, int value) { @@ -895,7 +891,6 @@ int intif_homunculus_requestdelete(int homun_id) } - //----------------------------------------------------------------- // Packets receive from inter server @@ -999,13 +994,13 @@ void intif_parse_Registers(int fd) else { //Normally registries should arrive for in log-in chars. sd = map->id2sd(account_id); } - + if (!sd || sd->status.char_id != char_id) { return; //Character registry from another character. } - + flag = ( sd->vars_received&PRL_ACCG && sd->vars_received&PRL_ACCL && sd->vars_received&PRL_CHAR ) ? 0 : 1; - + switch (RFIFOB(fd,12)) { case 3: //Character Registry sd->vars_received |= PRL_CHAR; @@ -1024,14 +1019,14 @@ void intif_parse_Registers(int fd) } /* have it not complain about insertion of vars before loading, and not set those vars as new or modified */ pc->reg_load = true; - + if( RFIFOW(fd, 14) ) { char key[32]; unsigned int index; int max = RFIFOW(fd, 14), cursor = 16, i; - + script->parser_current_file = "loading char/acc variables";//for script_add_str to refer to here in case errors occur - + /** * Vessel!char_reg_num_db * @@ -1043,13 +1038,13 @@ void intif_parse_Registers(int fd) char sval[254]; safestrncpy(key, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor)); cursor += RFIFOB(fd, cursor) + 1; - + index = RFIFOL(fd, cursor); cursor += 4; - + safestrncpy(sval, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor)); cursor += RFIFOB(fd, cursor) + 1; - + script->set_reg(NULL,sd,reference_uid(script->add_str(key), index), key, (void*)sval, NULL); } /** @@ -1063,23 +1058,22 @@ void intif_parse_Registers(int fd) int ival; safestrncpy(key, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor)); cursor += RFIFOB(fd, cursor) + 1; - + index = RFIFOL(fd, cursor); cursor += 4; - + ival = RFIFOL(fd, cursor); cursor += 4; - + script->set_reg(NULL,sd,reference_uid(script->add_str(key), index), key, (void*)h64BPTRSIZE(ival), NULL); } } - script->parser_current_file = NULL;/* reset */ } - + /* flag it back */ pc->reg_load = false; - + if (flag && sd->vars_received&PRL_ACCG && sd->vars_received&PRL_ACCL && sd->vars_received&PRL_CHAR) pc->reg_received(sd); //Received all registry values, execute init scripts and what-not. [Skotlex] } @@ -1662,7 +1656,7 @@ void intif_parse_MailDelete(int fd) { int char_id = RFIFOL(fd,2); int mail_id = RFIFOL(fd,6); bool failed = RFIFOB(fd,10); - + if ( (sd = map->charid2sd(char_id)) == NULL) { ShowError("intif_parse_MailDelete: char not found %d\n", char_id); return; @@ -1987,7 +1981,7 @@ int intif_mercenary_create(struct s_mercenary *merc) void intif_parse_MercenaryReceived(int fd) { int len = RFIFOW(fd,2) - 5; - + if (sizeof(struct s_mercenary) != len) { if (battle_config.etc_log) ShowError("intif: create mercenary data size mismatch %d != %"PRIuS"\n", len, sizeof(struct s_mercenary)); @@ -2067,7 +2061,7 @@ int intif_elemental_create(struct s_elemental *ele) void intif_parse_ElementalReceived(int fd) { int len = RFIFOW(fd,2) - 5; - + if (sizeof(struct s_elemental) != len) { if (battle_config.etc_log) ShowError("intif: create elemental data size mismatch %d != %"PRIuS"\n", len, sizeof(struct s_elemental)); @@ -2128,8 +2122,6 @@ void intif_parse_ElementalSaved(int fd) { } void intif_request_accinfo( int u_fd, int aid, int group_lv, char* query ) { - - WFIFOHEAD(inter_fd,2 + 4 + 4 + 4 + NAME_LENGTH); WFIFOW(inter_fd,0) = 0x3007; @@ -2176,7 +2168,7 @@ void intif_itembound_req(int char_id,int aid,int guild_id) { gstor->lock = 1; //Lock for retrieval process #endif } - + //3856 void intif_parse_Itembound_ack(int fd) { #ifdef GP_BOUND_ITEMS @@ -2252,11 +2244,11 @@ int intif_parse(int fd) case 0x383f: intif->pGuildEmblem(fd); break; case 0x3840: intif->pGuildCastleDataLoad(fd); break; case 0x3843: intif->pGuildMasterChanged(fd); break; - + //Quest system case 0x3860: intif->pQuestLog(fd); break; case 0x3861: intif->pQuestSave(fd); break; - + // Mail System case 0x3848: intif->pMailInboxReceived(fd); break; case 0x3849: intif->pMailNew(fd); break; @@ -2287,7 +2279,7 @@ int intif_parse(int fd) case 0x387c: intif->pElementalReceived(fd); break; case 0x387d: intif->pElementalDeleted(fd); break; case 0x387e: intif->pElementalSaved(fd); break; - + case 0x3880: intif->pCreatePet(fd); break; case 0x3881: intif->pRecvPetData(fd); break; case 0x3882: intif->pSavePetOk(fd); break; @@ -2328,7 +2320,7 @@ void intif_defaults(void) { /* */ memcpy(intif->packet_len_table,&packet_len_table,sizeof(intif->packet_len_table)); - + /* funcs */ intif->parse = intif_parse; intif->create_pet = intif_create_pet; diff --git a/src/map/irc-bot.c b/src/map/irc-bot.c index 86f854ff7..f89bd2f1c 100644 --- a/src/map/irc-bot.c +++ b/src/map/irc-bot.c @@ -36,10 +36,10 @@ int irc_connect_timer(int tid, int64 tick, int id, intptr_t data) { struct hSockOpt opt; if( ircbot->isOn || ++ircbot->fails >= 3 ) return 0; - + opt.silent = 1; opt.setTimeo = 0; - + ircbot->last_try = timer->gettick(); if ((ircbot->fd = sockt->make_connection(ircbot->ip, channel->config->irc_server_port, &opt)) > 0) { @@ -58,14 +58,14 @@ int irc_connect_timer(int tid, int64 tick, int id, intptr_t data) { int irc_identify_timer(int tid, int64 tick, int id, intptr_t data) { if( !ircbot->isOn ) return 0; - + sprintf(send_string, "USER HerculesWS%d 8 * : Hercules IRC Bridge",rnd()%777); ircbot->send(send_string); sprintf(send_string, "NICK %s", channel->config->irc_nick); ircbot->send(send_string); timer->add(timer->gettick() + 3000, ircbot->join_timer, 0, 0); - + return 0; } @@ -76,7 +76,7 @@ int irc_identify_timer(int tid, int64 tick, int id, intptr_t data) { int irc_join_timer(int tid, int64 tick, int id, intptr_t data) { if( !ircbot->isOn ) return 0; - + if (channel->config->irc_nick_pw[0] != '\0') { sprintf(send_string, "PRIVMSG NICKSERV : IDENTIFY %s", channel->config->irc_nick_pw); ircbot->send(send_string); @@ -84,7 +84,7 @@ int irc_join_timer(int tid, int64 tick, int id, intptr_t data) { sprintf(send_string, "PRIVMSG NICKSERV : GHOST %s %s", channel->config->irc_nick, channel->config->irc_nick_pw); } } - + sprintf(send_string, "JOIN %s", channel->config->irc_channel); ircbot->send(send_string); ircbot->isIn = true; @@ -125,20 +125,20 @@ int irc_parse(int fd) { timer->add(timer->gettick() + 120000, ircbot->connect_timer, 0, 0); return 0; } - + if( !RFIFOREST(fd) ) return 0; - + parse_string = (char*)RFIFOP(fd,0); parse_string[ RFIFOREST(fd) - 1 ] = '\0'; - + parse_string = strtok_r(parse_string,"\r\n",&str_safe); - + while (parse_string != NULL) { ircbot->parse_sub(fd,parse_string); parse_string = strtok_r(NULL,"\r\n",&str_safe); } - + RFIFOSKIP(fd, RFIFOREST(fd)); RFIFOFLUSH(fd); return 0; @@ -158,7 +158,7 @@ void irc_parse_source(char *source, char *nick, char *ident, char *host) { int i, pos = 0; size_t len = strlen(source); unsigned char stage = 0; - + for(i = 0; i < len; i++) { if( stage == 0 && source[i] == '!' ) { safestrncpy(nick, &source[0], min(i + 1, IRC_NICK_LENGTH)); @@ -182,29 +182,28 @@ void irc_parse_sub(int fd, char *str) { char source[180], command[60], buf1[IRC_MESSAGE_LENGTH], buf2[IRC_MESSAGE_LENGTH]; char *target = buf1, *message = buf2; struct irc_func *func; - + source[0] = command[0] = buf1[0] = buf2[0] = '\0'; - + if( str[0] == ':' ) str++; - + if (sscanf(str, "%179s %59s %499s :%499[^\r\n]", source, command, buf1, buf2) == 3 && buf1[0] == ':') { // source command :message (i.e. QUIT) message = buf1+1; target = buf2; } - + if( command[0] == '\0' ) return; - - if( !(func = ircbot->func_search(command)) && !(func = ircbot->func_search(source)) ) { + + if ((func = ircbot->func_search(command)) == NULL && (func = ircbot->func_search(source)) == NULL) { #ifdef IRCBOT_DEBUG ShowWarning("Unknown command received %s from %s\n",command,source); #endif // IRCBOT_DEBUG return; } func->func(fd,command,source,target,message); - } /** @@ -301,7 +300,7 @@ void irc_privmsg(int fd, char *cmd, char *source, char *target, char *msg) { if( source[0] != '\0' ) ircbot->parse_source(source,source_nick,source_ident,source_host); - + if( ircbot->channel ) { size_t padding_len = strlen(ircbot->channel->name) + strlen(source_nick) + 13; while (1) { @@ -421,26 +420,26 @@ void irc_bot_init(bool minimal) { channel->config->irc = false; return; } - + ircbot->funcs.size = ARRAYLENGTH(irc_func_base); CREATE(ircbot->funcs.list,struct irc_func*,ircbot->funcs.size); - + for( i = 0; i < ircbot->funcs.size; i++ ) { - + CREATE(function, struct irc_func, 1); - + safestrncpy(function->name, irc_func_base[i].name, sizeof(function->name)); function->func = irc_func_base[i].func; - + ircbot->funcs.list[i] = function; } - + ircbot->fails = 0; ircbot->fd = 0; ircbot->isIn = false; ircbot->isOn = false; - + timer->add_func_list(ircbot->connect_timer, "irc_connect_timer"); timer->add(timer->gettick() + 7000, ircbot->connect_timer, 0, 0); } @@ -450,14 +449,14 @@ void irc_bot_init(bool minimal) { */ void irc_bot_final(void) { int i; - + if (!channel->config->irc) return; if( ircbot->isOn ) { ircbot->send("QUIT :Hercules is shutting down"); sockt->close(ircbot->fd); } - + for( i = 0; i < ircbot->funcs.size; i++ ) { aFree(ircbot->funcs.list[i]); } @@ -469,25 +468,25 @@ void irc_bot_final(void) { */ void ircbot_defaults(void) { ircbot = &irc_bot_s; - + ircbot->channel = NULL; - + ircbot->init = irc_bot_init; ircbot->final = irc_bot_final; - + ircbot->parse = irc_parse; ircbot->parse_sub = irc_parse_sub; ircbot->parse_source = irc_parse_source; - + ircbot->func_search = irc_func_search; - + ircbot->connect_timer = irc_connect_timer; ircbot->identify_timer = irc_identify_timer; ircbot->join_timer = irc_join_timer; - + ircbot->send = irc_send; ircbot->relay = irc_relay; - + ircbot->pong = irc_pong; ircbot->privmsg = irc_privmsg; diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 7f5c2224c..ccedee72a 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -160,14 +160,14 @@ int itemdb_searchname_array(struct item_data** data, int size, const char *str, /* [Ind/Hercules] */ int itemdb_chain_item(unsigned short chain_id, int *rate) { struct item_chain_entry *entry; - + if( chain_id >= itemdb->chain_count ) { ShowError("itemdb_chain_item: unknown chain id %d\n", chain_id); return UNKNOWN_ITEM_ID; } - + entry = &itemdb->chains[chain_id].items[ rnd()%itemdb->chains[chain_id].qty ]; - + if( rnd()%10000 >= entry->rate ) return 0; @@ -178,47 +178,47 @@ int itemdb_chain_item(unsigned short chain_id, int *rate) { /* [Ind/Hercules] */ void itemdb_package_item(struct map_session_data *sd, struct item_package *package) { int i = 0, get_count, j, flag; - + for( i = 0; i < package->must_qty; i++ ) { struct item it; memset(&it, 0, sizeof(it)); it.nameid = package->must_items[i].id; it.identify = 1; - + if( package->must_items[i].hours ) { it.expire_time = (unsigned int)(time(NULL) + ((package->must_items[i].hours*60)*60)); } - + if( package->must_items[i].named ) { it.card[0] = CARD0_FORGE; it.card[1] = 0; it.card[2] = GetWord(sd->status.char_id, 0); it.card[3] = GetWord(sd->status.char_id, 1); } - + if( package->must_items[i].announce ) clif->package_announce(sd,package->must_items[i].id,package->id); - + if ( package->must_items[i].force_serial ) it.unique_id = itemdb->unique_id(sd); get_count = itemdb->isstackable(package->must_items[i].id) ? package->must_items[i].qty : 1; - + it.amount = get_count == 1 ? 1 : get_count; - + for( j = 0; j < package->must_items[i].qty; j += get_count ) { if ( ( flag = pc->additem(sd, &it, get_count, LOG_TYPE_SCRIPT) ) ) clif->additem(sd, 0, 0, flag); } } - + if( package->random_qty ) { for( i = 0; i < package->random_qty; i++ ) { struct item_package_rand_entry *entry; - + entry = &package->random_groups[i].random_list[rnd()%package->random_groups[i].random_qty]; - + while( 1 ) { if( rnd()%10000 >= entry->rate ) { entry = entry->next; @@ -226,28 +226,28 @@ void itemdb_package_item(struct map_session_data *sd, struct item_package *packa } else { struct item it; memset(&it, 0, sizeof(it)); - + it.nameid = entry->id; it.identify = 1; - + if( entry->hours ) { it.expire_time = (unsigned int)(time(NULL) + ((entry->hours*60)*60)); } - + if( entry->named ) { it.card[0] = CARD0_FORGE; it.card[1] = 0; it.card[2] = GetWord(sd->status.char_id, 0); it.card[3] = GetWord(sd->status.char_id, 1); } - + if( entry->announce ) clif->package_announce(sd,entry->id,package->id); - + get_count = itemdb->isstackable(entry->id) ? entry->qty : 1; - + it.amount = get_count == 1 ? 1 : get_count; - + for( j = 0; j < entry->qty; j += get_count ) { if ( ( flag = pc->additem(sd, &it, get_count, LOG_TYPE_SCRIPT) ) ) clif->additem(sd, 0, 0, flag); @@ -257,9 +257,8 @@ void itemdb_package_item(struct map_session_data *sd, struct item_package *packa } } } - - return; } + /*========================================== * Return a random item id from group. (takes into account % chance giving/tot group) *------------------------------------------*/ @@ -267,17 +266,17 @@ int itemdb_searchrandomid(struct item_group *group) { if (group->qty) return group->nameid[rnd()%group->qty]; - + ShowError("itemdb_searchrandomid: No item entries for group id %d\n", group->id); return UNKNOWN_ITEM_ID; } bool itemdb_in_group(struct item_group *group, int nameid) { int i; - + for( i = 0; i < group->qty; i++ ) if( group->nameid[i] == nameid ) return true; - + return false; } @@ -522,7 +521,6 @@ int itemdb_isstackable2(struct item_data *data) } } - /*========================================== * Trade Restriction functions [Skotlex] *------------------------------------------*/ @@ -569,10 +567,10 @@ int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(stru if (!func(item_data, gmlv, gmlv2)) return 0; - + if(item_data->slot == 0 || itemdb_isspecial(item->card[0])) return 1; - + for(i = 0; i < item_data->slot; i++) { if (!item->card[i]) continue; if (!func(itemdb->search(item->card[i]), gmlv, gmlv2)) @@ -623,12 +621,12 @@ void itemdb_read_groups(void) { ShowError("can't read %s\n", config_filename); return; } - + gsize = aMalloc( libconfig->setting_length(item_group_conf.root) * sizeof(unsigned int) ); - + for(i = 0; i < libconfig->setting_length(item_group_conf.root); i++) gsize[i] = 0; - + i = 0; while( (itg = libconfig->setting_get_elem(item_group_conf.root,i++)) ) { const char *name = config_setting_name(itg); @@ -639,7 +637,7 @@ void itemdb_read_groups(void) { --i; continue; } - + c = 0; while( (it = libconfig->setting_get_elem(itg,c++)) ) { if( config_setting_is_list(it) ) @@ -647,19 +645,18 @@ void itemdb_read_groups(void) { else gsize[ i - 1 ] += 1; } - } - + i = 0; CREATE(itemdb->groups, struct item_group, libconfig->setting_length(item_group_conf.root)); itemdb->group_count = (unsigned short)libconfig->setting_length(item_group_conf.root); - + while( (itg = libconfig->setting_get_elem(item_group_conf.root,i++)) ) { struct item_data *data = itemdb->name2id(config_setting_name(itg)); int ecount = 0; - + data->group = &itemdb->groups[count]; - + itemdb->groups[count].id = data->nameid; itemdb->groups[count].qty = gsize[ count ]; @@ -672,13 +669,13 @@ void itemdb_read_groups(void) { repeat = libconfig->setting_get_int_elem(it,1); } else itname = libconfig->setting_get_string_elem(itg,c - 1); - + if( itname[0] == 'I' && itname[1] == 'D' && strlen(itname) < 8 ) { if( !( data = itemdb->exists(atoi(itname+2)) ) ) ShowWarning("itemdb_read_groups: unknown item ID '%d' in group '%s'!\n",atoi(itname+2),config_setting_name(itg)); } else if( !( data = itemdb->name2id(itname) ) ) ShowWarning("itemdb_read_groups: unknown item '%s' in group '%s'!\n",itname,config_setting_name(itg)); - + itemdb->groups[count].nameid[ecount] = data ? data->nameid : 0; if( repeat > 1 ) { //memset would be better? I failed to get the following to work though hu @@ -689,25 +686,24 @@ void itemdb_read_groups(void) { } ecount += repeat; } - count++; } - + libconfig->destroy(&item_group_conf); aFree(gsize); - ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, config_filename); } + /* [Ind/Hercules] - HCache for Packages */ void itemdb_write_cached_packages(const char *config_filename) { FILE *file; unsigned short pcount = itemdb->package_count; unsigned short i; - + if( !(file = HCache->open(config_filename,"wb")) ) { return; } - + // first 2 bytes = package count hwrite(&pcount,sizeof(pcount),1,file); @@ -741,7 +737,7 @@ void itemdb_write_cached_packages(const char *config_filename) { for(c = 0; c < random_qty; c++) { struct item_package_rand_group *group = &itemdb->packages[i].random_groups[c]; unsigned short group_qty = group->random_qty, h; - + //next 2 bytes = how many entries in this group hwrite(&group_qty,sizeof(group_qty),1,file); //now we loop into the group's list @@ -765,9 +761,8 @@ void itemdb_write_cached_packages(const char *config_filename) { } } } - fclose(file); - + return; } bool itemdb_read_cached_packages(const char *config_filename) { @@ -778,7 +773,7 @@ bool itemdb_read_cached_packages(const char *config_filename) { if( !(file = HCache->open(config_filename,"rb")) ) { return false; } - + // first 2 bytes = package count hread(&pcount,sizeof(pcount),1,file); @@ -790,25 +785,25 @@ bool itemdb_read_cached_packages(const char *config_filename) { struct item_data *pdata; struct item_package *package = &itemdb->packages[i]; unsigned short c; - + //into a package, first 2 bytes = id. hread(&id,sizeof(id),1,file); //next 2 bytes = must count hread(&must_qty,sizeof(must_qty),1,file); //next 2 bytes = random count hread(&random_qty,sizeof(random_qty),1,file); - + if( !(pdata = itemdb->exists(id)) ) ShowWarning("itemdb_read_cached_packages: unknown package item '%d', skipping..\n",id); else pdata->package = &itemdb->packages[i]; - + package->id = id; package->random_qty = random_qty; package->must_qty = must_qty; package->must_items = NULL; package->random_groups = NULL; - + if( package->must_qty ) { CREATE(package->must_items, struct item_package_must_entry, package->must_qty); //now we loop into must @@ -847,13 +842,13 @@ bool itemdb_read_cached_packages(const char *config_filename) { for(c = 0; c < package->random_qty; c++) { unsigned short group_qty = 0, h; struct item_package_rand_entry *prev = NULL; - + //next 2 bytes = how many entries in this group hread(&group_qty,sizeof(group_qty),1,file); - + package->random_groups[c].random_qty = group_qty; CREATE(package->random_groups[c].random_list, struct item_package_rand_entry, package->random_groups[c].random_qty); - + //now we loop into the group's list for(h = 0; h < group_qty; h++) { struct item_package_rand_entry *entry = &itemdb->packages[i].random_groups[c].random_list[h]; @@ -862,7 +857,7 @@ bool itemdb_read_cached_packages(const char *config_filename) { struct item_data *data; if( prev ) prev->next = entry; - + //first 2 byte = item id hread(&mid,sizeof(mid),1,file); //next 2 byte = qty @@ -880,7 +875,7 @@ bool itemdb_read_cached_packages(const char *config_filename) { if( !(data = itemdb->exists(mid)) ) ShowWarning("itemdb_read_cached_packages: unknown item '%d' in package '%s'!\n",mid,itemdb_name(package->id)); - + entry->id = data ? data->nameid : 0; entry->rate = rate; entry->hours = hours; @@ -895,9 +890,7 @@ bool itemdb_read_cached_packages(const char *config_filename) { } } } - fclose(file); - ShowStatus("Done reading '"CL_WHITE"%hu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"' ("CL_GREEN"C"CL_RESET").\n", pcount, config_filename); return true; @@ -914,42 +907,41 @@ void itemdb_read_packages(void) { int i = 0, count = 0, c = 0, highest_gcount = 0; unsigned int *must = NULL, *random = NULL, *rgroup = NULL, **rgroups = NULL; struct item_package_rand_entry **prev = NULL; - + if( HCache->check(config_filename) ) { if( itemdb->read_cached_packages(config_filename) ) return; } - + if (libconfig->read_file(&item_packages_conf, config_filename)) { ShowError("can't read %s\n", config_filename); return; } - + must = aMalloc( libconfig->setting_length(item_packages_conf.root) * sizeof(unsigned int) ); random = aMalloc( libconfig->setting_length(item_packages_conf.root) * sizeof(unsigned int) ); rgroup = aMalloc( libconfig->setting_length(item_packages_conf.root) * sizeof(unsigned int) ); rgroups = aMalloc( libconfig->setting_length(item_packages_conf.root) * sizeof(unsigned int *) ); - for(i = 0; i < libconfig->setting_length(item_packages_conf.root); i++) { must[i] = 0; random[i] = 0; rgroup[i] = 0; rgroups[i] = NULL; } - + /* validate tree, drop poisonous fruits! */ i = 0; while( (itg = libconfig->setting_get_elem(item_packages_conf.root,i++)) ) { const char *name = config_setting_name(itg); - + if( !itemdb->name2id(name) ) { ShowWarning("itemdb_read_packages: unknown package item '%s', skipping..\n",name); libconfig->setting_remove(item_packages_conf.root, name); --i; continue; } - + c = 0; while( (it = libconfig->setting_get_elem(itg,c++)) ) { int rval = 0; @@ -959,7 +951,7 @@ void itemdb_read_packages(void) { --c; continue; } - + if( rval == 0 ) must[ i - 1 ] += 1; else { @@ -976,7 +968,7 @@ void itemdb_read_packages(void) { for(i = 0; i < highest_gcount; i++) { prev[i] = NULL; } - + for(i = 0; i < libconfig->setting_length(item_packages_conf.root); i++ ) { rgroups[i] = aMalloc( rgroup[i] * sizeof(unsigned int) ); for( c = 0; c < rgroup[i]; c++ ) { @@ -990,33 +982,33 @@ void itemdb_read_packages(void) { c = 0; while( (it = libconfig->setting_get_elem(itg,c++)) ) { int rval = 0; - if( ( t = libconfig->setting_get_member(it, "Random")) && ( rval = libconfig->setting_get_int(t) ) > 0 ) { + if ((t = libconfig->setting_get_member(it, "Random")) != NULL && (rval = libconfig->setting_get_int(t)) > 0) { rgroups[i - 1][rval - 1] += 1; } } } - + CREATE(itemdb->packages, struct item_package, libconfig->setting_length(item_packages_conf.root)); itemdb->package_count = (unsigned short)libconfig->setting_length(item_packages_conf.root); - + /* write */ i = 0; while( (itg = libconfig->setting_get_elem(item_packages_conf.root,i++)) ) { struct item_data *data = itemdb->name2id(config_setting_name(itg)); int r = 0, m = 0; - + for(r = 0; r < highest_gcount; r++) { prev[r] = NULL; } - + data->package = &itemdb->packages[count]; - + itemdb->packages[count].id = data->nameid; itemdb->packages[count].random_groups = NULL; itemdb->packages[count].must_items = NULL; itemdb->packages[count].random_qty = rgroup[ i - 1 ]; itemdb->packages[count].must_qty = must[ i - 1 ]; - + if( itemdb->packages[count].random_qty ) { CREATE(itemdb->packages[count].random_groups, struct item_package_rand_group, itemdb->packages[count].random_qty); for( c = 0; c < itemdb->packages[count].random_qty; c++ ) { @@ -1029,14 +1021,14 @@ void itemdb_read_packages(void) { } if( itemdb->packages[count].must_qty ) CREATE(itemdb->packages[count].must_items, struct item_package_must_entry, itemdb->packages[count].must_qty); - + c = 0; while( (it = libconfig->setting_get_elem(itg,c++)) ) { int icount = 1, expire = 0, rate = 10000, gid = 0; bool announce = false, named = false, force_serial = false; - + itname = config_setting_name(it); - + if( itname[0] == 'I' && itname[1] == 'D' && strlen(itname) < 8 ) { if( !( data = itemdb->exists(atoi(itname+2)) ) ) ShowWarning("itemdb_read_packages: unknown item ID '%d' in package '%s'!\n",atoi(itname+2),config_setting_name(itg)); @@ -1045,10 +1037,10 @@ void itemdb_read_packages(void) { if( ( t = libconfig->setting_get_member(it, "Count")) ) icount = libconfig->setting_get_int(t); - + if( ( t = libconfig->setting_get_member(it, "Expire")) ) expire = libconfig->setting_get_int(t); - + if( ( t = libconfig->setting_get_member(it, "Rate")) ) { if( (rate = (unsigned short)libconfig->setting_get_int(t)) > 10000 ) { ShowWarning("itemdb_read_packages: invalid rate (%d) for item '%s' in package '%s'!\n",rate,itname,config_setting_name(itg)); @@ -1061,7 +1053,7 @@ void itemdb_read_packages(void) { if( ( t = libconfig->setting_get_member(it, "Named")) && libconfig->setting_get_bool(t) ) named = true; - + if( ( t = libconfig->setting_get_member(it, "ForceSerial")) && libconfig->setting_get_bool(t) ) force_serial = true; @@ -1081,12 +1073,12 @@ void itemdb_read_packages(void) { m++; } else { int gidx = gid - 1; - + r = itemdb->packages[count].random_groups[gidx].random_qty; - + if( prev[gidx] ) prev[gidx]->next = &itemdb->packages[count].random_groups[gidx].random_list[r]; - + itemdb->packages[count].random_groups[gidx].random_list[r].id = data ? data->nameid : 0; itemdb->packages[count].random_groups[gidx].random_list[r].qty = icount; if( (itemdb->packages[count].random_groups[gidx].random_list[r].rate = rate) == 10000 ) { @@ -1097,17 +1089,16 @@ void itemdb_read_packages(void) { itemdb->packages[count].random_groups[gidx].random_list[r].named = named == true ? 1 : 0; itemdb->packages[count].random_groups[gidx].random_list[r].force_serial = force_serial == true ? 1 : 0; itemdb->packages[count].random_groups[gidx].random_qty += 1; - + prev[gidx] = &itemdb->packages[count].random_groups[gidx].random_list[r]; } - } - + for(r = 0; r < highest_gcount; r++) { if( prev[r] ) prev[r]->next = &itemdb->packages[count].random_groups[r].random_list[0]; } - + for( r = 0; r < itemdb->packages[count].random_qty; r++ ) { if( itemdb->packages[count].random_groups[r].random_qty == 1 ) { //item packages don't stop looping until something comes out of them, so if you have only one item in it the drop is guaranteed. @@ -1116,11 +1107,9 @@ void itemdb_read_packages(void) { itemdb->packages[count].random_groups[r].random_list[0].rate = 10000; } } - count++; } - - + aFree(must); aFree(random); for(i = 0; i < libconfig->setting_length(item_packages_conf.root); i++ ) { @@ -1129,12 +1118,12 @@ void itemdb_read_packages(void) { aFree(rgroups); aFree(rgroup); aFree(prev); - + libconfig->destroy(&item_packages_conf); if( HCache->enabled ) itemdb->write_cached_packages(config_filename); - + ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, config_filename); } @@ -1147,7 +1136,7 @@ void itemdb_read_chains(void) { const char *config_filename = "db/pre-re/item_chain.conf"; // FIXME hardcoded name #endif int i = 0, count = 0; - + if (libconfig->read_file(&item_chain_conf, config_filename)) { ShowError("can't read %s\n", config_filename); return; @@ -1155,7 +1144,7 @@ void itemdb_read_chains(void) { CREATE(itemdb->chains, struct item_chain, libconfig->setting_length(item_chain_conf.root)); itemdb->chain_count = (unsigned short)libconfig->setting_length(item_chain_conf.root); - + #ifdef ENABLE_CASE_CHECK script->parser_current_file = config_filename; #endif // ENABLE_CASE_CHECK @@ -1165,12 +1154,12 @@ void itemdb_read_chains(void) { const char *name = config_setting_name(itc); int c = 0; config_setting_t *entry = NULL; - + script->set_constant2(name,i-1,0); itemdb->chains[count].qty = (unsigned short)libconfig->setting_length(itc); - + CREATE(itemdb->chains[count].items, struct item_chain_entry, libconfig->setting_length(itc)); - + while( (entry = libconfig->setting_get_elem(itc,c++)) ) { const char *itname = config_setting_name(entry); if( itname[0] == 'I' && itname[1] == 'D' && strlen(itname) < 8 ) { @@ -1178,32 +1167,32 @@ void itemdb_read_chains(void) { ShowWarning("itemdb_read_chains: unknown item ID '%d' in chain '%s'!\n",atoi(itname+2),name); } else if( !( data = itemdb->name2id(itname) ) ) ShowWarning("itemdb_read_chains: unknown item '%s' in chain '%s'!\n",itname,name); - + if( prev ) prev->next = &itemdb->chains[count].items[c - 1]; - + itemdb->chains[count].items[c - 1].id = data ? data->nameid : 0; itemdb->chains[count].items[c - 1].rate = data ? libconfig->setting_get_int(entry) : 0; - + prev = &itemdb->chains[count].items[c - 1]; } - + if( prev ) prev->next = &itemdb->chains[count].items[0]; - + count++; } #ifdef ENABLE_CASE_CHECK script->parser_current_file = NULL; #endif // ENABLE_CASE_CHECK - + libconfig->destroy(&item_chain_conf); - + if( !script->get_constant("ITMCHAIN_ORE",&i) ) ShowWarning("itemdb_read_chains: failed to find 'ITMCHAIN_ORE' chain to link to cache!\n"); else itemdb->chain_cache[ECC_ORE] = i; - + ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, config_filename); } @@ -1212,21 +1201,19 @@ void itemdb_read_chains(void) { **/ int itemdb_combo_split_atoi (char *str, int *val) { int i; - + for (i=0; i<MAX_ITEMS_PER_COMBO; i++) { if (!str) break; - + val[i] = atoi(str); - str = strchr(str,':'); - if (str) *str++=0; } - + if( i == 0 ) //No data found. return 0; - + return i; } /** @@ -1235,41 +1222,38 @@ int itemdb_combo_split_atoi (char *str, int *val) { void itemdb_read_combos() { uint32 lines = 0, count = 0; char line[1024]; - char filepath[256]; FILE* fp; - + sprintf(filepath, "%s/%s", map->db_path, DBPATH"item_combo_db.txt"); - + if ((fp = fopen(filepath, "r")) == NULL) { ShowError("itemdb_read_combos: File not found \"%s\".\n", filepath); return; } - + // process rows one by one while(fgets(line, sizeof(line), fp)) { char *str[2], *p; - + lines++; if (line[0] == '/' && line[1] == '/') continue; - + memset(str, 0, sizeof(str)); - + p = line; - p = trim(p); - if (*p == '\0') continue;// empty line - + if (!strchr(p,',')) { /* is there even a single column? */ ShowError("itemdb_read_combos: Insufficient columns in line %d of \"%s\", skipping.\n", lines, filepath); continue; } - + str[0] = p; p = strchr(p,','); *p = '\0'; @@ -1278,12 +1262,12 @@ void itemdb_read_combos() { str[1] = p; p = strchr(p,','); p++; - + if (str[1][0] != '{') { ShowError("itemdb_read_combos(#1): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, filepath); continue; } - + /* no ending key anywhere (missing \}\) */ if ( str[1][strlen(str[1])-1] != '}' ) { ShowError("itemdb_read_combos(#2): Invalid format (Script column) in line %d of \"%s\", skipping.\n", lines, filepath); @@ -1292,12 +1276,12 @@ void itemdb_read_combos() { int items[MAX_ITEMS_PER_COMBO]; int v = 0, retcount = 0; struct item_combo *combo = NULL; - + if((retcount = itemdb->combo_split_atoi(str[0], items)) < 2) { ShowError("itemdb_read_combos: line %d of \"%s\" doesn't have enough items to make for a combo (min:2), skipping.\n", lines, filepath); continue; } - + /* validate */ for(v = 0; v < retcount; v++) { if( !itemdb->exists(items[v]) ) { @@ -1308,11 +1292,11 @@ void itemdb_read_combos() { /* failed at some item */ if( v < retcount ) continue; - + RECREATE(itemdb->combos, struct item_combo*, ++itemdb->combo_count); - + CREATE(combo, struct item_combo, 1); - + combo->count = retcount; combo->script = script->parse(str[1], filepath, lines, 0, NULL); combo->id = itemdb->combo_count - 1; @@ -1320,37 +1304,28 @@ void itemdb_read_combos() { for( v = 0; v < retcount; v++ ) { combo->nameid[v] = items[v]; } - + itemdb->combos[itemdb->combo_count - 1] = combo; - + /* populate the items to refer to this combo */ for( v = 0; v < retcount; v++ ) { struct item_data * it; int index; - + it = itemdb->exists(items[v]); - index = it->combos_count; - RECREATE(it->combos, struct item_combo*, ++it->combos_count); - it->combos[index] = combo; } - } - count++; } - fclose(fp); - ShowStatus("Done reading '"CL_WHITE"%"PRIu32""CL_RESET"' entries in '"CL_WHITE"item_combo_db"CL_RESET"'.\n", count); - + return; } - - /*====================================== * Applies gender restrictions according to settings. [Skotlex] *======================================*/ @@ -1498,7 +1473,7 @@ int itemdb_validate_entry(struct item_data *entry, int n, const char *source) { entry->flag.available = 1; entry->view_id = 0; } - + entry->sex = itemdb->gendercheck(entry); //Apply gender filtering. // Validated. Finally insert it @@ -1813,7 +1788,7 @@ int itemdb_readdb_libconfig_sub(config_setting_t *it, int n, const char *source) if( (t = libconfig->setting_get_member(it, "ForceSerial")) ) id.flag.force_serial = libconfig->setting_get_bool(t) ? 1 : 0; - + if ( (t = libconfig->setting_get_member(it, "BuyingStore")) ) id.flag.buyingstore = libconfig->setting_get_bool(t) ? 1 : 0; @@ -1926,7 +1901,7 @@ int itemdb_readdb_libconfig_sub(config_setting_t *it, int n, const char *source) id.flag.available = 1; id.view_id = i32; } - + if( libconfig->setting_lookup_string(it, "Script", &str) ) id.script = *str ? script->parse(str, source, -id.nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL; @@ -1970,7 +1945,7 @@ int itemdb_readdb_libconfig(const char *filename) { config_setting_t *itdb, *it; char filepath[256]; int i = 0, count = 0; - + sprintf(filepath, "%s/%s", map->db_path, filename); memset(&duplicate,0,sizeof(duplicate)); if( libconfig->read_file(&item_db_conf, filepath) || !(itdb = libconfig->setting_get_member(item_db_conf.root, "item_db")) ) { @@ -1995,7 +1970,7 @@ int itemdb_readdb_libconfig(const char *filename) { } libconfig->destroy(&item_db_conf); ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filename); - + return count; } @@ -2008,7 +1983,7 @@ int itemdb_readdb_libconfig(const char *filename) { */ int itemdb_readdb_sql(const char *tablename) { int i = 0, count = 0; - + // retrieve all rows from the item database if( SQL_ERROR == SQL->Query(map->mysql_handle, "SELECT `id`, `name_english`, `name_japanese`, `type`," " `price_buy`, `price_sell`, `weight`, `atk`," @@ -2053,7 +2028,7 @@ uint64 itemdb_unique_id(struct map_session_data *sd) { void itemdb_read(bool minimal) { int i; DBData prev; - + if (map->db_use_sql_item_db) { const char* item_db_name[] = { map->item_db_db, @@ -2070,7 +2045,7 @@ void itemdb_read(bool minimal) { for(i = 0; i < ARRAYLENGTH(filename); i++) itemdb->readdb_libconfig(filename[i]); } - + for( i = 0; i < ARRAYLENGTH(itemdb->array); ++i ) { if( itemdb->array[i] ) { if( itemdb->names->put(itemdb->names,DB->str2key(itemdb->array[i]->name),DB->ptr2data(itemdb->array[i]),&prev) ) { @@ -2079,7 +2054,7 @@ void itemdb_read(bool minimal) { } } } - + if (minimal) return; @@ -2164,7 +2139,7 @@ void itemdb_clear(bool total) { if( itemdb->array[i] ) itemdb->destroy_item_data(itemdb->array[i], 1); } - + if( itemdb->groups ) { for( i = 0; i < itemdb->group_count; i++ ) { @@ -2176,7 +2151,7 @@ void itemdb_clear(bool total) { itemdb->groups = NULL; itemdb->group_count = 0; - + if (itemdb->chains) { for (i = 0; i < itemdb->chain_count; i++) { if (itemdb->chains[i].items) @@ -2187,7 +2162,7 @@ void itemdb_clear(bool total) { itemdb->chains = NULL; itemdb->chain_count = 0; - + if (itemdb->packages) { for (i = 0; i < itemdb->package_count; i++) { if (itemdb->packages[i].random_groups) { @@ -2203,7 +2178,7 @@ void itemdb_clear(bool total) { itemdb->packages = NULL; } itemdb->package_count = 0; - + if (itemdb->combos) { for (i = 0; i < itemdb->combo_count; i++) { if (itemdb->combos[i]->script) // Check if script was loaded @@ -2215,28 +2190,28 @@ void itemdb_clear(bool total) { itemdb->combos = NULL; itemdb->combo_count = 0; - + if (total) return; - + itemdb->other->clear(itemdb->other, itemdb->final_sub); - + memset(itemdb->array, 0, sizeof(itemdb->array)); - - db_clear(itemdb->names); + db_clear(itemdb->names); } + void itemdb_reload(void) { struct s_mapiterator* iter; struct map_session_data* sd; int i,d,k; - + itemdb->clear(false); // read new data itemdb->read(false); - + //Epoque's awesome @reloaditemdb fix - thanks! [Ind] //- Fixes the need of a @reloadmobdb after a @reloaditemdb to re-link monster drop data for( i = 0; i < MAX_MOB_DB; i++ ) { @@ -2257,7 +2232,7 @@ void itemdb_reload(void) { if (k == MAX_SEARCH) continue; - + if (id->mob[k].id != i && k != MAX_SEARCH - 1) memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0])); id->mob[k].chance = entry->dropitem[d].p; @@ -2287,7 +2262,7 @@ void itemdb_reload(void) { void itemdb_name_constants(void) { DBIterator *iter = db_iterator(itemdb->names); struct item_data *data; - + #ifdef ENABLE_CASE_CHECK script->parser_current_file = "Item Database (Likely an invalid or conflicting AegisName)"; #endif // ENABLE_CASE_CHECK @@ -2301,7 +2276,7 @@ void itemdb_name_constants(void) { } void do_final_itemdb(void) { itemdb->clear(true); - + itemdb->other->destroy(itemdb->other, itemdb->final_sub); itemdb->destroy_item_data(&itemdb->dummy, 0); db_destroy(itemdb->names); @@ -2318,14 +2293,14 @@ void do_init_itemdb(bool minimal) { return; clif->cashshop_load(); - + /** it failed? we disable it **/ if( !clif->parse_roulette_db() ) battle_config.feature_roulette = 0; } void itemdb_defaults(void) { itemdb = &itemdb_s; - + itemdb->init = do_init_itemdb; itemdb->final = do_final_itemdb; itemdb->reload = itemdb_reload; diff --git a/src/map/log.c b/src/map/log.c index 0c5977c05..a74cb27c5 100644 --- a/src/map/log.c +++ b/src/map/log.c @@ -54,7 +54,6 @@ char log_picktype2char(e_log_pick_type type) { return 'X'; } - /// obtain log type character for chat logs char log_chattype2char(e_log_chat_type type) { switch( type ) { @@ -70,7 +69,6 @@ char log_chattype2char(e_log_chat_type type) { return 'O'; } - /// check if this item should be logged according the settings bool should_log_item(int nameid, int amount, int refine, struct item_data *id) { int filter = logs->config.filter; @@ -112,7 +110,7 @@ void log_branch_sub_txt(struct map_session_data* sd) { char timestring[255]; time_t curtime; FILE* logfp; - + if( ( logfp = fopen(logs->config.log_branch, "a") ) == NULL ) return; time(&curtime); @@ -145,7 +143,7 @@ void log_pick_sub_txt(int id, int16 m, e_log_pick_type type, int amount, struct char timestring[255]; time_t curtime; FILE* logfp; - + if( ( logfp = fopen(logs->config.log_pick, "a") ) == NULL ) return; time(&curtime); @@ -174,7 +172,6 @@ void log_pick_pc(struct map_session_data* sd, e_log_pick_type type, int amount, log_pick(sd->status.char_id, sd->bl.m, type, amount, itm, data ? data : itemdb->exists(itm->nameid)); } - /// logs item transactions (monsters) void log_pick_mob(struct mob_data* md, e_log_pick_type type, int amount, struct item* itm, struct item_data *data) { nullpo_retv(md); @@ -192,7 +189,7 @@ void log_zeny_sub_txt(struct map_session_data* sd, e_log_pick_type type, struct char timestring[255]; time_t curtime; FILE* logfp; - + if( ( logfp = fopen(logs->config.log_zeny, "a") ) == NULL ) return; time(&curtime); @@ -222,7 +219,7 @@ void log_mvpdrop_sub_txt(struct map_session_data* sd, int monster_id, int* log_m char timestring[255]; time_t curtime; FILE* logfp; - + if( ( logfp = fopen(logs->config.log_mvpdrop,"a") ) == NULL ) return; time(&curtime); @@ -243,7 +240,7 @@ void log_mvpdrop(struct map_session_data* sd, int monster_id, int* log_mvp) void log_atcommand_sub_sql(struct map_session_data* sd, const char* message) { SqlStmt* stmt; - + stmt = SQL->StmtMalloc(logs->mysql_handle); if( SQL_SUCCESS != SQL->StmtPrepare(stmt, LOG_QUERY " INTO `%s` (`atcommand_date`, `account_id`, `char_id`, `char_name`, `map`, `command`) VALUES (NOW(), '%d', '%d', ?, '%s', ?)", logs->config.log_gm, sd->status.account_id, sd->status.char_id, mapindex_id2name(sd->mapindex) ) || SQL_SUCCESS != SQL->StmtBindParam(stmt, 0, SQLDT_STRING, sd->status.name, strnlen(sd->status.name, NAME_LENGTH)) @@ -260,7 +257,7 @@ void log_atcommand_sub_txt(struct map_session_data* sd, const char* message) { char timestring[255]; time_t curtime; FILE* logfp; - + if( ( logfp = fopen(logs->config.log_gm, "a") ) == NULL ) return; time(&curtime); @@ -298,7 +295,7 @@ void log_npc_sub_txt(struct map_session_data *sd, const char *message) { char timestring[255]; time_t curtime; FILE* logfp; - + if( ( logfp = fopen(logs->config.log_npc, "a") ) == NULL ) return; time(&curtime); @@ -319,7 +316,7 @@ void log_npc(struct map_session_data* sd, const char* message) void log_chat_sub_sql(e_log_chat_type type, int type_id, int src_charid, int src_accid, const char *mapname, int x, int y, const char* dst_charname, const char* message) { SqlStmt* stmt; - + stmt = SQL->StmtMalloc(logs->mysql_handle); if( SQL_SUCCESS != SQL->StmtPrepare(stmt, LOG_QUERY " INTO `%s` (`time`, `type`, `type_id`, `src_charid`, `src_accountid`, `src_map`, `src_map_x`, `src_map_y`, `dst_charname`, `message`) VALUES (NOW(), '%c', '%d', '%d', '%d', '%s', '%d', '%d', ?, ?)", logs->config.log_chat, logs->chattype2char(type), type_id, src_charid, src_accid, mapname, x, y) || SQL_SUCCESS != SQL->StmtBindParam(stmt, 0, SQLDT_STRING, (char*)dst_charname, safestrnlen(dst_charname, NAME_LENGTH)) @@ -336,7 +333,7 @@ void log_chat_sub_txt(e_log_chat_type type, int type_id, int src_charid, int src char timestring[255]; time_t curtime; FILE* logfp; - + if( ( logfp = fopen(logs->config.log_chat, "a") ) == NULL ) return; time(&curtime); @@ -363,12 +360,12 @@ void log_chat(e_log_chat_type type, int type_id, int src_charid, int src_accid, void log_sql_init(void) { // log db connection logs->mysql_handle = SQL->Malloc(); - + ShowInfo(""CL_WHITE"[SQL]"CL_RESET": Connecting to the Log Database "CL_WHITE"%s"CL_RESET" At "CL_WHITE"%s"CL_RESET"...\n",logs->db_name,logs->db_ip); if ( SQL_ERROR == SQL->Connect(logs->mysql_handle, logs->db_id, logs->db_pw, logs->db_ip, logs->db_port, logs->db_name) ) exit(EXIT_FAILURE); ShowStatus(""CL_WHITE"[SQL]"CL_RESET": Successfully '"CL_GREEN"connected"CL_RESET"' to Database '"CL_WHITE"%s"CL_RESET"'.\n", logs->db_name); - + if (map->default_codepage[0] != '\0') if ( SQL_ERROR == SQL->SetEncoding(logs->mysql_handle, map->default_codepage) ) Sql_ShowDebug(logs->mysql_handle); @@ -389,7 +386,6 @@ void log_set_defaults(void) { logs->config.amount_items_log = 100; } - int log_config_read(const char* cfgName) { static int count = 0; char line[1024], w1[1024], w2[1024]; @@ -506,7 +502,7 @@ void log_config_complete(void) { } void log_defaults(void) { logs = &log_s; - + sprintf(logs->db_ip,"127.0.0.1"); sprintf(logs->db_id,"ragnarok"); sprintf(logs->db_pw,"ragnarok"); @@ -515,7 +511,7 @@ void log_defaults(void) { logs->db_port = 3306; logs->mysql_handle = NULL; /* */ - + logs->pick_pc = log_pick_pc; logs->pick_mob = log_pick_mob; logs->zeny = log_zeny; @@ -524,7 +520,7 @@ void log_defaults(void) { logs->atcommand = log_atcommand; logs->branch = log_branch; logs->mvpdrop = log_mvpdrop; - + /* will be modified in a few seconds once loading is complete. */ logs->pick_sub = log_pick_sub_txt; logs->zeny_sub = log_zeny_sub_txt; diff --git a/src/map/mail.c b/src/map/mail.c index 0bdad2877..e952d9b63 100644 --- a/src/map/mail.c +++ b/src/map/mail.c @@ -83,7 +83,7 @@ unsigned char mail_setitem(struct map_session_data *sd, int idx, int amount) { if( idx < 0 || idx >= MAX_INVENTORY ) return 1; - if( amount < 0 || amount > sd->status.inventory[idx].amount ) + if( amount <= 0 || amount > sd->status.inventory[idx].amount ) return 1; if( !pc_can_give_items(sd) || sd->status.inventory[idx].expire_time || !itemdb_canmail(&sd->status.inventory[idx],pc_get_group_level(sd)) || @@ -122,6 +122,8 @@ bool mail_setattachment(struct map_session_data *sd, struct mail_message *msg) memcpy(&msg->item, &sd->status.inventory[n], sizeof(struct item)); msg->item.amount = sd->mail.amount; + if (msg->item.amount != sd->mail.amount) // check for amount overflow + return false; } else memset(&msg->item, 0x00, sizeof(struct item)); @@ -193,7 +195,7 @@ bool mail_invalid_operation(struct map_session_data *sd) { void mail_defaults(void) { mail = &mail_s; - + mail->clear = mail_clear; mail->removeitem = mail_removeitem; mail->removezeny = mail_removezeny; diff --git a/src/map/map.c b/src/map/map.c index a7b171ddf..e01a25366 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -111,7 +111,7 @@ int map_usercount(void) { *------------------------------------------*/ int map_freeblock (struct block_list *bl) { nullpo_retr(map->block_free_lock, bl); - + if (map->block_free_lock == 0) { if( bl->type == BL_ITEM ) ers_free(map->flooritem_ers, bl); @@ -119,10 +119,9 @@ int map_freeblock (struct block_list *bl) { aFree(bl); bl = NULL; } else { - if( map->block_free_count >= map->block_free_list_size ) map_block_free_expand(); - + map->block_free[map->block_free_count++] = bl; } @@ -139,7 +138,6 @@ int map_freeblock_lock (void) { * Remove the lock on map_bl *------------------------------------------*/ int map_freeblock_unlock (void) { - if ((--map->block_free_lock) == 0) { int i; for (i = 0; i < map->block_free_count; i++) { @@ -375,8 +373,6 @@ int map_moveblock(struct block_list *bl, int x1, int y1, int64 tick) { ) { sc->data[SC_PROPERTYWALK]->val3++; } - - } /* Guild Aura Moving */ if( bl->type == BL_PC && ((TBL_PC*)bl)->state.gmaster_flag ) { @@ -840,7 +836,7 @@ static int bl_vgetall_inshootrange(struct block_list *bl, va_list args) if (!check_distance_bl(center, bl, range)) return 0; #endif - if (!path->search_long(NULL, center->m, center->x, center->y, bl->x, bl->y, CELL_CHKWALL)) + if (!path->search_long(NULL, center, center->m, center->x, center->y, bl->x, bl->y, CELL_CHKWALL)) return 0; return 1; } @@ -1195,7 +1191,7 @@ static int bl_vgetall_inpath(struct block_list *bl, va_list args) if ( k < 0 || k > len_limit ) //Since more skills use this, check for ending point as well. return 0; - if ( k > magnitude2 && !path->search_long(NULL, m, x0, y0, xi, yi, CELL_CHKWALL) ) + if ( k > magnitude2 && !path->search_long(NULL, NULL, m, x0, y0, xi, yi, CELL_CHKWALL) ) return 0; //Targets beyond the initial ending point need the wall check. //All these shifts are to increase the precision of the intersection point and distance considering how it's @@ -1366,7 +1362,6 @@ int map_clearflooritem_timer(int tid, int64 tick, int id, intptr_t data) { return 1; } - if (pet->search_petDB_index(fitem->item_data.nameid, PET_EGG) >= 0) intif->delete_petdata(MakeDWord(fitem->item_data.card[1], fitem->item_data.card[2])); @@ -1397,7 +1392,7 @@ void map_clearflooritem(struct block_list *bl) { * to place an BL_ITEM object. Scan area is 9x9, returns 1 on success. * x and y are modified with the target cell when successful. *------------------------------------------*/ -int map_searchrandfreecell(int16 m,int16 *x,int16 *y,int stack) { +int map_searchrandfreecell(int16 m, const struct block_list *bl, int16 *x, int16 *y, int stack) { int free_cell,i,j; int free_cells[9][2]; @@ -1407,7 +1402,7 @@ int map_searchrandfreecell(int16 m,int16 *x,int16 *y,int stack) { for(j=-1;j<=1;j++){ if(j+*x<0 || j+*x>=map->list[m].xs) continue; - if(map->getcell(m,j+*x,i+*y,CELL_CHKNOPASS) && !map->getcell(m,j+*x,i+*y,CELL_CHKICEWALL)) + if (map->getcell(m, bl, j + *x, i + *y, CELL_CHKNOPASS) && !map->getcell(m, bl, j + *x, i + *y, CELL_CHKICEWALL)) continue; //Avoid item stacking to prevent against exploits. [Skotlex] if(stack && map->count_oncell(m,j+*x,i+*y, BL_ITEM, 0) > stack) @@ -1424,7 +1419,6 @@ int map_searchrandfreecell(int16 m,int16 *x,int16 *y,int stack) { return 1; } - int map_count_sub(struct block_list *bl,va_list ap) { return 1; } @@ -1466,7 +1460,7 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1 //No range? Return the target cell then.... *x = bx; *y = by; - return map->getcell(m,*x,*y,CELL_CHKREACH); + return map->getcell(m, src, *x, *y, CELL_CHKREACH); } if (rx >= 0 && ry >= 0) { @@ -1484,7 +1478,7 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1 if (*x == bx && *y == by) continue; //Avoid picking the same target tile. - if (map->getcell(m,*x,*y,CELL_CHKREACH)) { + if (map->getcell(m, src, *x, *y, CELL_CHKREACH)) { if(flag&2 && !unit->can_reach_pos(src, *x, *y, 1)) continue; if(flag&4) { @@ -1511,7 +1505,7 @@ int map_search_freecell(struct block_list *src, int16 m, int16 *x,int16 *y, int1 * flag: * 0x1 - only count standing units *------------------------------------------*/ -bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag) +bool map_closest_freecell(int16 m, const struct block_list *bl, int16 *x, int16 *y, int type, int flag) { uint8 dir = 6; int16 tx = *x; @@ -1530,7 +1524,7 @@ bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag) if(dir%2 == 0 && costrange%MOVE_COST == 0) { tx = *x+dx*(costrange/MOVE_COST); ty = *y+dy*(costrange/MOVE_COST); - if(!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m,tx,ty,CELL_CHKPASS)) { + if (!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m, bl, tx, ty, CELL_CHKPASS)) { *x = tx; *y = ty; return true; @@ -1540,7 +1534,7 @@ bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag) else if(dir%2 == 1 && costrange%MOVE_DIAGONAL_COST == 0) { tx = *x+dx*(costrange/MOVE_DIAGONAL_COST); ty = *y+dy*(costrange/MOVE_DIAGONAL_COST); - if(!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m,tx,ty,CELL_CHKPASS)) { + if (!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m, bl, tx, ty, CELL_CHKPASS)) { *x = tx; *y = ty; return true; @@ -1550,14 +1544,14 @@ bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag) else if(dir%2 == 1 && costrange%MOVE_COST == 4) { tx = *x+dx*((dir%4==3)?(costrange/MOVE_COST):1); ty = *y+dy*((dir%4==1)?(costrange/MOVE_COST):1); - if(!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m,tx,ty,CELL_CHKPASS)) { + if (!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m, bl, tx, ty, CELL_CHKPASS)) { *x = tx; *y = ty; return true; } tx = *x+dx*((dir%4==1)?(costrange/MOVE_COST):1); ty = *y+dy*((dir%4==3)?(costrange/MOVE_COST):1); - if(!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m,tx,ty,CELL_CHKPASS)) { + if (!map->count_oncell(m, tx, ty, type, flag) && map->getcell(m, bl, tx, ty, CELL_CHKPASS)) { *x = tx; *y = ty; return true; @@ -1591,19 +1585,19 @@ bool map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag) * @first_charid, @second_charid, @third_charid, looting priority * @flag: &1 MVP item. &2 do stacking check. *------------------------------------------*/ -int map_addflooritem(struct item *item_data,int amount,int16 m,int16 x,int16 y,int first_charid,int second_charid,int third_charid,int flags) +int map_addflooritem(const struct block_list *bl, struct item *item_data, int amount, int16 m, int16 x, int16 y, int first_charid, int second_charid, int third_charid, int flags) { int r; struct flooritem_data *fitem=NULL; nullpo_ret(item_data); - if (!map->searchrandfreecell(m, &x, &y, (flags&2)?1:0)) + if (!map->searchrandfreecell(m, bl, &x, &y, (flags&2)?1:0)) return 0; r=rnd(); fitem = ers_alloc(map->flooritem_ers, struct flooritem_data); - + fitem->bl.type = BL_ITEM; fitem->bl.prev = fitem->bl.next = NULL; fitem->bl.m = m; @@ -1789,7 +1783,7 @@ int map_quit(struct map_session_data *sd) { //Non-active players should not have loaded any data yet (or it was cleared already) so no additional cleanups are needed. return 0; } - + if( sd->expiration_tid != INVALID_TIMER ) timer->delete(sd->expiration_tid,pc->expiration_timer); @@ -1882,7 +1876,7 @@ int map_quit(struct map_session_data *sd) { if( sd->state.vending ) { idb_remove(vending->db, sd->status.char_id); } - + party->booking_delete(sd); // Party Booking [Spiria] pc->makesavestatus(sd); pc->clean_skilltree(sd); @@ -2567,8 +2561,8 @@ int map_random_dir(struct block_list *bl, int16 *x, int16 *y) xi = bl->x + segment*dirx[j]; segment = (short)sqrt((float)(dist2 - segment*segment)); //The complement of the previously picked segment yi = bl->y + segment*diry[j]; - } while ( (map->getcell(bl->m,xi,yi,CELL_CHKNOPASS) || !path->search(NULL,bl->m,bl->x,bl->y,xi,yi,1,CELL_CHKNOREACH)) - && (++i)<100 ); + } while ((map->getcell(bl->m, bl, xi, yi, CELL_CHKNOPASS) || !path->search(NULL, bl, bl->m, bl->x, bl->y, xi, yi, 1, CELL_CHKNOREACH)) + && (++i)<100); if (i < 100) { *x = xi; @@ -2640,11 +2634,11 @@ void map_cellfromcache(struct map_data *m) { /*========================================== * Confirm if celltype in (m,x,y) match the one given in cellchk *------------------------------------------*/ -int map_getcell(int16 m,int16 x,int16 y,cell_chk cellchk) { - return (m < 0 || m >= map->count) ? 0 : map->list[m].getcellp(&map->list[m],x,y,cellchk); +int map_getcell(int16 m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk) { + return (m < 0 || m >= map->count) ? 0 : map->list[m].getcellp(&map->list[m], bl, x, y, cellchk); } -int map_getcellp(struct map_data* m,int16 x,int16 y,cell_chk cellchk) { +int map_getcellp(struct map_data* m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk) { struct mapcell cell; nullpo_ret(m); @@ -2663,14 +2657,11 @@ int map_getcellp(struct map_data* m,int16 x,int16 y,cell_chk cellchk) { // base gat type checks case CELL_CHKWALL: return (!cell.walkable && !cell.shootable); - case CELL_CHKWATER: return (cell.water); - case CELL_CHKCLIFF: return (!cell.walkable && cell.shootable); - // base cell type checks case CELL_CHKNPC: return (cell.npc); @@ -2715,12 +2706,13 @@ int map_getcellp(struct map_data* m,int16 x,int16 y,cell_chk cellchk) { } /* [Ind/Hercules] */ -int map_sub_getcellp(struct map_data* m,int16 x,int16 y,cell_chk cellchk) { +int map_sub_getcellp(struct map_data* m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk) { map->cellfromcache(m); m->getcellp = map->getcellp; m->setcell = map->setcell; - return m->getcellp(m,x,y,cellchk); + return m->getcellp(m, bl, x, y, cellchk); } + /*========================================== * Change the type/flags of a map cell * 'cell' - which flag to modify @@ -2808,7 +2800,7 @@ bool map_iwall_set(int16 m, int16 x, int16 y, int size, int8 dir, bool shootable if( (iwall = (struct iwall_data *)strdb_get(map->iwall_db, wall_name)) != NULL ) return false; // Already Exists - if( map->getcell(m, x, y, CELL_CHKNOREACH) ) + if (map->getcell(m, NULL, x, y, CELL_CHKNOREACH)) return false; // Starting cell problem CREATE(iwall, struct iwall_data, 1); @@ -2823,13 +2815,13 @@ bool map_iwall_set(int16 m, int16 x, int16 y, int size, int8 dir, bool shootable for( i = 0; i < size; i++ ) { map->iwall_nextxy(x, y, dir, i, &x1, &y1); - if( map->getcell(m, x1, y1, CELL_CHKNOREACH) ) + if (map->getcell(m, NULL, x1, y1, CELL_CHKNOREACH)) break; // Collision map->list[m].setcell(m, x1, y1, CELL_WALKABLE, false); map->list[m].setcell(m, x1, y1, CELL_SHOOTABLE, shootable); - clif->changemapcell(0, m, x1, y1, map->getcell(m, x1, y1, CELL_GETTYPE), ALL_SAMEMAP); + clif->changemapcell(0, m, x1, y1, map->getcell(m, NULL, x1, y1, CELL_GETTYPE), ALL_SAMEMAP); } iwall->size = i; @@ -2856,7 +2848,7 @@ void map_iwall_get(struct map_session_data *sd) { for( i = 0; i < iwall->size; i++ ) { map->iwall_nextxy(iwall->x, iwall->y, iwall->dir, i, &x1, &y1); - clif->changemapcell(sd->fd, iwall->m, x1, y1, map->getcell(iwall->m, x1, y1, CELL_GETTYPE), SELF); + clif->changemapcell(sd->fd, iwall->m, x1, y1, map->getcell(iwall->m, &sd->bl, x1, y1, CELL_GETTYPE), SELF); } } dbi_destroy(iter); @@ -2876,7 +2868,7 @@ void map_iwall_remove(const char *wall_name) map->list[iwall->m].setcell(iwall->m, x1, y1, CELL_SHOOTABLE, true); map->list[iwall->m].setcell(iwall->m, x1, y1, CELL_WALKABLE, true); - clif->changemapcell(0, iwall->m, x1, y1, map->getcell(iwall->m, x1, y1, CELL_GETTYPE), ALL_SAMEMAP); + clif->changemapcell(0, iwall->m, x1, y1, map->getcell(iwall->m, NULL, x1, y1, CELL_GETTYPE), ALL_SAMEMAP); } map->list[iwall->m].iwall_num--; @@ -3044,7 +3036,6 @@ int map_readfromcache(struct map_data *m, char *buffer) { return 0; // Not found } - int map_addmap(const char* mapname) { map->list[map->count].instance_id = -1; mapindex->getmapname(mapname, map->list[map->count++].name); @@ -3081,38 +3072,38 @@ int map_delmap(char* mapname) { **/ void map_zone_clear_single(struct map_zone_data *zone) { int i; - + for(i = 0; i < zone->disabled_skills_count; i++) { aFree(zone->disabled_skills[i]); } - + if( zone->disabled_skills ) aFree(zone->disabled_skills); - + if( zone->disabled_items ) aFree(zone->disabled_items); - + if( zone->cant_disable_items ) aFree(zone->cant_disable_items); - + for(i = 0; i < zone->mapflags_count; i++) { aFree(zone->mapflags[i]); } - + if( zone->mapflags ) aFree(zone->mapflags); - + for(i = 0; i < zone->disabled_commands_count; i++) { aFree(zone->disabled_commands[i]); } - + if( zone->disabled_commands ) aFree(zone->disabled_commands); - + for(i = 0; i < zone->capped_skills_count; i++) { aFree(zone->capped_skills[i]); } - + if( zone->capped_skills ) aFree(zone->capped_skills); } @@ -3122,11 +3113,11 @@ void map_zone_clear_single(struct map_zone_data *zone) { void map_zone_db_clear(void) { struct map_zone_data *zone; DBIterator *iter = db_iterator(map->zone_db); - + for(zone = dbi_first(iter); dbi_exists(iter); zone = dbi_next(iter)) { map->zone_clear_single(zone); } - + dbi_destroy(iter); db_destroy(map->zone_db);/* will aFree(zone) */ @@ -3244,10 +3235,10 @@ void do_final_maps(void) { if( map->list[i].channel ) channel->delete(map->list[i].channel); - + if( map->list[i].qi_data ) aFree(map->list[i].qi_data); - + if( map->list[i].hdata ) { for( v = 0; v < map->list[i].hdatac; v++ ) { @@ -3323,10 +3314,10 @@ void map_flags_init(void) { map->list[i].misc_damage_rate = 100; map->list[i].short_damage_rate = 100; map->list[i].long_damage_rate = 100; - + if( map->list[i].qi_data ) aFree(map->list[i].qi_data); - + map->list[i].qi_data = NULL; map->list[i].qi_count = 0; } @@ -3717,7 +3708,7 @@ int inter_config_read(char *cfgName) { while (fgets(line, sizeof(line), fp)) { if (line[0] == '/' && line[1] == '/') continue; - + if (sscanf(line,"%1023[^:]: %1023[^\r\n]", w1, w2) < 2) continue; /* table names */ @@ -3855,34 +3846,32 @@ struct map_zone_data *map_merge_zone(struct map_zone_data *main, struct map_zone char newzone[MAP_ZONE_NAME_LENGTH]; struct map_zone_data *zone = NULL; int cursor, i, j; - + sprintf(newzone, "%s+%s",main->name,other->name); - + if( (zone = strdb_get(map->zone_db, newzone)) ) return zone;/* this zone has already been merged */ - + CREATE(zone, struct map_zone_data, 1); - safestrncpy(zone->name, newzone, MAP_ZONE_NAME_LENGTH); - + zone->merge_type = MZMT_NEVERMERGE; zone->disabled_skills_count = main->disabled_skills_count + other->disabled_skills_count; zone->disabled_items_count = main->disabled_items_count + other->disabled_items_count; zone->mapflags_count = main->mapflags_count + other->mapflags_count; zone->disabled_commands_count = main->disabled_commands_count + other->disabled_commands_count; zone->capped_skills_count = main->capped_skills_count + other->capped_skills_count; - + CREATE(zone->disabled_skills, struct map_zone_disabled_skill_entry *, zone->disabled_skills_count ); - for(i = 0, cursor = 0; i < main->disabled_skills_count; i++, cursor++ ) { CREATE(zone->disabled_skills[cursor], struct map_zone_disabled_skill_entry, 1 ); memcpy(zone->disabled_skills[cursor], main->disabled_skills[i], sizeof(struct map_zone_disabled_skill_entry)); } - + for(i = 0; i < other->disabled_skills_count; i++, cursor++ ) { CREATE(zone->disabled_skills[cursor], struct map_zone_disabled_skill_entry, 1 ); memcpy(zone->disabled_skills[cursor], other->disabled_skills[i], sizeof(struct map_zone_disabled_skill_entry)); } - + for(j = 0; j < main->cant_disable_items_count; j++) { for(i = 0; i < other->disabled_items_count; i++) { if( other->disabled_items[i] == main->cant_disable_items[j] ) { @@ -3893,11 +3882,10 @@ struct map_zone_data *map_merge_zone(struct map_zone_data *main, struct map_zone } CREATE(zone->disabled_items, int, zone->disabled_items_count ); - for(i = 0, cursor = 0; i < main->disabled_items_count; i++, cursor++ ) { zone->disabled_items[cursor] = main->disabled_items[i]; } - + for(i = 0; i < other->disabled_items_count; i++) { for(j = 0; j < main->cant_disable_items_count; j++) { if( other->disabled_items[i] == main->cant_disable_items[j] ) { @@ -3911,45 +3899,40 @@ struct map_zone_data *map_merge_zone(struct map_zone_data *main, struct map_zone } CREATE(zone->mapflags, char *, zone->mapflags_count ); - for(i = 0, cursor = 0; i < main->mapflags_count; i++, cursor++ ) { CREATE(zone->mapflags[cursor], char, MAP_ZONE_MAPFLAG_LENGTH ); safestrncpy(zone->mapflags[cursor], main->mapflags[i], MAP_ZONE_MAPFLAG_LENGTH); } - + for(i = 0; i < other->mapflags_count; i++, cursor++ ) { CREATE(zone->mapflags[cursor], char, MAP_ZONE_MAPFLAG_LENGTH ); safestrncpy(zone->mapflags[cursor], other->mapflags[i], MAP_ZONE_MAPFLAG_LENGTH); } - + CREATE(zone->disabled_commands, struct map_zone_disabled_command_entry *, zone->disabled_commands_count); - for(i = 0, cursor = 0; i < main->disabled_commands_count; i++, cursor++ ) { CREATE(zone->disabled_commands[cursor], struct map_zone_disabled_command_entry, 1); memcpy(zone->disabled_commands[cursor], main->disabled_commands[i], sizeof(struct map_zone_disabled_command_entry)); } - + for(i = 0; i < other->disabled_commands_count; i++, cursor++ ) { CREATE(zone->disabled_commands[cursor], struct map_zone_disabled_command_entry, 1); memcpy(zone->disabled_commands[cursor], other->disabled_commands[i], sizeof(struct map_zone_disabled_command_entry)); } - + CREATE(zone->capped_skills, struct map_zone_skill_damage_cap_entry *, zone->capped_skills_count); - for(i = 0, cursor = 0; i < main->capped_skills_count; i++, cursor++ ) { CREATE(zone->capped_skills[cursor], struct map_zone_skill_damage_cap_entry, 1); memcpy(zone->capped_skills[cursor], main->capped_skills[i], sizeof(struct map_zone_skill_damage_cap_entry)); } - + for(i = 0; i < other->capped_skills_count; i++, cursor++ ) { CREATE(zone->capped_skills[cursor], struct map_zone_skill_damage_cap_entry, 1); memcpy(zone->capped_skills[cursor], other->capped_skills[i], sizeof(struct map_zone_skill_damage_cap_entry)); } - - zone->info.special = 2; - + + zone->info.merged = 1; strdb_put(map->zone_db, newzone, zone); - return zone; } @@ -3958,17 +3941,17 @@ void map_zone_change2(int m, struct map_zone_data *zone) { if( map->list[m].zone == zone ) return; - - if( map->list[m].zone->info.special != 2 ) /* we don't update it for merged zones! */ + + if( !map->list[m].zone->info.merged ) /* we don't update it for merged zones! */ map->list[m].prev_zone = map->list[m].zone; - + if( map->list[m].zone_mf_count ) map->zone_remove(m); - if( zone->info.special ) { + if( zone->merge_type == MZMT_MERGEABLE && map->list[m].prev_zone->merge_type != MZMT_NEVERMERGE ) { zone = map->merge_zone(zone,map->list[m].prev_zone); } - + map->zone_apply(m,zone,empty,empty,empty); } /* when changing from a mapflag to another during runtime */ @@ -4917,12 +4900,15 @@ void read_map_zone_db(void) { /* is this the global template? */ if( strncmpi(zonename,MAP_ZONE_NORMAL_NAME,MAP_ZONE_NAME_LENGTH) == 0 ) { zone = &map->zone_all; + zone->merge_type = MZMT_NEVERMERGE; is_all = true; } else if( strncmpi(zonename,MAP_ZONE_PK_NAME,MAP_ZONE_NAME_LENGTH) == 0 ) { zone = &map->zone_pk; + zone->merge_type = MZMT_NEVERMERGE; is_all = true; } else { CREATE( zone, struct map_zone_data, 1 ); + zone->merge_type = MZMT_NORMAL; zone->disabled_skills_count = 0; zone->disabled_items_count = 0; } @@ -4987,7 +4973,6 @@ void read_map_zone_db(void) { if( (libconfig->setting_length(items) - disabled_items_count) > 0 ) { //Some are forcefully enabled zone->cant_disable_items_count = libconfig->setting_length(items) - disabled_items_count; CREATE(zone->cant_disable_items, int, zone->cant_disable_items_count); - } for(h = 0, v = 0, j = 0; h < libconfig->setting_length(items); h++) { config_setting_t *item = libconfig->setting_get_elem(items, h); @@ -5273,17 +5258,17 @@ void read_map_zone_db(void) { } ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' zones in '"CL_WHITE"%s"CL_RESET"'.\n", zone_count, config_filename); - /* not supposed to go in here but in skill_final whatever */ - libconfig->destroy(&map_zone_db); - + /* post-load processing */ if( (zone = strdb_get(map->zone_db, MAP_ZONE_PVP_NAME)) ) - zone->info.special = 1; + zone->merge_type = MZMT_MERGEABLE; if( (zone = strdb_get(map->zone_db, MAP_ZONE_GVG_NAME)) ) - zone->info.special = 1; + zone->merge_type = MZMT_MERGEABLE; if( (zone = strdb_get(map->zone_db, MAP_ZONE_BG_NAME)) ) - zone->info.special = 1; + zone->merge_type = MZMT_MERGEABLE; } + /* not supposed to go in here but in skill_final whatever */ + libconfig->destroy(&map_zone_db); } int map_get_new_bonus_id (void) { @@ -5292,22 +5277,22 @@ int map_get_new_bonus_id (void) { void map_add_questinfo(int m, struct questinfo *qi) { unsigned short i; - + /* duplicate, override */ for(i = 0; i < map->list[m].qi_count; i++) { if( map->list[m].qi_data[i].nd == qi->nd ) break; } - + if( i == map->list[m].qi_count ) RECREATE(map->list[m].qi_data, struct questinfo, ++map->list[m].qi_count); - + memcpy(&map->list[m].qi_data[i], qi, sizeof(struct questinfo)); } bool map_remove_questinfo(int m, struct npc_data *nd) { unsigned short i; - + for(i = 0; i < map->list[m].qi_count; i++) { struct questinfo *qi = &map->list[m].qi_data[i]; if( qi->nd == nd ) { @@ -5318,7 +5303,6 @@ bool map_remove_questinfo(int m, struct npc_data *nd) { return true; } } - return false; } @@ -5397,10 +5381,10 @@ int do_final(void) { struct s_mapiterator* iter; ShowStatus("Terminating...\n"); - + channel->config->closing = true; HPM->event(HPET_FINAL); - + if (map->cpsd) aFree(map->cpsd); //Ladies and babies first. @@ -5461,7 +5445,7 @@ int do_final(void) { vending->final(); HPM_map_do_final(); - + map->map_db->destroy(map->map_db, map->db_final); mapindex->final(); @@ -5487,8 +5471,7 @@ int do_final(void) { aFree(map->block_free); if( map->bl_list ) aFree(map->bl_list); - - + if( !map->enable_grf ) aFree(map->cache_buffer); @@ -5500,7 +5483,7 @@ int do_final(void) { aFree(map->GRF_PATH_FILENAME); aFree(map->INTER_CONF_NAME); aFree(map->LOG_CONF_NAME); - + HPM->event(HPET_POST_FINAL); ShowStatus("Finished.\n"); @@ -5512,7 +5495,6 @@ int map_abort_sub(struct map_session_data* sd, va_list ap) { return 1; } - //------------------------------ // Function called when the server // has received a crash signal. @@ -5541,7 +5523,6 @@ void set_server_type(void) { SERVER_TYPE = SERVER_TYPE_MAP; } - /// Called when a terminate signal is received. void do_shutdown(void) { @@ -5593,12 +5574,12 @@ CPCMD(gm_use) { } map->cpsd_active = true; - + if( !atcommand->exec(map->cpsd->fd, map->cpsd, line, false) ) ShowInfo("HCP: '"CL_WHITE"%s"CL_RESET"' failed\n",line); else ShowInfo("HCP: '"CL_WHITE"%s"CL_RESET"' was used\n",line); - + map->cpsd_active = false; } /* Hercules Console Parser */ @@ -5802,11 +5783,10 @@ static CMDLINEARG(loadscript) **/ static CMDLINEARG(generatetranslations) { script->lang_export_file = aStrdup("./generated_translations.pot"); - + if( !(script->lang_export_fp = fopen(script->lang_export_file,"wb")) ) { ShowError("export-dialog: failed to open '%s' for writing\n",script->lang_export_file); } - core->runflag = CORE_ST_STOP; return true; } @@ -5838,7 +5818,7 @@ int do_init(int argc, char *argv[]) #ifdef GCOLLECT GC_enable_incremental(); #endif - + map_load_defaults(); map->INTER_CONF_NAME = aStrdup("conf/inter-server.conf"); @@ -5853,9 +5833,9 @@ int do_init(int argc, char *argv[]) HPM_map_do_init(); cmdline->exec(argc, argv, CMDLINE_OPT_PREINIT); HPM->config_read(); - + HPM->event(HPET_PRE_INIT); - + cmdline->exec(argc, argv, CMDLINE_OPT_NORMAL); minimal = map->minimal;/* temp (perhaps make minimal a mask with options of what to load? e.g. plugin 1 does minimal |= mob_db; */ if (!minimal) { @@ -5936,7 +5916,6 @@ int do_init(int argc, char *argv[]) map->readallmaps(); - if (!minimal) { timer->add_func_list(map->freeblock_timer, "map_freeblock_timer"); timer->add_func_list(map->clearflooritem_timer, "map_clearflooritem_timer"); @@ -5990,19 +5969,19 @@ int do_init(int argc, char *argv[]) HPM->event(HPET_READY); exit(EXIT_SUCCESS); } - + npc->event_do_oninit( false ); // Init npcs (OnInit) npc->market_fromsql(); /* after OnInit */ - + if (battle_config.pk_mode) ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n"); Sql_HerculesUpdateCheck(map->mysql_handle); - + #ifdef CONSOLE_INPUT console->input->setSQL(map->mysql_handle); #endif - + ShowStatus("Server is '"CL_GREEN"ready"CL_RESET"' and listening on port '"CL_WHITE"%d"CL_RESET"'.\n\n", map->port); if( core->runflag != CORE_ST_STOP ) { @@ -6033,14 +6012,14 @@ void map_defaults(void) { map->extra_scripts = NULL; map->extra_scripts_count = 0; - + sprintf(map->db_path ,"db"); sprintf(map->help_txt ,"conf/help.txt"); sprintf(map->help2_txt ,"conf/help2.txt"); sprintf(map->charhelp_txt ,"conf/charhelp.txt"); - + sprintf(map->wisp_server_name ,"Server"); // can be modified in char-server configuration file - + map->autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; map->minsave_interval = 100; map->save_settings = 0xFFFF; @@ -6048,18 +6027,18 @@ void map_defaults(void) { map->agit2_flag = 0; map->night_flag = 0; // 0=day, 1=night [Yor] map->enable_spy = 0; //To enable/disable @spy commands, which consume too much cpu time when sending packets. [Skotlex] - + map->db_use_sql_item_db = 0; map->db_use_sql_mob_db = 0; map->db_use_sql_mob_skill_db = 0; - + sprintf(map->item_db_db, "item_db"); sprintf(map->item_db2_db, "item_db2"); sprintf(map->mob_db_db, "mob_db"); sprintf(map->mob_db2_db, "mob_db2"); sprintf(map->mob_skill_db_db, "mob_skill_db"); sprintf(map->mob_skill_db2_db, "mob_skill_db2"); - + map->INTER_CONF_NAME="conf/inter-server.conf"; map->LOG_CONF_NAME="conf/logs.conf"; map->MAP_CONF_NAME = "conf/map-server.conf"; @@ -6068,7 +6047,7 @@ void map_defaults(void) { map->SCRIPT_CONF_NAME = "conf/script.conf"; map->MSG_CONF_NAME = "conf/messages.conf"; map->GRF_PATH_FILENAME = "conf/grf-files.txt"; - + map->default_codepage[0] = '\0'; map->server_port = 3306; sprintf(map->server_ip,"127.0.0.1"); @@ -6079,15 +6058,15 @@ void map_defaults(void) { map->default_lang_str[0] = '\0'; map->cpsd_active = false; - + map->port = 0; map->users = 0; map->ip_set = 0; map->char_ip_set = 0; map->enable_grf = 0; - + memset(&map->index2mapid, -1, sizeof(map->index2mapid)); - + map->id_db = NULL; map->pc_db = NULL; map->mobid_db = NULL; @@ -6106,16 +6085,16 @@ void map_defaults(void) { map->bl_list = NULL; map->bl_list_count = 0; map->bl_list_size = 0; - + //all in a big chunk, respects order memset(ZEROED_BLOCK_POS(map), 0, ZEROED_BLOCK_SIZE(map)); - + map->cpsd = NULL; map->list = NULL; - + map->iterator_ers = NULL; map->cache_buffer = NULL; - + map->flooritem_ers = NULL; /* */ map->bonus_id = SP_LAST_KNOWN; @@ -6282,19 +6261,17 @@ void map_defaults(void) { map->abort_sub = map_abort_sub; map->update_cell_bl = map_update_cell_bl; - map->get_new_bonus_id = map_get_new_bonus_id; - + map->add_questinfo = map_add_questinfo; map->remove_questinfo = map_remove_questinfo; - + map->merge_zone = map_merge_zone; map->zone_clear_single = map_zone_clear_single; - + /** * mapit interface **/ - mapit = &mapit_s; mapit->alloc = mapit_alloc; @@ -6304,5 +6281,4 @@ void map_defaults(void) { mapit->next = mapit_next; mapit->prev = mapit_prev; mapit->exists = mapit_exists; - } diff --git a/src/map/map.h b/src/map/map.h index d4ab954be..3ac39e54f 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -549,6 +549,12 @@ struct map_zone_skill_damage_cap_entry { enum map_zone_skill_subtype subtype; }; +enum map_zone_merge_type { + MZMT_NORMAL = 0, ///< MZMT_MERGEABLE zones can merge *into* MZMT_NORMAL zones (but not the converse). + MZMT_MERGEABLE, ///< Can merge with other MZMT_MERGEABLE zones and *into* MZMT_NORMAL zones. + MZMT_NEVERMERGE, ///< Cannot merge with any zones. +}; + #define MAP_ZONE_NAME_LENGTH 60 #define MAP_ZONE_ALL_NAME "All" #define MAP_ZONE_NORMAL_NAME "Normal" @@ -560,6 +566,7 @@ struct map_zone_skill_damage_cap_entry { struct map_zone_data { char name[MAP_ZONE_NAME_LENGTH];/* 20'd */ + enum map_zone_merge_type merge_type; struct map_zone_disabled_skill_entry **disabled_skills; int disabled_skills_count; int *disabled_items; @@ -573,7 +580,7 @@ struct map_zone_data { struct map_zone_skill_damage_cap_entry **capped_skills; int capped_skills_count; struct { - unsigned int special : 2;/* 1: whether this is a mergeable zone; 2: whether it is a merged zone */ + unsigned int merged : 1; } info; }; @@ -719,7 +726,7 @@ struct map_data { bool custom_name; ///< Whether the instanced map is using a custom name /* */ - int (*getcellp)(struct map_data* m,int16 x,int16 y,cell_chk cellchk); + int (*getcellp)(struct map_data* m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk); void (*setcell) (int16 m, int16 x, int16 y, cell_t cell, bool flag); char *cellPos; @@ -924,7 +931,7 @@ END_ZEROED_BLOCK; void (*zone_change) (int m, struct map_zone_data *zone, const char* start, const char* buffer, const char* filepath); void (*zone_change2) (int m, struct map_zone_data *zone); - int (*getcell) (int16 m,int16 x,int16 y,cell_chk cellchk); + int (*getcell) (int16 m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk); void (*setgatcell) (int16 m, int16 x, int16 y, int gat); void (*cellfromcache) (struct map_data *m); @@ -946,7 +953,7 @@ END_ZEROED_BLOCK; // search and creation int (*get_new_object_id) (void); int (*search_freecell) (struct block_list *src, int16 m, int16 *x, int16 *y, int16 rx, int16 ry, int flag); - bool (*closest_freecell) (int16 m, int16 *x, int16 *y, int type, int flag); + bool (*closest_freecell) (int16 m, const struct block_list *bl, int16 *x, int16 *y, int type, int flag); // int (*quit) (struct map_session_data *sd); // npc @@ -955,7 +962,7 @@ END_ZEROED_BLOCK; int (*clearflooritem_timer) (int tid, int64 tick, int id, intptr_t data); int (*removemobs_timer) (int tid, int64 tick, int id, intptr_t data); void (*clearflooritem) (struct block_list* bl); - int (*addflooritem) (struct item *item_data,int amount,int16 m,int16 x,int16 y,int first_charid,int second_charid,int third_charid,int flags); + int (*addflooritem) (const struct block_list *bl, struct item *item_data, int amount, int16 m, int16 x, int16 y, int first_charid, int second_charid, int third_charid, int flags); // player to map session void (*addnickdb) (int charid, const char* nick); void (*delnickdb) (int charid, const char* nick); @@ -1042,15 +1049,15 @@ END_ZEROED_BLOCK; void (*do_shutdown) (void); int (*freeblock_timer) (int tid, int64 tick, int id, intptr_t data); - int (*searchrandfreecell) (int16 m, int16 *x, int16 *y, int stack); + int (*searchrandfreecell) (int16 m, const struct block_list *bl, int16 *x, int16 *y, int stack); int (*count_sub) (struct block_list *bl, va_list ap); DBData (*create_charid2nick) (DBKey key, va_list args); int (*removemobs_sub) (struct block_list *bl, va_list ap); struct mapcell (*gat2cell) (int gat); int (*cell2gat) (struct mapcell cell); - int (*getcellp) (struct map_data *m, int16 x, int16 y, cell_chk cellchk); + int (*getcellp) (struct map_data *m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk); void (*setcell) (int16 m, int16 x, int16 y, cell_t cell, bool flag); - int (*sub_getcellp) (struct map_data *m, int16 x, int16 y, cell_chk cellchk); + int (*sub_getcellp) (struct map_data *m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk); void (*sub_setcell) (int16 m, int16 x, int16 y, cell_t cell, bool flag); void (*iwall_nextxy) (int16 x, int16 y, int8 dir, int pos, int16 *x1, int16 *y1); DBData (*create_map_data_other_server) (DBKey key, va_list args); diff --git a/src/map/mercenary.c b/src/map/mercenary.c index ff37f396d..b26876d39 100644 --- a/src/map/mercenary.c +++ b/src/map/mercenary.c @@ -471,7 +471,7 @@ bool read_mercenary_skilldb_sub(char* str[], int columns, int current) ShowError("read_mercenary_skilldb : Class %d not found in mercenary_db for skill entry.\n", class_); return false; } - + skill_id = atoi(str[1]); if( skill_id < MC_SKILLBASE || skill_id >= MC_SKILLBASE + MAX_MERCSKILL ) { @@ -501,7 +501,7 @@ void do_init_mercenary(bool minimal) { mercenary->read_db(); mercenary->read_skilldb(); - + timer->add_func_list(mercenary->contract_end_timer, "merc_contract_end_timer"); } @@ -518,22 +518,21 @@ void mercenary_defaults(void) { memset(mercenary->db, 0, sizeof(struct s_mercenary_db) * MAX_MERCENARY_CLASS); /* funcs */ - mercenary->init = do_init_mercenary; - + mercenary->class = merc_class; mercenary->get_viewdata = merc_get_viewdata; - + mercenary->create = merc_create; mercenary->data_received = merc_data_received; mercenary->save = mercenary_save; - + mercenary->heal = mercenary_heal; mercenary->dead = mercenary_dead; - + mercenary->delete = merc_delete; mercenary->contract_stop = merc_contract_stop; - + mercenary->get_lifetime = mercenary_get_lifetime; mercenary->get_guild = mercenary_get_guild; mercenary->get_faith = mercenary_get_faith; @@ -541,14 +540,14 @@ void mercenary_defaults(void) { mercenary->get_calls = mercenary_get_calls; mercenary->set_calls = mercenary_set_calls; mercenary->kills = mercenary_kills; - + mercenary->checkskill = mercenary_checkskill; mercenary->read_db = read_mercenarydb; mercenary->read_skilldb = read_mercenary_skilldb; - + mercenary->killbonus = mercenary_killbonus; mercenary->search_index = merc_search_index; - + mercenary->contract_end_timer = merc_contract_end_timer; mercenary->read_db_sub = read_mercenarydb_sub; mercenary->read_skill_db_sub = read_mercenary_skilldb_sub; diff --git a/src/map/mob.c b/src/map/mob.c index f64c7e582..2fe9fe8fb 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -291,7 +291,7 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data) { status->set_viewdata(&md->bl, md->class_); status->change_init(&md->bl); unit->dataset(&md->bl); - + map->addiddb(&md->bl); return md; } @@ -468,7 +468,7 @@ int mob_once_spawn(struct map_session_data* sd, int16 m, int16 x, int16 y, const struct mob_data* md = NULL; int count, lv; bool no_guardian_data = false; - + if( ai && ai&0x200 ) { no_guardian_data = true; ai &=~ 0x200; @@ -545,7 +545,7 @@ int mob_once_spawn_area(struct map_session_data* sd, int16 m, int16 x0, int16 y0 x = rnd()%(x1-x0+1)+x0; y = rnd()%(y1-y0+1)+y0; j++; - } while (map->getcell(m,x,y,CELL_CHKNOPASS) && j < max); + } while (map->getcell(m, NULL, x, y, CELL_CHKNOPASS) && j < max); if (j == max) {// attempt to find an available cell failed @@ -1079,7 +1079,7 @@ int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap) ) { //Pick closest target? #ifdef ACTIVEPATHSEARCH struct walkpath_data wpd; - if (!path->search(&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x, bl->y, 0, CELL_CHKNOPASS)) // Count walk path cells + if (!path->search(&wpd, &md->bl, md->bl.m, md->bl.x, md->bl.y, bl->x, bl->y, 0, CELL_CHKNOPASS)) // Count walk path cells return 0; //Standing monsters use range2, walking monsters use range3 if ((md->ud.walktimer == INVALID_TIMER && wpd.path_len > md->db->range2) @@ -1344,7 +1344,7 @@ int mob_randomwalk(struct mob_data *md, int64 tick) { x+=md->bl.x; y+=md->bl.y; - if(((x != md->bl.x) || (y != md->bl.y)) && map->getcell(md->bl.m,x,y,CELL_CHKPASS) && unit->walktoxy(&md->bl,x,y,8)){ + if (((x != md->bl.x) || (y != md->bl.y)) && map->getcell(md->bl.m, &md->bl, x, y, CELL_CHKPASS) && unit->walktoxy(&md->bl, x, y, 8)) { break; } } @@ -1382,7 +1382,7 @@ int mob_warpchase(struct mob_data *md, struct block_list *target) return 0; //No need to do a warp chase. if (md->ud.walktimer != INVALID_TIMER && - map->getcell(md->bl.m,md->ud.to_x,md->ud.to_y,CELL_CHKNPC)) + map->getcell(md->bl.m, &md->bl, md->ud.to_x, md->ud.to_y, CELL_CHKNPC)) return 1; //Already walking to a warp. //Search for warps within mob's viewing range. @@ -1819,7 +1819,7 @@ int mob_delay_item_drop(int tid, int64 tick, int id, intptr_t data) { ditem = list->item; while (ditem) { struct item_drop *ditem_prev; - map->addflooritem(&ditem->item_data,ditem->item_data.amount, + map->addflooritem(NULL, &ditem->item_data,ditem->item_data.amount, list->m,list->x,list->y, list->first_charid,list->second_charid,list->third_charid,0); ditem_prev = ditem; @@ -2064,13 +2064,13 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage) { return; #if PACKETVER >= 20120404 - if( !(md->status.mode&MD_BOSS) ){ + if (battle_config.show_monster_hp_bar && !(md->status.mode&MD_BOSS)) { int i; for(i = 0; i < DAMAGELOG_SIZE; i++){ // must show hp bar to all char who already hit the mob. - if( md->dmglog[i].id ) { + if (md->dmglog[i].id) { struct map_session_data *sd = map->charid2sd(md->dmglog[i].id); - if( sd && check_distance_bl(&md->bl, &sd->bl, AREA_SIZE) ) // check if in range - clif->monster_hp_bar(md,sd); + if (sd && check_distance_bl(&md->bl, &sd->bl, AREA_SIZE)) // check if in range + clif->monster_hp_bar(md, sd); } } } @@ -2184,7 +2184,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { else ARR_FIND(0, MAX_PC_FEELHATE, i, temp == sd->hate_mob[i] && (battle_config.allow_skill_without_day || pc->sg_info[i].day_func())); - if(i<MAX_PC_FEELHATE && (temp=pc->checkskill(sd,pc->sg_info[i].bless_id))) + if(i<MAX_PC_FEELHATE && (temp=pc->checkskill(sd,pc->sg_info[i].bless_id)) > 0) bonus += (i==2?20:10)*temp; } if(battle_config.mobs_level_up && md->level > md->db->lv) // [Valaris] @@ -2371,7 +2371,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { if( drop_rate < 1 ) drop_rate = 1; } - + // attempt to drop the item if (rnd() % 10000 >= drop_rate) continue; @@ -2390,14 +2390,14 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { //MSG: "'%s' won %s's %s (chance: %0.02f%%)" intif->broadcast(message, strlen(message)+1, BC_DEFAULT); } - + /* heres the thing we got the feature set up however we're still discussing how to best define the ids, * so while we discuss, for a small period of time, the list is hardcoded (yes officially only those 2 use it, * thus why we're unsure on how to best place the setting) */ /* temp, will not be hardcoded for long thudu. */ if( it->nameid == 7782 || it->nameid == 7783 ) /* for when not hardcoded: add a check on mvp bonus drop as well */ clif->item_drop_announce(mvp_sd, it->nameid, md->name); - + // Announce first, or else ditem will be freed. [Lance] // By popular demand, use base drop rate for autoloot code. [Skotlex] mob->item_drop(md, dlist, ditem, 0, md->db->dropitem[i].p, homkillonly); @@ -2543,7 +2543,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { if((temp = pc->additem(mvp_sd,&item,1,LOG_TYPE_PICKDROP_PLAYER)) != 0) { clif->additem(mvp_sd,0,0,temp); - map->addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd->status.char_id,(second_sd?second_sd->status.char_id:0),(third_sd?third_sd->status.char_id:0),1); + map->addflooritem(&md->bl, &item, 1, mvp_sd->bl.m, mvp_sd->bl.x, mvp_sd->bl.y, mvp_sd->status.char_id, (second_sd?second_sd->status.char_id : 0), (third_sd ? third_sd->status.char_id : 0), 1); } //Logs items, MVP prizes [Lupus] @@ -2574,7 +2574,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) { if( sd ) { if( sd->mission_mobid == md->class_) { //TK_MISSION [Skotlex] - if( ++sd->mission_count >= 100 && (temp = mob->get_random_id(0, 0xE, sd->status.base_level)) ) { + if (++sd->mission_count >= 100 && (temp = mob->get_random_id(0, 0xE, sd->status.base_level)) != 0) { pc->addfame(sd, 1); sd->mission_mobid = temp; pc_setglobalreg(sd,script->add_str("TK_MISSION_ID"), temp); @@ -2798,19 +2798,19 @@ int mob_class_change (struct mob_data *md, int class_) /*========================================== * mob heal, update display hp info of mob for players *------------------------------------------*/ -void mob_heal(struct mob_data *md,unsigned int heal) +void mob_heal(struct mob_data *md, unsigned int heal) { if (battle_config.show_mob_info&3) clif->charnameack (0, &md->bl); - + #if PACKETVER >= 20120404 - if( !(md->status.mode&MD_BOSS) ){ + if (battle_config.show_monster_hp_bar && !(md->status.mode&MD_BOSS)) { int i; for(i = 0; i < DAMAGELOG_SIZE; i++){ // must show hp bar to all char who already hit the mob. - if( md->dmglog[i].id ) { + if (md->dmglog[i].id) { struct map_session_data *sd = map->charid2sd(md->dmglog[i].id); - if( sd && check_distance_bl(&md->bl, &sd->bl, AREA_SIZE) ) // check if in range - clif->monster_hp_bar(md,sd); + if (sd && check_distance_bl(&md->bl, &sd->bl, AREA_SIZE)) // check if in range + clif->monster_hp_bar(md, sd); } } } @@ -3175,7 +3175,8 @@ int mobskill_use(struct mob_data *md, int64 tick, int event) { case MSC_MASTERHPLTMAXRATE: flag = ((fbl = mob->getmasterhpltmaxrate(md, ms[i].cond2)) != NULL); break; case MSC_MASTERATTACKED: - flag = (md->master_id > 0 && (fbl=map->id2bl(md->master_id)) && unit->counttargeted(fbl) > 0); break; + flag = (md->master_id > 0 && (fbl=map->id2bl(md->master_id)) != NULL && unit->counttargeted(fbl) > 0); + break; case MSC_ALCHEMIST: flag = (md->state.alchemist); break; @@ -3307,7 +3308,7 @@ int mobskill_event(struct mob_data *md, struct block_list *src, int64 tick, int md->state.alchemist = 1; return mob->skill_use(md, timer->gettick(), MSC_ALCHEMIST); } - + target_id = md->target_id; if (!target_id || battle_config.mob_changetarget_byskill) md->target_id = src->id; @@ -3703,13 +3704,13 @@ bool mob_parse_dbrow(char** str) { db->job_exp = (unsigned int)cap_value(exp, 0, UINT_MAX); mstatus->rhw.range = atoi(str[9]); - + mstatus->rhw.atk = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[10])); mstatus->rhw.atk2 = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[11])); - + mstatus->def = mob_parse_dbrow_cap_value(class_,DEFTYPE_MIN,DEFTYPE_MAX,atoi(str[12])); mstatus->mdef = mob_parse_dbrow_cap_value(class_,DEFTYPE_MIN,DEFTYPE_MAX,atoi(str[13])); - + mstatus->str = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[14])); mstatus->agi = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[15])); mstatus->vit = mob_parse_dbrow_cap_value(class_,UINT16_MIN,UINT16_MAX,atoi(str[16])); @@ -3944,7 +3945,7 @@ void mob_readdb(void) { * mob_db table reading *------------------------------------------*/ int mob_read_sqldb(void) { - const char* mob_db_name[] = { + const char* mob_db_name[] = { map->mob_db_db, map->mob_db2_db }; @@ -4520,7 +4521,7 @@ void mob_readskilldb(void) { * seems to work though... */ int mob_read_sqlskilldb(void) { - const char* mob_skill_db_name[] = { + const char* mob_skill_db_name[] = { map->mob_skill_db_db, map->mob_skill_db2_db }; @@ -4531,7 +4532,6 @@ int mob_read_sqlskilldb(void) { return 0; } - for( fi = 0; fi < ARRAYLENGTH(mob_skill_db_name); ++fi ) { uint32 lines = 0, count = 0; @@ -4646,7 +4646,7 @@ void mob_load(bool minimal) { void mob_reload(void) { int i; - + //Mob skills need to be cleared before re-reading them. [Skotlex] for (i = 0; i < MAX_MOB_DB; i++) if (mob->db_data[i] && !mob->is_clone(i)) { @@ -4765,13 +4765,13 @@ void mob_defaults(void) { //Defines the Manuk/Splendide mob groups for the status reductions [Epoque] const int mob_manuk[8] = { 1986, 1987, 1988, 1989, 1990, 1997, 1998, 1999 }; const int mob_splendide[5] = { 1991, 1992, 1993, 1994, 1995 }; - + mob = &mob_s; - + memset(mob->db_data, 0, sizeof(mob->db_data)); mob->dummy = NULL; memset(mob->chat_db, 0, sizeof(mob->chat_db)); - + memcpy(mob->manuk, mob_manuk, sizeof(mob->manuk)); memcpy(mob->splendide, mob_splendide, sizeof(mob->splendide)); /* */ diff --git a/src/map/npc.c b/src/map/npc.c index bb0e772ae..a0c14a058 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -271,7 +271,7 @@ int npc_rr_secure_timeout_timer(int tid, int64 tick, int id, intptr_t data) { if( sd ) sd->npc_idle_timer = INVALID_TIMER; return 0;//Not logged in anymore OR no longer attached to a npc } - + switch( sd->npc_idle_type ) { case NPCT_INPUT: timeout = NPC_SECURE_TIMEOUT_INPUT; @@ -281,7 +281,7 @@ int npc_rr_secure_timeout_timer(int tid, int64 tick, int id, intptr_t data) { break; //case NPCT_WAIT: var starts with this value } - + if( DIFF_TICK(tick,sd->npc_idle_tick) > (timeout*1000) ) { /** * If we still have the NPC script attached, tell it to stop. @@ -556,7 +556,7 @@ int npc_timerevent(int tid, int64 tick, int id, intptr_t data) { return 0; } - if( ted->rid && !(sd = map->id2sd(ted->rid)) ) { + if (ted->rid && (sd = map->id2sd(ted->rid)) == NULL) { ShowError("npc_timerevent: Attached player not found.\n"); ers_free(npc->timer_event_ers, ted); return 0; @@ -621,7 +621,7 @@ int npc_timerevent_start(struct npc_data* nd, int rid) { // Check if there is an OnTimer Event ARR_FIND( 0, nd->u.scr.timeramount, j, nd->u.scr.timer_event[j].timer > nd->u.scr.timer ); - if( nd->u.scr.rid > 0 && !(sd = map->id2sd(nd->u.scr.rid)) ) { + if (nd->u.scr.rid > 0 && (sd = map->id2sd(nd->u.scr.rid)) == NULL) { // Failed to attach timer to this player. ShowError("npc_timerevent_start: Attached player not found!\n"); return 1; @@ -670,7 +670,7 @@ int npc_timerevent_stop(struct npc_data* nd) nullpo_ret(nd); - if (nd->u.scr.rid && !(sd = map->id2sd(nd->u.scr.rid))) { + if (nd->u.scr.rid && (sd = map->id2sd(nd->u.scr.rid)) == NULL) { ShowError("npc_timerevent_stop: Attached player not found!\n"); return 1; } @@ -1099,7 +1099,7 @@ int npc_check_areanpc(int flag, int16 m, int16 x, int16 y, int16 range) { i = 0; for (ys = y0; ys <= y1 && !i; ys++) { for(xs = x0; xs <= x1 && !i; xs++) { - if (map->getcell(m,xs,ys,CELL_CHKNPC)) + if (map->getcell(m, NULL, xs, ys, CELL_CHKNPC)) i = 1; } } @@ -1239,7 +1239,7 @@ int npc_click(struct map_session_data* sd, struct npc_data* nd) if ((nd = npc->checknear(sd,&nd->bl)) == NULL) return 1; - + //Hidden/Disabled npc. if (nd->class_ < 0 || nd->option&(OPTION_INVISIBLE|OPTION_HIDE)) return 1; @@ -1281,7 +1281,7 @@ int npc_scriptcont(struct map_session_data* sd, int id, bool closing) { nd?(char*)nd->name:"'Unknown NPC'", (int)id); return 1; } - + if(id != npc->fake_nd->bl.id) { // Not item script if ((npc->checknear(sd,target)) == NULL){ ShowWarning("npc_scriptcont: failed npc->checknear test.\n"); @@ -1303,10 +1303,10 @@ int npc_scriptcont(struct map_session_data* sd, int id, bool closing) { **/ if( sd->progressbar.npc_id && DIFF_TICK(sd->progressbar.timeout,timer->gettick()) > 0 ) return 1; - + if( !sd->st ) return 1; - + if( closing && sd->st->state == CLOSE ) sd->st->state = END; @@ -1327,12 +1327,11 @@ int npc_buysellsel(struct map_session_data* sd, int id, int type) { return 1; if ( nd->subtype != SHOP && !(nd->subtype == SCRIPT && nd->u.scr.shop && nd->u.scr.shop->items) ) { - if( nd->subtype == SCRIPT ) ShowError("npc_buysellsel: trader '%s' has no shop list!\n",nd->exname); else ShowError("npc_buysellsel: no such shop npc %d (%s)\n",id,nd->exname); - + if (sd->npc_id == id) sd->npc_id = 0; return 1; @@ -1340,7 +1339,7 @@ int npc_buysellsel(struct map_session_data* sd, int id, int type) { if (nd->option & OPTION_INVISIBLE) // can't buy if npc is not visible (hack?) return 1; - + if( nd->class_ < 0 && !sd->state.callshop ) {// not called through a script and is not a visible NPC so an invalid call return 1; } @@ -1354,7 +1353,6 @@ int npc_buysellsel(struct map_session_data* sd, int id, int type) { } else { clif->selllist(sd); } - return 0; } @@ -1372,13 +1370,13 @@ int npc_cashshop_buylist(struct map_session_data *sd, int points, int count, uns if( count <= 0 ) return ERROR_TYPE_ITEM_ID; - + if( points < 0 ) return ERROR_TYPE_MONEY; - + if( !(nd = (struct npc_data *)map->id2bl(sd->npc_shopid)) ) return ERROR_TYPE_NPC; - + if( nd->subtype != CASHSHOP ) { if( nd->subtype == SCRIPT && nd->u.scr.shop && nd->u.scr.shop->type != NST_ZENY && nd->u.scr.shop->type != NST_MARKET ) { shop = nd->u.scr.shop->item; @@ -1389,7 +1387,7 @@ int npc_cashshop_buylist(struct map_session_data *sd, int points, int count, uns shop = nd->u.shop.shop_item; shop_size = nd->u.shop.count; } - + new_ = 0; w = 0; vt = 0; // Global Value @@ -1426,10 +1424,10 @@ int npc_cashshop_buylist(struct map_session_data *sd, int points, int count, uns if( w + sd->weight > sd->max_weight ) return ERROR_TYPE_INVENTORY_WEIGHT; - + if( pc->inventoryblank(sd) < new_ ) return ERROR_TYPE_INVENTORY_WEIGHT; - + if( points > vt ) points = vt; // Payment Process ---------------------------------------------------- @@ -1492,7 +1490,7 @@ void npc_market_fromsql(void) { char name[NAME_LENGTH+1]; int itemid; int amount; - + if ( SQL_ERROR == SQL->StmtPrepare(stmt, "SELECT `name`, `itemid`, `amount` FROM `%s`", map->npc_market_data_db) || SQL_ERROR == SQL->StmtExecute(stmt) ) { @@ -1500,15 +1498,15 @@ void npc_market_fromsql(void) { SQL->StmtFree(stmt); return; } - + SQL->StmtBindColumn(stmt, 0, SQLDT_STRING, &name[0], sizeof(name), NULL, NULL); SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &itemid, 0, NULL, NULL); SQL->StmtBindColumn(stmt, 2, SQLDT_INT, &amount, 0, NULL, NULL); - + while ( SQL_SUCCESS == SQL->StmtNextRow(stmt) ) { struct npc_data *nd = NULL; unsigned short i; - + if( !(nd = npc->name2id(name)) ) { ShowError("npc_market_fromsql: NPC '%s' not found! skipping...\n",name); npc->market_delfromsql_sub(name, USHRT_MAX); @@ -1518,22 +1516,20 @@ void npc_market_fromsql(void) { npc->market_delfromsql_sub(name, USHRT_MAX); continue; } - + for(i = 0; i < nd->u.scr.shop->items; i++) { if( nd->u.scr.shop->item[i].nameid == itemid ) { nd->u.scr.shop->item[i].qty = amount; break; } } - + if( i == nd->u.scr.shop->items ) { ShowError("npc_market_fromsql: NPC '%s' does not sell item %d (qty %d), deleting...\n",name,itemid,amount); npc->market_delfromsql_sub(name, itemid); continue; } - } - SQL->StmtFree(stmt); } /** @@ -1567,10 +1563,9 @@ void npc_market_delfromsql(struct npc_data *nd, unsigned short index) { * Judges whether to allow and spawn a trader's window. **/ bool npc_trader_open(struct map_session_data *sd, struct npc_data *nd) { - if( !nd->u.scr.shop || !nd->u.scr.shop->items ) return false; - + switch( nd->u.scr.shop->type ) { case NST_ZENY: sd->state.callshop = 1; @@ -1578,12 +1573,12 @@ bool npc_trader_open(struct map_session_data *sd, struct npc_data *nd) { return true;/* we skip sd->npc_shopid, npc->buysell will set it then when the player selects */ case NST_MARKET: { unsigned short i; - + for(i = 0; i < nd->u.scr.shop->items; i++) { if( nd->u.scr.shop->item[i].qty ) break; } - + /* nothing to display, no items available */ if (i == nd->u.scr.shop->items) { clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,881)); @@ -1597,9 +1592,7 @@ bool npc_trader_open(struct map_session_data *sd, struct npc_data *nd) { clif->cashshop_show(sd,nd); break; } - sd->npc_shopid = nd->bl.id; - return true; } /** @@ -1611,21 +1604,19 @@ void npc_trader_update(int master) { DBIterator* iter; struct block_list* bl; struct npc_data *master_nd = map->id2nd(master); - + CREATE(master_nd->u.scr.shop,struct npc_shop_data,1); - + iter = db_iterator(map->id_db); - for( bl = (struct block_list*)dbi_first(iter); dbi_exists(iter); bl = (struct block_list*)dbi_next(iter) ) { if( bl->type == BL_NPC ) { struct npc_data* nd = (struct npc_data*)bl; - + if( nd->src_id == master ) { nd->u.scr.shop = master_nd->u.scr.shop; } } } - dbi_destroy(iter); } /** @@ -1637,9 +1628,9 @@ void npc_trader_update(int master) { void npc_trader_count_funds(struct npc_data *nd, struct map_session_data *sd) { char evname[EVENT_NAME_LENGTH]; struct event_data *ev = NULL; - + npc->trader_funds[0] = npc->trader_funds[1] = 0;/* clear */ - + switch( nd->u.scr.shop->type ) { case NST_CASH: npc->trader_funds[0] = sd->cashPoints; @@ -1651,14 +1642,14 @@ void npc_trader_count_funds(struct npc_data *nd, struct map_session_data *sd) { ShowError("npc_trader_count_funds: unsupported shop type %d\n",nd->u.scr.shop->type); return; } - + snprintf(evname, EVENT_NAME_LENGTH, "%s::OnCountFunds",nd->exname); - + if ( (ev = strdb_get(npc->ev_db, evname)) ) script->run_npc(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id); else ShowError("npc_trader_count_funds: '%s' event '%s' not found, operation failed\n",nd->exname,evname); - + /* the callee will rely on npc->trader_funds, upon success script->run updates them */ } /** @@ -1674,19 +1665,17 @@ void npc_trader_count_funds(struct npc_data *nd, struct map_session_data *sd) { bool npc_trader_pay(struct npc_data *nd, struct map_session_data *sd, int price, int points) { char evname[EVENT_NAME_LENGTH]; struct event_data *ev = NULL; - + npc->trader_ok = false;/* clear */ - + snprintf(evname, EVENT_NAME_LENGTH, "%s::OnPayFunds",nd->exname); - if ( (ev = strdb_get(npc->ev_db, evname)) ) { pc->setreg(sd,script->add_str("@price"),price); pc->setreg(sd,script->add_str("@points"),points); - script->run_npc(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id); } else ShowError("npc_trader_pay: '%s' event '%s' not found, operation failed\n",nd->exname,evname); - + return npc->trader_ok;/* run script will deal with it */ } /*========================================== @@ -1698,7 +1687,7 @@ int npc_cashshop_buy(struct map_session_data *sd, int nameid, int amount, int po struct npc_item_list *shop = NULL; int i, price, w; unsigned short shop_size = 0; - + if( amount <= 0 ) return ERROR_TYPE_ITEM_ID; @@ -1707,7 +1696,7 @@ int npc_cashshop_buy(struct map_session_data *sd, int nameid, int amount, int po if( sd->state.trading ) return ERROR_TYPE_EXCHANGE; - + if( !(nd = (struct npc_data *)map->id2bl(sd->npc_shopid)) ) return ERROR_TYPE_NPC; @@ -1724,12 +1713,12 @@ int npc_cashshop_buy(struct map_session_data *sd, int nameid, int amount, int po shop = nd->u.shop.shop_item; shop_size = nd->u.shop.count; } - + ARR_FIND(0, shop_size, i, shop[i].nameid == nameid); - + if( i == shop_size ) return ERROR_TYPE_ITEM_ID; - + if( shop[i].value <= 0 ) return ERROR_TYPE_ITEM_ID; @@ -1762,7 +1751,7 @@ int npc_cashshop_buy(struct map_session_data *sd, int nameid, int amount, int po } price = shop[i].value * amount; - + if( points > price ) points = price; @@ -1772,7 +1761,7 @@ int npc_cashshop_buy(struct map_session_data *sd, int nameid, int amount, int po } else { if( (sd->kafraPoints < points) || (sd->cashPoints < price - points) ) return ERROR_TYPE_MONEY; - + pc->paycash(sd, price, points); } @@ -1798,14 +1787,14 @@ int npc_buylist(struct map_session_data* sd, int n, unsigned short* item_list) { double z; int i,j,w,skill_t,new_, idx = skill->get_index(MC_DISCOUNT); unsigned short shop_size = 0; - + nullpo_retr(3, sd); nullpo_retr(3, item_list); - + nd = npc->checknear(sd,map->id2bl(sd->npc_shopid)); if( nd == NULL ) return 3; - + if( nd->subtype != SHOP ) { if( nd->subtype == SCRIPT && nd->u.scr.shop && nd->u.scr.shop->type == NST_ZENY ) { shop = nd->u.scr.shop->item; @@ -1816,76 +1805,76 @@ int npc_buylist(struct map_session_data* sd, int n, unsigned short* item_list) { shop = nd->u.shop.shop_item; shop_size = nd->u.shop.count; } - + z = 0; w = 0; new_ = 0; // process entries in buy list, one by one for( i = 0; i < n; ++i ) { int nameid, amount, value; - + // find this entry in the shop's sell list ARR_FIND( 0, shop_size, j, item_list[i*2+1] == shop[j].nameid || //Normal items item_list[i*2+1] == itemdb_viewid(shop[j].nameid) //item_avail replacement ); - + if( j == shop_size ) return 3; // no such item in shop - + amount = item_list[i*2+0]; nameid = item_list[i*2+1] = shop[j].nameid; //item_avail replacement value = shop[j].value; - + if( !itemdb->exists(nameid) ) return 3; // item no longer in itemdb - + if( !itemdb->isstackable(nameid) && amount > 1 ) { //Exploit? You can't buy more than 1 of equipment types o.O ShowWarning("Player %s (%d:%d) sent a hexed packet trying to buy %d of non-stackable item %d!\n", sd->status.name, sd->status.account_id, sd->status.char_id, amount, nameid); amount = item_list[i*2+0] = 1; } - + if( nd->master_nd ) { // Script-controlled shops decide by themselves, what can be bought and for what price. continue; } - + switch( pc->checkadditem(sd,nameid,amount) ) { case ADDITEM_EXIST: break; - + case ADDITEM_NEW: new_++; break; - + case ADDITEM_OVERAMOUNT: return 2; } - + value = pc->modifybuyvalue(sd,value); - + z += (double)value * amount; w += itemdb_weight(nameid) * amount; } - + if( nd->master_nd != NULL ) //Script-based shops. return npc->buylist_sub(sd,n,item_list,nd->master_nd); - + if( z > (double)sd->status.zeny ) return 1; // Not enough Zeny if( w + sd->weight > sd->max_weight ) return 2; // Too heavy if( pc->inventoryblank(sd) < new_ ) return 3; // Not enough space to store items - + pc->payzeny(sd,(int)z,LOG_TYPE_NPC, NULL); - + for( i = 0; i < n; ++i ) { int nameid = item_list[i*2+1]; int amount = item_list[i*2+0]; - + if (itemdb_type(nameid) == IT_PETEGG) { pet->create_egg(sd, nameid); } else { @@ -1893,16 +1882,16 @@ int npc_buylist(struct map_session_data* sd, int n, unsigned short* item_list) { memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = nameid; item_tmp.identify = 1; - + pc->additem(sd,&item_tmp,amount,LOG_TYPE_NPC); } } - + // custom merchant shop exp bonus if( battle_config.shop_exp > 0 && z > 0 && (skill_t = pc->checkskill2(sd,idx)) > 0 ) { if( sd->status.skill[idx].flag >= SKILL_FLAG_REPLACED_LV_0 ) skill_t = sd->status.skill[idx].flag - SKILL_FLAG_REPLACED_LV_0; - + if( skill_t > 0 ) { z = z * (double)skill_t * (double)battle_config.shop_exp/10000.; if( z < 1 ) @@ -1910,7 +1899,7 @@ int npc_buylist(struct map_session_data* sd, int n, unsigned short* item_list) { pc->gainexp(sd,NULL,0,(int)z, false); } } - + return 0; } @@ -1923,7 +1912,7 @@ int npc_market_buylist(struct map_session_data* sd, unsigned short list_size, st double z; int i,j,w,new_; unsigned short shop_size = 0; - + nullpo_retr(1, sd); nullpo_retr(1, p); @@ -1934,21 +1923,21 @@ int npc_market_buylist(struct map_session_data* sd, unsigned short list_size, st shop = nd->u.scr.shop->item; shop_size = nd->u.scr.shop->items; - + z = 0; w = 0; new_ = 0; - + // process entries in buy list, one by one for( i = 0; i < list_size; ++i ) { int nameid, amount, value; - + // find this entry in the shop's sell list ARR_FIND( 0, shop_size, j, p->list[i].ITID == shop[j].nameid || //Normal items p->list[i].ITID == itemdb_viewid(shop[j].nameid) //item_avail replacement ); - + if( j == shop_size ) /* TODO find official response for this */ return 1; // no such item in shop @@ -1962,26 +1951,24 @@ int npc_market_buylist(struct map_session_data* sd, unsigned short list_size, st if( !itemdb->exists(nameid) ) /* TODO find official response for this */ return 1; // item no longer in itemdb - + if( !itemdb->isstackable(nameid) && amount > 1 ) { //Exploit? You can't buy more than 1 of equipment types o.O ShowWarning("Player %s (%d:%d) sent a hexed packet trying to buy %d of non-stackable item %d!\n", sd->status.name, sd->status.account_id, sd->status.char_id, amount, nameid); amount = p->list[i].qty = 1; } - + switch( pc->checkadditem(sd,nameid,amount) ) { case ADDITEM_EXIST: break; - case ADDITEM_NEW: new_++; break; - case ADDITEM_OVERAMOUNT: /* TODO find official response for this */ return 1; } - + z += (double)value * amount; w += itemdb_weight(nameid) * amount; } @@ -1996,20 +1983,20 @@ int npc_market_buylist(struct map_session_data* sd, unsigned short list_size, st return 1; // Not enough space to store items pc->payzeny(sd,(int)z,LOG_TYPE_NPC, NULL); - + for( i = 0; i < list_size; ++i ) { int nameid = p->list[i].ITID; int amount = p->list[i].qty; - + j = npc_market_qty[i]; - + if( p->list[i].qty > shop[j].qty ) /* wohoo someone tampered with the packet. */ return 1; - + shop[j].qty -= amount; - + npc->market_tosql(nd,j); - + if (itemdb_type(nameid) == IT_PETEGG) { pet->create_egg(sd, nameid); } else { @@ -2017,7 +2004,7 @@ int npc_market_buylist(struct map_session_data* sd, unsigned short list_size, st memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = nameid; item_tmp.identify = 1; - + pc->additem(sd,&item_tmp,amount,LOG_TYPE_NPC); } } @@ -2058,18 +2045,18 @@ int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short* item_li script->setarray_pc(sd, "@sold_nameid", i, (void*)(intptr_t)sd->status.inventory[idx].nameid, &key_nameid); script->setarray_pc(sd, "@sold_quantity", i, (void*)(intptr_t)item_list[i*2+1], &key_amount); - + // process item based information into the arrays script->setarray_pc(sd, "@sold_refine", i, (void*)(intptr_t)sd->status.inventory[idx].refine, &key_refine); script->setarray_pc(sd, "@sold_attribute", i, (void*)(intptr_t)sd->status.inventory[idx].attribute, &key_attribute); script->setarray_pc(sd, "@sold_identify", i, (void*)(intptr_t)sd->status.inventory[idx].identify, &key_identify); - + for (j = 0; j < MAX_SLOTS; j++) { // store each of the cards/special info from the item in the array snprintf(card_slot, sizeof(card_slot), "@sold_card%d", j + 1); script->setarray_pc(sd, card_slot, i, (void*)(intptr_t)sd->status.inventory[idx].card[j], &key_card[j]); } - + } // invoke event @@ -2078,7 +2065,6 @@ int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short* item_li return 0; } - /// Player item selling to npc shop. /// /// @param item_list 'n' pairs <index,amount> @@ -2100,7 +2086,6 @@ int npc_selllist(struct map_session_data* sd, int n, unsigned short* item_list) return 1; } - z = 0; // verify the sell list @@ -2246,7 +2231,7 @@ int npc_unload(struct npc_data* nd, bool single) if( nd->ud && nd->ud != &npc->base_ud ) { skill->clear_unitgroup(&nd->bl); } - + npc->remove_map(nd); map->deliddb(&nd->bl); if( single ) @@ -2270,7 +2255,7 @@ int npc_unload(struct npc_data* nd, bool single) aFree(nd->path);/* remove now that no other instances exist */ } } - + if( single && nd->bl.m != -1 ) map->remove_questinfo(nd->bl.m,nd); @@ -2284,7 +2269,7 @@ int npc_unload(struct npc_data* nd, bool single) npc->ev_db->foreach(npc->ev_db,npc->unload_ev,nd->exname); //Clean up all events related npc->ev_label_db->foreach(npc->ev_label_db,npc->unload_ev_label,nd); } - + iter = mapit_geteachpc(); for( bl = (struct block_list*)mapit->first(iter); mapit->exists(iter); bl = (struct block_list*)mapit->next(iter) ) { struct map_session_data *sd = ((TBL_PC*)bl); @@ -2646,7 +2631,7 @@ const char* npc_parse_warp(char* w1, char* w2, char* w3, char* w4, const char* s if (retval) *retval = EXIT_FAILURE; return strchr(start,'\n');;//try next } - + nd = npc->create_npc(m, x, y); map->addnpc(m, nd); npc->parsename(nd, w3, start, buffer, filepath); @@ -2722,7 +2707,7 @@ const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const char* s if (retval) *retval = EXIT_FAILURE; return strchr(start,'\n');//try next } - + if( strcmp(w2,"cashshop") == 0 ) type = CASHSHOP; else @@ -2820,14 +2805,14 @@ const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const char* s void npc_convertlabel_db(struct npc_label_list* label_list, const char *filepath) { int i; - + for( i = 0; i < script->label_count; i++ ) { const char* lname = script->get_str(script->labels[i].key); int lpos = script->labels[i].pos; struct npc_label_list* label; const char *p; size_t len; - + // In case of labels not terminated with ':', for user defined function support p = lname; @@ -2840,9 +2825,9 @@ void npc_convertlabel_db(struct npc_label_list* label_list, const char *filepath ShowError("npc_parse_script: label name longer than 23 chars! (%s) in file '%s'.\n", lname, filepath); return; } - + label = &label_list[i]; - + safestrncpy(label->name, lname, sizeof(label->name)); label->pos = lpos; } @@ -2958,13 +2943,10 @@ const char* npc_parse_script(char* w1, char* w2, char* w3, char* w4, const char* if( end == NULL ) return NULL;// (simple) parse error, don't continue - script->parser_current_npc_name = w3; - scriptroot = script->parse(script_start, filepath, strline(buffer,script_start-buffer), SCRIPT_USE_LABEL_DB, retval); - script->parser_current_npc_name = NULL; - + label_list = NULL; label_list_num = 0; if( script->label_count ) { @@ -2994,7 +2976,7 @@ const char* npc_parse_script(char* w1, char* w2, char* w3, char* w4, const char* if( options&NPO_TRADER ) nd->u.scr.trader = true; nd->u.scr.shop = NULL; - + ++npc_script; nd->bl.type = BL_NPC; nd->subtype = SCRIPT; @@ -3116,7 +3098,7 @@ const char* npc_parse_duplicate(char* w1, char* w2, char* w3, char* w4, const ch if (retval) *retval = EXIT_FAILURE; return end;//try next } - + if( type == WARP && sscanf(w4, "%d,%d", &xs, &ys) == 2 );// <spanx>,<spany> else if( type == SCRIPT && sscanf(w4, "%*[^,],%d,%d", &xs, &ys) == 2);// <sprite id>,<triggerX>,<triggerY> else if( type == WARP ) { @@ -3300,7 +3282,7 @@ void npc_setcells(struct npc_data* nd) { for (i = y-ys; i <= y+ys; i++) { for (j = x-xs; j <= x+xs; j++) { - if (map->getcell(m, j, i, CELL_CHKNOPASS)) + if (map->getcell(m, &nd->bl, j, i, CELL_CHKNOPASS)) continue; map->list[m].setcell(m, j, i, CELL_NPC, true); } @@ -3337,10 +3319,10 @@ void npc_unsetcells(struct npc_data* nd) { //Locate max range on which we can locate npc cells //FIXME: does this really do what it's supposed to do? [ultramage] - for(x0 = x-xs; x0 > 0 && map->getcell(m, x0, y, CELL_CHKNPC); x0--); - for(x1 = x+xs; x1 < map->list[m].xs-1 && map->getcell(m, x1, y, CELL_CHKNPC); x1++); - for(y0 = y-ys; y0 > 0 && map->getcell(m, x, y0, CELL_CHKNPC); y0--); - for(y1 = y+ys; y1 < map->list[m].ys-1 && map->getcell(m, x, y1, CELL_CHKNPC); y1++); + for(x0 = x-xs; x0 > 0 && map->getcell(m, &nd->bl, x0, y, CELL_CHKNPC); x0--); + for(x1 = x+xs; x1 < map->list[m].xs-1 && map->getcell(m, &nd->bl, x1, y, CELL_CHKNPC); x1++); + for(y0 = y-ys; y0 > 0 && map->getcell(m, &nd->bl, x, y0, CELL_CHKNPC); y0--); + for(y1 = y+ys; y1 < map->list[m].ys-1 && map->getcell(m, &nd->bl, x, y1, CELL_CHKNPC); y1++); //Erase this npc's cells for (i = y-ys; i <= y+ys; i++) @@ -3485,7 +3467,7 @@ const char* npc_parse_function(char* w1, char* w2, char* w3, char* w4, const cha scriptroot = script->parse(script_start, filepath, strline(buffer,start-buffer), SCRIPT_RETURN_EMPTY_SCRIPT, retval); script->parser_current_npc_name = NULL; - + if( scriptroot == NULL )// parse error, continue return end; @@ -3501,7 +3483,6 @@ const char* npc_parse_function(char* w1, char* w2, char* w3, char* w4, const cha return end; } - /*========================================== * Parse Mob 1 - Parse mob list into each map * Parse Mob 2 - Actually Spawns Mob @@ -3783,7 +3764,7 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char ShowWarning("npc_parse_mapflag: You can't set PvP and BattleGround flags for the same map! Removing BattleGround flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; } - if( state && (zone = strdb_get(map->zone_db, MAP_ZONE_PVP_NAME)) && map->list[m].zone != zone ) { + if( state && (zone = strdb_get(map->zone_db, MAP_ZONE_PVP_NAME)) != NULL && map->list[m].zone != zone ) { map->zone_change(m,zone,start,buffer,filepath); } else if ( !state ) { map->list[m].zone = &map->zone_all; @@ -3823,7 +3804,7 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char map->list[m].flag.pvp_nocalcrank=state; else if (!strcmpi(w3,"gvg")) { struct map_zone_data *zone; - + map->list[m].flag.gvg = state; if( state && map->list[m].flag.pvp ) { map->list[m].flag.pvp = 0; @@ -3835,7 +3816,7 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char ShowWarning("npc_parse_mapflag: You can't set GvG and BattleGround flags for the same map! Removing BattleGround flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; } - if( state && (zone = strdb_get(map->zone_db, MAP_ZONE_GVG_NAME)) && map->list[m].zone != zone ) { + if( state && (zone = strdb_get(map->zone_db, MAP_ZONE_GVG_NAME)) != NULL && map->list[m].zone != zone ) { map->zone_change(m,zone,start,buffer,filepath); } } @@ -3872,8 +3853,8 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char ShowWarning("npc_parse_mapflag: You can't set GvG and BattleGround flags for the same map! Removing GvG flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; } - - if( state && (zone = strdb_get(map->zone_db, MAP_ZONE_BG_NAME)) && map->list[m].zone != zone ) { + + if( state && (zone = strdb_get(map->zone_db, MAP_ZONE_BG_NAME)) != NULL && map->list[m].zone != zone ) { map->zone_change(m,zone,start,buffer,filepath); } } @@ -3958,11 +3939,11 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char int skill_id, k; char skill_name[MAP_ZONE_MAPFLAG_LENGTH], modifier[MAP_ZONE_MAPFLAG_LENGTH]; size_t len = w4 ? strlen(w4) : 0; - + modifier[0] = '\0'; if( w4 ) memcpy(skill_name, w4, MAP_ZONE_MAPFLAG_LENGTH); - + for(k = 0; k < len; k++) { if( skill_name[k] == '\t' ) { memcpy(modifier, &skill_name[k+1], len - k); @@ -3970,7 +3951,7 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char break; } } - + if( modifier[0] == '\0' ) { ShowWarning("npc_parse_mapflag: Missing 5th param for 'adjust_unit_duration' flag! removing flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; @@ -3982,9 +3963,9 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char if (retval) *retval = EXIT_FAILURE; } else { int idx = map->list[m].unit_count; - + ARR_FIND(0, idx, k, map->list[m].units[k]->skill_id == skill_id); - + if( k < idx ) { if( atoi(modifier) != 100 ) map->list[m].units[k]->modifier = (unsigned short)atoi(modifier); @@ -3995,9 +3976,9 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char for( k = 0; k < idx; k++ ) { if( map->list[m].units[k] == NULL ) continue; - + map->list[m].units[cursor] = map->list[m].units[k]; - + cursor++; } if( !( map->list[m].unit_count = cursor ) ) { @@ -4016,12 +3997,12 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char int skill_id, k; char skill_name[MAP_ZONE_MAPFLAG_LENGTH], modifier[MAP_ZONE_MAPFLAG_LENGTH]; size_t len = w4 ? strlen(w4) : 0; - + modifier[0] = '\0'; - + if( w4 ) memcpy(skill_name, w4, MAP_ZONE_MAPFLAG_LENGTH); - + for(k = 0; k < len; k++) { if( skill_name[k] == '\t' ) { memcpy(modifier, &skill_name[k+1], len - k); @@ -4029,7 +4010,7 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char break; } } - + if( modifier[0] == '\0' ) { ShowWarning("npc_parse_mapflag: Missing 5th param for 'adjust_skill_damage' flag! removing flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; @@ -4041,9 +4022,9 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char if (retval) *retval = EXIT_FAILURE; } else { int idx = map->list[m].skill_count; - + ARR_FIND(0, idx, k, map->list[m].skills[k]->skill_id == skill_id); - + if( k < idx ) { if( atoi(modifier) != 100 ) map->list[m].skills[k]->modifier = (unsigned short)atoi(modifier); @@ -4054,9 +4035,9 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char for( k = 0; k < idx; k++ ) { if( map->list[m].skills[k] == NULL ) continue; - + map->list[m].skills[cursor] = map->list[m].skills[k]; - + cursor++; } if( !( map->list[m].skill_count = cursor ) ) { @@ -4070,11 +4051,10 @@ const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char map->list[m].skills[idx]->skill_id = (unsigned short)skill_id; map->list[m].skills[idx]->modifier = (unsigned short)atoi(modifier); } - } } else if (!strcmpi(w3,"zone")) { struct map_zone_data *zone; - + if( !(zone = strdb_get(map->zone_db, w4)) ) { ShowWarning("npc_parse_mapflag: Invalid zone '%s'! removing flag from %s in file '%s', line '%d'.\n", w4, map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; @@ -4451,9 +4431,8 @@ int npc_reload(void) { npc_last_npd = NULL; npc_last_path = NULL; npc_last_ref = NULL; - - //Remove all npcs/mobs. [Skotlex] + //Remove all npcs/mobs. [Skotlex] iter = mapit_geteachiddb(); for( bl = (struct block_list*)mapit->first(iter); mapit->exists(iter); bl = (struct block_list*)mapit->next(iter) ) { switch(bl->type) { @@ -4580,14 +4559,14 @@ void npc_debug_warps_sub(struct npc_data* nd) { if (m < 0) return; //Warps to another map, nothing to do about it. if (nd->u.warp.x == 0 && nd->u.warp.y == 0) return; // random warp - if (map->getcell(m, nd->u.warp.x, nd->u.warp.y, CELL_CHKNPC)) { + if (map->getcell(m, &nd->bl, nd->u.warp.x, nd->u.warp.y, CELL_CHKNPC)) { ShowWarning("Warp %s at %s(%d,%d) warps directly on top of an area npc at %s(%d,%d)\n", nd->name, map->list[nd->bl.m].name, nd->bl.x, nd->bl.y, map->list[m].name, nd->u.warp.x, nd->u.warp.y ); } - if (map->getcell(m, nd->u.warp.x, nd->u.warp.y, CELL_CHKNOPASS)) { + if (map->getcell(m, &nd->bl, nd->u.warp.x, nd->u.warp.y, CELL_CHKNOPASS)) { ShowWarning("Warp %s at %s(%d,%d) warps to a non-walkable tile at %s(%d,%d)\n", nd->name, map->list[nd->bl.m].name, nd->bl.x, nd->bl.y, @@ -4617,7 +4596,7 @@ int do_init_npc(bool minimal) { npc->base_ud.attackabletime = npc->base_ud.canact_tick = npc->base_ud.canmove_tick = timer->gettick(); - + //Stock view data for normal npcs. memset(&npc_viewdb, 0, sizeof(npc_viewdb)); @@ -4645,12 +4624,12 @@ int do_init_npc(bool minimal) { npc_process_files(START_NPC_NUM); } - + if (!minimal) { map->zone_init(); - + npc->motd = npc->name2id("HerculesMOTD"); /* [Ind/Hercules] */ - + // set up the events cache memset(script_event, 0, sizeof(script_event)); npc->read_event_script(); @@ -4662,7 +4641,7 @@ int do_init_npc(bool minimal) { timer->add_func_list(npc->event_do_clock,"npc_event_do_clock"); timer->add_func_list(npc->timerevent,"npc_timerevent"); } - + if( script->lang_export_fp ) { ShowInfo("Lang exported to '%s'\n",script->lang_export_file); fclose(script->lang_export_fp); diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c index 0b9023ede..503dbd845 100644 --- a/src/map/npc_chat.c +++ b/src/map/npc_chat.c @@ -80,7 +80,6 @@ struct pcre_interface *libpcre; * deletes a pset */ - /** * delete everything associated with a entry * @@ -102,9 +101,9 @@ struct pcrematch_set* lookup_pcreset(struct npc_data* nd, int setid) { struct npc_parse *npcParse = nd->chatdb; if (npcParse == NULL) nd->chatdb = npcParse = (struct npc_parse *)aCalloc(sizeof(struct npc_parse), 1); - + pcreset = npcParse->active; - + while (pcreset != NULL) { if (pcreset->setid == setid) break; @@ -112,13 +111,13 @@ struct pcrematch_set* lookup_pcreset(struct npc_data* nd, int setid) { } if (pcreset == NULL) pcreset = npcParse->inactive; - + while (pcreset != NULL) { if (pcreset->setid == setid) break; pcreset = pcreset->next; } - + if (pcreset == NULL) { pcreset = (struct pcrematch_set *)aCalloc(sizeof(struct pcrematch_set), 1); pcreset->next = npcParse->inactive; @@ -128,7 +127,6 @@ struct pcrematch_set* lookup_pcreset(struct npc_data* nd, int setid) { npcParse->inactive = pcreset; pcreset->setid = setid; } - return pcreset; } @@ -157,7 +155,7 @@ void activate_pcreset(struct npc_data* nd, int setid) pcreset->prev->next = pcreset->next; else npcParse->inactive = pcreset->next; - + pcreset->prev = NULL; pcreset->next = npcParse->active; if (pcreset->next != NULL) @@ -195,7 +193,7 @@ void deactivate_pcreset(struct npc_data* nd, int setid) pcreset->prev->next = pcreset->next; else npcParse->active = pcreset->next; - + pcreset->prev = NULL; pcreset->next = npcParse->inactive; if (pcreset->next != NULL) @@ -230,27 +228,26 @@ void delete_pcreset(struct npc_data* nd, int setid) } if (pcreset == NULL) return; - + if (pcreset->next != NULL) pcreset->next->prev = pcreset->prev; if (pcreset->prev != NULL) pcreset->prev->next = pcreset->next; - + if(active) npcParse->active = pcreset->next; else npcParse->inactive = pcreset->next; - + pcreset->prev = NULL; pcreset->next = NULL; - + while (pcreset->head) { struct pcrematch_entry* n = pcreset->head->next; npc_chat->finalize_pcrematch_entry(pcreset->head); aFree(pcreset->head); // Cleaning the last ones.. [Lance] pcreset->head = n; } - aFree(pcreset); } @@ -261,25 +258,25 @@ struct pcrematch_entry* create_pcrematch_entry(struct pcrematch_set* set) { struct pcrematch_entry * e = (struct pcrematch_entry *) aCalloc(sizeof(struct pcrematch_entry), 1); struct pcrematch_entry * last = set->head; - + // Normally we would have just stuck it at the end of the list but // this doesn't sink up with peoples usage pattern. They wanted // the items defined first to have a higher priority then the // items defined later. as a result, we have to do some work up front. - + /* if we are the first pattern, stick us at the end */ if (last == NULL) { set->head = e; return e; } - + /* Look for the last entry */ while (last->next != NULL) last = last->next; - + last->next = e; e->next = NULL; - + return e; } @@ -290,7 +287,7 @@ void npc_chat_def_pattern(struct npc_data* nd, int setid, const char* pattern, c { const char *err; int erroff; - + struct pcrematch_set * s = npc_chat->lookup_pcreset(nd, setid); struct pcrematch_entry *e = npc_chat->create_pcrematch_entry(s); e->pattern = aStrdup(pattern); @@ -310,13 +307,13 @@ void npc_chat_finalize(struct npc_data* nd) struct npc_parse *npcParse = nd->chatdb; if (npcParse == NULL) return; - + while(npcParse->active) npc_chat->delete_pcreset(nd, npcParse->active->setid); - + while(npcParse->inactive) npc_chat->delete_pcreset(nd, npcParse->inactive->setid); - + // Additional cleaning up [Lance] aFree(npcParse); } @@ -334,15 +331,15 @@ int npc_chat_sub(struct block_list* bl, va_list ap) struct npc_label_list* lst; struct pcrematch_set* pcreset; struct pcrematch_entry* e; - + // Not interested in anything you might have to say... if (npcParse == NULL || npcParse->active == NULL) return 0; - + msg = va_arg(ap,char*); len = va_arg(ap,int); sd = va_arg(ap,struct map_session_data *); - + // iterate across all active sets for (pcreset = npcParse->active; pcreset != NULL; pcreset = pcreset->next) { @@ -350,7 +347,7 @@ int npc_chat_sub(struct block_list* bl, va_list ap) for (e = pcreset->head; e != NULL; e = e->next) { int offsets[2*10 + 10]; // 1/3 reserved for temp space required by pcre_exec - + // perform pattern match int r = libpcre->exec(e->pcre_, e->pcre_extra_, msg, len, 0, 0, offsets, ARRAYLENGTH(offsets)); if (r > 0) @@ -363,7 +360,7 @@ int npc_chat_sub(struct block_list* bl, va_list ap) libpcre->copy_substring(msg, offsets, r, i, val, sizeof(val)); script->set_var(sd, var, val); } - + // find the target label.. this sucks.. lst = nd->u.scr.label_list; ARR_FIND(0, nd->u.scr.label_list_num, i, strncmp(lst[i].name, e->label, sizeof(lst[i].name)) == 0); @@ -371,14 +368,13 @@ int npc_chat_sub(struct block_list* bl, va_list ap) ShowWarning("npc_chat_sub: Unable to find label: %s\n", e->label); return 0; } - + // run the npc script script->run_npc(nd->u.scr.script,lst[i].pos,sd->bl.id,nd->bl.id); return 0; } } } - return 0; } @@ -388,7 +384,7 @@ BUILDIN(defpattern) { const char* pattern = script_getstr(st,3); const char* label = script_getstr(st,4); struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); - + npc_chat->def_pattern(nd, setid, pattern, label); return true; @@ -397,7 +393,7 @@ BUILDIN(defpattern) { BUILDIN(activatepset) { int setid = script_getnum(st,2); struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); - + npc_chat->activate_pcreset(nd, setid); return true; @@ -406,16 +402,16 @@ BUILDIN(activatepset) { BUILDIN(deactivatepset) { int setid = script_getnum(st,2); struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); - + npc_chat->deactivate_pcreset(nd, setid); - + return true; } BUILDIN(deletepset) { int setid = script_getnum(st,2); struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); - + npc_chat->delete_pcreset(nd, setid); return true; @@ -423,7 +419,7 @@ BUILDIN(deletepset) { void npc_chat_defaults(void) { npc_chat = &npc_chat_s; - + npc_chat->sub = npc_chat_sub; npc_chat->finalize = npc_chat_finalize; npc_chat->def_pattern = npc_chat_def_pattern; @@ -433,9 +429,9 @@ void npc_chat_defaults(void) { npc_chat->activate_pcreset = activate_pcreset; npc_chat->lookup_pcreset = lookup_pcreset; npc_chat->finalize_pcrematch_entry = finalize_pcrematch_entry; - + libpcre = &libpcre_s; - + libpcre->compile = pcre_compile; libpcre->study = pcre_study; libpcre->exec = pcre_exec; diff --git a/src/map/packets.h b/src/map/packets.h index 1f465b833..ffa40ff7c 100644 --- a/src/map/packets.h +++ b/src/map/packets.h @@ -2818,7 +2818,6 @@ packet(0x96e,-1,clif->ackmergeitems); packet(0x0A22,5); // HEADER_ZC_RECV_ROULETTE_ITEM #endif - // 2014-10-22bRagexe - YomRawr #if PACKETVER >= 20141022 packet(0x0369,7,clif->pActionRequest,2,6); @@ -2896,7 +2895,7 @@ packet(0x96e,-1,clif->ackmergeitems); packet(0x0923,36,clif->pStoragePassword,0); packet(0x09e8,11,clif->pDull); //CZ_OPEN_MAILBOX packet(0x0a2e,6,clif->pDull); //TITLE -#endif +#endif /* PacketKeys: http://herc.ws/board/topic/1105-hercules-wpe-free-june-14th-patch/ */ #if PACKETVER >= 20110817 diff --git a/src/map/party.c b/src/map/party.c index 472c03423..db285a4b4 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -98,7 +98,7 @@ TBL_PC* party_sd_check(int party_id, int account_id, int char_id) { } int party_db_final(DBKey key, DBData *data, va_list ap) { struct party_data *p; - + if ((p = DB->data2ptr(data))) { if (p->instance) aFree(p->instance); @@ -114,7 +114,6 @@ int party_db_final(DBKey key, DBData *data, va_list ap) { aFree(p->hdata); } } - return 0; } /// Party data lookup using party id. @@ -168,7 +167,6 @@ int party_create(struct map_session_data *sd,char *name,int item,int item2) return 0; } - void party_created(int account_id,int char_id,int fail,int party_id,char *name) { struct map_session_data *sd; sd=map->id2sd(account_id); @@ -500,7 +498,6 @@ int party_member_added(int party_id,int account_id,int char_id, int flag) { break; } } - return 0; } @@ -600,7 +597,7 @@ int party_broken(int party_id) instance->list[p->instance[j]].owner_id = 0; } } - + for( i = 0; i < MAX_PARTY; i++ ) { if( p->data[i].sd!=NULL ) { clif->party_withdraw(p,p->data[i].sd,p->party.member[i].account_id,p->party.member[i].name,0x10); @@ -690,7 +687,7 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts //Change leadership. p->party.member[mi].leader = 0; p->party.member[tmi].leader = 1; - + /** update members **/ clif->PartyLeaderChanged(p->data[mi].sd, p->data[mi].sd->status.account_id, p->data[tmi].sd->status.account_id); @@ -955,13 +952,13 @@ int party_exp_share(struct party_data* p, struct block_list* src, unsigned int b base_exp_bonus = base_exp; job_exp_bonus = job_exp; #endif - + for (i = 0; i < c; i++) { #ifdef RENEWAL_EXP if( !(src && src->type == BL_MOB && ((TBL_MOB*)src)->db->mexp) ){ struct mob_data *md = (TBL_MOB*)src; int rate = pc->level_penalty_mod(md->level - (sd[i])->status.base_level, md->status.race, md->status.mode, 1); - + base_exp = (unsigned int)cap_value(base_exp_bonus * rate / 100, 1, UINT_MAX); job_exp = (unsigned int)cap_value(job_exp_bonus * rate / 100, 1, UINT_MAX); } @@ -1118,7 +1115,7 @@ int party_sub_count_chorus(struct block_list *bl, va_list ap) { if (sd->state.autotrade) return 0; - + if (battle_config.idle_no_share && pc_isidle(sd)) return 0; @@ -1189,9 +1186,8 @@ void party_booking_register(struct map_session_data *sd, short level, short mapi #ifndef PARTY_RECRUIT struct party_booking_ad_info *pb_ad; int i; - + pb_ad = (struct party_booking_ad_info*)idb_get(party->booking_db, sd->status.char_id); - if( pb_ad == NULL ) { pb_ad = party->create_booking_data(); @@ -1202,17 +1198,17 @@ void party_booking_register(struct map_session_data *sd, short level, short mapi clif->PartyBookingRegisterAck(sd, 2); return; } - + memcpy(pb_ad->charname,sd->status.name,NAME_LENGTH); pb_ad->expiretime = (int)time(NULL); pb_ad->p_detail.level = level; pb_ad->p_detail.mapid = mapid; - + for(i=0;i<PARTY_BOOKING_JOBS;i++) if(job[i] != 0xFF) pb_ad->p_detail.job[i] = job[i]; else pb_ad->p_detail.job[i] = -1; - + clif->PartyBookingRegisterAck(sd, 0); clif->PartyBookingInsertNotify(sd, pb_ad); // Notice #else @@ -1244,26 +1240,25 @@ void party_booking_update(struct map_session_data *sd, short* job) { #ifndef PARTY_RECRUIT int i; struct party_booking_ad_info *pb_ad; - + pb_ad = (struct party_booking_ad_info*)idb_get(party->booking_db, sd->status.char_id); - + if( pb_ad == NULL ) return; - + pb_ad->expiretime = (int)time(NULL);// Update time. - + for(i=0;i<PARTY_BOOKING_JOBS;i++) if(job[i] != 0xFF) pb_ad->p_detail.job[i] = job[i]; else pb_ad->p_detail.job[i] = -1; - + clif->PartyBookingUpdateNotify(sd, pb_ad); #else return; #endif } - void party_recruit_search(struct map_session_data *sd, short level, short mapid, unsigned long lastindex, short resultcount) { #ifdef PARTY_RECRUIT struct party_booking_ad_info *pb_ad; @@ -1302,9 +1297,9 @@ void party_booking_search(struct map_session_data *sd, short level, short mapid, struct party_booking_ad_info* result_list[PARTY_BOOKING_RESULTS]; bool more_result = false; DBIterator* iter = db_iterator(party->booking_db); - + memset(result_list, 0, sizeof(result_list)); - + for( pb_ad = dbi_first(iter); dbi_exists(iter); pb_ad = dbi_next(iter) ) { if (pb_ad->index < lastindex || (level && (pb_ad->p_detail.level < level-15 || pb_ad->p_detail.level > level))) continue; @@ -1334,7 +1329,6 @@ void party_booking_search(struct map_session_data *sd, short level, short mapid, #endif } - bool party_booking_delete(struct map_session_data *sd) { struct party_booking_ad_info* pb_ad; @@ -1384,7 +1378,7 @@ void party_defaults(void) { party->searchname = party_searchname; party->getmemberid = party_getmemberid; party->getavailablesd = party_getavailablesd; - + party->create = party_create; party->created = party_created; party->request_info = party_request_info; diff --git a/src/map/path.c b/src/map/path.c index 723fd8e8f..a482fc473 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -69,7 +69,7 @@ static const unsigned char walk_choices [3][3] = * Find the closest reachable cell, 'count' cells away from (x0,y0) in direction (dx,dy). * Income after the coordinates of the blow *------------------------------------------*/ -int path_blownpos(int16 m,int16 x0,int16 y0,int16 dx,int16 dy,int count) +int path_blownpos(struct block_list *bl, int16 m,int16 x0,int16 y0,int16 dx,int16 dy,int count) { struct map_data *md; @@ -88,7 +88,7 @@ int path_blownpos(int16 m,int16 x0,int16 y0,int16 dx,int16 dy,int count) } while( count > 0 && (dx != 0 || dy != 0) ) { - if( !md->getcellp(md,x0+dx,y0+dy,CELL_CHKPASS) ) + if (!md->getcellp(md, bl, x0 + dx, y0 + dy, CELL_CHKPASS)) break; x0 += dx; @@ -102,7 +102,7 @@ int path_blownpos(int16 m,int16 x0,int16 y0,int16 dx,int16 dy,int count) /*========================================== * is ranged attack from (x0,y0) to (x1,y1) possible? *------------------------------------------*/ -bool path_search_long(struct shootpath_data *spd,int16 m,int16 x0,int16 y0,int16 x1,int16 y1,cell_chk cell) +bool path_search_long(struct shootpath_data *spd,struct block_list *bl,int16 m,int16 x0,int16 y0,int16 x1,int16 y1,cell_chk cell) { int dx, dy; int wx = 0, wy = 0; @@ -159,7 +159,7 @@ bool path_search_long(struct shootpath_data *spd,int16 m,int16 x0,int16 y0,int16 spd->y[spd->len] = y0; spd->len++; } - if (md->getcellp(md,x0,y0,cell)) + if (md->getcellp(md, bl, x0, y0, cell)) return false; } @@ -236,7 +236,7 @@ static int add_path(struct node_heap *heap, struct path_node *tp, int16 x, int16 * flag: &1 = easy path search only * cell: type of obstruction to check for *------------------------------------------*/ -bool path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int flag, cell_chk cell) +bool path_search(struct walkpath_data *wpd, struct block_list *bl, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int flag, cell_chk cell) { register int i, j, x, y, dx, dy; struct map_data *md; @@ -250,13 +250,13 @@ bool path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x md = &map->list[m]; //Do not check starting cell as that would get you stuck. - if (x0 < 0 || x0 >= md->xs || y0 < 0 || y0 >= md->ys /*|| md->getcellp(md,x0,y0,cell)*/) + if (x0 < 0 || x0 >= md->xs || y0 < 0 || y0 >= md->ys /*|| md->getcellp(md, bl, x0, y0, cell)*/) return false; // Check destination cell - if (x1 < 0 || x1 >= md->xs || y1 < 0 || y1 >= md->ys || md->getcellp(md,x1,y1,cell)) + if (x1 < 0 || x1 >= md->xs || y1 < 0 || y1 >= md->ys || md->getcellp(md, bl, x1, y1, cell)) return false; - + if( x0 == x1 && y0 == y1 ) { wpd->path_len = 0; wpd->path_pos = 0; @@ -287,7 +287,7 @@ bool path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x if( dx == 0 && dy == 0 ) break; // success - if( md->getcellp(md,x,y,cell) ) + if (md->getcellp(md, bl, x, y, cell)) break; // obstacle = failure } @@ -360,26 +360,26 @@ bool path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x break; } - if (y < ys && !md->getcellp(md, x, y+1, cell)) allowed_dirs |= DIR_NORTH; - if (y > 0 && !md->getcellp(md, x, y-1, cell)) allowed_dirs |= DIR_SOUTH; - if (x < xs && !md->getcellp(md, x+1, y, cell)) allowed_dirs |= DIR_EAST; - if (x > 0 && !md->getcellp(md, x-1, y, cell)) allowed_dirs |= DIR_WEST; + if (y < ys && !md->getcellp(md, bl, x, y+1, cell)) allowed_dirs |= DIR_NORTH; + if (y > 0 && !md->getcellp(md, bl, x, y-1, cell)) allowed_dirs |= DIR_SOUTH; + if (x < xs && !md->getcellp(md, bl, x+1, y, cell)) allowed_dirs |= DIR_EAST; + if (x > 0 && !md->getcellp(md, bl, x-1, y, cell)) allowed_dirs |= DIR_WEST; #define chk_dir(d) ((allowed_dirs & (d)) == (d)) // Process neighbors of current node - if (chk_dir(DIR_SOUTH|DIR_EAST) && !md->getcellp(md, x+1, y-1, cell)) + if (chk_dir(DIR_SOUTH|DIR_EAST) && !md->getcellp(md, bl, x+1, y-1, cell)) e += add_path(&open_set, tp, x+1, y-1, g_cost + MOVE_DIAGONAL_COST, current, heuristic(x+1, y-1, x1, y1)); // (x+1, y-1) 5 if (chk_dir(DIR_EAST)) e += add_path(&open_set, tp, x+1, y, g_cost + MOVE_COST, current, heuristic(x+1, y, x1, y1)); // (x+1, y) 6 - if (chk_dir(DIR_NORTH|DIR_EAST) && !md->getcellp(md, x+1, y+1, cell)) + if (chk_dir(DIR_NORTH|DIR_EAST) && !md->getcellp(md, bl, x+1, y+1, cell)) e += add_path(&open_set, tp, x+1, y+1, g_cost + MOVE_DIAGONAL_COST, current, heuristic(x+1, y+1, x1, y1)); // (x+1, y+1) 7 if (chk_dir(DIR_NORTH)) e += add_path(&open_set, tp, x, y+1, g_cost + MOVE_COST, current, heuristic(x, y+1, x1, y1)); // (x, y+1) 0 - if (chk_dir(DIR_NORTH|DIR_WEST) && !md->getcellp(md, x-1, y+1, cell)) + if (chk_dir(DIR_NORTH|DIR_WEST) && !md->getcellp(md, bl, x-1, y+1, cell)) e += add_path(&open_set, tp, x-1, y+1, g_cost + MOVE_DIAGONAL_COST, current, heuristic(x-1, y+1, x1, y1)); // (x-1, y+1) 1 if (chk_dir(DIR_WEST)) e += add_path(&open_set, tp, x-1, y, g_cost + MOVE_COST, current, heuristic(x-1, y, x1, y1)); // (x-1, y) 2 - if (chk_dir(DIR_SOUTH|DIR_WEST) && !md->getcellp(md, x-1, y-1, cell)) + if (chk_dir(DIR_SOUTH|DIR_WEST) && !md->getcellp(md, bl, x-1, y-1, cell)) e += add_path(&open_set, tp, x-1, y-1, g_cost + MOVE_DIAGONAL_COST, current, heuristic(x-1, y-1, x1, y1)); // (x-1, y-1) 3 if (chk_dir(DIR_SOUTH)) e += add_path(&open_set, tp, x, y-1, g_cost + MOVE_COST, current, heuristic(x, y-1, x1, y1)); // (x, y-1) 4 @@ -409,7 +409,6 @@ bool path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x return false; } - //Distance functions, taken from http://www.flipcode.com/articles/article_fastdistance.shtml bool check_distance(int dx, int dy, int distance) { @@ -489,7 +488,7 @@ int distance_client(int dx, int dy) void path_defaults(void) { path = &path_s; - + path->blownpos = path_blownpos; path->search_long = path_search_long; path->search = path_search; diff --git a/src/map/path.h b/src/map/path.h index 2ece8f84b..14885d566 100644 --- a/src/map/path.h +++ b/src/map/path.h @@ -42,11 +42,11 @@ struct shootpath_data { struct path_interface { // calculates destination cell for knockback - int (*blownpos) (int16 m, int16 x0, int16 y0, int16 dx, int16 dy, int count); + int (*blownpos) (struct block_list *bl, int16 m, int16 x0, int16 y0, int16 dx, int16 dy, int count); // tries to find a walkable path - bool (*search) (struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int flag, cell_chk cell); + bool (*search) (struct walkpath_data *wpd, struct block_list *bl, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int flag, cell_chk cell); // tries to find a shootable path - bool (*search_long) (struct shootpath_data *spd, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, cell_chk cell); + bool (*search_long) (struct shootpath_data *spd, struct block_list *bl, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, cell_chk cell); bool (*check_distance) (int dx, int dy, int distance); unsigned int (*distance) (int dx, int dy); bool (*check_distance_client) (int dx, int dy, int distance); diff --git a/src/map/pc.c b/src/map/pc.c index 49b8f1f94..dc7014701 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -40,6 +40,7 @@ #include "common/cbasetypes.h" #include "common/conf.h" #include "common/core.h" // get_svn_revision() +#include "common/HPM.h" #include "common/malloc.h" #include "common/mmo.h" // NAME_LENGTH, MAX_CARTS, NEW_CARTS #include "common/nullpo.h" @@ -126,7 +127,7 @@ void pc_setinvincibletimer(struct map_session_data* sd, int val) { nullpo_retv(sd); val += map->list[sd->bl.m].invincible_time_inc; - + if( sd->invincible_timer != INVALID_TIMER ) timer->delete(sd->invincible_timer,pc->invincible_timer); sd->invincible_timer = timer->add(timer->gettick()+val,pc->invincible_timer,sd->bl.id,0); @@ -187,7 +188,7 @@ int pc_getmaxspiritball(struct map_session_data *sd, int min) { nullpo_ret(sd); result = pc->checkskill(sd, MO_CALLSPIRITS); - + if ( min && result < min ) result = min; else if ( sd->sc.data[SC_RAISINGDRAGON] ) @@ -516,7 +517,7 @@ void pc_rental_expire(struct map_session_data *sd, int i) { } break; } - + clif->rental_expired(sd->fd, i, sd->status.inventory[i].nameid); pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_NORMAL, LOG_TYPE_OTHER); } @@ -622,14 +623,12 @@ int pc_makesavestatus(struct map_session_data *sd) sd->status.last_point.x = 0; sd->status.last_point.y = 0; } - + if( sd->status.save_point.map == 0 ) { sd->status.save_point.map = 1; sd->status.save_point.x = 0; sd->status.save_point.y = 0; } - - return 0; } @@ -915,7 +914,7 @@ int pc_isequip(struct map_session_data *sd,int n) if(pc_has_permission(sd, PC_PERM_USE_ALL_EQUIPMENT)) return 1; - + if (item->elv && sd->status.base_level < (unsigned int)item->elv) { clif->msgtable(sd, MSG_ITEM_CANT_EQUIP_LVL); return 0; @@ -1047,7 +1046,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim if( sd->status.clothes_color < MIN_CLOTH_COLOR || sd->status.clothes_color > MAX_CLOTH_COLOR ) { sd->status.clothes_color = MIN_CLOTH_COLOR; } - + //Initializations to null/0 unneeded since map_session_data was filled with 0 upon allocation. if(!sd->status.hp) pc_setdead(sd); sd->state.connect_new = 1; @@ -1079,7 +1078,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim sd->hchsysch_tick = tick; sd->idletime = sockt->last_tick; - + for(i = 0; i < MAX_SPIRITBALL; i++) sd->spirit_timer[i] = INVALID_TIMER; for(i = 0; i < ARRAYLENGTH(sd->autobonus); i++) @@ -1105,11 +1104,11 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim if( sd->status.option & OPTION_INVISIBLE && !pc->can_use_command(sd, "@hide") ) sd->status.option &=~ OPTION_INVISIBLE; - + status->change_init(&sd->bl); - + sd->sc.option = sd->status.option; //This is the actual option used in battle. - + //Set here because we need the inventory data for weapon sprite parsing. status->set_viewdata(&sd->bl, sd->status.class_); unit->dataset(&sd->bl); @@ -1118,25 +1117,25 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim sd->guild_y = -1; sd->disguise = -1; - + sd->instance = NULL; sd->instances = 0; - + sd->bg_queue.arena = NULL; sd->bg_queue.ready = 0; sd->bg_queue.client_has_bg_data = 0; sd->bg_queue.type = 0; - + sd->queues = NULL; sd->queues_count = 0; - + sd->state.dialog = 0; - + sd->delayed_damage = 0; - + if( battle_config.item_check ) sd->state.itemcheck = 1; - + // Event Timers for( i = 0; i < MAX_EVENTTIMER; i++ ) sd->eventtimer[i] = INVALID_TIMER; @@ -1156,9 +1155,9 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim sd->vars_dirty = false; sd->vars_ok = false; sd->vars_received = 0x0; - + sd->lang_id = map->default_lang_id; - + //warp player if ((i=pc->setpos(sd,sd->status.last_point.map, sd->status.last_point.x, sd->status.last_point.y, CLR_OUTSIGHT)) != 0) { ShowError ("Last_point_map %s - id %d not found (error code %d)\n", mapindex_id2name(sd->status.last_point.map), sd->status.last_point.map, i); @@ -1193,7 +1192,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim sprintf(buf, msg_sd(sd,1295), sysinfo->vcstype(), sysinfo->vcsrevision_src(), sysinfo->vcsrevision_scripts()); // %s revision '%s' (src) / '%s' (scripts) clif->message(sd->fd, buf); } - + if (expiration_time != 0) { sd->expiration_time = expiration_time; } @@ -1222,7 +1221,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim /* [Ind/Hercules] */ sd->sc_display = NULL; sd->sc_display_count = 0; - + // Request all registries (auth is considered completed whence they arrive) intif->request_registry(sd,7); return true; @@ -1305,7 +1304,7 @@ int pc_reg_received(struct map_session_data *sd) if ((i = pc->checkskill(sd,RG_PLAGIARISM)) > 0) { sd->cloneskill_id = pc_readglobalreg(sd,script->add_str("CLONE_SKILL")); - if (sd->cloneskill_id > 0 && (idx = skill->get_index(sd->cloneskill_id))) { + if (sd->cloneskill_id > 0 && (idx = skill->get_index(sd->cloneskill_id)) > 0) { sd->status.skill[idx].id = sd->cloneskill_id; sd->status.skill[idx].lv = pc_readglobalreg(sd,script->add_str("CLONE_SKILL_LV")); if (sd->status.skill[idx].lv > i) @@ -1315,7 +1314,7 @@ int pc_reg_received(struct map_session_data *sd) } if ((i = pc->checkskill(sd,SC_REPRODUCE)) > 0) { sd->reproduceskill_id = pc_readglobalreg(sd,script->add_str("REPRODUCE_SKILL")); - if( sd->reproduceskill_id > 0 && (idx = skill->get_index(sd->reproduceskill_id))) { + if( sd->reproduceskill_id > 0 && (idx = skill->get_index(sd->reproduceskill_id)) > 0) { sd->status.skill[idx].id = sd->reproduceskill_id; sd->status.skill[idx].lv = pc_readglobalreg(sd,script->add_str("REPRODUCE_SKILL_LV")); if( i < sd->status.skill[idx].lv) @@ -1323,7 +1322,7 @@ int pc_reg_received(struct map_session_data *sd) sd->status.skill[idx].flag = SKILL_FLAG_PLAGIARIZED; } } - + //Weird... maybe registries were reloaded? if (sd->state.active) return 0; @@ -1369,7 +1368,7 @@ int pc_reg_received(struct map_session_data *sd) clif->message(sd->fd, msg_sd(sd,11)); // Invisible: On // decrement the number of pvp players on the map map->list[sd->bl.m].users_pvp--; - + if( map->list[sd->bl.m].flag.pvp && !map->list[sd->bl.m].flag.pvp_nocalcrank && sd->pvp_timer != INVALID_TIMER ) {// unregister the player for ranking timer->delete( sd->pvp_timer, pc->calc_pvprank_timer ); sd->pvp_timer = INVALID_TIMER; @@ -1379,7 +1378,7 @@ int pc_reg_received(struct map_session_data *sd) if( npc->motd ) /* [Ind/Hercules] */ script->run(npc->motd->u.scr.script, 0, sd->bl.id, npc->fake_nd->bl.id); - + return 1; } @@ -1406,7 +1405,6 @@ int pc_calc_skillpoint(struct map_session_data* sd) { return skill_point; } - /*========================================== * Calculation of skill level. *------------------------------------------*/ @@ -1424,7 +1422,7 @@ int pc_calc_skilltree(struct map_session_data *sd) return 1; } c = pc->class2idx(c); - + for( i = 0; i < MAX_SKILL; i++ ) { if( sd->status.skill[i].flag != SKILL_FLAG_PLAGIARIZED && sd->status.skill[i].flag != SKILL_FLAG_PERM_GRANTED ) //Don't touch these sd->status.skill[i].id = 0; //First clear skills. @@ -1542,7 +1540,7 @@ int pc_calc_skilltree(struct map_session_data *sd) if( f ) { int inf2; inf2 = skill->dbs->db[idx].inf2; - + if(!sd->status.skill[idx].lv && ( (inf2&INF2_QUEST_SKILL && !battle_config.quest_skill_learn) || inf2&INF2_WEDDING_SKILL || @@ -1551,7 +1549,7 @@ int pc_calc_skilltree(struct map_session_data *sd) continue; //Cannot be learned via normal means. Note this check DOES allows raising already known skills. sd->status.skill[idx].id = id; - + if(inf2&INF2_SPIRIT_SKILL) { //Spirit skills cannot be learned, they will only show up on your tree when you get buffed. sd->status.skill[idx].lv = 1; // need to manually specify a skill level sd->status.skill[idx].flag = SKILL_FLAG_TEMPORARY; //So it is not saved, and tagged as a "bonus" skill. @@ -1689,7 +1687,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd) novice_skills = pc->max_level[pc->class2idx(JOB_NOVICE)][1] - 1; sd->sktree.second = sd->sktree.third = 0; - + // limit 1st class and above to novice job levels if(skill_point < novice_skills) { c = MAPID_NOVICE; @@ -1744,7 +1742,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd) // restore non-limiting flags c |= sd->class_&(JOBL_UPPER|JOBL_BABY); - + return c; } @@ -4475,7 +4473,7 @@ int pc_additem(struct map_session_data *sd,struct item *item_data,int amount,e_l break; } } - + i = MAX_INVENTORY; // Stackable | Non Rental @@ -4494,7 +4492,7 @@ int pc_additem(struct map_session_data *sd,struct item *item_data,int amount,e_l } } } - + if ( i >= MAX_INVENTORY ) { i = pc->search_inventory(sd,0); if (i == INDEX_NOT_FOUND) @@ -4608,7 +4606,7 @@ int pc_dropitem(struct map_session_data *sd,int n,int amount) return 0; } - if (!map->addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 2)) + if (!map->addflooritem(&sd->bl, &sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 2)) return 0; pc->delitem(sd, n, amount, 1, DELITEM_NORMAL, LOG_TYPE_PICKDROP_PLAYER); @@ -4821,7 +4819,7 @@ int pc_isUseitem(struct map_session_data *sd,int n) return 0; } } - + //Gender check if(item->sex != 2 && sd->status.sex != item->sex) return 0; @@ -4842,7 +4840,7 @@ int pc_isUseitem(struct map_session_data *sd,int n) (item->class_base[(sd->class_&JOBL_2_1) ? 1 : ((sd->class_&JOBL_2_2) ? 2 : 0)]) )) return 0; - + //Not usable by upper class. [Haru] while( 1 ) { // Normal classes (no upper, no baby, no third classes) @@ -4924,7 +4922,7 @@ int pc_useitem(struct map_session_data *sd,int n) { (itemdb_iscashfood(nameid) && DIFF_TICK(sd->canusecashfood_tick, tick) > 0) ) return 0; - + /* Items with delayed consume are not meant to work while in mounts except reins of mount(12622) */ if( sd->inventory_data[n]->flag.delay_consume && nameid != ITEMID_REINS_OF_MOUNT ) { if( sd->sc.data[SC_ALL_RIDING] ) @@ -4978,11 +4976,11 @@ int pc_useitem(struct map_session_data *sd,int n) { return 0; } } - + //Dead Branch & Bloody Branch & Porings Box if( nameid == ITEMID_BRANCH_OF_DEAD_TREE || nameid == ITEMID_BLOODY_DEAD_BRANCH || nameid == ITEMID_PORING_BOX ) logs->branch(sd); - + sd->itemid = sd->status.inventory[n].nameid; sd->itemindex = n; if(sd->catch_target_class != -1) //Abort pet catching. @@ -5186,7 +5184,7 @@ int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount) if(item_data->nameid==0 || amount < 1 || item_data->amount<amount || sd->state.vending ) return 1; - + if((flag = pc->additem(sd,item_data,amount,LOG_TYPE_NONE)) == 0) return pc->cart_delitem(sd,idx,amount,0,LOG_TYPE_NONE); @@ -5194,7 +5192,7 @@ int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount) } void pc_bound_clear(struct map_session_data *sd, enum e_item_bound_type type) { int i; - + switch( type ) { /* both restricted to inventory */ case IBT_PARTY: @@ -5210,7 +5208,7 @@ void pc_bound_clear(struct map_session_data *sd, enum e_item_bound_type type) { break; case IBT_GUILD: { struct guild_storage *gstor = idb_get(gstorage->db,sd->status.guild_id); - + for( i = 0; i < MAX_INVENTORY; i++ ){ if(sd->status.inventory[i].bound == type) { if( gstor ) @@ -5223,7 +5221,6 @@ void pc_bound_clear(struct map_session_data *sd, enum e_item_bound_type type) { } break; } - } /*========================================== * Display item stolen msg to player sd @@ -5292,7 +5289,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil // Try dropping one item, in the order from first to last possible slot. // Droprate is affected by the skill success rate. for( i = 0; i < MAX_STEAL_DROP; i++ ) - if( md->db->dropitem[i].nameid > 0 && (data = itemdb->exists(md->db->dropitem[i].nameid)) && rnd() % 10000 < md->db->dropitem[i].p * rate/100. ) + if (md->db->dropitem[i].nameid > 0 && (data = itemdb->exists(md->db->dropitem[i].nameid)) != NULL && rnd() % 10000 < md->db->dropitem[i].p * rate/100.) break; if( i == MAX_STEAL_DROP ) return 0; @@ -5402,7 +5399,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short map_index, int x, int stop = true; } } - if ( !stop && sd->status.party_id && (p = party->search(sd->status.party_id)) && p->instances ) { + if ( !stop && sd->status.party_id && (p = party->search(sd->status.party_id)) != NULL && p->instances ) { for( i = 0; i < p->instances; i++ ) { if( p->instance[i] >= 0 ) { ARR_FIND(0, instance->list[p->instance[i]].num_map, j, map->list[instance->list[p->instance[i]].map[j]].instance_src_map == m && !map->list[instance->list[p->instance[i]].map[j]].custom_name); @@ -5447,7 +5444,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short map_index, int x, int if( sd->state.changemap ) { // Misc map-changing settings int i; sd->state.pmap = sd->bl.m; - + for( i = 0; i < sd->queues_count; i++ ) { struct hQueue *queue; if( (queue = script->queue(sd->queues[i])) && queue->onMapChange[0] != '\0' ) { @@ -5455,7 +5452,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short map_index, int x, int npc->event(sd, queue->onMapChange, 0); } } - + if( map->list[m].cell == (struct mapcell *)0xdeadbeaf ) map->cellfromcache(&map->list[m]); if (sd->sc.count) { // Cancel some map related stuff. @@ -5498,7 +5495,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short map_index, int x, int clif->message (sd->fd, msg_sd(sd,276)); // "You can't open a shop on this map" vending->close(sd); } - + if (map->list[sd->bl.m].channel) { channel->leave(map->list[sd->bl.m].channel,sd); } @@ -5538,10 +5535,10 @@ int pc_setpos(struct map_session_data* sd, unsigned short map_index, int x, int do { x=rnd()%(map->list[m].xs-2)+1; y=rnd()%(map->list[m].ys-2)+1; - } while(map->getcell(m,x,y,CELL_CHKNOPASS)); + } while(map->getcell(m, &sd->bl, x, y, CELL_CHKNOPASS)); } - if (sd->state.vending && map->getcell(m,x,y,CELL_CHKNOVENDING)) { + if (sd->state.vending && map->getcell(m, &sd->bl, x, y, CELL_CHKNOVENDING)) { clif->message (sd->fd, msg_sd(sd,204)); // "You can't open a shop on this cell." vending->close(sd); } @@ -5584,7 +5581,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short map_index, int x, int sd->md->bl.y = sd->md->ud.to_y = y; sd->md->ud.dir = sd->ud.dir; } - + /* given autotrades have no clients you have to trigger this manually otherwise they get stuck in memory limbo bugreport:7495 */ if( sd->state.autotrade ) clif->pLoadEndAck(0,sd); @@ -5613,7 +5610,7 @@ int pc_randomwarp(struct map_session_data *sd, clr_type type) { do { x=rnd()%(map->list[m].xs-2)+1; y=rnd()%(map->list[m].ys-2)+1; - } while( map->getcell(m,x,y,CELL_CHKNOPASS) && (i++) < 1000 ); + } while (map->getcell(m, &sd->bl, x, y, CELL_CHKNOPASS) && (i++) < 1000 ); if (i < 1000) return pc->setpos(sd,map_id2index(sd->bl.m),x,y,type); @@ -5702,14 +5699,14 @@ int pc_checkskill2(struct map_session_data *sd,uint16 index) { } if( skill->dbs->db[index].nameid >= GD_SKILLBASE && skill->dbs->db[index].nameid < GD_MAX ) { struct guild *g; - + if( sd->status.guild_id>0 && (g=sd->guild)!=NULL) return guild->checkskill(g,skill->dbs->db[index].nameid); return 0; } if(sd->status.skill[index].id == skill->dbs->db[index].nameid) return (sd->status.skill[index].lv); - + return 0; } @@ -6482,7 +6479,7 @@ int pc_stop_following (struct map_session_data *sd) sd->ud.target_to = 0; unit->stop_walking(&sd->bl, STOPWALKING_FLAG_FIXPOS); - + return 0; } @@ -6621,8 +6618,6 @@ void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned in *job_exp = (unsigned int) cap_value((double)*job_exp * sd->status.mod_exp/100., 1, UINT_MAX); } - - return; } /** @@ -6703,7 +6698,7 @@ bool pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned in if(job_exp) clif->displayexp(sd, job_exp, SP_JOBEXP, is_quest); #endif - + if(sd->state.showexp) { char output[256]; sprintf(output, @@ -6751,7 +6746,6 @@ unsigned int pc_thisbaseexp(struct map_session_data *sd) return pc->exp_table[pc->class2idx(sd->status.class_)][0][sd->status.base_level-2]; } - /*========================================== * job level exp lookup * Return: @@ -7001,7 +6995,7 @@ int pc_skillup(struct map_session_data *sd,uint16 skill_id) { if( !(index = skill->get_index(skill_id)) ) return 0; - + if( sd->status.skill_point > 0 && sd->status.skill[index].id && sd->status.skill[index].flag == SKILL_FLAG_PERMANENT && //Don't allow raising while you have granted skills. [Skotlex] @@ -7301,9 +7295,9 @@ int pc_resetskill(struct map_session_data* sd, int flag) if( inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL) ) //Avoid reseting wedding/linker skills. continue; - + skill_id = skill->dbs->db[i].nameid; - + // Don't reset trick dead if not a novice/baby if( skill_id == NV_TRICKDEAD && (sd->class_&(MAPID_BASEMASK|JOBL_2)) != MAPID_NOVICE ) { sd->status.skill[i].lv = 0; @@ -7317,7 +7311,7 @@ int pc_resetskill(struct map_session_data* sd, int flag) if( sd->status.skill[i].flag == SKILL_FLAG_PERM_GRANTED ) continue; - + if( flag&PCRESETSKILL_CHSEX && !skill_ischangesex(i) ) continue; @@ -7344,7 +7338,6 @@ int pc_resetskill(struct map_session_data* sd, int flag) sd->status.skill_point += skill_point; - if (!(flag&PCRESETSKILL_RECOUNT)) { // Remove all SCs that can't be inactivated without a skill if( sd->sc.data[SC_STORMKICK_READY] ) @@ -7550,7 +7543,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { if (sd->npc_id && sd->st && sd->st->state != RUN) npc->event_dequeue(sd); - + pc_setglobalreg(sd,script->add_str("PC_DIE_COUNTER"),sd->die_counter+1); pc->setparam(sd, SP_KILLERRID, src?src->id:0); @@ -7559,15 +7552,15 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { if( (bgd = bg->team_search(sd->bg_id)) != NULL && bgd->die_event[0] ) npc->event(sd, bgd->die_event, 0); } - + for( i = 0; i < sd->queues_count; i++ ) { struct hQueue *queue; if( (queue = script->queue(sd->queues[i])) && queue->onDeath[0] != '\0' ) npc->event(sd, queue->onDeath, 0); } - + npc->script_event(sd,NPCE_DIE); - + // Clear anything NPC-related when you die and was interacting with one. if ( (sd->npc_id || sd->npc_shopid) && sd->state.dialog) { if (sd->state.using_fake_npc) { @@ -7665,7 +7658,6 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { else if (sd->status.karma < ssd->status.karma) // If player killed was more good ssd->status.karma++; - // or the PK System way... if (sd->status.karma > 0) // player killed is dishonourable? @@ -7688,7 +7680,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { item_tmp.card[1]=0; item_tmp.card[2]=GetWord(sd->status.char_id,0); // CharId item_tmp.card[3]=GetWord(sd->status.char_id,1); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } // activate Steel body if a super novice dies at 99+% exp [celest] @@ -7717,7 +7709,6 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { ) { unsigned int base_penalty = 0; if (battle_config.death_penalty_base > 0) { - switch (battle_config.death_penalty_type) { case 1: base_penalty = (unsigned int) ((double)pc->nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000); @@ -7726,7 +7717,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { base_penalty = (unsigned int) ((double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000); break; } - + if(base_penalty) { if (battle_config.pk_mode && src && src->type==BL_PC) base_penalty*=2; @@ -7736,10 +7727,10 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { clif->updatestatus(sd,SP_BASEEXP); } } - + if(battle_config.death_penalty_job > 0) { base_penalty = 0; - + switch (battle_config.death_penalty_type) { case 1: base_penalty = (unsigned int) ((double)pc->nextjobexp(sd) * (double)battle_config.death_penalty_job/10000); @@ -7748,7 +7739,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { base_penalty = (unsigned int) ((double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000); break; } - + if(base_penalty) { if (battle_config.pk_mode && src && src->type==BL_PC) base_penalty*=2; @@ -7758,7 +7749,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { clif->updatestatus(sd,SP_JOBEXP); } } - + if(battle_config.zeny_penalty > 0 && !map->list[sd->bl.m].flag.nozenypenalty) { base_penalty = (unsigned int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.); if(base_penalty) @@ -8025,7 +8016,6 @@ int pc_readparam(struct map_session_data* sd,int type) case SP_VARCASTRATE: val = sd->bonus.varcastrate; break; case SP_ADD_VARIABLECAST:val = sd->bonus.add_varcast; break; #endif - } return val; @@ -8431,7 +8421,7 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper) /* going off star glad lineage, reset feel to not store no-longer-used vars in the database */ pc->resetfeel(sd); } - + sd->status.class_ = job; fame_flag = pc->famerank(sd->status.char_id,sd->class_&MAPID_UPPERMASK); sd->class_ = (unsigned short)b_class; @@ -8694,7 +8684,7 @@ int pc_setoption(struct map_session_data *sd,int type) new_look = JOB_STAR_GLADIATOR2; else if (!(type&OPTION_FLYING) && p_type&OPTION_FLYING) new_look = -1; - + if (sd->disguise != -1 || !new_look) return 0; //Disguises break sprite changes @@ -8940,7 +8930,7 @@ int pc_readreg(struct map_session_data* sd, int64 reg) { **/ void pc_setreg(struct map_session_data* sd, int64 reg, int val) { unsigned int index = script_getvaridx(reg); - + if( val ) { i64db_iput(sd->regs.vars, reg, val); if( index ) @@ -8959,7 +8949,7 @@ char* pc_readregstr(struct map_session_data* sd, int64 reg) { struct script_reg_str *p = NULL; p = i64db_get(sd->regs.vars, reg); - + return p ? p->value : NULL; } /** @@ -8972,10 +8962,10 @@ void pc_setregstr(struct map_session_data* sd, int64 reg, const char* str) { if( str[0] ) { p = ers_alloc(pc->str_reg_ers, struct script_reg_str); - + p->value = aStrdup(str); p->flag.type = 1; - + if( sd->regs.vars->put(sd->regs.vars, DB->i642key(reg), DB->ptr2data(p), &prev) ) { p = DB->data2ptr(&prev); if( p->value ) @@ -9004,7 +8994,7 @@ void pc_setregstr(struct map_session_data* sd, int64 reg, const char* str) { **/ int pc_readregistry(struct map_session_data *sd, int64 reg) { struct script_reg_num *p = NULL; - + if (!sd->vars_ok) { ShowError("pc_readregistry: Trying to read reg %s before it's been loaded!\n", script->get_str(script_getvarid(reg))); //This really shouldn't happen, so it's possible the data was lost somewhere, we should request it again. @@ -9012,7 +9002,7 @@ int pc_readregistry(struct map_session_data *sd, int64 reg) { sockt->eof(sd->fd); return 0; } - + p = i64db_get(sd->regs.vars, reg); return p ? p->value : 0; @@ -9025,7 +9015,7 @@ int pc_readregistry(struct map_session_data *sd, int64 reg) { **/ char* pc_readregistry_str(struct map_session_data *sd, int64 reg) { struct script_reg_str *p = NULL; - + if (!sd->vars_ok) { ShowError("pc_readregistry_str: Trying to read reg %s before it's been loaded!\n", script->get_str(script_getvarid(reg))); //This really shouldn't happen, so it's possible the data was lost somewhere, we should request it again. @@ -9035,7 +9025,7 @@ char* pc_readregistry_str(struct map_session_data *sd, int64 reg) { } p = i64db_get(sd->regs.vars, reg); - + return p ? p->value : NULL; } /** @@ -9072,12 +9062,12 @@ int pc_setregistry(struct map_session_data *sd, int64 reg, int val) { } break; } - + if ( !pc->reg_load && !sd->vars_ok ) { ShowError("pc_setregistry : refusing to set %s until vars are received.\n", regname); return 0; } - + if( (p = i64db_get(sd->regs.vars, reg) ) ) { if( val ) { if( !p->value && index ) /* its a entry that was deleted, so we reset array */ @@ -9092,22 +9082,22 @@ int pc_setregistry(struct map_session_data *sd, int64 reg, int val) { p->flag.update = 1;/* either way, it will require either delete or replace */ } else if( val ) { DBData prev; - + if( index ) script->array_update(&sd->regs, reg, false); - + p = ers_alloc(pc->num_reg_ers, struct script_reg_num); - + p->value = val; if( !pc->reg_load ) p->flag.update = 1; - + if( sd->regs.vars->put(sd->regs.vars, DB->i642key(reg), DB->ptr2data(p), &prev) ) { p = DB->data2ptr(&prev); ers_free(pc->num_reg_ers, p); } } - + if( !pc->reg_load && p ) sd->vars_dirty = true; @@ -9150,12 +9140,12 @@ int pc_setregistry_str(struct map_session_data *sd, int64 reg, const char *val) script->array_update(&sd->regs, reg, false); p = ers_alloc(pc->str_reg_ers, struct script_reg_str); - + p->value = aStrdup(val); if( !pc->reg_load ) p->flag.update = 1; p->flag.type = 1; - + if( sd->regs.vars->put(sd->regs.vars, DB->i642key(reg), DB->ptr2data(p), &prev) ) { p = DB->data2ptr(&prev); if( p->value ) @@ -9163,10 +9153,10 @@ int pc_setregistry_str(struct map_session_data *sd, int64 reg, const char *val) ers_free(pc->str_reg_ers, p); } } - + if( !pc->reg_load && p ) sd->vars_dirty = true; - + return 1; } @@ -9294,7 +9284,7 @@ int pc_checkcombo(struct map_session_data *sd, struct item_data *data ) { /* ensure this isn't a duplicate combo */ if( sd->combos != NULL ) { int x; - + ARR_FIND( 0, sd->combo_count, x, sd->combos[x].id == data->combos[i]->id ); /* found a match, skip this combo */ @@ -9315,7 +9305,7 @@ int pc_checkcombo(struct map_session_data *sd, struct item_data *data ) { if(!sd->inventory_data[index]) continue; - + if ( itemdb_type(id) != IT_CARD ) { if ( sd->inventory_data[index]->nameid != id ) continue; @@ -9350,15 +9340,13 @@ int pc_checkcombo(struct map_session_data *sd, struct item_data *data ) { /* we got here, means all items in the combo are matching */ RECREATE(sd->combos, struct pc_combos, ++sd->combo_count); - combo = &sd->combos[sd->combo_count - 1]; - combo->bonus = data->combos[i]->script; combo->id = data->combos[i]->id; - + success++; } - + return success; } @@ -9368,11 +9356,11 @@ int pc_removecombo(struct map_session_data *sd, struct item_data *data ) { if( !sd->combos ) return 0;/* nothing to do here, player has no combos */ - + for( i = 0; i < data->combos_count; i++ ) { /* check if this combo exists in this user */ int x = 0, cursor = 0, j; - + ARR_FIND( 0, sd->combo_count, x, sd->combos[x].id == data->combos[i]->id ); /* no match, skip this combo */ if( x == sd->combo_count ) @@ -9380,9 +9368,9 @@ int pc_removecombo(struct map_session_data *sd, struct item_data *data ) { sd->combos[x].bonus = NULL; sd->combos[x].id = 0; - + retval++; - + for( j = 0, cursor = 0; j < sd->combo_count; j++ ) { if( sd->combos[j].bonus == NULL ) continue; @@ -9394,7 +9382,7 @@ int pc_removecombo(struct map_session_data *sd, struct item_data *data ) { cursor++; } - + /* it's empty, we can clear all the memory */ if( (sd->combo_count = cursor) == 0 ) { aFree(sd->combos); @@ -9402,7 +9390,7 @@ int pc_removecombo(struct map_session_data *sd, struct item_data *data ) { break; } } - + /* check if combo requirements still fit -- don't touch retval! */ pc->checkcombo( sd, data ); @@ -9568,7 +9556,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) sd->status.inventory[n].bound = (unsigned char)IBT_CHARACTER; clif->notify_bounditem(sd,n); } - + if(pos == EQP_ACC) { //Accesories should only go in one of the two, pos = req_pos&EQP_ACC; if (pos == EQP_ACC) //User specified both slots.. @@ -9639,7 +9627,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) status_calc_pc(sd,SCO_NONE); if (flag) //Update skill data clif->skillinfoblock(sd); - + //OnEquip script [Skotlex] if (id->equip_script) script->run_item_equip_script(sd, id, npc->fake_nd->bl.id); @@ -9906,7 +9894,7 @@ int pc_checkitem(struct map_session_data *sd) if ( !sd->status.cart[i].unique_id && !itemdb->isstackable(id) ) sd->status.cart[i].unique_id = itemdb->unique_id(sd); } - + for( i = 0; i < MAX_STORAGE; i++ ) { id = sd->status.storage.items[i].nameid; @@ -9923,7 +9911,7 @@ int pc_checkitem(struct map_session_data *sd) if ( !sd->status.storage.items[i].unique_id && !itemdb->isstackable(id) ) sd->status.storage.items[i].unique_id = itemdb->unique_id(sd); } - + if (sd->guild) { struct guild_storage *guild_storage = idb_get(gstorage->db,sd->guild->guild_id); if (guild_storage) { @@ -10398,7 +10386,7 @@ bool pc_can_use_command(struct map_session_data *sd, const char *command) { /** * Spirit Charm expiration timer. - * + * * @see TimerFunc */ int pc_charm_timer(int tid, int64 tick, int id, intptr_t data) @@ -10436,7 +10424,7 @@ int pc_charm_timer(int tid, int64 tick, int id, intptr_t data) /** * Adds a spirit charm. - * + * * @param sd Target character. * @param interval Duration. * @param max Maximum amount of charms to add. @@ -10479,7 +10467,7 @@ void pc_add_charm(struct map_session_data *sd, int interval, int max, int type) /** * Removes one or more spirit charms. - * + * * @param sd The target character. * @param count Amount of charms to remove. * @param type Type of charm to remove. @@ -10621,32 +10609,32 @@ void pc_read_skill_tree(void) { int i = 0; struct s_mapiterator *iter; struct map_session_data *sd; - + if (libconfig->read_file(&skill_tree_conf, config_filename)) { ShowError("can't read %s\n", config_filename); return; } - + while ((skt = libconfig->setting_get_elem(skill_tree_conf.root,i++))) { int k; const char *name = config_setting_name(skt); - + if ( (k = pc->check_job_name(name)) == -1 ) { ShowWarning("pc_read_skill_tree: '%s' unknown job name!\n", name); continue; } - + if( ( skills = libconfig->setting_get_member(skt,"skills") ) ) { int c = 0; int idx = pc->class2idx(k); - + while ((sk = libconfig->setting_get_elem(skills,c++))) { const char *sk_name = config_setting_name(sk); int skill_id; - + if( ( skill_id = skill->name2id(sk_name) ) ) { int skidx, offset = 0, h = 0, rlen = 0; - + ARR_FIND( 0, MAX_SKILL_TREE, skidx, pc->skill_tree[idx][skidx].id == 0 || pc->skill_tree[idx][skidx].id == skill_id ); if (skidx == MAX_SKILL_TREE) { ShowWarning("pc_read_skill_tree: Unable to load skill %d (%s) into '%s's tree. Maximum number of skills per class has been reached.\n", skill_id, sk_name, name); @@ -10654,10 +10642,10 @@ void pc_read_skill_tree(void) { } else if (pc->skill_tree[idx][skidx].id) { ShowNotice("pc_read_skill_tree: Overwriting %d for '%s' (%d)\n", skill_id, name, k); } - + pc->skill_tree[idx][skidx].id = skill_id; pc->skill_tree[idx][skidx].idx = skill->get_index(skill_id); - + if( config_setting_is_group(sk) ) { int max = 0, jlevel = 0; libconfig->setting_lookup_int(sk, "MaxLevel", &max); @@ -10670,11 +10658,11 @@ void pc_read_skill_tree(void) { pc->skill_tree[idx][skidx].max = (unsigned char)libconfig->setting_get_int(sk); pc->skill_tree[idx][skidx].joblv = 0; } - + for (h = offset; h < rlen && h < MAX_PC_SKILL_REQUIRE; h++) { config_setting_t *rsk = libconfig->setting_get_elem(sk,h); int rskid; - if (rsk && ( rskid = skill->name2id(config_setting_name(rsk)))) { + if (rsk && (rskid = skill->name2id(config_setting_name(rsk))) != 0) { pc->skill_tree[idx][skidx].need[h].id = rskid; pc->skill_tree[idx][skidx].need[h].idx = skill->get_index(rskid); pc->skill_tree[idx][skidx].need[h].lv = (unsigned char)libconfig->setting_get_int(rsk); @@ -10684,19 +10672,18 @@ void pc_read_skill_tree(void) { ShowWarning("pc_read_skill_tree: error for '%s' in '%s'\n",sk_name,name); } } - } else { ShowWarning("pc_read_skill_tree: unknown skill '%s' in '%s'\n",sk_name,name); } } } } - + i = 0; while( (skt = libconfig->setting_get_elem(skill_tree_conf.root,i++)) ) { int k, idx; const char *name = config_setting_name(skt); - + if ( (k = pc->check_job_name(name)) == -1 ) { ShowWarning("pc_read_skill_tree: '%s' unknown job name!\n", name); continue; @@ -10734,9 +10721,8 @@ void pc_read_skill_tree(void) { } } - } - + libconfig->destroy(&skill_tree_conf); /* lets update all players skill tree */ @@ -11023,7 +11009,7 @@ void pc_itemcd_do(struct map_session_data *sd, bool load) { void pc_bank_deposit(struct map_session_data *sd, int money) { unsigned int limit_check = money+sd->status.bank_vault; - + if( money <= 0 || limit_check > MAX_BANK_ZENY ) { clif->bank_deposit(sd,BDA_OVERFLOW); return; @@ -11043,7 +11029,7 @@ void pc_bank_deposit(struct map_session_data *sd, int money) { } void pc_bank_withdraw(struct map_session_data *sd, int money) { unsigned int limit_check = money+sd->status.zeny; - + if (money <= 0) { clif->bank_withdraw(sd,BWA_UNKNOWN_ERROR); return; @@ -11055,7 +11041,7 @@ void pc_bank_withdraw(struct map_session_data *sd, int money) { clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,1482)); return; } - + if( pc->getzeny(sd,money, LOG_TYPE_BANK, NULL) ) clif->bank_withdraw(sd,BWA_NO_MONEY); else { @@ -11069,16 +11055,16 @@ void pc_bank_withdraw(struct map_session_data *sd, int money) { void pc_scdata_received(struct map_session_data *sd) { pc->inventory_rentals(sd); clif->show_modifiers(sd); - + if (sd->expiration_time != 0) { // don't display if it's unlimited or unknow value time_t exp_time = sd->expiration_time; char tmpstr[1024]; strftime(tmpstr, sizeof(tmpstr) - 1, msg_sd(sd,501), localtime(&exp_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S." clif->wis_message(sd->fd, map->wisp_server_name, tmpstr, strlen(tmpstr)+1); - + pc->expire_check(sd); } - + if( sd->state.standalone ) { clif->pLoadEndAck(0,sd); pc->autotrade_populate(sd); @@ -11087,16 +11073,16 @@ void pc_scdata_received(struct map_session_data *sd) { } int pc_expiration_timer(int tid, int64 tick, int id, intptr_t data) { struct map_session_data *sd = map->id2sd(id); - + if( !sd ) return 0; - + sd->expiration_tid = INVALID_TIMER; - + if( sd->fd ) clif->authfail_fd(sd->fd,10); - + map->quit(sd); - + return 0; } /* This timer exists only when a character with an expire timer > 24h is online */ @@ -11106,30 +11092,26 @@ int pc_global_expiration_timer(int tid, int64 tick, int id, intptr_t data) { struct map_session_data* sd; iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) { if( sd->expiration_time ) pc->expire_check(sd); } - mapit->free(iter); - + return 0; } void pc_expire_check(struct map_session_data *sd) { /* ongoing timer */ if( sd->expiration_tid != INVALID_TIMER ) return; - + /* not within the next 24h, enable the global check */ if( sd->expiration_time > ( time(NULL) + ( ( 60 * 60 ) * 24 ) ) ) { - /* global check not running, enable */ if( pc->expiration_tid == INVALID_TIMER ) { /* starts in 1h, repeats every hour */ pc->expiration_tid = timer->add_interval(timer->gettick() + ((1000*60)*60), pc->global_expiration_timer, 0, 0, ((1000*60)*60)); } - return; } @@ -11141,33 +11123,31 @@ void pc_expire_check(struct map_session_data *sd) { void pc_autotrade_load(void) { char *data; - + if (SQL_ERROR == SQL->Query(map->mysql_handle, "SELECT `account_id`,`char_id`,`sex`,`title` FROM `%s`",map->autotrade_merchants_db)) Sql_ShowDebug(map->mysql_handle); - + while (SQL_SUCCESS == SQL->NextRow(map->mysql_handle)) { struct map_session_data *sd; int account_id, char_id; char title[MESSAGE_SIZE]; unsigned char sex; - + SQL->GetData(map->mysql_handle, 0, &data, NULL); account_id = atoi(data); SQL->GetData(map->mysql_handle, 1, &data, NULL); char_id = atoi(data); SQL->GetData(map->mysql_handle, 2, &data, NULL); sex = atoi(data); SQL->GetData(map->mysql_handle, 3, &data, NULL); safestrncpy(title, data, sizeof(title)); CREATE(sd, TBL_PC, 1); - + pc->setnewpc(sd, account_id, char_id, 0, 0, sex, 0); - + safestrncpy(sd->message, title, MESSAGE_SIZE); - sd->state.standalone = 1; sd->group = pcg->get_dummy_group(); - + chrif->authreq(sd,true); } - SQL->FreeResult(map->mysql_handle); } /** @@ -11183,17 +11163,16 @@ void pc_autotrade_start(struct map_session_data *sd) { while( SQL_SUCCESS == SQL->NextRow(map->mysql_handle) ) { int itemkey, amount, price; - + SQL->GetData(map->mysql_handle, 0, &data, NULL); itemkey = atoi(data); SQL->GetData(map->mysql_handle, 1, &data, NULL); amount = atoi(data); SQL->GetData(map->mysql_handle, 2, &data, NULL); price = atoi(data); ARR_FIND(0, MAX_CART, i, sd->status.cart[i].id == itemkey); - if( i != MAX_CART && itemdb_cantrade(&sd->status.cart[i], 0, 0) ) { if( amount > sd->status.cart[i].amount ) amount = sd->status.cart[i].amount; - + if( amount ) { sd->vending[count].index = i; sd->vending[count].amount = amount; @@ -11203,7 +11182,7 @@ void pc_autotrade_start(struct map_session_data *sd) { } } } - + if( !count ) { pc->autotrade_update(sd,PAUC_REMOVE); map->quit(sd); @@ -11222,13 +11201,13 @@ void pc_autotrade_start(struct map_session_data *sd) { **/ void pc_autotrade_update(struct map_session_data *sd, enum e_pc_autotrade_update_action action) { int i; - + /* either way, this goes down */ if( action != PAUC_START ) { if (SQL_ERROR == SQL->Query(map->mysql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d'",map->autotrade_data_db,sd->status.char_id)) Sql_ShowDebug(map->mysql_handle); } - + switch( action ) { case PAUC_REMOVE: if (SQL_ERROR == SQL->Query(map->mysql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d' LIMIT 1",map->autotrade_merchants_db,sd->status.char_id)) @@ -11236,7 +11215,7 @@ void pc_autotrade_update(struct map_session_data *sd, enum e_pc_autotrade_update break; case PAUC_START: { char title[MESSAGE_SIZE*2+1]; - + SQL->EscapeStringLen(map->mysql_handle, title, sd->message, strnlen(sd->message, MESSAGE_SIZE)); if (SQL_ERROR == SQL->Query(map->mysql_handle, "INSERT INTO `%s` (`account_id`,`char_id`,`sex`,`title`) VALUES ('%d','%d','%d','%s')", @@ -11253,7 +11232,7 @@ void pc_autotrade_update(struct map_session_data *sd, enum e_pc_autotrade_update for( i = 0; i < sd->vend_num; i++ ) { if( sd->vending[i].amount == 0 ) continue; - + if (SQL_ERROR == SQL->Query(map->mysql_handle, "INSERT INTO `%s` (`char_id`,`itemkey`,`amount`,`price`) VALUES ('%d','%d','%d','%d')", map->autotrade_data_db, sd->status.char_id, @@ -11277,25 +11256,25 @@ void pc_autotrade_prepare(struct map_session_data *sd) { unsigned char sex; CREATE(data, struct autotrade_vending, 1); - + memcpy(data->vending, sd->vending, sizeof(sd->vending)); - + for(i = 0; i < sd->vend_num; i++) { if( sd->vending[i].amount ) { memcpy(&data->list[cursor],&sd->status.cart[sd->vending[i].index],sizeof(struct item)); cursor++; } } - + data->vend_num = (unsigned char)cursor; - + idb_put(pc->at_db, sd->status.char_id, data); - + account_id = sd->status.account_id; char_id = sd->status.char_id; sex = sd->status.sex; safestrncpy(title, sd->message, sizeof(title)); - + sd->npc_id = 0; sd->npc_shopid = 0; if (sd->st) { @@ -11306,11 +11285,10 @@ void pc_autotrade_prepare(struct map_session_data *sd) { chrif->auth_delete(account_id, char_id, ST_LOGOUT); CREATE(sd, TBL_PC, 1); - + pc->setnewpc(sd, account_id, char_id, 0, 0, sex, 0); - + safestrncpy(sd->message, title, MESSAGE_SIZE); - sd->state.standalone = 1; sd->group = pcg->get_dummy_group(); @@ -11329,7 +11307,7 @@ void pc_autotrade_populate(struct map_session_data *sd) { for(i = 0; i < data->vend_num; i++) { if( !data->vending[i].amount ) continue; - + for(j = 0; j < MAX_CART; j++) { if( !memcmp((char*)(&data->list[i]) + sizeof(data->list[0].id), (char*)(&sd->status.cart[j]) + sizeof(data->list[0].id), sizeof(struct item) - sizeof(data->list[0].id)) ) { if( cursor ) { @@ -11340,23 +11318,50 @@ void pc_autotrade_populate(struct map_session_data *sd) { break; } } - + if( j != MAX_CART ) { sd->vending[cursor].index = j; sd->vending[cursor].amount = data->vending[i].amount; sd->vending[cursor].value = data->vending[i].value; - + cursor++; } } - + sd->vend_num = cursor; pc->autotrade_update(sd,PAUC_START); - + + for(i = 0; i < data->hdatac; i++ ) { + if( data->hdata[i]->flag.free ) { + aFree(data->hdata[i]->data); + } + aFree(data->hdata[i]); + } + if( data->hdata ) + aFree(data->hdata); + idb_remove(pc->at_db, sd->status.char_id); } +/** + * @see DBApply + */ +int pc_autotrade_final(DBKey key, DBData *data, va_list ap) { + struct autotrade_vending* at_v = DB->data2ptr(data); + int i; + for(i = 0; i < at_v->hdatac; i++ ) { + if( at_v->hdata[i]->flag.free ) { + aFree(at_v->hdata[i]->data); + } + aFree(at_v->hdata[i]); + } + if( at_v->hdata ) + aFree(at_v->hdata); + + return 0; +} + //Checks if the given class value corresponds to a player class. [Skotlex] //JOB_NOVICE isn't checked for class_ is supposed to be unsigned bool pc_db_checkid(unsigned int class_) @@ -11371,12 +11376,11 @@ bool pc_db_checkid(unsigned int class_) } void do_final_pc(void) { - db_destroy(pc->itemcd_db); - db_destroy(pc->at_db); - + pc->at_db->destroy(pc->at_db,pc->autotrade_final); + pcg->final(); - + ers_destroy(pc->sc_display_ers); ers_destroy(pc->num_reg_ers); ers_destroy(pc->str_reg_ers); @@ -11387,12 +11391,12 @@ void do_final_pc(void) { void do_init_pc(bool minimal) { if (minimal) return; - + pc->itemcd_db = idb_alloc(DB_OPT_RELEASE_DATA); pc->at_db = idb_alloc(DB_OPT_RELEASE_DATA); - + pc->readdb(); - + timer->add_func_list(pc->invincible_timer, "pc_invincible_timer"); timer->add_func_list(pc->eventtimer, "pc_eventtimer"); timer->add_func_list(pc->inventory_rental_end, "pc_inventory_rental_end"); @@ -11404,25 +11408,25 @@ void do_init_pc(bool minimal) { timer->add_func_list(pc->charm_timer, "pc_charm_timer"); timer->add_func_list(pc->global_expiration_timer,"pc_global_expiration_timer"); timer->add_func_list(pc->expiration_timer,"pc_expiration_timer"); - + timer->add(timer->gettick() + map->autosave_interval, pc->autosave, 0, 0); - + // 0=day, 1=night [Yor] map->night_flag = battle_config.night_at_start ? 1 : 0; - + if (battle_config.day_duration > 0 && battle_config.night_duration > 0) { int day_duration = battle_config.day_duration; int night_duration = battle_config.night_duration; // add night/day timer [Yor] timer->add_func_list(pc->map_day_timer, "pc_map_day_timer"); timer->add_func_list(pc->map_night_timer, "pc_map_night_timer"); - + pc->day_timer_tid = timer->add_interval(timer->gettick() + (map->night_flag ? 0 : day_duration) + night_duration, pc->map_day_timer, 0, 0, day_duration + night_duration); pc->night_timer_tid = timer->add_interval(timer->gettick() + day_duration + (map->night_flag ? night_duration : 0), pc->map_night_timer, 0, 0, day_duration + night_duration); } - + pcg->init(); - + pc->sc_display_ers = ers_new(sizeof(struct sc_display_entry), "pc.c:sc_display_ers", ERS_OPT_FLEX_CHUNK); pc->num_reg_ers = ers_new(sizeof(struct script_reg_num), "pc.c::num_reg_ers", ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK); pc->str_reg_ers = ers_new(sizeof(struct script_reg_str), "pc.c::str_reg_ers", ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK); @@ -11475,7 +11479,7 @@ void pc_defaults(void) { pc->get_dummy_sd = pc_get_dummy_sd; pc->class2idx = pc_class2idx; - + pc->can_use_command = pc_can_use_command; pc->set_group = pc_set_group; pc->should_log_commands = pc_should_log_commands; @@ -11487,25 +11491,25 @@ void pc_defaults(void) { pc->authok = pc_authok; pc->authfail = pc_authfail; pc->reg_received = pc_reg_received; - + pc->isequip = pc_isequip; pc->equippoint = pc_equippoint; pc->setinventorydata = pc_setinventorydata; - + pc->checkskill = pc_checkskill; pc->checkskill2 = pc_checkskill2; pc->checkallowskill = pc_checkallowskill; pc->checkequip = pc_checkequip; - + pc->calc_skilltree = pc_calc_skilltree; pc->calc_skilltree_normalize_job = pc_calc_skilltree_normalize_job; pc->clean_skilltree = pc_clean_skilltree; - + pc->setpos = pc_setpos; pc->setsavepoint = pc_setsavepoint; pc->randomwarp = pc_randomwarp; pc->memo = pc_memo; - + pc->checkadditem = pc_checkadditem; pc->inventoryblank = pc_inventoryblank; pc->search_inventory = pc_search_inventory; @@ -11516,47 +11520,47 @@ void pc_defaults(void) { // Special Shop System pc->paycash = pc_paycash; pc->getcash = pc_getcash; - + pc->cart_additem = pc_cart_additem; pc->cart_delitem = pc_cart_delitem; pc->putitemtocart = pc_putitemtocart; pc->getitemfromcart = pc_getitemfromcart; pc->cartitem_amount = pc_cartitem_amount; - + pc->takeitem = pc_takeitem; pc->dropitem = pc_dropitem; - + pc->isequipped = pc_isequipped; pc->can_Adopt = pc_can_Adopt; pc->adoption = pc_adoption; - + pc->updateweightstatus = pc_updateweightstatus; - + pc->addautobonus = pc_addautobonus; pc->exeautobonus = pc_exeautobonus; pc->endautobonus = pc_endautobonus; pc->delautobonus = pc_delautobonus; - + pc->bonus = pc_bonus; pc->bonus2 = pc_bonus2; pc->bonus3 = pc_bonus3; pc->bonus4 = pc_bonus4; pc->bonus5 = pc_bonus5; pc->skill = pc_skill; - + pc->insert_card = pc_insert_card; pc->can_insert_card = pc_can_insert_card; pc->can_insert_card_into = pc_can_insert_card_into; pc->steal_item = pc_steal_item; pc->steal_coin = pc_steal_coin; - + pc->modifybuyvalue = pc_modifybuyvalue; pc->modifysellvalue = pc_modifysellvalue; - + pc->follow = pc_follow; // [MouseJstr] pc->stop_following = pc_stop_following; - + pc->maxbaselv = pc_maxbaselv; pc->maxjoblv = pc_maxjoblv; pc->checkbaselevelup = pc_checkbaselevelup; @@ -11584,11 +11588,11 @@ void pc_defaults(void) { pc->unequipitem_pos = pc_unequipitem_pos; pc->checkitem = pc_checkitem; pc->useitem = pc_useitem; - + pc->skillatk_bonus = pc_skillatk_bonus; pc->skillheal_bonus = pc_skillheal_bonus; pc->skillheal2_bonus = pc_skillheal2_bonus; - + pc->damage = pc_damage; pc->dead = pc_dead; pc->revive = pc_revive; @@ -11605,7 +11609,7 @@ void pc_defaults(void) { pc->setridingwug = pc_setridingwug; pc->changelook = pc_changelook; pc->equiplookall = pc_equiplookall; - + pc->readparam = pc_readparam; pc->setparam = pc_setparam; pc->readreg = pc_readreg; @@ -11616,15 +11620,15 @@ void pc_defaults(void) { pc->setregistry = pc_setregistry; pc->readregistry_str = pc_readregistry_str; pc->setregistry_str = pc_setregistry_str; - + pc->addeventtimer = pc_addeventtimer; pc->deleventtimer = pc_deleventtimer; pc->cleareventtimer = pc_cleareventtimer; pc->addeventtimercount = pc_addeventtimercount; - + pc->calc_pvprank = pc_calc_pvprank; pc->calc_pvprank_timer = pc_calc_pvprank_timer; - + pc->ismarried = pc_ismarried; pc->marriage = pc_marriage; pc->divorce = pc_divorce; @@ -11632,30 +11636,30 @@ void pc_defaults(void) { pc->get_father = pc_get_father; pc->get_mother = pc_get_mother; pc->get_child = pc_get_child; - + pc->bleeding = pc_bleeding; pc->regen = pc_regen; - + pc->setstand = pc_setstand; pc->candrop = pc_candrop; pc->can_talk = pc_can_talk; pc->can_attack = pc_can_attack; - + pc->jobid2mapid = pc_jobid2mapid; // Skotlex pc->mapid2jobid = pc_mapid2jobid; // Skotlex - + pc->job_name = job_name; - + pc->setinvincibletimer = pc_setinvincibletimer; pc->delinvincibletimer = pc_delinvincibletimer; - + pc->addspiritball = pc_addspiritball; pc->delspiritball = pc_delspiritball; pc->addfame = pc_addfame; pc->famerank = pc_famerank; pc->set_hate_mob = pc_set_hate_mob; pc->getmaxspiritball = pc_getmaxspiritball; - + pc->readdb = pc_readdb; pc->map_day_timer = map_day_timer; // by [yor] pc->map_night_timer = map_night_timer; // by [yor] @@ -11663,26 +11667,24 @@ void pc_defaults(void) { pc->inventory_rentals = pc_inventory_rentals; pc->inventory_rental_clear = pc_inventory_rental_clear; pc->inventory_rental_add = pc_inventory_rental_add; - + pc->disguise = pc_disguise; pc->isautolooting = pc_isautolooting; - + pc->overheat = pc_overheat; - pc->banding = pc_banding; - + pc->itemcd_do = pc_itemcd_do; - pc->load_combo = pc_load_combo; - + pc->add_charm = pc_add_charm; pc->del_charm = pc_del_charm; - + pc->baselevelchanged = pc_baselevelchanged; pc->level_penalty_mod = pc_level_penalty_mod; - + pc->calc_skillpoint = pc_calc_skillpoint; - + pc->invincible_timer = pc_invincible_timer; pc->spiritball_timer = pc_spiritball_timer; pc->check_banding = pc_check_banding; @@ -11710,15 +11712,15 @@ void pc_defaults(void) { pc->checkcombo = pc_checkcombo; pc->calcweapontype = pc_calcweapontype; pc->removecombo = pc_removecombo; - + pc->bank_withdraw = pc_bank_withdraw; pc->bank_deposit = pc_bank_deposit; - + pc->rental_expire = pc_rental_expire; pc->scdata_received = pc_scdata_received; - + pc->bound_clear = pc_bound_clear; - + pc->expiration_timer = pc_expiration_timer; pc->global_expiration_timer = pc_global_expiration_timer; pc->expire_check = pc_expire_check; @@ -11733,6 +11735,7 @@ void pc_defaults(void) { pc->autotrade_start = pc_autotrade_start; pc->autotrade_prepare = pc_autotrade_prepare; pc->autotrade_populate = pc_autotrade_populate; + pc->autotrade_final = pc_autotrade_final; pc->check_job_name = pc_check_job_name; } diff --git a/src/map/pc.h b/src/map/pc.h index 85bbd2016..e6e95978d 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -569,7 +569,7 @@ END_ZEROED_BLOCK; } roulette; uint8 lang_id; - + // temporary debugging of bug #3504 const char* delunit_prevfile; int delunit_prevline; @@ -757,6 +757,9 @@ struct autotrade_vending { struct item list[MAX_VENDING]; struct s_vending vending[MAX_VENDING]; unsigned char vend_num; + /* HPM Custom Struct */ + struct HPluginData **hdata; + unsigned int hdatac; }; /*===================================== @@ -1066,6 +1069,7 @@ END_ZEROED_BLOCK; /* End */ void (*autotrade_start) (struct map_session_data *sd); void (*autotrade_prepare) (struct map_session_data *sd); void (*autotrade_populate) (struct map_session_data *sd); + int (*autotrade_final) (DBKey key, DBData *data, va_list ap); int (*check_job_name) (const char *name); }; diff --git a/src/map/pc_groups.c b/src/map/pc_groups.c index 28bef6a85..7efcd7e26 100644 --- a/src/map/pc_groups.c +++ b/src/map/pc_groups.c @@ -51,7 +51,7 @@ static void read_config(void) { config_setting_t *groups = NULL; const char *config_filename = "conf/groups.conf"; // FIXME hardcoded name int group_count = 0; - + if (libconfig->read_file(&pc_group_config, config_filename)) return; @@ -125,11 +125,10 @@ static void read_config(void) { strdb_put(pcg->name_db, groupname, group_settings); idb_put(pcg->db, id, group_settings); - } group_count = libconfig->setting_length(groups); // Save number of groups assert(group_count == db_size(pcg->db)); - + // Check if all commands and permissions exist iter = db_iterator(pcg->db); for (group_settings = dbi_first(iter); dbi_exists(iter); group_settings = dbi_next(iter)) { @@ -182,7 +181,7 @@ static void read_config(void) { *commands = group_settings->commands, *permissions = group_settings->permissions; int j, inherit_count = 0, done = 0; - + if (group_settings->inheritance_done) // group already processed continue; @@ -192,7 +191,7 @@ static void read_config(void) { group_settings->inheritance_done = true; continue; } - + for (j = 0; j < inherit_count; ++j) { GroupSettings *inherited_group = NULL; const char *groupname = libconfig->setting_get_string_elem(inherit, j); @@ -225,7 +224,7 @@ static void read_config(void) { ++done; // copied commands and permissions from one of inherited groups } - + if (done == inherit_count) { // copied commands from all of inherited groups ++i; group_settings->inheritance_done = true; // we're done with this group @@ -239,7 +238,7 @@ static void read_config(void) { break; } } // while(i < group_count) - + // Pack permissions into GroupSettings.e_permissions for faster checking iter = db_iterator(pcg->db); for (group_settings = dbi_first(iter); dbi_exists(iter); group_settings = dbi_next(iter)) { @@ -365,28 +364,28 @@ int pc_group_get_idx(GroupSettings *group) unsigned int pc_groups_add_permission(const char *name) { uint64 key = 0x1; unsigned char i; - + for(i = 0; i < pcg->permission_count; i++) { if( strcmpi(name,pcg->permissions[i].name) == 0 ) { ShowError("pc_groups_add_permission(%s): failed! duplicate permission name!\n",name); return 0; } } - + if( i != 0 ) key = (uint64)pcg->permissions[i - 1].permission << 1; - + if( key >= UINT_MAX ) { ShowError("pc_groups_add_permission(%s): failed! not enough room, too many permissions!\n",name); return 0; } - + i = pcg->permission_count; RECREATE(pcg->permissions, struct pc_groups_permission_table, ++pcg->permission_count); - + pcg->permissions[i].name = aStrdup(name); pcg->permissions[i].permission = (unsigned int)key; - + return (unsigned int)key; } /** @@ -427,23 +426,23 @@ void do_init_pc_groups(void) { { "disable_skill_usage", PC_PERM_DISABLE_SKILL_USAGE }, }; unsigned char i, len = ARRAYLENGTH(pc_g_defaults); - + for(i = 0; i < len; i++) { unsigned int p; if( ( p = pc_groups_add_permission(pc_g_defaults[i].name) ) != pc_g_defaults[i].permission ) ShowError("do_init_pc_groups: %s error : %d != %d\n",pc_g_defaults[i].name,p,pc_g_defaults[i].permission); } - + /** * Handle plugin-provided permissions **/ for(i = 0; i < pcg->HPMpermissions_count; i++) { *pcg->HPMpermissions[i].mask = pc_groups_add_permission(pcg->HPMpermissions[i].name); } - + pcg->db = idb_alloc(DB_OPT_RELEASE_DATA); pcg->name_db = stridb_alloc(DB_OPT_DUP_KEY, 0); - + read_config(); } @@ -468,7 +467,7 @@ void do_final_pc_groups(void) pcg->db->destroy(pcg->db, group_db_clear_sub); if (pcg->name_db != NULL) db_destroy(pcg->name_db); - + if(pcg->permissions != NULL) { unsigned char i; for(i = 0; i < pcg->permission_count; i++) @@ -490,7 +489,7 @@ void pc_groups_reload(void) { pcg->final(); pcg->init(); - + /* refresh online users permissions */ iter = mapit_getallusers(); for (sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter)) { @@ -508,7 +507,6 @@ void pc_groups_reload(void) { **/ void pc_groups_defaults(void) { pcg = &pcg_s; - /* */ pcg->db = NULL; pcg->name_db = NULL; diff --git a/src/map/pet.c b/src/map/pet.c index 1ac6d117a..2865cc901 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -4,6 +4,7 @@ #define HERCULES_CORE +#include "config/core.h" // DBPATH #include "pet.h" #include "map/atcommand.h" // msg_txt() @@ -106,7 +107,7 @@ int pet_attackskill(struct pet_data *pd, int target_id) { if (DIFF_TICK(pd->ud.canact_tick, timer->gettick()) > 0) return 0; - + if (rnd()%100 < (pd->a_skill->rate +pd->pet.intimate*pd->a_skill->bonusrate/1000)) { //Skotlex: Use pet's skill int inf; @@ -132,7 +133,7 @@ int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type) int rate; pd = sd->pd; - + Assert_ret(pd->msd == 0 || pd->msd->pd == pd); if( bl == NULL || bl->type != BL_MOB || bl->prev == NULL @@ -185,7 +186,7 @@ int pet_sc_check(struct map_session_data *sd, int type) return 1; pd->recovery->timer = timer->add(timer->gettick()+pd->recovery->delay*1000,pet->recovery_timer,sd->bl.id,0); - + return 0; } @@ -210,7 +211,7 @@ int pet_hungry(int tid, int64 tick, int id, intptr_t data) { if (pd->pet.intimate <= 0) return 1; //You lost the pet already, the rest is irrelevant. - + pd->pet.hungry--; if( pd->pet.hungry < 0 ) { @@ -302,7 +303,7 @@ int pet_return_egg(struct map_session_data *sd, struct pet_data *pd) tmp_item.card[3] = pd->pet.rename_flag; if((flag = pc->additem(sd,&tmp_item,1,LOG_TYPE_OTHER))) { clif->additem(sd,0,0,flag); - map->addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } pd->pet.incubate = 1; unit->free(&pd->bl,CLR_OUTSIGHT); @@ -336,7 +337,7 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *petinfo) //The pet_id value was lost? odd... restore it. sd->status.pet_id = petinfo->pet_id; } - + i = pet->search_petDB_index(petinfo->class_,PET_CLASS); if(i < 0) { sd->status.pet_id = 0; @@ -366,10 +367,10 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *petinfo) pd->last_thinktime = timer->gettick(); pd->state.skillbonus = 0; - + if( battle_config.pet_status_support ) script->run_pet(pet->db[i].pet_script,0,sd->bl.id,0); - + if( pd->petDB ) { if( pd->petDB->equip_script ) status_calc_pc(sd,SCO_NONE); @@ -379,7 +380,7 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *petinfo) else interval = pd->petDB->hungry_delay; } - + if( interval <= 0 ) interval = 1; pd->pet_hungry_timer = timer->add(timer->gettick() + interval, pet->hungry, sd->bl.id, 0); @@ -566,7 +567,7 @@ bool pet_get_egg(int account_id, short pet_class, int pet_id ) { // the first request. [Panikon] i = pet->search_petDB_index(pet_class,PET_CLASS); sd->catch_target_class = -1; - + if(i < 0) { intif->delete_petdata(pet_id); return false; @@ -581,7 +582,7 @@ bool pet_get_egg(int account_id, short pet_class, int pet_id ) { tmp_item.card[3] = 0; //New pets are not named. if((ret = pc->additem(sd,&tmp_item,1,LOG_TYPE_PICKDROP_PLAYER))) { clif->additem(sd,0,0,ret); - map->addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } return true; @@ -593,11 +594,11 @@ int pet_menu(struct map_session_data *sd,int menunum) nullpo_ret(sd); if (sd->pd == NULL) return 1; - + //You lost the pet already. if(!sd->status.pet_id || sd->pd->pet.intimate <= 0 || sd->pd->pet.incubate) return 1; - + egg_id = itemdb->exists(sd->pd->petDB->EggID); if (egg_id) { if ((egg_id->flag.trade_restriction&ITR_NODROP) && !pc->inventoryblank(sd)) { @@ -605,7 +606,7 @@ int pet_menu(struct map_session_data *sd,int menunum) return 1; } } - + switch(menunum) { case 0: clif->send_petstatus(sd); @@ -671,9 +672,9 @@ int pet_equipitem(struct map_session_data *sd,int index) { nullpo_retr(1, sd); pd = sd->pd; if (!pd) return 1; - + nameid = sd->status.inventory[index].nameid; - + if(pd->petDB->AcceID == 0 || nameid != pd->petDB->AcceID || pd->pet.equip != 0) { clif->equipitemack(sd,0,0,EIA_FAIL); return 1; @@ -712,7 +713,7 @@ int pet_unequipitem(struct map_session_data *sd, struct pet_data *pd) { tmp_item.identify = 1; if((flag = pc->additem(sd,&tmp_item,1,LOG_TYPE_OTHER))) { clif->additem(sd,0,0,flag); - map->addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } if( battle_config.pet_equip_required ) { // Skotlex: halt support timers if needed @@ -794,7 +795,7 @@ int pet_randomwalk(struct pet_data *pd, int64 tick) int r=rnd(); int x=pd->bl.x+r%(d*2+1)-d; int y=pd->bl.y+r/(d*2+1)%(d*2+1)-d; - if(map->getcell(pd->bl.m,x,y,CELL_CHKPASS) && unit->walktoxy(&pd->bl,x,y,0)) { + if(map->getcell (pd->bl.m, &pd->bl, x, y, CELL_CHKPASS) && unit->walktoxy(&pd->bl, x, y, 0)) { pd->move_fail_count=0; break; } @@ -842,7 +843,7 @@ int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, int64 tick pet->randomwalk(pd,tick); return 0; } - + if (!check_distance_bl(&sd->bl, &pd->bl, pd->db->range3)) { //Master too far, chase. if(pd->target_id) @@ -866,7 +867,7 @@ int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, int64 tick pd->status.speed = pd->petDB->speed; pd->ud.state.change_walk_target = pd->ud.state.speed_changed = 1; } - + if (pd->target_id) { target= map->id2bl(pd->target_id); if (!target || pd->bl.m != target->m || status->isdead(target) @@ -876,13 +877,13 @@ int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, int64 tick pet->unlocktarget(pd); } } - + if(!target && pd->loot && pd->msd && pc_has_permission(pd->msd, PC_PERM_TRADE) && pd->loot->count < pd->loot->max && DIFF_TICK(tick,pd->ud.canact_tick)>0) { //Use half the pet's range of sight. map->foreachinrange(pet->ai_sub_hard_lootsearch,&pd->bl, pd->db->range2/2, BL_ITEM,pd,&target); } - + if (!target) { //Just walk around. if (check_distance_bl(&sd->bl, &pd->bl, 3)) @@ -897,7 +898,7 @@ int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, int64 tick return 0; } - + if(pd->ud.target == target->id && (pd->ud.attacktimer != INVALID_TIMER || pd->ud.walktimer != INVALID_TIMER)) return 0; //Target already locked. @@ -961,7 +962,7 @@ int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap) if(sd_charid && sd_charid != pd->msd->status.char_id) return 0; - + if(unit->can_reach_bl(&pd->bl,bl, pd->db->range2, 1, NULL, NULL) && ((*target) == NULL || //New target closer than previous one. !check_distance_bl(&pd->bl, *target, distance_bl(&pd->bl, bl)))) @@ -981,9 +982,9 @@ int pet_delay_item_drop(int tid, int64 tick, int id, intptr_t data) { ditem = list->item; while (ditem) { struct item_drop *ditem_prev; - map->addflooritem(&ditem->item_data,ditem->item_data.amount, - list->m,list->x,list->y, - list->first_charid,list->second_charid,list->third_charid,0); + map->addflooritem(NULL, &ditem->item_data, ditem->item_data.amount, + list->m, list->x, list->y, + list->first_charid, list->second_charid, list->third_charid, 0); ditem_prev = ditem; ditem = ditem->next; ers_free(pet->item_drop_ers, ditem_prev); @@ -1046,18 +1047,18 @@ int pet_skill_bonus_timer(int tid, int64 tick, int id, intptr_t data) { struct pet_data *pd; int bonus; int duration = 0; - + if(sd == NULL || sd->pd==NULL || sd->pd->bonus == NULL) return 1; - + pd=sd->pd; - + if(pd->bonus->timer != tid) { ShowError("pet_skill_bonus_timer %d != %d\n",pd->bonus->timer,tid); pd->bonus->timer = INVALID_TIMER; return 0; } - + // determine the time for the next timer if (pd->state.skillbonus && pd->bonus->delay > 0) { bonus = 0; @@ -1069,7 +1070,7 @@ int pet_skill_bonus_timer(int tid, int64 tick, int id, intptr_t data) { pd->bonus->timer = INVALID_TIMER; return 0; } - + if (pd->state.skillbonus != bonus) { pd->state.skillbonus = bonus; status_calc_pc(sd, SCO_NONE); @@ -1085,10 +1086,10 @@ int pet_skill_bonus_timer(int tid, int64 tick, int id, intptr_t data) { int pet_recovery_timer(int tid, int64 tick, int id, intptr_t data) { struct map_session_data *sd=map->id2sd(id); struct pet_data *pd; - + if(sd==NULL || sd->pd == NULL || sd->pd->recovery == NULL) return 1; - + pd=sd->pd; if(pd->recovery->timer != tid) { @@ -1105,7 +1106,7 @@ int pet_recovery_timer(int tid, int64 tick, int id, intptr_t data) { } pd->recovery->timer = INVALID_TIMER; - + return 0; } @@ -1119,14 +1120,14 @@ int pet_skill_support_timer(int tid, int64 tick, int id, intptr_t data) { short rate = 100; if(sd==NULL || sd->pd == NULL || sd->pd->s_skill == NULL) return 1; - + pd=sd->pd; - + if(pd->s_skill->timer != tid) { ShowError("pet_skill_support_timer %d != %d\n",pd->s_skill->timer,tid); return 0; } - + st = status->get_status_data(&sd->bl); if (DIFF_TICK(pd->ud.canact_tick, tick) > 0) { @@ -1134,7 +1135,7 @@ int pet_skill_support_timer(int tid, int64 tick, int id, intptr_t data) { pd->s_skill->timer=timer->add(pd->ud.canact_tick,pet->skill_support_timer,sd->bl.id,0); return 0; } - + if(pc_isdead(sd) || (rate = get_percentage(st->sp, st->max_sp)) > pd->s_skill->sp || (rate = get_percentage(st->hp, st->max_hp)) > pd->s_skill->hp || @@ -1143,7 +1144,7 @@ int pet_skill_support_timer(int tid, int64 tick, int id, intptr_t data) { pd->s_skill->timer=timer->add(tick+(rate>10?rate:10)*100,pet->skill_support_timer,sd->bl.id,0); return 0; } - + pet_stop_attack(pd); pet_stop_walking(pd, STOPWALKING_FLAG_FIXPOS); pd->s_skill->timer=timer->add(tick+pd->s_skill->delay*1000,pet->skill_support_timer,sd->bl.id,0); @@ -1154,26 +1155,24 @@ int pet_skill_support_timer(int tid, int64 tick, int id, intptr_t data) { return 0; } -/*========================================== - * Pet read db data - * pet->db.txt - * pet->db2.txt - *------------------------------------------*/ +/** + * Loads (or reloads) the pet database. + */ int read_petdb() { - char* filename[] = {"pet_db.txt","pet_db2.txt"}; - int nameid,i,j,k; + const char *filename[] = { + DBPATH"pet_db.txt", + "pet_db2.txt", + }; + int i,j; // Remove any previous scripts in case reloaddb was invoked. - for( j = 0; j < MAX_PET_DB; j++ ) - { - if( pet->db[j].pet_script ) - { + for (j = 0; j < MAX_PET_DB; j++) { + if (pet->db[j].pet_script) { script->free_code(pet->db[j].pet_script); pet->db[j].pet_script = NULL; } - if( pet->db[j].equip_script ) - { + if (pet->db[j].equip_script) { script->free_code(pet->db[j].equip_script); pet->db[j].equip_script = NULL; } @@ -1183,59 +1182,56 @@ int read_petdb() memset(pet->db,0,sizeof(pet->db)); j = 0; // entry counter - for( i = 0; i < ARRAYLENGTH(filename); i++ ) { + for (i = 0; i < ARRAYLENGTH(filename); i++) { char line[1024]; int lines, entries; FILE *fp; sprintf(line, "%s/%s", map->db_path, filename[i]); fp=fopen(line,"r"); - if( fp == NULL ) { - if( i == 0 ) + if (fp == NULL) { + if (i == 0) ShowError("can't read %s\n",line); continue; } lines = entries = 0; - while( fgets(line, sizeof(line), fp) && j < MAX_PET_DB ) { + while (fgets(line, sizeof(line), fp) && j < MAX_PET_DB) { char *str[22], *p; + int nameid, k; lines++; - if(line[0] == '/' && line[1] == '/') + if (line[0] == '/' && line[1] == '/') continue; memset(str, 0, sizeof(str)); p = line; - while( ISSPACE(*p) ) + while (ISSPACE(*p)) ++p; - if( *p == '\0' ) + if (*p == '\0') continue; // empty line - for( k = 0; k < 20; ++k ) - { + for (k = 0; k < 20; ++k) { str[k] = p; p = strchr(p,','); - if( p == NULL ) + if (p == NULL) break; // comma not found *p = '\0'; ++p; } - if( p == NULL ) - { + if (p == NULL) { ShowError("read_petdb: Insufficient columns in line %d, skipping.\n", lines); continue; } // Pet Script - if( *p != '{' ) - { + if (*p != '{') { ShowError("read_petdb: Invalid format (Pet Script column) in line %d, skipping.\n", lines); continue; } str[20] = p; p = strstr(p+1,"},"); - if( p == NULL ) - { + if (p == NULL) { ShowError("read_petdb: Invalid format (Pet Script column) in line %d, skipping.\n", lines); continue; } @@ -1243,18 +1239,17 @@ int read_petdb() p += 2; // Equip Script - if( *p != '{' ) - { + if (*p != '{') { ShowError("read_petdb: Invalid format (Equip Script column) in line %d, skipping.\n", lines); continue; } str[21] = p; - if( (nameid = atoi(str[0])) <= 0 ) + nameid = atoi(str[0]); + if (nameid <= 0) continue; - if( !mob->db_checkid(nameid) ) - { + if (!mob->db_checkid(nameid)) { ShowWarning("pet_db reading: Invalid mob-class %d, pet not read.\n", nameid); continue; } @@ -1269,7 +1264,7 @@ int read_petdb() pet->db[j].fullness=atoi(str[7]); pet->db[j].hungry_delay=atoi(str[8])*1000; pet->db[j].r_hungry=atoi(str[9]); - if( pet->db[j].r_hungry <= 0 ) + if (pet->db[j].r_hungry <= 0) pet->db[j].r_hungry=1; pet->db[j].r_full=atoi(str[10]); pet->db[j].intimate=atoi(str[11]); @@ -1284,16 +1279,16 @@ int read_petdb() pet->db[j].pet_script = NULL; pet->db[j].equip_script = NULL; - if( *str[20] ) + if (*str[20]) pet->db[j].pet_script = script->parse(str[20], filename[i], lines, 0, NULL); - if( *str[21] ) + if (*str[21]) pet->db[j].equip_script = script->parse(str[21], filename[i], lines, 0, NULL); j++; entries++; } - if( j >= MAX_PET_DB ) + if (j >= MAX_PET_DB) ShowWarning("read_petdb: Reached max number of pets [%d]. Remaining pets were not read.\n ", MAX_PET_DB); fclose(fp); ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' pets in '"CL_WHITE"%s"CL_RESET"'.\n", entries, filename[i]); @@ -1312,7 +1307,7 @@ int do_init_pet(bool minimal) { pet->item_drop_ers = ers_new(sizeof(struct item_drop),"pet.c::item_drop_ers",ERS_OPT_NONE); pet->item_drop_list_ers = ers_new(sizeof(struct item_drop_list),"pet.c::item_drop_list_ers",ERS_OPT_NONE); - + timer->add_func_list(pet->hungry,"pet_hungry"); timer->add_func_list(pet->ai_hard,"pet_ai_hard"); timer->add_func_list(pet->skill_bonus_timer,"pet_skill_bonus_timer"); // [Valaris] @@ -1346,16 +1341,14 @@ int do_final_pet(void) } void pet_defaults(void) { pet = &pet_s; - + memset(pet->db,0,sizeof(pet->db)); pet->item_drop_ers = NULL; pet->item_drop_list_ers = NULL; - - /* */ + pet->init = do_init_pet; pet->final = do_final_pet; - - /* */ + pet->hungry_val = pet_hungry_val; pet->set_intimate = pet_set_intimate; pet->create_egg = pet_create_egg; diff --git a/src/map/quest.c b/src/map/quest.c index ddbd2f92d..fe4014ae5 100644 --- a/src/map/quest.c +++ b/src/map/quest.c @@ -529,6 +529,7 @@ int quest_read_db(void) count++; } + libconfig->destroy(&quest_db_conf); ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filename); return count; } diff --git a/src/map/script.c b/src/map/script.c index efce0b986..5dbe62df3 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -87,7 +87,6 @@ static inline void script_string_buf_addb(struct script_string_buf *buf,uint8 b) buf->size += 512; RECREATE(buf->ptr, char, buf->size); } - buf->ptr[buf->pos++] = b; } @@ -267,7 +266,6 @@ void script_reportdata(struct script_data* data) } } - /// Reports on the console information about the current built-in function. void script_reportfunc(struct script_state* st) { @@ -301,7 +299,6 @@ void script_reportfunc(struct script_state* st) } } - /*========================================== * Output error message *------------------------------------------*/ @@ -398,7 +395,6 @@ unsigned int calc_hash_ci(const char* p) { return h % SCRIPT_HASH_SIZE; } - /*========================================== * script->str_data manipulation functions *------------------------------------------*/ @@ -590,7 +586,6 @@ int script_add_str(const char* p) return script->str_num++; } - /// Appends 1 byte to the script buffer. void add_scriptb(int a) { @@ -807,19 +802,19 @@ const char* parse_callfunc(const char* p, int require_paren, int is_custom) else { //Nested function call script->syntax.nested_call++; nested_call = true; - + if( script->str_data[func].val == script->buildin_lang_macro_offset ) { script->syntax.lang_macro_active = true; macro = true; } } - + if( !macro ) { // buildin function script->addl(func); script->addc(C_ARG); } - + arg = script->buildin[script->str_data[func].val]; if (script->str_data[func].deprecated) DeprecationWarning(p); @@ -903,17 +898,17 @@ const char* parse_callfunc(const char* p, int require_paren, int is_custom) if( *p != ')' ) disp_error_message("parse_callfunc: expected ')' to close argument list",p); ++p; - + if( script->str_data[func].val == script->buildin_lang_macro_offset ) script->syntax.lang_macro_active = false; } - + if( nested_call ) script->syntax.nested_call--; - + if( !script->syntax.nested_call ) script->syntax.last_func = -1; - + if( !macro ) script->addc(C_FUNC); return p; @@ -978,8 +973,8 @@ const char* parse_variable(const char* p) const char *p2 = NULL; const char *var = p; - if( ( p[0] == '+' && p[1] == '+' && (type = C_ADD_PRE) ) // pre ++ - || ( p[0] == '-' && p[1] == '-' && (type = C_SUB_PRE) ) // pre -- + if( ( p[0] == '+' && p[1] == '+' && (type = C_ADD_PRE, true) ) // pre ++ + || ( p[0] == '-' && p[1] == '-' && (type = C_SUB_PRE, true) ) // pre -- ) { var = p = script->skip_space(&p[2]); } @@ -1008,19 +1003,19 @@ const char* parse_variable(const char* p) } if( type == C_NOP && - !( ( p[0] == '=' && p[1] != '=' && (type = C_EQ) ) // = - || ( p[0] == '+' && p[1] == '=' && (type = C_ADD) ) // += - || ( p[0] == '-' && p[1] == '=' && (type = C_SUB) ) // -= - || ( p[0] == '^' && p[1] == '=' && (type = C_XOR) ) // ^= - || ( p[0] == '|' && p[1] == '=' && (type = C_OR ) ) // |= - || ( p[0] == '&' && p[1] == '=' && (type = C_AND) ) // &= - || ( p[0] == '*' && p[1] == '=' && (type = C_MUL) ) // *= - || ( p[0] == '/' && p[1] == '=' && (type = C_DIV) ) // /= - || ( p[0] == '%' && p[1] == '=' && (type = C_MOD) ) // %= - || ( p[0] == '+' && p[1] == '+' && (type = C_ADD_POST) ) // post ++ - || ( p[0] == '-' && p[1] == '-' && (type = C_SUB_POST) ) // post -- - || ( p[0] == '<' && p[1] == '<' && p[2] == '=' && (type = C_L_SHIFT) ) // <<= - || ( p[0] == '>' && p[1] == '>' && p[2] == '=' && (type = C_R_SHIFT) ) // >>= + !( ( p[0] == '=' && p[1] != '=' && (type = C_EQ, true) ) // = + || ( p[0] == '+' && p[1] == '=' && (type = C_ADD, true) ) // += + || ( p[0] == '-' && p[1] == '=' && (type = C_SUB, true) ) // -= + || ( p[0] == '^' && p[1] == '=' && (type = C_XOR, true) ) // ^= + || ( p[0] == '|' && p[1] == '=' && (type = C_OR, true) ) // |= + || ( p[0] == '&' && p[1] == '=' && (type = C_AND, true) ) // &= + || ( p[0] == '*' && p[1] == '=' && (type = C_MUL, true) ) // *= + || ( p[0] == '/' && p[1] == '=' && (type = C_DIV, true) ) // /= + || ( p[0] == '%' && p[1] == '=' && (type = C_MOD, true) ) // %= + || ( p[0] == '+' && p[1] == '+' && (type = C_ADD_POST, true) ) // post ++ + || ( p[0] == '-' && p[1] == '-' && (type = C_SUB_POST, true) ) // post -- + || ( p[0] == '<' && p[1] == '<' && p[2] == '=' && (type = C_L_SHIFT, true) ) // <<= + || ( p[0] == '>' && p[1] == '>' && p[2] == '=' && (type = C_R_SHIFT, true) ) // >>= ) ) {// failed to find a matching operator combination so invalid return NULL; @@ -1149,15 +1144,15 @@ bool is_number(const char *p) { int script_string_dup(char *str) { size_t len = strlen(str); int pos = script->string_list_pos; - + while( pos+len+1 >= script->string_list_size ) { script->string_list_size += (1024*1024)/2; RECREATE(script->string_list,char,script->string_list_size); } - + safestrncpy(script->string_list+pos, str, len+1); script->string_list_pos += len+1; - + return pos; } @@ -1208,7 +1203,7 @@ const char* parse_simpleexpr(const char *p) const char *start_point = p; bool duplicate = true; struct script_string_buf *sbuf = &script->parse_simpleexpr_str; - + do { p++; while( *p && *p != '"' ) { @@ -1231,19 +1226,19 @@ const char* parse_simpleexpr(const char *p) p++; //'"' p = script->skip_space(p); } while( *p && *p == '"' ); - + script_string_buf_addb(sbuf, 0); - - if( !(script->syntax.translation_db && (st = strdb_get(script->syntax.translation_db, sbuf->ptr))) ) { + + if (!(script->syntax.translation_db && (st = strdb_get(script->syntax.translation_db, sbuf->ptr)) != NULL)) { script->addc(C_STR); - + if( script->pos+sbuf->pos >= script->size ) { do { script->size += SCRIPT_BLOCK_SIZE; } while( script->pos+sbuf->pos >= script->size ); RECREATE(script->buf,unsigned char,script->size); } - + memcpy(script->buf+script->pos, sbuf->ptr, sbuf->pos); script->pos += sbuf->pos; @@ -1253,19 +1248,19 @@ const char* parse_simpleexpr(const char *p) unsigned int st_cursor = 0; script->addc(C_LSTR); - + expand += (sizeof(char*) + sizeof(uint8)) * st->translations; - + while( script->pos+expand >= script->size ) { script->size += SCRIPT_BLOCK_SIZE; RECREATE(script->buf,unsigned char,script->size); } - + *((int *)(&script->buf[script->pos])) = st->string_id; *((uint8 *)(&script->buf[script->pos + sizeof(int)])) = st->translations; script->pos += sizeof(int) + sizeof(uint8); - + for(j = 0; j < st->translations; j++) { *((uint8 *)(&script->buf[script->pos])) = RBUFB(st->buf, st_cursor); *((char **)(&script->buf[script->pos+sizeof(uint8)])) = &st->buf[st_cursor + sizeof(uint8)]; @@ -1275,19 +1270,19 @@ const char* parse_simpleexpr(const char *p) st_cursor += sizeof(uint8); } } - + /* When exporting we don't know what is a translation and what isn't */ if( script->lang_export_fp && sbuf->pos > 1 ) {//sbuf->pos will always be at least 1 because of the '\0' if( !script->syntax.strings ) { script->syntax.strings = strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_ALLOW_NULL_DATA, 0); } - + if( !strdb_exists(script->syntax.strings,sbuf->ptr) ) { strdb_put(script->syntax.strings, sbuf->ptr, NULL); duplicate = false; } } - + if( script->lang_export_fp && !duplicate && ( ( ( script->syntax.last_func == script->buildin_mes_offset || script->syntax.last_func == script->buildin_select_offset ) && !script->syntax.nested_call @@ -1304,44 +1299,41 @@ const char* parse_simpleexpr(const char *p) else break; } - + while( *line_end != '\n' && *line_end != '\0' ) line_end++; - + line_length = (size_t)(line_end - line_start); - if( line_length > 0 ) { script_string_buf_ensure(lbuf,line_length + 1); - + memcpy(lbuf->ptr, line_start, line_length); lbuf->pos = line_length; script_string_buf_addb(lbuf, 0); - + normalize_name(lbuf->ptr, "\r\n\t "); } - + for(cursor = 0; cursor < sbuf->pos; cursor++) { if( sbuf->ptr[cursor] == '"' ) script_string_buf_addb(ubuf, '\\'); script_string_buf_addb(ubuf, sbuf->ptr[cursor]); } script_string_buf_addb(ubuf, 0); - + fprintf(script->lang_export_fp, "#: %s\n" - "# %s\n" - "msgctxt \"%s\"\n" - "msgid \"%s\"\n" - "msgstr \"\"\n", + "# %s\n" + "msgctxt \"%s\"\n" + "msgid \"%s\"\n" + "msgstr \"\"\n", script->parser_current_file ? script->parser_current_file : "Unknown File", lbuf->ptr, script->parser_current_npc_name ? script->parser_current_npc_name : "Unknown NPC", ubuf->ptr ); - lbuf->pos = 0; ubuf->pos = 0; } - sbuf->pos = 0; } else { int l; @@ -2423,10 +2415,10 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o if( script->parse_cleanup_timer_id == INVALID_TIMER ) { script->parse_cleanup_timer_id = timer->add(timer->gettick() + 10, script->parse_cleanup_timer, 0, 0); } - + if( script->syntax.strings ) /* used only when generating translation file */ db_destroy(script->syntax.strings); - + memset(&script->syntax,0,sizeof(script->syntax)); script->syntax.last_func = -1;/* as valid values are >= 0 */ if( script->parser_current_npc_name ) { @@ -2636,6 +2628,38 @@ TBL_PC *script_rid2sd(struct script_state *st) { return sd; } +char *get_val_npcscope_str(struct script_state* st, struct reg_db *n, struct script_data* data) { + if (n) + return (char*)i64db_get(n->vars, reference_getuid(data)); + else + return NULL; +} + +char *get_val_instance_str(struct script_state* st, const char* name, struct script_data* data) { + if (st->instance_id >= 0) { + return (char*)i64db_get(instance->list[st->instance_id].regs.vars, reference_getuid(data)); + } else { + ShowWarning("script_get_val: cannot access instance variable '%s', defaulting to \"\"\n", name); + return NULL; + } +} + +int get_val_npcscope_num(struct script_state* st, struct reg_db *n, struct script_data* data) { + if (n) + return (int)i64db_iget(n->vars, reference_getuid(data)); + else + return 0; +} + +int get_val_instance_num(struct script_state* st, const char* name, struct script_data* data) { + if (st->instance_id >= 0) + return (int)i64db_iget(instance->list[st->instance_id].regs.vars, reference_getuid(data)); + else { + ShowWarning("script_get_val: cannot access instance variable '%s', defaulting to 0\n", name); + return 0; + } +} + /** * Dereferences a variable/constant, replacing it with a copy of the value. * @@ -2689,24 +2713,15 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.str = pc_readaccountregstr(sd, data->u.num);// local break; case '.': - { - struct DBMap* n = data->ref ? - data->ref->vars : name[1] == '@' ? - st->stack->scope.vars : // instance/scope variable - st->script->local.vars; // npc variable - if( n ) - data->u.str = (char*)i64db_get(n,reference_getuid(data)); - else - data->u.str = NULL; - } + if (data->ref) + data->u.str = script->get_val_ref_str(st, data->ref, data); + else if (name[1] == '@') + data->u.str = script->get_val_scope_str(st, &st->stack->scope, data); + else + data->u.str = script->get_val_npc_str(st, &st->script->local, data); break; case '\'': - if ( st->instance_id >= 0 ) { - data->u.str = (char*)i64db_get(instance->list[st->instance_id].regs.vars, reference_getuid(data)); - } else { - ShowWarning("script_get_val: cannot access instance variable '%s', defaulting to \"\"\n", name); - data->u.str = NULL; - } + data->u.str = script->get_val_instance_str(st, name, data); break; default: data->u.str = pc_readglobalreg_str(sd, data->u.num); @@ -2744,24 +2759,15 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = pc_readaccountreg(sd, data->u.num);// local break; case '.': - { - struct DBMap* n = data->ref ? - data->ref->vars : name[1] == '@' ? - st->stack->scope.vars : // instance/scope variable - st->script->local.vars; // npc variable - if( n ) - data->u.num = (int)i64db_iget(n,reference_getuid(data)); - else - data->u.num = 0; - } + if (data->ref) + data->u.num = script->get_val_ref_num(st, data->ref, data); + else if (name[1] == '@') + data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); + else + data->u.num = script->get_val_npc_num(st, &st->script->local, data); break; case '\'': - if( st->instance_id >= 0 ) - data->u.num = (int)i64db_iget(instance->list[st->instance_id].regs.vars, reference_getuid(data)); - else { - ShowWarning("script_get_val: cannot access instance variable '%s', defaulting to 0\n", name); - data->u.num = 0; - } + data->u.num = script->get_val_instance_num(st, name, data); break; default: data->u.num = pc_readglobalreg(sd, data->u.num); @@ -2822,14 +2828,13 @@ void script_array_ensure_zero(struct script_state *st, struct map_session_data * struct script_array *sa = idb_get(src->arrays, script_getvarid(uid)); if (sa) { unsigned int i; - + ARR_FIND(0, sa->size, i, sa->members[i] == 0); if( i != sa->size ) { if( !insert ) script->array_remove_member(src,sa,i); return; } - script->array_add_member(sa,0); } else if (insert) { script->array_update(src,reference_uid(script_getvarid(uid), 0),false); @@ -2842,10 +2847,10 @@ void script_array_ensure_zero(struct script_state *st, struct map_session_data * unsigned int script_array_size(struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref) { struct script_array *sa = NULL; struct reg_db *src = script->array_src(st, sd, name, ref); - + if( src && src->arrays ) sa = idb_get(src->arrays, script->search_str(name)); - + return sa ? sa->size : 0; } /** @@ -2854,25 +2859,22 @@ unsigned int script_array_size(struct script_state *st, struct map_session_data unsigned int script_array_highest_key(struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref) { struct script_array *sa = NULL; struct reg_db *src = script->array_src(st, sd, name, ref); - - + if( src && src->arrays ) { int key = script->add_word(name); - + script->array_ensure_zero(st,sd,reference_uid(key, 0),ref); - + if( ( sa = idb_get(src->arrays, key) ) ) { unsigned int i, highest_key = 0; - + for(i = 0; i < sa->size; i++) { if( sa->members[i] > highest_key ) highest_key = sa->members[i]; } - return sa->size ? highest_key + 1 : 0; } } - return 0; } int script_free_array_db(DBKey key, DBData *data, va_list ap) { @@ -2896,15 +2898,15 @@ void script_array_delete(struct reg_db *src, struct script_array *sa) { **/ void script_array_remove_member(struct reg_db *src, struct script_array *sa, unsigned int idx) { unsigned int i, cursor; - + /* its the only member left, no need to do anything other than delete the array data */ if( sa->size == 1 ) { script->array_delete(src,sa); return; } - + sa->members[idx] = UINT_MAX; - + for(i = 0, cursor = 0; i < sa->size; i++) { if( sa->members[i] == UINT_MAX ) continue; @@ -2912,7 +2914,7 @@ void script_array_remove_member(struct reg_db *src, struct script_array *sa, uns sa->members[cursor] = sa->members[i]; cursor++; } - + sa->size = cursor; } /** @@ -2921,11 +2923,9 @@ void script_array_remove_member(struct reg_db *src, struct script_array *sa, uns * @param idx the index of the array member being inserted **/ void script_array_add_member(struct script_array *sa, unsigned int idx) { - RECREATE(sa->members, unsigned int, ++sa->size); - - sa->members[sa->size - 1] = idx; + sa->members[sa->size - 1] = idx; } /** * Obtains the source of the array database for this type and scenario @@ -2933,7 +2933,7 @@ void script_array_add_member(struct script_array *sa, unsigned int idx) { **/ struct reg_db *script_array_src(struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref) { struct reg_db *src = NULL; - + switch( name[0] ) { /* from player */ default: /* char reg */ @@ -2956,13 +2956,12 @@ struct reg_db *script_array_src(struct script_state *st, struct map_session_data } break; } - + if( src ) { if( !src->arrays ) src->arrays = idb_alloc(DB_OPT_BASE); return src; } - return NULL; } @@ -2977,7 +2976,7 @@ void script_array_update(struct reg_db *src, int64 num, bool empty) { struct script_array *sa = NULL; int id = script_getvarid(num); unsigned int index = script_getvaridx(num); - + if (!src->arrays) { src->arrays = idb_alloc(DB_OPT_BASE); } else { @@ -2986,13 +2985,13 @@ void script_array_update(struct reg_db *src, int64 num, bool empty) { if( sa ) { unsigned int i; - + /* search */ for(i = 0; i < sa->size; i++) { if( sa->members[i] == index ) break; } - + /* if existent */ if( i != sa->size ) { /* if empty, we gotta remove it */ @@ -3013,6 +3012,73 @@ void script_array_update(struct reg_db *src, int64 num, bool empty) { } } +void set_reg_npcscope_str(struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str) +{ + if (n) + { + if (str[0]) { + i64db_put(n->vars, num, aStrdup(str)); + if (script_getvaridx(num)) + script->array_update(n, num, false); + } else { + i64db_remove(n->vars, num); + if (script_getvaridx(num)) + script->array_update(n, num, true); + } + } +} + +void set_reg_npcscope_num(struct script_state* st, struct reg_db *n, int64 num, const char* name, int val) +{ + if (n) { + if (val != 0) { + i64db_iput(n->vars, num, val); + if (script_getvaridx(num)) + script->array_update(n, num, false); + } else { + i64db_remove(n->vars, num); + if (script_getvaridx(num)) + script->array_update(n, num, true); + } + } +} + +void set_reg_instance_str(struct script_state* st, int64 num, const char* name, const char *str) +{ + if (st->instance_id >= 0) { + if (str[0]) { + i64db_put(instance->list[st->instance_id].regs.vars, num, aStrdup(str)); + if (script_getvaridx(num)) + script->array_update(&instance->list[st->instance_id].regs, num, false); + } else { + i64db_remove(instance->list[st->instance_id].regs.vars, num); + if (script_getvaridx(num)) + script->array_update(&instance->list[st->instance_id].regs, num, true); + } + } else { + ShowError("script_set_reg: cannot write instance variable '%s', NPC not in a instance!\n", name); + script->reportsrc(st); + } +} + +void set_reg_instance_num(struct script_state* st, int64 num, const char* name, int val) +{ + if (st->instance_id >= 0) { + if (val != 0) { + i64db_iput(instance->list[st->instance_id].regs.vars, num, val); + if (script_getvaridx(num)) + script->array_update(&instance->list[st->instance_id].regs, num, false); + } else { + i64db_remove(instance->list[st->instance_id].regs.vars, num); + if (script_getvaridx(num)) + script->array_update(&instance->list[st->instance_id].regs, num, true); + } + } else { + ShowError("script_set_reg: cannot write instance variable '%s', NPC not in a instance!\n", name); + script->reportsrc(st); + } +} + /** * Stores the value of a script variable * @@ -3029,7 +3095,7 @@ void script_array_update(struct reg_db *src, int64 num, bool empty) { *------------------------------------------*/ int set_reg(struct script_state* st, TBL_PC* sd, int64 num, const char* name, const void* value, struct reg_db *ref) { char prefix = name[0]; - + if( is_string_variable(name) ) {// string variable const char *str = (const char*)value; @@ -3044,36 +3110,15 @@ int set_reg(struct script_state* st, TBL_PC* sd, int64 num, const char* name, co pc_setaccountreg2str(sd, num, str) : pc_setaccountregstr(sd, num, str); case '.': - { - struct reg_db *n = (ref) ? ref : (name[1] == '@') ? &st->stack->scope : &st->script->local; - if( n ) { - if (str[0]) { - i64db_put(n->vars, num, aStrdup(str)); - if( script_getvaridx(num) ) - script->array_update(n, num, false); - } else { - i64db_remove(n->vars, num); - if( script_getvaridx(num) ) - script->array_update(n, num, true); - } - } - } + if (ref) + script->set_reg_ref_str(st, ref, num, name, str); + else if (name[1] == '@') + script->set_reg_scope_str(st, &st->stack->scope, num, name, str); + else + script->set_reg_npc_str(st, &st->script->local, num, name, str); return 1; case '\'': - if( st->instance_id >= 0 ) { - if( str[0] ) { - i64db_put(instance->list[st->instance_id].regs.vars, num, aStrdup(str)); - if( script_getvaridx(num) ) - script->array_update(&instance->list[st->instance_id].regs, num, false); - } else { - i64db_remove(instance->list[st->instance_id].regs.vars, num); - if( script_getvaridx(num) ) - script->array_update(&instance->list[st->instance_id].regs, num, true); - } - } else { - ShowError("script_set_reg: cannot write instance variable '%s', NPC not in a instance!\n", name); - script->reportsrc(st); - } + set_reg_instance_str(st, num, name, str); return 1; default: return pc_setglobalreg_str(sd, num, str); @@ -3110,36 +3155,15 @@ int set_reg(struct script_state* st, TBL_PC* sd, int64 num, const char* name, co pc_setaccountreg2(sd, num, val) : pc_setaccountreg(sd, num, val); case '.': - { - struct reg_db *n = (ref) ? ref : (name[1] == '@') ? &st->stack->scope : &st->script->local; - if( n ) { - if( val != 0 ) { - i64db_iput(n->vars, num, val); - if( script_getvaridx(num) ) - script->array_update(n, num, false); - } else { - i64db_remove(n->vars, num); - if( script_getvaridx(num) ) - script->array_update(n, num, true); - } - } - } + if (ref) + script->set_reg_ref_num(st, ref, num, name, val); + else if (name[1] == '@') + script->set_reg_scope_num(st, &st->stack->scope, num, name, val); + else + script->set_reg_npc_num(st, &st->script->local, num, name, val); return 1; case '\'': - if( st->instance_id >= 0 ) { - if( val != 0 ) { - i64db_iput(instance->list[st->instance_id].regs.vars, num, val); - if( script_getvaridx(num) ) - script->array_update(&instance->list[st->instance_id].regs, num, false); - } else { - i64db_remove(instance->list[st->instance_id].regs.vars, num); - if( script_getvaridx(num) ) - script->array_update(&instance->list[st->instance_id].regs, num, true); - } - } else { - ShowError("script_set_reg: cannot write instance variable '%s', NPC not in a instance!\n", name); - script->reportsrc(st); - } + set_reg_instance_num(st, num, name, val); return 1; default: return pc_setglobalreg(sd, num, val); @@ -3432,7 +3456,7 @@ struct script_state* script_alloc_state(struct script_code* rootscript, int pos, st->oid = oid; st->sleep.timer = INVALID_TIMER; st->npc_item_flag = battle_config.item_enabled_npc; - + if( st->script->instances != USHRT_MAX ) st->script->instances++; else { @@ -3457,11 +3481,11 @@ struct script_state* script_alloc_state(struct script_code* rootscript, int pos, void script_free_state(struct script_state* st) { if( idb_exists(script->st_db,st->id) ) { struct map_session_data *sd = st->rid ? map->id2sd(st->rid) : NULL; - + if(st->bk_st) {// backup was not restored ShowDebug("script_free_state: Previous script state lost (rid=%d, oid=%d, state=%d, bk_npcid=%d).\n", st->bk_st->rid, st->bk_st->oid, st->bk_st->state, st->bk_npcid); } - + if(sd && sd->st == st) { //Current script is aborted. if(sd->state.using_fake_npc){ clif->clearunit_single(sd->npc_id, CLR_OUTSIGHT, sd->fd); @@ -3864,7 +3888,6 @@ void op_1(struct script_state* st, int op) script_pushint(st, i1); } - /// Checks the type of all arguments passed to a built-in function. /// /// @param st Script state whose stack arguments should be inspected. @@ -3945,7 +3968,6 @@ void script_check_buildin_argtype(struct script_state* st, int func) } } - /// Executes a buildin command. /// Stack: C_NAME(<command>) C_ARG <arg0> <arg1> ... <argN> int run_func(struct script_state *st) @@ -4207,15 +4229,15 @@ void run_script_main(struct script_state *st) { int string_id = *((int *)(&st->script->script_buf[st->pos])); uint8 translations = *((uint8 *)(&st->script->script_buf[st->pos+sizeof(int)])); struct map_session_data *lsd = NULL; - + st->pos += sizeof(int) + sizeof(uint8); - + if( (!st->rid || !(lsd = map->id2sd(st->rid)) || !lsd->lang_id) && !map->default_lang_id ) script->push_str(stack,C_CONSTSTR,script->string_list+string_id); else { uint8 k, wlang_id = lsd ? lsd->lang_id : map->default_lang_id; int offset = st->pos; - + for(k = 0; k < translations; k++) { uint8 lang_id = *(uint8 *)(&st->script->script_buf[offset]); offset += sizeof(uint8); @@ -4223,12 +4245,9 @@ void run_script_main(struct script_state *st) { break; offset += sizeof(char*); } - script->push_str(stack,C_CONSTSTR, - ( k == translations ) ? script->string_list+string_id : *(char**)(&st->script->script_buf[offset]) ); - + ( k == translations ) ? script->string_list+string_id : *(char**)(&st->script->script_buf[offset]) ); } - st->pos += ( ( sizeof(char*) + sizeof(uint8) ) * translations ); } break; @@ -4342,7 +4361,6 @@ int script_config_read(char *cfgName) { char line[1024],w1[1024],w2[1024]; FILE *fp; - if( !( fp = fopen(cfgName,"r") ) ) { ShowError("File not found: %s\n", cfgName); return 1; @@ -4417,7 +4435,6 @@ void script_add_autobonus(const char *autobonus) } } - /// resets a temporary character array variable to given value void script_cleararray_pc(struct map_session_data* sd, const char* varname, void* value) { struct script_array *sa = NULL; @@ -4426,39 +4443,38 @@ void script_cleararray_pc(struct map_session_data* sd, const char* varname, void int key; key = script->add_str(varname); - + if( !(src = script->array_src(NULL,sd,varname,NULL) ) ) return; - + if( value ) script->array_ensure_zero(NULL,sd,reference_uid(key,0),NULL); - + if( !(sa = idb_get(src->arrays, key)) ) /* non-existent array, nothing to empty */ return; - + size = sa->size; list = script->array_cpy_list(sa); - + for(i = 0; i < size; i++) { script->set_reg(NULL,sd,reference_uid(key, list[i]),varname,value,NULL); } } - /// sets a temporary character array variable element idx to given value /// @param refcache Pointer to an int variable, which keeps a copy of the reference to varname and must be initialized to 0. Can be NULL if only one element is set. void script_setarray_pc(struct map_session_data* sd, const char* varname, uint32 idx, void* value, int* refcache) { int key; - + if( idx >= SCRIPT_MAX_ARRAYSIZE ) { ShowError("script_setarray_pc: Variable '%s' has invalid index '%u' (char_id=%d).\n", varname, idx, sd->status.char_id); return; } key = ( refcache && refcache[0] ) ? refcache[0] : script->add_str(varname); - + script->set_reg(NULL,sd,reference_uid(key, idx),varname,value,NULL); - + if( refcache ) {// save to avoid repeated script->add_str calls refcache[0] = key; @@ -4469,23 +4485,22 @@ void script_setarray_pc(struct map_session_data* sd, const char* varname, uint32 **/ int script_reg_destroy(DBKey key, DBData *data, va_list ap) { struct script_reg_state *src; - + if( data->type != DB_DATA_PTR )/* got no need for those! */ return 0; - + src = DB->data2ptr(data); - + if( src->type ) { struct script_reg_str *p = (struct script_reg_str *)src; - + if( p->value ) aFree(p->value); - + ers_free(pc->str_reg_ers,p); } else { ers_free(pc->num_reg_ers,(struct script_reg_num*)src); } - return 0; } /** @@ -4496,10 +4511,10 @@ void script_reg_destroy_single(struct map_session_data *sd, int64 reg, struct sc if( data->type ) { struct script_reg_str *p = (struct script_reg_str*)data; - + if( p->value ) aFree(p->value); - + ers_free(pc->str_reg_ers,p); } else { ers_free(pc->num_reg_ers,(struct script_reg_num*)data); @@ -4643,16 +4658,15 @@ void do_final_script(void) { if( script->labels != NULL ) aFree(script->labels); - + ers_destroy(script->array_ers); - + if( script->generic_ui_array ) aFree(script->generic_ui_array); - + script->clear_translations(false); - script->parser_clean_leftovers(); - + if( script->lang_export_file ) aFree(script->lang_export_file); } @@ -4662,11 +4676,10 @@ void do_final_script(void) { **/ uint8 script_add_language(const char *name) { uint8 lang_id = script->max_lang_id; - + RECREATE(script->languages, char *, ++script->max_lang_id); - script->languages[lang_id] = aStrdup(name); - + return lang_id; } /** @@ -4682,9 +4695,9 @@ void script_load_translations(void) { if (map->minimal) // No translations in minimal mode return; - + script->translation_db = strdb_alloc(DB_OPT_DUP_KEY, NAME_LENGTH*2+1); - + if( script->languages ) { for(i = 0; i < script->max_lang_id; i++) aFree(script->languages[i]); @@ -4692,33 +4705,33 @@ void script_load_translations(void) { } script->languages = NULL; script->max_lang_id = 0; - + script->add_language("English");/* 0 is default, which is whatever is in the npc files hardcoded (in our case, English) */ - + if (libconfig->read_file(&translations_conf, config_filename)) { ShowError("load_translations: can't read '%s'\n", config_filename); return; } - + if( !(translations = libconfig->lookup(&translations_conf, "translations")) ) { ShowError("load_translations: invalid format on '%s'\n",config_filename); return; } - + if( script->string_list ) aFree(script->string_list); - + script->string_list = NULL; script->string_list_pos = 0; script->string_list_size = 0; - + size = libconfig->setting_length(translations); - + for(i = 0; i < size; i++) { const char *translation_file = libconfig->setting_get_string_elem(translations, i); - script->load_translation(translation_file, ++lang_id, &total); } + libconfig->destroy(&translations_conf); if( total ) { DBIterator *main_iter; @@ -4726,32 +4739,27 @@ void script_load_translations(void) { DBMap *string_db; struct string_translation *st = NULL; uint32 j = 0; - - + CREATE(script->translation_buf, char *, total); script->translation_buf_size = total; - + main_iter = db_iterator(script->translation_db); - for( string_db = dbi_first(main_iter); dbi_exists(main_iter); string_db = dbi_next(main_iter) ) { sub_iter = db_iterator(string_db); - for( st = dbi_first(sub_iter); dbi_exists(sub_iter); st = dbi_next(sub_iter) ) { script->translation_buf[j++] = st->buf; } - dbi_destroy(sub_iter); } - dbi_destroy(main_iter); } - + for(k = 0; k < script->max_lang_id; k++) { if( !strcmpi(script->languages[k],map->default_lang_str) ) { break; } } - + if( k == script->max_lang_id ) { ShowError("load_translations: map server default_language setting '%s' is not a loaded language\n",map->default_lang_str); map->default_lang_id = 0; @@ -4766,21 +4774,21 @@ void script_load_translations(void) { const char * script_get_translation_file_name(const char *file) { static char file_name[200]; int i, len = (int)strlen(file), last_bar = -1, last_dot = -1; - + for(i = 0; i < len; i++) { if( file[i] == '/' || file[i] == '\\' ) last_bar = i; else if ( file[i] == '.' ) last_dot = i; } - + if( last_bar != -1 || last_dot != -1 ) { if( last_bar != -1 && last_dot < last_bar ) last_dot = -1; safestrncpy(file_name, file+(last_bar >= 0 ? last_bar+1 : 0), ( last_dot >= 0 ? ( last_bar >= 0 ? last_dot - last_bar : last_dot ) : sizeof(file_name) )); return file_name; } - + return file; } @@ -4795,25 +4803,25 @@ void script_load_translation(const char *file, uint8 lang_id, uint32 *total) { size_t i; FILE *fp; struct script_string_buf msgid = { 0 }, msgstr = { 0 }; - + if( !(fp = fopen(file,"rb")) ) { ShowError("load_translation: failed to open '%s' for reading\n",file); return; } - + script->add_language(script->get_translation_file_name(file)); if( lang_id >= atcommand->max_message_table ) atcommand->expand_message_table(); - + while(fgets(line, sizeof(line), fp)) { size_t len = strlen(line), cursor = 0; - + if( len <= 1 ) continue; - + if( line[0] == '#' ) continue; - + if( strncasecmp(line,"msgctxt \"", 9) == 0 ) { msgctxt[0] = '\0'; for(i = 9; i < len - 2; i++) { @@ -4847,14 +4855,14 @@ void script_load_translation(const char *file, uint8 lang_id, uint32 *total) { } script_string_buf_addb(&msgstr,0); } - + if( msgctxt[0] && msgid.pos > 1 && msgstr.pos > 1 ) { size_t msgstr_len = msgstr.pos; unsigned int inner_len = 1 + (uint32)msgstr_len + 1; //uint8 lang_id + msgstr_len + '\0' - + if( strcasecmp(msgctxt, "messages.conf") == 0 ) { int k; - + for(k = 0; k < MAX_MSG; k++) { if( atcommand->msg_table[0][k] && strcmpi(atcommand->msg_table[0][k],msgid.ptr) == 0 ) { if( atcommand->msg_table[lang_id][k] ) @@ -4863,29 +4871,24 @@ void script_load_translation(const char *file, uint8 lang_id, uint32 *total) { break; } } - } else { struct string_translation *st = NULL; if( !( string_db = strdb_get(script->translation_db, msgctxt) ) ) { string_db = strdb_alloc(DB_OPT_DUP_KEY, 0); - strdb_put(script->translation_db, msgctxt, string_db); } - + if( !(st = strdb_get(string_db, msgid.ptr) ) ) { CREATE(st, struct string_translation, 1); - st->string_id = script->string_dup(msgid.ptr); - strdb_put(string_db, msgid.ptr, st); } - RECREATE(st->buf, char, st->len + inner_len); - + WBUFB(st->buf, st->len) = lang_id; safestrncpy((char*)WBUFP(st->buf, st->len + 1), msgstr.ptr, msgstr_len + 1); - + st->translations++; st->len += inner_len; } @@ -4894,11 +4897,11 @@ void script_load_translation(const char *file, uint8 lang_id, uint32 *total) { translations++; } } - + *total += translations; - + fclose(fp); - + script_string_buf_destroy(&msgid); script_string_buf_destroy(&msgstr); @@ -4913,21 +4916,21 @@ void script_clear_translations(bool reload) { if( script->string_list ) aFree(script->string_list); - + script->string_list = NULL; script->string_list_pos = 0; script->string_list_size = 0; - + if( script->translation_buf ) { for(i = 0; i < script->translation_buf_size; i++) { aFree(script->translation_buf[i]); } aFree(script->translation_buf); } - + script->translation_buf = NULL; script->translation_buf_size = 0; - + if( script->languages ) { for(i = 0; i < script->max_lang_id; i++) aFree(script->languages[i]); @@ -4935,11 +4938,11 @@ void script_clear_translations(bool reload) { } script->languages = NULL; script->max_lang_id = 0; - + if( script->translation_db ) { script->translation_db->clear(script->translation_db,script->translation_db_destroyer); } - + if( reload ) script->load_translations(); } @@ -4949,18 +4952,17 @@ void script_clear_translations(bool reload) { **/ int script_translation_db_destroyer(DBKey key, DBData *data, va_list ap) { DBMap *string_db = DB->data2ptr(data); - + if( db_size(string_db) ) { - DBIterator *iter = db_iterator(string_db); struct string_translation *st = NULL; - + DBIterator *iter = db_iterator(string_db); + for( st = dbi_first(iter); dbi_exists(iter); st = dbi_next(iter) ) { aFree(st); } - dbi_destroy(iter); } - + db_destroy(string_db); return 0; } @@ -4969,10 +4971,9 @@ int script_translation_db_destroyer(DBKey key, DBData *data, va_list ap) { * **/ void script_parser_clean_leftovers(void) { - if( script->buf ) aFree(script->buf); - + script->buf = NULL; script->size = 0; @@ -4980,7 +4981,7 @@ void script_parser_clean_leftovers(void) { script->translation_db->destroy(script->translation_db,script->translation_db_destroyer); script->translation_db = NULL; } - + if( script->syntax.strings ) { /* used only when generating translation file */ db_destroy(script->syntax.strings); script->syntax.strings = NULL; @@ -4995,21 +4996,19 @@ void script_parser_clean_leftovers(void) { * Performs cleanup after all parsing is processed **/ int script_parse_cleanup_timer(int tid, int64 tick, int id, intptr_t data) { - script->parser_clean_leftovers(); script->parse_cleanup_timer_id = INVALID_TIMER; - + return 0; } - /*========================================== * Initialization *------------------------------------------*/ void do_init_script(bool minimal) { script->parse_cleanup_timer_id = INVALID_TIMER; - + script->st_db = idb_alloc(DB_OPT_BASE); script->userfunc_db = strdb_alloc(DB_OPT_DUP_KEY,0); script->autobonus_db = strdb_alloc(DB_OPT_DUP_KEY,0); @@ -5029,7 +5028,6 @@ void do_init_script(bool minimal) { return; mapreg->init(); - script->load_translations(); } @@ -5063,9 +5061,9 @@ int script_reload(void) { atcommand->binding_count = 0; db_clear(script->st_db); - + script->clear_translations(true); - + if( script->parse_cleanup_timer_id != INVALID_TIMER ) { timer->delete(script->parse_cleanup_timer_id,script->parse_cleanup_timer); script->parse_cleanup_timer_id = INVALID_TIMER; @@ -5823,7 +5821,7 @@ int buildin_areawarp_sub(struct block_list *bl,va_list ap) tx = rnd()%(x3-x2+1)+x2; ty = rnd()%(y3-y2+1)+y2; j++; - } while( map->getcell(index,tx,ty,CELL_CHKNOPASS) && j < max ); + } while (map->getcell(index, bl, tx, ty, CELL_CHKNOPASS) && j < max); pc->setpos((TBL_PC *)bl,index,tx,ty,CLR_OUTSIGHT); } @@ -6290,7 +6288,7 @@ BUILDIN(__setr) { if (!not_array_variable(*namevalue)) { // array variable being copied into another array variable - if (sd == NULL && not_server_variable(*namevalue) && !(sd = script->rid2sd(st))) { + if (sd == NULL && not_server_variable(*namevalue) && (sd = script->rid2sd(st)) == NULL) { // player must be attached in order to copy a player variable ShowError("script:set: no player attached for player variable '%s'\n", namevalue); return true; @@ -6584,15 +6582,15 @@ BUILDIN(deletearray) st->state = END; return false;// not a variable } - + script->array_ensure_zero(st,NULL,data->u.num,reference_getref(data)); - + if ( !(sa = idb_get(src->arrays, id)) ) { /* non-existent array, nothing to empty */ return true;// not a variable } end = script->array_highest_key(st,sd,name,reference_getref(data)); - + if( start >= end ) return true;// nothing to free @@ -6600,7 +6598,7 @@ BUILDIN(deletearray) value = (void *)""; else value = (void *)0; - + if( script_hasdata(st,3) ) { unsigned int count = script_getnum(st, 3); if( count > end - start ) @@ -6626,14 +6624,14 @@ BUILDIN(deletearray) list = script->array_cpy_list(sa); size = sa->size; qsort(list, size, sizeof(unsigned int), script_array_index_cmp); - + ARR_FIND(0, size, i, list[i] >= start); - + for( ; i < size && list[i] < start + count; i++ ) { // Clear any entries between start and start+count, if they exist script->set_reg(st, sd, reference_uid(id, list[i]), name, value, reference_getref(data)); } - + for( ; i < size && list[i] < end; i++ ) { // Move back count positions any entries between start+count to fill the gaps void* v = script->get_val2(st, reference_uid(id, list[i]), reference_getref(data)); @@ -6647,7 +6645,7 @@ BUILDIN(deletearray) unsigned int *list = NULL, size = 0; list = script->array_cpy_list(sa); size = sa->size; - + for(i = 0; i < size; i++) { if( list[i] >= start ) // Less expensive than sorting it, most likely script->set_reg(st, sd, reference_uid(id, list[i]), name, value, reference_getref(data)); @@ -7126,7 +7124,7 @@ BUILDIN(getitem) { if ((flag = pc->additem(sd, &it, get_count, LOG_TYPE_SCRIPT))) { clif->additem(sd, 0, 0, flag); if( pc->candrop(sd,&it) ) - map->addflooritem(&it,get_count,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &it, get_count, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } } @@ -7234,7 +7232,7 @@ BUILDIN(getitem2) if ((flag = pc->additem(sd, &item_tmp, get_count, LOG_TYPE_SCRIPT))) { clif->additem(sd, 0, 0, flag); if( pc->candrop(sd,&item_tmp) ) - map->addflooritem(&item_tmp,get_count,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, get_count, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } } @@ -7423,17 +7421,15 @@ BUILDIN(makeitem) return false; } - memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = nameid; item_tmp.identify=1; - - map->addflooritem(&item_tmp,amount,m,x,y,0,0,0,0); + + map->addflooritem(NULL, &item_tmp, amount, m, x, y, 0, 0, 0, 0); return true; } - /// Counts / deletes the current item given by idx. /// Used by buildin_delitem_search /// Relies on all input data being already fully valid. @@ -7456,7 +7452,6 @@ void buildin_delitem_delete(struct map_session_data* sd, int idx, int* amount, b amount[0]-= delamount; } - /// Searches for item(s) and checks, if there is enough of them. /// Used by delitem and delitem2 /// Relies on all input data being already fully valid. @@ -7564,7 +7559,6 @@ bool buildin_delitem_search(struct map_session_data* sd, struct item* it, bool e } } - /// Deletes items from the target/attached player. /// Prioritizes ordinary items. /// @@ -8484,7 +8478,7 @@ BUILDIN(successrefitem) if (script_hasdata(st, 3)) up = script_getnum(st, 3); - + if (num > 0 && num <= ARRAYLENGTH(script->equip)) i=pc->checkequip(sd,script->equip[num-1]); if (i >= 0) { @@ -8619,7 +8613,7 @@ BUILDIN(delequip) pc->delitem(sd, i, 1, 0, DELITEM_FAILREFINE, LOG_TYPE_SCRIPT); return true; } - + ShowError("script:delequip: no item found in position '%d' for player '%s' (AID:%d/CID:%d).\n", num, sd->status.name,sd->status.account_id, sd->status.char_id); st->state = END; clif->scriptclose(sd, st->oid); @@ -9039,7 +9033,7 @@ BUILDIN(getgroupid) /// end BUILDIN(end) { st->state = END; - + /* are we stopping inside a function? */ if( st->stack->defsp >= 1 && st->stack->stack_data[st->stack->defsp-1].type == C_RETINFO ) { int i; @@ -11095,7 +11089,6 @@ BUILDIN(homunculus_checkcall) { return true; } - // [Zephyrus] BUILDIN(homunculus_shuffle) { TBL_PC *sd; @@ -11135,7 +11128,7 @@ BUILDIN(roclass) sex = script_getnum(st,3); else { TBL_PC *sd; - if (st->rid && (sd=script->rid2sd(st))) + if (st->rid && (sd=script->rid2sd(st)) != NULL) sex = sd->status.sex; else sex = 1; //Just use male when not found. @@ -11420,6 +11413,10 @@ BUILDIN(disablewaitingroomevent) { /// <type>=16 : the name of the waiting room event /// <type>=32 : if the waiting room is full /// <type>=33 : if there are enough users to trigger the event +/// -- Custom Added +/// <type>=34 : minimum player of waiting room +/// <type>=35 : maximum player of waiting room +/// <type>=36 : minimum zeny required /// /// getwaitingroomstate(<type>,"<npc_name>") -> <info> /// getwaitingroomstate(<type>) -> <info> @@ -11427,6 +11424,7 @@ BUILDIN(getwaitingroomstate) { struct npc_data *nd; struct chat_data *cd; int type; + int i; type = script_getnum(st,2); if( script_hasdata(st,3) ) @@ -11440,7 +11438,13 @@ BUILDIN(getwaitingroomstate) { } switch(type) { - case 0: script_pushint(st, cd->users); break; + case 0: + for (i = 0; i < cd->users; i++) { + struct map_session_data *sd = cd->usersd[i]; + mapreg->setreg(reference_uid(script->add_str("$@chatmembers"), i), sd->bl.id); + } + script_pushint(st, cd->users); + break; case 1: script_pushint(st, cd->limit); break; case 2: script_pushint(st, cd->trigger&0x7f); break; case 3: script_pushint(st, ((cd->trigger&0x80)!=0)); break; @@ -11449,6 +11453,10 @@ BUILDIN(getwaitingroomstate) { case 16: script_pushstrcopy(st, cd->npc_event);break; case 32: script_pushint(st, (cd->users >= cd->limit)); break; case 33: script_pushint(st, (cd->users >= cd->trigger)); break; + + case 34: script_pushint(st, cd->minLvl); break; + case 35: script_pushint(st, cd->maxLvl); break; + case 36: script_pushint(st, cd->zeny); break; default: script_pushint(st, -1); break; } return true; @@ -11565,7 +11573,6 @@ BUILDIN(isloggedin) { return true; } - /*========================================== * *------------------------------------------*/ @@ -11885,7 +11892,6 @@ BUILDIN(pvpon) { bl.m = m; clif->maptypeproperty2(&bl,ALL_SAMEMAP); - if(battle_config.pk_mode) // disable ranking functions if pk_mode is on [Valaris] return true; @@ -12294,7 +12300,7 @@ BUILDIN(successremovecards) if((flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))) { // get back the cart in inventory clif->additem(sd,0,0,flag); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } } @@ -12319,7 +12325,7 @@ BUILDIN(successremovecards) if ((flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))) { //chk if can be spawn in inventory otherwise put on floor clif->additem(sd,0,0,flag); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } clif->misceffect(&sd->bl,3); @@ -12368,7 +12374,7 @@ BUILDIN(failedremovecards) if((flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))) { clif->additem(sd,0,0,flag); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } } @@ -12399,7 +12405,7 @@ BUILDIN(failedremovecards) if((flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))) { clif->additem(sd,0,0,flag); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } clif->misceffect(&sd->bl,2); @@ -13806,12 +13812,20 @@ BUILDIN(message) { /*========================================== * npctalk (sends message to surrounding area) + * usage: npctalk "<message>"{,"<npc name>"}; *------------------------------------------*/ BUILDIN(npctalk) { - struct npc_data* nd = (struct npc_data *)map->id2bl(st->oid); + struct npc_data* nd; const char *str = script_getstr(st,2); + if (script_hasdata(st, 3)) { + nd = npc->name2id(script_getstr(st, 3)); + } + else { + nd = (struct npc_data *)map->id2bl(st->oid); + } + if (nd) { char name[NAME_LENGTH], message[256]; safestrncpy(name, nd->name, sizeof(name)); @@ -13977,7 +13991,6 @@ BUILDIN(getnpcclass) return true; } - /*========================================== * getlook char info. getlook(arg) *------------------------------------------*/ @@ -14082,13 +14095,13 @@ BUILDIN(getmapxy) script_pushint(st,-1); return false; } - + if( !is_string_variable(reference_getname(script_getdata(st, 2))) ) { ShowWarning("script: buildin_getmapxy: %s is not a string variable\n",reference_getname(script_getdata(st, 2))); script_pushint(st,-1); return false; } - + if( is_string_variable(reference_getname(script_getdata(st, 3))) ) { ShowWarning("script: buildin_getmapxy: %s is a string variable, should be int\n",reference_getname(script_getdata(st, 3))); script_pushint(st,-1); @@ -14180,7 +14193,7 @@ BUILDIN(getmapxy) num=st->stack->stack_data[st->start+2].u.num; name=script->get_str(script_getvarid(num)); prefix=*name; - + if(not_server_variable(prefix)) sd=script->rid2sd(st); else @@ -14557,7 +14570,7 @@ BUILDIN(equip2) script_pushint(st,0); return true; } - + nameid = script_getnum(st,2); if( (item_data = itemdb->exists(nameid)) == NULL ) { @@ -14831,8 +14844,6 @@ BUILDIN(explode) size_t len = strlen(str); int i = 0, j = 0; int start; - - char *temp; const char* name; @@ -15403,7 +15414,6 @@ BUILDIN(countstr) return true; } - /// Changes the display name and/or display class of the npc. /// Returns 0 is successful, 1 if the npc does not exist. /// @@ -16153,7 +16163,6 @@ BUILDIN(checkvending) // check vending [Nab4] return true; } - // check chatting [Marka] BUILDIN(checkchatting) { TBL_PC *sd = NULL; @@ -16295,7 +16304,6 @@ BUILDIN(pcfollow) { int id, targetid; TBL_PC *sd = NULL; - id = script_getnum(st,2); targetid = script_getnum(st,3); @@ -16315,7 +16323,6 @@ BUILDIN(pcstopfollow) int id; TBL_PC *sd = NULL; - id = script_getnum(st,2); if(id) @@ -16733,7 +16740,7 @@ BUILDIN(getvariableofnpc) if( !nd->u.scr.script->local.vars ) nd->u.scr.script->local.vars = i64db_alloc(DB_OPT_RELEASE_DATA); - + script->push_val(st->stack, C_NAME, reference_getuid(data), &nd->u.scr.script->local); return true; } @@ -16770,7 +16777,7 @@ BUILDIN(warpportal) { if( bl->type == BL_NPC ) unit->bl2ud2(bl); // ensure nd->ud is safe to edit - + group = skill->unitsetting(bl, AL_WARP, 4, spx, spy, 0); if( group == NULL ) return true;// failed @@ -16823,7 +16830,7 @@ BUILDIN(checkcell) { return true; } - script_pushint(st, map->getcell(m, x, y, type)); + script_pushint(st, map->getcell(m, NULL, x, y, type)); return true; } @@ -17726,7 +17733,7 @@ BUILDIN(has_instance) { int16 m; int instance_id = -1; bool type = strcmp(script->getfuncname(st),"has_instance2") == 0 ? true : false; - + str = script_getstr(st, 2); if( (m = map->mapname2mapid(str)) < 0 ) { @@ -17755,7 +17762,7 @@ BUILDIN(has_instance) { if( i != sd->instances ) instance_id = sd->instance[i]; } - if( instance_id == -1 && sd->status.party_id && (p = party->search(sd->status.party_id)) && p->instances ) { + if (instance_id == -1 && sd->status.party_id && (p = party->search(sd->status.party_id)) != NULL && p->instances) { for( i = 0; i < p->instances; i++ ) { if( p->instance[i] >= 0 ) { ARR_FIND(0, instance->list[p->instance[i]].num_map, j, map->list[instance->list[p->instance[i]].map[j]].instance_src_map == m); @@ -17940,7 +17947,7 @@ BUILDIN(instance_check_guild) c++; } } - + if( c < amount ) script_pushint(st,0); else @@ -18039,7 +18046,6 @@ BUILDIN(areamobuseskill) { return true; } - BUILDIN(progressbar) { struct map_session_data * sd = script->rid2sd(st); @@ -18101,7 +18107,6 @@ BUILDIN(pushpc) return true; } - /// Invokes buying store preparation window /// buyingstore <slots>; BUILDIN(buyingstore) @@ -18116,7 +18121,6 @@ BUILDIN(buyingstore) return true; } - /// Invokes search store info window /// searchstores <uses>,<effect>; BUILDIN(searchstores) @@ -18393,7 +18397,6 @@ BUILDIN(bindatcmd) { if( script_hasdata(st,5) ) group_lv_char = script_getnum(st,5); if( script_hasdata(st,6) ) log = script_getnum(st,6) ? true : false; - if( atcommand->binding_count == 0 ) { CREATE(atcommand->binding,struct atcmd_binding_data*,1); @@ -18608,7 +18611,7 @@ BUILDIN(getrandgroupitem) { if ((flag = pc->additem(sd, &it, get_count, LOG_TYPE_SCRIPT))) { clif->additem(sd, 0, 0, flag); if( pc->candrop(sd,&it) ) - map->addflooritem(&it,get_count,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &it, get_count, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } } @@ -18668,11 +18671,11 @@ BUILDIN(npcskill) { skill_level = script_getnum(st, 3); stat_point = script_getnum(st, 4); npc_level = script_getnum(st, 5); - + if( !(sd = script->rid2sd(st)) ) return false; - - nd = (struct npc_data *)map->id2bl(sd->npc_id); + + nd = (struct npc_data *)map->id2bl(sd->npc_id); if (stat_point > battle_config.max_third_parameter) { ShowError("npcskill: stat point exceeded maximum of %d.\n",battle_config.max_third_parameter ); @@ -18778,7 +18781,7 @@ BUILDIN(montransform) { clif->ShowScript(&sd->bl, msg); status_change_end(bl, SC_MONSTER_TRANSFORM, INVALID_TIMER); // Clear previous sc_start2(NULL, bl, SC_MONSTER_TRANSFORM, 100, mob_id, type, tick); - + if (script_hasdata(st, 4)) sc_start4(NULL, bl, type, 100, val1, val2, val3, val4, tick); } @@ -18862,7 +18865,7 @@ bool script_hqueue_add(int idx, int var) script->hq[idx].item[i] = var; script->hq[idx].items++; - if (var >= START_ACCOUNT_NUM && (sd = map->id2sd(var))) { + if (var >= START_ACCOUNT_NUM && (sd = map->id2sd(var)) != NULL) { for (i = 0; i < sd->queues_count; i++) { if (sd->queues[i] == -1) { break; @@ -18908,7 +18911,7 @@ bool script_hqueue_remove(int idx, int var) { script->hq[idx].item[i] = -1; script->hq[idx].items--; - if( var >= START_ACCOUNT_NUM && (sd = map->id2sd(var)) ) { + if (var >= START_ACCOUNT_NUM && (sd = map->id2sd(var)) != NULL) { for(i = 0; i < sd->queues_count; i++) { if( sd->queues[i] == idx ) { break; @@ -18986,7 +18989,7 @@ bool script_hqueue_del(int idx) int i; for (i = 0; i < script->hq[idx].size; i++) { struct map_session_data *sd; - if( script->hq[idx].item[i] >= START_ACCOUNT_NUM && (sd = map->id2sd(script->hq[idx].item[i])) ) { + if (script->hq[idx].item[i] >= START_ACCOUNT_NUM && (sd = map->id2sd(script->hq[idx].item[i])) != NULL) { int j; for(j = 0; j < sd->queues_count; j++) { if( sd->queues[j] == script->hq[idx].item[i] ) { @@ -19025,7 +19028,7 @@ void script_hqueue_clear(int idx) { for(i = 0; i < script->hq[idx].size; i++) { if( script->hq[idx].item[i] > 0 ) { - if( script->hq[idx].item[i] >= START_ACCOUNT_NUM && (sd = map->id2sd(script->hq[idx].item[i])) ) { + if (script->hq[idx].item[i] >= START_ACCOUNT_NUM && (sd = map->id2sd(script->hq[idx].item[i])) != NULL) { for(j = 0; j < sd->queues_count; j++) { if( sd->queues[j] == idx ) { break; @@ -19292,7 +19295,7 @@ BUILDIN(checkbound) return true; } else script_pushint(st,0); - + return true; } @@ -19373,8 +19376,6 @@ BUILDIN(instance_set_respawn) { script_pushint(st, 0); } } - - return true; } /** @@ -19676,7 +19677,6 @@ BUILDIN(channelmes) return true; } - /** By Cydh Display script message showscript "<message>"{,<GID>}; @@ -20128,7 +20128,7 @@ void script_parse_builtin(void) { BUILDIN_DEF2(atcommand,"charcommand","s"), // [MouseJstr] BUILDIN_DEF(movenpc,"sii?"), // [MouseJstr] BUILDIN_DEF(message,"ss"), // [MouseJstr] - BUILDIN_DEF(npctalk,"s"), // [Valaris] + BUILDIN_DEF(npctalk,"s?"), // [Valaris] BUILDIN_DEF(mobcount,"ss"), BUILDIN_DEF(getlook,"i"), BUILDIN_DEF(getsavepoint,"i"), @@ -20433,7 +20433,6 @@ void script_label_add(int key, int pos) { * Sets source-end constants for scripts to play with **/ void script_hardcoded_constants(void) { - /* server defines */ script->set_constant("PACKETVER",PACKETVER,false); script->set_constant("MAX_LEVEL",MAX_LEVEL,false); @@ -20553,7 +20552,7 @@ void script_hardcoded_constants(void) { **/ unsigned short script_mapindexname2id (struct script_state *st, const char* name) { unsigned short index; - + if( !(index=mapindex->name2id(name)) ) { script->reportsrc(st); return 0; @@ -20561,7 +20560,6 @@ unsigned short script_mapindexname2id (struct script_state *st, const char* name return index; } - void script_defaults(void) { // aegis->athena slot position conversion table unsigned int equip[SCRIPT_EQUIP_TABLE_SIZE] = {EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_GARMENT,EQP_SHOES,EQP_ACC_L,EQP_ACC_R,EQP_HEAD_MID,EQP_HEAD_LOW,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_GARMENT,EQP_SHADOW_ARMOR, EQP_SHADOW_WEAPON, EQP_SHADOW_SHIELD, EQP_SHADOW_SHOES, EQP_SHADOW_ACC_R, EQP_SHADOW_ACC_L}; @@ -20574,7 +20572,7 @@ void script_defaults(void) { script->st_ers = NULL; script->stack_ers = NULL; script->array_ers = NULL; - + script->hq = NULL; script->hqi = NULL; script->hqs = script->hqis = 0; @@ -20654,6 +20652,14 @@ void script_defaults(void) { script->push_val = push_val; script->get_val = get_val; script->get_val2 = get_val2; + script->get_val_ref_str = get_val_npcscope_str; + script->get_val_scope_str = get_val_npcscope_str; + script->get_val_npc_str = get_val_npcscope_str; + script->get_val_instance_str = get_val_instance_str; + script->get_val_ref_num = get_val_npcscope_num; + script->get_val_scope_num = get_val_npcscope_num; + script->get_val_npc_num = get_val_npcscope_num; + script->get_val_instance_num = get_val_instance_num; script->push_str = push_str; script->push_copy = push_copy; script->pop_stack = pop_stack; @@ -20720,6 +20726,15 @@ void script_defaults(void) { script->print_line = script_print_line; script->errorwarning_sub = script_errorwarning_sub; script->set_reg = set_reg; + script->set_reg_ref_str = set_reg_npcscope_str; + script->set_reg_scope_str = set_reg_npcscope_str; + script->set_reg_npc_str = set_reg_npcscope_str; + script->set_reg_instance_str = set_reg_instance_str; + script->set_reg_ref_num = set_reg_npcscope_num; + script->set_reg_scope_num = set_reg_npcscope_num; + script->set_reg_npc_num = set_reg_npcscope_num; + script->set_reg_instance_num = set_reg_instance_num; + script->stack_expand = stack_expand; script->push_retinfo = push_retinfo; script->op_3 = op_3; @@ -20798,7 +20813,7 @@ void script_defaults(void) { script->global_casecheck.str_pos = 0; memset(script->global_casecheck.str_hash, 0, sizeof(script->global_casecheck.str_hash)); // end ENABLE_CASE_CHECK - + /** * Array Handling **/ diff --git a/src/map/script.h b/src/map/script.h index ad8ae82cb..ff660dec8 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -629,6 +629,14 @@ struct script_interface { void (*detach_rid) (struct script_state* st); struct script_data* (*push_val)(struct script_stack* stack, enum c_op type, int64 val, struct reg_db *ref); struct script_data *(*get_val) (struct script_state* st, struct script_data* data); + char* (*get_val_ref_str) (struct script_state* st, struct reg_db *n, struct script_data* data); + char* (*get_val_scope_str) (struct script_state* st, struct reg_db *n, struct script_data* data); + char* (*get_val_npc_str) (struct script_state* st, struct reg_db *n, struct script_data* data); + char* (*get_val_instance_str) (struct script_state* st, const char* name, struct script_data* data); + int (*get_val_ref_num) (struct script_state* st, struct reg_db *n, struct script_data* data); + int (*get_val_scope_num) (struct script_state* st, struct reg_db *n, struct script_data* data); + int (*get_val_npc_num) (struct script_state* st, struct reg_db *n, struct script_data* data); + int (*get_val_instance_num) (struct script_state* st, const char* name, struct script_data* data); void* (*get_val2) (struct script_state* st, int64 uid, struct reg_db *ref); struct script_data* (*push_str) (struct script_stack* stack, enum c_op type, char* str); struct script_data* (*push_copy) (struct script_stack* stack, int pos); @@ -696,6 +704,14 @@ struct script_interface { const char* (*print_line) (StringBuf *buf, const char *p, const char *mark, int line); void (*errorwarning_sub) (StringBuf *buf, const char *src, const char *file, int start_line, const char *error_msg, const char *error_pos); int (*set_reg) (struct script_state *st, TBL_PC *sd, int64 num, const char *name, const void *value, struct reg_db *ref); + void (*set_reg_ref_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); + void (*set_reg_scope_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); + void (*set_reg_npc_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); + void (*set_reg_instance_str) (struct script_state* st, int64 num, const char* name, const char *str); + void (*set_reg_ref_num) (struct script_state* st, struct reg_db *n, int64 num, const char* name, int val); + void (*set_reg_scope_num) (struct script_state* st, struct reg_db *n, int64 num, const char* name, int val); + void (*set_reg_npc_num) (struct script_state* st, struct reg_db *n, int64 num, const char* name, int val); + void (*set_reg_instance_num) (struct script_state* st, int64 num, const char* name, int val); void (*stack_expand) (struct script_stack *stack); struct script_data* (*push_retinfo) (struct script_stack *stack, struct script_retinfo *ri, struct reg_db *ref); void (*op_3) (struct script_state *st, int op); diff --git a/src/map/skill.c b/src/map/skill.c index 2582ca2b6..a9ebf6998 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -115,7 +115,7 @@ int skill_get_index( uint16 skill_id ) { else ShowWarning("skill_get_index: skill id '%d' is not being handled!\n",skill_id); } - + // validate result if( !skill_id || skill_id >= MAX_SKILL_DB ) return 0; @@ -365,7 +365,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk #else // not RENEWAL hp = ( status->get_lv(src) + status_get_int(src) ) / 8 * (4 + ( skill_id == AB_HIGHNESSHEAL ? ( sd ? pc->checkskill(sd,AL_HEAL) : 10 ) : skill_lv ) * 8); #endif // RENEWAL - if( sd && ((skill2_lv = pc->checkskill(sd, HP_MEDITATIO)) > 0) ) + if (sd && (skill2_lv = pc->checkskill(sd, HP_MEDITATIO)) > 0) hp += hp * skill2_lv * 2 / 100; else if( src->type == BL_HOM && (skill2_lv = homun->checkskill(((TBL_HOM*)src), HLIF_BRAIN)) > 0 ) hp += hp * skill2_lv * 2 / 100; @@ -375,10 +375,10 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk if( ( (target && target->type == BL_MER) || !heal ) && skill_id != NPC_EVILLAND ) hp >>= 1; - if( sd && (skill2_lv = pc->skillheal_bonus(sd, skill_id)) ) + if (sd && (skill2_lv = pc->skillheal_bonus(sd, skill_id)) != 0) hp += hp*skill2_lv/100; - if( tsd && (skill2_lv = pc->skillheal2_bonus(tsd, skill_id)) ) + if (tsd && (skill2_lv = pc->skillheal2_bonus(tsd, skill_id)) != 0) hp += hp*skill2_lv/100; sc = status->get_sc(src); @@ -481,14 +481,14 @@ int skillnotok (uint16 skill_id, struct map_session_data *sd) clif->skill_fail(sd, skill_id, USESKILL_FAIL_SKILLINTERVAL, 0); return 1; } - + /** * It has been confirmed on a official server (thanks to Yommy) that item-cast skills bypass all the restrictions below * Also, without this check, an exploit where an item casting + healing (or any other kind buff) isn't deleted after used on a restricted map **/ if( sd->skillitem == skill_id ) return 0; - + if( sd->sc.data[SC_ALL_RIDING] ) return 1;//You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe) @@ -970,7 +970,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case DC_UGLYDANCE: rate = 5+5*skill_lv; - if(sd && (temp=pc->checkskill(sd,DC_DANCINGLESSON))) + if (sd && (temp=pc->checkskill(sd,DC_DANCINGLESSON)) > 0) rate += 5+temp; status_zap(bl, 0, rate); break; @@ -2105,7 +2105,6 @@ int skill_blown(struct block_list* src, struct block_list* target, int count, in return unit->blown(target, dx, dy, count, flag); // send over the proper flag } - /* Checks if 'bl' should reflect back a spell cast by 'src'. type is the type of magic attack: 0: indirect (aoe), 1: direct (targeted) @@ -2213,7 +2212,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr if(csc && csc->data[SC_GRAVITATION] && csc->data[SC_GRAVITATION]->val3 == BCT_SELF ) return 0; } - + dmg = battle->calc_attack(attack_type,src,bl,skill_id,skill_lv,flag&0xFFF); //Skotlex: Adjusted to the new system @@ -2232,11 +2231,11 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr } } - if( dmg.flag&BF_MAGIC + if( dmg.flag&BF_MAGIC && (skill_id != NPC_EARTHQUAKE || (battle_config.eq_single_target_reflectable && (flag & 0xFFF) == 1)) ) { /* Need more info cause NPC_EARTHQUAKE is ground type */ // Earthquake on multiple targets is not counted as a target skill. [Inkfish] int reflecttype; - if( (dmg.damage || dmg.damage2) && (reflecttype = skill->magic_reflect(src, bl, src==dsrc)) ) { + if ((dmg.damage || dmg.damage2) && (reflecttype = skill->magic_reflect(src, bl, src==dsrc)) != 0) { //Magic reflection, switch caster/target struct block_list *tbl = bl; rmdamage = true; @@ -2406,7 +2405,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr { //bonus from SG_FRIEND [Komurka] int level; - if(sd->status.party_id>0 && (level = pc->checkskill(sd,SG_FRIEND))) + if(sd->status.party_id>0 && (level = pc->checkskill(sd,SG_FRIEND)) > 0) party->skill_check(sd, sd->status.party_id, TK_COUNTER,level); } break; @@ -2610,7 +2609,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr can_copy(tsd,copy_skill,bl)) // Split all the check into their own function [Aru] { int lv, idx = 0; - if( sc && sc->data[SC__REPRODUCE] && (lv = sc->data[SC__REPRODUCE]->val1) ) { + if (sc && sc->data[SC__REPRODUCE] && (lv = sc->data[SC__REPRODUCE]->val1) > 0) { //Level dependent and limitation. lv = min(lv,skill->get_max(copy_skill)); @@ -2731,7 +2730,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr short dir_x, dir_y; dir_x = dirx[(dir+4)%8]; dir_y = diry[(dir+4)%8]; - if( map->getcell(bl->m, bl->x+dir_x, bl->y+dir_y, CELL_CHKNOPASS) != 0 ) + if (map->getcell(bl->m, bl, bl->x + dir_x, bl->y + dir_y, CELL_CHKNOPASS) != 0) skill->addtimerskill(src, tick + 300 * ((flag&2) ? 1 : 2), bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|4); } break; @@ -2800,7 +2799,6 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr battle->drain(sd, bl, dmg.damage, dmg.damage2, tstatus->race, tstatus->mode&MD_BOSS); } - if( damage > 0 ) { /** * Post-damage effects @@ -2835,7 +2833,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr if (!(flag&2) && (skill_id == MG_COLDBOLT || skill_id == MG_FIREBOLT || skill_id == MG_LIGHTNINGBOLT) - && (sc = status->get_sc(src)) + && (sc = status->get_sc(src)) != NULL && sc->data[SC_DOUBLECASTING] && rnd() % 100 < sc->data[SC_DOUBLECASTING]->val2 ) { @@ -3374,13 +3372,13 @@ int skill_timerskill(int tid, int64 tick, int id, intptr_t data) { case WZ_METEOR: if( skl->type >= 0 ) { int x = skl->type>>16, y = skl->type&0xFFFF; - if( path->search_long(NULL, src->m, src->x, src->y, x, y, CELL_CHKWALL) ) + if( path->search_long(NULL, src, src->m, src->x, src->y, x, y, CELL_CHKWALL) ) skill->unitsetting(src,skl->skill_id,skl->skill_lv,x,y,skl->flag); - if( path->search_long(NULL, src->m, src->x, src->y, skl->x, skl->y, CELL_CHKWALL) - && !map->getcell(src->m, skl->x, skl->y, CELL_CHKLANDPROTECTOR) ) + if( path->search_long(NULL, src, src->m, src->x, src->y, skl->x, skl->y, CELL_CHKWALL) + && !map->getcell(src->m, src, skl->x, skl->y, CELL_CHKLANDPROTECTOR) ) clif->skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick); } - else if( path->search_long(NULL, src->m, src->x, src->y, skl->x, skl->y, CELL_CHKWALL) ) + else if( path->search_long(NULL, src, src->m, src->x, src->y, skl->x, skl->y, CELL_CHKWALL) ) skill->unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,skl->flag); break; case GN_CRAZYWEED_ATK: { @@ -3497,7 +3495,7 @@ int skill_activate_reverberation(struct block_list *bl, va_list ap) { struct skill_unit_group *sg; if( bl->type != BL_SKILL ) return 0; - if( su->alive && (sg = su->group) && sg->skill_id == WM_REVERBERATION && sg->unit_id == UNT_REVERBERATION ) { + if( su->alive && (sg = su->group) != NULL && sg->skill_id == WM_REVERBERATION && sg->unit_id == UNT_REVERBERATION ) { int64 tick = timer->gettick(); clif->changetraplook(bl,UNT_USED_TRAPS); map->foreachinrange(skill->trap_splash, bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, bl, tick); @@ -3724,7 +3722,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1 break; case KN_CHARGEATK: { - bool path_exists = path->search_long(NULL, src->m, src->x, src->y, bl->x, bl->y,CELL_CHKWALL); + bool path_exists = path->search_long(NULL, src, src->m, src->x, src->y, bl->x, bl->y,CELL_CHKWALL); unsigned int dist = distance_bl(src, bl); uint8 dir = map->calc_dir(bl, src->x, src->y); @@ -4044,7 +4042,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1 tx -= dirx[dir]; ty -= diry[dir]; // If target cell is a wall then break - if(map->getcell(bl->m,tx,ty,CELL_CHKWALL)) + if(map->getcell(bl->m, bl, tx, ty, CELL_CHKWALL)) break; skill->blown(src,bl,1,dir,0); // Splash around target cell, but only cells inside area; we first have to check the area is not negative @@ -4175,7 +4173,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1 for( y = src->y - range; y <= src->y + range; ++y ) for( x = src->x - range; x <= src->x + range; ++x ) { if( !map->find_skill_unit_oncell(src,x,y,SA_LANDPROTECTOR,NULL,1) ) { - if( src->type != BL_PC || map->getcell(src->m,x,y,CELL_CHKWATER) ) // non-players bypass the water requirement + if (src->type != BL_PC || map->getcell(src->m, src, x, y, CELL_CHKWATER)) // non-players bypass the water requirement count++; // natural water cell else if( (su = map->find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL,1)) != NULL || (su = map->find_skill_unit_oncell(src,x,y,NJ_SUITON,NULL,1)) != NULL ) { @@ -4492,7 +4490,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1 break; case WL_FROSTMISTY: // Doesn't deal damage through non-shootable walls. - if( path->search(NULL,src->m,src->x,src->y,bl->x,bl->y,1,CELL_CHKWALL) ) + if( path->search(NULL,src,src->m,src->x,src->y,bl->x,bl->y,1,CELL_CHKWALL) ) skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag|SD_ANIMATION); break; case WL_HELLINFERNO: @@ -4514,7 +4512,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1 break; } case RA_WUGBITE: - if( path->search(NULL,src->m,src->x,src->y,bl->x,bl->y,1,CELL_CHKNOREACH) ) { + if( path->search(NULL,src,src->m,src->x,src->y,bl->x,bl->y,1,CELL_CHKNOREACH) ) { skill->attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); }else if( sd && skill_id == RA_WUGBITE ) // Only RA_WUGBITE has the skill fail message. clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); @@ -4532,14 +4530,14 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1 struct skill_unit *su = BL_CAST(BL_SKILL,bl); struct skill_unit_group* sg; - if( su && (sg=su->group) && skill->get_inf2(sg->skill_id)&INF2_TRAP ) { + if( su && (sg=su->group) != NULL && skill->get_inf2(sg->skill_id)&INF2_TRAP ) { if( !(sg->unit_id == UNT_USED_TRAPS || (sg->unit_id == UNT_ANKLESNARE && sg->val2 != 0 )) ) { struct item item_tmp; memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = sg->item_id?sg->item_id:ITEMID_TRAP; item_tmp.identify = 1; if( item_tmp.nameid ) - map->addflooritem(&item_tmp,1,bl->m,bl->x,bl->y,0,0,0,0); + map->addflooritem(bl, &item_tmp, 1, bl->m, bl->x, bl->y, 0, 0, 0, 0); } skill->delunit(su); } @@ -4945,7 +4943,7 @@ int skill_castend_id(int tid, int64 tick, int id, intptr_t data) { } if( ud->skill_id == RA_WUGSTRIKE ){ - if( !path->search(NULL,src->m,src->x,src->y,target->x,target->y,1,CELL_CHKNOREACH)) + if( !path->search(NULL,src,src->m,src->x,src->y,target->x,target->y,1,CELL_CHKNOREACH)) break; } @@ -4999,7 +4997,7 @@ int skill_castend_id(int tid, int64 tick, int id, intptr_t data) { } if( inf&BCT_ENEMY - && (sc = status->get_sc(target)) && sc->data[SC_FOGWALL] + && (sc = status->get_sc(target)) != NULL && sc->data[SC_FOGWALL] && rnd() % 100 < 75 ) { // Fogwall makes all offensive-type targeted skills fail at 75% @@ -5037,7 +5035,7 @@ int skill_castend_id(int tid, int64 tick, int id, intptr_t data) { skill->consume_requirement(sd,ud->skill_id,ud->skill_lv,1); } #ifdef OFFICIAL_WALKPATH - if( !path->search_long(NULL, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL) ) + if( !path->search_long(NULL, src, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL) ) break; #endif if( (src->type == BL_MER || src->type == BL_HOM) && !skill->check_condition_mercenary(src, ud->skill_id, ud->skill_lv, 1) ) @@ -6744,7 +6742,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin eflag = pc->additem(sd,&item_tmp,1,LOG_TYPE_PRODUCE); if(eflag) { clif->additem(sd,0,0,eflag); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } break; @@ -6911,7 +6909,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if( dstsd ) hp = hp * (100 + pc->checkskill(dstsd,SM_RECOVERY)*10) / 100; } - if( dstsd && (i = pc->skillheal2_bonus(dstsd, skill_id)) ) { + if (dstsd && (i = pc->skillheal2_bonus(dstsd, skill_id)) != 0) { hp += hp * i / 100; sp += sp * i / 100; } @@ -7083,7 +7081,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin } clif->skill_nodamage(src,bl,TK_HIGHJUMP,skill_lv,1); - if(!map->count_oncell(src->m,x,y,BL_PC|BL_NPC|BL_MOB,0) && map->getcell(src->m,x,y,CELL_CHKREACH)) { + if (!map->count_oncell(src->m, x, y, BL_PC | BL_NPC | BL_MOB, 0) && map->getcell(src->m, src, x, y, CELL_CHKREACH)) { clif->slide(src,x,y); unit->movepos(src, x, y, 1, 0); } @@ -7449,7 +7447,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin // Mercenaries can remove any trap // Players can only remove their own traps or traps on Vs maps. - if( su && (sg = su->group) && (src->type == BL_MER || sg->src_id == src->id || map_flag_vs(bl->m)) && (skill->get_inf2(sg->skill_id)&INF2_TRAP) ) + if( su && (sg = su->group) != NULL && (src->type == BL_MER || sg->src_id == src->id || map_flag_vs(bl->m)) && (skill->get_inf2(sg->skill_id)&INF2_TRAP) ) { clif->skill_nodamage(src, bl, skill_id, skill_lv, 1); if( sd && !(sg->unit_id == UNT_USED_TRAPS || (sg->unit_id == UNT_ANKLESNARE && sg->val2 != 0 )) && sg->unit_id != UNT_THORNS_TRAP ) { @@ -7464,9 +7462,9 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = skill->dbs->db[su->group->skill_id].itemid[i]; item_tmp.identify = 1; - if( item_tmp.nameid && (success=pc->additem(sd,&item_tmp,skill->dbs->db[su->group->skill_id].amount[i],LOG_TYPE_OTHER)) ) { + if (item_tmp.nameid && (success=pc->additem(sd,&item_tmp,skill->dbs->db[su->group->skill_id].amount[i],LOG_TYPE_OTHER)) != 0) { clif->additem(sd,0,0,success); - map->addflooritem(&item_tmp,skill->dbs->db[su->group->skill_id].amount[i],sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, skill->dbs->db[su->group->skill_id].amount[i], sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } } @@ -7476,9 +7474,9 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = su->group->item_id?su->group->item_id:ITEMID_TRAP; item_tmp.identify = 1; - if( item_tmp.nameid && (flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_OTHER)) ) { + if (item_tmp.nameid && (flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_OTHER)) != 0) { clif->additem(sd,0,0,flag); - map->addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } } @@ -7492,7 +7490,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin clif->skill_nodamage(src,bl,skill_id,skill_lv,1); { struct skill_unit *su=NULL; - if((bl->type==BL_SKILL) && (su=(struct skill_unit *)bl) && (su->group) ){ + if (bl->type==BL_SKILL && (su=(struct skill_unit *)bl) != NULL && su->group != NULL) { switch(su->group->unit_id){ case UNT_ANKLESNARE: if (su->group->val2 != 0) @@ -7673,7 +7671,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin case CG_LONGINGFREEDOM: { - if (tsc && !tsce && (tsce=tsc->data[SC_DANCING]) && tsce->val4 + if (tsc && !tsce && (tsce=tsc->data[SC_DANCING]) != NULL && tsce->val4 && (tsce->val1&0xFFFF) != CG_MOONLIT) //Can't use Longing for Freedom while under Moonlight Petals. [Skotlex] { clif->skill_nodamage(src,bl,skill_id,skill_lv, @@ -7902,7 +7900,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if ((dstsd = g->member[i].sd) != NULL && sd != dstsd && !dstsd->state.autotrade && !pc_isdead(dstsd)) { if (map->list[dstsd->bl.m].flag.nowarp && !map_flag_gvg2(dstsd->bl.m)) continue; - if(map->getcell(src->m,src->x+dx[j],src->y+dy[j],CELL_CHKNOREACH)) + if (map->getcell(src->m, src, src->x + dx[j], src->y + dy[j], CELL_CHKNOREACH)) dx[j] = dy[j] = 0; pc->setpos(dstsd, map_id2index(src->m), src->x+dx[j], src->y+dy[j], CLR_RESPAWN); } @@ -9013,8 +9011,8 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if ( sd ) { int i, max; sc_start(src, bl, SC_EXPLOSIONSPIRITS, 100, skill_lv, skill->get_time(skill_id, skill_lv)); - clif->skill_nodamage(src, bl, skill_id, skill_lv, - sc_start(src, bl, type, 100, skill_lv, skill->get_time(skill_id, skill_lv))); + clif->skill_nodamage(src, bl, skill_id, skill_lv, + sc_start(src, bl, type, 100, skill_lv, skill->get_time(skill_id, skill_lv))); max = pc->getmaxspiritball(sd, 0); for ( i = 0; i < max; i++ ) pc->addspiritball(sd, skill->get_time(MO_CALLSPIRITS, skill_lv), max); @@ -9044,7 +9042,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if( !dstsd ) break; if ( sd && (dstsd->class_&MAPID_BASEMASK) != MAPID_GUNSLINGER ) { - int i, max = pc->getmaxspiritball(dstsd, 5); + int i, max = pc->getmaxspiritball(dstsd, 5); for ( i = 0; i < max; i++ ) { pc->addspiritball(dstsd, skill->get_time(MO_CALLSPIRITS, 1), max); } @@ -10460,8 +10458,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui tmpx = x - area + rnd()%(area * 2 + 1); tmpy = y - area + rnd()%(area * 2 + 1); - if( i == 0 && path->search_long(NULL, src->m, src->x, src->y, tmpx, tmpy, CELL_CHKWALL) - && !map->getcell(src->m, tmpx, tmpy, CELL_CHKLANDPROTECTOR)) + if (i == 0 && path->search_long(NULL, src, src->m, src->x, src->y, tmpx, tmpy, CELL_CHKWALL) + && !map->getcell(src->m, src, tmpx, tmpy, CELL_CHKLANDPROTECTOR)) clif->skill_poseffect(src,skill_id,skill_lv,tmpx,tmpy,tick); if( i > 0 ) @@ -11119,7 +11117,7 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_ break; case WZ_FIREPILLAR: - if( map->getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) + if (map->getcell(src->m, src, x, y, CELL_CHKLANDPROTECTOR)) return NULL; if((flag&1)!=0) limit=1000; @@ -11128,7 +11126,7 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_ case WZ_QUAGMIRE: //The target changes to "all" if used in a gvg map. [Skotlex] case AM_DEMONSTRATION: case GN_HELLS_PLANT: - if( skill_id == GN_HELLS_PLANT && map->getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) + if (skill_id == GN_HELLS_PLANT && map->getcell(src->m, src, x, y, CELL_CHKLANDPROTECTOR)) return NULL; if (map_flag_vs(src->m) && battle_config.vs_traps_bctall && (src->type&battle_config.vs_traps_bctall)) @@ -11370,7 +11368,7 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_ case SO_FIRE_INSIGNIA: case SO_WIND_INSIGNIA: case SO_EARTH_INSIGNIA: - if( map->getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) + if (map->getcell(src->m, src, x, y, CELL_CHKLANDPROTECTOR)) return NULL; break; case SO_CLOUD_KILL: @@ -11451,9 +11449,9 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_ val1 = skill_lv; val2 = 0; - if( !group->state.song_dance && !map->getcell(src->m,ux,uy,CELL_CHKREACH) ) + if (!group->state.song_dance && !map->getcell(src->m, src, ux, uy, CELL_CHKREACH)) continue; // don't place skill units on walls (except for songs/dances/encores) - if( battle_config.skill_wall_check && skill->get_unit_flag(skill_id)&UF_PATHCHECK && !path->search_long(NULL,src->m,ux,uy,x,y,CELL_CHKWALL) ) + if( battle_config.skill_wall_check && skill->get_unit_flag(skill_id)&UF_PATHCHECK && !path->search_long(NULL,src,src->m,ux,uy,x,y,CELL_CHKWALL) ) continue; // no path between cell and center of casting. switch( skill_id ) { @@ -11463,7 +11461,7 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_ break; case WZ_ICEWALL: val1 = (skill_lv <= 1) ? 500 : 200 + 200*skill_lv; - val2 = map->getcell(src->m, ux, uy, CELL_GETTYPE); + val2 = map->getcell(src->m, src, ux, uy, CELL_GETTYPE); break; case HT_LANDMINE: case MA_LANDMINE: @@ -11575,14 +11573,14 @@ int skill_unit_onplace(struct skill_unit *src, struct block_list *bl, int64 tick nullpo_ret(sg=src->group); nullpo_ret(ss=map->id2bl(sg->src_id)); - if( skill->get_type(sg->skill_id) == BF_MAGIC && map->getcell(src->bl.m, src->bl.x, src->bl.y, CELL_CHKLANDPROTECTOR) && sg->skill_id != SA_LANDPROTECTOR ) + if (skill->get_type(sg->skill_id) == BF_MAGIC && map->getcell(src->bl.m, &src->bl, src->bl.x, src->bl.y, CELL_CHKLANDPROTECTOR) && sg->skill_id != SA_LANDPROTECTOR) return 0; //AoE skills are ineffective. [Skotlex] sc = status->get_sc(bl); if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE && sg->skill_id != WL_EARTHSTRAIN ) return 0; //Hidden characters are immune to AoE skills except to these. [Skotlex] - if (sc && sc->data[SC_VACUUM_EXTREME] && map->getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) + if (sc && sc->data[SC_VACUUM_EXTREME] && map->getcell(bl->m, bl, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER); if ( sc && sc->data[SC_HOVERING] && ( sg->skill_id == SO_VACUUM_EXTREME || sg->skill_id == SO_ELECTRICWALK || sg->skill_id == SO_FIREWALK || sg->skill_id == WZ_QUAGMIRE ) ) @@ -12057,7 +12055,6 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 status->change_start(ss,bl,type,10000,sg->skill_lv,sg->group_id,0,0,skill->get_time2(sg->skill_id,sg->skill_lv),SCFLAG_NONE); break; - case UNT_MAGENTATRAP: case UNT_COBALTTRAP: case UNT_MAIZETRAP: @@ -13379,7 +13376,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id for (i=0;i<size*size;i++) { int x = sd->bl.x+(i%size-range); int y = sd->bl.y+(i/size-range); - if (map->getcell(sd->bl.m,x,y,CELL_CHKWALL)) { + if (map->getcell(sd->bl.m, &sd->bl, x, y, CELL_CHKWALL)) { clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return 0; } @@ -13831,7 +13828,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id case ST_WATER: if (sc && (sc->data[SC_DELUGE] || sc->data[SC_NJ_SUITON])) break; - if (map->getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKWATER)) + if (map->getcell(sd->bl.m, &sd->bl, sd->bl.x, sd->bl.y, CELL_CHKWATER)) break; clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return 0; @@ -13953,7 +13950,6 @@ int skill_check_condition_castbegin_unknown(struct status_change *sc, uint16 *sk return -1; } - int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv) { struct skill_condition require; struct status_data *st; @@ -15313,7 +15309,6 @@ int skill_sit (struct map_session_data *sd, int type) int range = 0, lv; nullpo_ret(sd); - if((lv = pc->checkskill(sd,RG_GANGSTER)) > 0) { flag|=1; range = skill->get_splash(RG_GANGSTER, lv); @@ -15409,7 +15404,6 @@ int skill_attack_area(struct block_list *bl, va_list ap) { flag = va_arg(ap,int); type = va_arg(ap,int); - if (skill->area_temp[1] == bl->id) //This is the target of the skill, do a full attack and skip target checks. return skill->attack(atk_type,src,dsrc,bl,skill_id,skill_lv,tick,flag); @@ -15417,7 +15411,6 @@ int skill_attack_area(struct block_list *bl, va_list ap) { || !status->check_skilluse(NULL, bl, skill_id, 2)) return 0; - switch (skill_id) { case WZ_FROSTNOVA: //Skills that don't require the animation to be removed case NPC_ACIDBREATH: @@ -15823,7 +15816,7 @@ bool skill_check_cloaking(struct block_list *bl, struct status_change_entry *sce ) { //Check for walls. int i; - ARR_FIND( 0, 8, i, map->getcell(bl->m, bl->x+dx[i], bl->y+dy[i], CELL_CHKNOPASS) != 0 ); + ARR_FIND( 0, 8, i, map->getcell(bl->m, bl, bl->x+dx[i], bl->y+dy[i], CELL_CHKNOPASS) != 0 ); if( i == 8 ) wall = false; } @@ -15884,7 +15877,7 @@ bool skill_check_camouflage(struct block_list *bl, struct status_change_entry *s if( bl->type == BL_PC ) { //Check for walls. int i; - ARR_FIND( 0, 8, i, map->getcell(bl->m, bl->x+dx[i], bl->y+dy[i], CELL_CHKNOPASS) != 0 ); + ARR_FIND( 0, 8, i, map->getcell(bl->m, bl, bl->x+dx[i], bl->y+dy[i], CELL_CHKNOPASS) != 0 ); if( i == 8 ) wall = false; } @@ -16355,7 +16348,7 @@ int skill_unit_timer_sub_onplace(struct block_list* bl, va_list ap) { nullpo_ret(group); - if( !(skill->get_inf2(group->skill_id)&(INF2_SONG_DANCE|INF2_TRAP|INF2_NOLP)) && map->getcell(su->bl.m, su->bl.x, su->bl.y, CELL_CHKLANDPROTECTOR) ) + if (!(skill->get_inf2(group->skill_id)&(INF2_SONG_DANCE|INF2_TRAP|INF2_NOLP)) && map->getcell(su->bl.m, &su->bl, su->bl.x, su->bl.y, CELL_CHKLANDPROTECTOR)) return 0; //AoE skills are ineffective. [Skotlex] if( battle->check_target(&su->bl,bl,group->target_flag) <= 0 ) @@ -16433,7 +16426,7 @@ int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) { memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = group->item_id?group->item_id:ITEMID_TRAP; item_tmp.identify = 1; - map->addflooritem(&item_tmp,1,bl->m,bl->x,bl->y,0,0,0,0); + map->addflooritem(bl, &item_tmp, 1, bl->m, bl->x, bl->y, 0, 0, 0, 0); } skill->delunit(su); } @@ -17232,7 +17225,6 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid, if(make_per < 1) make_per = 1; - if(rnd()%10000 < make_per || qty > 1){ //Success, or crafting multiple items. struct item tmp_item; memset(&tmp_item,0,sizeof(tmp_item)); @@ -17375,7 +17367,7 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid, tmp_item.amount = qty * skill->dbs->changematerial_db[i].qty[j]; if((flag = pc->additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE))) { clif->additem(sd,0,0,flag); - map->addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } k++; } @@ -17389,7 +17381,7 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid, } else if (tmp_item.amount) { //Success if((flag = pc->additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE))) { clif->additem(sd,0,0,flag); - map->addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } if( skill_id == GN_MIX_COOKING || skill_id == GN_MAKEBOMB || skill_id == GN_S_PHARMACY ) clif->msgtable_skill(sd, skill_id, MSG_SKILL_SUCCESS); @@ -17449,7 +17441,7 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid, tmp_item.identify = 1; if( pc->additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE) ) { clif->additem(sd,0,0,flag); - map->addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } clif->msgtable_skill(sd, skill_id, MSG_SKILL_FAILURE); } @@ -17506,7 +17498,7 @@ int skill_arrow_create (struct map_session_data *sd, int nameid) continue; if((flag = pc->additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE))) { clif->additem(sd,0,0,flag); - map->addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } @@ -17566,7 +17558,6 @@ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id) { } } - int skill_magicdecoy(struct map_session_data *sd, int nameid) { int x, y, i, class_, skill_id; struct mob_data *md; @@ -17590,7 +17581,6 @@ int skill_magicdecoy(struct map_session_data *sd, int nameid) { class_ = (nameid == ITEMID_BOODY_RED || nameid == ITEMID_CRYSTAL_BLUE) ? 2043 + nameid - ITEMID_BOODY_RED : (nameid == ITEMID_WIND_OF_VERDURE) ? 2046 : 2045; - md = mob->once_spawn_sub(&sd->bl, sd->bl.m, x, y, sd->status.name, class_, "", SZ_SMALL, AI_NONE); if( md ) { md->master_id = sd->bl.id; @@ -17729,7 +17719,6 @@ int skill_elementalanalysis(struct map_session_data* sd, int n, uint16 skill_lv, return 1; } - memset(&tmp_item,0,sizeof(tmp_item)); tmp_item.nameid = product; tmp_item.amount = add_amount; @@ -17739,7 +17728,7 @@ int skill_elementalanalysis(struct map_session_data* sd, int n, uint16 skill_lv, int flag = pc->additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_CONSUME); if (flag) { clif->additem(sd,0,0,flag); - map->addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + map->addflooritem(&sd->bl, &tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } @@ -17805,7 +17794,7 @@ int skill_destroy_trap(struct block_list *bl, va_list ap) { nullpo_ret(su); tick = va_arg(ap, int64); - if (su->alive && (sg = su->group) && skill->get_inf2(sg->skill_id)&INF2_TRAP) { + if (su->alive && (sg = su->group) != NULL && skill->get_inf2(sg->skill_id)&INF2_TRAP) { switch( sg->unit_id ) { case UNT_CLAYMORETRAP: case UNT_FIRINGTRAP: @@ -17978,7 +17967,6 @@ int skill_blockhomun_start(struct homun_data *hd, uint16 skill_id, int tick) { / uint16 idx = skill->get_index(skill_id); nullpo_retr (-1, hd); - if (idx == 0) return -1; @@ -18913,7 +18901,6 @@ bool skill_parse_row_reproducedb(char* split[], int column, int current) { return true; } - bool skill_parse_row_abradb(char* split[], int columns, int current) { // skill_id,DummyName,RequiredHocusPocusLevel,Rate uint16 skill_id = atoi(split[0]); diff --git a/src/map/status.c b/src/map/status.c index 4f1813af6..25c7e13dc 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1080,7 +1080,6 @@ void initDummyData(void) status->dummy.mode = MD_CANMOVE; } - //For copying a status_data structure from b to a, without overwriting current Hp and Sp static inline void status_cpy(struct status_data* a, const struct status_data* b) { @@ -1193,7 +1192,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, struct status_change_entry *sce; #ifdef DEVOTION_REFLECT_DAMAGE - if(src && (sce = sc->data[SC_DEVOTION])) { + if (src && (sce = sc->data[SC_DEVOTION]) != NULL) { struct block_list *d_bl = map->id2bl(sce->val1); if(d_bl &&((d_bl->type == BL_MER && ((TBL_MER *)d_bl)->master && ((TBL_MER *)d_bl)->master->bl.id == target->id) @@ -1589,7 +1588,7 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin //on dead characters, said checks are left to skill.c [Skotlex] if (target && status->isdead(target)) return 0; - if( src && (sc = status->get_sc(src)) && sc->data[SC_COLD] && src->type != BL_MOB) + if( src && (sc = status->get_sc(src)) != NULL && sc->data[SC_COLD] && src->type != BL_MOB) return 0; } @@ -1631,7 +1630,7 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin break; case AL_TELEPORT: //Should fail when used on top of Land Protector [Skotlex] - if (src && map->getcell(src->m, src->x, src->y, CELL_CHKLANDPROTECTOR) + if (src && map->getcell(src->m, src, src->x, src->y, CELL_CHKLANDPROTECTOR) && !(st->mode&MD_BOSS) && (src->type != BL_PC || ((TBL_PC*)src)->skillitem != skill_id)) return 0; @@ -1876,8 +1875,8 @@ int status_calc_mob_(struct mob_data* md, enum e_status_calc_opt opt) { if (md->special_state.size) flag|=2; - if( md->guardian_data && md->guardian_data->g - && (guardup_lv = guild->checkskill(md->guardian_data->g,GD_GUARDUP)) ) + if (md->guardian_data && md->guardian_data->g + && (guardup_lv = guild->checkskill(md->guardian_data->g,GD_GUARDUP)) > 0) flag|=4; if (battle_config.slaves_inherit_speed && md->master_id) @@ -1953,7 +1952,6 @@ int status_calc_mob_(struct mob_data* md, enum e_status_calc_opt opt) { mstatus->speed -= cap_value(diff, 0, mstatus->speed - 10); } - if (flag&2 && battle_config.mob_size_influence) { // change for sized monsters [Valaris] if (md->special_state.size==SZ_MEDIUM) { @@ -2456,7 +2454,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { if( data && data->script ) script->run_use_script(sd, data, 0); } - + status->calc_pc_additional(sd, opt); if( sd->pd ) { // Pet Bonus @@ -2603,7 +2601,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { if( (skill_lv = pc->checkskill(sd,WM_LESSON)) > 0 ) bstatus->max_sp += 30 * skill_lv; - // Apply relative modifiers from equipment if(sd->sprate < 0) sd->sprate = 0; @@ -2705,7 +2702,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { } if( (sd->status.weapon == W_1HAXE || sd->status.weapon == W_2HAXE) && (skill_lv = pc->checkskill(sd,NC_TRAININGAXE)) > 0 ) bstatus->hit += 3*skill_lv; - if((sd->status.weapon == W_MACE || sd->status.weapon == W_2HMACE) && ((skill_lv = pc->checkskill(sd,NC_TRAININGAXE)) > 0)) + if((sd->status.weapon == W_MACE || sd->status.weapon == W_2HMACE) && (skill_lv = pc->checkskill(sd,NC_TRAININGAXE)) > 0) bstatus->hit += 2*skill_lv; // ----- FLEE CALCULATION ----- @@ -2782,7 +2779,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { #endif bstatus->adelay = 2*bstatus->amotion; - // ----- DMOTION ----- // i = 800-bstatus->agi*4; @@ -3540,12 +3536,6 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) { st->cri = status->calc_critical(bl, sc, bst->cri, true); else st->cri = status->calc_critical(bl, sc, bst->cri + 3*(st->luk - bst->luk), true); - /** - * after status_calc_critical so the bonus is applied despite if you have or not a sc bugreport:5240 - **/ - if( bl->type == BL_PC && ((TBL_PC*)bl)->status.weapon == W_KATAR ) - st->cri <<= 1; - } if(flag&SCB_FLEE2 && bst->flee2) { @@ -5087,7 +5077,6 @@ signed short status_calc_def2(struct block_list *bl, struct status_change *sc, i #endif } - defType status_calc_mdef(struct block_list *bl, struct status_change *sc, int mdef, bool viewable) { if(!sc || !sc->count) @@ -5801,7 +5790,6 @@ unsigned char status_calc_element_lv(struct block_list *bl, struct status_change return (unsigned char)cap_value(lv,1,4); } - unsigned char status_calc_attack_element(struct block_list *bl, struct status_change *sc, int element) { if(!sc || !sc->count) @@ -7553,11 +7541,12 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if( sd ) { int i; for( i = 0; i < MAX_PC_DEVOTION; i++ ) { - if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) ) + if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL) status->change_start(bl, &tsd->bl, type, 10000, val1, val2, val3, val4, tick, SCFLAG_ALL); } - } else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) ) + } else if (bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) != NULL) { status->change_start(bl, &tsd->bl, type, 10000, val1, val2, val3, val4, tick, SCFLAG_ALL); + } } //val4 signals infinite endure (if val4 == 2 it is infinite endure from Berserk) if( val4 ) @@ -7652,11 +7641,12 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if( sd ) { int i; for( i = 0; i < MAX_PC_DEVOTION; i++ ) { - if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) ) + if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL) status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); } - } else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) ) + } else if (bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) != NULL) { status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); + } } break; case SC_NOEQUIPWEAPON: @@ -7910,12 +7900,13 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t if( bl->type&(BL_PC|BL_MER) ) { if( sd ) { for( i = 0; i < MAX_PC_DEVOTION; i++ ) { - if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) ) + if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL) status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); } } - else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) ) + else if (bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) != NULL) { status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL); + } } } break; @@ -7931,7 +7922,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t int i; for (i = 0; i < MAX_PC_DEVOTION; i++) { //See if there are devoted characters, and pass the status to them. [Skotlex] - if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i]))) + if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL) status->change_start(bl, &tsd->bl,type,10000,val1,5+val1*5,val3,val4,tick,SCFLAG_NOAVOID); } } @@ -8068,7 +8059,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t struct block_list *d_bl; struct status_change *d_sc; - if ((d_bl = map->id2bl(val1)) && (d_sc = status->get_sc(d_bl)) && d_sc->count) { + if ((d_bl = map->id2bl(val1)) && (d_sc = status->get_sc(d_bl)) != NULL && d_sc->count) { // Inherits Status From Source const enum sc_type types[] = { SC_AUTOGUARD, SC_DEFENDER, SC_REFLECTSHIELD, SC_ENDURE }; int i = (map_flag_gvg(bl->m) || map->list[bl->m].flag.battleground)?2:3; @@ -8970,6 +8961,9 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t { int hp = status_get_hp(bl), sp = status_get_sp(bl), lv = 5; + if (sp < 1) sp = 1; + if (hp < 1) hp = 1; + if( rnd()%100 > (25 + 10 * val1) - status_get_int(bl) / 2) return 0; @@ -9531,12 +9525,12 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t ++(sc->count); sce = sc->data[type] = ers_alloc(status->data_ers, struct status_change_entry); } - + sce->val1 = val1; sce->val2 = val2; sce->val3 = val3; sce->val4 = val4; - + if (tick >= 0) { sce->timer = timer->add(timer->gettick() + tick, status->change_timer, bl->id, type); sce->infinite_duration = false; @@ -9727,7 +9721,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const return 0; st = status->get_status_data(bl); - + if( sd && sce->infinite_duration && !sd->state.loggingout ) chrif->del_scdata_single(sd->status.account_id,sd->status.char_id,type); @@ -9823,7 +9817,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const // Clear Status from others int i; for( i = 0; i < MAX_PC_DEVOTION; i++ ) { - if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) && tsd->sc.data[type] ) + if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) != NULL && tsd->sc.data[type]) status_change_end(&tsd->bl, type, INVALID_TIMER); } } else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag ) { @@ -9884,7 +9878,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const sd->delunit_prevline = line; } - if (sce->val4 && sce->val4 != BCT_SELF && (dsd=map->id2sd(sce->val4))) { + if (sce->val4 && sce->val4 != BCT_SELF && (dsd=map->id2sd(sce->val4)) != NULL) { // end status on partner as well dsc = dsd->sc.data[SC_DANCING]; if (dsc) { @@ -9909,7 +9903,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const } sce->val2 = 0; - + if( group ) skill->del_unitgroup(group,ALC_MARK); } @@ -10073,7 +10067,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const struct block_list *tbl = map->id2bl(sce->val2); struct status_change *tsc = NULL; sce->val2 = 0; - if( tbl && (tsc = status->get_sc(tbl)) && tsc->data[SC_STOP] && tsc->data[SC_STOP]->val2 == bl->id ) + if (tbl && (tsc = status->get_sc(tbl)) != NULL && tsc->data[SC_STOP] && tsc->data[SC_STOP]->val2 == bl->id) status_change_end(tbl, SC_STOP, INVALID_TIMER); } break; @@ -10438,7 +10432,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const skill->unit_move(bl,timer->gettick(),1); if (opt_flag & 2 && sd) { - if (map->getcell(bl->m,bl->x,bl->y,CELL_CHKNPC)) + if (map->getcell(bl->m, bl, bl->x, bl->y, CELL_CHKNPC)) npc->touch_areanpc(sd,bl->m,bl->x,bl->y); //Trigger on-touch event. else npc->untouch_areanpc(sd, bl->m, bl->x, bl->y); @@ -10455,10 +10449,7 @@ int kaahi_heal_timer(int tid, int64 tick, int id, intptr_t data) { struct status_data *st; int hp; - if(!( (bl=map->id2bl(id)) - && (sc=status->get_sc(bl)) - && (sce=sc->data[SC_KAAHI]) - )) + if ((bl=map->id2bl(id)) == NULL || (sc=status->get_sc(bl)) == NULL || (sce=sc->data[SC_KAAHI]) == NULL) return 0; if(sce->val4 != tid) { @@ -10502,7 +10493,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) { sc = status->get_sc(bl); st = status->get_status_data(bl); - if (!(sc && (sce = sc->data[type]))) { + if (!sc || (sce = sc->data[type]) == NULL) { ShowDebug("status_change_timer: Null pointer id: %d data: %"PRIdPTR" bl-type: %d\n", id, data, bl->type); return 0; } @@ -10511,7 +10502,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) { ShowError("status_change_timer: Mismatch for type %d: %d != %d (bl id %d)\n",type,tid,sce->timer, bl->id); return 0; } - + sce->timer = INVALID_TIMER; sd = BL_CAST(BL_PC, bl); @@ -10949,15 +10940,14 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) { int heal = st->max_hp * 3 / 100; if (sc->count && sc->data[SC_AKAITSUKI] && heal) heal = ~heal + 1; - + map->freeblock_lock(); - status->heal(bl, heal, 0, 2); if( sc->data[type] ) { sc_timer_next(5000 + tick, status->change_timer, bl->id, data); } map->freeblock_unlock(); - + return 0; } break; @@ -11116,7 +11106,6 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) { } break; - case SC_SATURDAY_NIGHT_FEVER: if( --(sce->val3) >= 0 ) { if( !status->charge(bl, st->max_hp * 1 / 100, st->max_sp * 1 / 100) ) @@ -11657,7 +11646,7 @@ int status_change_clear_buffs (struct block_list* bl, int type) { return 0; map->freeblock_lock(); - + if (type&6) //Debuffs for (i = SC_COMMON_MIN; i <= SC_COMMON_MAX; i++) status_change_end(bl, (sc_type)i, INVALID_TIMER); @@ -11704,9 +11693,9 @@ int status_change_clear_buffs (struct block_list* bl, int type) { } status_change_end(bl, (sc_type)i, INVALID_TIMER); } - + map->freeblock_unlock(); - + return 0; } @@ -11839,7 +11828,7 @@ int status_natural_heal(struct block_list* bl, va_list args) { if (flag&(RGN_SHP|RGN_SSP) && regen->ssregen - && (vd = status->get_viewdata(bl)) + && (vd = status->get_viewdata(bl)) != NULL && vd->dead_sit == 2 ) { //Apply sitting regen bonus. @@ -12172,7 +12161,7 @@ void status_read_job_db_sub(int idx, const char *name, config_setting_t *jdb) if ((temp = libconfig->setting_get_member(jdb, "HPTable"))) { int level = 0, avg_increment, base; config_setting_t *hp = NULL; - while (level <= MAX_LEVEL && (hp = libconfig->setting_get_elem(temp, level))) { + while (level <= MAX_LEVEL && (hp = libconfig->setting_get_elem(temp, level)) != NULL) { i32 = libconfig->setting_get_int(hp); status->dbs->HP_table[idx][++level] = min(i32, battle_config.max_hp); } @@ -12192,7 +12181,7 @@ void status_read_job_db_sub(int idx, const char *name, config_setting_t *jdb) if ((temp = libconfig->setting_get_member(jdb, "SPTable"))) { int level = 0, avg_increment, base; config_setting_t *sp = NULL; - while (level <= MAX_LEVEL && (sp = libconfig->setting_get_elem(temp, level))) { + while (level <= MAX_LEVEL && (sp = libconfig->setting_get_elem(temp, level)) != NULL) { i32 = libconfig->setting_get_int(sp); status->dbs->SP_table[idx][++level] = min(i32, battle_config.max_sp); } @@ -12221,11 +12210,10 @@ void status_read_job_db(void) { /* [malufett/Hercules] */ int i = 0; config_t job_db_conf; config_setting_t *jdb = NULL; - const char *config_filename = #ifdef RENEWAL_ASPD - "db/re/job_db.conf"; + const char *config_filename = "db/re/job_db.conf"; #else - "db/pre-re/job_db.conf"; + const char *config_filename = "db/pre-re/job_db.conf"; #endif if ( libconfig->read_file(&job_db_conf, config_filename) ) { diff --git a/src/map/unit.c b/src/map/unit.c index 33360584a..04a8befc2 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -98,11 +98,11 @@ int unit_walktoxy_sub(struct block_list *bl) memset(&wpd, 0, sizeof(wpd)); - if( !path->search(&wpd,bl->m,bl->x,bl->y,ud->to_x,ud->to_y,ud->state.walk_easy,CELL_CHKNOPASS) ) + if( !path->search(&wpd,bl,bl->m,bl->x,bl->y,ud->to_x,ud->to_y,ud->state.walk_easy,CELL_CHKNOPASS) ) return 0; #ifdef OFFICIAL_WALKPATH - if( !path->search_long(NULL, bl->m, bl->x, bl->y, ud->to_x, ud->to_y, CELL_CHKNOPASS) // Check if there is an obstacle between + if( !path->search_long(NULL, bl, bl->m, bl->x, bl->y, ud->to_x, ud->to_y, CELL_CHKNOPASS) // Check if there is an obstacle between && wpd.path_len > 14 // Official number of walkable cells is 14 if and only if there is an obstacle between. [malufett] && (bl->type != BL_NPC) ) // If type is a NPC, please disregard. return 0; @@ -268,13 +268,13 @@ int unit_walktoxy_timer(int tid, int64 tick, int id, intptr_t data) { icewall_walk_block = 0; //Monsters will walk into an icewall from the west and south if they already started walking - if(map->getcell(bl->m,x+dx,y+dy,CELL_CHKNOPASS) - && (icewall_walk_block == 0 || !map->getcell(bl->m,x+dx,y+dy,CELL_CHKICEWALL) || dx < 0 || dy < 0)) + if (map->getcell(bl->m, bl, x + dx, y + dy, CELL_CHKNOPASS) + && (icewall_walk_block == 0 || !map->getcell(bl->m, bl, x + dx, y + dy, CELL_CHKICEWALL) || dx < 0 || dy < 0)) return unit->walktoxy_sub(bl); //Monsters can only leave icewalls to the west and south //But if movement fails more than icewall_walk_block times, they can ignore this rule - if(md && md->walktoxy_fail_count < icewall_walk_block && map->getcell(bl->m,x,y,CELL_CHKICEWALL) && (dx > 0 || dy > 0)) { + if (md && md->walktoxy_fail_count < icewall_walk_block && map->getcell(bl->m, bl, x, y, CELL_CHKICEWALL) && (dx > 0 || dy > 0)) { //Needs to be done here so that rudeattack skills are invoked md->walktoxy_fail_count++; clif->fixpos(bl); @@ -306,7 +306,7 @@ int unit_walktoxy_timer(int tid, int64 tick, int id, intptr_t data) { if(sd) { if( sd->touching_id ) npc->touchnext_areanpc(sd,false); - if(map->getcell(bl->m,x,y,CELL_CHKNPC)) { + if (map->getcell(bl->m, bl, x, y, CELL_CHKNPC)) { npc->touch_areanpc(sd,bl->m,x,y); if (bl->prev == NULL) //Script could have warped char, abort remaining of the function. return 0; @@ -338,7 +338,7 @@ int unit_walktoxy_timer(int tid, int64 tick, int id, intptr_t data) { } else if (md) { //Movement was successful, reset walktoxy_fail_count md->walktoxy_fail_count = 0; - if( map->getcell(bl->m,x,y,CELL_CHKNPC) ) { + if (map->getcell(bl->m, bl, x, y, CELL_CHKNPC)) { if( npc->touch_areanpc2(md) ) return 0; // Warped } else md->areanpc_id = 0; @@ -494,14 +494,14 @@ int unit_walktoxy( struct block_list *bl, short x, short y, int flag) if( ud == NULL) return 0; - if (battle_config.check_occupied_cells && (flag&8) && !map->closest_freecell(bl->m, &x, &y, BL_CHAR|BL_NPC, 1)) //This might change x and y + if (battle_config.check_occupied_cells && (flag&8) && !map->closest_freecell(bl->m, bl, &x, &y, BL_CHAR|BL_NPC, 1)) //This might change x and y return 0; - if (!path->search(&wpd, bl->m, bl->x, bl->y, x, y, flag&1, CELL_CHKNOPASS)) // Count walk path cells + if (!path->search(&wpd, bl, bl->m, bl->x, bl->y, x, y, flag&1, CELL_CHKNOPASS)) // Count walk path cells return 0; #ifdef OFFICIAL_WALKPATH - if( !path->search_long(NULL, bl->m, bl->x, bl->y, x, y, CELL_CHKNOPASS) // Check if there is an obstacle between + if( !path->search_long(NULL, bl, bl->m, bl->x, bl->y, x, y, CELL_CHKNOPASS) // Check if there is an obstacle between && (wpd.path_len > (battle_config.max_walk_path/17)*14) // Official number of walkable cells is 14 if and only if there is an obstacle between. [malufett] && (bl->type != BL_NPC) ) // If type is a NPC, please disregard. return 0; @@ -683,7 +683,7 @@ bool unit_run( struct block_list *bl, struct map_session_data *sd, enum sc_type // Search for available path for(i = 0; i < AREA_SIZE; i++) { - if(!map->getcell(bl->m,to_x+dir_x,to_y+dir_y,CELL_CHKPASS)) + if (!map->getcell(bl->m, bl, to_x + dir_x, to_y + dir_y, CELL_CHKPASS)) break; //if sprinting and there's a PC/Mob/NPC, block the path [Kevin] @@ -720,7 +720,7 @@ bool unit_run( struct block_list *bl, struct map_session_data *sd, enum sc_type //Makes bl attempt to run dist cells away from target. Uses hard-paths. int unit_escape(struct block_list *bl, struct block_list *target, short dist) { uint8 dir = map->calc_dir(target, bl->x, bl->y); - while( dist > 0 && map->getcell(bl->m, bl->x + dist*dirx[dir], bl->y + dist*diry[dir], CELL_CHKNOREACH) ) + while (dist > 0 && map->getcell(bl->m, bl, bl->x + dist * dirx[dir], bl->y + dist * diry[dir], CELL_CHKNOREACH)) dist--; return ( dist > 0 && unit->walktoxy(bl, bl->x + dist*dirx[dir], bl->y + dist*diry[dir], 0) ); } @@ -741,7 +741,7 @@ int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS); unit->stop_attack(bl); - if( checkpath && (map->getcell(bl->m,dst_x,dst_y,CELL_CHKNOPASS) || !path->search(NULL,bl->m,bl->x,bl->y,dst_x,dst_y,easy,CELL_CHKNOREACH)) ) + if (checkpath && (map->getcell(bl->m, bl, dst_x, dst_y, CELL_CHKNOPASS) || !path->search(NULL, bl, bl->m, bl->x, bl->y, dst_x, dst_y, easy, CELL_CHKNOREACH)) ) return 0; // unreachable ud->to_x = dst_x; @@ -764,7 +764,7 @@ int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool if(sd) { if( sd->touching_id ) npc->touchnext_areanpc(sd,false); - if(map->getcell(bl->m,bl->x,bl->y,CELL_CHKNPC)) { + if (map->getcell(bl->m, bl, bl->x, bl->y, CELL_CHKNPC)) { npc->touch_areanpc(sd,bl->m,bl->x,bl->y); if (bl->prev == NULL) //Script could have warped char, abort remaining of the function. return 0; @@ -775,7 +775,7 @@ int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool { // Check if pet needs to be teleported. [Skotlex] int flag = 0; struct block_list* pbl = &sd->pd->bl; - if( !checkpath && !path->search(NULL,pbl->m,pbl->x,pbl->y,dst_x,dst_y,0,CELL_CHKNOPASS) ) + if( !checkpath && !path->search(NULL,pbl,pbl->m,pbl->x,pbl->y,dst_x,dst_y,0,CELL_CHKNOPASS) ) flag = 1; else if (!check_distance_bl(&sd->bl, pbl, AREA_SIZE)) //Too far, teleport. flag = 2; @@ -829,7 +829,7 @@ int unit_blown(struct block_list* bl, int dx, int dy, int count, int flag) sd = BL_CAST(BL_PC, bl); su = BL_CAST(BL_SKILL, bl); - result = path->blownpos(bl->m, bl->x, bl->y, dx, dy, count); + result = path->blownpos(bl, bl->m, bl->x, bl->y, dx, dy, count); nx = result>>16; ny = result&0xffff; @@ -866,7 +866,7 @@ int unit_blown(struct block_list* bl, int dx, int dy, int count, int flag) if(sd->touching_id) { npc->touchnext_areanpc(sd, false); } - if(map->getcell(bl->m, bl->x, bl->y, CELL_CHKNPC)) { + if (map->getcell(bl->m, bl, bl->x, bl->y, CELL_CHKNPC)) { npc->touch_areanpc(sd, bl->m, bl->x, bl->y); } else { npc->untouch_areanpc(sd, bl->m, bl->x, bl->y);; @@ -919,7 +919,7 @@ int unit_warp(struct block_list *bl,short m,short x,short y,clr_type type) return 2; } - } else if (map->getcell(m,x,y,CELL_CHKNOREACH)) { + } else if (map->getcell(m, bl, x, y, CELL_CHKNOREACH)) { //Invalid target cell ShowWarning("unit_warp: Specified non-walkable target cell: %d (%s) at [%d,%d]\n", m, map->list[m].name, x,y); @@ -1104,8 +1104,8 @@ int unit_can_move(struct block_list *bl) { // Icewall walk block special trapped monster mode if(bl->type == BL_MOB) { struct mob_data *md = BL_CAST(BL_MOB, bl); - if(md && ((md->status.mode&MD_BOSS && battle_config.boss_icewall_walk_block == 1 && map->getcell(bl->m,bl->x,bl->y,CELL_CHKICEWALL)) - || (!(md->status.mode&MD_BOSS) && battle_config.mob_icewall_walk_block == 1 && map->getcell(bl->m,bl->x,bl->y,CELL_CHKICEWALL)))) { + if (md && ((md->status.mode&MD_BOSS && battle_config.boss_icewall_walk_block == 1 && map->getcell(bl->m, bl, bl->x, bl->y, CELL_CHKICEWALL)) + || (!(md->status.mode&MD_BOSS) && battle_config.mob_icewall_walk_block == 1 && map->getcell(bl->m, bl, bl->x, bl->y, CELL_CHKICEWALL)))) { md->walktoxy_fail_count = 1; //Make sure rudeattacked skills are invoked return 0; } @@ -1651,14 +1651,14 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui * "WHY IS IT HEREE": ice wall cannot be canceled past this point, the client displays the animation even, * if we cancel it from castend_pos, so it has to be here for it to not display the animation. **/ - if ( skill_id == WZ_ICEWALL && map->getcell(src->m, skill_x, skill_y, CELL_CHKNOICEWALL) ) + if (skill_id == WZ_ICEWALL && map->getcell(src->m, src, skill_x, skill_y, CELL_CHKNOICEWALL)) return 0; } if (!status->check_skilluse(src, NULL, skill_id, 0)) return 0; - if( map->getcell(src->m, skill_x, skill_y, CELL_CHKWALL) ) { + if (map->getcell(src->m, src, skill_x, skill_y, CELL_CHKWALL)) { // can't cast ground targeted spells on wall cells if (sd) clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return 0; @@ -1765,10 +1765,10 @@ int unit_set_target(struct unit_data* ud, int target_id) if (ud->target != target_id) { struct unit_data * ux; struct block_list* target; - if( ud->target && (target = map->id2bl(ud->target)) && (ux = unit->bl2ud(target)) && ux->target_count > 0 ) - ux->target_count --; - if( target_id && (target = map->id2bl(target_id)) && (ux = unit->bl2ud(target)) ) - ux->target_count ++; + if (ud->target && (target = map->id2bl(ud->target)) != NULL && (ux = unit->bl2ud(target)) != NULL && ux->target_count > 0) + --ux->target_count; + if (target_id && (target = map->id2bl(target_id)) != NULL && (ux = unit->bl2ud(target)) != NULL) + ++ux->target_count; } ud->target = target_id; @@ -1940,7 +1940,7 @@ bool unit_can_reach_pos(struct block_list *bl,int x,int y, int easy) if (bl->x == x && bl->y == y) //Same place return true; - return path->search(NULL,bl->m,bl->x,bl->y,x,y,easy,CELL_CHKNOREACH); + return path->search(NULL,bl,bl->m,bl->x,bl->y,x,y,easy,CELL_CHKNOREACH); } /*========================================== @@ -1967,10 +1967,10 @@ bool unit_can_reach_bl(struct block_list *bl,struct block_list *tbl, int range, dx=(dx>0)?1:((dx<0)?-1:0); dy=(dy>0)?1:((dy<0)?-1:0); - if (map->getcell(tbl->m,tbl->x-dx,tbl->y-dy,CELL_CHKNOPASS)) { + if (map->getcell(tbl->m, bl, tbl->x - dx, tbl->y - dy, CELL_CHKNOPASS)) { int i; //Look for a suitable cell to place in. - for(i=0;i<8 && map->getcell(tbl->m,tbl->x-dirx[i],tbl->y-diry[i],CELL_CHKNOPASS);i++); + for (i=0;i<8 && map->getcell(tbl->m, bl, tbl->x - dirx[i], tbl->y - diry[i], CELL_CHKNOPASS); i++); if (i==8) return false; //No valid cells. dx = dirx[i]; dy = diry[i]; @@ -1978,7 +1978,7 @@ bool unit_can_reach_bl(struct block_list *bl,struct block_list *tbl, int range, if (x) *x = tbl->x-dx; if (y) *y = tbl->y-dy; - return path->search(NULL,bl->m,bl->x,bl->y,tbl->x-dx,tbl->y-dy,easy,CELL_CHKNOREACH); + return path->search(NULL,bl,bl->m,bl->x,bl->y,tbl->x-dx,tbl->y-dy,easy,CELL_CHKNOREACH); } /*========================================== * Calculates position of Pet/Mercenary/Homunculus/Elemental @@ -2064,7 +2064,7 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick) { if( status->isdead(src) || status->isdead(target) || battle->check_target(src,target,BCT_ENEMY) <= 0 || !status->check_skilluse(src, target, 0, 0) #ifdef OFFICIAL_WALKPATH - || !path->search_long(NULL, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL) + || !path->search_long(NULL, src, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL) #endif || (sd && !pc->can_attack(sd, ud->target) ) ) @@ -2099,7 +2099,7 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick) { range = sstatus->rhw.range; if( (unit->is_walking(target) || ud->state.step_attack) - && (target->type == BL_PC || !map->getcell(target->m,target->x,target->y,CELL_CHKICEWALL)) ) + && (target->type == BL_PC || !map->getcell(target->m, src, target->x, target->y, CELL_CHKICEWALL))) range++; // Extra range when chasing (does not apply to mobs locked in an icewall) if(sd && !check_distance_client_bl(src,target,range)) { @@ -2268,7 +2268,7 @@ void unit_dataset(struct block_list *bl) { int unit_counttargeted(struct block_list* bl) { struct unit_data* ud; - if( bl && (ud = unit->bl2ud(bl)) ) + if (bl && (ud = unit->bl2ud(bl)) != NULL) return ud->target_count; return 0; } diff --git a/src/plugins/HPMHooking.c b/src/plugins/HPMHooking.c index 19d7ae2c5..e5483da5b 100644 --- a/src/plugins/HPMHooking.c +++ b/src/plugins/HPMHooking.c @@ -152,11 +152,10 @@ HPExport const char *Hooked (bool *fr) { return NULL; } - HPExport bool HPM_Plugin_AddHook(enum HPluginHookType type, const char *target, void *hook, unsigned int pID) { struct HookingPointData *hpd; - if( hp_db && (hpd = strdb_get(hp_db,target)) ) { + if (hp_db && (hpd = strdb_get(hp_db,target)) != NULL) { struct HPMHookPoint **hp = NULL; int *count = NULL; @@ -230,4 +229,3 @@ void HPM_HP_load(void) { #include HPM_SOURCES_INCLUDE } - diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc index bf1aee21b..f36d91718 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc @@ -57,6 +57,10 @@ struct { struct HPMHookPoint *HP_atcommand_cleanfloor_sub_post; struct HPMHookPoint *HP_atcommand_mutearea_sub_pre; struct HPMHookPoint *HP_atcommand_mutearea_sub_post; + struct HPMHookPoint *HP_atcommand_getring_pre; + struct HPMHookPoint *HP_atcommand_getring_post; + struct HPMHookPoint *HP_atcommand_channel_help_pre; + struct HPMHookPoint *HP_atcommand_channel_help_post; struct HPMHookPoint *HP_atcommand_commands_sub_pre; struct HPMHookPoint *HP_atcommand_commands_sub_post; struct HPMHookPoint *HP_atcommand_cmd_db_clear_pre; @@ -493,6 +497,8 @@ struct { struct HPMHookPoint *HP_clif_send_actual_post; struct HPMHookPoint *HP_clif_parse_pre; struct HPMHookPoint *HP_clif_parse_post; + struct HPMHookPoint *HP_clif_packet_pre; + struct HPMHookPoint *HP_clif_packet_post; struct HPMHookPoint *HP_clif_parse_cmd_pre; struct HPMHookPoint *HP_clif_parse_cmd_post; struct HPMHookPoint *HP_clif_decrypt_cmd_pre; @@ -517,6 +523,10 @@ struct { struct HPMHookPoint *HP_clif_delitem_post; struct HPMHookPoint *HP_clif_takeitem_pre; struct HPMHookPoint *HP_clif_takeitem_post; + struct HPMHookPoint *HP_clif_item_equip_pre; + struct HPMHookPoint *HP_clif_item_equip_post; + struct HPMHookPoint *HP_clif_item_normal_pre; + struct HPMHookPoint *HP_clif_item_normal_post; struct HPMHookPoint *HP_clif_arrowequip_pre; struct HPMHookPoint *HP_clif_arrowequip_post; struct HPMHookPoint *HP_clif_arrow_fail_pre; @@ -4229,6 +4239,8 @@ struct { struct HPMHookPoint *HP_pc_autotrade_prepare_post; struct HPMHookPoint *HP_pc_autotrade_populate_pre; struct HPMHookPoint *HP_pc_autotrade_populate_post; + struct HPMHookPoint *HP_pc_autotrade_final_pre; + struct HPMHookPoint *HP_pc_autotrade_final_post; struct HPMHookPoint *HP_pc_check_job_name_pre; struct HPMHookPoint *HP_pc_check_job_name_post; struct HPMHookPoint *HP_pet_init_pre; @@ -4371,6 +4383,22 @@ struct { struct HPMHookPoint *HP_script_push_val_post; struct HPMHookPoint *HP_script_get_val_pre; struct HPMHookPoint *HP_script_get_val_post; + struct HPMHookPoint *HP_script_get_val_ref_str_pre; + struct HPMHookPoint *HP_script_get_val_ref_str_post; + struct HPMHookPoint *HP_script_get_val_scope_str_pre; + struct HPMHookPoint *HP_script_get_val_scope_str_post; + struct HPMHookPoint *HP_script_get_val_npc_str_pre; + struct HPMHookPoint *HP_script_get_val_npc_str_post; + struct HPMHookPoint *HP_script_get_val_instance_str_pre; + struct HPMHookPoint *HP_script_get_val_instance_str_post; + struct HPMHookPoint *HP_script_get_val_ref_num_pre; + struct HPMHookPoint *HP_script_get_val_ref_num_post; + struct HPMHookPoint *HP_script_get_val_scope_num_pre; + struct HPMHookPoint *HP_script_get_val_scope_num_post; + struct HPMHookPoint *HP_script_get_val_npc_num_pre; + struct HPMHookPoint *HP_script_get_val_npc_num_post; + struct HPMHookPoint *HP_script_get_val_instance_num_pre; + struct HPMHookPoint *HP_script_get_val_instance_num_post; struct HPMHookPoint *HP_script_get_val2_pre; struct HPMHookPoint *HP_script_get_val2_post; struct HPMHookPoint *HP_script_push_str_pre; @@ -4501,6 +4529,22 @@ struct { struct HPMHookPoint *HP_script_errorwarning_sub_post; struct HPMHookPoint *HP_script_set_reg_pre; struct HPMHookPoint *HP_script_set_reg_post; + struct HPMHookPoint *HP_script_set_reg_ref_str_pre; + struct HPMHookPoint *HP_script_set_reg_ref_str_post; + struct HPMHookPoint *HP_script_set_reg_scope_str_pre; + struct HPMHookPoint *HP_script_set_reg_scope_str_post; + struct HPMHookPoint *HP_script_set_reg_npc_str_pre; + struct HPMHookPoint *HP_script_set_reg_npc_str_post; + struct HPMHookPoint *HP_script_set_reg_instance_str_pre; + struct HPMHookPoint *HP_script_set_reg_instance_str_post; + struct HPMHookPoint *HP_script_set_reg_ref_num_pre; + struct HPMHookPoint *HP_script_set_reg_ref_num_post; + struct HPMHookPoint *HP_script_set_reg_scope_num_pre; + struct HPMHookPoint *HP_script_set_reg_scope_num_post; + struct HPMHookPoint *HP_script_set_reg_npc_num_pre; + struct HPMHookPoint *HP_script_set_reg_npc_num_post; + struct HPMHookPoint *HP_script_set_reg_instance_num_pre; + struct HPMHookPoint *HP_script_set_reg_instance_num_post; struct HPMHookPoint *HP_script_stack_expand_pre; struct HPMHookPoint *HP_script_stack_expand_post; struct HPMHookPoint *HP_script_push_retinfo_pre; @@ -5772,6 +5816,10 @@ struct { int HP_atcommand_cleanfloor_sub_post; int HP_atcommand_mutearea_sub_pre; int HP_atcommand_mutearea_sub_post; + int HP_atcommand_getring_pre; + int HP_atcommand_getring_post; + int HP_atcommand_channel_help_pre; + int HP_atcommand_channel_help_post; int HP_atcommand_commands_sub_pre; int HP_atcommand_commands_sub_post; int HP_atcommand_cmd_db_clear_pre; @@ -6208,6 +6256,8 @@ struct { int HP_clif_send_actual_post; int HP_clif_parse_pre; int HP_clif_parse_post; + int HP_clif_packet_pre; + int HP_clif_packet_post; int HP_clif_parse_cmd_pre; int HP_clif_parse_cmd_post; int HP_clif_decrypt_cmd_pre; @@ -6232,6 +6282,10 @@ struct { int HP_clif_delitem_post; int HP_clif_takeitem_pre; int HP_clif_takeitem_post; + int HP_clif_item_equip_pre; + int HP_clif_item_equip_post; + int HP_clif_item_normal_pre; + int HP_clif_item_normal_post; int HP_clif_arrowequip_pre; int HP_clif_arrowequip_post; int HP_clif_arrow_fail_pre; @@ -9944,6 +9998,8 @@ struct { int HP_pc_autotrade_prepare_post; int HP_pc_autotrade_populate_pre; int HP_pc_autotrade_populate_post; + int HP_pc_autotrade_final_pre; + int HP_pc_autotrade_final_post; int HP_pc_check_job_name_pre; int HP_pc_check_job_name_post; int HP_pet_init_pre; @@ -10086,6 +10142,22 @@ struct { int HP_script_push_val_post; int HP_script_get_val_pre; int HP_script_get_val_post; + int HP_script_get_val_ref_str_pre; + int HP_script_get_val_ref_str_post; + int HP_script_get_val_scope_str_pre; + int HP_script_get_val_scope_str_post; + int HP_script_get_val_npc_str_pre; + int HP_script_get_val_npc_str_post; + int HP_script_get_val_instance_str_pre; + int HP_script_get_val_instance_str_post; + int HP_script_get_val_ref_num_pre; + int HP_script_get_val_ref_num_post; + int HP_script_get_val_scope_num_pre; + int HP_script_get_val_scope_num_post; + int HP_script_get_val_npc_num_pre; + int HP_script_get_val_npc_num_post; + int HP_script_get_val_instance_num_pre; + int HP_script_get_val_instance_num_post; int HP_script_get_val2_pre; int HP_script_get_val2_post; int HP_script_push_str_pre; @@ -10216,6 +10288,22 @@ struct { int HP_script_errorwarning_sub_post; int HP_script_set_reg_pre; int HP_script_set_reg_post; + int HP_script_set_reg_ref_str_pre; + int HP_script_set_reg_ref_str_post; + int HP_script_set_reg_scope_str_pre; + int HP_script_set_reg_scope_str_post; + int HP_script_set_reg_npc_str_pre; + int HP_script_set_reg_npc_str_post; + int HP_script_set_reg_instance_str_pre; + int HP_script_set_reg_instance_str_post; + int HP_script_set_reg_ref_num_pre; + int HP_script_set_reg_ref_num_post; + int HP_script_set_reg_scope_num_pre; + int HP_script_set_reg_scope_num_post; + int HP_script_set_reg_npc_num_pre; + int HP_script_set_reg_npc_num_post; + int HP_script_set_reg_instance_num_pre; + int HP_script_set_reg_instance_num_post; int HP_script_stack_expand_pre; int HP_script_stack_expand_post; int HP_script_push_retinfo_pre; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc index d9d8dc230..dacb51580 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc @@ -33,6 +33,8 @@ struct HookingPointData HookingPoints[] = { { HP_POP(atcommand->get_jail_time, HP_atcommand_get_jail_time) }, { HP_POP(atcommand->cleanfloor_sub, HP_atcommand_cleanfloor_sub) }, { HP_POP(atcommand->mutearea_sub, HP_atcommand_mutearea_sub) }, + { HP_POP(atcommand->getring, HP_atcommand_getring) }, + { HP_POP(atcommand->channel_help, HP_atcommand_channel_help) }, { HP_POP(atcommand->commands_sub, HP_atcommand_commands_sub) }, { HP_POP(atcommand->cmd_db_clear, HP_atcommand_cmd_db_clear) }, { HP_POP(atcommand->cmd_db_clear_sub, HP_atcommand_cmd_db_clear_sub) }, @@ -258,6 +260,7 @@ struct HookingPointData HookingPoints[] = { { HP_POP(clif->send_sub, HP_clif_send_sub) }, { HP_POP(clif->send_actual, HP_clif_send_actual) }, { HP_POP(clif->parse, HP_clif_parse) }, + { HP_POP(clif->packet, HP_clif_packet) }, { HP_POP(clif->parse_cmd, HP_clif_parse_cmd) }, { HP_POP(clif->decrypt_cmd, HP_clif_decrypt_cmd) }, { HP_POP(clif->authok, HP_clif_authok) }, @@ -270,6 +273,8 @@ struct HookingPointData HookingPoints[] = { { HP_POP(clif->dropitem, HP_clif_dropitem) }, { HP_POP(clif->delitem, HP_clif_delitem) }, { HP_POP(clif->takeitem, HP_clif_takeitem) }, + { HP_POP(clif->item_equip, HP_clif_item_equip) }, + { HP_POP(clif->item_normal, HP_clif_item_normal) }, { HP_POP(clif->arrowequip, HP_clif_arrowequip) }, { HP_POP(clif->arrow_fail, HP_clif_arrow_fail) }, { HP_POP(clif->use_card, HP_clif_use_card) }, @@ -2155,6 +2160,7 @@ struct HookingPointData HookingPoints[] = { { HP_POP(pc->autotrade_start, HP_pc_autotrade_start) }, { HP_POP(pc->autotrade_prepare, HP_pc_autotrade_prepare) }, { HP_POP(pc->autotrade_populate, HP_pc_autotrade_populate) }, + { HP_POP(pc->autotrade_final, HP_pc_autotrade_final) }, { HP_POP(pc->check_job_name, HP_pc_check_job_name) }, /* pet */ { HP_POP(pet->init, HP_pet_init) }, @@ -2229,6 +2235,14 @@ struct HookingPointData HookingPoints[] = { { HP_POP(script->detach_rid, HP_script_detach_rid) }, { HP_POP(script->push_val, HP_script_push_val) }, { HP_POP(script->get_val, HP_script_get_val) }, + { HP_POP(script->get_val_ref_str, HP_script_get_val_ref_str) }, + { HP_POP(script->get_val_scope_str, HP_script_get_val_scope_str) }, + { HP_POP(script->get_val_npc_str, HP_script_get_val_npc_str) }, + { HP_POP(script->get_val_instance_str, HP_script_get_val_instance_str) }, + { HP_POP(script->get_val_ref_num, HP_script_get_val_ref_num) }, + { HP_POP(script->get_val_scope_num, HP_script_get_val_scope_num) }, + { HP_POP(script->get_val_npc_num, HP_script_get_val_npc_num) }, + { HP_POP(script->get_val_instance_num, HP_script_get_val_instance_num) }, { HP_POP(script->get_val2, HP_script_get_val2) }, { HP_POP(script->push_str, HP_script_push_str) }, { HP_POP(script->push_copy, HP_script_push_copy) }, @@ -2294,6 +2308,14 @@ struct HookingPointData HookingPoints[] = { { HP_POP(script->print_line, HP_script_print_line) }, { HP_POP(script->errorwarning_sub, HP_script_errorwarning_sub) }, { HP_POP(script->set_reg, HP_script_set_reg) }, + { HP_POP(script->set_reg_ref_str, HP_script_set_reg_ref_str) }, + { HP_POP(script->set_reg_scope_str, HP_script_set_reg_scope_str) }, + { HP_POP(script->set_reg_npc_str, HP_script_set_reg_npc_str) }, + { HP_POP(script->set_reg_instance_str, HP_script_set_reg_instance_str) }, + { HP_POP(script->set_reg_ref_num, HP_script_set_reg_ref_num) }, + { HP_POP(script->set_reg_scope_num, HP_script_set_reg_scope_num) }, + { HP_POP(script->set_reg_npc_num, HP_script_set_reg_npc_num) }, + { HP_POP(script->set_reg_instance_num, HP_script_set_reg_instance_num) }, { HP_POP(script->stack_expand, HP_script_stack_expand) }, { HP_POP(script->push_retinfo, HP_script_push_retinfo) }, { HP_POP(script->op_3, HP_script_op_3) }, diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc index 2454846f8..0dd8fbadc 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc @@ -735,6 +735,58 @@ int HP_atcommand_mutearea_sub(struct block_list *bl, va_list ap) { } return retVal___; } +void HP_atcommand_getring(struct map_session_data *sd) { + int hIndex = 0; + if( HPMHooks.count.HP_atcommand_getring_pre ) { + void (*preHookFunc) (struct map_session_data *sd); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_atcommand_getring_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_atcommand_getring_pre[hIndex].func; + preHookFunc(sd); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.atcommand.getring(sd); + } + if( HPMHooks.count.HP_atcommand_getring_post ) { + void (*postHookFunc) (struct map_session_data *sd); + for(hIndex = 0; hIndex < HPMHooks.count.HP_atcommand_getring_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_atcommand_getring_post[hIndex].func; + postHookFunc(sd); + } + } + return; +} +void HP_atcommand_channel_help(int fd, const char *command, bool can_create) { + int hIndex = 0; + if( HPMHooks.count.HP_atcommand_channel_help_pre ) { + void (*preHookFunc) (int *fd, const char *command, bool *can_create); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_atcommand_channel_help_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_atcommand_channel_help_pre[hIndex].func; + preHookFunc(&fd, command, &can_create); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.atcommand.channel_help(fd, command, can_create); + } + if( HPMHooks.count.HP_atcommand_channel_help_post ) { + void (*postHookFunc) (int *fd, const char *command, bool *can_create); + for(hIndex = 0; hIndex < HPMHooks.count.HP_atcommand_channel_help_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_atcommand_channel_help_post[hIndex].func; + postHookFunc(&fd, command, &can_create); + } + } + return; +} void HP_atcommand_commands_sub(struct map_session_data *sd, const int fd, AtCommandType type) { int hIndex = 0; if( HPMHooks.count.HP_atcommand_commands_sub_pre ) { @@ -6620,6 +6672,33 @@ int HP_clif_parse(int fd) { } return retVal___; } +const struct s_packet_db* HP_clif_packet(int packet_id) { + int hIndex = 0; + const struct s_packet_db* retVal___ = NULL; + if( HPMHooks.count.HP_clif_packet_pre ) { + const struct s_packet_db* (*preHookFunc) (int *packet_id); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_packet_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_clif_packet_pre[hIndex].func; + retVal___ = preHookFunc(&packet_id); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clif.packet(packet_id); + } + if( HPMHooks.count.HP_clif_packet_post ) { + const struct s_packet_db* (*postHookFunc) (const struct s_packet_db* retVal___, int *packet_id); + for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_packet_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_clif_packet_post[hIndex].func; + retVal___ = postHookFunc(retVal___, &packet_id); + } + } + return retVal___; +} unsigned short HP_clif_parse_cmd(int fd, struct map_session_data *sd) { int hIndex = 0; unsigned short retVal___ = 0; @@ -6934,6 +7013,58 @@ void HP_clif_takeitem(struct block_list *src, struct block_list *dst) { } return; } +void HP_clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct item_data *id, int eqp_pos) { + int hIndex = 0; + if( HPMHooks.count.HP_clif_item_equip_pre ) { + void (*preHookFunc) (short *idx, struct EQUIPITEM_INFO *p, struct item *i, struct item_data *id, int *eqp_pos); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_item_equip_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_clif_item_equip_pre[hIndex].func; + preHookFunc(&idx, p, i, id, &eqp_pos); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.item_equip(idx, p, i, id, eqp_pos); + } + if( HPMHooks.count.HP_clif_item_equip_post ) { + void (*postHookFunc) (short *idx, struct EQUIPITEM_INFO *p, struct item *i, struct item_data *id, int *eqp_pos); + for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_item_equip_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_clif_item_equip_post[hIndex].func; + postHookFunc(&idx, p, i, id, &eqp_pos); + } + } + return; +} +void HP_clif_item_normal(short idx, struct NORMALITEM_INFO *p, struct item *i, struct item_data *id) { + int hIndex = 0; + if( HPMHooks.count.HP_clif_item_normal_pre ) { + void (*preHookFunc) (short *idx, struct NORMALITEM_INFO *p, struct item *i, struct item_data *id); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_item_normal_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_clif_item_normal_pre[hIndex].func; + preHookFunc(&idx, p, i, id); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.item_normal(idx, p, i, id); + } + if( HPMHooks.count.HP_clif_item_normal_post ) { + void (*postHookFunc) (short *idx, struct NORMALITEM_INFO *p, struct item *i, struct item_data *id); + for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_item_normal_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_clif_item_normal_post[hIndex].func; + postHookFunc(&idx, p, i, id); + } + } + return; +} void HP_clif_arrowequip(struct map_session_data *sd, int val) { int hIndex = 0; if( HPMHooks.count.HP_clif_arrowequip_pre ) { @@ -38679,15 +38810,15 @@ void HP_map_zone_change2(int m, struct map_zone_data *zone) { } return; } -int HP_map_getcell(int16 m, int16 x, int16 y, cell_chk cellchk) { +int HP_map_getcell(int16 m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk) { int hIndex = 0; int retVal___ = 0; if( HPMHooks.count.HP_map_getcell_pre ) { - int (*preHookFunc) (int16 *m, int16 *x, int16 *y, cell_chk *cellchk); + int (*preHookFunc) (int16 *m, const struct block_list *bl, int16 *x, int16 *y, cell_chk *cellchk); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_map_getcell_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_map_getcell_pre[hIndex].func; - retVal___ = preHookFunc(&m, &x, &y, &cellchk); + retVal___ = preHookFunc(&m, bl, &x, &y, &cellchk); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -38695,13 +38826,13 @@ int HP_map_getcell(int16 m, int16 x, int16 y, cell_chk cellchk) { } } { - retVal___ = HPMHooks.source.map.getcell(m, x, y, cellchk); + retVal___ = HPMHooks.source.map.getcell(m, bl, x, y, cellchk); } if( HPMHooks.count.HP_map_getcell_post ) { - int (*postHookFunc) (int retVal___, int16 *m, int16 *x, int16 *y, cell_chk *cellchk); + int (*postHookFunc) (int retVal___, int16 *m, const struct block_list *bl, int16 *x, int16 *y, cell_chk *cellchk); for(hIndex = 0; hIndex < HPMHooks.count.HP_map_getcell_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_map_getcell_post[hIndex].func; - retVal___ = postHookFunc(retVal___, &m, &x, &y, &cellchk); + retVal___ = postHookFunc(retVal___, &m, bl, &x, &y, &cellchk); } } return retVal___; @@ -39108,15 +39239,15 @@ int HP_map_search_freecell(struct block_list *src, int16 m, int16 *x, int16 *y, } return retVal___; } -bool HP_map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag) { +bool HP_map_closest_freecell(int16 m, const struct block_list *bl, int16 *x, int16 *y, int type, int flag) { int hIndex = 0; bool retVal___ = false; if( HPMHooks.count.HP_map_closest_freecell_pre ) { - bool (*preHookFunc) (int16 *m, int16 *x, int16 *y, int *type, int *flag); + bool (*preHookFunc) (int16 *m, const struct block_list *bl, int16 *x, int16 *y, int *type, int *flag); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_map_closest_freecell_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_map_closest_freecell_pre[hIndex].func; - retVal___ = preHookFunc(&m, x, y, &type, &flag); + retVal___ = preHookFunc(&m, bl, x, y, &type, &flag); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -39124,13 +39255,13 @@ bool HP_map_closest_freecell(int16 m, int16 *x, int16 *y, int type, int flag) { } } { - retVal___ = HPMHooks.source.map.closest_freecell(m, x, y, type, flag); + retVal___ = HPMHooks.source.map.closest_freecell(m, bl, x, y, type, flag); } if( HPMHooks.count.HP_map_closest_freecell_post ) { - bool (*postHookFunc) (bool retVal___, int16 *m, int16 *x, int16 *y, int *type, int *flag); + bool (*postHookFunc) (bool retVal___, int16 *m, const struct block_list *bl, int16 *x, int16 *y, int *type, int *flag); for(hIndex = 0; hIndex < HPMHooks.count.HP_map_closest_freecell_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_map_closest_freecell_post[hIndex].func; - retVal___ = postHookFunc(retVal___, &m, x, y, &type, &flag); + retVal___ = postHookFunc(retVal___, &m, bl, x, y, &type, &flag); } } return retVal___; @@ -39269,15 +39400,15 @@ void HP_map_clearflooritem(struct block_list *bl) { } return; } -int HP_map_addflooritem(struct item *item_data, int amount, int16 m, int16 x, int16 y, int first_charid, int second_charid, int third_charid, int flags) { +int HP_map_addflooritem(const struct block_list *bl, struct item *item_data, int amount, int16 m, int16 x, int16 y, int first_charid, int second_charid, int third_charid, int flags) { int hIndex = 0; int retVal___ = 0; if( HPMHooks.count.HP_map_addflooritem_pre ) { - int (*preHookFunc) (struct item *item_data, int *amount, int16 *m, int16 *x, int16 *y, int *first_charid, int *second_charid, int *third_charid, int *flags); + int (*preHookFunc) (const struct block_list *bl, struct item *item_data, int *amount, int16 *m, int16 *x, int16 *y, int *first_charid, int *second_charid, int *third_charid, int *flags); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_map_addflooritem_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_map_addflooritem_pre[hIndex].func; - retVal___ = preHookFunc(item_data, &amount, &m, &x, &y, &first_charid, &second_charid, &third_charid, &flags); + retVal___ = preHookFunc(bl, item_data, &amount, &m, &x, &y, &first_charid, &second_charid, &third_charid, &flags); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -39285,13 +39416,13 @@ int HP_map_addflooritem(struct item *item_data, int amount, int16 m, int16 x, in } } { - retVal___ = HPMHooks.source.map.addflooritem(item_data, amount, m, x, y, first_charid, second_charid, third_charid, flags); + retVal___ = HPMHooks.source.map.addflooritem(bl, item_data, amount, m, x, y, first_charid, second_charid, third_charid, flags); } if( HPMHooks.count.HP_map_addflooritem_post ) { - int (*postHookFunc) (int retVal___, struct item *item_data, int *amount, int16 *m, int16 *x, int16 *y, int *first_charid, int *second_charid, int *third_charid, int *flags); + int (*postHookFunc) (int retVal___, const struct block_list *bl, struct item *item_data, int *amount, int16 *m, int16 *x, int16 *y, int *first_charid, int *second_charid, int *third_charid, int *flags); for(hIndex = 0; hIndex < HPMHooks.count.HP_map_addflooritem_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_map_addflooritem_post[hIndex].func; - retVal___ = postHookFunc(retVal___, item_data, &amount, &m, &x, &y, &first_charid, &second_charid, &third_charid, &flags); + retVal___ = postHookFunc(retVal___, bl, item_data, &amount, &m, &x, &y, &first_charid, &second_charid, &third_charid, &flags); } } return retVal___; @@ -40911,15 +41042,15 @@ int HP_map_freeblock_timer(int tid, int64 tick, int id, intptr_t data) { } return retVal___; } -int HP_map_searchrandfreecell(int16 m, int16 *x, int16 *y, int stack) { +int HP_map_searchrandfreecell(int16 m, const struct block_list *bl, int16 *x, int16 *y, int stack) { int hIndex = 0; int retVal___ = 0; if( HPMHooks.count.HP_map_searchrandfreecell_pre ) { - int (*preHookFunc) (int16 *m, int16 *x, int16 *y, int *stack); + int (*preHookFunc) (int16 *m, const struct block_list *bl, int16 *x, int16 *y, int *stack); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_map_searchrandfreecell_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_map_searchrandfreecell_pre[hIndex].func; - retVal___ = preHookFunc(&m, x, y, &stack); + retVal___ = preHookFunc(&m, bl, x, y, &stack); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -40927,13 +41058,13 @@ int HP_map_searchrandfreecell(int16 m, int16 *x, int16 *y, int stack) { } } { - retVal___ = HPMHooks.source.map.searchrandfreecell(m, x, y, stack); + retVal___ = HPMHooks.source.map.searchrandfreecell(m, bl, x, y, stack); } if( HPMHooks.count.HP_map_searchrandfreecell_post ) { - int (*postHookFunc) (int retVal___, int16 *m, int16 *x, int16 *y, int *stack); + int (*postHookFunc) (int retVal___, int16 *m, const struct block_list *bl, int16 *x, int16 *y, int *stack); for(hIndex = 0; hIndex < HPMHooks.count.HP_map_searchrandfreecell_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_map_searchrandfreecell_post[hIndex].func; - retVal___ = postHookFunc(retVal___, &m, x, y, &stack); + retVal___ = postHookFunc(retVal___, &m, bl, x, y, &stack); } } return retVal___; @@ -41093,15 +41224,15 @@ int HP_map_cell2gat(struct mapcell cell) { } return retVal___; } -int HP_map_getcellp(struct map_data *m, int16 x, int16 y, cell_chk cellchk) { +int HP_map_getcellp(struct map_data *m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk) { int hIndex = 0; int retVal___ = 0; if( HPMHooks.count.HP_map_getcellp_pre ) { - int (*preHookFunc) (struct map_data *m, int16 *x, int16 *y, cell_chk *cellchk); + int (*preHookFunc) (struct map_data *m, const struct block_list *bl, int16 *x, int16 *y, cell_chk *cellchk); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_map_getcellp_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_map_getcellp_pre[hIndex].func; - retVal___ = preHookFunc(m, &x, &y, &cellchk); + retVal___ = preHookFunc(m, bl, &x, &y, &cellchk); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -41109,13 +41240,13 @@ int HP_map_getcellp(struct map_data *m, int16 x, int16 y, cell_chk cellchk) { } } { - retVal___ = HPMHooks.source.map.getcellp(m, x, y, cellchk); + retVal___ = HPMHooks.source.map.getcellp(m, bl, x, y, cellchk); } if( HPMHooks.count.HP_map_getcellp_post ) { - int (*postHookFunc) (int retVal___, struct map_data *m, int16 *x, int16 *y, cell_chk *cellchk); + int (*postHookFunc) (int retVal___, struct map_data *m, const struct block_list *bl, int16 *x, int16 *y, cell_chk *cellchk); for(hIndex = 0; hIndex < HPMHooks.count.HP_map_getcellp_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_map_getcellp_post[hIndex].func; - retVal___ = postHookFunc(retVal___, m, &x, &y, &cellchk); + retVal___ = postHookFunc(retVal___, m, bl, &x, &y, &cellchk); } } return retVal___; @@ -41146,15 +41277,15 @@ void HP_map_setcell(int16 m, int16 x, int16 y, cell_t cell, bool flag) { } return; } -int HP_map_sub_getcellp(struct map_data *m, int16 x, int16 y, cell_chk cellchk) { +int HP_map_sub_getcellp(struct map_data *m, const struct block_list *bl, int16 x, int16 y, cell_chk cellchk) { int hIndex = 0; int retVal___ = 0; if( HPMHooks.count.HP_map_sub_getcellp_pre ) { - int (*preHookFunc) (struct map_data *m, int16 *x, int16 *y, cell_chk *cellchk); + int (*preHookFunc) (struct map_data *m, const struct block_list *bl, int16 *x, int16 *y, cell_chk *cellchk); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_map_sub_getcellp_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_map_sub_getcellp_pre[hIndex].func; - retVal___ = preHookFunc(m, &x, &y, &cellchk); + retVal___ = preHookFunc(m, bl, &x, &y, &cellchk); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -41162,13 +41293,13 @@ int HP_map_sub_getcellp(struct map_data *m, int16 x, int16 y, cell_chk cellchk) } } { - retVal___ = HPMHooks.source.map.sub_getcellp(m, x, y, cellchk); + retVal___ = HPMHooks.source.map.sub_getcellp(m, bl, x, y, cellchk); } if( HPMHooks.count.HP_map_sub_getcellp_post ) { - int (*postHookFunc) (int retVal___, struct map_data *m, int16 *x, int16 *y, cell_chk *cellchk); + int (*postHookFunc) (int retVal___, struct map_data *m, const struct block_list *bl, int16 *x, int16 *y, cell_chk *cellchk); for(hIndex = 0; hIndex < HPMHooks.count.HP_map_sub_getcellp_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_map_sub_getcellp_post[hIndex].func; - retVal___ = postHookFunc(retVal___, m, &x, &y, &cellchk); + retVal___ = postHookFunc(retVal___, m, bl, &x, &y, &cellchk); } } return retVal___; @@ -50425,15 +50556,15 @@ int HP_party_db_final(DBKey key, DBData *data, va_list ap) { return retVal___; } /* path */ -int HP_path_blownpos(int16 m, int16 x0, int16 y0, int16 dx, int16 dy, int count) { +int HP_path_blownpos(struct block_list *bl, int16 m, int16 x0, int16 y0, int16 dx, int16 dy, int count) { int hIndex = 0; int retVal___ = 0; if( HPMHooks.count.HP_path_blownpos_pre ) { - int (*preHookFunc) (int16 *m, int16 *x0, int16 *y0, int16 *dx, int16 *dy, int *count); + int (*preHookFunc) (struct block_list *bl, int16 *m, int16 *x0, int16 *y0, int16 *dx, int16 *dy, int *count); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_path_blownpos_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_path_blownpos_pre[hIndex].func; - retVal___ = preHookFunc(&m, &x0, &y0, &dx, &dy, &count); + retVal___ = preHookFunc(bl, &m, &x0, &y0, &dx, &dy, &count); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -50441,26 +50572,26 @@ int HP_path_blownpos(int16 m, int16 x0, int16 y0, int16 dx, int16 dy, int count) } } { - retVal___ = HPMHooks.source.path.blownpos(m, x0, y0, dx, dy, count); + retVal___ = HPMHooks.source.path.blownpos(bl, m, x0, y0, dx, dy, count); } if( HPMHooks.count.HP_path_blownpos_post ) { - int (*postHookFunc) (int retVal___, int16 *m, int16 *x0, int16 *y0, int16 *dx, int16 *dy, int *count); + int (*postHookFunc) (int retVal___, struct block_list *bl, int16 *m, int16 *x0, int16 *y0, int16 *dx, int16 *dy, int *count); for(hIndex = 0; hIndex < HPMHooks.count.HP_path_blownpos_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_path_blownpos_post[hIndex].func; - retVal___ = postHookFunc(retVal___, &m, &x0, &y0, &dx, &dy, &count); + retVal___ = postHookFunc(retVal___, bl, &m, &x0, &y0, &dx, &dy, &count); } } return retVal___; } -bool HP_path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int flag, cell_chk cell) { +bool HP_path_search(struct walkpath_data *wpd, struct block_list *bl, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int flag, cell_chk cell) { int hIndex = 0; bool retVal___ = false; if( HPMHooks.count.HP_path_search_pre ) { - bool (*preHookFunc) (struct walkpath_data *wpd, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, int *flag, cell_chk *cell); + bool (*preHookFunc) (struct walkpath_data *wpd, struct block_list *bl, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, int *flag, cell_chk *cell); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_path_search_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_path_search_pre[hIndex].func; - retVal___ = preHookFunc(wpd, &m, &x0, &y0, &x1, &y1, &flag, &cell); + retVal___ = preHookFunc(wpd, bl, &m, &x0, &y0, &x1, &y1, &flag, &cell); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -50468,26 +50599,26 @@ bool HP_path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int1 } } { - retVal___ = HPMHooks.source.path.search(wpd, m, x0, y0, x1, y1, flag, cell); + retVal___ = HPMHooks.source.path.search(wpd, bl, m, x0, y0, x1, y1, flag, cell); } if( HPMHooks.count.HP_path_search_post ) { - bool (*postHookFunc) (bool retVal___, struct walkpath_data *wpd, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, int *flag, cell_chk *cell); + bool (*postHookFunc) (bool retVal___, struct walkpath_data *wpd, struct block_list *bl, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, int *flag, cell_chk *cell); for(hIndex = 0; hIndex < HPMHooks.count.HP_path_search_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_path_search_post[hIndex].func; - retVal___ = postHookFunc(retVal___, wpd, &m, &x0, &y0, &x1, &y1, &flag, &cell); + retVal___ = postHookFunc(retVal___, wpd, bl, &m, &x0, &y0, &x1, &y1, &flag, &cell); } } return retVal___; } -bool HP_path_search_long(struct shootpath_data *spd, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, cell_chk cell) { +bool HP_path_search_long(struct shootpath_data *spd, struct block_list *bl, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, cell_chk cell) { int hIndex = 0; bool retVal___ = false; if( HPMHooks.count.HP_path_search_long_pre ) { - bool (*preHookFunc) (struct shootpath_data *spd, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, cell_chk *cell); + bool (*preHookFunc) (struct shootpath_data *spd, struct block_list *bl, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, cell_chk *cell); *HPMforce_return = false; for(hIndex = 0; hIndex < HPMHooks.count.HP_path_search_long_pre; hIndex++ ) { preHookFunc = HPMHooks.list.HP_path_search_long_pre[hIndex].func; - retVal___ = preHookFunc(spd, &m, &x0, &y0, &x1, &y1, &cell); + retVal___ = preHookFunc(spd, bl, &m, &x0, &y0, &x1, &y1, &cell); } if( *HPMforce_return ) { *HPMforce_return = false; @@ -50495,13 +50626,13 @@ bool HP_path_search_long(struct shootpath_data *spd, int16 m, int16 x0, int16 y0 } } { - retVal___ = HPMHooks.source.path.search_long(spd, m, x0, y0, x1, y1, cell); + retVal___ = HPMHooks.source.path.search_long(spd, bl, m, x0, y0, x1, y1, cell); } if( HPMHooks.count.HP_path_search_long_post ) { - bool (*postHookFunc) (bool retVal___, struct shootpath_data *spd, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, cell_chk *cell); + bool (*postHookFunc) (bool retVal___, struct shootpath_data *spd, struct block_list *bl, int16 *m, int16 *x0, int16 *y0, int16 *x1, int16 *y1, cell_chk *cell); for(hIndex = 0; hIndex < HPMHooks.count.HP_path_search_long_post; hIndex++ ) { postHookFunc = HPMHooks.list.HP_path_search_long_post[hIndex].func; - retVal___ = postHookFunc(retVal___, spd, &m, &x0, &y0, &x1, &y1, &cell); + retVal___ = postHookFunc(retVal___, spd, bl, &m, &x0, &y0, &x1, &y1, &cell); } } return retVal___; @@ -56614,6 +56745,39 @@ void HP_pc_autotrade_populate(struct map_session_data *sd) { } return; } +int HP_pc_autotrade_final(DBKey key, DBData *data, va_list ap) { + int hIndex = 0; + int retVal___ = 0; + if( HPMHooks.count.HP_pc_autotrade_final_pre ) { + int (*preHookFunc) (DBKey *key, DBData *data, va_list ap); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_final_pre; hIndex++ ) { + va_list ap___copy; va_copy(ap___copy, ap); + preHookFunc = HPMHooks.list.HP_pc_autotrade_final_pre[hIndex].func; + retVal___ = preHookFunc(&key, data, ap___copy); + va_end(ap___copy); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + va_list ap___copy; va_copy(ap___copy, ap); + retVal___ = HPMHooks.source.pc.autotrade_final(key, data, ap___copy); + va_end(ap___copy); + } + if( HPMHooks.count.HP_pc_autotrade_final_post ) { + int (*postHookFunc) (int retVal___, DBKey *key, DBData *data, va_list ap); + for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_final_post; hIndex++ ) { + va_list ap___copy; va_copy(ap___copy, ap); + postHookFunc = HPMHooks.list.HP_pc_autotrade_final_post[hIndex].func; + retVal___ = postHookFunc(retVal___, &key, data, ap___copy); + va_end(ap___copy); + } + } + return retVal___; +} int HP_pc_check_job_name(const char *name) { int hIndex = 0; int retVal___ = 0; @@ -58540,6 +58704,222 @@ struct script_data* HP_script_get_val(struct script_state *st, struct script_dat } return retVal___; } +char* HP_script_get_val_ref_str(struct script_state *st, struct reg_db *n, struct script_data *data) { + int hIndex = 0; + char* retVal___ = NULL; + if( HPMHooks.count.HP_script_get_val_ref_str_pre ) { + char* (*preHookFunc) (struct script_state *st, struct reg_db *n, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_ref_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_ref_str_pre[hIndex].func; + retVal___ = preHookFunc(st, n, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_ref_str(st, n, data); + } + if( HPMHooks.count.HP_script_get_val_ref_str_post ) { + char* (*postHookFunc) (char* retVal___, struct script_state *st, struct reg_db *n, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_ref_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_ref_str_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, n, data); + } + } + return retVal___; +} +char* HP_script_get_val_scope_str(struct script_state *st, struct reg_db *n, struct script_data *data) { + int hIndex = 0; + char* retVal___ = NULL; + if( HPMHooks.count.HP_script_get_val_scope_str_pre ) { + char* (*preHookFunc) (struct script_state *st, struct reg_db *n, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_scope_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_scope_str_pre[hIndex].func; + retVal___ = preHookFunc(st, n, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_scope_str(st, n, data); + } + if( HPMHooks.count.HP_script_get_val_scope_str_post ) { + char* (*postHookFunc) (char* retVal___, struct script_state *st, struct reg_db *n, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_scope_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_scope_str_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, n, data); + } + } + return retVal___; +} +char* HP_script_get_val_npc_str(struct script_state *st, struct reg_db *n, struct script_data *data) { + int hIndex = 0; + char* retVal___ = NULL; + if( HPMHooks.count.HP_script_get_val_npc_str_pre ) { + char* (*preHookFunc) (struct script_state *st, struct reg_db *n, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_npc_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_npc_str_pre[hIndex].func; + retVal___ = preHookFunc(st, n, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_npc_str(st, n, data); + } + if( HPMHooks.count.HP_script_get_val_npc_str_post ) { + char* (*postHookFunc) (char* retVal___, struct script_state *st, struct reg_db *n, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_npc_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_npc_str_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, n, data); + } + } + return retVal___; +} +char* HP_script_get_val_instance_str(struct script_state *st, const char *name, struct script_data *data) { + int hIndex = 0; + char* retVal___ = NULL; + if( HPMHooks.count.HP_script_get_val_instance_str_pre ) { + char* (*preHookFunc) (struct script_state *st, const char *name, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_instance_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_instance_str_pre[hIndex].func; + retVal___ = preHookFunc(st, name, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_instance_str(st, name, data); + } + if( HPMHooks.count.HP_script_get_val_instance_str_post ) { + char* (*postHookFunc) (char* retVal___, struct script_state *st, const char *name, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_instance_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_instance_str_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, name, data); + } + } + return retVal___; +} +int HP_script_get_val_ref_num(struct script_state *st, struct reg_db *n, struct script_data *data) { + int hIndex = 0; + int retVal___ = 0; + if( HPMHooks.count.HP_script_get_val_ref_num_pre ) { + int (*preHookFunc) (struct script_state *st, struct reg_db *n, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_ref_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_ref_num_pre[hIndex].func; + retVal___ = preHookFunc(st, n, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_ref_num(st, n, data); + } + if( HPMHooks.count.HP_script_get_val_ref_num_post ) { + int (*postHookFunc) (int retVal___, struct script_state *st, struct reg_db *n, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_ref_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_ref_num_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, n, data); + } + } + return retVal___; +} +int HP_script_get_val_scope_num(struct script_state *st, struct reg_db *n, struct script_data *data) { + int hIndex = 0; + int retVal___ = 0; + if( HPMHooks.count.HP_script_get_val_scope_num_pre ) { + int (*preHookFunc) (struct script_state *st, struct reg_db *n, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_scope_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_scope_num_pre[hIndex].func; + retVal___ = preHookFunc(st, n, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_scope_num(st, n, data); + } + if( HPMHooks.count.HP_script_get_val_scope_num_post ) { + int (*postHookFunc) (int retVal___, struct script_state *st, struct reg_db *n, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_scope_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_scope_num_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, n, data); + } + } + return retVal___; +} +int HP_script_get_val_npc_num(struct script_state *st, struct reg_db *n, struct script_data *data) { + int hIndex = 0; + int retVal___ = 0; + if( HPMHooks.count.HP_script_get_val_npc_num_pre ) { + int (*preHookFunc) (struct script_state *st, struct reg_db *n, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_npc_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_npc_num_pre[hIndex].func; + retVal___ = preHookFunc(st, n, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_npc_num(st, n, data); + } + if( HPMHooks.count.HP_script_get_val_npc_num_post ) { + int (*postHookFunc) (int retVal___, struct script_state *st, struct reg_db *n, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_npc_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_npc_num_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, n, data); + } + } + return retVal___; +} +int HP_script_get_val_instance_num(struct script_state *st, const char *name, struct script_data *data) { + int hIndex = 0; + int retVal___ = 0; + if( HPMHooks.count.HP_script_get_val_instance_num_pre ) { + int (*preHookFunc) (struct script_state *st, const char *name, struct script_data *data); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_instance_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_get_val_instance_num_pre[hIndex].func; + retVal___ = preHookFunc(st, name, data); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.script.get_val_instance_num(st, name, data); + } + if( HPMHooks.count.HP_script_get_val_instance_num_post ) { + int (*postHookFunc) (int retVal___, struct script_state *st, const char *name, struct script_data *data); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val_instance_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_get_val_instance_num_post[hIndex].func; + retVal___ = postHookFunc(retVal___, st, name, data); + } + } + return retVal___; +} void* HP_script_get_val2(struct script_state *st, int64 uid, struct reg_db *ref) { int hIndex = 0; void* retVal___ = NULL; @@ -60263,6 +60643,214 @@ int HP_script_set_reg(struct script_state *st, TBL_PC *sd, int64 num, const char } return retVal___; } +void HP_script_set_reg_ref_str(struct script_state *st, struct reg_db *n, int64 num, const char *name, const char *str) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_ref_str_pre ) { + void (*preHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, const char *str); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_ref_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_ref_str_pre[hIndex].func; + preHookFunc(st, n, &num, name, str); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_ref_str(st, n, num, name, str); + } + if( HPMHooks.count.HP_script_set_reg_ref_str_post ) { + void (*postHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, const char *str); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_ref_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_ref_str_post[hIndex].func; + postHookFunc(st, n, &num, name, str); + } + } + return; +} +void HP_script_set_reg_scope_str(struct script_state *st, struct reg_db *n, int64 num, const char *name, const char *str) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_scope_str_pre ) { + void (*preHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, const char *str); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_scope_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_scope_str_pre[hIndex].func; + preHookFunc(st, n, &num, name, str); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_scope_str(st, n, num, name, str); + } + if( HPMHooks.count.HP_script_set_reg_scope_str_post ) { + void (*postHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, const char *str); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_scope_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_scope_str_post[hIndex].func; + postHookFunc(st, n, &num, name, str); + } + } + return; +} +void HP_script_set_reg_npc_str(struct script_state *st, struct reg_db *n, int64 num, const char *name, const char *str) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_npc_str_pre ) { + void (*preHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, const char *str); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_npc_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_npc_str_pre[hIndex].func; + preHookFunc(st, n, &num, name, str); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_npc_str(st, n, num, name, str); + } + if( HPMHooks.count.HP_script_set_reg_npc_str_post ) { + void (*postHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, const char *str); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_npc_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_npc_str_post[hIndex].func; + postHookFunc(st, n, &num, name, str); + } + } + return; +} +void HP_script_set_reg_instance_str(struct script_state *st, int64 num, const char *name, const char *str) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_instance_str_pre ) { + void (*preHookFunc) (struct script_state *st, int64 *num, const char *name, const char *str); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_instance_str_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_instance_str_pre[hIndex].func; + preHookFunc(st, &num, name, str); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_instance_str(st, num, name, str); + } + if( HPMHooks.count.HP_script_set_reg_instance_str_post ) { + void (*postHookFunc) (struct script_state *st, int64 *num, const char *name, const char *str); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_instance_str_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_instance_str_post[hIndex].func; + postHookFunc(st, &num, name, str); + } + } + return; +} +void HP_script_set_reg_ref_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_ref_num_pre ) { + void (*preHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, int *val); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_ref_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_ref_num_pre[hIndex].func; + preHookFunc(st, n, &num, name, &val); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_ref_num(st, n, num, name, val); + } + if( HPMHooks.count.HP_script_set_reg_ref_num_post ) { + void (*postHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, int *val); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_ref_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_ref_num_post[hIndex].func; + postHookFunc(st, n, &num, name, &val); + } + } + return; +} +void HP_script_set_reg_scope_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_scope_num_pre ) { + void (*preHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, int *val); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_scope_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_scope_num_pre[hIndex].func; + preHookFunc(st, n, &num, name, &val); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_scope_num(st, n, num, name, val); + } + if( HPMHooks.count.HP_script_set_reg_scope_num_post ) { + void (*postHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, int *val); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_scope_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_scope_num_post[hIndex].func; + postHookFunc(st, n, &num, name, &val); + } + } + return; +} +void HP_script_set_reg_npc_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_npc_num_pre ) { + void (*preHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, int *val); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_npc_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_npc_num_pre[hIndex].func; + preHookFunc(st, n, &num, name, &val); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_npc_num(st, n, num, name, val); + } + if( HPMHooks.count.HP_script_set_reg_npc_num_post ) { + void (*postHookFunc) (struct script_state *st, struct reg_db *n, int64 *num, const char *name, int *val); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_npc_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_npc_num_post[hIndex].func; + postHookFunc(st, n, &num, name, &val); + } + } + return; +} +void HP_script_set_reg_instance_num(struct script_state *st, int64 num, const char *name, int val) { + int hIndex = 0; + if( HPMHooks.count.HP_script_set_reg_instance_num_pre ) { + void (*preHookFunc) (struct script_state *st, int64 *num, const char *name, int *val); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_instance_num_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_script_set_reg_instance_num_pre[hIndex].func; + preHookFunc(st, &num, name, &val); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.script.set_reg_instance_num(st, num, name, val); + } + if( HPMHooks.count.HP_script_set_reg_instance_num_post ) { + void (*postHookFunc) (struct script_state *st, int64 *num, const char *name, int *val); + for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_instance_num_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_script_set_reg_instance_num_post[hIndex].func; + postHookFunc(st, &num, name, &val); + } + } + return; +} void HP_script_stack_expand(struct script_stack *stack) { int hIndex = 0; if( HPMHooks.count.HP_script_stack_expand_pre ) { diff --git a/src/plugins/db2sql.c b/src/plugins/db2sql.c index ff2feefa0..79eda0e5e 100644 --- a/src/plugins/db2sql.c +++ b/src/plugins/db2sql.c @@ -139,10 +139,10 @@ int db2sql(config_setting_t *entry, int n, const char *source) { // bindonequip StrBuf->Printf(&buf, "'%u',", it->flag.bindonequip?1:0); - + // forceserial StrBuf->Printf(&buf, "'%u',", it->flag.force_serial?1:0); - + // buyingstore StrBuf->Printf(&buf, "'%u',", it->flag.buyingstore?1:0); diff --git a/src/test/test_spinlock.c b/src/test/test_spinlock.c index 4f235907d..a11f8643b 100644 --- a/src/test/test_spinlock.c +++ b/src/test/test_spinlock.c @@ -18,7 +18,6 @@ #define PERINC 100000 #define LOOPS 47 - static SPIN_LOCK lock; static unsigned int val = 0; static volatile int32 done_threads = 0; @@ -41,7 +40,6 @@ static void *worker(void *p){ return NULL; }//end: worker() - int do_init(int argc, char **argv){ rAthread *t[THRC]; int j, i; @@ -88,27 +86,20 @@ int do_init(int argc, char **argv){ ShowStatus("Test passed.\n"); exit(0); } - - -return 0; + return 0; }//end: do_init() - void do_abort(void) { }//end: do_abort() - void set_server_type(void) { SERVER_TYPE = SERVER_TYPE_UNKNOWN; }//end: set_server_type() - int do_final(void) { return EXIT_SUCCESS; }//end: do_final() - int parse_console(const char* command){ return 0; }//end: parse_console - diff --git a/src/tool/mapcache.c b/src/tool/mapcache.c index 356cdd352..72457b73a 100644 --- a/src/tool/mapcache.c +++ b/src/tool/mapcache.c @@ -188,7 +188,7 @@ char *remove_extension(char *mapname) char *ptr, *ptr2; ptr = strchr(mapname, '.'); if (ptr) { //Check and remove extension. - while (ptr[1] && (ptr2 = strchr(ptr+1, '.'))) + while (ptr[1] && (ptr2 = strchr(ptr+1, '.')) != NULL) ptr = ptr2; //Skip to the last dot. if (strcmp(ptr,".gat") == 0) *ptr = '\0'; //Remove extension. @@ -256,7 +256,6 @@ void cmdline_args_init_local(void) CMDLINEARG_DEF2(map-list, maplist, "Alternative map list file", CMDLINE_OPT_NORMAL|CMDLINE_OPT_PARAM); CMDLINEARG_DEF2(map-cache, mapcache, "Alternative map cache file", CMDLINE_OPT_NORMAL|CMDLINE_OPT_PARAM); CMDLINEARG_DEF2(rebuild, rebuild, "Forces a rebuild of the map cache, rather than only adding missing maps", CMDLINE_OPT_NORMAL); - } int do_init(int argc, char** argv) |