diff options
author | mekolat <mekolat@users.noreply.github.com> | 2015-06-18 01:56:31 -0500 |
---|---|---|
committer | mekolat <mekolat@users.noreply.github.com> | 2016-04-15 11:45:02 -0400 |
commit | ef4ae4d281127a0b84a73ab034bd22d6281a09ed (patch) | |
tree | 9c85593f052f354fa88c633c1b0cdd5ebad7ceb4 /src/map/script-call.cpp | |
parent | 87312fe719956671a77a3c78021e821c679764fe (diff) | |
download | tmwa-ef4ae4d281127a0b84a73ab034bd22d6281a09ed.tar.gz tmwa-ef4ae4d281127a0b84a73ab034bd22d6281a09ed.tar.bz2 tmwa-ef4ae4d281127a0b84a73ab034bd22d6281a09ed.tar.xz tmwa-ef4ae4d281127a0b84a73ab034bd22d6281a09ed.zip |
implement puppet npcs
Diffstat (limited to 'src/map/script-call.cpp')
-rw-r--r-- | src/map/script-call.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/map/script-call.cpp b/src/map/script-call.cpp index 54f6c01..b8f531a 100644 --- a/src/map/script-call.cpp +++ b/src/map/script-call.cpp @@ -876,7 +876,26 @@ int run_script_l(ScriptPointer sp, BlockId rid, BlockId oid, { struct script_stack stack; ScriptState st; - dumb_ptr<map_session_data> sd = map_id2sd(rid); + dumb_ptr<block_list> bl = map_id2bl(rid); + dumb_ptr<map_session_data> sd = bl? bl->is_player(): nullptr; + if (oid) + { + dumb_ptr<block_list> oid_bl = map_id2bl(oid); + if (oid_bl->bl_type == BL::NPC) + { + dumb_ptr<npc_data> nd = oid_bl->is_npc(); + if(nd->npc_subtype == NpcSubtype::SCRIPT) + { + dumb_ptr<npc_data_script> nds = nd->is_script(); + if (nds->scr.parent) + { + dumb_ptr<npc_data_script> parent = map_id2bl(nds->scr.parent)->is_npc()->is_script(); + assert(parent->bl_type == BL::NPC && parent->npc_subtype == NpcSubtype::SCRIPT); + sp = ScriptPointer(borrow(*parent->scr.script), sp.pos); + } + } + } + } P<const ScriptBuffer> rootscript = TRY_UNWRAP(sp.code, return -1); int i; if (sp.pos >> 24) @@ -892,6 +911,7 @@ int run_script_l(ScriptPointer sp, BlockId rid, BlockId oid, st.scriptp = sp; st.rid = rid; st.oid = oid; + for (i = 0; i < args.size(); i++) { if (args[i].name.back() == '$') |