diff options
author | Freeyorp <TheFreeYorp+git@gmail.com> | 2024-04-29 10:15:51 +0000 |
---|---|---|
committer | Freeyorp <TheFreeYorp+git@gmail.com> | 2024-04-29 12:43:39 +0000 |
commit | 9d00c99cd0c636aa5a6c25677d334d455cd9195f (patch) | |
tree | c4e4956aa42b17b7085924e3623db45f29959f5e /src/map/npc-parse.cpp | |
parent | bafec99026144d807bb140b6daf86853c4603e51 (diff) | |
download | tmwa-9d00c99cd0c636aa5a6c25677d334d455cd9195f.tar.gz tmwa-9d00c99cd0c636aa5a6c25677d334d455cd9195f.tar.bz2 tmwa-9d00c99cd0c636aa5a6c25677d334d455cd9195f.tar.xz tmwa-9d00c99cd0c636aa5a6c25677d334d455cd9195f.zip |
npc_destroy: Defer NPC destruction via timer
055-1 _nodes.txt will call `destroy;` from within OnInit, that is during an
iteration of the global `ev_db`. Previously, concurrent modification
invalidated this iteration, resulting in a crash.
This still nullifes `oid`, dequeues all timers, and effectively calls
`builtin_end`.
`npc_data::deletion_pending` is extended to include a third state.
In addition to no deletion happening, and indicating when `npc_free` is
currently on the stack, it now also tracks whether the NPC is about to be
deleted by a timer.
This means that an NPC which is about to be deleted is still blocked from
triggering new events, much like an NPC actively being deleted would.
Starting or continuing an NPC dialog with an NPC that does not, or is about to
no longer exist, is now also blocked.
Diffstat (limited to 'src/map/npc-parse.cpp')
-rw-r--r-- | src/map/npc-parse.cpp | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/map/npc-parse.cpp b/src/map/npc-parse.cpp index 47b851c..df1a09a 100644 --- a/src/map/npc-parse.cpp +++ b/src/map/npc-parse.cpp @@ -164,7 +164,7 @@ bool npc_load_warp(ast::npc::Warp& warp) nd->warp.xs = xs; nd->warp.ys = ys; - nd->deletion_pending = false; + nd->deletion_pending = npc_data::NOT_DELETING; npc_warp++; nd->bl_type = BL::NPC; @@ -228,7 +228,7 @@ bool npc_load_shop(ast::npc::Shop& shop) nd->opt2 = Opt2::ZERO; nd->opt3 = Opt3::ZERO; - nd->deletion_pending = false; + nd->deletion_pending = npc_data::NOT_DELETING; npc_shop++; nd->bl_type = BL::NPC; @@ -458,7 +458,7 @@ bool npc_load_script_none(ast::script::ScriptBody& body, ast::npc::ScriptNone& s nd->opt2 = Opt2::ZERO; nd->opt3 = Opt3::ZERO; - nd->deletion_pending = false; + nd->deletion_pending = npc_data::NOT_DELETING; npc_script++; nd->bl_type = BL::NPC; @@ -568,7 +568,7 @@ bool npc_load_script_map(ast::script::ScriptBody& body, ast::npc::ScriptMap& scr nd->opt2 = Opt2::ZERO; nd->opt3 = Opt3::ZERO; - nd->deletion_pending = false; + nd->deletion_pending = npc_data::NOT_DELETING; npc_script++; nd->bl_type = BL::NPC; |