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

121 lines
4.2 KiB
Text

----------------------------------------------------------------------------------------------------
-- Mob Jump
----------------------------------------------------------------------------------------------------
-- Ðàçðàáîò÷èê: Jim
----------------------------------------------------------------------------------------------------
local STATE_START_LOOK = 1
local STATE_WAIT_LOOK_END = 2
local STATE_JUMP = 3
class "mob_jump"
----------------------------------------------------------------------------------------------------
-- CONSTRUCTION SCHEME
----------------------------------------------------------------------------------------------------
function mob_jump:__init(obj, storage)
self.object = obj
self.st = storage
end
----------------------------------------------------------------------------------------------------
-- RESET SCHEME
----------------------------------------------------------------------------------------------------
function mob_jump:reset_scheme()
printf("Jump: reset_scheme: %s", self.object:name())
xr_logic.mob_capture (self.object, true)
-- reset signals
self.st.signals = {}
-- initialize jump point
self.jump_path = nil
if self.st.jump_path_name then
self.jump_path = patrol(self.st.jump_path_name)
else
self.st.jump_path_name = "[not defined]"
end
if not self.jump_path then
abort("object '%s': unable to find jump_path '%s' on the map",
self.object:name(), self.st.jump_path_name)
end
self.point = vector().add(self.jump_path:point(0), self.st.offset)
self.state_current = STATE_START_LOOK
end
----------------------------------------------------------------------------------------------------
-- UPDATE
----------------------------------------------------------------------------------------------------
function mob_jump:update(delta)
--[[
if xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) then
return
end
]]
if (self.state_current == STATE_START_LOOK) then
if not self.object:action() then
action( self.object,
look(look.point, self.point),
cond(cond.look_end)
)
self.state_current = STATE_WAIT_LOOK_END
end
elseif (self.state_current == STATE_WAIT_LOOK_END) then
if not self.object:action() then
self.state_current = STATE_JUMP
end
end
if self.state_current == STATE_JUMP then
self.object:jump(self.point, self.st.ph_jump_factor)
self.st.signals["jumped"] = true
xr_logic.mob_release(self.object)
end
end
----------------------------------------------------------------------------------------------------
-- ADD_TO_BINDER
----------------------------------------------------------------------------------------------------
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_jump(npc, storage)
-- Çàðåãèñòðèðîâàòü âñå actions, â êîòîðûõ äîëæåí áûòü âûçâàí ìåòîä reset_scheme ïðè èçìåíåíèè íàñòðîåê ñõåìû:
xr_logic.subscribe_action_for_events(npc, storage, new_action)
end
----------------------------------------------------------------------------------------------------
-- SET_SCHEME
----------------------------------------------------------------------------------------------------
function set_scheme(npc, ini, scheme, section, gulag_name)
local storage = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
storage.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc)
storage.jump_path_name = utils.cfg_get_string(ini, section, "path_jump", npc, false, gulag_name)
storage.ph_jump_factor = utils.cfg_get_number(ini, section, "ph_jump_factor", npc, false, 1.8)
local offset_str = utils.cfg_get_string(ini, section, "offset", npc, true, "")
printf( "offset_str=%s", offset_str )
local elems = parse_names(offset_str)
printf( "elems = %s | %s | %s", tostring(elems[1]), tostring(elems[2]), tostring(elems[3]) )
storage.offset = vector():set(tonumber(elems[1]), tonumber(elems[2]), tonumber(elems[3]))
if not ini:line_exist( section, "on_signal" ) then
utils.abort("Bad jump scheme usage! `on_signal` line must be specified")
end
end