Divergent/mods/FDDA Enhanced Animations - .../gamedata/scripts/enhanced_animations.script

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 >--