Пример #1
0
/*--------------------------------------
 * Removes a instance, all its maps and npcs.
 *--------------------------------------*/
void instance_destroy(int instance_id)
{
	int last = 0, type;
	struct party_data *p;
	time_t now = time(NULL);

	if( !instance_is_valid(instance_id) )
		return; // nothing to do

	if( instance[instance_id].progress_timeout && instance[instance_id].progress_timeout <= now )
		type = 1;
	else if( instance[instance_id].idle_timeout && instance[instance_id].idle_timeout <= now )
		type = 2;
	else
		type = 3;

	clif_instance(instance_id, 5, type); // Report users this instance has been destroyed

	while( instance[instance_id].num_map && last != instance[instance_id].map[0] )
	{ // Remove all maps from instance
		last = instance[instance_id].map[0];
		instance_del_map( instance[instance_id].map[0] );
	}

	if( instance[instance_id].ivar )
		linkdb_final( &instance[instance_id].ivar ); // Remove numeric vars

	if( instance[instance_id].svar )
	{ // Remove string vars
		linkdb_foreach( &instance[instance_id].svar, instance_destroy_freesvar );
		linkdb_final( &instance[instance_id].svar );
	}

	if( instance[instance_id].progress_timer != INVALID_TIMER )
		delete_timer( instance[instance_id].progress_timer, instance_destroy_timer);
	if( instance[instance_id].idle_timer != INVALID_TIMER )
		delete_timer( instance[instance_id].idle_timer, instance_destroy_timer);

	instance[instance_id].ivar = NULL;
	instance[instance_id].svar = NULL;

	if( instance[instance_id].party_id && (p = party_search(instance[instance_id].party_id)) != NULL )
		p->instance_id = 0; // Update Party information

	ShowInfo("[Instance] Destroyed %s.\n", instance[instance_id].name);
	memset( &instance[instance_id], 0x00, sizeof(instance[0]) );

	instance[instance_id].state = INSTANCE_FREE;
}
Пример #2
0
/*==========================================
 * 切断
 *------------------------------------------
 */
void sqldbs_close(struct sqldbs_handle *hd)
{
	nullpo_retv(hd);

	printf("Closing DabaseServer ");
	if(hd->tag) {
		printf("[%s] ", hd->tag);
	}
	printf("... ");

	if(hd->stmt_list) {
		struct linkdb_node *node = hd->stmt_list;

		while(node) {
			struct sqldbs_stmt *st = (struct sqldbs_stmt *)node->key;

			// sqldbs_stmt_close() 内で linkdb_erase() されないためにNULLにしておく
			st->handle = NULL;

			sqldbs_stmt_close(st);
			node = node->next;
		}
		linkdb_final(&hd->stmt_list);
	}

	mysql_close(&hd->handle);
	printf(" OK\n");

	if(hd->tag) {
		aFree(hd->tag);
		hd->tag = NULL;
	}
}
Пример #3
0
/*==========================================
 * チャットルームから抜ける
 *------------------------------------------
 */
int chat_leavechat(struct map_session_data *sd, unsigned char flag)
{
	struct chat_data *cd;
	int i,leavechar;

	nullpo_retr(1, sd);

	if((cd = map_id2cd(sd->chatID)) == NULL)
		return 1;

	leavechar = -1;
	for(i = 0; i < cd->users; i++) {
		if(cd->usersd[i] == sd) {
			leavechar = i;
			break;
		}
	}
	if(leavechar < 0)	// そのchatに所属していないらしい (バグ時のみ)
		return -1;

	if(leavechar == 0 && cd->users > 1 && (*cd->owner)->type == BL_PC) {
		// 所有者だった&他に人が居る&PCのチャット
		clif_changechatowner(cd,cd->usersd[1]);
		clif_clearchat(cd,-1);
	}

	// 抜けるPCにも送るのでusersを減らす前に実行
	clif_leavechat(cd,sd,flag);

	cd->users--;
	sd->chatID         = 0;
	sd->state.joinchat = 0;

	if(cd->users == 0 && (*cd->owner)->type == BL_PC) {
		// 全員居なくなった&PCのチャットなので消す
		clif_clearchat(cd,-1);
		linkdb_final(&cd->ban_list);
		map_delobject(cd->bl.id);	// freeまでしてくれる
	} else {
		for(i = leavechar; i < cd->users; i++) {
			cd->usersd[i] = cd->usersd[i+1];
		}
		if(leavechar == 0 && (*cd->owner)->type == BL_PC) {
			// PCのチャットで所有者が抜けたので位置変更
			cd->bl.x = cd->usersd[0]->bl.x;
			cd->bl.y = cd->usersd[0]->bl.y;
		}
		clif_dispchat(cd,-1);
	}

	return 0;
}