From 49fa5b3f62352b12d3f2a6e709abf5049f304425 Mon Sep 17 00:00:00 2001 From: Pao Date: Sat, 11 Feb 2023 03:34:20 +0100 Subject: [PATCH] forgot to reneable stuff and more things in preparation for modular prost --- media/lua/client/TOC_OverridenFunctions.lua | 32 +++++------- media/lua/client/TOC_ProsthesisHandler.lua | 6 +-- python_helpers/main.py | 52 ++++++++++++++++---- python_helpers/modules_prost.xlsx | Bin 27661 -> 31029 bytes 4 files changed, 56 insertions(+), 34 deletions(-) diff --git a/media/lua/client/TOC_OverridenFunctions.lua b/media/lua/client/TOC_OverridenFunctions.lua index 13f7f3c..3ff974f 100644 --- a/media/lua/client/TOC_OverridenFunctions.lua +++ b/media/lua/client/TOC_OverridenFunctions.lua @@ -72,17 +72,14 @@ function ISInventoryPane:onMouseDoubleClick(x, y) local item_to_check = self.items[self.mouseOverOption] local player_inventory = getPlayerInventory(self.player).inventory ------------------------------------------------------------------------------------ - -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT ------------------------------------------------------------------------------------ - -- if instanceof(item_to_check, "InventoryItem") then - -- og_ISInventoryPaneOnMouseDoubleClick(self, x, y) - -- elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then - -- --print("TOC: Can't double click this item") - -- else - -- end + if instanceof(item_to_check, "InventoryItem") then + og_ISInventoryPaneOnMouseDoubleClick(self, x, y) + elseif CheckIfItemIsAmputatedLimb(item_to_check.items[1]) or CheckIfItemIsInstalledProsthesis(item_to_check.items[1]) then + --print("TOC: Can't double click this item") + + end og_ISInventoryPaneOnMouseDoubleClick(self, x, y) @@ -96,17 +93,12 @@ function ISInventoryPane.getActualItems(items) local ret = og_ISInventoryPaneGetActualItems(items) -- This is gonna be slower than just overriding the function but hey it's more compatible ------------------------------------------------------------------------------------ - -- TODO THIS IS DISABLED ONLY FOR TEST!!!!! REMEMBER TO RESTORE IT ------------------------------------------------------------------------------------ - - - -- for i = 1, #ret do - -- local item_full_type = ret[i]:getFullType() - -- if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then - -- table.remove(ret, i) - -- end - -- end + for i = 1, #ret do + local item_full_type = ret[i]:getFullType() + if string.find(item_full_type, "Amputation_") or string.find(item_full_type, "Prost_") then + table.remove(ret, i) + end + end return ret end diff --git a/media/lua/client/TOC_ProsthesisHandler.lua b/media/lua/client/TOC_ProsthesisHandler.lua index 5489ba2..d5dc025 100644 --- a/media/lua/client/TOC_ProsthesisHandler.lua +++ b/media/lua/client/TOC_ProsthesisHandler.lua @@ -32,6 +32,8 @@ function GenerateEquippedProsthesis(prosthesis_item, limb) -- TODO Durability should be decided from the clothing item xml. Same thing for disassembling stuff -- TODO some stuff should be defined by the limb, like -10 if forearm in speed +-- -- when we equip a prosthesis, we're gonna pass these parameters to the newly generated clothing item +-- -- when we unequip it, we regen the normal item with the parameters from the clothing item local durability = 0 local speed = 0 @@ -80,10 +82,6 @@ end -- -- Set mod data for item with durability and all that crap --- -- when we equip a prosthesis, we're gonna pass these parameters to the newly generated clothing item - --- -- when we unequip it, we regen the normal item with the parameters from the clothing item - -- end diff --git a/python_helpers/main.py b/python_helpers/main.py index 2da21dc..566c62c 100644 --- a/python_helpers/main.py +++ b/python_helpers/main.py @@ -1,8 +1,10 @@ import lxml.etree as gfg import pandas as pd +import numpy as np +import openpyxl -def generate_clothing_item(model, texture_choices, guid = None): +def generate_clothing_item(name, part, model, texture_choices, guid = None): root = gfg.Element("clothingItem") m_MaleModel = gfg.Element("m_MaleModel") @@ -23,21 +25,24 @@ def generate_clothing_item(model, texture_choices, guid = None): m_Static = gfg.Element("m_Static") m_Static.text = "false" + root.append(m_Static) m_AllowRandomTint = gfg.Element("m_AllowRandomTint") m_AllowRandomTint.text = "false" + root.append(m_AllowRandomTint) # TODO Defined by the amount of textures that we're gonna pass for tex in texture_choices: - textureChoices = gfg.Element("textureChoices") textureChoices.text = tex + root.append(textureChoices) tree = gfg.ElementTree(root) - with open("Test_Name.xml", "wb") as file: - tree.write(file, encoding='utf-8', xml_declaration=True, pretty_print=True ) + path = r'output_clothing/Prost_' + part + "_" + name + ".xml" + with open(path, "wb") as file: + tree.write(file, encoding='utf-8', xml_declaration=True, pretty_print=True ) def generate_recipe(recipe_name, recipe_items, result_name, time, skill_required, tooltip): # TODO Simple txt, so strings should be fine. @@ -65,8 +70,6 @@ def generate_recipe(recipe_name, recipe_items, result_name, time, skill_required file.write(root_element) file.close() - - def generate_item(item_name, weight, item_type, display_category, display_name, icon, tooltip, can_have_holes, clothing_item=None, body_location = None, blood_location = None): # TODO This is a txt, so we're gonna use simple strings I guess print("Generating item") @@ -97,10 +100,39 @@ def generate_item(item_name, weight, item_type, display_category, display_name, file.close() ########################################################################################### +def read_table(file_name: str, table_name: str) -> pd.DataFrame: + wb = openpyxl.load_workbook(file_name, read_only= False, data_only = True) # openpyxl does not have table info if read_only is True; data_only means any functions will pull the last saved value instead of the formula + for sheetname in wb.sheetnames: # pulls as strings + sheet = wb[sheetname] # get the sheet object instead of string + if table_name in sheet.tables: # tables are stored within sheets, not within the workbook, although table names are unique in a workbook + tbl = sheet.tables[table_name] # get table object instead of string + tbl_range = tbl.ref #something like 'C4:F9' + break # we've got our table, bail from for-loop + data = sheet[tbl_range] # returns a tuple that contains rows, where each row is a tuple containing cells + content = [[cell.value for cell in row] for row in data] # loop through those row/cell tuples + header = content[0] # first row is column headers + rest = content[1:] # every row that isn't the first is data + df = pd.DataFrame(rest, columns = header) + wb.close() + return df + +########################################################################################### + +excel_path = r'python_helpers/modules_prost.xlsx' +df_base = read_table(excel_path, "BaseTable") +df_top = read_table(excel_path, "TopTable") + +for base_row in df_base.iterrows(): + for top_row in df_top.iterrows(): + base_name = base_row[1][0] + top_name = top_row[1][0] + + current_name = base_name + "_" + top_name + generate_clothing_item(current_name, "LowerArm", "test", {"test1", "test2"}, "123") + + -forearm_data = pd.read_excel('modules_prost.xlsx', sheet_name = "Forearm") -data = pd.DataFrame(excel_data, columns) @@ -118,7 +150,7 @@ time = 10 skill_required = ["Carpentry", "4"] tooltip = "tooltip_test" -generate_recipe(recipe_name, recipe_items, result_name, time, skill_required, tooltip) +#generate_recipe(recipe_name, recipe_items, result_name, time, skill_required, tooltip) item_name = "Ass Ass Ass" @@ -129,4 +161,4 @@ display_name = "Ass cock" clothing_item = "ClothingItemSomethingProst" body_location = "TOC_ArmRightProsthesis" -generate_item(item_name, weight, item_type, display_category, display_name, "test_icon", "test_tooltip", "false", clothing_item, body_location, "Hands") \ No newline at end of file +#generate_item(item_name, weight, item_type, display_category, display_name, "test_icon", "test_tooltip", "false", clothing_item, body_location, "Hands") \ No newline at end of file diff --git a/python_helpers/modules_prost.xlsx b/python_helpers/modules_prost.xlsx index 27265b1f0f9ec555ce4c988ac6528f85783ebeec..f0e7b33fc602f0bfdb7279c824ceaf9c11f1500c 100644 GIT binary patch delta 7028 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 delta 4412 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