e4s-sdk/gamedata/scripts/mob_remark.script
2026-06-17 23:06:51 +03:00

176 lines
5.2 KiB
Text
Raw Permalink Blame History

class "mob_remark"
function mob_remark:__init(obj, storage)
self.object = obj
self.st = storage
end
function mob_remark:reset_scheme()
printf("_bp: mob_remark:reset_scheme: %s", self.object:name())
mob_state_mgr.set_state(self.object, db.actor, self.st.state)
self.object:disable_talk()
xr_logic.mob_capture(self.object, not self.st.no_reset)
local anims = parse_names(self.st.anim)
local snds
if self.st.snd then
snds = parse_names(self.st.snd)
else
snds = {}
end
local sndset
local times
if self.st.time then
times = parse_names(self.st.time)
else
times = {}
end
local tm
local cnd
for num, an in pairs(anims) do
sndset = snds[num]
if times[num] then
tm = tonumber(times[num])
else
tm = 0
end
if sndset and an then
local snd = mob_sound.pick_sound_from_set(self.object, sndset, {})
if not snd then
abort("mobile '%s': section '%s': sound set '%s' does not exist",
self.object:name(), self.st.section, sndset)
end
if tm == 0 then
cnd = cond(cond.sound_end)
else
cnd = cond(cond.time_end, tm)
end
if self.st.anim_head then
--printf("__bp: action set: %d", time_global())
action(self.object, anim(an), sound(snd, "bip01_head",
MonsterSpace[self.st.anim_head]), cnd)
else
--printf("__bp: action set: %d", time_global())
if self.st.anim_movement == true then
action(self.object, anim(an, true), sound(snd, "bip01_head"), cnd)
else
action(self.object, anim(an), sound(snd, "bip01_head"), cnd)
end
end
elseif an then
if tm == 0 then
cnd = cond(cond.anim_end)
else
cnd = cond(cond.time_end, tm)
end
--printf("__bp: action set: %d", time_global())
if self.st.anim_movement == true then
local pos = self.object:position()
local dir = self.object:direction()
printf("SNORK position[%s %s %s] orientation[%s %s %s]",
pos.x, pos.y, pos.z,
dir.x, dir.y, dir.z)
action(self.object, anim(an, true), cnd)
else
action(self.object, anim(an), cnd)
end
--else
-- if npc:get_script() then
-- npc:script(false, script_name())
-- end
end
end
self.tip_sent = false
self.st.signals = {}
self.action_end_signalled = false
--printf("_bp: mob_remark:reset_scheme end")
end
function mob_remark:update(delta)
--printf("__bp: mob_remark update: %d", time_global())
--if not xr_logic.is_active(self.object, self.st) then
-- return
--end
local actor = db.actor
--[[
if xr_logic.try_switch_to_another_section(self.object, self.st, actor) then
return
end
]]
if self.st.dialog_cond and xr_logic.pick_section_from_condlist(actor, self.object,
self.st.dialog_cond.condlist) ~= nil then
--printf("_bp: enable talk")
if not self.object:is_talk_enabled() then
self.object:enable_talk()
end
else
--printf("_bp: disable talk")
if self.object:is_talk_enabled() then
self.object:disable_talk()
end
end
if not self.tip_sent then
self.tip_sent = true
if self.st.tip then
news_manager.send_tip(actor, self.st.tip)
end
end
--printf("_bp: mob_remark:update [%s]", self.object:name())
if self.object:get_script() and not self.object:action() then
--self.object:script(false, script_name())
--printf("__bp: free from script: %d", time_global())
if not self.action_end_signalled then
self.action_end_signalled = true
self.st.signals["action_end"] = true
printf("mob_remark: signalling action_end")
end
end
end
---------------------------------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, storage)
printf("DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section)
local new_action = mob_remark(npc, storage)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> actions, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> reset_scheme <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>:
xr_logic.subscribe_action_for_events(npc, storage, new_action)
end
function set_scheme(npc, ini, scheme, section, gulag_name)
local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
st.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc)
st.state = mob_state_mgr.get_state(ini, section, npc)
st.dialog_cond = xr_logic.cfg_get_condlist(ini, section, "dialog_cond", npc)
-- <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>.<2E>. <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> actions.
--st.no_reset = utils.cfg_get_bool(ini, section, "no_reset", npc, false)
st.no_reset = true
st.anim = utils.cfg_get_string(ini, section, "anim", npc, false, "")
st.anim_movement = utils.cfg_get_bool(ini, section, "anim_movement", npc, false, false) --' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>
st.anim_head = utils.cfg_get_string(ini, section, "anim_head", npc, false, "")
st.tip = utils.cfg_get_string(ini, section, "tip", npc, false, "")
st.snd = utils.cfg_get_string(ini, section, "snd", npc, false, "")
st.time = utils.cfg_get_string(ini, section, "time", npc, false, "")
end