From ff7915abbd004055bbc62b963423eed2b9672e0f Mon Sep 17 00:00:00 2001 From: Pao Date: Mon, 6 Feb 2023 19:40:36 +0100 Subject: [PATCH] Tests with amputating legs --- media/AnimSets/player/idle/Bob_NoLegsIdle.xml | 65 +++++++++++ .../player/movement/Bob_NoLegsMovement.xml | 109 ++++++++++++++++++ .../clothingItems/Amputation_Left_Foot.xml | 12 ++ media/fileGuidTable.xml | 5 + media/lua/client/TOC_Animations.lua | 24 ++++ media/lua/client/TOC_Client.lua | 20 ++++ media/lua/client/TOC_OverridenFunctions.lua | 34 +++--- media/lua/client/TOC_Update.lua | 17 +++ media/lua/server/TOC_MP_server.lua | 8 ++ media/lua/shared/NPCs/ExtraBodyLocations.lua | 3 +- media/scripts/TOC_items.txt | 16 +++ python_helpers/modules_prost.xlsx | Bin 27652 -> 27661 bytes 12 files changed, 299 insertions(+), 14 deletions(-) create mode 100644 media/AnimSets/player/idle/Bob_NoLegsIdle.xml create mode 100644 media/AnimSets/player/movement/Bob_NoLegsMovement.xml create mode 100644 media/clothing/clothingItems/Amputation_Left_Foot.xml create mode 100644 media/lua/client/TOC_Animations.lua diff --git a/media/AnimSets/player/idle/Bob_NoLegsIdle.xml b/media/AnimSets/player/idle/Bob_NoLegsIdle.xml new file mode 100644 index 0000000..dcb318e --- /dev/null +++ b/media/AnimSets/player/idle/Bob_NoLegsIdle.xml @@ -0,0 +1,65 @@ + + + Bob_NoLegsIdle + Zombie_Idle_FloorOnFront + Y + 0.48 + 0.20 + + IsCrawling + BOOL + true + + IdleSpeed + IdleSpeed + + Zombie_Idle_FloorOnFront + 0.00 + 0.00 + 0.80 + + + Zombie_Idle_FloorOnFront + 0.00 + 1.00 + 0.80 + + + Zombie_Idle_FloorOnFront + 0.00 + 0.04 + 0.80 + + + 1 + 2 + 3 + + + aim_default + Zombie_Idle_FloorOnFront + 0.5 + 1.5 + + + defaultWalk + 0.3 + 0.3 + + isTurningAround + BOOL + false + + + + defaultRun + Zombie_Idle_FloorOnFront + 0.1 + 0.1 + + isTurningAround + BOOL + false + + + \ No newline at end of file diff --git a/media/AnimSets/player/movement/Bob_NoLegsMovement.xml b/media/AnimSets/player/movement/Bob_NoLegsMovement.xml new file mode 100644 index 0000000..3989830 --- /dev/null +++ b/media/AnimSets/player/movement/Bob_NoLegsMovement.xml @@ -0,0 +1,109 @@ + + + defaultWalk + Zombie_Crawl + Translation_Data + Y + 1.04 + 0.20 + + IsCrawling + BOOL + true + + + WalkInjury + WalkSpeed + + Zombie_Crawl + 0.50 + 1.00 + 0.80 + + + Zombie_Crawl + -0.50 + 1.00 + 0.80 + + + Zombie_Crawl + 1.00 + 1.00 + 0.80 + + + Zombie_Crawl + -1.00 + 1.00 + 0.80 + + + Zombie_Crawl + 0.00 + 1.00 + 0.80 + + + Zombie_Crawl + 0.00 + 0.00 + 0.80 + + + 2 + 4 + 6 + + + 5 + 2 + 6 + + + 6 + 1 + 5 + + + 6 + 3 + 1 + + + Bob_NoLegsIdle + 0.3 + 1 + + + Bob_NoLegsIdle + Zombie_Crawl + 0.3 + 0.3 + + DeltaY + GTR + -0.5 + + + isMoving + BOOL + false + + + + Bob_NoLegsIdle + 0.1 + + + + Footstep + 0.15 + walk + + + Footstep + 0.6 + walk + + \ No newline at end of file diff --git a/media/clothing/clothingItems/Amputation_Left_Foot.xml b/media/clothing/clothingItems/Amputation_Left_Foot.xml new file mode 100644 index 0000000..a91081e --- /dev/null +++ b/media/clothing/clothingItems/Amputation_Left_Foot.xml @@ -0,0 +1,12 @@ + + + Amputation_Left_Hand_Male + Amputation_Left_Hand_Female + 45c0b872-bdf1-466f-b810-c7783171bda1 + false + false + false + 8 + none + + \ No newline at end of file diff --git a/media/fileGuidTable.xml b/media/fileGuidTable.xml index 107fff3..b91d9b6 100644 --- a/media/fileGuidTable.xml +++ b/media/fileGuidTable.xml @@ -76,4 +76,9 @@ media/clothing/clothingItems/Prost_Left_LowerArm_MetalHand.xml 0405a4c0-f71b-45a8-9edc-489fc81dca39 + + + media/clothing/clothingItems/Amputation_Left_Foot.xml + 45c0b872-bdf1-466f-b810-c7783171bda1 + \ No newline at end of file diff --git a/media/lua/client/TOC_Animations.lua b/media/lua/client/TOC_Animations.lua new file mode 100644 index 0000000..4d2d787 --- /dev/null +++ b/media/lua/client/TOC_Animations.lua @@ -0,0 +1,24 @@ +-- Thanks to Glytcher and Matías N. Salas for helping out with this + + + + + +function SetMissingFootAnimation(check) + + + local player = getPlayer() + + if check then + player:setVariable("IsCrawling", "true") + else + player:setVariable("IsCrawling", "false") + end + + -- if isClient() then + -- sendClientCommand("TOC", "SetCrawlAnimation", {}) + -- end + +end + + diff --git a/media/lua/client/TOC_Client.lua b/media/lua/client/TOC_Client.lua index 7a862ec..2e90144 100644 --- a/media/lua/client/TOC_Client.lua +++ b/media/lua/client/TOC_Client.lua @@ -208,6 +208,26 @@ end +-- ANIMATIONS +----------------------- +Commands["SetCrawlAnimation"] = function(args) + + local source = getPlayer() + local player = getPlayerByOnlineID(args.id) + + if source ~= player then + if args.hasInjury then + player:setVariable('SetCrawlAnimation', 'true'); + else + player:setVariable('SetCrawlAnimation', 'false'); + end + end + +end + + + + -- Base stuff local function OnTocServerCommand(module, command, args) diff --git a/media/lua/client/TOC_OverridenFunctions.lua b/media/lua/client/TOC_OverridenFunctions.lua index 34b92be..c2e63a7 100644 --- a/media/lua/client/TOC_OverridenFunctions.lua +++ b/media/lua/client/TOC_OverridenFunctions.lua @@ -76,14 +76,18 @@ function ISInventoryPane:onMouseDoubleClick(x, y) local item_to_check = self.items[self.mouseOverOption] local player_inventory = getPlayerInventory(self.player).inventory - if instanceof(item_to_check, "InventoryItem") then - og_ISInventoryPaneOnMouseDoubleClick(self, x, y) - elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then - --print("TOC: Can't double click this item") - else - og_ISInventoryPaneOnMouseDoubleClick(self, x, y) +----------------------------------------------------------------------------------- + -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT +----------------------------------------------------------------------------------- - end + -- if instanceof(item_to_check, "InventoryItem") then + -- og_ISInventoryPaneOnMouseDoubleClick(self, x, y) + -- elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then + -- --print("TOC: Can't double click this item") + -- else + + -- end + og_ISInventoryPaneOnMouseDoubleClick(self, x, y) @@ -96,13 +100,17 @@ function ISInventoryPane.getActualItems(items) local ret = og_ISInventoryPaneGetActualItems(items) -- This is gonna be slower than just overriding the function but hey it's more compatible +----------------------------------------------------------------------------------- + -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT +----------------------------------------------------------------------------------- - for i = 1, #ret do - local item_full_type = ret[i]:getFullType() - if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then - table.remove(ret, i) - end - end + + -- for i = 1, #ret do + -- local item_full_type = ret[i]:getFullType() + -- if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then + -- table.remove(ret, i) + -- end + -- end return ret end diff --git a/media/lua/client/TOC_Update.lua b/media/lua/client/TOC_Update.lua index 2b9cce7..3b6cce5 100644 --- a/media/lua/client/TOC_Update.lua +++ b/media/lua/client/TOC_Update.lua @@ -176,12 +176,29 @@ end -- MAIN UPDATE FUNCTIONS +local testOnAnimEvent = IsoGameCharacter.OnAnimEvent + +function IsoGameCharacter.OnAnimEvent(animLayer, animEvent) + print("ENTERING ON ANIM EVENT!!!") +end + + + local function TocUpdateOnTick() local player = getPlayer() if player == nil then return end + + + + + + + + + local toc_data = player:getModData().TOC if toc_data ~= nil then CheckIfPlayerIsInfected(player, toc_data) diff --git a/media/lua/server/TOC_MP_server.lua b/media/lua/server/TOC_MP_server.lua index a0587df..d699978 100644 --- a/media/lua/server/TOC_MP_server.lua +++ b/media/lua/server/TOC_MP_server.lua @@ -24,6 +24,14 @@ TOC_Commands["AskDamageOtherPlayer"] = function(_, arg) end +-------- ANIMATIONS +TOC_Commands["SetCrawlAnimation"] = function(player, args) + + local player_id = player:getOnlineID() + + sendServerCommand(player, "TOC", "SetCrawlAnimation", {}) + +end diff --git a/media/lua/shared/NPCs/ExtraBodyLocations.lua b/media/lua/shared/NPCs/ExtraBodyLocations.lua index 828e213..caee784 100644 --- a/media/lua/shared/NPCs/ExtraBodyLocations.lua +++ b/media/lua/shared/NPCs/ExtraBodyLocations.lua @@ -18,7 +18,7 @@ local function addBodyLocationBefore(newLocation, movetoLocation) - list:remove(list:size()-1) + list:remove(newItem) local i = group:indexOf(movetoLocation) list:add(i, newItem) end @@ -70,6 +70,7 @@ local group = BodyLocations.getGroup("Human") addBodyLocationBefore("TOC_ArmRight", "Shoes") addBodyLocationBefore("TOC_ArmLeft", "Shoes") +addBodyLocationBefore("TOC_LegLeft", "Shoes") addBodyLocationBefore("TOC_ArmRightProsthesis", "Shoes") addBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes") diff --git a/media/scripts/TOC_items.txt b/media/scripts/TOC_items.txt index f06ba7b..5c13ecd 100644 --- a/media/scripts/TOC_items.txt +++ b/media/scripts/TOC_items.txt @@ -440,4 +440,20 @@ item ProthesisMag3 ReplaceOnUse = ProthesisMag3, Tooltip = Tooltip_ProthesisMag2, } + +item Amputation_Left_Foot + { + Weight = 1, + Type = Clothing, + DisplayCategory = Test, + DisplayName = amp test foot, + ClothingItem = Amputation_Left_Foot, + BodyLocation = TOC_LegLeft, + BloodLocation = Hands, + Icon = woodenHook, + Tooltip = test, + CanHaveHoles = false, + } + + } \ No newline at end of file diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx index ae55b868f1f3113b23107043852639aa6bc8255f..27265b1f0f9ec555ce4c988ac6528f85783ebeec 100644 GIT binary patch delta 8882 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

&XA=L$%jKgqn`;GYIq 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 VjvNDga(IGe`|!_{B&$D|{{c15DhU7p delta 9073 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