From 74508a9ed141b194630f1a96fe5c53100c2fac83 Mon Sep 17 00:00:00 2001 From: ZioPao Date: Tue, 21 Nov 2023 02:25:49 +0100 Subject: [PATCH] Readded amputation sound --- .../lua/client/TOC/Handlers/ItemsHandler.lua | 4 +-- .../client/TOC/Handlers/ModDataHandler.lua | 9 ++++--- .../lua/client/TOC/Handlers/PlayerHandler.lua | 3 --- .../client/TOC/Handlers/ProsthesisHandler.lua | 5 ---- media/lua/client/TOC/Main.lua | 4 --- .../client/TOC/TimedActions/CutLimbAction.lua | 24 +++++++++++++++++- media/scripts/TOC_sounds.txt | 13 ++++++++++ media/sound/Cut_sound.ogg | Bin 0 -> 12697 bytes 8 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 media/scripts/TOC_sounds.txt create mode 100644 media/sound/Cut_sound.ogg diff --git a/media/lua/client/TOC/Handlers/ItemsHandler.lua b/media/lua/client/TOC/Handlers/ItemsHandler.lua index b866716..3ad7f3c 100644 --- a/media/lua/client/TOC/Handlers/ItemsHandler.lua +++ b/media/lua/client/TOC/Handlers/ItemsHandler.lua @@ -101,7 +101,7 @@ end ---@class ItemsHandler.Zombie ItemsHandler.Zombie = {} ----comment +---Set an amputation to a zombie ---@param zombie IsoZombie function ItemsHandler.Zombie.SpawnAmputationItem(zombie) -- TODO Set texture ID @@ -124,7 +124,7 @@ function ItemsHandler.Zombie.SpawnAmputationItem(zombie) end - -- TODO COnsider highest amputation + -- TODO Consider highest amputation local usableClothingAmputations = {} for i=1, #StaticData.LIMBS_STR do diff --git a/media/lua/client/TOC/Handlers/ModDataHandler.lua b/media/lua/client/TOC/Handlers/ModDataHandler.lua index a732295..9eb8e31 100644 --- a/media/lua/client/TOC/Handlers/ModDataHandler.lua +++ b/media/lua/client/TOC/Handlers/ModDataHandler.lua @@ -26,8 +26,8 @@ function ModDataHandler:new(username, isResetForced) ModData.request(key) end - o.tocData = ModData.get(key) -- TODO This is working like a placeholder at the moment, it's gonna get replaced later in reapplyTocData - + -- FIXME This is working like a placeholder at the moment, it's gonna get replaced later in reapplyTocData + o.tocData = ModData.get(key) if isResetForced or o.tocData == nil or o.tocData.limbs == nil or o.tocData.limbs.Hand_L == nil or o.tocData.limbs.Hand_L.isCut == nil then TOC_DEBUG.print("tocData in ModDataHandler for " .. username .. " is nil, creating it now") o:setup(key) @@ -290,7 +290,8 @@ function ModDataHandler.ReceiveData(key, table) end TOC_DEBUG.print("receiving data from server") - if key == "TOC_Bob" then return end -- TODO Fix this + -- During startup the game can return Bob as the player username, adding a useless ModData table + if key == "TOC_Bob" then return end TOC_DEBUG.print("receive data for " .. key) if table == {} or table == nil then @@ -300,7 +301,7 @@ function ModDataHandler.ReceiveData(key, table) -- Create ModDataHandler instance if there was none for that user and reapply the correct ModData table as a reference local username = key:sub(5) - ModDataHandler.GetInstance(username):reapplyTocData(key, table) --tocData = table -- TODO Ugly, use a setter + ModDataHandler.GetInstance(username):reapplyTocData(key, table) end Events.OnReceiveGlobalModData.Add(ModDataHandler.ReceiveData) diff --git a/media/lua/client/TOC/Handlers/PlayerHandler.lua b/media/lua/client/TOC/Handlers/PlayerHandler.lua index 14a6a60..46c9382 100644 --- a/media/lua/client/TOC/Handlers/PlayerHandler.lua +++ b/media/lua/client/TOC/Handlers/PlayerHandler.lua @@ -329,9 +329,6 @@ function ISEquipWeaponAction:isValid() local isValid = og_ISEquipWeaponAction_isValid(self) local modDataHandler = ModDataHandler.GetInstance(self.character:getUsername()) if isValid and modDataHandler:getIsAnyLimbCut() then - - -- TODO We need to consider amputating legs, this won't be correct anymore - -- TODO Cache this! local isPrimaryHandValid = not modDataHandler:getIsCut(primaryHand) or modDataHandler:getIsProstEquipped(prostTopR) local isSecondaryHandValid = not modDataHandler:getIsCut(secondaryHand) or modDataHandler:getIsProstEquipped(prostTopL) diff --git a/media/lua/client/TOC/Handlers/ProsthesisHandler.lua b/media/lua/client/TOC/Handlers/ProsthesisHandler.lua index 501fad1..d8c954a 100644 --- a/media/lua/client/TOC/Handlers/ProsthesisHandler.lua +++ b/media/lua/client/TOC/Handlers/ProsthesisHandler.lua @@ -37,11 +37,6 @@ function ProsthesisHandler.GetGroup(item) return group end ----Cache the correct texture for the Health Panel for the currently equipped prosthesis -function ProsthesisHandler.SetHealthPanelTexture() - -- TODO do it -end - ---Check if a prosthesis is equippable. It depends whether the player has a cut limb or not on that specific side. There's an exception for Upper arm, obviously ---@param bodyLocation string ---@return boolean diff --git a/media/lua/client/TOC/Main.lua b/media/lua/client/TOC/Main.lua index 040045d..30a95de 100644 --- a/media/lua/client/TOC/Main.lua +++ b/media/lua/client/TOC/Main.lua @@ -51,10 +51,6 @@ function Main.SetupEvents() end function Main.Initialize() - - - -- TODO In SP we should clean Global Mod Data when a player dies! - ---Looop until we've successfully initialized the mod local function TryToInitialize() local pl = getPlayer() diff --git a/media/lua/client/TOC/TimedActions/CutLimbAction.lua b/media/lua/client/TOC/TimedActions/CutLimbAction.lua index 0cc8a79..0d87126 100644 --- a/media/lua/client/TOC/TimedActions/CutLimbAction.lua +++ b/media/lua/client/TOC/TimedActions/CutLimbAction.lua @@ -39,7 +39,7 @@ function CutLimbAction:new(surgeon, patient, limbName, item, stitchesItem, banda o.stopOnWalk = true o.stopOnRun = true - o.maxTime = 100 + o.maxTime = 1000 - (surgeon:getPerkLevel(Perks.Doctor) * 50) if o.character:isTimedActionInstant() then o.maxTime = 1 end return o @@ -79,6 +79,11 @@ function CutLimbAction:start() self:setActionAnim("SawLog") self:setOverrideHandModels(self.item:getStaticModel()) + -- Setup audio + self.sound = self.character:getEmitter():playSound("Amputation_Sound") + local radius = 5 + addSound(self.character, self.character:getX(), self.character:getY(), self.character:getZ(), radius, radius) + end function CutLimbAction:waitToStart() @@ -93,13 +98,30 @@ function CutLimbAction:update() self.character:setMetabolicTarget(Metabolics.HeavyWork) -- TODO Apply it too on the patient! check if it works online + -- TODO Add sound if self.character ~= self.patient then self.patient:setMetabolicTarget(Metabolics.HeavyWork) end end +function CutLimbAction:stopSound() + if self.sound then + self.character:getEmitter():stopSound(self.sound) + self.sound = nil + end +end + +function CutLimbAction:stop() + self:stopSound() + ISBaseTimedAction.stop(self) +end + function CutLimbAction:perform() + + -- Stop the sound + self:stopSound() + if self.patient == self.character then TOC_DEBUG.print("patient and surgeon are the same, executing on the client") local handler = AmputationHandler:new(self.limbName) diff --git a/media/scripts/TOC_sounds.txt b/media/scripts/TOC_sounds.txt new file mode 100644 index 0000000..48da882 --- /dev/null +++ b/media/scripts/TOC_sounds.txt @@ -0,0 +1,13 @@ +module base { + + sound Amputation_Sound { + category = Player, + loop = true, + is3D = true, + clip { + file = media/sound/Cut_sound.ogg, + distanceMax = 3, + volume = 1.0, + } + } +} \ No newline at end of file diff --git a/media/sound/Cut_sound.ogg b/media/sound/Cut_sound.ogg new file mode 100644 index 0000000000000000000000000000000000000000..59ce2ff685be57442d3d6ea51bd472fe9fcdb644 GIT binary patch literal 12697 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 A#sB~S literal 0 HcmV?d00001