98 lines
2.8 KiB
Plaintext
98 lines
2.8 KiB
Plaintext
bones_list = {
|
|
[1] = "bip01_head",
|
|
[2] = "bip01_spine",
|
|
[3] = "bip01_l_hand",
|
|
[4] = "bip01_r_hand",
|
|
[5] = "bip01_l_foot",
|
|
[6] = "bip01_r_foot",
|
|
}
|
|
timer_twitch = 0
|
|
corpses_to_update = {}
|
|
time_factor = 6
|
|
basic_duration = 10
|
|
function on_game_start()
|
|
time_factor = SYS_GetParam(2,"alife","time_factor")
|
|
RegisterScriptCallback("actor_on_before_death", on_actor_before_death)
|
|
RegisterScriptCallback("actor_on_update", update_corpses)
|
|
RegisterScriptCallback("npc_on_death_callback", npc_on_death_callback)
|
|
RegisterScriptCallback("bullet_on_impact", bullet_on_impact)
|
|
end
|
|
|
|
function bullet_on_impact(bullet)
|
|
if bullet.target_id ~= 65535 then
|
|
local obj = level.object_by_id(bullet.target_id)
|
|
if obj and (IsStalker(obj)) and (not obj:alive()) and corpses_to_update[obj:id()] then
|
|
printf("shot")
|
|
corpses_to_update[obj:id()].duration = corpses_to_update[obj:id()].duration - basic_duration * time_factor
|
|
end
|
|
end
|
|
end
|
|
|
|
function on_actor_before_death()
|
|
CreateTimeEvent("actorhit1","imphit2", 0.25, impulse_actor)
|
|
end
|
|
|
|
function npc_on_death_callback(npc)
|
|
if not npc then return end
|
|
local twitch_power = math.random() * 3.5
|
|
--CreateTimeEvent("npchit1","gimphit2", 0, death_impulse, npc)
|
|
corpses_to_update[npc:id()] = {
|
|
power = twitch_power,
|
|
duration = twitch_power * basic_duration * time_factor,
|
|
death_time = game.get_game_time()
|
|
}
|
|
end
|
|
|
|
function death_impulse(npc)
|
|
if npc:get_physics_shell() then
|
|
local mul = 30000
|
|
npc:get_physics_shell():apply_force(math.random(-1,1) * mul * 0.5, 0, math.random(-1,1) * mul * 0.5)
|
|
return true
|
|
end
|
|
end
|
|
|
|
function update_corpses()
|
|
local tg = time_global()
|
|
if timer_twitch > tg then return end
|
|
timer_twitch = tg + 50
|
|
local c_time = game.get_game_time()
|
|
for k,v in pairs(corpses_to_update) do
|
|
local obj = level.object_by_id(k)
|
|
if not obj then
|
|
corpses_to_update[k] = nil
|
|
else
|
|
impulse_corpse(obj, v, c_time)
|
|
if v.duration < -1 * v.death_time:diffSec(c_time) then
|
|
corpses_to_update[k] = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function impulse_corpse(obj, data, c_time)
|
|
local h = hit()
|
|
--printf(data.power * ((data.duration + data.death_time:diffSec(c_time)) / data.duration))
|
|
h.impulse = data.power * ((data.duration + data.death_time:diffSec(c_time)) / data.duration)
|
|
h.draftsman = obj
|
|
local dirx = math.random() * 2 + -1
|
|
local diry = math.random() * 2 + -1
|
|
local dirz = math.random() * 2 + -1
|
|
h.direction = vector():set(dirx,diry,dirz)
|
|
h:bone(bones_list[math.random(1,6)]) -- чтобы учитывалась броня
|
|
h.power = 0.01
|
|
h.type = hit.burn
|
|
obj:hit(h)
|
|
end
|
|
|
|
function impulse_actor()
|
|
if not db.actor:alive() then
|
|
AddUniqueCall(update_corpses)
|
|
local twitch_power = math.random() * 3.5
|
|
corpses_to_update[db.actor:id()] = {
|
|
power = twitch_power,
|
|
duration = twitch_power * basic_duration * time_factor,
|
|
death_time = game.get_game_time()
|
|
}
|
|
end
|
|
return true
|
|
end |