int32 recv_parse(int8* buff, size_t* buffsize, sockaddr_in* from, map_session_data_t* map_session_data) { size_t size = *buffsize; int32 checksumResult = -1; #ifdef WIN32 try { checksumResult = checksum((uint8*)(buff + FFXI_HEADER_SIZE), size - (FFXI_HEADER_SIZE + 16), buff + size - 16); } catch (...) { ShowError(CL_RED"Possible crash attempt from: %s\n" CL_RESET, ip2str(map_session_data->client_addr, NULL)); return -1; } #else checksumResult = checksum((uint8*)(buff + FFXI_HEADER_SIZE), size - (FFXI_HEADER_SIZE + 16), buff + size - 16); #endif if(checksumResult == 0) { if (map_session_data->PChar == NULL) { uint32 CharID = RBUFL(buff,FFXI_HEADER_SIZE+0x0C); const int8* fmtQuery = "SELECT session_key FROM accounts_sessions WHERE charid = %u LIMIT 1;"; int32 ret = Sql_Query(SqlHandle,fmtQuery,CharID); if (ret == SQL_ERROR || Sql_NumRows(SqlHandle) == 0 || Sql_NextRow(SqlHandle) != SQL_SUCCESS) { ShowError(CL_RED"recv_parse: Cannot load session_key for charid %u" CL_RESET, CharID); } else { int8* strSessionKey = NULL; Sql_GetData(SqlHandle,0,&strSessionKey,NULL); memcpy(map_session_data->blowfish.key,strSessionKey,20); } // наверное создание персонажа лучше вынести в метод charutils::LoadChar() и загрузку инвентаря туда же сунуть CCharEntity* PChar = new CCharEntity(); PChar->id = CharID; PChar->PBattleAI = new CAICharNormal(PChar); charutils::LoadChar(PChar); charutils::LoadInventory(PChar); luautils::OnGameIn(PChar); PChar->status = STATUS_DISAPPEAR; map_session_data->PChar = PChar; } map_session_data->client_packet_id = 0; map_session_data->server_packet_id = 0; return 0; }else{ //char packets if( map_decipher_packet(buff,*buffsize,from,map_session_data) == -1) { *buffsize = 0; return -1; } // reading data size uint32 PacketDataSize = RBUFL(buff,*buffsize-sizeof(int32)-16); // creating buffer for decompress data int8* PacketDataBuff = NULL; CREATE(PacketDataBuff,int8,map_config.buffer_size); // it's decompressing data and getting new size PacketDataSize = zlib_decompress(buff+FFXI_HEADER_SIZE, PacketDataSize, PacketDataBuff, map_config.buffer_size, zlib_decompress_table); // it's making result buff // don't need memcpy header memcpy(buff+FFXI_HEADER_SIZE,PacketDataBuff,PacketDataSize); *buffsize = FFXI_HEADER_SIZE+PacketDataSize; aFree(PacketDataBuff); return 0; } return -1; }
/** * Open vending for Autotrader * @param sd Player as autotrader */ void vending_reopen( struct map_session_data* sd ) { struct s_autotrader *at = NULL; int8 fail = -1; nullpo_retv(sd); // Open vending for this autotrader if ((at = (struct s_autotrader *)uidb_get(vending_autotrader_db, sd->status.char_id)) && at->count && at->entries) { uint8 *data, *p; uint16 j, count; // Init vending data for autotrader CREATE(data, uint8, at->count * 8); for (j = 0, p = data, count = at->count; j < at->count; j++) { struct s_autotrade_entry *entry = at->entries[j]; uint16 *index = (uint16*)(p + 0); uint16 *amount = (uint16*)(p + 2); uint32 *value = (uint32*)(p + 4); // Find item position in cart ARR_FIND(0, MAX_CART, entry->index, sd->cart.u.items_cart[entry->index].id == entry->cartinventory_id); if (entry->index == MAX_CART) { count--; continue; } *index = entry->index + 2; *amount = itemdb_isstackable(sd->cart.u.items_cart[entry->index].nameid) ? entry->amount : 1; *value = entry->price; p += 8; } sd->state.prevend = 1; // Set him into a hacked prevend state sd->state.autotrade = 1; // Make sure abort all NPCs npc_event_dequeue(sd); pc_cleareventtimer(sd); // Open the vending again if( (fail = vending_openvending(sd, at->title, data, count, at)) == 0 ) { // Make vendor look perfect pc_setdir(sd, at->dir, at->head_dir); clif_changed_dir(&sd->bl, AREA_WOS); if( at->sit ) { pc_setsit(sd); skill_sit(sd, 1); clif_sitting(&sd->bl); } // Immediate save chrif_save(sd, CSAVE_AUTOTRADE); ShowInfo("Vending loaded for '" CL_WHITE "%s" CL_RESET "' with '" CL_WHITE "%d" CL_RESET "' items at " CL_WHITE "%s (%d,%d)" CL_RESET "\n", sd->status.name, count, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); } aFree(data); } if (at) { vending_autotrader_remove(at, true); if (db_size(vending_autotrader_db) == 0) vending_autotrader_db->clear(vending_autotrader_db, vending_autotrader_free); } if (fail != 0) { ShowError("vending_reopen: (Error:%d) Load failed for autotrader '" CL_WHITE "%s" CL_RESET "' (CID=%d/AID=%d)\n", fail, sd->status.name, sd->status.char_id, sd->status.account_id); map_quit(sd); } }
int32 do_init(int32 argc, int8** argv) { ShowStatus("do_init: begin server initialization...\n"); MAP_CONF_FILENAME = "./conf/map_darkstar.conf"; srand((uint32)time(NULL)); map_config_default(); map_config_read(MAP_CONF_FILENAME); ShowMessage("\t\t\t - " CL_GREEN"[OK]" CL_RESET"\n"); ShowStatus("do_init: map_config is reading"); ShowMessage("\t\t - " CL_GREEN"[OK]" CL_RESET"\n"); luautils::init(); CmdHandler.init(luautils::LuaHandle); PacketParserInitialize(); SqlHandle = Sql_Malloc(); ShowStatus("do_init: sqlhandle is allocating"); if( Sql_Connect(SqlHandle,map_config.mysql_login, map_config.mysql_password, map_config.mysql_host, map_config.mysql_port, map_config.mysql_database) == SQL_ERROR ) { exit(EXIT_FAILURE); } Sql_Keepalive(SqlHandle); // отчищаем таблицу сессий при старте сервера (временное решение, т.к. в кластере это не будет работать) Sql_Query(SqlHandle, "TRUNCATE TABLE accounts_sessions"); ShowMessage("\t\t - " CL_GREEN"[OK]" CL_RESET"\n"); ShowStatus("do_init: zlib is reading"); zlib_init(); ShowMessage("\t\t\t - " CL_GREEN"[OK]" CL_RESET"\n"); ShowStatus("do_init: loading items"); itemutils::Initialize(); ShowMessage("\t\t\t - " CL_GREEN"[OK]" CL_RESET"\n"); // нужно будет написать один метод для инициализации всех данных в battleutils // и один метод для освобождения этих данных ShowStatus("do_init: loading spells"); spell::LoadSpellList(); mobSpellList::LoadMobSpellList(); ShowMessage("\t\t\t - " CL_GREEN"[OK]" CL_RESET"\n"); charutils::ResetAllTwoHours(); guildutils::Initialize(); charutils::LoadExpTable(); linkshell::LoadLinkshellList(); traits::LoadTraitsList(); effects::LoadEffectsParameters(); battleutils::LoadSkillTable(); meritNameSpace::LoadMeritsList(); nameSpaceUnlockableWeapons::LoadUnlockableWeaponList(); ability::LoadAbilitiesList(); battleutils::LoadWeaponSkillsList(); battleutils::LoadMobSkillsList(); battleutils::LoadEnmityTable(); battleutils::LoadSkillChainDamageModifiers(); petutils::LoadPetList(); conquest::LoadConquestSystem(); mobutils::LoadCustomMods(); ShowStatus("do_init: loading zones"); zoneutils::LoadZoneList(); ShowMessage("\t\t\t - " CL_GREEN"[OK]" CL_RESET"\n"); luautils::OnServerStart(); fishingutils::LoadFishingMessages(); ShowStatus("do_init: server is binding with port %u",map_config.usMapPort); map_fd = makeBind_udp(map_config.uiMapIp,map_config.usMapPort); ShowMessage("\t - " CL_GREEN"[OK]" CL_RESET"\n"); CVanaTime::getInstance()->setCustomOffset(map_config.vanadiel_time_offset); CTaskMgr::getInstance()->AddTask("time_server", gettick(), NULL, CTaskMgr::TASK_INTERVAL, time_server, 2400); CTaskMgr::getInstance()->AddTask("map_cleanup", gettick(), NULL, CTaskMgr::TASK_INTERVAL, map_cleanup, 5000); CTaskMgr::getInstance()->AddTask("garbage_collect", gettick(), NULL, CTaskMgr::TASK_INTERVAL, map_garbage_collect, 15 * 60 * 1000); CREATE(g_PBuff, int8, map_config.buffer_size + 20); CREATE(PTempBuff, int8, map_config.buffer_size + 20); aFree((void*)map_config.mysql_login); aFree((void*)map_config.mysql_password); ShowStatus("The map-server is " CL_GREEN"ready" CL_RESET" to work...\n"); ShowMessage("=======================================================================\n"); return 0; }
void mempool_destroy(mempool p) { struct pool_segment *seg, *segnext; struct node *niter; mempool piter, pprev; char *ptr; int64 i; #ifdef MEMPOOL_DEBUG ShowDebug(read_message("Source.common.mempool_debug4"), p->name); #endif // Unlink from global list. EnterSpinLock(&l_mempoolListLock); piter = l_mempoolList; pprev = l_mempoolList; while(1) { if(piter == NULL) break; if(piter == p) { // unlink from list, // if(pprev == l_mempoolList) { // this (p) is list begin. so set next as head. l_mempoolList = p->next; } else { // replace prevs next wuth our next. pprev->next = p->next; } break; } pprev = piter; piter = piter->next; } p->next = NULL; LeaveSpinLock(&l_mempoolListLock); // Get both locks. EnterSpinLock(&p->segmentLock); EnterSpinLock(&p->nodeLock); if(p->num_nodes_free != p->num_nodes_total) ShowWarning(read_message("Source.common.mempool_destroy"), p->name, (p->num_nodes_total - p->num_nodes_free)); // Free All Segments (this will also free all nodes) // The segment pointer is the base pointer to the whole segment. seg = p->segments; while(1) { if(seg == NULL) break; segnext = seg->next; // .. if(p->ondealloc != NULL) { // walk over the segment, and call dealloc callback! ptr = (char *)seg; ptr += ALIGN_TO_16(sizeof(struct pool_segment)); for(i = 0; i < seg->num_nodes_total; i++) { niter = (struct node *)ptr; ptr += sizeof(struct node); ptr += p->elem_size; #ifdef MEMPOOLASSERT if(niter->magic != NODE_MAGIC) { ShowError(read_message("Source.common.mempool_destroy2"), p->name, niter); continue; } #endif p->ondealloc(NODE_TO_DATA(niter)); } }//endif: ondealloc callback? // simple .. aFree(seg); seg = segnext; } // Clear node ptr p->free_list = NULL; InterlockedExchange64(&p->num_nodes_free, 0); InterlockedExchange64(&p->num_nodes_total, 0); InterlockedExchange64(&p->num_segments, 0); InterlockedExchange64(&p->num_bytes_total, 0); LeaveSpinLock(&p->nodeLock); LeaveSpinLock(&p->segmentLock); // Free pool itself :D aFree(p->name); aFree(p); }//end: mempool_destroy()
/** * Loads group configuration from config file into memory. * @private */ 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 (conf_read_file(&pc_group_config, config_filename)) return; groups = config_lookup(&pc_group_config, "groups"); if (groups != NULL) { GroupSettings *group_settings = NULL; DBIterator *iter = NULL; int i, loop = 0; group_count = config_setting_length(groups); for (i = 0; i < group_count; ++i) { int id = 0, level = 0; const char *groupname = NULL; int log_commands = 0; config_setting_t *group = config_setting_get_elem(groups, i); if (!config_setting_lookup_int(group, "id", &id)) { ShowConfigWarning(group, "pc_groups:read_config: \"groups\" list member #%d has undefined id, removing...", i); config_setting_remove_elem(groups, i); --i; --group_count; continue; } if (id2group(id) != NULL) { ShowConfigWarning(group, "pc_groups:read_config: duplicate group id %d, removing...", i); config_setting_remove_elem(groups, i); --i; --group_count; continue; } config_setting_lookup_int(group, "level", &level); config_setting_lookup_bool(group, "log_commands", &log_commands); if (!config_setting_lookup_string(group, "name", &groupname)) { char temp[20]; config_setting_t *name = NULL; snprintf(temp, sizeof(temp), "Group %d", id); if ((name = config_setting_add(group, "name", CONFIG_TYPE_STRING)) == NULL || !config_setting_set_string(name, temp)) { ShowError("pc_groups:read_config: failed to set missing group name, id=%d, skipping... (%s:%d)\n", id, config_setting_source_file(group), config_setting_source_line(group)); continue; } config_setting_lookup_string(group, "name", &groupname); // Retrieve the pointer } if (name2group(groupname) != NULL) { ShowConfigWarning(group, "pc_groups:read_config: duplicate group name %s, removing...", groupname); config_setting_remove_elem(groups, i); --i; --group_count; continue; } CREATE(group_settings, GroupSettings, 1); group_settings->id = id; group_settings->level = level; group_settings->name = groupname; group_settings->log_commands = (bool)log_commands; group_settings->inherit = config_setting_get_member(group, "inherit"); group_settings->commands = config_setting_get_member(group, "commands"); group_settings->permissions = config_setting_get_member(group, "permissions"); group_settings->inheritance_done = false; group_settings->root = group; group_settings->group_pos = i; strdb_put(pc_groupname_db, groupname, group_settings); idb_put(pc_group_db, id, group_settings); } group_count = config_setting_length(groups); // Save number of groups // Check if all commands and permissions exist iter = db_iterator(pc_group_db); for (group_settings = dbi_first(iter); dbi_exists(iter); group_settings = dbi_next(iter)) { config_setting_t *commands = group_settings->commands, *permissions = group_settings->permissions; int count = 0, j; // Make sure there is "commands" group if (commands == NULL) commands = group_settings->commands = config_setting_add(group_settings->root, "commands", CONFIG_TYPE_GROUP); count = config_setting_length(commands); for (j = 0; j < count; ++j) { config_setting_t *command = config_setting_get_elem(commands, j); const char *name = config_setting_name(command); if (!atcommand_exists(name)) { ShowConfigWarning(command, "pc_groups:read_config: non-existent command name '%s', removing...", name); config_setting_remove(commands, name); --j; --count; } } // Make sure there is "permissions" group if (permissions == NULL) permissions = group_settings->permissions = config_setting_add(group_settings->root, "permissions", CONFIG_TYPE_GROUP); count = config_setting_length(permissions); for(j = 0; j < count; ++j) { config_setting_t *permission = config_setting_get_elem(permissions, j); const char *name = config_setting_name(permission); int p; ARR_FIND(0, ARRAYLENGTH(pc_g_permission_name), p, strcmp(pc_g_permission_name[p].name, name) == 0); if (p == ARRAYLENGTH(pc_g_permission_name)) { ShowConfigWarning(permission, "pc_groups:read_config: non-existent permission name '%s', removing...", name); config_setting_remove(permissions, name); --p; --count; } } } dbi_destroy(iter); // Apply inheritance i = 0; // counter for processed groups while (i < group_count) { iter = db_iterator(pc_group_db); for (group_settings = dbi_first(iter); dbi_exists(iter); group_settings = dbi_next(iter)) { config_setting_t *inherit = NULL, *commands = group_settings->commands, *permissions = group_settings->permissions; int j, inherit_count = 0, done = 0; if (group_settings->inheritance_done) // group already processed continue; if ((inherit = group_settings->inherit) == NULL || (inherit_count = config_setting_length(inherit)) <= 0) { // this group does not inherit from others ++i; group_settings->inheritance_done = true; continue; } for (j = 0; j < inherit_count; ++j) { GroupSettings *inherited_group = NULL; const char *groupname = config_setting_get_string_elem(inherit, j); if (groupname == NULL) { ShowConfigWarning(inherit, "pc_groups:read_config: \"inherit\" array member #%d is not a name, removing...", j); config_setting_remove_elem(inherit,j); continue; } if ((inherited_group = name2group(groupname)) == NULL) { ShowConfigWarning(inherit, "pc_groups:read_config: non-existent group name \"%s\", removing...", groupname); config_setting_remove_elem(inherit,j); continue; } if (!inherited_group->inheritance_done) continue; // we need to do that group first // Copy settings (commands/permissions) that are not defined yet if (inherited_group->commands != NULL) { int l = 0, commands_count = config_setting_length(inherited_group->commands); for (l = 0; l < commands_count; ++l) config_setting_copy(commands, config_setting_get_elem(inherited_group->commands, l)); } if (inherited_group->permissions != NULL) { int l = 0, permissions_count = config_setting_length(inherited_group->permissions); for (l = 0; l < permissions_count; ++l) config_setting_copy(permissions, config_setting_get_elem(inherited_group->permissions, l)); } ++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 } } dbi_destroy(iter); if (++loop > group_count) { ShowWarning("pc_groups:read_config: Could not process inheritance rules, check your config '%s' for cycles...\n", config_filename); break; } } // while(i < group_count) // Pack permissions into GroupSettings.e_permissions for faster checking iter = db_iterator(pc_group_db); for (group_settings = dbi_first(iter); dbi_exists(iter); group_settings = dbi_next(iter)) { config_setting_t *permissions = group_settings->permissions; int c, count = config_setting_length(permissions); for (c = 0; c < count; ++c) { config_setting_t *perm = config_setting_get_elem(permissions, c); const char *name = config_setting_name(perm); int val = config_setting_get_bool(perm); int j; if (val == 0) // does not have this permission continue; ARR_FIND(0, ARRAYLENGTH(pc_g_permission_name), j, strcmp(pc_g_permission_name[j].name, name) == 0); group_settings->e_permissions |= pc_g_permission_name[j].permission; } } dbi_destroy(iter); } ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' groups in '"CL_WHITE"%s"CL_RESET"'.\n", group_count, config_filename); if( ( pc_group_max = group_count ) ) { DBIterator *iter = db_iterator(pc_group_db); GroupSettings *group_settings = NULL; int* group_ids = aMalloc( pc_group_max * sizeof(int) ); int i = 0; for (group_settings = dbi_first(iter); dbi_exists(iter); group_settings = dbi_next(iter)) { group_ids[i++] = group_settings->id; } atcommand_db_load_groups(group_ids); aFree(group_ids); dbi_destroy(iter); } }
/*========================================== * Cleanup Message Data *------------------------------------------*/ void do_final_msg(void) { int i; for (i = 0; i < MAX_JOB_NAMES; i++) aFree(msg_table[i]); }
const char* get_svn_revision(void) { static char svn_version_buffer[16] = ""; FILE *fp; if( svn_version_buffer[0] != '\0' ) return svn_version_buffer; // subversion 1.7 uses a sqlite3 database // FIXME this is hackish at best... // - ignores database file structure // - assumes the data in NODES.dav_cache column ends with "!svn/ver/<revision>/<path>)" // - since it's a cache column, the data might not even exist if( (fp = fopen(".svn"PATHSEP_STR"wc.db", "rb")) != NULL || (fp = fopen(".."PATHSEP_STR".svn"PATHSEP_STR"wc.db", "rb")) != NULL ) { #ifndef SVNNODEPATH //not sure how to handle branches, so i'll leave this overridable define until a better solution comes up #define SVNNODEPATH trunk #endif const char* prefix = "!svn/ver/"; const char* postfix = "/"EXPAND_AND_QUOTE(SVNNODEPATH)")"; // there should exist only 1 entry like this size_t prefix_len = strlen(prefix); size_t postfix_len = strlen(postfix); size_t i,j,len; char* buffer; // read file to buffer fseek(fp, 0, SEEK_END); len = ftell(fp); buffer = (char*)aMalloc(len + 1); fseek(fp, 0, SEEK_SET); len = fread(buffer, 1, len, fp); buffer[len] = '\0'; fclose(fp); // parse buffer for( i = prefix_len + 1; i + postfix_len <= len; ++i ) { if( buffer[i] != postfix[0] || memcmp(buffer + i, postfix, postfix_len) != 0 ) continue; // postfix missmatch for( j = i; j > 0; --j ) {// skip digits if( !ISDIGIT(buffer[j - 1]) ) break; } if( memcmp(buffer + j - prefix_len, prefix, prefix_len) != 0 ) continue; // prefix missmatch // done snprintf(svn_version_buffer, sizeof(svn_version_buffer), "%d", atoi(buffer + j)); break; } aFree(buffer); if( svn_version_buffer[0] != '\0' ) return svn_version_buffer; } // subversion 1.6 and older? if ((fp = fopen(".svn/entries", "r")) != NULL) { char line[1024]; int rev; // Check the version if (fgets(line, sizeof(line), fp)) { if(!ISDIGIT(line[0])) { // XML File format while (fgets(line,sizeof(line),fp)) if (strstr(line,"revision=")) break; if (sscanf(line," %*[^\"]\"%d%*[^\n]", &rev) == 1) { snprintf(svn_version_buffer, sizeof(svn_version_buffer), "%d", rev); } } else { // Bin File format if ( fgets(line, sizeof(line), fp) == NULL ) { printf("Can't get bin name\n"); } // Get the name if ( fgets(line, sizeof(line), fp) == NULL ) { printf("Can't get entries kind\n"); } // Get the entries kind if(fgets(line, sizeof(line), fp)) // Get the rev numver { snprintf(svn_version_buffer, sizeof(svn_version_buffer), "%d", atoi(line)); } } } fclose(fp); if( svn_version_buffer[0] != '\0' ) return svn_version_buffer; } // fallback svn_version_buffer[0] = UNKNOWN_VERSION; return svn_version_buffer; }
static int guild_infoevent_db_final(DBKey key,void *data,va_list ap) { aFree(data); return 0; }
// 情報所得 int guild_recv_info(struct guild *sg) { struct guild *g,before; int i,bm,m; struct eventlist *ev,*ev2; struct map_session_data *sd; bool guild_new = false; nullpo_ret(sg); if((g = (struct guild*)idb_get(guild_db,sg->guild_id))==NULL) { guild_new = true; g=(struct guild *)aCalloc(1,sizeof(struct guild)); idb_put(guild_db,sg->guild_id,g); before=*sg; // 最初のロードなのでユーザーのチェックを行う guild_check_member(sg); if ((sd = map_nick2sd(sg->master)) != NULL) { //If the guild master is online the first time the guild_info is received, //that means he was the first to join, so apply guild skill blocking here. if( battle_config.guild_skill_relog_delay ) guild_block_skill(sd, 300000); //Also set the guild master flag. sd->state.gmaster_flag = g; clif_charnameupdate(sd); // [LuzZza] clif_guild_masterormember(sd); } }else before=*g; memcpy(g,sg,sizeof(struct guild)); 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); if (sd) clif_charnameupdate(sd); // [LuzZza] m++; }else g->member[i].sd=NULL; if(before.member[i].account_id>0) bm++; } for(i=0;i<g->max_member;i++){ // 情報の送信 sd = g->member[i].sd; if( sd==NULL ) continue; if( before.guild_lv!=g->guild_lv || bm!=m || before.max_member!=g->max_member ){ clif_guild_basicinfo(sd); // 基本情報送信 clif_guild_emblem(sd,g); // エンブレム送信 } if(bm!=m){ // メンバー情報送信 clif_guild_memberlist(g->member[i].sd); } if( before.skill_point!=g->skill_point) clif_guild_skillinfo(sd); // スキル情報送信 if( guild_new ){ // 未送信なら所属情報も送る clif_guild_belonginfo(sd,g); clif_guild_notice(sd,g); sd->guild_emblem_id=g->emblem_id; } } // イベントの発生 if( (ev = (struct eventlist*)idb_remove(guild_infoevent_db,sg->guild_id))!=NULL ) { while(ev){ npc_event_do(ev->name); ev2=ev->next; aFree(ev); ev=ev2; } } return 0; }
/** * Retrieves the Operating System version (Windows only). * * Once retrieved, the version string is stored into sysinfo->p->osversion. */ void sysinfo_osversion_retrieve(void) { OSVERSIONINFOEX osvi; StringBuf buf; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); StrBuf->Init(&buf); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (sysinfo->p->osversion != NULL) { aFree(sysinfo->p->osversion); sysinfo->p->osversion = NULL; } /* * #pragma rantmode (on) * Some engineer at Microsoft moronically decided that, since some applications use this information to do version checks and refuse to * run if they detect a new, unknown version of Windows, now nobody will be able to rely on this information anymore, not even those who * need it for reporting or logging. * The correct fix was to let those applications break, and their developer fix them (and in the meanwhile let the users use the * Compatibility settings to run them) but no, they decided they'd deprecate the API, and make it lie for those who use it, reporting * windows 8 even if they're running on 8.1 or newer. * The API wasn't broken, applications were. Now we have broken applications, and a broken API. Great move, Microsoft. Oh right, * there's the Version API helper functions. Or maybe not, since you can only do 'are we running on at least version X?' checks with * those, it's not what we need. * You know what? I'll just silence your deprecation warning for the time being. Maybe by the time you release the next version of * Windows, you'll have provided a less crippled API or something. * #pragma rantmode (off) */ #pragma warning (push) #pragma warning (disable : 4996) if (!GetVersionEx((OSVERSIONINFO*) &osvi)) { sysinfo->p->osversion = aStrdup("Unknown Version"); return; } #pragma warning (pop) if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId // Windows NT Family && ((osvi.dwMajorVersion > 4 && osvi.dwMajorVersion < 6) || (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 3)) // Between XP and 8.1 ) { if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 3) { // Between Vista and 8.1 PGPI pGPI; DWORD dwType; if (osvi.dwMinorVersion == 0) { StrBuf->AppendStr(&buf, osvi.wProductType == VER_NT_WORKSTATION ? "Windows Vista" : "Windows Server 2008"); } else if (osvi.dwMinorVersion == 1) { StrBuf->AppendStr(&buf, osvi.wProductType == VER_NT_WORKSTATION ? "Windows 7" : "Windows Server 2008 R2"); } else { // If it's 2, it can be Windows 8, or any newer version (8.1 at the time of writing this) -- see above for the reason. switch (osvi.dwMinorVersion) { case 2: { ULONGLONG mask = 0; OSVERSIONINFOEX osvi2; ZeroMemory(&osvi2, sizeof(OSVERSIONINFOEX)); osvi2.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); osvi2.dwMajorVersion = 6; osvi2.dwMinorVersion = 2; VER_SET_CONDITION(mask, VER_MAJORVERSION, VER_LESS_EQUAL); VER_SET_CONDITION(mask, VER_MINORVERSION, VER_LESS_EQUAL); if (VerifyVersionInfo(&osvi2, VER_MAJORVERSION | VER_MINORVERSION, mask)) { StrBuf->AppendStr(&buf, osvi.wProductType == VER_NT_WORKSTATION ? "Windows 8" : "Windows Server 2012"); break; } } case 3: StrBuf->AppendStr(&buf, osvi.wProductType == VER_NT_WORKSTATION ? "Windows 8.1" : "Windows Server 2012 R2"); } } pGPI = (PGPI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo"); pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType); switch (dwType) { case msPRODUCT_ULTIMATE: case msPRODUCT_ULTIMATE_N: StrBuf->AppendStr(&buf, " Ultimate"); break; case msPRODUCT_PROFESSIONAL: case msPRODUCT_PROFESSIONAL_N: case msPRODUCT_PROFESSIONAL_WMC: StrBuf->AppendStr(&buf, " Professional"); break; case msPRODUCT_HOME_PREMIUM: case msPRODUCT_HOME_PREMIUM_N: StrBuf->AppendStr(&buf, " Home Premium"); break; case msPRODUCT_HOME_BASIC: case msPRODUCT_HOME_BASIC_N: StrBuf->AppendStr(&buf, " Home Basic"); break; case msPRODUCT_ENTERPRISE: case msPRODUCT_ENTERPRISE_N: case msPRODUCT_ENTERPRISE_SERVER: case msPRODUCT_ENTERPRISE_SERVER_CORE: case msPRODUCT_ENTERPRISE_SERVER_IA64: case msPRODUCT_ENTERPRISE_SERVER_V: case msPRODUCT_ENTERPRISE_SERVER_CORE_V: case msPRODUCT_ENTERPRISE_EVALUATION: case msPRODUCT_ENTERPRISE_N_EVALUATION: StrBuf->AppendStr(&buf, " Enterprise"); break; case msPRODUCT_BUSINESS: case msPRODUCT_BUSINESS_N: StrBuf->AppendStr(&buf, " Business"); break; case msPRODUCT_STARTER: case msPRODUCT_STARTER_N: StrBuf->AppendStr(&buf, " Starter"); break; case msPRODUCT_CLUSTER_SERVER: case msPRODUCT_CLUSTER_SERVER_V: StrBuf->AppendStr(&buf, " Cluster Server"); break; case msPRODUCT_DATACENTER_SERVER: case msPRODUCT_DATACENTER_SERVER_CORE: case msPRODUCT_DATACENTER_SERVER_V: case msPRODUCT_DATACENTER_SERVER_CORE_V: case msPRODUCT_DATACENTER_EVALUATION_SERVER: StrBuf->AppendStr(&buf, " Datacenter"); break; case msPRODUCT_SMALLBUSINESS_SERVER: case msPRODUCT_SMALLBUSINESS_SERVER_PREMIUM: case msPRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE: StrBuf->AppendStr(&buf, " Small Business Server"); break; case PRODUCT_STANDARD_SERVER: case PRODUCT_STANDARD_SERVER_CORE: case msPRODUCT_STANDARD_SERVER_V: case msPRODUCT_STANDARD_SERVER_CORE_V: case msPRODUCT_STANDARD_EVALUATION_SERVER: StrBuf->AppendStr(&buf, " Standard"); break; case msPRODUCT_WEB_SERVER: case msPRODUCT_WEB_SERVER_CORE: StrBuf->AppendStr(&buf, " Web Server"); break; case msPRODUCT_STORAGE_EXPRESS_SERVER: case msPRODUCT_STORAGE_STANDARD_SERVER: case msPRODUCT_STORAGE_WORKGROUP_SERVER: case msPRODUCT_STORAGE_ENTERPRISE_SERVER: case msPRODUCT_STORAGE_EXPRESS_SERVER_CORE: case msPRODUCT_STORAGE_STANDARD_SERVER_CORE: case msPRODUCT_STORAGE_WORKGROUP_SERVER_CORE: case msPRODUCT_STORAGE_ENTERPRISE_SERVER_CORE: case msPRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER: case msPRODUCT_STORAGE_STANDARD_EVALUATION_SERVER: StrBuf->AppendStr(&buf, " Storage Server"); break; case msPRODUCT_HOME_SERVER: case msPRODUCT_SERVER_FOR_SMALLBUSINESS: case msPRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT: case msPRODUCT_MEDIUMBUSINESS_SERVER_SECURITY: case msPRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING: case msPRODUCT_SERVER_FOR_SMALLBUSINESS_V: case msPRODUCT_SERVER_FOUNDATION: case msPRODUCT_HOME_PREMIUM_SERVER: case msPRODUCT_HYPERV: case msPRODUCT_SB_SOLUTION_SERVER: case msPRODUCT_SERVER_FOR_SB_SOLUTIONS: case msPRODUCT_STANDARD_SERVER_SOLUTIONS: case msPRODUCT_STANDARD_SERVER_SOLUTIONS_CORE: case msPRODUCT_SB_SOLUTION_SERVER_EM: case msPRODUCT_SERVER_FOR_SB_SOLUTIONS_EM: case msPRODUCT_SOLUTION_EMBEDDEDSERVER: case msPRODUCT_ESSENTIALBUSINESS_SERVER_MGMT: case msPRODUCT_ESSENTIALBUSINESS_SERVER_ADDL: case msPRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC: case msPRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC: case msPRODUCT_MULTIPOINT_STANDARD_SERVER: case msPRODUCT_MULTIPOINT_PREMIUM_SERVER: StrBuf->AppendStr(&buf, " Server (other)"); break; case msPRODUCT_CORE_N: case msPRODUCT_CORE_COUNTRYSPECIFIC: case msPRODUCT_CORE_SINGLELANGUAGE: case msPRODUCT_CORE: StrBuf->AppendStr(&buf, " Workstation (other)"); break; } } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { // XP x64 and Server 2003 if (osvi.wProductType == VER_NT_WORKSTATION) { StrBuf->AppendStr(&buf, "Windows XP Professional"); } else { if (GetSystemMetrics(msSM_SERVERR2)) StrBuf->AppendStr(&buf, "Windows Server 2003 R2"); else if (osvi.wSuiteMask & msVER_SUITE_STORAGE_SERVER) StrBuf->AppendStr(&buf, "Windows Storage Server 2003"); else if (osvi.wSuiteMask & msVER_SUITE_WH_SERVER) StrBuf->AppendStr(&buf, "Windows Home Server"); else StrBuf->AppendStr(&buf, "Windows Server 2003"); // Test for the server type. if (osvi.wSuiteMask & msVER_SUITE_COMPUTE_SERVER) StrBuf->AppendStr(&buf, " Compute Cluster"); else if (osvi.wSuiteMask & VER_SUITE_DATACENTER) StrBuf->AppendStr(&buf, " Datacenter"); else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) StrBuf->AppendStr(&buf, " Enterprise"); else if (osvi.wSuiteMask & msVER_SUITE_BLADE) StrBuf->AppendStr(&buf, " Web"); else StrBuf->AppendStr(&buf, " Standard"); } } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { // XP StrBuf->AppendStr(&buf, "Windows XP"); if (osvi.wSuiteMask & VER_SUITE_EMBEDDEDNT) StrBuf->AppendStr(&buf, " Embedded"); else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) StrBuf->AppendStr(&buf, " Home"); else StrBuf->AppendStr(&buf, " Professional"); } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) { // 2000 StrBuf->AppendStr(&buf, "Windows 2000"); if (osvi.wProductType == VER_NT_WORKSTATION) StrBuf->AppendStr(&buf, " Professional"); else if (osvi.wSuiteMask & VER_SUITE_DATACENTER) StrBuf->AppendStr(&buf, " Datacenter Server"); else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) StrBuf->AppendStr(&buf, " Advanced Server"); else StrBuf->AppendStr(&buf, " Server"); } else { StrBuf->Printf(&buf, "Versao do windows desconhecida %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); } } // Include service pack (if any) and build number. if (osvi.szCSDVersion[0] != '\0') { StrBuf->Printf(&buf, " %s", osvi.szCSDVersion); } StrBuf->Printf(&buf, " (build %d)", osvi.dwBuildNumber); sysinfo->p->osversion = aStrdup(StrBuf->Value(&buf)); StrBuf->Destroy(&buf); return; }
/** * Destroys this iterator, releasing all allocated memory (including itself). * @param self: pointer to db iterator */ static void account_db_sql_iter_destroy(AccountDBIterator* self) { AccountDBIterator_SQL* iter = (AccountDBIterator_SQL*)self; aFree(iter); }
/** * Retrieves the current SVN revision. * * @param out[out] a string pointer to return the value (to be aFree()'d.) * @retval true if a revision was correctly detected. * @retval false if no revision was detected. out is set to NULL in this case. */ bool sysinfo_svn_get_revision(char **out) { // Only include SVN support if detected it, or we're on MSVC #if !defined(SYSINFO_VCSTYPE) || SYSINFO_VCSTYPE == VCSTYPE_SVN || SYSINFO_VCSTYPE == VCSTYPE_UNKNOWN FILE *fp; // subversion 1.7 uses a sqlite3 database // FIXME this is hackish at best... // - ignores database file structure // - assumes the data in NODES.dav_cache column ends with "!svn/ver/<revision>/<path>)" // - since it's a cache column, the data might not even exist if ((fp = fopen(".svn"PATHSEP_STR"wc.db", "rb")) != NULL || (fp = fopen(".."PATHSEP_STR".svn"PATHSEP_STR"wc.db", "rb")) != NULL) { #ifndef SVNNODEPATH //not sure how to handle branches, so I'll leave this overridable define until a better solution comes up #define SVNNODEPATH trunk #endif // SVNNODEPATH const char* prefix = "!svn/ver/"; const char* postfix = "/"EXPAND_AND_QUOTE(SVNNODEPATH)")"; // there should exist only 1 entry like this size_t prefix_len = strlen(prefix); size_t postfix_len = strlen(postfix); size_t i,j,flen; char* buffer; // read file to buffer fseek(fp, 0, SEEK_END); flen = ftell(fp); buffer = (char*)aMalloc(flen + 1); fseek(fp, 0, SEEK_SET); flen = fread(buffer, 1, flen, fp); buffer[flen] = '\0'; fclose(fp); // parse buffer for (i = prefix_len + 1; i + postfix_len <= flen; ++i) { if (buffer[i] != postfix[0] || memcmp(buffer + i, postfix, postfix_len) != 0) continue; // postfix mismatch for (j = i; j > 0; --j) { // skip digits if (!ISDIGIT(buffer[j - 1])) break; } if (memcmp(buffer + j - prefix_len, prefix, prefix_len) != 0) continue; // prefix mismatch // done if (*out != NULL) aFree(*out); *out = aCalloc(1, 8); snprintf(*out, 8, "%d", atoi(buffer + j)); break; } aFree(buffer); if (*out != NULL) return true; } // subversion 1.6 and older? if ((fp = fopen(".svn/entries", "r")) != NULL) { char line[1024]; int rev; // Check the version if (fgets(line, sizeof(line), fp)) { if (!ISDIGIT(line[0])) { // XML File format while (fgets(line,sizeof(line),fp)) if (strstr(line,"revision=")) break; if (sscanf(line," %*[^\"]\"%d%*[^\n]", &rev) == 1) { if (*out != NULL) aFree(*out); *out = aCalloc(1, 8); snprintf(*out, 8, "%d", rev); } } else { // Bin File format if (fgets(line, sizeof(line), fp) == NULL) { printf("Can't get bin name\n"); } // Get the name if (fgets(line, sizeof(line), fp) == NULL) { printf("Can't get entries kind\n"); } // Get the entries kind if (fgets(line, sizeof(line), fp)) { // Get the rev numver if (*out != NULL) aFree(*out); *out = aCalloc(1, 8); snprintf(*out, 8, "%d", atoi(line)); } } } fclose(fp); if (*out != NULL) return true; } #endif if (*out != NULL) aFree(*out); *out = NULL; return false; }
void inter_pet_sql_final(void) { if (inter_pet->pt) aFree(inter_pet->pt); return; }
/** * Open buyingstore for Autotrader * @param sd Player as autotrader */ void buyingstore_reopen( struct map_session_data* sd ){ struct s_autotrader *at = NULL; int8 fail = -1; nullpo_retv(sd); // Ready to open buyingstore for this char if ((at = (struct s_autotrader *)uidb_get(buyingstore_autotrader_db, sd->status.char_id)) && at->count && at->entries) { uint8 *data, *p; uint16 j, count; // Init buyingstore data for autotrader CREATE(data, uint8, at->count * 8); for (j = 0, p = data, count = at->count; j < at->count; j++) { struct s_autotrade_entry *entry = at->entries[j]; unsigned short *item_id = (uint16*)(p + 0); uint16 *amount = (uint16*)(p + 2); uint32 *price = (uint32*)(p + 4); *item_id = entry->item_id; *amount = entry->amount; *price = entry->price; p += 8; } sd->state.autotrade = 1; // Make sure abort all NPCs npc_event_dequeue(sd); pc_cleareventtimer(sd); // Open the buyingstore again if( (fail = buyingstore_setup( sd, (unsigned char)at->count )) == 0 && (fail = buyingstore_create( sd, at->limit, 1, at->title, data, at->count, at )) == 0 ) { // Make buyer look perfect pc_setdir(sd, at->dir, at->head_dir); clif_changed_dir(&sd->bl, AREA_WOS); if( at->sit ) { pc_setsit(sd); skill_sit(sd, 1); clif_sitting(&sd->bl); } // Immediate save chrif_save(sd, 3); ShowInfo("Buyingstore loaded for '"CL_WHITE"%s"CL_RESET"' with '"CL_WHITE"%d"CL_RESET"' items at "CL_WHITE"%s (%d,%d)"CL_RESET"\n", sd->status.name, count, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); } aFree(data); } if (at) { buyingstore_autotrader_remove(at, true); if (db_size(buyingstore_autotrader_db) == 0) buyingstore_autotrader_db->clear(buyingstore_autotrader_db, buyingstore_autotrader_free); } if (fail != 0) { ShowError("buyingstore_reopen: (Error:%d) Load failed for autotrader '"CL_WHITE"%s"CL_RESET"' (CID=%/AID=%d)\n", fail, sd->status.name, sd->status.char_id, sd->status.account_id); map_quit(sd); } }
int32 map_cleanup(uint32 tick, CTaskMgr::CTask* PTask) { map_session_list_t::iterator it = map_session_list.begin(); while(it != map_session_list.end()) { map_session_data_t* map_session_data = it->second; CCharEntity* PChar = map_session_data->PChar; if ((time(NULL) - map_session_data->last_update) > 5) { if (PChar != NULL && !(PChar->nameflags.flags & FLAG_DC)) { PChar->nameflags.flags |= FLAG_DC; if (PChar->status == STATUS_NORMAL) { PChar->status = STATUS_UPDATE; PChar->loc.zone->SpawnPCs(PChar); } } if ((time(NULL) - map_session_data->last_update) > map_config.max_time_lastupdate) { if (PChar != NULL) { //[Alliance] fix to stop server crashing: //if a party within an alliance only has 1 char (that char will be party leader) //if char then disconnects we need to tell the server about the alliance change if(PChar->PParty != NULL && PChar->PParty->m_PAlliance != NULL && PChar->PParty->GetLeader() == PChar){ if(PChar->PParty->members.size() == 1){ if(PChar->PParty->m_PAlliance->partyList.size() == 2){ PChar->PParty->m_PAlliance->dissolveAlliance(); }else if(PChar->PParty->m_PAlliance->partyList.size() == 3){ PChar->PParty->m_PAlliance->removeParty(PChar->PParty); } } } // uncharm pet if player d/c if (PChar->PPet != NULL && PChar->PPet->objtype == TYPE_MOB) petutils::DespawnPet(PChar); ShowDebug(CL_CYAN"map_cleanup: %s timed out, closing session\n" CL_RESET, PChar->GetName()); PChar->status = STATUS_SHUTDOWN; PacketParser[0x00D](map_session_data, PChar, 0); } else if(!map_session_data->shuttingDown){ ShowWarning(CL_YELLOW"map_cleanup: WHITHOUT CHAR timed out, session closed\n" CL_RESET); const int8* Query = "DELETE FROM accounts_sessions WHERE client_addr = %u AND client_port = %u"; Sql_Query(SqlHandle, Query, map_session_data->client_addr, map_session_data->client_port); aFree(map_session_data->server_packet_data); map_session_list.erase(it++); delete map_session_data; continue; } } } else if (PChar != NULL && (PChar->nameflags.flags & FLAG_DC)) { PChar->nameflags.flags &= ~FLAG_DC; PChar->pushPacket(new CCharUpdatePacket(PChar)); if (PChar->status == STATUS_NORMAL) { PChar->status = STATUS_UPDATE; PChar->loc.zone->SpawnPCs(PChar); } charutils::SaveCharStats(PChar); } ++it; } return 0; }
/*========================================== * processes one itemdb entry *------------------------------------------*/ static bool itemdb_parse_dbrow(char** str, const char* source, int line, int scriptopt, char *comboScript) { /* +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+ | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+ | id | name_english | name_japanese | type | price_buy | price_sell | weight | attack | defence | range | slots | equip_jobs | equip_upper | equip_genders | equip_locations | weapon_level | equip_level | refineable | view | script | equip_script | unequip_script | +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+ */ int nameid; struct item_data* id; nameid = atoi(str[0]); if( nameid <= 0 ) { ShowWarning("itemdb_parse_dbrow: Invalid id %d in line %d of \"%s\", skipping.\n", nameid, line, source); return false; } //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View id = itemdb_load(nameid); safestrncpy(id->name, str[1], sizeof(id->name)); safestrncpy(id->jname, str[2], sizeof(id->jname)); id->type = atoi(str[3]); if( id->type < 0 || id->type == IT_UNKNOWN || id->type == IT_UNKNOWN2 || ( id->type > IT_DELAYCONSUME && id->type < IT_CASH ) || id->type >= IT_MAX ) {// catch invalid item types ShowWarning("itemdb_parse_dbrow: Invalid item type %d for item %d. IT_ETC will be used.\n", id->type, nameid); id->type = IT_ETC; } if (id->type == IT_DELAYCONSUME) { //Items that are consumed only after target confirmation id->type = IT_USABLE; id->flag.delay_consume = 1; } else //In case of an itemdb reload and the item type changed. id->flag.delay_consume = 0; //When a particular price is not given, we should base it off the other one //(it is important to make a distinction between 'no price' and 0z) if ( str[4][0] ) id->value_buy = atoi(str[4]); else id->value_buy = atoi(str[5]) * 2; if ( str[5][0] ) id->value_sell = atoi(str[5]); else id->value_sell = id->value_buy / 2; /* if ( !str[4][0] && !str[5][0]) { ShowWarning("itemdb_parse_dbrow: No buying/selling price defined for item %d (%s), using 20/10z\n", nameid, id->jname); id->value_buy = 20; id->value_sell = 10; } else */ if (id->value_buy/124. < id->value_sell/75.) ShowWarning("itemdb_parse_dbrow: Buying/Selling [%d/%d] price of item %d (%s) allows Zeny making exploit through buying/selling at discounted/overcharged prices!\n", id->value_buy, id->value_sell, nameid, id->jname); id->weight = atoi(str[6]); #ifdef RENEWAL itemdb_re_split_atoi(str[7],&id->atk,&id->matk); #else id->atk = atoi(str[7]); #endif id->def = atoi(str[8]); id->range = atoi(str[9]); id->slot = atoi(str[10]); if (id->slot > MAX_SLOTS) { ShowWarning("itemdb_parse_dbrow: Item %d (%s) specifies %d slots, but the server only supports up to %d. Using %d slots.\n", nameid, id->jname, id->slot, MAX_SLOTS, MAX_SLOTS); id->slot = MAX_SLOTS; } itemdb_jobid2mapid(id->class_base, (unsigned int)strtoul(str[11],NULL,0)); id->class_upper = atoi(str[12]); id->sex = atoi(str[13]); id->equip = atoi(str[14]); if (!id->equip && itemdb_isequip2(id)) { ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname); id->type = IT_ETC; } id->wlv = cap_value(atoi(str[15]), REFINE_TYPE_ARMOR, REFINE_TYPE_MAX); id->elv = atoi(str[16]); id->flag.no_refine = atoi(str[17]) ? 0 : 1; //FIXME: verify this id->look = atoi(str[18]); id->flag.available = 1; id->view_id = 0; id->sex = itemdb_gendercheck(id); //Apply gender filtering. if (id->script) { script_free_code(id->script); id->script = NULL; } if (id->equip_script) { script_free_code(id->equip_script); id->equip_script = NULL; } if (id->unequip_script) { script_free_code(id->unequip_script); id->unequip_script = NULL; } if (*str[19]) { char *scriptCode = str[19]; if ( comboScript ) { char *script1 = str[19]; while (*script1++ != '{'); scriptCode = (char *)aMalloc(strlen(script1) + strlen(comboScript) + 2); // +2 = {\0 sprintf(scriptCode, "{%s%s", comboScript, script1); } id->script = parse_script(scriptCode, source, line, scriptopt); if( comboScript ) aFree(scriptCode); } else if ( comboScript ) id->script = parse_script(comboScript, source, line, scriptopt); if (*str[20]) id->equip_script = parse_script(str[20], source, line, scriptopt); if (*str[21]) id->unequip_script = parse_script(str[21], source, line, scriptopt); return true; }
void inter_pet_sql_final(void){ if (pet_pt) aFree(pet_pt); return; }
void inter_homunculus_sql_final(void){ if (homun_pt) aFree(homun_pt); return; }
void inter_party_sql_final() { if (party_pt) aFree(party_pt); return; }
void inter_party_sql_final(void) { party_db_->destroy(party_db_, NULL); aFree(party_pt); return; }
/// Destroys this iterator, releasing all allocated memory (including itself). static void account_db_txt_iter_destroy(AccountDBIterator* self) { AccountDBIterator_TXT* iter = (AccountDBIterator_TXT*)self; dbi_destroy(iter->iter); aFree(iter); }
/*-------------------------------------- * Used for instance variables. Clean each variable from memory. *--------------------------------------*/ void instance_destroy_freesvar(void *key, void *data, va_list args) { if( data ) aFree(data); }