diff options
Diffstat (limited to 'src/map/map.c')
-rw-r--r-- | src/map/map.c | 162 |
1 files changed, 91 insertions, 71 deletions
diff --git a/src/map/map.c b/src/map/map.c index d402ac06c..bcf6c83ad 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -239,10 +239,27 @@ int map_freeblock_unlock(void) { }else if(block_free_lock<0){ if(battle_config.error_log) printf("map_freeblock_unlock: lock count < 0 !\n"); + block_free_lock = 0; // ����ȍ~�̃��b�N�Ɏx�Ⴊ�o�Ă���̂Ń��Z�b�g } return block_free_lock; } +// map_freeblock_lock() ���Ă�� map_freeblock_unlock() ���ĂȂ� +// �����������̂ŁA����I��block_free_lock�����Z�b�g����悤�ɂ���B +// ���̊��́Ado_timer() �̃g�b�v���x������Ă��̂ŁA +// block_free_lock �ڂ������Ă��x�ᖳ���͂��B + +int map_freeblock_timer(int tid,unsigned int tick,int id,int data) { + if(block_free_lock > 0) { + printf("map_freeblock_timer: block_free_lock(%d) is invalid.\n",block_free_lock); + block_free_lock = 1; + map_freeblock_unlock(); + } + // else { + // printf("map_freeblock_timer: check ok\n"); + // } + return 0; +} // // block��?�� @@ -1428,96 +1445,98 @@ void map_addnickdb(struct map_session_data *sd) { int map_quit(struct map_session_data *sd) { nullpo_retr(0, sd); - if (sd->state.event_disconnect) { - struct npc_data *npc; - if ((npc = npc_name2id(script_config.logout_event_name))) { - run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCLogoutNPC - sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.logout_event_name); - ShowStatus(tmp_output); + if(!sd->state.waitingdisconnect) { + if (sd->state.event_disconnect) { + struct npc_data *npc; + if ((npc = npc_name2id(script_config.logout_event_name))) { + run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCLogoutNPC + sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.logout_event_name); + ShowStatus(tmp_output); + } } - } - if(sd->chatID) // �`���b�g����o�� - chat_leavechat(sd); + if(sd->chatID) // �`���b�g����o�� + chat_leavechat(sd); - if(sd->trade_partner) // �����?���� - trade_tradecancel(sd); + if(sd->trade_partner) // �����?���� + trade_tradecancel(sd); - if(sd->party_invite>0) // �p?�e�B?�U�����ۂ��� - party_reply_invite(sd,sd->party_invite_account,0); + if(sd->party_invite>0) // �p?�e�B?�U�����ۂ��� + party_reply_invite(sd,sd->party_invite_account,0); - if(sd->guild_invite>0) // �M���h?�U�����ۂ��� - guild_reply_invite(sd,sd->guild_invite,0); - if(sd->guild_alliance>0) // �M���h����?�U�����ۂ��� - guild_reply_reqalliance(sd,sd->guild_alliance_account,0); + if(sd->guild_invite>0) // �M���h?�U�����ۂ��� + guild_reply_invite(sd,sd->guild_invite,0); + if(sd->guild_alliance>0) // �M���h����?�U�����ۂ��� + guild_reply_reqalliance(sd,sd->guild_alliance_account,0); - party_send_logout(sd); // �p?�e�B�̃��O�A�E�g���b�Z?�W���M + party_send_logout(sd); // �p?�e�B�̃��O�A�E�g���b�Z?�W���M - guild_send_memberinfoshort(sd,0); // �M���h�̃��O�A�E�g���b�Z?�W���M + guild_send_memberinfoshort(sd,0); // �M���h�̃��O�A�E�g���b�Z?�W���M - pc_cleareventtimer(sd); // �C�x���g�^�C�}��j������ + pc_cleareventtimer(sd); // �C�x���g�^�C�}��j������ - if(sd->state.storage_flag) - storage_guild_storage_quit(sd,0); - else - storage_storage_quit(sd); // �q�ɂ��J���Ă�Ȃ�ۑ����� - - // check if we've been authenticated [celest] - if (sd->state.auth) - skill_castcancel(&sd->bl,0); // �r����?���� - - skill_stop_dancing(&sd->bl,1);// �_���X/���t��? - - if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //�o?�T?�N���̏I����HP��100�� - sd->status.hp = 100; + if(sd->state.storage_flag) + storage_guild_storage_quit(sd,0); + else + storage_storage_quit(sd); // �q�ɂ��J���Ă�Ȃ�ۑ����� - status_change_clear(&sd->bl,1); // �X�e?�^�X�ُ���������� - skill_clear_unitgroup(&sd->bl); // �X�L�����j�b�g�O��?�v�̍폜 - skill_cleartimerskill(&sd->bl); + // check if we've been authenticated [celest] + if (sd->state.auth) + skill_castcancel(&sd->bl,0); // �r����?���� - // check if we've been authenticated [celest] - if (sd->state.auth) { - pc_stop_walking(sd,0); - pc_stopattack(sd); - pc_delinvincibletimer(sd); - } - pc_delspiritball(sd,sd->spiritball,1); - skill_gangsterparadise(sd,0); + skill_stop_dancing(&sd->bl,1);// �_���X/���t��? - if (sd->state.auth) - status_calc_pc(sd,4); -// skill_clear_unitgroup(&sd->bl); // [Sara-chan] + if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //�o?�T?�N���̏I����HP��100�� + sd->status.hp = 100; - clif_clearchar_area(&sd->bl,2); + status_change_clear(&sd->bl,1); // �X�e?�^�X�ُ���������� + skill_clear_unitgroup(&sd->bl); // �X�L�����j�b�g�O��?�v�̍폜 + skill_cleartimerskill(&sd->bl); - if(sd->status.pet_id && sd->pd) { - pet_lootitem_drop(sd->pd,sd); - 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; + // check if we've been authenticated [celest] + if (sd->state.auth) { + pc_stop_walking(sd,0); + pc_stopattack(sd); + pc_delinvincibletimer(sd); + } + pc_delspiritball(sd,sd->spiritball,1); + skill_gangsterparadise(sd,0); + skill_unit_move(&sd->bl,gettick(),0); + + if (sd->state.auth) + status_calc_pc(sd,4); + // skill_clear_unitgroup(&sd->bl); // [Sara-chan] + + clif_clearchar_area(&sd->bl,2); + + if(sd->status.pet_id && sd->pd) { + pet_lootitem_drop(sd->pd,sd); + 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); } - else - intif_save_petdata(sd->status.account_id,&sd->pet); - } - if(pc_isdead(sd)) - pc_setrestartvalue(sd,2); + if(pc_isdead(sd)) + pc_setrestartvalue(sd,2); - pc_makesavestatus(sd); - chrif_save(sd); - storage_storage_dirty(sd); - storage_storage_save(sd); + pc_makesavestatus(sd); + chrif_save(sd); + storage_storage_dirty(sd); + storage_storage_save(sd); + map_delblock(&sd->bl); + } if( sd->npc_stackbuf && sd->npc_stackbuf != NULL) { aFree( sd->npc_stackbuf ); sd->npc_stackbuf = NULL; } - map_delblock(&sd->bl); - #ifndef TXT_ONLY chrif_char_offline(sd); #endif @@ -3348,11 +3367,16 @@ int do_init(int argc, char *argv[]) { map_readallmap(); + add_timer_func_list(map_freeblock_timer,"map_freeblock_timer"); add_timer_func_list(map_clearflooritem_timer, "map_clearflooritem_timer"); + add_timer_interval(gettick()+1000,map_freeblock_timer,0,0,60*1000); //Added by Mugendai for GUI support if (flush_on) add_timer_interval(gettick()+10, flush_timer,0,0,flush_time); + //Added for Mugendais I'm Alive mod + if (imalive_on) + add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000); #ifndef TXT_ONLY // online status timer, checks every hour [Valaris] add_timer_func_list(online_timer, "online_timer"); @@ -3395,10 +3419,6 @@ int do_init(int argc, char *argv[]) { if (battle_config.pk_mode == 1) ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n"); - //Added for Mugendais I'm Alive mod - if (imalive_on) - add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000); - sprintf(tmp_output,"Server is '"CL_GREEN"ready"CL_RESET"' and listening on port '"CL_WHITE"%d"CL_RESET"'.\n\n", map_port); ShowStatus(tmp_output); |