From 739a358925b5931a28b848e686aef4093a30ed47 Mon Sep 17 00:00:00 2001 From: Pao Date: Sun, 22 Jan 2023 23:46:35 +0100 Subject: [PATCH] redoing mp stuff --- media/lua/client/TOC_Checks.lua | 18 +++++--- media/lua/client/TOC_Client.lua | 27 +++++++++++ media/lua/client/TOC_ContextMenus.lua | 38 ++++++++++------ media/lua/client/TOC_LocalActions.lua | 2 +- media/lua/client/TOC_UI.lua | 65 +++++++++++++++------------ media/lua/client/TOC_Update.lua | 16 ++++--- media/lua/client/TOC_main.lua | 2 + media/lua/server/TOC_MP_server.lua | 43 ++++++++++++++---- 8 files changed, 146 insertions(+), 65 deletions(-) diff --git a/media/lua/client/TOC_Checks.lua b/media/lua/client/TOC_Checks.lua index b3543a5..6a0e3cc 100644 --- a/media/lua/client/TOC_Checks.lua +++ b/media/lua/client/TOC_Checks.lua @@ -6,19 +6,25 @@ end ----------------------------------------- -- MP HANDLING CHECKS -function CheckIfCanBeCut(part_name) +function CheckIfCanBeCut(part_name, part_data) - local toc_data = getPlayer():getModData().TOC - local check = (not toc_data.Limbs[part_name].is_cut) and - (not CheckIfProsthesisAlreadyInstalled(toc_data.Limbs, part_name)) + if part_data == nil then + part_data = getPlayer():getModData().TOC.Limbs + + end + local check = (not part_data[part_name].is_cut) and + (not CheckIfProsthesisAlreadyInstalled(part_data, part_name)) return check end -function CheckIfCanBeOperated(part_name) +function CheckIfCanBeOperated(part_name, part_data) + + if part_data == nil then + part_data = getPlayer():getModData().TOC.Limbs + end - local part_data = getPlayer():getModData().TOC.Limbs return part_data[part_name].is_operated == false and part_data[part_name].is_amputation_shown diff --git a/media/lua/client/TOC_Client.lua b/media/lua/client/TOC_Client.lua index c10789a..5673a1f 100644 --- a/media/lua/client/TOC_Client.lua +++ b/media/lua/client/TOC_Client.lua @@ -229,3 +229,30 @@ local function OnTocServerCommand(module, command, args) end 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) + diff --git a/media/lua/client/TOC_ContextMenus.lua b/media/lua/client/TOC_ContextMenus.lua index 14ffba4..17a47e2 100644 --- a/media/lua/client/TOC_ContextMenus.lua +++ b/media/lua/client/TOC_ContextMenus.lua @@ -101,14 +101,6 @@ TocContextMenus.CreateOperateWithOvenMenu = function(player, context, worldObjec 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 @@ -131,20 +123,38 @@ TocContextMenus.FillCutAndOperateMenus = function(local_player, clicked_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) - 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, local_player) end else -- 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 diff --git a/media/lua/client/TOC_LocalActions.lua b/media/lua/client/TOC_LocalActions.lua index 815b5a5..153841a 100644 --- a/media/lua/client/TOC_LocalActions.lua +++ b/media/lua/client/TOC_LocalActions.lua @@ -1,6 +1,6 @@ function TocCutLocal(_, player, part_name) if TocGetSawInInventory(player) ~= nil then - ISTimedActionQueue.add(ISCutLimb:new(player, player, part_name)); + ISTimedActionQueue.add(ISCutLimb:new(player, player, part_name)) else player:Say("I don't have a saw on me") end diff --git a/media/lua/client/TOC_UI.lua b/media/lua/client/TOC_UI.lua index 0d94884..f9e0acd 100644 --- a/media/lua/client/TOC_UI.lua +++ b/media/lua/client/TOC_UI.lua @@ -31,8 +31,7 @@ end ------------------------------ -- UI Visible stuff functions -local function GetImageName(part_name, toc_data) - local part_data = toc_data.Limbs[part_name] +local function GetImageName(part_name, part_data) local name = "" if part_data.is_cut and part_data.is_cicatrized and part_data.is_prosthesis_equipped then -- Cut and equip @@ -59,9 +58,9 @@ local function GetImageName(part_name, toc_data) end -- 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 part_data["Right_LowerArm"].is_prosthesis_equipped then 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 part_data["Left_LowerArm"].is_prosthesis_equipped then name = "media/ui/TOC/" .. part_name .. "/Hook.png" end return name @@ -137,7 +136,7 @@ local function OnClickTocMainUI(button, args) desc_ui:open() 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.part_data, args.part_name) -- surgeon is generic. end @@ -351,37 +350,36 @@ end ----------------------------------------- -- Setup stuff with variables and shit -function SetupTocMainUI(surgeon, patient, toc_data) +function SetupTocMainUI(surgeon, patient, part_data) -- TODO add a ontick to update it regularly main_ui.surgeon = surgeon -- we shouldn't need an arg for this main_ui.patient = patient - if toc_data then - main_ui["b11"]:addArg("toc_data", toc_data) - main_ui["b12"]:addArg("toc_data", toc_data) - main_ui["b21"]:addArg("toc_data", toc_data) - main_ui["b22"]:addArg("toc_data", toc_data) - main_ui["b31"]:addArg("toc_data", toc_data) - main_ui["b32"]:addArg("toc_data", toc_data) + if part_data then + main_ui["b11"]:addArg("part_data", part_data) + main_ui["b12"]:addArg("part_data", part_data) + main_ui["b21"]:addArg("part_data", part_data) + main_ui["b22"]:addArg("part_data", part_data) + main_ui["b31"]:addArg("part_data", part_data) + main_ui["b32"]:addArg("part_data", part_data) - main_ui["b11"]:setPath(GetImageName("Right_UpperArm", toc_data)) - main_ui["b12"]:setPath(GetImageName("Left_UpperArm", toc_data)) + main_ui["b11"]:setPath(GetImageName("Right_UpperArm", part_data)) + main_ui["b12"]:setPath(GetImageName("Left_UpperArm", part_data)) - main_ui["b21"]:setPath(GetImageName("Right_LowerArm", toc_data)) - main_ui["b22"]:setPath(GetImageName("Left_LowerArm", toc_data)) + main_ui["b21"]:setPath(GetImageName("Right_LowerArm", part_data)) + main_ui["b22"]:setPath(GetImageName("Left_LowerArm", part_data)) - main_ui["b31"]:setPath(GetImageName("Right_Hand", toc_data)) - main_ui["b32"]:setPath(GetImageName("Left_Hand", toc_data)) + main_ui["b31"]:setPath(GetImageName("Right_Hand", part_data)) + main_ui["b32"]:setPath(GetImageName("Left_Hand", part_data)) end end -function SetupTocDescUI(surgeon, patient, toc_data, part_name) - local part_data = toc_data.Limbs[part_name] +function SetupTocDescUI(surgeon, patient, part_data, part_name) desc_ui["textTitle"]:setText(getText("UI_ContextMenu_" .. part_name)) desc_ui.part_name = part_name desc_ui.surgeon = surgeon @@ -454,11 +452,11 @@ function SetupTocDescUI(surgeon, patient, toc_data, part_name) -- TODO add check for cuts and scratches desc_ui["status"]:setText("Not cut") 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(part_data, part_name) then desc_ui["b1"]:setVisible(true) desc_ui["b1"]:setText("Cut") desc_ui["b1"]:addArg("option", "Cut") - elseif TocGetSawInInventory(surgeon) and CheckIfProsthesisAlreadyInstalled(toc_data.Limbs, part_name) then + elseif TocGetSawInInventory(surgeon) and CheckIfProsthesisAlreadyInstalled(part_data, part_name) then desc_ui["b1"]:setVisible(true) desc_ui["b1"]:setText("Remove prosthesis before") desc_ui["b1"]:addArg("option", "Nothing") @@ -547,20 +545,29 @@ function ISNewHealthPanel.onClick_TOC(button) if surgeon then if surgeon == patient then - SetupTocMainUI(surgeon, surgeon, surgeon:getModData().TOC) + SetupTocMainUI(surgeon, surgeon, surgeon:getModData().TOC.Limbs) else -- MP stuff, try to get the other player data and display it on the surgeon display - sendClientCommand(surgeon, "TOC", "GetPlayerData", { surgeon:getOnlineID(), patient:getOnlineID() }) + 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 - TocTempTable.TempSurgeon = surgeon + SetupTocMainUI(surgeon, patient, other_player_part_data[1]) + + end + + + + --sendClientCommand(surgeon, "TOC", "GetPlayerData", { surgeon:getOnlineID(), patient:getOnlineID() }) + + --TocTempTable.TempPatient = patient + --TocTempTable.TempSurgeon = surgeon -- Wait for ack - Events.OnTick.Add(TocWaitForOnlinePlayerData) + --Events.OnTick.Add(TocWaitForOnlinePlayerData) end else -- This is when surgeon doesnt exist for some reason. - SetupTocMainUI(patient, patient, patient:getModData().TOC) + SetupTocMainUI(patient, patient, patient:getModData().TOC.Limbs) end main_ui:toggle() diff --git a/media/lua/client/TOC_Update.lua b/media/lua/client/TOC_Update.lua index 8ee446a..3381c59 100644 --- a/media/lua/client/TOC_Update.lua +++ b/media/lua/client/TOC_Update.lua @@ -26,7 +26,6 @@ function TheOnlyCure.CheckIfPlayerIsInfected(player, toc_data) if body_damage:getBodyPart(v):bitten() and part_data ~= nil then if part_data.is_cut == false then part_data.is_infected = true - player:transmitModData() end end @@ -35,7 +34,6 @@ function TheOnlyCure.CheckIfPlayerIsInfected(player, toc_data) for _, v in ipairs(GetOtherBodyPartTypes()) do 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 - player:transmitModData() break end end @@ -55,7 +53,6 @@ function TheOnlyCure.UpdatePlayerHealth(player, part_data) end end - player:transmitModData() end @@ -159,6 +156,16 @@ function TheOnlyCure.UpdateEveryOneMinute() TheOnlyCure.UpdatePlayerHealth(player, toc_data.Limbs) end + + + if toc_data ~= nil then + sendClientCommand(player, 'TOC', 'ChangePlayerState', { toc_data.Limbs } ) + end + + + + + end function TheOnlyCure.UpdateEveryTenMinutes() @@ -183,12 +190,9 @@ function TheOnlyCure.UpdateEveryTenMinutes() for _, part_name in pairs(GetBodyParts()) do 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" - - end end - player:transmitModData() end Events.EveryTenMinutes.Add(TheOnlyCure.UpdateEveryTenMinutes) diff --git a/media/lua/client/TOC_main.lua b/media/lua/client/TOC_main.lua index 510023d..03561c5 100644 --- a/media/lua/client/TOC_main.lua +++ b/media/lua/client/TOC_main.lua @@ -423,6 +423,8 @@ function TryTocAction(_, part_name, action, surgeon, patient) patient = surgeon end + + if action == "Cut" then AskCanCutLimb(patient, part_name) elseif action == "Operate" then diff --git a/media/lua/server/TOC_MP_server.lua b/media/lua/server/TOC_MP_server.lua index f9473e8..4ee4239 100644 --- a/media/lua/server/TOC_MP_server.lua +++ b/media/lua/server/TOC_MP_server.lua @@ -40,15 +40,40 @@ Commands["AskToResetEverything"] = function(_, arg) end -local function OnTocClientCommand(module, command, player, args) - if module == 'TOC' then - print("OnTocClientCommand " .. command) - if Commands[command] then - args = args or {} - Commands[command](_, args) - end - end +-- local function OnTocClientCommand(module, command, player, args) +-- if module == 'TOC' then +-- print("OnTocClientCommand " .. command) +-- if Commands[command] then +-- args = args or {} +-- Commands[command](_, args) +-- end +-- end +-- end + +--Events.OnClientCommand.Add(OnTocClientCommand) + +-------------------------------- TEST ------------------------ + +TOC_Commands = {} + +function TOC_OnInitGlobalModData() + ModData.getOrCreate("TOC_PLAYER_DATA") 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 \ No newline at end of file