102 lines
4.6 KiB
Plaintext
102 lines
4.6 KiB
Plaintext
|
function surge_started()
|
||
|
return surge_manager.is_loaded() and surge_manager.is_started()
|
||
|
or psi_storm_manager.is_loaded() and psi_storm_manager.is_started()
|
||
|
end
|
||
|
|
||
|
local enable_debug = false
|
||
|
function print_dbg(fmt,...)
|
||
|
if enable_debug then
|
||
|
printf("Psi-Storm Manager | " .. fmt,...)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- local psi_kill = psi_storm_manager.CPsiStormManager.kill_objects_at_pos
|
||
|
psi_storm_manager.CPsiStormManager.kill_objects_at_pos = function(self, vortex_pos, fate)
|
||
|
-- if (load_var(db.actor,"surge_immuned",false) == true) then
|
||
|
-- return
|
||
|
-- end
|
||
|
|
||
|
if (not vortex_pos) then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
printdbg("kill_objects_at_pos | pos: %s - fate: %s", vortex_pos, fate)
|
||
|
|
||
|
local sm = surge_manager.get_surge_manager()
|
||
|
local id, comm, npc_pos, se_npc, npc, squad, squad_id, smart, surge_smart
|
||
|
local board = SIMBOARD
|
||
|
local sim = alife()
|
||
|
for i=1, #db.OnlineStalkers do
|
||
|
id = db.OnlineStalkers[i]
|
||
|
npc = db.storage[id] and db.storage[id].object or level.object_by_id(id)
|
||
|
if npc then
|
||
|
comm = npc:character_community()
|
||
|
npc_pos = npc:position()
|
||
|
|
||
|
if npc_pos
|
||
|
and IsStalker(npc) -- must be stalker
|
||
|
and npc:alive() -- must be alive
|
||
|
and (comm ~= "monolith") -- not monolith (immune)
|
||
|
and (comm ~= "zombied") -- not zombied (immune)
|
||
|
and (not get_object_story_id(id)) -- not story npc
|
||
|
and (distance_2d(vortex_pos, npc_pos) < self.max_distance_npc_hit) -- npc is close to psi-vortex
|
||
|
and not (id == AC_ID and level_environment.is_actor_immune()) -- npc is actor and not immune
|
||
|
and not surge_manager_ignore_npc.ignore_npc[npc:section()] -- not important npc (immune)
|
||
|
and not sm:pos_in_cover(npc_pos) -- not in cover
|
||
|
and not sm:check_grace_threshold(npc)
|
||
|
then
|
||
|
se_npc = sim:object(id)
|
||
|
squad_id = se_npc.group_id
|
||
|
squad = squad_id and sim:object(squad_id)
|
||
|
|
||
|
if se_npc and squad then
|
||
|
smart = board and squad.smart_id and board.smarts[squad.smart_id] and board.smarts[squad.smart_id].smrt
|
||
|
surge_smart = smart and smart.props and (tonumber(smart.props["surge"]) > 0)
|
||
|
-- if not (surge_smart or sm:pos_in_cover(npc_pos)) then -- if stalker is not in a safe smart or not inside
|
||
|
if not sm:pos_in_cover(npc_pos) then -- if stalker is not inside
|
||
|
|
||
|
self.humanParticles[squad_id.."_"..id] = particles_object("crommcruac\\electrocute_human")
|
||
|
self.humanParticles[squad_id.."_"..id]:play_at_pos(npc_pos)
|
||
|
|
||
|
if (fate == "turn_to_zombie") then
|
||
|
print_dbg('kill_objects_at_pos | turn_to_zombie [%s]',se_npc:name())
|
||
|
sm:turn_to_zombie(se_npc,squad)
|
||
|
elseif (fate == "explode") then
|
||
|
print_dbg('kill_objects_at_pos | explode [%s]',se_npc:name())
|
||
|
sm:explode(se_npc)
|
||
|
else
|
||
|
print_dbg('kill_objects_at_pos | kill [%s]',se_npc:name())
|
||
|
npc:kill(npc)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if not (IsStalker(npc)) then print_dbg('cant kill %s must be stalker', npc:name()) end
|
||
|
if not (npc:alive()) then print_dbg('cant kill %s must be alive', npc:name()) end
|
||
|
if not ((comm ~= "monolith")) then print_dbg('cant kill %s is monolith (immune)', npc:name()) end
|
||
|
if not ((comm ~= "zombied")) then print_dbg('cant kill %s is zombied (immune)', npc:name()) end
|
||
|
if not ((not get_object_story_id(id))) then print_dbg('cant kill %s is story npc', npc:name()) end
|
||
|
if not ((distance_2d(vortex_pos, npc_pos) < self.max_distance_npc_hit)) then print_dbg('cant kill %s not close to psi-vortex', npc:name()) end
|
||
|
if not (not (id == AC_ID and level_environment.is_actor_immune())) then print_dbg('cant kill %s npc is actor and immune', npc:id()) end
|
||
|
if not (not surge_manager_ignore_npc.ignore_npc[npc:section()]) then print_dbg('cant kill %s, is important, section %s', npc:name(), npc:section()) end
|
||
|
if npc_pos and sm:pos_in_cover(npc_pos) then
|
||
|
sm:set_grace_threshold(npc)
|
||
|
print_dbg('cant kill npc [%s] | in_cover: %s', npc:name(), npc_pos and sm:pos_in_cover(npc_pos,true)) end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function npc_on_update(npc)
|
||
|
if surge_started() then
|
||
|
local surge_manager = surge_manager.get_surge_manager()
|
||
|
if surge_manager:pos_in_cover(npc:position()) then
|
||
|
surge_manager:set_grace_threshold(npc)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function on_game_start()
|
||
|
RegisterScriptCallback("npc_on_update", npc_on_update)
|
||
|
end
|