Esempio n. 1
0
/*==========================================
 * 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);
	}
}
Esempio n. 2
0
/*==========================================
 * ホム削除
 *------------------------------------------
 */
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;
}
Esempio n. 3
0
// ==========================================
// アカウント変数のジャーナルのロールフォワード用コールバック関数
// ------------------------------------------
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;
}
Esempio n. 4
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;
}
Esempio n. 5
0
/*==========================================
 * カプラ倉庫を削除
 *------------------------------------------
 */
void storage_delete(int account_id)
{
	struct storage *stor = (struct storage *)numdb_erase(storage_db,account_id);

	if(stor)
		aFree(stor);

	return;
}
Esempio n. 6
0
/*==========================================
 * ギルド倉庫を削除
 *------------------------------------------
 */
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;
}
Esempio n. 7
0
/*==========================================
 * 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);
	}
}
Esempio n. 8
0
// パーティ解散要求
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;
}
Esempio n. 9
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;
}
Esempio n. 10
0
// 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;
}
Esempio n. 11
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;
}
Esempio n. 12
0
// パーティが空かどうかチェック
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;
}
Esempio n. 13
0
/*==========================================
 * 一時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;
}
Esempio n. 14
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;
}
Esempio n. 15
0
/*==========================================
 * ギルド倉庫削除
 *------------------------------------------
 */
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;
}
Esempio n. 16
0
//-------------------------------
// 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;
}
Esempio n. 17
0
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;
}
Esempio n. 18
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;
}
Esempio n. 19
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;
}
Esempio n. 20
0
// ==========================================
// 傭兵データのジャーナルのロールフォワード用コールバック関数
// ------------------------------------------
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;
}
Esempio n. 21
0
/*==========================================
 * id_dbからblを削除
 *------------------------------------------
 */
void map_deliddb(struct block_list *bl)
{
	numdb_erase(id_db,bl->id);
}
Esempio n. 22
0
/*==========================================
 * 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;
}