Files
The-Only-Cure/media/lua/client/JCIO_CommonFunctions.lua
2023-03-04 00:35:21 +01:00

291 lines
7.9 KiB
Lua

------------------------------------------
-------------- THE ONLY CURE -------------
------------------------------------------
------------ COMMON FUNCTIONS ------------
if TOC_Common == nil then
TOC_Common = {}
end
TOC_Common.partNames = {}
TOC_Common.GeneratePartNames = function()
local partNamesTable = {}
for _, side in ipairs(TOC.sideNames) do
for _, limb in ipairs(TOC.limbNames) do
local tempPartName = side .. "_" .. limb
table.insert(partNamesTable, tempPartName)
end
end
TOC_Common.partNames = partNamesTable
end
TOC_Common.GetPartNames = function()
if TOC_Common.partNames[1] == nil then
TOC_Common.GeneratePartNames()
end
return TOC_Common.partNames
end
TOC_Common.GetSideFromPartName = function(partName)
if string.find(partName, "Left") then
return "Left"
else
return "Right"
end
end
---------------------------------
TOC_Common.GetAcceptableBodyPartTypes = function()
-- TODO Add Foot_L and Foot_R
return {
BodyPartType.Hand_R, BodyPartType.ForeArm_R, BodyPartType.UpperArm_R,
BodyPartType.Hand_L, BodyPartType.ForeArm_L, BodyPartType.UpperArm_L
}
end
TOC_Common.GetOtherBodyPartTypes = function()
return {
BodyPartType.Torso_Upper, BodyPartType.Torso_Lower, BodyPartType.Head,
BodyPartType.Neck, BodyPartType.Groin, BodyPartType.UpperLeg_L,
BodyPartType.UpperLeg_R, BodyPartType.LowerLeg_L,
BodyPartType.LowerLeg_R, BodyPartType.Foot_L, BodyPartType.Foot_R,
BodyPartType.Back
}
end
function GetProsthesisList()
-- TODO Not gonna work anymore
return {"WoodenHook", "MetalHook", "MetalHand"}
end
TOC_Common.FindAmputatedClothingName = function(partName)
return "TOC.Amputation_" .. partName
end
TOC_Common.GetPartNameFromBodyPartType = function(bodyPartType)
if bodyPartType == BodyPartType.Hand_R then
return "Right_Hand"
elseif bodyPartType == BodyPartType.ForeArm_R then
return "Right_LowerArm"
elseif bodyPartType == BodyPartType.UpperArm_R then
return "Right_UpperArm"
elseif bodyPartType == BodyPartType.Hand_L then
return "Left_Hand"
elseif bodyPartType == BodyPartType.ForeArm_L then
return "Left_LowerArm"
elseif bodyPartType == BodyPartType.UpperArm_L then
return "Left_UpperArm"
else
return nil
end
end
-- 1:1 map of partName to BodyPartType
TOC_Common.GetBodyPartFromPartName = function(partName)
if partName == "Right_Hand" then return BodyPartType.Hand_R end
if partName == "Right_LowerArm" then return BodyPartType.ForeArm_R end
if partName == "Right_UpperArm" then return BodyPartType.UpperArm_R end
if partName == "Left_Hand" then return BodyPartType.Hand_L end
if partName == "Left_LowerArm" then return BodyPartType.ForeArm_L end
if partName == "Left_UpperArm" then return BodyPartType.UpperArm_L end
-- New Legs stuff
if partName == "Right_Foot" then return BodyPartType.Foot_R end
if partName == "Left_Foot" then return BodyPartType.Foot_L end
end
-- Custom mapping to make more sense when cutting a limb
TOC_Common.GetAdjacentBodyPartFromPartName = function(partName)
if partName == "Right_Hand" then return BodyPartType.ForeArm_R end
if partName == "Right_LowerArm" then return BodyPartType.UpperArm_R end
if partName == "Right_UpperArm" then return BodyPartType.Torso_Upper end
if partName == "Left_Hand" then return BodyPartType.ForeArm_L end
if partName == "Left_LowerArm" then return BodyPartType.UpperArm_L end
if partName == "Left_UpperArm" then return BodyPartType.Torso_Upper end
if partName == "Right_Foot" then return BodyPartType.LowerLeg_R end
if partName == "Left_Foot" then return BodyPartType.LowerLeg_L end
end
function TocFindCorrectClothingProsthesis(itemName, partName)
-- TODO This is not gonna work soon, so don't use this
local correctName = "TOC.Prost_" .. partName .. "_" .. itemName
return correctName
end
TOC_Common.GetAmputationItemInInventory = function(player, partName)
local playerInv = player:getInventory()
local amputationItemName = TOC_Common.FindAmputationOrProsthesisName(partName, player, "Amputation")
local amputationItem = playerInv:FindAndReturn(amputationItemName)
return amputationItem
end
TOC_Common.GetSawInInventory = function(surgeon)
local playerInv = surgeon:getInventory()
local item = playerInv:getItemFromType("Saw") or playerInv:getItemFromType("GardenSaw") or
playerInv:getItemFromType("Chainsaw")
return item
end
-----------------------------------
-- Online Handling checks
-----------------------------------------
-- MP HANDLING CHECKS
TOC_Common.CheckIfCanBeCut = function(partName, limbsData)
if limbsData == nil then
limbsData = getPlayer():getModData().TOC.limbs
end
local check = (not limbsData[partName].isCut) and
(not TOC_Common.CheckIfProsthesisAlreadyInstalled(limbsData, partName))
return check
end
TOC_Common.CheckIfCanBeOperated = function(partName, limbsData)
if limbsData == nil then
limbsData = getPlayer():getModData().TOC.limbs
end
return limbsData[partName].isOperated == false and limbsData[partName].isAmputationShown
end
TOC_Common.CheckIfProsthesisCanBeEquipped = function(partName)
local limbs_data = getPlayer():getModData().TOC.limbs
return limbs_data[partName].isCauterized or limbs_data[partName].isCicatrized
-- check if prosthesis is in the surgeon inventory... we need to get it before
end
TOC_Common.CheckIfProsthesisCanBeUnequipped = function(partName)
-- TODO we should get item here to be sure that we can do this action instead of relying on some later checks
return true
end
-----------------------------------------
-- Various checks
-----------------------------------------
TOC_Common.CheckIfItemIsAmputatedLimb = function(item)
local itemFullType = item:getFullType()
local check
if string.find(itemFullType, "TOC.Amputation_") then
check = true
else
check = false
end
return check
end
function CheckIfItemIsProsthesis(item)
local itemFullType = item:getFullType()
-- TODO This isn't gonna work anymore! Modular prosthetics needs to be handled in a different way
local prosthesisList = GetProsthesisList()
for _, v in pairs(prosthesisList) do
if v == itemFullType then
return true
end
end
return false
end
TOC_Common.CheckIfItemIsInstalledProsthesis = function(item)
local itemFullType = item:getFullType()
if string.find(itemFullType, "TOC.Prost_") then
return true
else
return false
end
end
TOC_Common.CheckIfProsthesisAlreadyInstalled = function(limbsData, partName)
for _, side in pairs(TOC.sideNames) do
if string.find(partName, side) then
return (limbsData[side .. "_Hand"].isProsthesisEquipped or limbsData[side .. "_LowerArm"].isProsthesisEquipped)
end
end
end
TOC_Common.GetCanBeHeldTable = function(limbs_data)
local canBeHeld = {}
for _, side in pairs(TOC.sideNames) do
canBeHeld[side] = true
if limbs_data[side .. "_Hand"].isCut then
if limbs_data[side .. "_LowerArm"].isCut then
if not limbs_data[side .. "_LowerArm"].isProsthesisEquipped then
canBeHeld[side] = false
end
elseif not limbs_data[side .. "_Hand"].isProsthesisEquipped then
canBeHeld[side] = false
end
end
end
return canBeHeld
end
-------------------------------
TOC_Common.FindItemInWornItems = function(player, checkString)
local wornItems = player:getWornItems()
for i = 1, wornItems:size() - 1 do -- Maybe wornItems:size()-1
local item = wornItems:get(i):getItem()
local itemFullType = item:getFullType()
if string.find(itemFullType, checkString) then
return item
end
end
return nil
end