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