summaryrefslogtreecommitdiff
path: root/src/map/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/map.c')
-rw-r--r--src/map/map.c162
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);