Merge branch 'global-mod-data'

This commit is contained in:
Pao
2023-01-23 01:53:57 +01:00
14 changed files with 245 additions and 188 deletions

View File

@@ -42,6 +42,7 @@
"ISInventoryPaneContextMenu", "ISInventoryPaneContextMenu",
"ISDropItemAction", "ISDropItemAction",
"BloodBodyPartType", "BloodBodyPartType",
"ISInventoryPane" "ISInventoryPane",
"ModData"
] ]
} }

View File

@@ -6,21 +6,27 @@ end
----------------------------------------- -----------------------------------------
-- MP HANDLING CHECKS -- MP HANDLING CHECKS
function CheckIfCanBeCut(part_name) function CheckIfCanBeCut(part_name, limbs_data)
local toc_data = getPlayer():getModData().TOC if limbs_data == nil then
local check = (not toc_data.Limbs[part_name].is_cut) and limbs_data = getPlayer():getModData().TOC.Limbs
(not CheckIfProsthesisAlreadyInstalled(toc_data.Limbs, part_name))
end
local check = (not limbs_data[part_name].is_cut) and
(not CheckIfProsthesisAlreadyInstalled(limbs_data, part_name))
return check return check
end end
function CheckIfCanBeOperated(part_name) function CheckIfCanBeOperated(part_name, limbs_data)
local part_data = getPlayer():getModData().TOC.Limbs if limbs_data == nil then
limbs_data = getPlayer():getModData().TOC.Limbs
end
return part_data[part_name].is_operated == false and part_data[part_name].is_amputation_shown
return limbs_data[part_name].is_operated == false and limbs_data[part_name].is_amputation_shown
end end
@@ -48,17 +54,17 @@ end
function CheckIfProsthesisAlreadyInstalled(part_data, part_name) function CheckIfProsthesisAlreadyInstalled(limbs_data, part_name)
local r = "Right" local r = "Right"
local l = "Left" local l = "Left"
if string.find(part_name, r) then if string.find(part_name, r) then
return (part_data[r .. "_Hand"].is_prosthesis_equipped or part_data[r .. "_LowerArm"].is_prosthesis_equipped) return (limbs_data[r .. "_Hand"].is_prosthesis_equipped or limbs_data[r .. "_LowerArm"].is_prosthesis_equipped)
elseif string.find(part_name, l) then elseif string.find(part_name, l) then
return (part_data[l .. "_Hand"].is_prosthesis_equipped or part_data[l .. "_LowerArm"].is_prosthesis_equipped) return (limbs_data[l .. "_Hand"].is_prosthesis_equipped or limbs_data[l .. "_LowerArm"].is_prosthesis_equipped)
end end

View File

@@ -229,3 +229,30 @@ local function OnTocServerCommand(module, command, args)
end end
Events.OnServerCommand.Add(OnTocServerCommand) Events.OnServerCommand.Add(OnTocServerCommand)
---------------------------------- TEST -----------------------------
function TOC_OnReceiveGlobalModData(key, modData)
if modData then
ModData.remove(key)
ModData.add(key, modData)
end
end
Events.OnReceiveGlobalModData.Add(TOC_OnReceiveGlobalModData)
function TOC_OnConnected()
ModData.request("TOC_PLAYER_DATA")
end
Events.OnConnected.Add(TOC_OnConnected)

View File

@@ -102,7 +102,4 @@ function TocMapOldDataToNew(mod_data)
end end
getPlayer():transmitModData()
end end

View File

@@ -101,14 +101,6 @@ TocContextMenus.CreateOperateWithOvenMenu = function(player, context, worldObjec
end end
TocContextMenus.DoCut = function(_, patient, surgeon, part_name)
if TocGetSawInInventory(surgeon) then
ISTimedActionQueue.add(ISCutLimb:new(patient, surgeon, part_name));
else
surgeon:Say("I don't have a saw on me")
end
end
@@ -124,39 +116,38 @@ end
TocContextMenus.FillCutAndOperateMenus = function(local_player, clicked_player, world_objects, cut_menu, operate_menu) TocContextMenus.FillCutAndOperateMenus = function(local_player, clicked_player, world_objects, cut_menu, operate_menu)
local local_part_data = local_player:getModData().TOC.Limbs
for _, v in ipairs(GetBodyParts()) do for _, v in ipairs(GetBodyParts()) do
if local_player == clicked_player then -- Local player if local_player == clicked_player then -- Local player
if CheckIfCanBeCut(v) then if CheckIfCanBeCut(v) and TocGetSawInInventory(local_player) ~= nil then
cut_menu:addOption(getText('UI_ContextMenu_' .. v), _, TryTocAction, v, "Cut", local_player, local_player) cut_menu:addOption(getText('UI_ContextMenu_' .. v), _, TryTocAction, v, "Cut", local_player, local_player)
elseif CheckIfCanBeOperated(v) then elseif CheckIfCanBeOperated(v) and TocGetKitInInventory(local_player) ~= nil then
operate_menu:addOption(getText('UI_ContextMenu_' .. v), _, TryTocAction, v, "Operate", local_player, operate_menu:addOption(getText('UI_ContextMenu_' .. v), _, TryTocAction, v, "Operate", local_player,
local_player) local_player)
end end
else -- Another player else -- Another player
-- TODO add way to prevent cutting already cut parts of another player -- TODO add way to prevent cutting already cut parts of another player
cut_menu:addOption(getText('UI_ContextMenu_' .. v), world_objects, TryTocAction, v, "Cut", local_player,
clicked_player)
operate_menu:addOption(getText('UI_ContextMenu_' .. v), world_objects, TryTocAction, v, "Operate",
local_player, clicked_player)
if ModData.get("TOC_PLAYER_DATA")[clicked_player:getUsername()] ~= nil then
local anotherPlayerData = ModData.get("TOC_PLAYER_DATA")[clicked_player:getUsername()]
if CheckIfCanBeCut(v, anotherPlayerData[1]) and TocGetSawInInventory(local_player) then
cut_menu:addOption(getText('UI_ContextMenu_' .. v), world_objects, TryTocAction, v, "Cut", local_player,
clicked_player)
elseif CheckIfCanBeOperated(v, anotherPlayerData[1]) and TocGetKitInInventory(local_player) ~= nil then
operate_menu:addOption(getText('UI_ContextMenu_' .. v), world_objects, TryTocAction, v, "Operate",
local_player, clicked_player)
end
end
end end
end end
end end
TocContextMenus.CreateCheatMenu = function(context, root_menu, local_player, clicked_player) TocContextMenus.CreateCheatMenu = function(context, root_menu, local_player, clicked_player)
if local_player:getAccessLevel() == "Admin" then if local_player:getAccessLevel() == "Admin" or isDebugEnabled() then
local cheat_menu = TocContextMenus.CreateNewMenu("Cheat", context, root_menu) local cheat_menu = TocContextMenus.CreateNewMenu("Cheat", context, root_menu)

View File

@@ -1,23 +1,37 @@
function TocResetEverything() function TocResetEverything()
-- This has to be run on the local player to be sure that we're correctly reassigning everything
local player = getPlayer() local player = getPlayer()
local player_inventory = player:getInventory()
local mod_data = player:getModData() local mod_data = player:getModData()
mod_data.TOC = nil mod_data.TOC = nil
TheOnlyCure.InitTheOnlyCure(_, player) TheOnlyCure.InitTheOnlyCure(_, player)
-- Destroy the amputation model -- Destroy the amputation or prosthesis item
for _, v in ipairs(GetBodyParts()) do for _, v in ipairs(GetBodyParts()) do
local cloth = player:getInventory():FindAndReturn(TocFindAmputatedClothingFromPartName(v)) --local amputated_clothing = player:getInventory():FindAndReturn(TocFindAmputatedClothingFromPartName(v))
-- TODO make it better
local amputation_item_name = TocFindAmputationOrProsthesisName(v, player, "Amputation")
local prosthesis_item_name = TocFindAmputationOrProsthesisName(v, player, "Prosthesis")
if cloth ~= nil then if amputation_item_name ~= nil then
print("Resetting " .. cloth:getName()) local amputation_item = player_inventory:FindAndReturn(amputation_item_name)
player:removeWornItem(cloth) if amputation_item ~= nil then
player:getInventory():Remove(cloth) print("Resetting " .. amputation_item:getName())
player:removeWornItem(amputation_item)
player:getInventory():Remove(amputation_item)
end
amputation_item = nil -- reset it
end end
cloth = nil -- reset it if prosthesis_item_name ~= nil then
local prosthesis_item = player_inventory:FindAndReturn(prosthesis_item_name)
if prosthesis_item ~= nil then
print("Resetting " .. prosthesis_item:getName())
player:removeWornItem(prosthesis_item)
player:getInventory():Remove(prosthesis_item)
end
prosthesis_item = nil -- reset it
end
end end
player:transmitModData()
end end

View File

@@ -1,7 +1,6 @@
-- CutLimb -- CutLimb
-- TODO if TheONlyCure. triggers an errors function TocCheckIfStillInfected(limbs_data)
function TocCheckIfStillInfected(part_data) if limbs_data == nil then
if part_data == nil then
return return
end end
-- Check ALL body part types to check if the player is still gonna die -- Check ALL body part types to check if the player is still gonna die
@@ -9,26 +8,26 @@ function TocCheckIfStillInfected(part_data)
for _, v in ipairs(GetBodyParts()) do for _, v in ipairs(GetBodyParts()) do
if part_data[v].is_infected then if limbs_data[v].is_infected then
check = true check = true
end end
end end
if part_data.is_other_bodypart_infected then if limbs_data.is_other_bodypart_infected then
check = true check = true
end end
return check return check
end end
function TocCureInfection(body_damage, part_data, part_name) function TocCureInfection(body_damage, limbs_data, part_name)
local body_part_type = body_damage:getBodyPart(TocGetBodyPartTypeFromPartName(part_name)) local body_part_type = body_damage:getBodyPart(TocGetBodyPartTypeFromPartName(part_name))
-- Check if we can heal the infection -- Check if we can heal the infection
local is_other_bodypart_infected = getPlayer():getModData().TOC.Limbs.is_other_bodypart_infected local is_other_bodypart_infected = getPlayer():getModData().TOC.Limbs.is_other_bodypart_infected
if not is_other_bodypart_infected and not TheOnlyCure.CheckIfOtherLimbsAreInfected(part_data, part_name) then if not is_other_bodypart_infected and not TheOnlyCure.CheckIfOtherLimbsAreInfected(limbs_data, part_name) then
body_damage:setInfected(false) body_damage:setInfected(false)
body_part_type:SetInfected(false) body_part_type:SetInfected(false)
body_damage:setInfectionMortalityDuration(-1) body_damage:setInfectionMortalityDuration(-1)
@@ -91,14 +90,14 @@ function TocGetSawInInventory(surgeon)
end end
-- OperateLimb -- OperateLimb
function SetBodyPartsStatusAfterOperation(player, part_data, part_name, use_oven) function SetBodyPartsStatusAfterOperation(player, limbs_data, part_name, use_oven)
--for _, v in ipairs(GetBodyParts()) do --for _, v in ipairs(GetBodyParts()) do
local body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name)) local body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))
FixSingleBodyPartType(body_part_type, use_oven) FixSingleBodyPartType(body_part_type, use_oven)
for _, v in ipairs(part_data[part_name].depends_on) do for _, v in ipairs(limbs_data[part_name].depends_on) do
local depended_body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(v)) local depended_body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(v))
FixSingleBodyPartType(depended_body_part_type, use_oven) FixSingleBodyPartType(depended_body_part_type, use_oven)
@@ -125,7 +124,7 @@ end
-- Unequip Prosthesis -- Unequip Prosthesis
local function PartNameToBodyLocation(name) local function PartNameToBodyLocationProsthesis(name)
-- This is still correct but naming sucks -- This is still correct but naming sucks
if name == "Right_Hand" then return "ArmRight_Prot" end if name == "Right_Hand" then return "ArmRight_Prot" end
if name == "Right_LowerArm" then return "ArmRight_Prot" end if name == "Right_LowerArm" then return "ArmRight_Prot" end
@@ -135,15 +134,25 @@ local function PartNameToBodyLocation(name)
if name == "Left_UpperArm" then return "ArmLeft_Prot" end if name == "Left_UpperArm" then return "ArmLeft_Prot" end
end end
function TocFindItemInProstBodyLocation(part_name, patient)
-- FIXME this can return even amputated limbs, and we're using it only for prosthetics. This is gonna break sooner or later
local function PartNameToBodyLocationAmputation(name)
-- This is still correct but naming sucks
if name == "Right_Hand" then return "ArmRight" end
if name == "Right_LowerArm" then return "ArmRight" end
if name == "Right_UpperArm" then return "ArmRight" end
if name == "Left_Hand" then return "ArmLeft" end
if name == "Left_LowerArm" then return "ArmLeft" end
if name == "Left_UpperArm" then return "ArmLeft" end
end
function TocFindItemInProstBodyLocation(part_name, patient)
-- Can't be used for online purposes, since we can't get the online inventory of another player -- Can't be used for online purposes, since we can't get the online inventory of another player
local worn_items = patient:getWornItems() local worn_items = patient:getWornItems()
for i = 1, worn_items:size() - 1 do -- Maybe wornItems:size()-1 for i = 1, worn_items:size() - 1 do -- Maybe wornItems:size()-1
local item = worn_items:get(i):getItem() local item = worn_items:get(i):getItem()
if item:getBodyLocation() == PartNameToBodyLocation(part_name) then if item:getBodyLocation() == PartNameToBodyLocationProsthesis(part_name) then
return item return item
end end
end end
@@ -151,6 +160,34 @@ function TocFindItemInProstBodyLocation(part_name, patient)
end end
-- Debug cheat
function TocFindAmputationOrProsthesisName(part_name, player, choice)
local worn_items = player:getWornItems()
for i = 1, worn_items:size() - 1 do
local item = worn_items:get(i):getItem()
if choice == "Amputation" then
if item:getBodyLocation() == PartNameToBodyLocationAmputation(part_name) then
return item:getFullType()
end
elseif choice == "Prosthesis" then
if item:getBodyLocation() == PartNameToBodyLocationProsthesis(part_name) then
return item:getFullType()
end
end
end
end
------------------------------------- -------------------------------------
-- Override helper -- Override helper
@@ -169,37 +206,6 @@ function CheckIfItemIsAmputatedLimb(item)
end end
-- function CheckIfItemIsAmputatedLimb(item)
-- local item_full_type = item:getFullType()
-- local sides = {"Left", "Right"}
-- local limbs_to_check = {"Hand", "LowerArm", "UpperArm"}
-- local is_amputated_limb = false
-- for _, part in ipairs(limbs_to_check) do
-- for _, side in ipairs(sides) do
-- local part_name = side .. "_" .. part
-- local check_name = "TOC.Amputation_" .. part_name
-- print(check_name)
-- if item_full_type == check_name then
-- is_amputated_limb = true
-- break
-- end
-- end
-- end
-- return is_amputated_limb
-- end
function CheckIfItemIsProsthesis(item) function CheckIfItemIsProsthesis(item)
-- TODO find a cleaner way -- TODO find a cleaner way

View File

@@ -1,6 +1,6 @@
function TocCutLocal(_, player, part_name) function TocCutLocal(_, player, part_name)
if TocGetSawInInventory(player) ~= nil then if TocGetSawInInventory(player) ~= nil then
ISTimedActionQueue.add(ISCutLimb:new(player, player, part_name)); ISTimedActionQueue.add(ISCutLimb:new(player, player, part_name))
else else
player:Say("I don't have a saw on me") player:Say("I don't have a saw on me")
end end

View File

@@ -31,10 +31,11 @@ end
------------------------------ ------------------------------
-- UI Visible stuff functions -- UI Visible stuff functions
local function GetImageName(part_name, toc_data) local function GetImageName(part_name, limbs_data)
local part_data = toc_data.Limbs[part_name]
local name = "" local name = ""
local part_data = limbs_data[part_name]
if part_data.is_cut and part_data.is_cicatrized and part_data.is_prosthesis_equipped then -- Cut and equip if part_data.is_cut and part_data.is_cicatrized and part_data.is_prosthesis_equipped then -- Cut and equip
if part_name == "Right_Hand" or part_name == "Left_Hand" then if part_name == "Right_Hand" or part_name == "Left_Hand" then
name = "media/ui/TOC/" .. part_name .. "/Hook.png" name = "media/ui/TOC/" .. part_name .. "/Hook.png"
@@ -59,9 +60,9 @@ local function GetImageName(part_name, toc_data)
end end
-- If foreaerm equip, change hand -- If foreaerm equip, change hand
if part_name == "Right_Hand" and toc_data.Limbs["Right_LowerArm"].is_prosthesis_equipped then if part_name == "Right_Hand" and limbs_data["Right_LowerArm"].is_prosthesis_equipped then
name = "media/ui/TOC/" .. part_name .. "/Hook.png" name = "media/ui/TOC/" .. part_name .. "/Hook.png"
elseif part_name == "Left_Hand" and toc_data.Limbs["Left_LowerArm"].is_prosthesis_equipped then elseif part_name == "Left_Hand" and limbs_data["Left_LowerArm"].is_prosthesis_equipped then
name = "media/ui/TOC/" .. part_name .. "/Hook.png" name = "media/ui/TOC/" .. part_name .. "/Hook.png"
end end
return name return name
@@ -137,7 +138,7 @@ local function OnClickTocMainUI(button, args)
desc_ui:open() desc_ui:open()
desc_ui:setPositionPixel(main_ui:getRight(), main_ui:getY()) desc_ui:setPositionPixel(main_ui:getRight(), main_ui:getY())
SetupTocDescUI(main_ui.surgeon, main_ui.patient, args.toc_data, args.part_name) -- surgeon is generic. SetupTocDescUI(main_ui.surgeon, main_ui.patient, args.limbs_data, args.part_name) -- surgeon is generic.
end end
@@ -351,42 +352,43 @@ end
----------------------------------------- -----------------------------------------
-- Setup stuff with variables and shit -- Setup stuff with variables and shit
function SetupTocMainUI(surgeon, patient, toc_data) function SetupTocMainUI(surgeon, patient, limbs_data)
-- TODO add a ontick to update it regularly -- TODO add a ontick to update it regularly
main_ui.surgeon = surgeon -- we shouldn't need an arg for this main_ui.surgeon = surgeon -- we shouldn't need an arg for this
main_ui.patient = patient main_ui.patient = patient
if toc_data then if limbs_data then
main_ui["b11"]:addArg("toc_data", toc_data) main_ui["b11"]:addArg("limbs_data", limbs_data)
main_ui["b12"]:addArg("toc_data", toc_data) main_ui["b12"]:addArg("limbs_data", limbs_data)
main_ui["b21"]:addArg("toc_data", toc_data) main_ui["b21"]:addArg("limbs_data", limbs_data)
main_ui["b22"]:addArg("toc_data", toc_data) main_ui["b22"]:addArg("limbs_data", limbs_data)
main_ui["b31"]:addArg("toc_data", toc_data) main_ui["b31"]:addArg("limbs_data", limbs_data)
main_ui["b32"]:addArg("toc_data", toc_data) main_ui["b32"]:addArg("limbs_data", limbs_data)
main_ui["b11"]:setPath(GetImageName("Right_UpperArm", toc_data)) main_ui["b11"]:setPath(GetImageName("Right_UpperArm", limbs_data))
main_ui["b12"]:setPath(GetImageName("Left_UpperArm", toc_data)) main_ui["b12"]:setPath(GetImageName("Left_UpperArm", limbs_data))
main_ui["b21"]:setPath(GetImageName("Right_LowerArm", toc_data)) main_ui["b21"]:setPath(GetImageName("Right_LowerArm", limbs_data))
main_ui["b22"]:setPath(GetImageName("Left_LowerArm", toc_data)) main_ui["b22"]:setPath(GetImageName("Left_LowerArm", limbs_data))
main_ui["b31"]:setPath(GetImageName("Right_Hand", toc_data)) main_ui["b31"]:setPath(GetImageName("Right_Hand", limbs_data))
main_ui["b32"]:setPath(GetImageName("Left_Hand", toc_data)) main_ui["b32"]:setPath(GetImageName("Left_Hand", limbs_data))
end end
end end
function SetupTocDescUI(surgeon, patient, toc_data, part_name) function SetupTocDescUI(surgeon, patient, limbs_data, part_name)
local part_data = toc_data.Limbs[part_name]
desc_ui["textTitle"]:setText(getText("UI_ContextMenu_" .. part_name)) desc_ui["textTitle"]:setText(getText("UI_ContextMenu_" .. part_name))
desc_ui.part_name = part_name desc_ui.part_name = part_name
desc_ui.surgeon = surgeon desc_ui.surgeon = surgeon
desc_ui.patient = patient desc_ui.patient = patient
local part_data = limbs_data[part_name]
if IsProsthesisInstalled(part_data) then if IsProsthesisInstalled(part_data) then
-- Limb cut with prosthesis -- Limb cut with prosthesis
desc_ui["status"]:setText("Prosthesis equipped") desc_ui["status"]:setText("Prosthesis equipped")
@@ -449,16 +451,16 @@ function SetupTocDescUI(surgeon, patient, toc_data, part_name)
desc_ui["status"]:setText("Nothing here") desc_ui["status"]:setText("Nothing here")
desc_ui["status"]:setColor(1, 1, 1, 1) desc_ui["status"]:setColor(1, 1, 1, 1)
desc_ui["b1"]:setVisible(false) desc_ui["b1"]:setVisible(false)
elseif CheckIfCanBeCut(part_name) then elseif CheckIfCanBeCut(part_name, limbs_data) then
-- Everything else -- Everything else
-- TODO add check for cuts and scratches -- TODO add check for cuts and scratches
desc_ui["status"]:setText("Not cut") desc_ui["status"]:setText("Not cut")
desc_ui["status"]:setColor(1, 1, 1, 1) desc_ui["status"]:setColor(1, 1, 1, 1)
if TocGetSawInInventory(surgeon) and not CheckIfProsthesisAlreadyInstalled(toc_data.Limbs, part_name) then if TocGetSawInInventory(surgeon) and not CheckIfProsthesisAlreadyInstalled(limbs_data, part_name) then
desc_ui["b1"]:setVisible(true) desc_ui["b1"]:setVisible(true)
desc_ui["b1"]:setText("Cut") desc_ui["b1"]:setText("Cut")
desc_ui["b1"]:addArg("option", "Cut") desc_ui["b1"]:addArg("option", "Cut")
elseif TocGetSawInInventory(surgeon) and CheckIfProsthesisAlreadyInstalled(toc_data.Limbs, part_name) then elseif TocGetSawInInventory(surgeon) and CheckIfProsthesisAlreadyInstalled(limbs_data, part_name) then
desc_ui["b1"]:setVisible(true) desc_ui["b1"]:setVisible(true)
desc_ui["b1"]:setText("Remove prosthesis before") desc_ui["b1"]:setText("Remove prosthesis before")
desc_ui["b1"]:addArg("option", "Nothing") desc_ui["b1"]:addArg("option", "Nothing")
@@ -547,20 +549,30 @@ function ISNewHealthPanel.onClick_TOC(button)
if surgeon then if surgeon then
if surgeon == patient then if surgeon == patient then
SetupTocMainUI(surgeon, surgeon, surgeon:getModData().TOC) SetupTocMainUI(surgeon, surgeon, surgeon:getModData().TOC.Limbs)
else else
-- MP stuff, try to get the other player data and display it on the surgeon display -- MP stuff, try to get the other player data and display it on the surgeon display
sendClientCommand(surgeon, "TOC", "GetPlayerData", { surgeon:getOnlineID(), patient:getOnlineID() }) print("TOC: Checking part_data for " .. patient:getUsername())
if ModData.get("TOC_PLAYER_DATA")[patient:getUsername()] ~= nil then
local other_player_part_data = ModData.get("TOC_PLAYER_DATA")[patient:getUsername()]
TocTempTable.TempPatient = patient SetupTocMainUI(surgeon, patient, other_player_part_data[1])
TocTempTable.TempSurgeon = surgeon
end
--sendClientCommand(surgeon, "TOC", "GetPlayerData", { surgeon:getOnlineID(), patient:getOnlineID() })
--TocTempTable.TempPatient = patient
--TocTempTable.TempSurgeon = surgeon
-- Wait for ack -- Wait for ack
Events.OnTick.Add(TocWaitForOnlinePlayerData) --Events.OnTick.Add(TocWaitForOnlinePlayerData)
end end
else else
-- This is when surgeon doesnt exist for some reason. -- This is when surgeon doesnt exist for some reason.
SetupTocMainUI(patient, patient, patient:getModData().TOC) SetupTocMainUI(patient, patient, patient:getModData().TOC.Limbs)
end end
main_ui:toggle() main_ui:toggle()
@@ -587,12 +599,11 @@ end
function ISHealthPanel:createChildren() function ISHealthPanel:createChildren()
ISHealthPanel_createChildren(self) ISHealthPanel_createChildren(self)
self.fitness:setWidth(self.fitness:getWidth() / 1.5) --self.fitness:setWidth(self.fitness:getWidth() / 1.5)
--TODO make it bigger self.TOCButton = ISButton:new(self.fitness:getRight() + 25, self.healthPanel.y, 70, 20, "The Only Cure", self,
self.TOCButton = ISButton:new(self.fitness:getRight(), self.healthPanel.y, 20, 20, "", self,
ISNewHealthPanel.onClick_TOC) ISNewHealthPanel.onClick_TOC)
self.TOCButton:setImage(getTexture("media/ui/TOC/iconForMenu.png")) --self.TOCButton:setImage(getTexture("media/ui/TOC/iconForMenu.png"))
self.TOCButton.anchorTop = false self.TOCButton.anchorTop = false
self.TOCButton.anchorBottom = true self.TOCButton.anchorBottom = true
self.TOCButton:initialise() self.TOCButton:initialise()

View File

@@ -26,7 +26,6 @@ function TheOnlyCure.CheckIfPlayerIsInfected(player, toc_data)
if body_damage:getBodyPart(v):bitten() and part_data ~= nil then if body_damage:getBodyPart(v):bitten() and part_data ~= nil then
if part_data.is_cut == false then if part_data.is_cut == false then
part_data.is_infected = true part_data.is_infected = true
player:transmitModData()
end end
end end
@@ -35,7 +34,6 @@ function TheOnlyCure.CheckIfPlayerIsInfected(player, toc_data)
for _, v in ipairs(GetOtherBodyPartTypes()) do for _, v in ipairs(GetOtherBodyPartTypes()) do
if body_damage:getBodyPart(v):bitten() then if body_damage:getBodyPart(v):bitten() then
toc_data.Limbs.is_other_bodypart_infected = true -- Even one is enough, stop cycling if we find it toc_data.Limbs.is_other_bodypart_infected = true -- Even one is enough, stop cycling if we find it
player:transmitModData()
break break
end end
end end
@@ -55,7 +53,6 @@ function TheOnlyCure.UpdatePlayerHealth(player, part_data)
end end
end end
player:transmitModData()
end end
@@ -128,14 +125,14 @@ function TheOnlyCure.SetHealthStatusForBodyPart(part_data, part_name, player)
end end
--Helper function for UpdatePlayerHealth --Helper function for UpdatePlayerHealth
function TheOnlyCure.CheckIfOtherLimbsAreInfected(part_data, part_name) function TheOnlyCure.CheckIfOtherLimbsAreInfected(limbs_data, part_name)
local body_parts = GetBodyParts() local body_parts = GetBodyParts()
body_parts[part_name] = nil body_parts[part_name] = nil
for _, v in pairs(body_parts) do for _, v in pairs(body_parts) do
if part_data[v].is_infected then if limbs_data[v].is_infected then
return true return true
end end
end end
@@ -159,6 +156,15 @@ function TheOnlyCure.UpdateEveryOneMinute()
TheOnlyCure.UpdatePlayerHealth(player, toc_data.Limbs) TheOnlyCure.UpdatePlayerHealth(player, toc_data.Limbs)
end end
-- Updates toc data in a global way, basically player:transmitModData but it works
-- Sends only Limbs since the other stuff is mostly static
if toc_data ~= nil then
sendClientCommand(player, 'TOC', 'ChangePlayerState', { toc_data.Limbs } )
end
end end
function TheOnlyCure.UpdateEveryTenMinutes() function TheOnlyCure.UpdateEveryTenMinutes()
@@ -183,8 +189,6 @@ function TheOnlyCure.UpdateEveryTenMinutes()
for _, part_name in pairs(GetBodyParts()) do for _, part_name in pairs(GetBodyParts()) do
if part_data[part_name].is_cut and not part_data[part_name].is_cicatrized then if part_data[part_name].is_cut and not part_data[part_name].is_cicatrized then
part_data[part_name].cicatrization_time = part_data[part_name].cicatrization_time - 1 -- TODO Make it more "dynamic" part_data[part_name].cicatrization_time = part_data[part_name].cicatrization_time - 1 -- TODO Make it more "dynamic"
end end
end end

View File

@@ -228,7 +228,7 @@ function TheOnlyCure.CutLimb(part_name, surgeon_factor, bandage_table, painkille
local player = getPlayer() local player = getPlayer()
local toc_data = player:getModData().TOC local toc_data = player:getModData().TOC
local part_data = toc_data.Limbs local limbs_data = toc_data.Limbs
local body_part = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name)) local body_part = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))
local stats = player:getStats() local stats = player:getStats()
@@ -261,21 +261,21 @@ function TheOnlyCure.CutLimb(part_name, surgeon_factor, bandage_table, painkille
-- Use a tourniquet if available -- Use a tourniquet if available
-- TODO add tourniquet -- TODO add tourniquet
if part_data[part_name].is_cut == false then if limbs_data[part_name].is_cut == false then
part_data[part_name].is_cut = true limbs_data[part_name].is_cut = true
part_data[part_name].is_amputation_shown = true limbs_data[part_name].is_amputation_shown = true
part_data[part_name].cicatrization_time = part_data[part_name].cicatrization_base_time - surgeon_factor * 50 limbs_data[part_name].cicatrization_time = limbs_data[part_name].cicatrization_base_time - surgeon_factor * 50
-- Heal the infection here -- Heal the infection here
local body_damage = player:getBodyDamage() local body_damage = player:getBodyDamage()
if part_data[part_name].is_infected and body_damage:getInfectionLevel() < 20 then if limbs_data[part_name].is_infected and body_damage:getInfectionLevel() < 20 then
part_data[part_name].is_infected = false limbs_data[part_name].is_infected = false
body_part:SetBitten(false) body_part:SetBitten(false)
body_part:setBiteTime(0) body_part:setBiteTime(0)
-- Second check, let's see if there is any other infected limb. -- Second check, let's see if there is any other infected limb.
if TocCheckIfStillInfected(part_data) == false then if TocCheckIfStillInfected(limbs_data) == false then
TocCureInfection(body_damage, part_data, part_name) TocCureInfection(body_damage, limbs_data, part_name)
getPlayer():Say("I'm gonna be fine...") getPlayer():Say("I'm gonna be fine...")
else else
getPlayer():Say("I'm still gonna die...") getPlayer():Say("I'm still gonna die...")
@@ -283,14 +283,13 @@ function TheOnlyCure.CutLimb(part_name, surgeon_factor, bandage_table, painkille
end end
-- Cut the depended part -- Cut the depended part
for _, depended_v in pairs(part_data[part_name].depends_on) do for _, depended_v in pairs(limbs_data[part_name].depends_on) do
part_data[depended_v].is_cut = true limbs_data[depended_v].is_cut = true
part_data[depended_v].is_amputation_shown = false limbs_data[depended_v].is_amputation_shown = false
part_data[depended_v].cicatrization_time = part_data[part_name].cicatrization_base_time - surgeon_factor * 50 limbs_data[depended_v].cicatrization_time = limbs_data[part_name].cicatrization_base_time -
surgeon_factor * 50
end end
-- Check for older amputation models and deletes them from player's inventory -- Check for older amputation models and deletes them from player's inventory
local side = string.match(part_name, '(%w+)_') local side = string.match(part_name, '(%w+)_')
TocDeleteOtherAmputatedLimbs(side) TocDeleteOtherAmputatedLimbs(side)
@@ -303,9 +302,6 @@ function TheOnlyCure.CutLimb(part_name, surgeon_factor, bandage_table, painkille
-- Set blood on the amputated limb -- Set blood on the amputated limb
TocSetBloodOnAmputation(getPlayer(), body_part) TocSetBloodOnAmputation(getPlayer(), body_part)
player:transmitModData()
end end
@@ -316,7 +312,7 @@ end
function TheOnlyCure.OperateLimb(part_name, surgeon_factor, use_oven) function TheOnlyCure.OperateLimb(part_name, surgeon_factor, use_oven)
local player = getPlayer() local player = getPlayer()
local part_data = player:getModData().TOC.Limbs local limbs_data = player:getModData().TOC.Limbs
if use_oven then if use_oven then
local stats = player:getStats() local stats = player:getStats()
@@ -324,21 +320,21 @@ function TheOnlyCure.OperateLimb(part_name, surgeon_factor, use_oven)
stats:setStress(100) stats:setStress(100)
end end
if part_data[part_name].is_operated == false and part_data[part_name].is_cut == true then if limbs_data[part_name].is_operated == false and limbs_data[part_name].is_cut == true then
part_data[part_name].is_operated = true limbs_data[part_name].is_operated = true
part_data[part_name].cicatrization_time = part_data[part_name].cicatrization_time - (surgeon_factor * 200) limbs_data[part_name].cicatrization_time = limbs_data[part_name].cicatrization_time - (surgeon_factor * 200)
if use_oven then part_data[part_name].is_cauterized = true end if use_oven then limbs_data[part_name].is_cauterized = true end
for _, depended_v in pairs(part_data[part_name].depends_on) do for _, depended_v in pairs(limbs_data[part_name].depends_on) do
part_data[depended_v].is_operated = true limbs_data[depended_v].is_operated = true
part_data[depended_v].cicatrization_time = part_data[depended_v].cicatrization_time - (surgeon_factor * 200) limbs_data[depended_v].cicatrization_time = limbs_data[depended_v].cicatrization_time -
if use_oven then part_data[depended_v].is_cauterized = true end -- TODO does this make sense? (surgeon_factor * 200)
if use_oven then limbs_data[depended_v].is_cauterized = true end -- TODO does this make sense?
end end
end end
SetBodyPartsStatusAfterOperation(player, part_data, part_name, use_oven) SetBodyPartsStatusAfterOperation(player, limbs_data, part_name, use_oven)
player:transmitModData()
end end
function TheOnlyCure.EquipProsthesis(part_name, prosthesis_base_name) function TheOnlyCure.EquipProsthesis(part_name, prosthesis_base_name)
@@ -382,11 +378,8 @@ function TheOnlyCure.UnequipProsthesis(part_name, equipped_prosthesis)
local prosthesis_name = string.match(equipped_prosthesis_full_type, prost_v) local prosthesis_name = string.match(equipped_prosthesis_full_type, prost_v)
if prosthesis_name then if prosthesis_name then
player:getInventory():AddItem("TOC." .. prosthesis_name) player:getInventory():AddItem("TOC." .. prosthesis_name)
player:setWornItem(equipped_prosthesis:getBodyLocation(), nil) player:setWornItem(equipped_prosthesis:getBodyLocation(), nil)
player:getInventory():Remove(equipped_prosthesis) player:getInventory():Remove(equipped_prosthesis)
player:transmitModData()
end end
end end
@@ -411,18 +404,17 @@ function TryTocAction(_, part_name, action, surgeon, patient)
TocUnequipProsthesisLocal(_, surgeon, part_name) TocUnequipProsthesisLocal(_, surgeon, part_name)
end end
else else
local ui = GetConfirmUIMP() local ui = GetConfirmUIMP()
if not ui then if not ui then
CreateTocConfirmUIMP() CreateTocConfirmUIMP()
ui = GetConfirmUIMP() ui = GetConfirmUIMP()
end end
if patient == nil then if patient == nil then
patient = surgeon patient = surgeon
end end
if action == "Cut" then if action == "Cut" then
AskCanCutLimb(patient, part_name) AskCanCutLimb(patient, part_name)
elseif action == "Operate" then elseif action == "Operate" then
@@ -432,11 +424,11 @@ function TryTocAction(_, part_name, action, surgeon, patient)
elseif action == "Unequip" then elseif action == "Unequip" then
AskCanUnequipProsthesis(patient, part_name) AskCanUnequipProsthesis(patient, part_name)
end end
ui.actionAct = action ui.actionAct = action
ui.partNameAct = part_name ui.partNameAct = part_name
ui.patient = patient ui.patient = patient
SendCommandToConfirmUIMP("Wait server") SendCommandToConfirmUIMP("Wait server")
end end

View File

@@ -58,7 +58,6 @@ function ISInstallProsthesis:perform()
TheOnlyCure.EquipProsthesis(self.part_name, prosthesis_base_name) TheOnlyCure.EquipProsthesis(self.part_name, prosthesis_base_name)
end end
self.character:transmitModData()
-- needed to remove from queue / start next. -- needed to remove from queue / start next.
ISBaseTimedAction.perform(self) ISBaseTimedAction.perform(self)

View File

@@ -57,7 +57,6 @@ function ISUninstallProsthesis:perform()
else else
TheOnlyCure.UnequipProsthesis(self.part_name, self.item) TheOnlyCure.UnequipProsthesis(self.part_name, self.item)
end end
self.character:transmitModData()
ISBaseTimedAction.perform(self) ISBaseTimedAction.perform(self)

View File

@@ -1,12 +1,12 @@
--- A rly big thx to Fenris_Wolf and Chuck to help me with that. Love you guy --- A rly big thx to Fenris_Wolf and Chuck to help me with that. Love you guy
--if isClient() then return end
---Server side ---Server side
local Commands = {} local TOC_Commands = {}
--TODO how does this work --TODO how does this work
Commands["SendServer"] = function(player, arg) TOC_Commands["SendServer"] = function(player, arg)
local otherPlayer = getPlayerByOnlineID(arg["To"]) local otherPlayer = getPlayerByOnlineID(arg["To"])
print("The Only Cure Command: ", arg['command']) print("The Only Cure Command: ", arg['command'])
sendServerCommand(otherPlayer, "TOC", arg["command"], arg) sendServerCommand(otherPlayer, "TOC", arg["command"], arg)
@@ -14,14 +14,14 @@ end
-- To make the UI Work -- To make the UI Work
Commands["GetPlayerData"] = function(_, arg) TOC_Commands["GetPlayerData"] = function(_, arg)
local surgeon_id = arg[1] local surgeon_id = arg[1]
local patient_id = arg[2] local patient_id = arg[2]
local patient = getPlayerByOnlineID(arg[2]) local patient = getPlayerByOnlineID(arg[2])
sendServerCommand(patient, "TOC", "GivePlayerData", { surgeon_id, patient_id }) sendServerCommand(patient, "TOC", "GivePlayerData", { surgeon_id, patient_id })
end end
Commands["SendPlayerData"] = function(_, arg) TOC_Commands["SendPlayerData"] = function(_, arg)
local surgeon = getPlayerByOnlineID(arg[1]) local surgeon = getPlayerByOnlineID(arg[1])
local surgeon_id = arg[1] local surgeon_id = arg[1]
local toc_data = arg[2] local toc_data = arg[2]
@@ -31,7 +31,7 @@ end
-- CHEATING STUFF -- CHEATING STUFF
Commands["AskToResetEverything"] = function(_, arg) TOC_Commands["AskToResetEverything"] = function(_, arg)
local clicked_player = getPlayerByOnlineID(arg[1]) local clicked_player = getPlayerByOnlineID(arg[1])
local clicked_player_id = arg[1] local clicked_player_id = arg[1]
@@ -40,15 +40,25 @@ Commands["AskToResetEverything"] = function(_, arg)
end end
local function OnTocClientCommand(module, command, player, args) ------ Global Mod Data -----------
if module == 'TOC' then
print("OnTocClientCommand " .. command)
if Commands[command] then
args = args or {}
Commands[command](_, args)
end
end
function TOC_OnInitGlobalModData()
ModData.getOrCreate("TOC_PLAYER_DATA")
end end
Events.OnClientCommand.Add(OnTocClientCommand) Events.OnInitGlobalModData.Add(TOC_OnInitGlobalModData)
TOC_Commands.OnClientCommand = function(module, command, playerObj, args)
if module == 'TOC' and TOC_Commands[command] then
TOC_Commands[command](playerObj, args)
end
end
Events.OnClientCommand.Add(TOC_Commands.OnClientCommand)
TOC_Commands.ChangePlayerState = function(playerObj, args)
ModData.get("TOC_PLAYER_DATA")[playerObj:getUsername()] = args
ModData.transmit("TOC_PLAYER_DATA")
end