/*========================================== * charid_dbへ追加(返信待ちがあれば返信) *------------------------------------------ */ void map_addchariddb(int charid,char *name) { struct charid2nick *p; int req=0; p=numdb_search(charid_db,charid); if(p==NULL){ // データベースにない p = malloc(sizeof(struct charid2nick)); if(p==NULL){ printf("out of memory : map_addchariddb\n"); exit(1); } p->req_id=0; }else numdb_erase(charid_db,charid); req=p->req_id; memcpy(p->nick,name,24); p->req_id=0; numdb_insert(charid_db,charid,p); if(req){ // 返信待ちがあれば返信 struct map_session_data *sd = map_id2sd(req); if(sd!=NULL) clif_solved_charname(sd,charid); } }
/*========================================== * ホム削除 *------------------------------------------ */ bool homundb_sql_delete(int homun_id) { bool result = false; if( sqldbs_transaction_start(&mysql_handle) == false ) return result; // try do { // delete homun if( sqldbs_query(&mysql_handle, "DELETE FROM `" HOMUN_TABLE "` WHERE `homun_id`='%d'", homun_id) == false ) break; // delete homun skill if( sqldbs_query(&mysql_handle, "DELETE FROM `" HOMUN_SKILL_TABLE "` WHERE `homun_id`='%d'", homun_id) == false ) break; // success result = true; { // cache delete struct mmo_homunstatus *p = (struct mmo_homunstatus *)numdb_erase(homun_db, homun_id); if(p) { aFree(p); } } } while(0); sqldbs_transaction_end(&mysql_handle, result); return result; }
// ========================================== // アカウント変数のジャーナルのロールフォワード用コールバック関数 // ------------------------------------------ int accregdb_journal_rollforward( int key, void* buf, int flag ) { struct accreg* reg = (struct accreg *)numdb_search( accreg_db, key ); // 念のためチェック if( flag == JOURNAL_FLAG_WRITE && key != ((struct accreg*)buf)->account_id ) { printf("inter: accreg_journal: key != account_id !\n"); return 0; } // データの置き換え if( reg ) { if( flag == JOURNAL_FLAG_DELETE ) { numdb_erase( accreg_db, key ); aFree( reg ); } else { memcpy( reg, buf, sizeof(struct accreg) ); } return 1; } // 追加 if( flag != JOURNAL_FLAG_DELETE ) { reg = (struct accreg*) aCalloc( 1, sizeof( struct accreg ) ); memcpy( reg, buf, sizeof(struct accreg) ); numdb_insert( accreg_db, key, reg ); return 1; } return 0; }
/*========================================== * 傭兵削除 *------------------------------------------ */ bool mercdb_sql_delete(int merc_id) { bool result = false; if( sqldbs_transaction_start(&mysql_handle) == false ) return result; // try do { // delete merc if( sqldbs_query(&mysql_handle, "DELETE FROM `" MERC_TABLE "` WHERE `merc_id`='%d'", merc_id) == false ) break; // success result = true; { // cache delete struct mmo_mercstatus *p = (struct mmo_mercstatus *)numdb_erase(merc_db, merc_id); if(p) { aFree(p); } } } while(0); sqldbs_transaction_end(&mysql_handle, result); return result; }
/*========================================== * カプラ倉庫を削除 *------------------------------------------ */ void storage_delete(int account_id) { struct storage *stor = (struct storage *)numdb_erase(storage_db,account_id); if(stor) aFree(stor); return; }
/*========================================== * ギルド倉庫を削除 *------------------------------------------ */ void storage_guild_delete(int guild_id) { struct guild_storage *gstor = (struct guild_storage *)numdb_erase(guild_storage_db,guild_id); if(gstor) aFree(gstor); return; }
/*========================================== * Deletes status change data of the player given. [Skotlex] * Should be invoked after the data of said player was successfully loaded. *------------------------------------------ */ void status_delete_scdata(int aid, int cid) { struct scdata *scdata = numdb_search(scdata_db, cid); if (scdata) { if (scdata->data) aFree(scdata->data); numdb_erase(scdata_db, cid); aFree(scdata); } }
// パーティ解散要求 int mapif_parse_BreakParty(int fd,int party_id) { struct party *p; p=numdb_search(party_db,party_id); if(p==NULL){ return 0; } numdb_erase(party_db,party_id); mapif_party_broken(fd,party_id); return 0; }
//----------------- // Break of a party //----------------- void mapif_parse_BreakParty(int fd, int party_id) { struct party *p; p = numdb_search(party_db, (CPU_INT)party_id); if (p == NULL) return; numdb_erase(party_db, (CPU_INT)party_id); mapif_party_broken(party_id); return; }
// Wisp/page transmission result int mapif_parse_WisReply(int fd) { int id = RFIFOL(fd,2), flag = RFIFOB(fd,6); struct WisData *wd = (struct WisData*)numdb_search(wis_db, id); if (wd == NULL) return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server if ((--wd->count) <= 0 || flag != 1) { mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target numdb_erase(wis_db, id); aFree(wd); } return 0; }
/*========================================== * クエストデータ削除 *------------------------------------------ */ bool questdb_sql_delete(int char_id) { struct quest *q; if( sqldbs_query(&mysql_handle, "DELETE FROM `" QUEST_TABLE "` WHERE `char_id`='%d'", char_id) == false ) return false; q = (struct quest *)numdb_search(quest_db, char_id); if(q && q->char_id == char_id) { numdb_erase(quest_db, char_id); aFree(q); } return true; }
// パーティが空かどうかチェック int party_check_empty(struct party *p) { int i; // printf("party check empty %08X\n",(int)p); for(i=0;i<MAX_PARTY;i++){ // printf("%d acc=%d\n",i,p->member[i].account_id); if(p->member[i].account_id>0){ return 0; } } // 誰もいないので解散 mapif_party_broken(p->party_id,0); numdb_erase(party_db,p->party_id); free(p); return 1; }
/*========================================== * 一時objectの解放 * map_delobjectのfreeしないバージョン *------------------------------------------ */ int map_delobjectnofree(int id) { if(object[id]==NULL) return 0; map_delblock(object[id]); numdb_erase(id_db,id); // map_freeblock(object[id]); object[id]=NULL; if(first_free_object_id>id) first_free_object_id=id; while(last_object_id>2 && object[last_object_id]==NULL) last_object_id--; return 0; }
/*========================================== * 傭兵削除 *------------------------------------------ */ bool mercdb_txt_delete(int merc_id) { struct mmo_mercstatus *p = (struct mmo_mercstatus *)numdb_search(merc_db, merc_id); if(p == NULL) return false; numdb_erase(merc_db, merc_id); aFree(p); printf("merc_id: %d deleted\n", merc_id); #ifdef TXT_JOURNAL if( merc_journal_enable ) journal_write( &merc_journal, merc_id, NULL ); #endif return true; }
/*========================================== * ギルド倉庫削除 *------------------------------------------ */ bool gstoragedb_sql_delete(int guild_id) { const struct guild_storage *s = gstoragedb_sql_load(guild_id); bool result = false; if( sqldbs_transaction_start(&mysql_handle) == false ) return result; // try do { if(s) { int i; for(i = 0; i < s->storage_amount; i++) { // ペット削除 if( s->store_item[i].card[0] == (short)0xff00) { if( petdb_delete(*((int *)(&s->store_item[i].card[1]))) == false ) break; } } if(i != s->storage_amount) break; } // delete if( sqldbs_query(&mysql_handle, "DELETE FROM `" GUILD_STORAGE_TABLE "` WHERE `guild_id`='%d'", guild_id) == false ) break; // success result = true; { // cache delete struct guild_storage *s2 = (struct guild_storage *)numdb_erase(gstorage_db, guild_id); if(s2) { aFree(s2); } } } while(0); sqldbs_transaction_end(&mysql_handle, result); return result; }
//------------------------------- // Is there members in the party? //------------------------------- int party_check_empty(struct party *p) { int i; if (p == NULL || p->party_id == 0) return 1; //printf("Party #%d: check empty.\n", p->party_id); for(i = 0; i < MAX_PARTY; i++) { //printf("Member #%d account: %d.\n", i, p->member[i].account_id); if (p->member[i].account_id > 0) return 0; } // If there is no member, then break the party mapif_party_broken(p->party_id); numdb_erase(party_db, (CPU_INT)p->party_id); FREE(p); return 1; }
int check_ttl_wisdata() { unsigned long tick = gettick(); int i; do { wis_delnum = 0; numdb_foreach(wis_db, check_ttl_wisdata_sub, tick); for(i = 0; i < wis_delnum; i++) { struct WisData *wd = (struct WisData*)numdb_search(wis_db, wis_dellist[i]); ShowWarning("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst); // removed. not send information after a timeout. Just no answer for the player //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target numdb_erase(wis_db, wd->id); aFree(wd); } } while(wis_delnum >= WISDELLIST_MAX); return 0; }
// パーティ解散通知 int party_broken(int party_id) { struct party *p; int i; if( (p=party_search(party_id))==NULL ) return 0; for(i=0;i<MAX_PARTY;i++){ if(p->member[i].sd!=NULL){ clif_party_leaved(p,p->member[i].sd, p->member[i].account_id,p->member[i].name,0x10); p->member[i].sd->status.party_id=0; p->member[i].sd->state.party_sent=0; } } numdb_erase(party_db,party_id); if (party_cache && party_cache->party_id == party_id) party_cache = NULL; return 0; }
/*========================================== * 倉庫データ削除 *------------------------------------------ */ bool storagedb_txt_delete(int account_id) { struct storage *s = (struct storage *)numdb_search(storage_db, account_id); if(s) { int i; for(i = 0; i < s->storage_amount; i++) { // ペット削除 if(s->store_item[i].card[0] == (short)0xff00) petdb_delete(*((int *)(&s->store_item[i].card[1]))); } numdb_erase(storage_db, account_id); aFree(s); #ifdef TXT_JOURNAL if( storage_journal_enable ) journal_write( &storage_journal, account_id, NULL ); #endif } return true; }
// ========================================== // 傭兵データのジャーナルのロールフォワード用コールバック関数 // ------------------------------------------ int merc_journal_rollforward( int key, void* buf, int flag ) { struct mmo_mercstatus* m = (struct mmo_mercstatus *)numdb_search( merc_db, key ); // 念のためチェック if( flag == JOURNAL_FLAG_WRITE && key != ((struct mmo_mercstatus*)buf)->merc_id ) { printf("int_merc: journal: key != merc_id !\n"); return 0; } // データの置き換え if( m ) { if( flag == JOURNAL_FLAG_DELETE ) { numdb_erase(merc_db, key); aFree(m); } else { memcpy( m, buf, sizeof(struct mmo_mercstatus) ); } return 1; } // 追加 if( flag != JOURNAL_FLAG_DELETE ) { m = (struct mmo_mercstatus*) aCalloc( 1, sizeof( struct mmo_mercstatus ) ); memcpy( m, buf, sizeof(struct mmo_mercstatus) ); numdb_insert( merc_db, key, m ); if( m->merc_id >= merc_newid) merc_newid=m->merc_id+1; return 1; } return 0; }
/*========================================== * id_dbからblを削除 *------------------------------------------ */ void map_deliddb(struct block_list *bl) { numdb_erase(id_db,bl->id); }
/*========================================== * PCのquit処理 map.c内分 * * quit処理の主体が違うような気もしてきた *------------------------------------------ */ int map_quit(struct map_session_data *sd) { if(sd->chatID) // チャットから出る chat_leavechat(sd); if(sd->trade_partner) // 取引を中断する trade_tradecancel(sd); if(sd->party_invite>0) // パーティ勧誘を拒否する party_reply_invite(sd,sd->party_invite_account,0); if(sd->guild_invite>0) // ギルド勧誘を拒否する guild_reply_invite(sd,sd->guild_invite,0); if(sd->guild_alliance>0) // ギルド同盟勧誘を拒否する guild_reply_reqalliance(sd,sd->guild_alliance_account,0); party_send_logout(sd); // パーティのログアウトメッセージ送信 guild_send_memberinfoshort(sd,0); // ギルドのログアウトメッセージ送信 pc_cleareventtimer(sd); // イベントタイマを破棄する storage_storage_quit(sd); // 倉庫を開いてるなら保存する skill_castcancel(&sd->bl,0); // 詠唱を中断する skill_status_change_clear(&sd->bl); // ステータス異常を解除する skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除 skill_cleartimerskill(&sd->bl); pc_stop_walking(sd,0); pc_stopattack(sd); pc_delinvincibletimer(sd); pc_delspiritball(sd,sd->spiritball,1); skill_gangsterparadise(sd,0); pc_calcstatus(sd,4); clif_clearchar_area(&sd->bl,2); if(sd->status.pet_id && sd->pd) { pet_remove_map(sd); if(sd->pet.intimate <= 0) { intif_delete_petdata(sd->status.pet_id); sd->status.pet_id = 0; sd->pd = NULL; sd->petDB = NULL; } else intif_save_petdata(sd->status.account_id,&sd->pet); } if(pc_isdead(sd)) pc_setrestartvalue(sd,2); pc_makesavestatus(sd); chrif_save(sd); storage_storage_save(sd); map_delblock(&sd->bl); numdb_erase(id_db,sd->bl.id); strdb_erase(nick_db,sd->status.name); return 0; }