That's a lot of stuff, fixed X on online UI, prosthesis unequipping, prosthesis equipping for MP, ecc.

This commit is contained in:
Pao
2023-01-22 19:37:11 +01:00
parent ccbd88b2a7
commit 36bee73878
11 changed files with 370 additions and 114 deletions

View File

@@ -24,7 +24,22 @@ function CheckIfCanBeOperated(part_name)
end
function CheckIfProsthesisCanBeEquipped(part_name)
function CheckIfProsthesisCanBeEquipped(part_name, item)
local part_data = getPlayer():getModData().TOC.Limbs
if item ~= nil then
if part_data[part_name].is_operated then
return true
end
else
return false
end
-- check if prosthesis is in the surgeon inventory... we need to get it before
end

View File

@@ -3,6 +3,9 @@
local Commands = {}
Commands["ResponseCanAct"] = function(arg)
print("TOC: ResponseCanAct")
local ui = GetConfirmUIMP()
ui.responseReceive = true
ui.responseAction = arg["toSend"][2]
@@ -32,6 +35,24 @@ function SendOperateLimb(player, part_name, surgeon_factor, use_oven)
sendClientCommand("TOC", "SendServer", arg)
end
function SendEquipProsthesis(player, part_name, prosthesis_base_name)
local arg = {}
arg["From"] = getPlayer():getOnlineID()
arg["To"] = player:getOnlineID()
arg["command"] = "EquipProsthesis"
arg["toSend"] = { part_name, prosthesis_base_name}
sendClientCommand("TOC", "SendServer", arg)
end
function SendUnequipProsthesis(player, part_name, equipped_prosthesis)
local arg = {}
arg["From"] = getPlayer():getOnlineID()
arg["To"] = player:getOnlineID()
arg["command"] = "UnequipProsthesis"
arg["toSend"] = { part_name, equipped_prosthesis}
sendClientCommand("TOC", "SendServer", arg)
end
function AskCanCutLimb(player, part_name)
GetConfirmUIMP().responseReceive = false
local arg = {}
@@ -59,9 +80,23 @@ function AskCanEquipProsthesis(player, part_name)
arg["To"] = player:getOnlineID()
arg["command"] = "CanEquipProsthesis"
arg["toSend"] = part_name
sendClientCommand("TOC", "SendServer", arg)
end
function AskCanUnequipProsthesis(player, part_name)
GetConfirmUIMP().responseReceive = false
local arg = {}
arg["From"] = getPlayer():getOnlineID()
arg["To"] = player:getOnlineID()
arg["command"] = "CanUnequipProsthesis"
arg["toSend"] = part_name
sendClientCommand("TOC", "SendServer", arg)
end
-- Patient (receive)
Commands["CutLimb"] = function(arg)
local arg = arg["toSend"]
@@ -73,6 +108,28 @@ Commands["OperateLimb"] = function(arg)
TheOnlyCure.OperateLimb(arg[1], arg[2], arg[3])
end
Commands["EquipProsthesis"] = function(arg)
-- part_name = arg[1]
-- prosthesis = arg[2]
local arg = arg["toSend"]
TheOnlyCure.EquipProsthesis(arg[1], arg[2])
end
Commands["UnequipProsthesis"] = function(arg)
-- part_name = arg[1]
local arg = arg["toSend"]
TheOnlyCure.UnequipProsthesis(arg[1])
end
Commands["CanCutLimb"] = function(arg)
local part_name = arg["toSend"]
@@ -95,14 +152,23 @@ end
Commands["CanEquipProsthesis"] = function(arg)
local part_name = arg["toSend"]
arg["To"] = arg["From"]
arg["From"] = getPlayer():getOnlineID()
arg["command"] = "ResponseCanAct"
arg["toSend"] = { part_name, "Equip", CheckIfProsthesisCanBeEquipped(part_name) }
arg["toSend"] = { part_name, "Equip", true } -- FIXME true just for test
sendClientCommand("TOC", "SendServer", arg)
end
Commands["CanUnequipProsthesis"] = function(arg)
local part_name = arg["toSend"]
arg["To"] = arg["From"]
arg["From"] = getPlayer():getOnlineID()
arg["command"] = "ResponseCanAct"
arg["toSend"] = { part_name, "Unequip", true } -- FIXME true just for test
sendClientCommand("TOC", "SendServer", arg)
end
Commands["CanResetEverything"] = function(arg)
local part_name = "RightHand" --useless
@@ -112,7 +178,6 @@ Commands["CanResetEverything"] = function(arg)
arg["command"] = "ResponseCanAct"
arg["toSend"] = { part_name, "Cut", true }
sendClientCommand("TOC", "SendServer", arg)
--TocResetEverything()
end
Commands["ResetEverything"] = function(arg)
@@ -155,6 +220,7 @@ local function OnTocServerCommand(module, command, args)
if module == 'TOC' then
print("OnTocServerCommand " .. command)
if Commands[command] then
print("Found command, executing it now")
args = args or {}
Commands[command](args)

View File

@@ -7,7 +7,7 @@ function GetBodyParts()
end
function GetProsthesisList()
return {"TOC.WoodenHook", "TOC.MetalHook", "TOC.MetalHand"}
return {"WoodenHook", "MetalHook", "MetalHand"}
end
@@ -100,26 +100,4 @@ function TocFindCorrectClothingProsthesis(item_name, part_name)
end
local function PartNameToBodyLocation(name)
-- This is still correct but naming sucks
if name == "Right_Hand" then return "ArmRight_Prot" end
if name == "Right_LowerArm" then return "ArmRight_Prot" end
if name == "Right_UpperArm" then return "ArmRight_Prot" end
if name == "Left_Hand" then return "ArmLeft_Prot" end
if name == "Left_LowerArm" then return "ArmLeft_Prot" end
if name == "Left_UpperArm" then return "ArmLeft_Prot" 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 worn_items = patient:getWornItems()
for i = 1, worn_items:size() - 1 do -- Maybe wornItems:size()-1
local item = worn_items:get(i):getItem()
if item:getBodyLocation() == PartNameToBodyLocation(part_name) then
return item
end
end
end

View File

@@ -121,6 +121,37 @@ function FixSingleBodyPartType(body_part_type, use_oven)
end
end
-- Unequip Prosthesis
local function PartNameToBodyLocation(name)
-- This is still correct but naming sucks
if name == "Right_Hand" then return "ArmRight_Prot" end
if name == "Right_LowerArm" then return "ArmRight_Prot" end
if name == "Right_UpperArm" then return "ArmRight_Prot" end
if name == "Left_Hand" then return "ArmLeft_Prot" end
if name == "Left_LowerArm" then return "ArmLeft_Prot" end
if name == "Left_UpperArm" then return "ArmLeft_Prot" 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
-- Can't be used for online purposes, since we can't get the online inventory of another player
local worn_items = patient:getWornItems()
for i = 1, worn_items:size() - 1 do -- Maybe wornItems:size()-1
local item = worn_items:get(i):getItem()
if item:getBodyLocation() == PartNameToBodyLocation(part_name) then
return item
end
end
end
-------------------------------------
-- Override helper

View File

@@ -29,8 +29,7 @@ function TocEquipProsthesisLocal(_, patient, surgeon, part_name)
surgeon_inventory:getItemFromType('TOC.MetalHook') or
surgeon_inventory:getItemFromType('TOC.WoodenHook')
if prosthesis_to_equip then
ISTimedActionQueue.add(ISInstallProsthesis:new(patient, prosthesis_to_equip,
patient:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))))
ISTimedActionQueue.add(ISInstallProsthesis:new(surgeon, patient, prosthesis_to_equip, part_name))
else
surgeon:Say("I need a prosthesis")
end

View File

@@ -174,7 +174,7 @@ function OnClickTocConfirmUIMP(button, args)
if confirm_ui_mp.actionAct == "Cut" and args.option == "yes" then
ISTimedActionQueue.add(ISCutLimb:new(confirm_ui_mp.patient, player, confirm_ui_mp.partNameAct))
elseif confirm_ui_mp.actionAct == "Operate" and args.option == "yes" then
local playerInv = player:getInventory();
local playerInv = player:getInventory()
local item = playerInv:getItemFromType('TOC.Real_surgeon_kit') or playerInv:getItemFromType('TOC.Surgeon_kit') or
playerInv:getItemFromType('TOC.Improvised_surgeon_kit')
if item then
@@ -185,11 +185,36 @@ function OnClickTocConfirmUIMP(button, args)
end
elseif confirm_ui_mp.actionAct == "Equip" and args.option == "yes" then
print("Equip mp comp")
local surgeon_inventory = player:getInventory()
local prosthesis_to_equip = surgeon_inventory:getItemFromType('TOC.MetalHand') or
surgeon_inventory:getItemFromType('TOC.MetalHook') or
surgeon_inventory:getItemFromType('TOC.WoodenHook')
if prosthesis_to_equip then
ISTimedActionQueue.add(ISInstallProsthesis:new(player, confirm_ui_mp.patient, prosthesis_to_equip, confirm_ui_mp.partNameAct))
else
player:Say("I don't have a prosthesis right now")
end
elseif confirm_ui_mp.actionAct == "Unequip" and args.option == "yes" then
print("Unequip mp comp")
-- We can't check if the player has a prosthesis right now, we need to do it later
-- TODO should check if player has a prosthesis equipped before doing it
-- TODO Player is surgeon, but we don't have a confirm_ui_mp.surgeon... awful awful awful
-- TODO Workaround for now, we'd need to send data from patient before doing it since we can't access his inventory from the surgeon
if confirm_ui_mp.patient == player then
ISTimedActionQueue.add(ISUninstallProsthesis:new(player, confirm_ui_mp.patient, confirm_ui_mp.partNameAct))
else
player:Say("I can't do that, they need to do it themselves")
end
end
@@ -477,15 +502,17 @@ function SendCommandToConfirmUIMP(action, isBitten, userName, partName)
confirm_ui_mp:bringToTop()
confirm_ui_mp:open()
if action == "Cut" or action == "Operate" then
if action ~= "Wait server" then
confirm_ui_mp["text4"]:setText("You're gonna " ..
action .. " the " .. getText("UI_ContextMenu_" .. partName) .. " of " .. userName)
action .. " the " .. getText("UI_ContextMenu_" .. partName) .. " of " .. userName)
confirm_ui_mp["text2"]:setText("Are you sure?")
confirm_ui_mp["text2"]:setColor(1, 0, 0, 0)
confirm_ui_mp["b1"]:setVisible(true);
confirm_ui_mp["b2"]:setVisible(true);
confirm_ui_mp["b1"]:setVisible(true)
confirm_ui_mp["b2"]:setVisible(true)
else
elseif action == "Wait server" then
confirm_ui_mp["text4"]:setText(action)
confirm_ui_mp["text3"]:setText("")
confirm_ui_mp["text2"]:setText("")
@@ -493,7 +520,6 @@ function SendCommandToConfirmUIMP(action, isBitten, userName, partName)
confirm_ui_mp["b2"]:setVisible(false)
end
end
--------------------------------------------
@@ -503,6 +529,14 @@ local ISHealthPanel_render = ISHealthPanel.render
-- Add button to health panel
TocTempTable = {
TempPatient = nil,
TempSurgeon = nil
}
function ISNewHealthPanel.onClick_TOC(button)
local surgeon = button.otherPlayer
@@ -511,17 +545,19 @@ function ISNewHealthPanel.onClick_TOC(button)
if surgeon then
if surgeon == patient then
SetupTocMainUI(surgeon, surgeon, surgeon:getModData().TOC)
--SetupTocConfirmUI(surgeon, surgeon)
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() })
SetupTocMainUI(surgeon, patient, MP_other_player_toc_data)
--SetupTocConfirmUI(surgeon, patient)
TocTempTable.TempPatient = patient
TocTempTable.TempSurgeon = surgeon
-- Wait for ack
Events.OnTick.Add(TocWaitForOnlinePlayerData)
end
else
-- This is when surgeon doesnt exist for some reason.
SetupTocMainUI(patient, patient, patient:getModData().TOC)
-- SetupTocConfirmUI(patient, patient)
end
main_ui:toggle()
@@ -529,6 +565,24 @@ function ISNewHealthPanel.onClick_TOC(button)
end
function TocWaitForOnlinePlayerData(numberTicks)
if MP_other_player_toc_data ~= nil then
SetupTocMainUI(TocTempTable.TempSurgeon, TocTempTable.TempPatient, MP_other_player_toc_data)
TocTempTable.TempSurgeon = nil
TocTempTable.TempPatient = nil
MP_other_player_toc_data = nil
Events.OnTick.Remove(TocWaitForOnlinePlayerData)
end
end
function ISHealthPanel:createChildren()
ISHealthPanel_createChildren(self)

View File

@@ -341,6 +341,68 @@ function TheOnlyCure.OperateLimb(part_name, surgeon_factor, use_oven)
player:transmitModData()
end
function TheOnlyCure.EquipProsthesis(part_name, prosthesis_base_name)
local player = getPlayer()
local toc_data = player:getModData().TOC
local prosthesis_name = TocFindCorrectClothingProsthesis(prosthesis_base_name, part_name)
local added_prosthesis = player:getInventory():AddItem(prosthesis_name)
if part_name ~= nil then
if added_prosthesis ~= nil then
toc_data.Limbs[part_name].is_prosthesis_equipped = true -- TODO should we show that the hand has a prost too if it's installed in the forearm?
toc_data.Limbs[part_name].equipped_prosthesis = toc_data.Prosthesis[prosthesis_base_name][part_name]
player:setWornItem(added_prosthesis:getBodyLocation(), added_prosthesis)
end
end
end
function TheOnlyCure.UnequipProsthesis(part_name, equipped_prosthesis)
local player = getPlayer()
local toc_data = player:getModData().TOC
-- we've got equipped_prosthesis, so we should be able to get it directly
toc_data.Limbs[part_name].is_prosthesis_equipped = false
local equipped_prosthesis_full_type = equipped_prosthesis:getFullType()
for _, prost_v in ipairs(GetProsthesisList()) do
local prosthesis_name = string.match(equipped_prosthesis_full_type, prost_v)
if prosthesis_name then
player:getInventory():AddItem("TOC." .. prosthesis_name)
player:setWornItem(equipped_prosthesis:getBodyLocation(), nil)
player:getInventory():Remove(equipped_prosthesis)
player:transmitModData()
-- needed to remove from queue / start next.
end
end
end
function TryTocAction(_, part_name, action, surgeon, patient)
-- TODO add checks so that we don't show these menus if a player has already beeen operated or amputated
-- TODO at this point surgeon doesnt do anything. We'll fix this later
@@ -379,35 +441,45 @@ function TryTocAction(_, part_name, action, surgeon, patient)
elseif action == "Operate" then
AskCanOperateLimb(patient, part_name)
elseif action == "Equip" then
local surgeon_inventory = surgeon:getInventory()
local prosthesis_to_equip = surgeon_inventory:getItemFromType('TOC.MetalHand') or
surgeon_inventory:getItemFromType('TOC.MetalHook') or
surgeon_inventory:getItemFromType('TOC.WoodenHook')
if prosthesis_to_equip then
ISTimedActionQueue.add(ISInstallProsthesis:new(patient, prosthesis_to_equip,
patient:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))))
else
surgeon:Say("I need a prosthesis")
end
--local surgeon_inventory = surgeon:getInventory()
--local prosthesis_to_equip = surgeon_inventory:getItemFromType('TOC.MetalHook')
--local prosthesis_to_equip = surgeon_inventory:getItemFromType('TOC.MetalHand') or
-- surgeon_inventory:getItemFromType('TOC.MetalHook') or
-- surgeon_inventory:getItemFromType('TOC.WoodenHook')
AskCanEquipProsthesis(patient, part_name)
-- if prosthesis_to_equip then
-- ISTimedActionQueue.add(ISInstallProsthesis:new(patient, prosthesis_to_equip,
-- patient:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))))
-- else
-- surgeon:Say("I need a prosthesis")
-- end
--AskCanEquipProsthesis(patient, part_name, item)
elseif action == "Unequip" then
--AskCanUnequipProsthesis(patient, part_name)
local equipped_prosthesis = TocFindItemInProstBodyLocation(part_name, patient)
ISTimedActionQueue.add(ISUninstallProsthesis:new(patient, equipped_prosthesis,
patient:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))))
AskCanUnequipProsthesis(patient, part_name)
-- local equipped_prosthesis = TocFindItemInProstBodyLocation(part_name, patient)
-- ISTimedActionQueue.add(ISUninstallProsthesis:new(patient, equipped_prosthesis,
-- patient:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromPartName(part_name))))
end
ui.actionAct = action
ui.partNameAct = part_name
ui.patient = patient
--TODO just a workaround for now
if action ~= "Equip" and action ~= "Unequip" then
SendCommandToConfirmUIMP("Wait server")
end
SendCommandToConfirmUIMP("Wait server")
end
end

View File

@@ -125,8 +125,12 @@ function ISCutLimb:perform()
end
function ISCutLimb:new(patient, surgeon, part_name)
-- TODO align surgeon, patient not patient, surgeon
local o = {}
setmetatable(o, self)
setmetatable(o, self) -- TODO what's this crap?
self.__index = self
o.part_name = part_name
o.character = surgeon -- For anim

View File

@@ -13,8 +13,14 @@ end
function ISInstallProsthesis:start()
self.item:setJobType("Install prosthesis")
self.item:setJobDelta(0.0)
self:setActionAnim("WearClothing")
self:setAnimVariable("WearClothingLocation", "Jacket")
end
function ISInstallProsthesis:stop()
@@ -31,42 +37,46 @@ function ISInstallProsthesis:perform()
self.item:setJobDelta(0.0)
local toc_data = self.character:getModData().TOC
local part_name = TocGetPartNameFromBodyPartType(self.bodyPart:getType())
-- local toc_data = self.character:getModData().TOC
--local part_name = TocGetPartNameFromBodyPartType(self.bodyPart:getType())
local body_part_type = TocGetBodyPartTypeFromPartName(self.part_name)
-- Check if can be performed. This shouldn't be necessary, but just to be sure
if self.bodyPart:getType() == BodyPartType.UpperArm_L or self.bodyPart:getType() == BodyPartType.UpperArm_R then
if body_part_type == BodyPartType.UpperArm_L or body_part_type == BodyPartType.UpperArm_R then
print("Can't equip prosthesis")
return
end
local prosthesis_name = TocFindCorrectClothingProsthesis(prosthesis_base_name, part_name)
self.cloth = self.character:getInventory():AddItem(prosthesis_name)
if self.cloth ~= nil then
self.surgeon:getInventory():Remove(prosthesis_base_name) -- Removes the base item and substitute it with the part one
if part_name then
toc_data.Limbs[part_name].is_prosthesis_equipped = true -- TODO should we show that the hand has a prost too if it's installed in the forearm?
toc_data.Limbs[part_name].equipped_prosthesis = toc_data.Prosthesis[prosthesis_base_name][part_name]
self.character:getInventory():Remove(self.item)
self.character:setWornItem(self.cloth:getBodyLocation(), self.cloth)
end
if self.patient ~= self.surgeon and isClient() then
SendEquipProsthesis(self.patient, self.part_name, prosthesis_base_name)
else
TheOnlyCure.EquipProsthesis(self.part_name, prosthesis_base_name)
end
self.character:transmitModData()
-- needed to remove from queue / start next.
ISBaseTimedAction.perform(self)
end
function ISInstallProsthesis:new(character, item, bodyPart)
local o = ISBaseTimedAction.new(self, character)
function ISInstallProsthesis:new(surgeon, patient, item, part_name)
local o = ISBaseTimedAction.new(self, patient)
o.character = surgeon -- For animation, since self.startAnim or whatever relies on this
o.surgeon = surgeon
o.patient = patient
o.item = item
o.bodyPart = bodyPart
o.part_name = part_name
--o.bodyPart = bodyPart
o.maxTime = 100
o.stopOnWalk = true
o.stopOnRun = true

View File

@@ -58,7 +58,6 @@ function ISOperateLimb:perform()
if self.patient ~= self.surgeon and isClient() then
SendOperateLimb(self.patient, self.part_name, surgeon_factor, use_oven)
--SendOperateArm(self.patient, self.part_name, surgeon_factor, use_oven)
else
TheOnlyCure.OperateLimb(self.part_name, surgeon_factor, use_oven)
end

View File

@@ -3,7 +3,16 @@ require "TimedActions/ISBaseTimedAction"
ISUninstallProsthesis = ISBaseTimedAction:derive("ISUninstallProsthesis");
function ISUninstallProsthesis:isValid()
return true;
if self.item ~= nil then
return true
else
return false
end
end
function ISUninstallProsthesis:update()
@@ -41,40 +50,50 @@ function ISUninstallProsthesis:perform()
end
end
local toc_data = self.character:getModData().TOC
local body_part_type = self.bodyPart:getType()
local accepting_body_parts = GetAcceptingProsthesisBodyPartTypes()
if accepting_body_parts == nil then
return -- should never happen
if self.patient ~= self.surgeon and isClient() then
SendUnequipProsthesis(self.patient, self.part_name, self.item)
else
TheOnlyCure.UnequipProsthesis(self.part_name, self.item)
end
self.character:transmitModData()
for _, v in ipairs(GetAcceptingProsthesisBodyPartTypes()) do
if self.bodyPart:getType() == v then
local part_name = TocGetPartNameFromBodyPartType(v)
print("Found prost in " .. part_name)
if part_name then
toc_data.Limbs[part_name].is_prosthesis_equipped = false
local item_full_type = self.item:getFullType()
print("Searching for " .. item_full_type)
for _, prost_v in ipairs(GetProsthesisList()) do
local prosthesis_name = string.match(item_full_type, prost_v)
ISBaseTimedAction.perform(self)
if prosthesis_name then
self.character:getInventory():AddItem(prosthesis_name)
self.character:setWornItem(self.item:getBodyLocation(), nil)
self.character:getInventory():Remove(self.item)
self.character:transmitModData()
-- needed to remove from queue / start next.
ISBaseTimedAction.perform(self)
end
end
end
-- for _, v in ipairs(GetAcceptingProsthesisBodyPartTypes()) do
-- if self.bodyPart:getType() == v then
-- local part_name = TocGetPartNameFromBodyPartType(v)
-- print("Found prost in " .. part_name)
-- if part_name then
-- toc_data.Limbs[part_name].is_prosthesis_equipped = false
-- local item_full_type = self.item:getFullType()
-- print("Searching for " .. item_full_type)
-- for _, prost_v in ipairs(GetProsthesisList()) do
-- local prosthesis_name = string.match(item_full_type, prost_v)
-- if prosthesis_name then
-- self.character:getInventory():AddItem(prosthesis_name)
-- self.character:setWornItem(self.item:getBodyLocation(), nil)
-- self.character:getInventory():Remove(self.item)
-- self.character:transmitModData()
-- -- needed to remove from queue / start next.
-- ISBaseTimedAction.perform(self)
-- end
-- end
-- end
@@ -84,18 +103,27 @@ function ISUninstallProsthesis:perform()
end
end
-- end
-- end
-- TODO Make the object currently on the hand return to the inventory
end
function ISUninstallProsthesis:new(character, item, bodyPart)
local o = ISBaseTimedAction.new(self, character);
o.item = item;
o.character = character;
o.bodyPart = bodyPart;
function ISUninstallProsthesis:new(surgeon, patient, part_name)
local o = ISBaseTimedAction.new(self, surgeon)
o.item = TocFindItemInProstBodyLocation(part_name, patient)
o.character = surgeon -- For animation purposes
o.patient = patient
o.surgeon = surgeon
o.part_name = part_name
o.maxTime = 100;
o.stopOnWalk = true;
o.stopOnRun = true;