Merge branch 'master' into modular_prosthetics

This commit is contained in:
Pao
2023-02-06 20:35:34 +01:00
33 changed files with 360 additions and 724 deletions

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<clothingItem>
<m_MaleModel>Surgery\Tourniquet_Left</m_MaleModel>
<m_FemaleModel>Surgery\Tourniquet_Left</m_FemaleModel>
<m_GUID>afbab35d-8bd4-4d61-87c7-054651ead1bd</m_GUID>
<m_Static>false</m_Static>
<m_AllowRandomHue>false</m_AllowRandomHue>
<m_AllowRandomTint>false</m_AllowRandomTint>
<textureChoices>Surgery\tourniquet</textureChoices>
</clothingItem>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<clothingItem>
<m_MaleModel>Surgery\Tourniquet_Right</m_MaleModel>
<m_FemaleModel>Surgery\Tourniquet_Right</m_FemaleModel>
<m_GUID>9a5fe063-63c7-4e6f-81ca-ee77c6678e0d</m_GUID>
<m_Static>false</m_Static>
<m_AllowRandomHue>false</m_AllowRandomHue>
<m_AllowRandomTint>false</m_AllowRandomTint>
<textureChoices>Surgery\tourniquet</textureChoices>
</clothingItem>

View File

@@ -77,6 +77,15 @@
<guid>0405a4c0-f71b-45a8-9edc-489fc81dca39</guid> <guid>0405a4c0-f71b-45a8-9edc-489fc81dca39</guid>
</files> </files>
<files>
<path>media/clothing/clothingItems/Surgery_Left_Tourniquet.xml</path>
<guid>afbab35d-8bd4-4d61-87c7-054651ead1bd</guid>
</files>
<files>
<path>media/clothing/clothingItems/Surgery_Right_Tourniquet.xml</path>
<guid>9a5fe063-63c7-4e6f-81ca-ee77c6678e0d</guid>
</files>
<files> <files>
<path>media/clothing/clothingItems/Amputation_Left_Foot.xml</path> <path>media/clothing/clothingItems/Amputation_Left_Foot.xml</path>
<guid>45c0b872-bdf1-466f-b810-c7783171bda1</guid> <guid>45c0b872-bdf1-466f-b810-c7783171bda1</guid>

View File

@@ -98,6 +98,20 @@ function TocDamagePlayerDuringAmputation(patient, part_name)
body_damage_part:setBleedingTime(ZombRand(10, 20)) body_damage_part:setBleedingTime(ZombRand(10, 20))
end end
local function FindTourniquetInWornItems(patient, side)
local worn_items = patient:getWornItems()
for i = 1, worn_items:size() - 1 do -- Maybe wornItems:size()-1
local item = worn_items:get(i):getItem()
local item_full_type = item:getFullType()
if string.find(item_full_type, "Test_Tourniquet_" .. side) then
return item
end
end
return nil
end
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
--- Main function for cutting a limb --- Main function for cutting a limb
@@ -116,13 +130,9 @@ function TocCutLimb(part_name, surgeon_factor, bandage_table, painkiller_table)
local limbs_data = toc_data.Limbs local limbs_data = toc_data.Limbs
-- TODO Stop for a bit,
-- Cut Hand -> Damage in forearm -- Cut Hand -> Damage in forearm
-- Cut Forearm -> Damage in Upperarm -- Cut Forearm -> Damage in Upperarm
-- Cut UpperArm -> Damage to torso -- Cut UpperArm -> Damage to torso
local body_damage = player:getBodyDamage() local body_damage = player:getBodyDamage()
local body_part = body_damage:getBodyPart(TocGetBodyPartFromPartName(part_name)) local body_part = body_damage:getBodyPart(TocGetBodyPartFromPartName(part_name))
local adiacent_body_part = player:getBodyDamage():getBodyPart(TocGetAdiacentBodyPartFromPartName(part_name)) local adiacent_body_part = player:getBodyDamage():getBodyPart(TocGetAdiacentBodyPartFromPartName(part_name))
@@ -135,18 +145,33 @@ function TocCutLimb(part_name, surgeon_factor, bandage_table, painkiller_table)
-- The bit will be checked later since we're not sure if the player is not infected from another wound -- The bit will be checked later since we're not sure if the player is not infected from another wound
TocSetParametersForMissingLimb(body_part, false) TocSetParametersForMissingLimb(body_part, false)
-- Use a tourniquet if available
local tourniquet_item = FindTourniquetInWornItems(player, TocGetSideFromPartName(part_name))
local base_damage_value = 100
if tourniquet_item ~= nil then
base_damage_value = 50
if part_name == "Left_UpperArm" or part_name == "Right_UpperArm" then
player:removeWornItem(tourniquet_item)
end
end
-- Set damage, stress, and low endurance after amputation -- Set damage, stress, and low endurance after amputation
adiacent_body_part:AddDamage(100 - surgeon_factor) adiacent_body_part:AddDamage(base_damage_value - surgeon_factor)
adiacent_body_part:setAdditionalPain(100 - surgeon_factor) adiacent_body_part:setAdditionalPain(base_damage_value - surgeon_factor)
adiacent_body_part:setBleeding(true) adiacent_body_part:setBleeding(true)
adiacent_body_part:setBleedingTime(100 - surgeon_factor) adiacent_body_part:setBleedingTime(base_damage_value - surgeon_factor)
adiacent_body_part:setDeepWounded(true) adiacent_body_part:setDeepWounded(true)
adiacent_body_part:setDeepWoundTime(100 - surgeon_factor) adiacent_body_part:setDeepWoundTime(base_damage_value - surgeon_factor)
stats:setEndurance(surgeon_factor) stats:setEndurance(surgeon_factor)
stats:setStress(100 - surgeon_factor) stats:setStress(base_damage_value - surgeon_factor)
-- Set malus for strength and fitness -- Set malus for strength and fitness
-- TODO Make it more "random" with just some XP scaling down instead of a whole level, depending on the limb that we're cutting
player:LoseLevel(Perks.Fitness) player:LoseLevel(Perks.Fitness)
player:LoseLevel(Perks.Strength) player:LoseLevel(Perks.Strength)
@@ -161,8 +186,9 @@ function TocCutLimb(part_name, surgeon_factor, bandage_table, painkiller_table)
-- If painkillers are available, use them -- If painkillers are available, use them
-- TODO add painkiller support -- TODO add painkiller support
-- Use a tourniquet if available
-- TODO add tourniquet
-- A check for is_cut shouldn't be necessary here since if we've got here we've already checked it out enough
if limbs_data[part_name].is_cut == false then if limbs_data[part_name].is_cut == false then
limbs_data[part_name].is_cut = true limbs_data[part_name].is_cut = true

View File

@@ -1,3 +1,10 @@
------------------------------------------
-------- THE ONLY CURE BUT BETTER --------
------------------------------------------
------------- LOCAL ACTIONS --------------
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))
@@ -7,12 +14,10 @@ function TocCutLocal(_, player, part_name)
end end
function TocOperateLocal(_, player, part_name, use_oven) function TocOperateLocal(_, player, part_name, use_oven)
--local player = getPlayer();
-- todo add a check if the player has already been amputated or somethin
if use_oven then if use_oven then
ISTimedActionQueue.add(ISOperateLimb:new(player, player, _, part_name, use_oven)); ISTimedActionQueue.add(ISOperateLimb:new(player, player, _, part_name, use_oven));
else else
local kit = TocGetKitInInventory(player) -- TODO Why is it here and only for local? local kit = TocGetKitInInventory(player)
if kit ~= nil then if kit ~= nil then
ISTimedActionQueue.add(ISOperateLimb:new(player, player, kit, part_name, false)) ISTimedActionQueue.add(ISOperateLimb:new(player, player, kit, part_name, false))
else else

View File

@@ -0,0 +1,63 @@
------------------------------------------
-------- THE ONLY CURE BUT BETTER --------
------------------------------------------
---------- PROSTHESIS FUNCTIONS ----------
---Equip a prosthesis transforming a normal item into a clothing item
---@param part_name string
---@param prosthesis_base_name string
function TocEquipProsthesis(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
toc_data.Limbs[part_name].equipped_prosthesis = toc_data.Prosthesis[prosthesis_base_name][part_name]
if player:isFemale() then
added_prosthesis:getVisual():setTextureChoice(1)
else
added_prosthesis:getVisual():setTextureChoice(0)
end
player:setWornItem(added_prosthesis:getBodyLocation(), added_prosthesis)
end
end
end
---Unequip a prosthesis clothing item and returns it to the inventory as a normal item
---@param part_name string
function TocUnequipProsthesis(patient, part_name, equipped_prosthesis)
local toc_data = patient:getModData().TOC
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
patient:getInventory():AddItem("TOC." .. prosthesis_name)
patient:setWornItem(equipped_prosthesis:getBodyLocation(), nil)
patient:getInventory():Remove(equipped_prosthesis)
toc_data.Limbs[part_name].equipped_prosthesis = nil
end
end
end

View File

@@ -1,6 +1,6 @@
-- TODO this should be moved -- TODO this should be moved
function TryToToResetEverythingOtherPlayer(_, patient, surgeon) local function TryToToResetEverythingOtherPlayer(_, patient, surgeon)
sendClientCommand(surgeon, "TOC", "AskToResetEverything", { patient:getOnlineID() }) sendClientCommand(surgeon, "TOC", "AskToResetEverything", { patient:getOnlineID() })
end end
@@ -67,19 +67,11 @@ end
TocContextMenus.CreateOperateWithOvenMenu = function(player, context, worldObjects, test) TocContextMenus.CreateOperateWithOvenMenu = function(player, context, worldObjects, test)
local player_obj = getSpecificPlayer(player) local player_obj = getSpecificPlayer(player)
--local clickedPlayer -- TODO Let the player move towards the oven
-- TODO Add a way to move the player towards the oven
local part_data = player_obj:getModData().TOC.Limbs local part_data = player_obj:getModData().TOC.Limbs
local is_main_menu_already_created = false local is_main_menu_already_created = false
--local props = v:getSprite() and v:getSprite():getProperties() or nil
for _, v_stove in pairs(worldObjects) do for _, v_stove in pairs(worldObjects) do
if instanceof(v_stove, "IsoStove") and if instanceof(v_stove, "IsoStove") and
(player_obj:HasTrait("Brave") or player_obj:getPerkLevel(Perks.Strength) >= 6) then (player_obj:HasTrait("Brave") or player_obj:getPerkLevel(Perks.Strength) >= 6) then

View File

@@ -53,7 +53,7 @@ local function GetImageName(part_name, limbs_data)
elseif part_data.is_cut and not part_data.is_amputation_shown then -- Empty (like hand if forearm cut) elseif part_data.is_cut and not part_data.is_amputation_shown then -- Empty (like hand if forearm cut)
name = "media/ui/TOC/Empty.png" name = "media/ui/TOC/Empty.png"
elseif not part_data.is_cut and elseif not part_data.is_cut and
-- TODO This doesn't work in MP on another player since we're trying to retrieve bodyDamage from another player -- FIXME This doesn't work in MP on another player since we're trying to retrieve bodyDamage from another player
getPlayer():getBodyDamage():getBodyPart(TocGetBodyPartFromPartName(part_name)):bitten() then -- Not cut but bitten getPlayer():getBodyDamage():getBodyPart(TocGetBodyPartFromPartName(part_name)):bitten() then -- Not cut but bitten
name = "media/ui/TOC/" .. part_name .. "/Bite.png" name = "media/ui/TOC/" .. part_name .. "/Bite.png"
else -- Not cut else -- Not cut
@@ -288,6 +288,54 @@ local function OnClickTocMainUI(button, args)
end end
-- Generic TOC action, used in OnClickTocDescUI
local function TryTocAction(_, part_name, action, surgeon, patient)
-- TODO at this point surgeon doesnt do anything. We'll fix this later
-- Check if SinglePlayer
if not isServer() and not isClient() then
if action == "Cut" then
TocCutLocal(_, surgeon, part_name)
elseif action == "Operate" then
TocOperateLocal(_, surgeon, part_name, false)
elseif action == "Equip" then
TocEquipProsthesisLocal(_, surgeon, part_name)
elseif action == "Unequip" then
TocUnequipProsthesisLocal(_, surgeon, part_name)
end
else
local ui = GetConfirmUIMP()
if not ui then
CreateTocConfirmUIMP()
ui = GetConfirmUIMP()
end
if patient == nil then
patient = surgeon
end
if action == "Cut" then
AskCanCutLimb(patient, part_name)
elseif action == "Operate" then
AskCanOperateLimb(patient, part_name)
elseif action == "Equip" then
AskCanEquipProsthesis(patient, part_name)
elseif action == "Unequip" then
AskCanUnequipProsthesis(patient, part_name)
end
ui.actionAct = action
ui.partNameAct = part_name
ui.patient = patient
SendCommandToConfirmUIMP("Wait server")
end
end
local function OnClickTocDescUI(button, args) local function OnClickTocDescUI(button, args)
-- Gets every arg from main -- Gets every arg from main
@@ -335,9 +383,7 @@ local function OnClickTocConfirmUIMP(button, args)
-- We can't check if the player has a prosthesis right now, we need to do it later -- 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 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 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 -- 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 if confirm_ui_mp.patient == player then
ISTimedActionQueue.add(ISUninstallProsthesis:new(player, confirm_ui_mp.patient, confirm_ui_mp.partNameAct)) ISTimedActionQueue.add(ISUninstallProsthesis:new(player, confirm_ui_mp.patient, confirm_ui_mp.partNameAct))
@@ -394,8 +440,8 @@ local function CreateTocMainUI()
end end
-- Create a temporary desc UI with fake data (for now)
local function CreateTocDescUI() local function CreateTocDescUI()
-- TODO most of this stuff is just temporary. We can probably wipe this off the face of the earth
desc_ui = NewUI() desc_ui = NewUI()
desc_ui:setTitle("The only cure description"); desc_ui:setTitle("The only cure description");
desc_ui:isSubUIOf(main_ui) desc_ui:isSubUIOf(main_ui)
@@ -428,7 +474,7 @@ local function CreateTocDescUI()
desc_ui:addEmpty() desc_ui:addEmpty()
desc_ui:nextLine() desc_ui:nextLine()
desc_ui:addButton("b1", "Operate", OnClickTocDescUI) -- TODO this is just temporary desc_ui:addButton("b1", "Operate", OnClickTocDescUI)
desc_ui:saveLayout() desc_ui:saveLayout()
end end
@@ -540,6 +586,24 @@ function ISNewHealthPanel.onClick_TOC(button)
Events.OnTick.Add(TocRefreshPlayerMenu) Events.OnTick.Add(TocRefreshPlayerMenu)
end end
-- Set the correct main title
-- TODO sizes of the menu are strange in MP, they're not consistent with SP
local separated_username = {}
for v in string.gmatch(patient:getUsername(), "%u%l+") do
table.insert(separated_username, v)
end
local main_title
if separated_username[1] == nil then
main_title = patient:getUsername() .. " - TOC"
else
main_title = separated_username[1] .. " " .. separated_username[2] .. " - TOC"
end
main_ui:setTitle(main_title)
main_ui:toggle() main_ui:toggle()
main_ui:setInCenterOfScreen() main_ui:setInCenterOfScreen()

View File

@@ -45,16 +45,16 @@ end
----------------------------------------- -----------------------------------------
function CheckIfItemIsAmputatedLimb(item) function CheckIfItemIsAmputatedLimb(item)
-- TODO Benchmark if this is faster
local item_full_type = item:getFullType() local item_full_type = item:getFullType()
local check
if string.find(item_full_type, "TOC.Amputation_") then if string.find(item_full_type, "TOC.Amputation_") then
return true check = true
else else
return false check = false
end end
return check
end end

View File

@@ -22,7 +22,13 @@ function SendCutLimb(player, part_name, surgeon_factor, bandage_table, painkille
arg["From"] = getPlayer():getOnlineID() arg["From"] = getPlayer():getOnlineID()
arg["To"] = player:getOnlineID() arg["To"] = player:getOnlineID()
arg["command"] = "CutLimb" arg["command"] = "CutLimb"
arg["toSend"] = { part_name, surgeon_factor, bandage_table, painkiller_table }
-- TODO Hotfix for sound, fix this later
arg["toSend"] = {part_name, surgeon_factor, bandage_table, painkiller_table, getPlayer():getOnlineID()}
sendClientCommand("TOC", "SendServer", arg) sendClientCommand("TOC", "SendServer", arg)
end end
@@ -100,6 +106,13 @@ end
-- Patient (receive) -- Patient (receive)
Commands["CutLimb"] = function(arg) Commands["CutLimb"] = function(arg)
local arg = arg["toSend"] local arg = arg["toSend"]
local surgeon_id = arg[5]
-- Disable the sound coming from the surgeon
getPlayerByOnlineID(surgeon_id):getEmitter():stopSoundByName("Amputation_Sound")
TocCutLimb(arg[1], arg[2], arg[3], arg[4]) TocCutLimb(arg[1], arg[2], arg[3], arg[4])
end end
@@ -126,7 +139,7 @@ Commands["UnequipProsthesis"] = function(arg)
local arg = arg["toSend"] local arg = arg["toSend"]
TheOnlyCure.UnequipProsthesis(arg[1], arg[2]) TheOnlyCure.TocUnequipProsthesis(arg[1], arg[2])
end end

View File

@@ -109,3 +109,13 @@ function TocGetSawInInventory(surgeon)
player_inv:getItemFromType("Chainsaw") player_inv:getItemFromType("Chainsaw")
return item return item
end end
function TocGetSideFromPartName(part_name)
if string.find(part_name, "Left") then
return "Left"
else
return "Right"
end
end

View File

@@ -22,9 +22,8 @@ local function TocReapplyAmputationClothingItem(mod_data)
end end
-- Gets the old status and turns it into the new.
function TocCheckCompatibilityWithOlderVersions(mod_data) function TocCheckCompatibilityWithOlderVersions(mod_data)
-- Gets the old status and turns it into the new.
if mod_data.TOC.Limbs == nil then if mod_data.TOC.Limbs == nil then
print("TOC: Limbs is nil, setting new mod_data") print("TOC: Limbs is nil, setting new mod_data")

View File

@@ -1,3 +1,8 @@
------------------------------------------
-------- THE ONLY CURE BUT BETTER --------
------------------------------------------
------------ DEBUG FUNCTIONS -------------
-- Side functions -- Side functions
local function TocGetAmputationFullTypeFromInventory(player, side, limb) local function TocGetAmputationFullTypeFromInventory(player, side, limb)
@@ -105,9 +110,15 @@ function TocResetClothingItemBodyLocation(player, side, limb)
prosthesis_item = nil -- reset it prosthesis_item = nil -- reset it
end end
end end
----------------------------------------------------------------------- -----------------------------------------------------------------------
------ TEST FUNCTIONS, DON'T USE THESE!!! ---------------
function TocTestBodyLocations() function TocTestBodyLocations()
local group = BodyLocations.getGroup("Human") local group = BodyLocations.getGroup("Human")

View File

@@ -9,7 +9,7 @@ end
-- Unequip Prosthesis -- Unequip Prosthesis
function PartNameToBodyLocationProsthesis(name) local function PartNameToBodyLocationProsthesis(name)
if name == "Right_Hand" then return "TOC_ArmRightProsthesis" end if name == "Right_Hand" then return "TOC_ArmRightProsthesis" end
if name == "Right_LowerArm" then return "TOC_ArmRightProsthesis" end if name == "Right_LowerArm" then return "TOC_ArmRightProsthesis" end
if name == "Right_UpperArm" then return "TOC_ArmRightProsthesis" end if name == "Right_UpperArm" then return "TOC_ArmRightProsthesis" end
@@ -18,7 +18,7 @@ function PartNameToBodyLocationProsthesis(name)
if name == "Left_UpperArm" then return "TOC_ArmLeftProsthesis" end if name == "Left_UpperArm" then return "TOC_ArmLeftProsthesis" end
end end
function PartNameToBodyLocationAmputation(name) local function PartNameToBodyLocationAmputation(name)
if name == "Right_Hand" then return "TOC_ArmRight" end if name == "Right_Hand" then return "TOC_ArmRight" end
if name == "Right_LowerArm" then return "TOC_ArmRight" end if name == "Right_LowerArm" then return "TOC_ArmRight" end
if name == "Right_UpperArm" then return "TOC_ArmRight" end if name == "Right_UpperArm" then return "TOC_ArmRight" end

View File

@@ -1,3 +1,8 @@
------------------------------------------
-------- THE ONLY CURE BUT BETTER --------
------------------------------------------
------------- INIT FUNCTIONS -------------
if not TheOnlyCure then if not TheOnlyCure then
TheOnlyCure = {} TheOnlyCure = {}
end end
@@ -22,8 +27,6 @@ local function TocCutLimbForTrait(player, limbs_data, part_name)
limbs_data[v].is_cicatrized = true limbs_data[v].is_cicatrized = true
end end
end end
-- Sub function of TocSetInitData
local function TocUpdateBaseData(mod_data) local function TocUpdateBaseData(mod_data)
-- TODO The prosthetic knife needs to be a weapon first and foremost, so other than a -- TODO The prosthetic knife needs to be a weapon first and foremost, so other than a
@@ -197,8 +200,6 @@ local function TocSetInitData(mod_data, player)
end end
function TheOnlyCure.InitTheOnlyCure(_, player) function TheOnlyCure.InitTheOnlyCure(_, player)
local mod_data = player:getModData() local mod_data = player:getModData()
@@ -211,8 +212,7 @@ function TheOnlyCure.InitTheOnlyCure(_, player)
end end
local function TocDeclareTraits()
function TheOnlyCure.DeclareTraits()
local amp1 = TraitFactory.addTrait("Amputee_Hand", getText("UI_trait_Amputee_Hand"), -8, local amp1 = TraitFactory.addTrait("Amputee_Hand", getText("UI_trait_Amputee_Hand"), -8,
getText("UI_trait_Amputee_Hand_desc"), false, false) getText("UI_trait_Amputee_Hand_desc"), false, false)
amp1:addXPBoost(Perks.Left_Hand, 4) amp1:addXPBoost(Perks.Left_Hand, 4)
@@ -232,52 +232,6 @@ function TheOnlyCure.DeclareTraits()
TraitFactory.setMutualExclusive("Amputee_LowerArm", "Amputee_UpperArm") TraitFactory.setMutualExclusive("Amputee_LowerArm", "Amputee_UpperArm")
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
-- Check if SinglePlayer
if not isServer() and not isClient() then
if action == "Cut" then
TocCutLocal(_, surgeon, part_name)
elseif action == "Operate" then
TocOperateLocal(_, surgeon, part_name, false)
elseif action == "Equip" then
TocEquipProsthesisLocal(_, surgeon, part_name)
elseif action == "Unequip" then
TocUnequipProsthesisLocal(_, surgeon, part_name)
end
else
local ui = GetConfirmUIMP()
if not ui then
CreateTocConfirmUIMP()
ui = GetConfirmUIMP()
end
if patient == nil then
patient = surgeon
end
if action == "Cut" then
AskCanCutLimb(patient, part_name)
elseif action == "Operate" then
AskCanOperateLimb(patient, part_name)
elseif action == "Equip" then
AskCanEquipProsthesis(patient, part_name)
elseif action == "Unequip" then
AskCanUnequipProsthesis(patient, part_name)
end
ui.actionAct = action
ui.partNameAct = part_name
ui.patient = patient
SendCommandToConfirmUIMP("Wait server")
end
end
Events.OnCreatePlayer.Add(TheOnlyCure.InitTheOnlyCure) Events.OnCreatePlayer.Add(TheOnlyCure.InitTheOnlyCure)
Events.OnGameBoot.Add(TheOnlyCure.DeclareTraits) Events.OnGameBoot.Add(TocDeclareTraits)

View File

@@ -26,15 +26,8 @@ local function SetCompatibilityFancyHandwork()
local limbs_data = getPlayer():getModData().TOC.Limbs local limbs_data = getPlayer():getModData().TOC.Limbs
local can_be_held = {} local can_be_held = {}
-- TODO not totally realiable
TocPopulateCanBeHeldTable(can_be_held, limbs_data) TocPopulateCanBeHeldTable(can_be_held, limbs_data)
-- for _, test in pairs(can_be_held) do
-- print(test)
-- end
--ISInventoryPaneContextMenu.transferIfNeeded(self.chr, item)
-- If we already have the item equipped -- If we already have the item equipped
if (primary and primary == item) or (secondary and secondary == item) then if (primary and primary == item) or (secondary and secondary == item) then
ISTimedActionQueue.add(ISUnequipAction:new(self.chr, item, 20)) ISTimedActionQueue.add(ISUnequipAction:new(self.chr, item, 20))
@@ -83,7 +76,6 @@ local function SetCompatibilityFancyHandwork()
local og_FHSwapHandsAction = FHSwapHandsAction.start local og_FHSwapHandsAction = FHSwapHandsAction.start
function FHSwapHandsAction:isValid() function FHSwapHandsAction:isValid()
local limbs_data = getPlayer():getModData().TOC.Limbs local limbs_data = getPlayer():getModData().TOC.Limbs
local can_be_held = {} local can_be_held = {}

View File

@@ -17,11 +17,8 @@ function ISBaseTimedAction:adjustMaxTime(maxTime)
-- MOD SUPPORT ACTIONS -- MOD SUPPORT ACTIONS
---------------------- ----------------------
-- LIR -- LIR
if TOC_ModTable.LeftIsRight then if TOC_ModTable.LeftIsRight then
if mod_data.LIR.is_attacking then if mod_data.LIR.is_attacking then
-- TODO we need to check if we're doing that specific action
return original_max_time return original_max_time
end end
end end
@@ -196,3 +193,30 @@ function ISInventoryPaneContextMenu.dropItem(item, player)
end end
end end
-- Make the player unable to equip a tourniquet on an already fully amputated limb
local og_ISWearClothingIsValid = ISWearClothing.isValid
function ISWearClothing:isValid()
local base_check = og_ISWearClothingIsValid(self)
--return self.character:getInventory():contains(self.item);
local item_full_type = self.item:getFullType()
-- TODO Sides
local limbs_data = self.character:getModData().TOC.Limbs
for _, side in pairs(TOC_sides) do
if string.find(item_full_type, "Test_Tourniquet_" .. side) then
if limbs_data[side .. "_UpperArm"].is_cut then
return false
end
end
end
return base_check
end

View File

@@ -1,201 +0,0 @@
------------------------------------------
-------- THE ONLY CURE BUT BETTER --------
------------------------------------------
---------- PROSTHESIS FUNCTIONS ----------
---Equip a prosthesis transforming a normal item into a clothing item
---@param part_name string
---@param prosthesis_base_name string
function TocEquipProsthesis(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
toc_data.Limbs[part_name].equipped_prosthesis = toc_data.Prosthesis[prosthesis_base_name][part_name]
if player:isFemale() then
added_prosthesis:getVisual():setTextureChoice(1)
else
added_prosthesis:getVisual():setTextureChoice(0)
end
player:setWornItem(added_prosthesis:getBodyLocation(), added_prosthesis)
end
end
end
---Unequip a prosthesis clothing item and returns it to the inventory as a normal item
---@param part_name string
function TheOnlyCure.UnequipProsthesis(patient, part_name, equipped_prosthesis)
local toc_data = patient:getModData().TOC
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
patient:getInventory():AddItem("TOC." .. prosthesis_name)
patient:setWornItem(equipped_prosthesis:getBodyLocation(), nil)
patient:getInventory():Remove(equipped_prosthesis)
toc_data.Limbs[part_name].equipped_prosthesis = nil
end
end
end
---------------------------------------------------------------------------------------------
-- TEST MODULAR SYSTEM
---------------------------------------------------------------------------------------------
function TocModular()
-- Should affect comfort, so mobility (equal speed of actions)
local prost_straps = {
"leather_strap", -
"sheet_strap"
}
-- A better base has a better resistance. During use it's gonna break sooner or later so a leather base is the best inbetween
local prost_base_forearm = {
"leather_base_forearm", -- Good resistance and speed
"wood_base_forearm", -- Shitty resistance and low speed
"metal_base_forearm" -- Really high resistance and very low speed
}
local prost_base_hand = {
"wood_base_hand",
"metal_base_hand"
}
local prost_top = {
"metal_hook", -- Decent action speed (around 0.75), good durability, restores hand
"metal_knife", -- Doesn't count as an hand, but substitute the primary attack... Gonna need a way to disable it to make LIR work (retractable)
"wooden_hook", -- Shitty action speed (around 0.3), bad durability, restores hand
"metal_hand" -- Good action speed, amazing durability, restores hand
}
local TOC_straps = {
leather_strap = {
time_modifier = 1,
durability = 1,
},
sheet_strap = {
time_modifier = 0.3,
durability = 0.4
}
}
local TOC_base_lowerarm = {
leather_base = {
durability = 1,
time_modifier = 1
},
wood_base = {
durability = 1,
time_modifier = 1,
},
metal_base = {
durability = 1,
time_modifier = 1,
}
}
local TOC_base_hand = {
wood_base = {
durability = 1,
time_modifier = 1,
},
metal_base = {
durability = 1,
time_modifier = 1,
}
}
local TOC_top = {
metal_hook = {
type = "Normal", -- restores functioning hand
durability = 1,
time_modifier = 1,
},
wooden_hook = {
type = "Normal",
durability = 1,
time_modifier = 1,
},
metal_hand = {
type = "Normal",
durability = 1,
time_modifier = 1,
},
metal_knife = {
type = "Attack"
}
}
-- We need A LOT of recipes... or use another menu from the toc one
-- RECIPES FOR FOREARM = 24 RECIPES in total
-- Would be 48 items in TOC_items since we need them for both sides
-- RECIPES FOR HAND = 8 RECIPES in total
-- Would be in total 16 items
-- TOTAL = 64 ITEMS and 32 RECIPES
-- Leather strap + leather base forearm + metal hook
-- Base Item that can be crafted\found
-- Different type of hooks
-- Addons that can be added to the base item
-- Equip and unequip pretty much the same
end

View File

@@ -49,9 +49,6 @@ local function TocManagePhantomPain(player, toc_data)
end end
end end
-- TODO Add phantom pain to depended parts
end end
@@ -85,9 +82,9 @@ local function SetHealthStatusForBodyPart(part_data, part_name, player)
-- Check for stitching -- Check for stitching
local is_stitched = false local is_stitched = false -- TODO Implement this
-- TODO Implement this
if part_data[part_name].is_cut then if part_data[part_name].is_cut then
--print("TOC: Check update for " .. part_name) --print("TOC: Check update for " .. part_name)
@@ -162,8 +159,6 @@ end
local function UpdatePlayerHealth(player, part_data) local function UpdatePlayerHealth(player, part_data)
local body_damage = player:getBodyDamage() local body_damage = player:getBodyDamage()
if player:HasTrait("Insensitive") then body_damage:setPainReduction(49) end if player:HasTrait("Insensitive") then body_damage:setPainReduction(49) end
for _, part_name in pairs(GetBodyParts()) do for _, part_name in pairs(GetBodyParts()) do
@@ -253,7 +248,7 @@ local function TocUpdateEveryOneMinute()
-- Updates toc data in a global way, basically player:transmitModData but it works -- Updates toc data in a global way, basically player:transmitModData but it works
-- Sends only Limbs since the other stuff is mostly static -- Sends only Limbs since the other stuff is mostly static
if toc_data ~= nil then if toc_data ~= nil then
-- TODO make it so that we dont send it constantly -- FIXME Send little packets instead of the whole thing?
sendClientCommand(player, 'TOC', 'ChangePlayerState', { toc_data.Limbs } ) sendClientCommand(player, 'TOC', 'ChangePlayerState', { toc_data.Limbs } )
end end

View File

@@ -2,7 +2,6 @@ require "TimedActions/ISBaseTimedAction"
ISCutLimb = ISBaseTimedAction:derive("ISCutLimb") ISCutLimb = ISBaseTimedAction:derive("ISCutLimb")
-- TODO Add a check so you can't cut your arm if you don't have hands or if you only have one arm and want to cut that same arm.
function ISCutLimb:isValid() function ISCutLimb:isValid()
return self.patientX == self.patient:getX() and self.patientY == self.patient:getY() return self.patientX == self.patient:getX() and self.patientY == self.patient:getY()
@@ -24,7 +23,7 @@ end
function ISCutLimb:stop() function ISCutLimb:stop()
self.character:getEmitter():stopSoundByName("Amputation_Sound") self.surgeon:getEmitter():stopSoundByName("Amputation_Sound")
end end
@@ -33,10 +32,11 @@ end
function ISCutLimb:start() function ISCutLimb:start()
-- TODO Add a check so you can't cut your arm if you don't have hands or if you only have one arm and want to cut that same arm.
self:setActionAnim("SawLog") self:setActionAnim("SawLog")
local saw_item = TocGetSawInInventory(self.surgeon) local saw_item = TocGetSawInInventory(self.surgeon)
self.sound = self.character:getEmitter():playSound("Amputation_Sound") self.surgeon:getEmitter():playSound("Amputation_Sound")
-- Return whatever object we've got in the inventory -- Return whatever object we've got in the inventory
if self.surgeon:getPrimaryHandItem() then if self.surgeon:getPrimaryHandItem() then
@@ -119,7 +119,7 @@ function ISCutLimb:perform()
TocCutLimb(self.part_name, surgeon_factor, bandage_table, painkiller_table) TocCutLimb(self.part_name, surgeon_factor, bandage_table, painkiller_table)
end end
self.character:getEmitter():stopSoundByName("Amputation_Sound") self.surgeon:getEmitter():stopSoundByName("Amputation_Sound")
self.surgeon:getXp():AddXP(Perks.Doctor, 400) self.surgeon:getXp():AddXP(Perks.Doctor, 400)
ISBaseTimedAction.perform(self) ISBaseTimedAction.perform(self)
@@ -131,7 +131,7 @@ function ISCutLimb:new(patient, surgeon, part_name)
local o = {} local o = {}
setmetatable(o, self) -- TODO what's this crap? setmetatable(o, self)
self.__index = self self.__index = self
o.part_name = part_name o.part_name = part_name
o.character = surgeon -- For anim o.character = surgeon -- For anim

View File

@@ -23,7 +23,7 @@ end
function ISOperateLimb:start() function ISOperateLimb:start()
self:setActionAnim("MedicalCheck") self:setActionAnim("MedicalCheck")
if self.use_oven then if self.use_oven then
self.sound = self.patient:getEmitter():playSound("Burn_sound") -- TODO currently broken, but maybe that's good self.sound = self.patient:getEmitter():playSound("Burn_sound")
self:forceComplete() self:forceComplete()
end end
end end
@@ -63,7 +63,6 @@ function ISOperateLimb:perform()
end end
self.surgeon:getXp():AddXP(Perks.Doctor, 400) self.surgeon:getXp():AddXP(Perks.Doctor, 400)
-- FIXME Add a check for kit to prevent errors
if self.kit and not use_oven then if self.kit and not use_oven then
self.surgeon:getInventory():Remove(self.kit) self.surgeon:getInventory():Remove(self.kit)
end end

View File

@@ -58,7 +58,7 @@ function ISUninstallProsthesis:perform()
SendUnequipProsthesis(self.patient, self.part_name, self.item) SendUnequipProsthesis(self.patient, self.part_name, self.item)
else else
TheOnlyCure.UnequipProsthesis(self.patient, self.part_name, self.item) TheOnlyCure.TocUnequipProsthesis(self.patient, self.part_name, self.item)
end end
ISBaseTimedAction.perform(self) ISBaseTimedAction.perform(self)

View File

@@ -4,7 +4,7 @@ local function addBodyLocationBefore(new_location, move_to_location)
group:getOrCreateLocation(new_location) group:getOrCreateLocation(new_location)
local new_item = list:get(list:size()-1) local new_item = list:get(list:size()-1)
print("TOC: Created new body location" .. new_item:getId()) print("TOC: Created new body location" .. new_item:getId())
list:remove(new_item) list:remove(new_item) -- We can't use the Index, it works if we pass the item though!
local i = group:indexOf(move_to_location) local i = group:indexOf(move_to_location)
list:add(i, new_item) list:add(i, new_item)
end end
@@ -20,4 +20,4 @@ addBodyLocationBefore("TOC_ArmRightProsthesis", "Shoes")
addBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes") addBodyLocationBefore("TOC_ArmLeftProsthesis", "Shoes")
addBodyLocationBefore("TOC_LegRightProsthesis", "Shoes") addBodyLocationBefore("TOC_LegRightProsthesis", "Shoes")
addBodyLocationBefore("TOC_LegLeftProsthesis", "Shoes") addBodyLocationBefore("TOC_LegLeftProsthesis", "Shoes")

View File

@@ -1,4 +1,8 @@
ContextMenu_EN = { ContextMenu_EN = {
ContextMenu_Cut_Arm = "Cut arm", ContextMenu_Cut_Arm = "Cut arm",
ContextMenu_Operate_Arm = "Operate arm", ContextMenu_Operate_Arm = "Operate arm",
ContextMenu_TourniquetRightSwitch = "Tourniquet on Right Arm",
ContextMenu_TourniquetLeftSwitch = "Tourniquet on Left Arm",
} }

View File

@@ -6,4 +6,9 @@ Sandbox_EN = {
Sandbox_TOC_CicatrizationSpeedMultiplier = "Cicatrization speed multiplier", Sandbox_TOC_CicatrizationSpeedMultiplier = "Cicatrization speed multiplier",
Sandbox_TOC_CicatrizationSpeedMultiplier_tooltip = "Customize this to make the cicatrization process faster", Sandbox_TOC_CicatrizationSpeedMultiplier_tooltip = "Customize this to make the cicatrization process faster",
Sandbox_TOC_AmputationTimeMultiplier = "Amputation Time Scaler",
Sandbox_TOC_AmputationTimeMultiplier_tooltip = "Scales the amount of time multplying added after amputation"
} }

Binary file not shown.

Binary file not shown.

View File

@@ -20,4 +20,16 @@ option TOC.CicatrizationSpeedMultiplier
page = TOC, page = TOC,
translation = TOC_CicatrizationSpeedMultiplier, translation = TOC_CicatrizationSpeedMultiplier,
}
option TOC.AmputationTimeMultiplier
{
type = integer,
min = 1,
max = 10,
default = 1,
page = TOC,
translation = TOC_AmputationTimeMultiplier
} }

View File

@@ -441,6 +441,44 @@ item ProthesisMag3
Tooltip = Tooltip_ProthesisMag2, Tooltip = Tooltip_ProthesisMag2,
} }
item Surgery_Left_Tourniquet
{
Weight = 1,
Type = Clothing,
DisplayCategory = Surgery,
DisplayName = Tourniquet - Left Arm,
ClothingItem = Surgery_Left_Tourniquet,
BodyLocation = Hands,
Icon = tourniquet,
BloodLocation = Hands,
ClothingItemExtra = Surgery_Right_Tourniquet,
ClothingItemExtraOption = TourniquetRightSwitch,
clothingExtraSubmenu = TourniquetLeftSwitch,
Tooltip = Test,
CanHaveHoles = false,
}
item Surgery_Right_Tourniquet
{
Weight = 1,
Type = Clothing,
DisplayCategory = Surgery,
DisplayName = Tourniquet - Right Arm,
ClothingItem = Surgery_Right_Tourniquet,
BodyLocation = Hands,
Icon = tourniquet,
BloodLocation = Hands,
ClothingItemExtra = Surgery_Left_Tourniquet,
ClothingItemExtraOption = TourniquetLeftSwitch,
clothingExtraSubmenu = TourniquetRightSwitch,
Tooltip = Test,
CanHaveHoles = false,
}
item Amputation_Left_Foot item Amputation_Left_Foot
{ {
Weight = 1, Weight = 1,
@@ -456,4 +494,7 @@ item Amputation_Left_Foot
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

View File

@@ -1,401 +0,0 @@
/* LOWERARM POSSIBLE PROSTHESIS COMBINATIONS */
/* Leather strap, leather base, metal hand */
item ProstLowerArm_LeatherStrap_LeatherBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Wooden base, metal hand */
item ProstLowerArm_LeatherStrap_WoodenBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Metal base, metal hand */
item ProstLowerArm_LeatherStrap_MetalBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, leather base, Metal Hook */
item ProstLowerArm_LeatherStrap_LeatherBase_MetalHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Wooden base, Metal Hook */
item ProstLowerArm_LeatherStrap_WoodenBase_MetalHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Metal base, Metal Hook */
item ProstLowerArm_LeatherStrap_MetalBase_Metalook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, leather base, Metal Knife */
item ProstLowerArm_LeatherStrap_LeatherBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Wooden base, Metal Knife */
item ProstLowerArm_LeatherStrap_WoodenBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Metal base, Metal Knife */
item ProstLowerArm_LeatherStrap_MetalBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, leather base, Wooden Hook */
item ProstLowerArm_LeatherStrap_LeatherBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Wooden base, Wooden Hook */
item ProstLowerArm_LeatherStrap_WoodenBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Leather strap, Metal base, Wooden Hook */
item ProstLowerArm_LeatherStrap_MetalBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, leather base, metal hand */
item ProstLowerArm_LeatherStrap_LeatherBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Wooden base, metal hand */
item ProstLowerArm_SheetStrap_WoodenBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Metal base, metal hand */
item ProstLowerArm_SheetStrap_MetalBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, leather base, Metal Hook */
item ProstLowerArm_SheetStrap_LeatherBase_MetalHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Wooden base, Metal Hook */
item ProstLowerArm_SheetStrap_WoodenBase_MetalHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Metal base, Metal Hook */
item ProstLowerArm_SheetStrap_MetalBase_Metalook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, leather base, Metal Knife */
item ProstLowerArm_SheetStrap_LeatherBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Wooden base, Metal Knife */
item ProstLowerArm_SheetStrap_WoodenBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Metal base, Metal Knife */
item ProstLowerArm_SheetStrap_MetalBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, leather base, Wooden Hook */
item ProstLowerArm_SheetStrap_LeatherBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Wooden base, Wooden Hook */
item ProstLowerArm_SheetStrap_WoodenBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Sheet strap, Metal base, Wooden Hook */
item ProstLowerArm_SheetStrap_MetalBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* HANDS POSSIBLE PROSTHESIS COMBINATIONS */
/* Wooden Base, Metal Hand */
item ProstHand_WoodenBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Wooden Base, Metal Hook */
item ProstHand_WoodenBase_MetalHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Wooden Base, Metal Knife */
item ProstHand_WoodenBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Wooden Base, Wooden Hook */
item ProstHand_WoodenBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Metal Base, Metal Hand */
item ProstHand_MetalBase_MetalHand
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Metal Base, Metal Hook */
item ProstHand_MetalBase_MetalHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Metal Base, Metal Knife */
item ProstHand_MetalBase_MetalKnife
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}
/* Metal Base, Wooden Hook */
item ProstHand_MetalBase_WoodenHook
{
Weight = 1,
Type = Normal,
DisplayCategory = Prosthesis,
DisplayName = DisplayName_WoodenHook,
Icon = woodenHook,
Tooltip = Tooltip_prosthesic_limb,
WorldStaticModel = TOC.WoodenHook,
}