380 lines
12 KiB
Plaintext
380 lines
12 KiB
Plaintext
--[[
|
|
--------------------PLEASE DO NOT DELETE THIS SECTION---------------------------
|
|
================================================================================
|
|
Script(enhanced_animations) original:
|
|
\\Author : thales100
|
|
================================================================================
|
|
|
|
Animations authors: LilGABE,denis2000,ValeroK,STRIFER,Feel_Fried
|
|
|
|
================================================================================
|
|
Script(enhanced_animations) reworked:
|
|
Adaptation and crooked rework for Anomaly =): Feel_Fried
|
|
|
|
Engine functions consultants: Amomawy devs - Lucy, tdef, Tronex
|
|
|
|
Monkey patches and mask effect switcher implementation: RavenAscendant
|
|
|
|
Main shitcode critic: Igigog
|
|
================================================================================
|
|
|
|
Addon main page:
|
|
|
|
https://www.moddb.com/mods/stalker-anomaly/addons/food-drug-and-drinks-animations-reuploaded
|
|
|
|
================================================================================
|
|
|
|
All your base are belong to us! (⌐■_■)
|
|
]]--
|
|
local ini_eff = {}
|
|
enable_animations = true
|
|
mutant_loot_mod = false
|
|
local ea_debug = false
|
|
ini_eff = ini_file("items\\items\\animations_settings.ltx")
|
|
local active_slot,anim_exist_tm,wpn,item_usage_snd,monster_usage_snd,item,anim_use_time,obj_m,used_monster = nil
|
|
used_item,ea_flag,fake_monster,det_active,anim_section = nil
|
|
|
|
function on_game_start()
|
|
RegisterScriptCallback("on_game_load",on_game_load)
|
|
RegisterScriptCallback("on_option_change", loadsettings)
|
|
if not ui_mcm then
|
|
RegisterScriptCallback("on_key_release", on_key_release)
|
|
end
|
|
end
|
|
|
|
function on_game_load()
|
|
activate()
|
|
end
|
|
|
|
--< Addon control
|
|
function on_key_release(key)
|
|
local bind = dik_to_bind(key)
|
|
if (bind == key_bindings.kCAM_ZOOM_OUT) then
|
|
enable_animations = not enable_animations
|
|
end
|
|
end
|
|
|
|
function loadsettings()
|
|
if ui_mcm then -- here we test to make sure ui_mcm exists before trying to call it's get function.
|
|
enable_animations = ui_mcm.get("EA_settings/enable_animations")
|
|
mutant_loot_mod = ui_mcm.get("EA_settings/mutant_loot")
|
|
ea_debug = ui_mcm.get("EA_settings/ea_debug")
|
|
if enable_animations == false then
|
|
mutant_loot_mod = false
|
|
ui_mcm.set("EA_settings/mutant_loot", false)
|
|
end
|
|
else
|
|
mutant_loot_mod = ini_eff:r_bool_ex("anim_settings", "mutant_loot_mod")
|
|
enable_animations = ui_options.get("video/player/animations")
|
|
end
|
|
end
|
|
|
|
function activate()
|
|
ini_eff = ini_file("items\\items\\animations_settings.ltx")
|
|
RegisterScriptCallback("monster_on_actor_use_callback",monster_on_actor_use)
|
|
RegisterScriptCallback("actor_on_first_update",actor_on_first_update)
|
|
end
|
|
-- Addon control >--
|
|
|
|
--< Animations engine
|
|
function anim_prepare()
|
|
game.only_allow_movekeys(true)
|
|
hide_det()
|
|
active_slot = db.actor:active_slot()
|
|
anim_exist_tm = nil
|
|
db.actor:restore_weapon()
|
|
db.actor:activate_slot(0)
|
|
RegisterScriptCallback("actor_on_update", actor_on_update)
|
|
end
|
|
|
|
function use_item(obj)
|
|
item = obj:section()
|
|
local outfit = db.actor:item_in_slot(7)
|
|
outfit = outfit and outfit:section() or item
|
|
local hud = SYS_GetParam(0, outfit, "player_hud_section", "")
|
|
if hud:find("exo$") then
|
|
item = item .. "_exo"
|
|
if not ini_eff:r_string_ex(item, "snd") then
|
|
-- Revert back
|
|
item = obj:section()
|
|
end
|
|
end
|
|
obj_m = obj
|
|
used_item = item
|
|
hide_hud_inventory()
|
|
anim_section = ini_eff:r_string_ex(item, "anm")
|
|
mask_hud_switcher()
|
|
anim_prepare()
|
|
end
|
|
|
|
function monster_on_actor_use(obj)
|
|
if (not mutant_loot_mod) or (not enable_animations) then
|
|
used_monster = nil
|
|
anim_exist_tm = nil
|
|
return
|
|
end
|
|
wpn = db.actor:active_item()
|
|
if wpn then
|
|
wpn = wpn:clsid() == clsid.wpn_knife_s and wpn:section() or "wpn_knife5"
|
|
wpn = string.gsub(wpn,"-","_")
|
|
end
|
|
item_knife.degradate()
|
|
used_monster = obj
|
|
level.disable_input()
|
|
anim_prepare()
|
|
recalc_actor_campos()
|
|
end
|
|
|
|
function start_anim(anim_section_hud)
|
|
UnregisterScriptCallback("actor_on_update", actor_on_update)
|
|
fov_anim_manager.change_fov(0.45)
|
|
local speed = ini_eff:r_float_ex(used_item or "nothing", "speed") or 1
|
|
if ea_debug then printf("speed is = "..speed) end
|
|
game.play_hud_motion(2, anim_section_hud, "anm_ea_show", false, speed)
|
|
local hud_anm = used_item and ini_eff:r_string_ex(used_item, "hud_anm")
|
|
if hud_anm then
|
|
game.play_hud_anm(hud_anm, 0, 1, 1, false)
|
|
end
|
|
hud_anm = nil
|
|
end
|
|
|
|
function anim_manager_item(anim_section_hud)
|
|
item_usage_snd = sound_object(ini_eff:r_string_ex(used_item, "snd"))
|
|
item_usage_snd:play(db.actor, 0, sound_object.s2d)
|
|
level.add_cam_effector(ini_eff:r_string_ex(used_item, "cam"), 8555, false, "")
|
|
tmr = ini_eff:r_float_ex(used_item, "tm")
|
|
anim_exist_tm = tmr*0.001
|
|
anim_use_time = anim_exist_tm*0.367
|
|
CreateTimeEvent("ea_object_eater", "eat_my_obj", anim_use_time, eat_my_obj)
|
|
CreateTimeEvent("ea_slot_returner", "call_my_slot_back", (anim_exist_tm + 0.1), call_my_slot_back)
|
|
if ciga_effects then
|
|
if ini_eff:line_exist(used_item, "smoke") then ciga_effects.ciga_start(used_item) end
|
|
end
|
|
alife_create_item("items_anm_dummy",db.actor)
|
|
CreateTimeEvent("ea_anim_stoper", "stop_my_item_anim", anim_exist_tm, stop_my_item_anim)
|
|
ea_callbacks.EA_SendScriptCallback("ea_on_item_use",used_item,anim_exist_tm)
|
|
end
|
|
|
|
function anim_manager_monster()
|
|
monster_usage_snd = sound_object(ini_eff:r_string_ex("item_ea_harv_wpn_knife", "anim_sound"))
|
|
monster_usage_snd:play(db.actor, 0, sound_object.s2d)
|
|
level.add_cam_effector("itemuse_anm_effects\\harvest_skin_use.anm", 8558, false, "")
|
|
level.add_cam_effector("itemuse_anm_effects\\test.anm", 8559, false, "")
|
|
tmr = ini_eff:r_float_ex("item_ea_harv_wpn_knife", "anim_length")
|
|
anim_exist_tm = tmr*0.001
|
|
CreateTimeEvent("ea_slot_returner", "call_my_slot_back", (anim_exist_tm + 0.5), call_my_slot_back)
|
|
CreateTimeEvent("ea_blood_fx", "blood_fx", (1), blood_fx)
|
|
CreateTimeEvent("ea_blood_fx2", "blood_fx2", (1.6), blood_fx)
|
|
CreateTimeEvent("ea_blood_fx3", "blood_fx3", (2.1), blood_fx)
|
|
CreateTimeEvent("ea_blood_fx4", "blood_fx4", (2.2), blood_fx)
|
|
CreateTimeEvent("ea_anim_stoper", "stop_my_monster_anim", anim_exist_tm, stop_my_monster_anim)
|
|
end
|
|
|
|
local failure_timer = 0
|
|
local fdda_error_snd = sound_object(ini_eff:r_string_ex("fdda_error_snd", "snd"))
|
|
function actor_on_update()
|
|
failure_timer = failure_timer + (device().time_delta/17)
|
|
if ea_debug then printf("update = "..failure_timer) end
|
|
if (db.actor:active_slot() ~= 0 or db.actor:active_detector()) and (failure_timer < 100) then
|
|
return
|
|
elseif ea_debug and (failure_timer >= 100) then
|
|
fdda_error_snd:play(db.actor, 0, sound_object.s2d)
|
|
printf("hide weapons for anim failed")
|
|
printf(used_item or (used_monster and used_monster:section()) or "anim find ERROR")
|
|
printf(anim_section or "NO ANIM SECTION FOUND")
|
|
level.enable_input()
|
|
game.only_allow_movekeys(false)
|
|
actor_menu.set_msg(1, "PLEASE EXIT THE GAME AND SEND LOG FILE TO FEEL_FRIED",5)
|
|
end
|
|
local anim_section_hud = nil
|
|
if used_monster then
|
|
anim_section_hud = "item_ea_harv_" .. ( wpn or "wpn_knife3" ) .. "_hud"
|
|
start_anim(anim_section_hud)
|
|
anim_manager_monster()
|
|
failure_timer = 0
|
|
return
|
|
end
|
|
failure_timer = 0
|
|
anim_section_hud = anim_section .. "_hud"
|
|
anim_section = nil
|
|
start_anim(anim_section_hud)
|
|
anim_manager_item(anim_section_hud)
|
|
end
|
|
-- Animations engine >--
|
|
|
|
--< Monkey patches
|
|
--preventing default Anomaly anims
|
|
local originalPIF = actor_effects.play_item_fx
|
|
function actor_effects.play_item_fx(item)
|
|
if ini_eff:r_string_ex(item, "snd") and enable_animations or ini_eff:r_bool_ex("skip_items", item) then return end
|
|
if skip_functor(item) then return end
|
|
originalPIF(item)
|
|
end
|
|
|
|
local originalUW = actor_effects.use_weapon
|
|
function actor_effects.use_weapon(f)
|
|
if f == 1 then
|
|
CreateTimeEvent("ea_def_use", "def_use_end", 0.5, def_use_end)
|
|
end
|
|
if f == 0 then
|
|
hide_hud_inventory()
|
|
game.only_allow_movekeys(true)
|
|
end
|
|
originalUW(f)
|
|
end
|
|
|
|
--delaying item use
|
|
local originalAOIBU = itms_manager.actor_on_item_before_use
|
|
function itms_manager.actor_on_item_before_use(obj,flags)
|
|
originalAOIBU(obj,flags)
|
|
local item = obj:section()
|
|
local outfit = db.actor:item_in_slot(7)
|
|
outfit = outfit and outfit:section() or item
|
|
local hud = SYS_GetParam(0, outfit, "player_hud_section", "")
|
|
printf("hud section is %s", hud)
|
|
if hud:find("exo$") then
|
|
item = item .. "_exo"
|
|
if not ini_eff:r_string_ex(item, "snd") then
|
|
-- Revert back
|
|
printf("hud section %s is exo but no animation %s, revert back", hud, item)
|
|
item = obj:section()
|
|
else
|
|
printf("hud section %s is exo and found animation %s", hud, item)
|
|
end
|
|
else
|
|
printf("hud section %s is not exo", hud)
|
|
end
|
|
if IsMoveState("mcClimb") then
|
|
actor_menu.set_msg(1, game.translate_string("st_EA_ladder_item_not_allowed"),3)
|
|
flags.ret_value = false
|
|
return
|
|
end
|
|
if ini_eff:r_string_ex(item, "snd") and enable_animations and flags.ret_value then
|
|
use_item(obj)
|
|
flags.ret_value = false
|
|
return
|
|
end
|
|
return
|
|
end
|
|
|
|
--delaying mutant loot dialog
|
|
local originalUMLS = ui_mutant_loot.start
|
|
function ui_mutant_loot.start(obj, for_bug1, for_bug2)
|
|
if not ea_flag and enable_animations and mutant_loot_mod then return end
|
|
originalUMLS(obj, for_bug1, for_bug2)
|
|
end
|
|
-- Monkey patches >--
|
|
|
|
--< Time Events
|
|
function call_my_slot_back()
|
|
game.only_allow_movekeys(false)
|
|
if take_item_anim and fake_monster then
|
|
return true
|
|
end
|
|
db.actor:activate_slot(active_slot or 0)
|
|
if det_active then det_active:switch_state(1) end
|
|
return true
|
|
end
|
|
|
|
local bone_list = {
|
|
[1] = "bip01_spine1",
|
|
[2] = "bip01_spine2",
|
|
[3] = "bip01_spine",
|
|
[4] = "bip01_pelvis",
|
|
[5] = "bip01_head",
|
|
}
|
|
function blood_fx()
|
|
if not used_monster or used_monster:id() == 65535 then return true end
|
|
local fx_pos = used_monster:bone_position(bone_list[math.random(1,5)])
|
|
fx_pos.y = fx_pos.y + 0.1
|
|
local blood_trace = vector():set(0,-1,0)
|
|
wallmarks_manager():place_skeleton(used_monster, "bloody_marks", fx_pos, blood_trace, 0.2,-1)
|
|
wallmarks_manager():place(blood_trace, fx_pos, 15, 0.3, "bloody_marks", used_monster,-1)
|
|
local hit_fx = particles_object("hit_fx\\hit_flesh_01")
|
|
hit_fx:play_at_pos(fx_pos)
|
|
local hit_fx2 = particles_object("hit_fx\\hit_flesh_02a")
|
|
hit_fx2:play_at_pos(fx_pos)
|
|
local hit_fx3 = particles_object("hit_fx\\hit_knife_flesh_00")
|
|
hit_fx3:play_at_pos(fx_pos)
|
|
return true
|
|
end
|
|
|
|
--eating fake item to stop default items sound and delayed item using
|
|
function eat_my_obj()
|
|
if obj_m then
|
|
db.actor:eat(obj_m)
|
|
end
|
|
db.actor:eat(db.actor:object("items_anm_dummy"))
|
|
return true
|
|
end
|
|
|
|
function stop_my_item_anim()
|
|
ea_callbacks.EA_SendScriptCallback("ea_on_item_anim_stop",used_item)
|
|
ea_restore_actor()
|
|
mask_hud_switcher()
|
|
used_item = nil
|
|
obj_m = nil
|
|
return true
|
|
end
|
|
|
|
function stop_my_monster_anim()
|
|
ea_restore_actor()
|
|
if used_monster:id() == 65535 or ( not take_item_anim ) then
|
|
used_monster = nil
|
|
return true
|
|
end
|
|
fake_monster = used_monster
|
|
used_monster = nil
|
|
ea_flag = true
|
|
ui_mutant_loot.start(fake_monster, fake_monster:id(), fake_monster:section(), fake_monster:clsid())
|
|
ea_flag = nil
|
|
if not ui_mutant_loot.GUI:Reset(fake_monster, fake_monster:id(), fake_monster:section(), fake_monster:clsid()) then
|
|
fake_monster = nil
|
|
end
|
|
return true
|
|
end
|
|
|
|
function def_use_end()
|
|
game.only_allow_movekeys(false)
|
|
return true
|
|
end
|
|
-- Time Events >--
|
|
|
|
--< Additional animations and effects
|
|
function mask_hud_switcher()
|
|
if (not ini_eff:r_bool_ex(used_item, "helm")) and ui_options.get("video/player/mask_hud") then
|
|
actor_effects.switch_helm() --raven
|
|
actor_effects.Update_Mask(db.actor)
|
|
end
|
|
end
|
|
|
|
function ea_restore_actor()
|
|
db.actor:hide_weapon()
|
|
fov_anim_manager.restore_fov()
|
|
level.enable_input()
|
|
end
|
|
|
|
--holster item in device slot
|
|
function hide_det()
|
|
det_active = db.actor:active_detector() or nil
|
|
if det_active then det_active:switch_state(2) end
|
|
end
|
|
|
|
function actor_on_first_update()
|
|
if db.actor:object("items_anm_dummy") then alife_release(db.actor:object("items_anm_dummy")) end
|
|
loadsettings()
|
|
end
|
|
|
|
--addaptive camera for mutant skinning
|
|
function recalc_actor_campos()
|
|
local pm = used_monster:bone_position('bip01_spine1')
|
|
pm.y = pm.y + 0.8
|
|
db.actor:actor_look_at_point(pm)
|
|
end
|
|
|
|
-- mutant loot options check
|
|
function skip_functor(item)
|
|
return mutant_loot_mod and ini_eff:r_bool_ex("skip_mutant", item)
|
|
end
|
|
-- Additional animations and effects >--
|