From f0b91a79a0f8031d3cd6289ceafead93817bc4a7 Mon Sep 17 00:00:00 2001 From: Haru Date: Sun, 25 Aug 2019 19:57:45 +0200 Subject: Prevent players from getting stuck when an MVP respawns while talking to its tombstone Signed-off-by: Haru --- src/map/mob.c | 8 ++++++++ src/map/npc.c | 6 ++++-- src/map/pc.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/map/mob.c b/src/map/mob.c index bad3f7eb8..e04d6944e 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -239,6 +239,14 @@ static void mvptomb_destroy(struct mob_data *md) m = nd->bl.m; + struct s_mapiterator *iter = mapit_geteachpc(); + for (struct map_session_data *sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { + if (sd->npc_id == nd->bl.id) { + sd->state.npc_unloaded = 1; + } + } + mapit->free(iter); + clif->clearunit_area(&nd->bl,CLR_OUTSIGHT); map->delblock(&nd->bl); diff --git a/src/map/npc.c b/src/map/npc.c index c3dff5870..1e9e13b42 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1349,8 +1349,10 @@ static int npc_scriptcont(struct map_session_data *sd, int id, bool closing) return 1; } - if(id != npc->fake_nd->bl.id) { // Not item script - if ((npc->checknear(sd,target)) == NULL){ + if (id != npc->fake_nd->bl.id) { // Not item script + if (sd->state.npc_unloaded != 0) { + sd->state.npc_unloaded = 0; + } else if ((npc->checknear(sd,target)) == NULL) { ShowWarning("npc_scriptcont: failed npc->checknear test.\n"); return 1; } diff --git a/src/map/pc.h b/src/map/pc.h index 8df02a891..82abbccf0 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -238,6 +238,7 @@ struct map_session_data { unsigned int loggingout : 1; unsigned int warp_clean : 1; unsigned int refine_ui : 1; + unsigned int npc_unloaded : 1; ///< The player is talking with an unloaded NPCs (respawned tombstones) } state; struct { unsigned char no_weapon_damage, no_magic_damage, no_misc_damage; -- cgit v1.2.3-70-g09d2 From 375e9a54f5e8aaef083f60cb36bad59f37e40905 Mon Sep 17 00:00:00 2001 From: Haru Date: Sun, 25 Aug 2019 20:06:38 +0200 Subject: Prevent MVP tombstones from showing their message multiple times when clicked Signed-off-by: Haru --- src/map/npc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/map/npc.c b/src/map/npc.c index 1e9e13b42..868b8711a 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1258,6 +1258,9 @@ static void run_tomb(struct map_session_data *sd, struct npc_data *nd) char time[10]; nullpo_retv(nd); + + sd->npc_id = nd->bl.id; + strftime(time, sizeof(time), "%H:%M", localtime(&nd->u.tomb.kill_time)); // TODO: Find exact color? @@ -1373,8 +1376,10 @@ static int npc_scriptcont(struct map_session_data *sd, int id, bool closing) if( sd->progressbar.npc_id && DIFF_TICK(sd->progressbar.timeout,timer->gettick()) > 0 ) return 1; - if( !sd->st ) + if( !sd->st ) { + sd->npc_id = 0; return 1; + } if( closing && sd->st->state == CLOSE ) sd->st->state = END; -- cgit v1.2.3-70-g09d2