/*========================================== * leave a chatroom *------------------------------------------*/ int chat_leavechat(struct map_session_data* sd, bool kicked) { struct chat_data* cd; int i; int leavechar; nullpo_retr(1, sd); cd = (struct chat_data*)map_id2bl(sd->chatID); if( cd == NULL ) { pc_setchatid(sd, 0); return 1; } ARR_FIND( 0, cd->users, i, cd->usersd[i] == sd ); if ( i == cd->users ) { // Not found in the chatroom? pc_setchatid(sd, 0); return -1; } clif_leavechat(cd, sd, kicked); pc_setchatid(sd, 0); cd->users--; leavechar = i; for( i = leavechar; i < cd->users; i++ ) cd->usersd[i] = cd->usersd[i+1]; if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom clif_clearchat(cd, 0); map_delobject(cd->bl.id); return 1; } if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner cd->owner = (struct block_list*) cd->usersd[0]; clif_changechatowner(cd, cd->usersd[0]); clif_clearchat(cd, 0); //Adjust Chat location after owner has been changed. map_delblock( &cd->bl ); cd->bl.x=cd->usersd[0]->bl.x; cd->bl.y=cd->usersd[0]->bl.y; map_addblock( &cd->bl ); clif_dispchat(cd,0); } else clif_dispchat(cd,0); // refresh chatroom return 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; }
/*========================================== * npcチャットルーム削除 *------------------------------------------ */ int chat_deletenpcchat(struct npc_data *nd) { struct chat_data *cd; nullpo_retr(0, nd); nullpo_retr(0, cd=(struct chat_data*)map_id2bl(nd->chat_id)); chat_npckickall(cd); clif_clearchat(cd,0); map_delobject(cd->bl.id); // freeまでしてくれる nd->chat_id=0; return 0; }
/*========================================== * チャットルームから抜ける *------------------------------------------ */ int chat_leavechat(struct map_session_data *sd) { struct chat_data *cd; int i,leavechar; nullpo_retr(1, sd); cd=(struct chat_data*)map_id2bl(sd->chatID); if(cd==NULL) return 1; for(i = 0,leavechar=-1;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,0); } // 抜けるPCにも送るのでusersを減らす前に実行 clif_leavechat(cd,sd); cd->users--; pc_setchatid(sd,0); if(cd->users == 0 && (*cd->owner)->type==BL_PC){ // 全員居なくなった&PCのチャットなので消す clif_clearchat(cd,0); 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,0); } return 0; }
/*========================================== * npcチャットルーム削除 *------------------------------------------ */ int chat_deletenpcchat(struct npc_data *nd) { struct chat_data *cd; nullpo_retr(0, nd); cd = map_id2cd(nd->chat_id); if(cd) { chat_npckickall(cd); clif_clearchat(cd,-1); map_delobject(cd->bl.id); // freeまでしてくれる nd->chat_id = 0; } return 0; }
/*========================================== * 床アイテムを消す * * data==0の時はtimerで消えた時 * data!=0の時は拾う等で消えた時として動作 * * 後者は、map_clearflooritem(id)へ * map.h内で#defineしてある *------------------------------------------ */ int map_clearflooritem_timer(int tid,unsigned int tick,int id,int data) { struct flooritem_data *fitem; fitem = (struct flooritem_data *)object[id]; if(fitem==NULL || fitem->bl.type!=BL_ITEM || (!data && fitem->cleartimer != tid)){ if(battle_config.error_log) printf("map_clearflooritem_timer : error\n"); return 1; } if(data) delete_timer(fitem->cleartimer,map_clearflooritem_timer); else if(fitem->item_data.card[0] == (short)0xff00) intif_delete_petdata(*((long *)(&fitem->item_data.card[1]))); clif_clearflooritem(fitem,0); map_delobject(fitem->bl.id); return 0; }