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

191 lines
5.7 KiB
Text

----------------------------------------------------------------------------------------------------------------------
-- Ïðîâåðêà óñëîâèé ðàçðåøåíèÿ èëè çàïðåùåíèÿ ñïàâíà
-- àâòîð: Äèäåíêî Ðóñëàí (Stohe)
-- TODO:
----------------------------------------------------------------------------------------------------------------------
--[[
spawner = nil
function spawn(npc)
local char_ini = npc:spawn_ini()
xr_spawner.create_spawner()
xr_spawner.spawner:addList(npc)
xr_spawner.spawner:check_spawn(npc.id)
--'!! Ïîäóìàòü è óáðàòü íàõðåí, there could be only one!!!
if char_ini:section_exist ("zone_spawner") then
zone_spawner.add_member (npc)
end
if char_ini:section_exist ("escape_raid") then
escape_raid.add_member (npc)
end
return true
end
function spawn_client(npc)
local char_ini = npc:spawn_ini()
xr_spawner.create_spawner()
local sim = alife()
if sim == nil then return true end
sobject = sim:object(npc:id())
xr_spawner.spawner:addList(sobject)
xr_spawner.spawner:check_spawn(npc:id())
return true
end
class "object_spawner"
function object_spawner:__init()
self.list = {}
self.timer = game.get_game_time()
self.idle = 60
end
function object_spawner:check_spawn(npc_id)
---' !!! Òóò âñòàâèòü ïðîâåðêó ïî êîíäëèñòó
local actor = db.actor
--print_table(self.list)
if actor ~= nil and
self.list[npc_id].cond ~= nil
then
if xr_logic.pick_section_from_condlist(actor,nil,self.list[npc_id].cond.condlist) ~= nil then
self:restore(npc_id)
else
self:hide(npc_id)
end
end
end
function object_spawner:addList(sobject)
local char_ini = sobject:spawn_ini()
---' !!! Òóò äîáàâèòü ÷òåíèå êîíäëèñòà
self.list[sobject.id] = { id = sobject.id,
on = sobject:can_switch_online(),
off = sobject:can_switch_offline(),
int = sobject:interactive(),
pos = sobject.position,
cond = xr_logic.cfg_get_condlist(char_ini,"spawner","cond",sobject) }
end
function object_spawner:remove_from_list (id)
printf ("Query for remove object with ID : %d", id)
for k, v in pairs (self.list) do
if self.list[k].id == id then
self.list[k] = nil
printf ("Object with ID : %d successfully removed from spawn list", id)
return
end
end
printf ("Object with ID : %d not found in spawn list", id)
end
function object_spawner:restore(npc_id)
local sim = alife()
if sim == nil then return true end
sim:set_switch_online (npc_id, self.list[npc_id].on)
sim:set_switch_offline (npc_id, self.list[npc_id].off)
sim:set_interactive (npc_id, self.list[npc_id].int)
end
function object_spawner:hide(npc_id)
local sim = alife()
if sim == nil then return true end
sim:set_switch_online (npc_id, false)
sim:set_switch_offline (npc_id, true)
sim:set_interactive (npc_id, false)
end
function object_spawner:update()
--printf("!!%s!! %s", self.name, game.get_game_time():diffSec(self.timer))
if game.get_game_time():diffSec(self.timer) > self.idle then
for k,v in pairs(self.list) do
self:check_spawn(v.id)
end
self.timer = game.get_game_time()
end
end
function object_spawner:destroy()
for k,v in pairs(self.list) do
self:restore(k)
self.list[k] = nil
end
end
function create_spawner()
if xr_spawner.spawner == nil then
xr_spawner.spawner = xr_spawner.object_spawner()
printf("spawner created")
return true
end
return false
end
function update()
if xr_spawner.spawner ~= nil then
xr_spawner.spawner:update()
end
end
function remove_from_list (id)
if xr_spawner.spawner ~= nil then
xr_spawner.spawner:remove_from_list (id)
end
end
]]--
-----------------------------------------------------------------------------------
local spawn_list = {}
-----------------------------
function add_to_spawn_list (s_object)
for k,v in pairs(spawn_list) do
if v.id == s_object.id then
return
end
end
spawn_list[s_object.id] =
{
id = s_object.id,
cond = xr_logic.cfg_get_condlist (s_object:spawn_ini (), "spawner", "cond", s_object),
npc = nil,
online = false
}
printf ("Add object : %s", s_object:name ())
if spawn_list[s_object.id].cond then print_table (spawn_list[s_object.id].cond) end
end
-----------------------------
function check_spawn (s_object)
if this.is_object_in_list (s_object) == false then
this.add_to_spawn_list (s_object)
end
local actor = db.actor
if actor ~= nil then
if spawn_list[s_object.id].cond ~= nil then
if spawn_list[s_object.id].npc == nil then
if level.object_by_id(s_object.id) ~= nil then
if is_object_online (s_object.id) == true then
spawn_list[s_object.id].npc = level.object_by_id(s_object.id)
else
spawn_list[s_object.id].npc = nil
end
else
spawn_list[s_object.id].npc = nil
end
end
if xr_logic.pick_section_from_condlist(actor, spawn_list[s_object.id].npc,
spawn_list[s_object.id].cond.condlist) ~= nil
then
return true
else
spawn_list[s_object.id].npc = nil
spawn_list[s_object.id].online = false
return false
end
else
return true
end
end
spawn_list[s_object.id].npc = nil
return false
end
-----------------------------------------------------------------------------------
function is_object_in_list (s_object)
return spawn_list[s_object.id] ~= nil
end