121 lines
4.2 KiB
Text
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
|
|
|