e4s-game/gamedata/scripts/se_smart_cover.script
2026-06-18 01:18:29 +03:00

153 lines
4.6 KiB
Text

--'******************************************************
--'* серверный класс объекта смарт кавер .
--'******************************************************
registered_smartcovers = {}
registered_smartcovers_by_lv_id = {}
class "se_smart_cover" (cse_smart_cover)
function se_smart_cover:__init (section) super (section)
-- printf("se_smart_cover:__init( ) called")
self.loopholes = {}
self.last_description = ""
if self.set_available_loopholes ~= nil then
self:set_available_loopholes ( self.loopholes )
end
end
function se_smart_cover:STATE_Write (packet)
cse_smart_cover.STATE_Write (self, packet)
packet:w_stringZ(self.last_description)
local n = 0
for k,v in pairs (self.loopholes) do
n = n + 1
end
packet:w_u8(n)
for k,v in pairs (self.loopholes) do
packet:w_stringZ(k)
packet:w_bool(v)
end
-- printf("write")
-- print_table(self.loopholes)
end
function se_smart_cover:STATE_Read (packet, size)
cse_smart_cover.STATE_Read (self, packet, size)
if self.script_version >= 9 then
self.last_description = packet:r_stringZ()
local smart_cover_description
if self.last_description ~= "" then
smart_cover_description = self.last_description
else
smart_cover_description = self:description()
end
local existing_loopholes = {}
if smart_cover_description ~= nil then
printf("name %s descr %s", self:name(), tostring(smart_cover_description))
if smart_covers == nil then
abort("smartcovers is nil")
end
if smart_covers.descriptions[smart_cover_description] == nil then
abort("smartcover [%s] has wrong description [%s]!!!", self:name(), tostring(smart_cover_description))
end
local loopholes = smart_covers.descriptions[smart_cover_description].loopholes
for k,v in pairs (loopholes) do
existing_loopholes[v.id] = true
end
end
local n = packet:r_u8()
for i = 1, n do
local loophole_id = packet:r_stringZ()
local loophole_exist = packet:r_bool()
if existing_loopholes[loophole_id] then
self.loopholes[loophole_id] = loophole_exist
end
end
else
local smart_cover_description = self:description()
if smart_cover_description ~= nil and
smart_covers.descriptions[smart_cover_description] ~= nil -- IX-Ray: Fixed scripts working in editors
then
local loopholes = smart_covers.descriptions[smart_cover_description].loopholes
for k,v in pairs (loopholes) do
self.loopholes[v.id] = true
end
self.last_description = smart_cover_description
end
end
end
function se_smart_cover:on_before_register()
cse_smart_cover.on_before_register( self )
registered_smartcovers[self:name()] = self
end
function se_smart_cover:on_register()
cse_smart_cover.on_register( self )
story_objects.check_spawn_ini_for_story_id(self)
local level_id = game_graph():vertex(self.m_game_vertex_id):level_id()
if registered_smartcovers_by_lv_id[level_id] == nil then
registered_smartcovers_by_lv_id[level_id] = {}
end
registered_smartcovers_by_lv_id[level_id][self.m_level_vertex_id] = self
-- printf("smart_cover [%s] is registered lvlid [%s] lvid[%s]", self:name(), tostring(level_id), tostring(self.m_level_vertex_id))
end
function se_smart_cover:on_unregister()
unregister_story_object_by_id(self.id)
registered_smartcovers[self:name()] = nil
local level_id = game_graph():vertex(self.m_game_vertex_id):level_id()
registered_smartcovers_by_lv_id[level_id][self.m_level_vertex_id] = nil
-- printf("smart_cover [%s] is unregistered", self:name())
cse_smart_cover.on_unregister(self)
end
function se_smart_cover:update()
cse_smart_cover.update(self)
end
function se_smart_cover:FillProps (pref,items)
-- log ("CSE_NewAttachableItem::FillProps called!")
-- log (tostring(self:description()))
cse_smart_cover.FillProps (self,pref,items)
local prefix = pref .. "\\" .. self:section_name().."\\"
local smart_cover_description = self:description()
if smart_cover_description ~= self.last_description then
for k,v in pairs (self.loopholes) do
self.loopholes[k] = nil
end
self.last_description = tostring(smart_cover_description)
end
if smart_cover_description ~= nil then
local loopholes = smart_covers.descriptions[smart_cover_description].loopholes
for k,v in pairs (loopholes) do
if self.loopholes[v.id] == nil then
self.loopholes[v.id] = true
end
local h = properties_helper():create_bool (items, prefix .. "loopholes\\"..v.id,self,self.loopholes,v.id)
self:set_loopholes_table_checker(h)
end
end
end