diff --git a/media/lua/client/TOC/Controllers/ItemsController.lua b/media/lua/client/TOC/Controllers/ItemsController.lua index d906681..e6df374 100644 --- a/media/lua/client/TOC/Controllers/ItemsController.lua +++ b/media/lua/client/TOC/Controllers/ItemsController.lua @@ -126,7 +126,7 @@ function ItemsController.Zombie.GetAmputationTexturesIndex(zombie) local level = tonumber(x:match("%d$")) - 1 -- it's from 1 to 3, but we're using it like 0 indexed arrays local finalId = 10 + matchedIndex + level - print("Zombie texture index: " .. tostring(finalId)) + --print("Zombie texture index: " .. tostring(finalId)) return finalId end diff --git a/media/lua/client/TOC/UI/Interactions/CutLimbInteractionHandler.lua b/media/lua/client/TOC/UI/Interactions/CutLimbInteractionHandler.lua index 70ac155..d6f9937 100644 --- a/media/lua/client/TOC/UI/Interactions/CutLimbInteractionHandler.lua +++ b/media/lua/client/TOC/UI/Interactions/CutLimbInteractionHandler.lua @@ -143,8 +143,6 @@ local function AddInventoryAmputationMenu(playerNum, context, items) TOC_DEBUG.print("Bandage item: " .. tostring(bandageItem)) AddInvAmputationOptions(player, context, sawItem, stitchesItem, bandageItem) - - -- TODO Add stitches option and mixes end end diff --git a/media/lua/client/TOC/Zombies/ZombiesAmputation.lua b/media/lua/client/TOC/Zombies/ZombiesAmputation.lua index 18f730d..e95c2a9 100644 --- a/media/lua/client/TOC/Zombies/ZombiesAmputation.lua +++ b/media/lua/client/TOC/Zombies/ZombiesAmputation.lua @@ -1,13 +1,149 @@ --- local ItemsController = require("TOC/Controllers/ItemsController") --- local StaticData = require("TOC/StaticData") +local ItemsController = require("TOC/Controllers/ItemsController") +local StaticData = require("TOC/StaticData") +local CommandsData = require("TOC/CommandsData") --- -------------------- --- This is low priority, work on it AFTER everything else is ok +local trackedZombies = { + [412412] = { + "FullTypeTest" + } +} --- I doubt I can get this working, too many limitations --- ------------------- +local function predicate(item) + return (item:getType():contains("Amputation_")) +end + +---@param zombie IsoZombie|IsoGameCharacter|IsoMovingObject|IsoObject +---@return integer trueID +local function GetZombieID(zombie) + local pID = zombie:getPersistentOutfitID() + local bits = string.split(string.reverse(Long.toUnsignedString(pID, 2)), "") + while #bits < 16 do bits[#bits+1] = 0 end + + -- trueID + bits[16] = 0 + local trueID = Long.parseUnsignedLong(string.reverse(table.concat(bits, "")), 2) + + return trueID +end + + + +---@param zombie IsoZombie +---@param fullType string +local function AddZombieAmp(zombie, fullType) + local texId = ItemsController.Zombie.GetAmputationTexturesIndex(zombie) + local zombieVisuals = zombie:getItemVisuals() + local itemVisual = ItemVisual:new() + itemVisual:setItemType(fullType) + itemVisual:setTextureChoice(texId) + zombieVisuals:add(itemVisual) + zombie:resetModelNextFrame() + + local zombieInv = zombie:getInventory() + zombieInv:AddItem(fullType) +end + + + +---@param zombie IsoZombie +function TestZombieThing(zombie) + local zombieInv = zombie:getInventory() + + local foundItem = zombieInv:containsEvalRecurse(predicate) + + if foundItem then + print("Item already in") + return + else + + local clothingItemFullTypes = {} + -- Common function? + for i=1, #StaticData.LIMBS_STR do + local limbName = StaticData.LIMBS_STR[i] + local clothingName = StaticData.AMPUTATION_CLOTHING_ITEM_BASE .. limbName + table.insert(clothingItemFullTypes, clothingName) + end + + local index = ZombRand(1, #clothingItemFullTypes) + local randomFullType = clothingItemFullTypes[index] + + + AddZombieAmp(zombie, randomFullType) + + + -- TODO Add reference and transmit it to server + local pID = GetZombieID(zombie) + local zombieKey = CommandsData.GetZombieKey() + local zombiesMD = ModData.getOrCreate(zombieKey) + zombiesMD[pID] = randomFullType + ModData.add(zombieKey, zombiesMD) + ModData.transmit(zombieKey) + end +end + + + +---@param zombie IsoZombie +---@param character any +---@param bodyPartType any +---@param handWeapon any +local function test(zombie, character, bodyPartType, handWeapon) + TestZombieThing(zombie) +end + + + + + + + + + + + + + + + + +Events.OnHitZombie.Add(test) + + + + + + + + +---@param zombie IsoZombie +local function ReapplyAmputation(zombie) + local zombieKey = CommandsData.GetZombieKey() + local zombiesMD = ModData.getOrCreate(zombieKey) + local pID = GetZombieID(zombie) + + -- TODO Remove already checked zombies + if zombiesMD[pID] ~= nil then + -- check if zombie has amputation + local fullType = zombiesMD[pID] + local zombieInv = zombie:getInventory() + local foundItem = zombieInv:containsEvalRecurse(predicate) + + if foundItem then + return + else + AddZombieAmp(zombie, fullType) + + end + end +end + + + + +Events.OnZombieUpdate.Add(ReapplyAmputation) + -- ---@param zombie IsoZombie @@ -96,4 +232,3 @@ -- end --- Events.OnHitZombie.Add(test) \ No newline at end of file diff --git a/media/lua/shared/TOC/CommandsData.lua b/media/lua/shared/TOC/CommandsData.lua index c440017..f6f7c70 100644 --- a/media/lua/shared/TOC/CommandsData.lua +++ b/media/lua/shared/TOC/CommandsData.lua @@ -35,5 +35,9 @@ function CommandsData.GetKey(username) return StaticData.MOD_NAME .. "_" .. username end +function CommandsData.GetZombieKey() + return StaticData.MOD_NAME .. "_ZOMBIES" +end + return CommandsData