/*-------------------------------------- * 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; }
/*========================================== * 切断 *------------------------------------------ */ 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; } }
/*========================================== * チャットルームから抜ける *------------------------------------------ */ 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; }