196 lines
No EOL
5.4 KiB
Text
196 lines
No EOL
5.4 KiB
Text
--'******************************************************
|
|
--'* Ìåíåäæåð äëÿ âûáîðà êàâåðîâ â òåêóùåì ñìàðòå.
|
|
--'******************************************************
|
|
|
|
class "CCover_manager"
|
|
function CCover_manager:__init(smart)
|
|
self.squads = {}
|
|
self.cover_table = {}
|
|
self.board = sim_board.get_sim_board()
|
|
self.is_valid = false
|
|
-- self.name = smart:name()
|
|
-- self.sid = math.random(1,100000)
|
|
end
|
|
function CCover_manager:register_squad(squad)
|
|
-- printf("CCover_manager:register_squad() name[%s] sid[%s]", tostring(self.name), tostring(self.sid))
|
|
if squad.player_id ~= "monster" then
|
|
self.squads[squad.id] = true
|
|
self.is_valid = false
|
|
end
|
|
end
|
|
function CCover_manager:unregister_squad(squad)
|
|
-- printf("CCover_manager:unregister_squad() name[%s] sid[%s]", tostring(self.name), tostring(self.sid))
|
|
if self.squads[squad.id] == nil then
|
|
return
|
|
end
|
|
self.squads[squad.id] = nil
|
|
self.is_valid = false
|
|
end
|
|
function CCover_manager:calculate_covers(position)
|
|
--printf("CCover_manager:calculate_covers() valid[%s]", tostring(self.is_valid))
|
|
--callstack()
|
|
if self.is_valid == true then
|
|
return
|
|
end
|
|
self.is_valid = true
|
|
|
|
local npc_table = {}
|
|
for k,v in pairs(self.squads) do
|
|
local squad = alife():object(k)
|
|
for kk in squad:squad_members() do
|
|
if db.storage[kk.id] ~= nil then
|
|
local npc_object = db.storage[kk.id].object
|
|
table.insert(npc_table, npc_object)
|
|
end
|
|
end
|
|
end
|
|
|
|
for k,v in pairs(npc_table) do
|
|
v:register_in_combat()
|
|
end
|
|
|
|
self.cover_table = {}
|
|
for k,v in pairs(npc_table) do
|
|
v:find_best_cover(position)
|
|
end
|
|
for k,v in pairs(npc_table) do
|
|
local cover = v:find_best_cover(position)
|
|
if cover ~= nil then
|
|
--printf("!!! %s: %s [%s]", v:name(), cover:level_vertex_id(), tostring(cover:is_smart_cover()))
|
|
self.cover_table[v:id()] = {cover_vertex_id = cover:level_vertex_id(), cover_position = cover:position(),
|
|
look_pos = position, is_smart_cover = cover:is_smart_cover()}
|
|
--else
|
|
--printf("!!! nil")
|
|
end
|
|
end
|
|
|
|
for k,v in pairs(npc_table) do
|
|
v:unregister_in_combat()
|
|
end
|
|
end
|
|
|
|
function CCover_manager:save(packet)
|
|
set_save_marker(packet, "save", false, "CCover_manager")
|
|
|
|
packet:w_bool(self.is_valid)
|
|
|
|
-- ñîõðàíÿòü ðåãèñòðåííûå ñêâàäû
|
|
local n = 0
|
|
for k,v in pairs(self.cover_table) do
|
|
n = n + 1
|
|
end
|
|
packet:w_u8(n)
|
|
for k,v in pairs(self.cover_table) do
|
|
packet:w_u16(k)
|
|
packet:w_u32(v.cover_vertex_id)
|
|
packet:w_float(v.cover_position.x)
|
|
packet:w_float(v.cover_position.y)
|
|
packet:w_float(v.cover_position.z)
|
|
packet:w_float(v.look_pos.x)
|
|
packet:w_float(v.look_pos.y)
|
|
packet:w_float(v.look_pos.z)
|
|
packet:w_bool(v.is_smart_cover)
|
|
end
|
|
|
|
set_save_marker(packet, "save", true, "CCover_manager")
|
|
end
|
|
|
|
function CCover_manager:load(packet)
|
|
set_save_marker(packet, "load", false, "CCover_manager")
|
|
|
|
self.is_valid = packet:r_bool()
|
|
|
|
local n = packet:r_u8()
|
|
for i = 1,n do
|
|
local npc_id = packet:r_u16()
|
|
local cover_vertex_id = packet:r_u32()
|
|
local cover_position = vector():set(0,0,0)
|
|
cover_position.x = packet:r_float()
|
|
cover_position.y = packet:r_float()
|
|
cover_position.z = packet:r_float()
|
|
|
|
local look_pos = vector():set(0,0,0)
|
|
look_pos.x = packet:r_float()
|
|
look_pos.y = packet:r_float()
|
|
look_pos.z = packet:r_float()
|
|
|
|
local is_smart_cover = packet:r_bool()
|
|
|
|
self.cover_table[npc_id] = {cover_vertex_id = cover_vertex_id, cover_position = cover_position,
|
|
look_pos = look_pos, is_smart_cover = is_smart_cover}
|
|
end
|
|
|
|
set_save_marker(packet, "load", true, "CCover_manager")
|
|
end
|
|
|
|
|
|
|
|
-- Åñòü ëè ó îáúåêòà âûáðàííûé ñìàðò êàâåð
|
|
function has_smart_cover(se_obj, smrttrn)
|
|
local cmanager = smrttrn.combat_manager.cover_manager
|
|
local npc_id = se_obj.id
|
|
local cover = cmanager.cover_table[npc_id]
|
|
|
|
if cover == nil then
|
|
return false
|
|
end
|
|
|
|
if cover.is_smart_cover ~= true then
|
|
return false
|
|
end
|
|
|
|
local npc_storage = db.storage[npc_id]
|
|
if npc_storage == nil then
|
|
return false
|
|
end
|
|
|
|
local npc_obj = npc_storage.object
|
|
local level_id = game_graph():vertex(smrttrn.m_game_vertex_id):level_id()
|
|
|
|
local smrt_cover = se_smart_cover.registered_smartcovers_by_lv_id[level_id][cover.cover_vertex_id]
|
|
if smrt_cover == nil then
|
|
return false
|
|
end
|
|
local smrt_cover_object = bind_smart_cover.registered_smartcovers[smrt_cover:name()]
|
|
if npc_obj:suitable_smart_cover(smrt_cover_object) then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
-- Åñòü ëè ó îáúåêòà âûáðàííûé êàâåð
|
|
function has_cover(se_obj, smrttrn)
|
|
local cmanager = smrttrn.combat_manager.cover_manager
|
|
local cover = cmanager.cover_table[se_obj.id]
|
|
if cover == nil then
|
|
return false
|
|
end
|
|
|
|
if cover.is_smart_cover then
|
|
local npc_storage = db.storage[npc_id]
|
|
if npc_storage == nil then
|
|
return true
|
|
end
|
|
|
|
local npc_obj = npc_storage.object
|
|
local level_id = game_graph():vertex(smrttrn.m_game_vertex_id):level_id()
|
|
local smrt_cover = se_smart_cover.registered_smartcovers_by_lv_id[level_id][cover.cover_vertex_id]
|
|
if smrt_cover == nil then
|
|
return true
|
|
end
|
|
|
|
local smrt_cover_object = bind_smart_cover.registered_smartcovers[smrt_cover:name()]
|
|
|
|
if npc_obj:suitable_smart_cover(smrt_cover_object) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
-- Ïîëó÷èòü âûáðàííûé êàâåð îáúåêòà
|
|
function get_cover(obj, smrttrn)
|
|
local cmanager = smrttrn.combat_manager.cover_manager
|
|
return cmanager.cover_table[obj:id()]
|
|
end |