118 lines
3.8 KiB
Plaintext
118 lines
3.8 KiB
Plaintext
--Tweaki_Breeki's
|
|
----_____-------------------_-_--------------------------------------------------_____-_-----_--------------------------------
|
|
---/-____|-----------------|-(_)-----------------/\-----------------------------/-____|-|---(_)-------------------------------
|
|
--|-|--__-_-__-_____------_|-|_-_-__---__-_-----/--\---_-__---__-_-_-__-_---_--|-|----|-|__--_-_-__-___---___-_-__-__-_-___---
|
|
--|-|-|_-|-'__/-_-\-\-/\-/-/-|-|-'_-\-/-_`-|---/-/\-\-|-'_-\-/-_`-|-'__|-|-|-|-|-|----|-'_-\|-|-'_-`-_-\-/-_-\-'__/-_`-/-__|--
|
|
--|-|__|-|-|-|-(_)-\-V--V-/|-|-|-|-|-|-(_|-|--/-____-\|-|-|-|-(_|-|-|--|-|_|-|-|-|____|-|-|-|-|-|-|-|-|-|--__/-|-|-(_|-\__-\--
|
|
---\_____|_|--\___/-\_/\_/-|_|_|_|-|_|\__,-|-/_/----\_\_|-|_|\__,-|_|---\__,-|--\_____|_|-|_|_|_|-|_|-|_|\___|_|--\__,_|___/--
|
|
---------------------------------------__/-|------------------__/-|------__/-|------------------------------------------------
|
|
--------------------------------------|___/------------------|___/------|___/-------------------------------------------------
|
|
--Version 1.1
|
|
--05/08/2021
|
|
--This file should be in gamedata\scripts\
|
|
--Checks the level for Chimeras, adds them to a table, randomly iterates through them every 2.5 - 5.0 seconds, if they are alive and angry at something then play a random growl sound at their position!
|
|
--Rechecks level for any newly spawned Chimeras every 60 seconds.
|
|
--All growl sounds made me using the existing Chimera sound files.
|
|
|
|
-- Edited by Tosox (31.01.2024)
|
|
|
|
MIN_GROWL_TIMEOUT = 2500
|
|
MAX_GROWL_TIMEOUT = 5000
|
|
|
|
tbl_mutants = {}
|
|
|
|
-- Needs to be a global variable in the script
|
|
-- The sound would otherwise stop instantly after playing
|
|
local growl_sound = nil
|
|
|
|
function get_random_elem(t)
|
|
local keys = {}
|
|
for k in pairs(t) do
|
|
table.insert(keys, k)
|
|
end
|
|
return t[keys[math.random(#keys)]]
|
|
end
|
|
|
|
function get_growl_sound(mutant)
|
|
-- Default (chimera growl)
|
|
local growl_type = "growl"
|
|
|
|
-- Lurker growl
|
|
if string.find(mutant:section(), "lurker") then
|
|
growl_type = "lurk"
|
|
end
|
|
|
|
return sound_object("tb_growls\\tb_" .. growl_type .. "_" .. tostring(math.random(1, 8)))
|
|
end
|
|
|
|
function play_mutant_growls()
|
|
-- Skip if there are no mutants
|
|
if is_empty(tbl_mutants) then
|
|
return
|
|
end
|
|
|
|
-- Get a random mutant
|
|
local rand_mutant = get_random_elem(tbl_mutants)
|
|
|
|
-- Little safety check because get_enemy still throws errors for some reason
|
|
if (not IsMonster(rand_mutant)) or (not rand_mutant:alive()) then
|
|
return
|
|
end
|
|
|
|
-- Skip if mutant isn't aggroed
|
|
if not rand_mutant:get_enemy() then
|
|
return
|
|
end
|
|
|
|
-- Determine the growl sound
|
|
growl_sound = get_growl_sound(rand_mutant)
|
|
if not growl_sound then
|
|
return
|
|
end
|
|
|
|
-- Stop if sound is already playing
|
|
if growl_sound:playing() then
|
|
growl_sound:stop()
|
|
end
|
|
|
|
-- Play growl sound
|
|
growl_sound:play_at_pos(rand_mutant, rand_mutant:position(), 0, sound_object.s3d)
|
|
end
|
|
|
|
function is_valid_mutant(obj)
|
|
return (obj) and ((string.find(obj:section(), "chimera")) or (string.find(obj:section(), "lurker")))
|
|
end
|
|
|
|
function monster_on_net_spawn(obj, se_obj)
|
|
if is_valid_mutant(obj) then
|
|
tbl_mutants[obj:id()] = obj
|
|
end
|
|
end
|
|
|
|
function monster_on_net_destroy(obj)
|
|
if is_valid_mutant(obj) then
|
|
tbl_mutants[obj:id()] = nil
|
|
end
|
|
end
|
|
|
|
function monster_on_death_callback(obj, who)
|
|
if is_valid_mutant(obj) then
|
|
tbl_mutants[obj:id()] = nil
|
|
end
|
|
end
|
|
|
|
function actor_on_first_update()
|
|
CreateTimeEvent("tbs_angry_chimera_growls", "growl", 0, function()
|
|
play_mutant_growls()
|
|
ResetTimeEvent("tbs_angry_chimera_growls", "growl", math.random(MIN_GROWL_TIMEOUT, MAX_GROWL_TIMEOUT) / 1000)
|
|
return false
|
|
end)
|
|
end
|
|
|
|
function on_game_start()
|
|
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
|
|
RegisterScriptCallback("monster_on_net_spawn", monster_on_net_spawn)
|
|
RegisterScriptCallback("monster_on_net_destroy", monster_on_net_destroy)
|
|
RegisterScriptCallback("monster_on_death_callback", monster_on_death_callback)
|
|
end
|