Files
The-Only-Cure/media/lua/client/TOC_GlobalFunctions.lua
2023-01-12 21:25:13 +01:00

199 lines
6.5 KiB
Lua

-- TODO OLD TO DELETE
local function CheckIfStillInfected(toc_data)
for k,v in pairs(GetBodyParts()) do
if toc_data[v].is_infected == true then
getPlayer().Say("I'm still infected...")
return true
end
end
return false
end
-- TODO OLD TO DELETE
local function CureInfection(bodyDamage)
bodyDamage:setInfected(false);
bodyDamage:setInfectionMortalityDuration(-1);
bodyDamage:setInfectionTime(-1);
bodyDamage:setInfectionLevel(0);
local bodyParts = bodyDamage:getBodyParts();
for i=bodyParts:size()-1, 0, -1 do
local bodyPart = bodyParts:get(i);
bodyPart:SetInfected(false);
end
end
-- TODO change it to CutLimb or CutBodyPart
function CutArm(partName, surgeonFact, useBandage, bandageAlcool, usePainkiller, painkillerCount)
local player = getPlayer();
local toc_data = player:getModData().TOC;
local bodyPart = player:getBodyDamage():getBodyPart(TOC_getBodyPart(partName)); -- why the fuck do we we need this
--Set damage of body part & stress & endurance
local stats = player:getStats();
bodyPart:AddDamage(100 - surgeonFact);
bodyPart:setAdditionalPain(100 - surgeonFact);
bodyPart:setBleeding(true);
bodyPart:setBleedingTime(100 - surgeonFact);
bodyPart:setDeepWounded(true)
bodyPart:setDeepWoundTime(100 - surgeonFact);
stats:setEndurance(0 + surgeonFact);
stats:setStress(100 - surgeonFact);
-- Bandage
--if useBandage and bandageAlcool then
-- bodyPart:setBandaged(true, 10, true, bandage:getType());
--elseif useBandage and not bandageAlcool then
-- bodyPart:setBandaged(true, 10, false, bandage:getType());
--end
-- Painkiller
--if usePainkiller then
-- for _ = 1,painkillerCount+1 do
-- player:getBodyDamage():JustTookPill(painkiller);
-- end
-- if painkillerCount < 10 then addSound(player, player:getX(), player:getY(), player:getZ(), 50-painkillerCount*5, 50-painkillerCount*5) end
--else
-- addSound(player, player:getX(), player:getY(), player:getZ(), 50, 50)
--end
-- Change modData
local current_bodypart = bodyPart:getType()
local body_damage = player:getBodyDamage()
for k,v in pairs(GetBodyParts()) do
if v == partName then
toc_data[v].is_cut = true
toc_data[v].is_amputation_shown = true
toc_data[v].cicatrization_time = toc_data[v].cicatrization_base_time - surgeonFact * 50
-- Heal the infection here
if toc_data[v].is_infected and body_damage.getInfectionLevel() < 20 then
toc_data[v].is_infected = false
current_bodypart:SetBitten(false)
-- Second check, let's see if there is any other infected limb.
if CheckIfStillInfected(toc_data) == false then
CureInfection(body_damage)
end
end
for depended_k, depended_v in pairs(toc_data[v].depends_on) do
toc_data[depended_v].is_cut = true
toc_data[depended_v].is_amputation_shown = true
toc_data[depended_v].cicatrization_time = toc_data[v].cicatrization_base_time - surgeonFact * 50
end
end
end
--Equip cloth
local cloth = player:getInventory():AddItem(find_clothName2_TOC(partName));
player:setWornItem(cloth:getBodyLocation(), cloth);
player:transmitModData();
end
function OperateArm(partName, surgeonFact, useOven)
local player = getPlayer();
local toc_data = player:getModData().TOC;
if useOven then
local stats = player:getStats();
stats:setEndurance(0);
stats:setStress(100);
end
if toc_data[partName].is_operated == false then
toc_data[partName].is_operated = true
toc_data[partName].cicatrization_time = toc_data[partName].cicatrization_time - (surgeonFact * 200)
if useOven then toc_data[partName].is_cauterized = true end
for depended_k, depended_v in pairs(toc_data[partName].depends_on) do
toc_data[depended_v].is_operated = true
toc_data[depended_v].cicatrization_time = toc_data[depended_v].cicatrization_time - (surgeonFact * 200)
if useOven then toc_data[depended_v].is_cauterized = true end
end
end
SetBodyPartsStatus(player, partName, useOven)
player:transmitModData();
end
function SetBodyPartsStatus(player, partName, useOven)
-- TODO use GetBodyParts with depends_on
local a_rightArm = {"RightArm", "RightForearm", "RightHand"}
local a_rightForearm = {"RightForearm", "RightHand"}
local a_rightHand = {"RightHand"}
local a_leftArm = {"LeftArm", "LeftForearm", "LeftHand"}
local a_leftForearm = {"LeftForearm", "LeftHand"}
local a_leftHand = {"LeftHand"}
local chosen_array = {}
if partName == "RightArm" then
chosen_array = a_rightArm
elseif partName == "RightForearm" then
chosen_array = a_rightForearm
elseif partName == "RightHand" then
chosen_array = a_rightHand
elseif partName == "LeftArm" then
chosen_array = a_leftArm
elseif partName == "LeftForearm" then
chosen_array = a_leftForearm
elseif partName == "LeftHand" then
chosen_array = a_leftHand
end
for k,v in pairs(chosen_array) do
local tmpBodyPart = player:getBodyDamage():getBodyPart(TheOnlyCure.GetBodyPartTypeFromBodyPart(v))
tmpBodyPart:setDeepWounded(false); -- Basically like stictching
tmpBodyPart:setDeepWoundTime(0);
if useOven then
tmpBodyPart:AddDamage(100)
tmpBodyPart:setAdditionalPain(100);
tmpBodyPart:setBleeding(false)
tmpBodyPart:setBleedingTime(0) -- no bleeding since it's been cauterized
else
tmpBodyPart:setBleeding(true);
tmpBodyPart:setBleedingTime(ZombRand(1, 5)); -- Reset the bleeding, maybe make it random
end
end
end
function GetKitInInventory(surgeon)
local playerInv = surgeon:getInventory();
local item = playerInv:getItemFromType('TOC.Real_surgeon_kit') or playerInv:getItemFromType('TOC.Surgeon_kit') or playerInv:getItemFromType('TOC.Improvised_surgeon_kit')
return item
end
function IsSawInInventory(surgeon)
local playerInv = surgeon:getInventory()
local item = playerInv:getItemFromType('Saw') or playerInv:getItemFromType('GardenSaw') or playerInv:getItemFromType('Chainsaw')
return item
end