using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using UnityEngine.EventSystems; public class craftingUISystem : ingameMenuPanel { [Header ("Main Settings")] [Space] public bool spawnObjectButtonsEnabled = true; public int amountOfObjectButtonsToSpawn = 50; public int amountOfIngredientsButtonsToSpawn = 50; public int amountOfInventoryButtonsToSpawn = 100; public int amountOnRepareIngredientsButtonsToSpawn = 30; public int amountOfObjectStatsButtonToSpawn = 0; public int amountOfObjectToCraftInTimeButtonToSpawn = 20; public int amountOfDisassembleIngredientsToSpawn = 20; [Space] [Header ("Workbench Settings")] [Space] public bool craftingMenuOnlyUsableOnWorkbenchesEnabled; public bool repairObjectsOnlyOnWorkbenchEnabled; public bool disassembleObjectsOnlyOnWorkbenchEnabled; public bool upgradeObjectsOnlyOnWorkbencheEnabled; [Space] [Header ("Crafting Template Settings")] [Space] public List craftingBlueprintInfoTemplateDataList = new List (); [Space] [Header ("UI Panel Settings")] [Space] public List panelCategoryInfoList = new List (); [Space] [Header ("Message Settings")] [Space] [TextArea (3, 5)] public string messageOnObjectCreated; [TextArea (3, 5)] public string messageOnUnableToCreateObject; [TextArea (3, 5)] public string messageOnObjectRepaired; [TextArea (3, 5)] public string messageOnUnableToRepairObject; [TextArea (3, 5)] public string messageOnObjectDisassembled; [TextArea (3, 5)] public string messageOnObjectInProcess = "-OBJECT- creation in process."; [Space] [TextArea (3, 5)] public string messageOnUnableToCreateObjectFromStats; [TextArea (3, 5)] public string messageToShowObjectStats; [Space] public string objectNameField = "-OBJECT-"; public string objectAmountField = "-AMOUNT-"; public string objectStatsField = "-STATS-"; [Space] [Header ("Blueprints/recipes unlocked")] [Space] public bool useOnlyBlueprintsUnlocked; public List blueprintsUnlockedList = new List (); [Space] [Header ("Other Settings")] [Space] public bool repairObjectsOnlyIfFullyBroken = true; public bool useUpgradePanelEnabled = true; public bool ignoreStatsOnCraftObjectsEnabled; public bool showObjectStatsOnSelectObject; [Space] [Header ("Debug")] [Space] public bool showDebugPrint; public bool showingInventoryList; public bool showAllCategoriesActive = true; public bool mainCraftingSystemAssigned; public bool componentsAssigned; public bool menuOpened; public int currentAmountToCreate = 1; public string currentObjectSelectedName; public string currentObjectCategorySelectedName; public int currentObjectSelectedIndex; public bool objectFilterActive; public bool currentObjectIsBroken; public bool currentObjectCanbeDisassembled; public bool currentObjectCanBePlaced; public bool upgradePanelActive; [Space] [Header ("Current Workbench Debug")] [Space] public bool menuOpenedFromWorkbench; public bool allowToCraftAllObjectsOnCurrentBench; public List objectCategoriesToCraftAvailableOnCurrentBench = new List (); public craftingWorkbenchSystem currentCraftingWorkbenchSystem; [Space] [Header ("Object List Debug")] [Space] public List craftingObjectButtonInfoList = new List (); public List currentObjectIngredientsInfoList = new List (); public List currentInventoryInfoList = new List (); public List currentRepairIngredientsInfoList = new List (); public List currentCraftObjectInTimeInfoList = new List (); public List objectStatButtonInfoList = new List (); public List currentDisassembleIngredientsInfoList = new List (); [Space] public List craftObjectInTimeInfoList = new List (); [Space] [Header ("Events Settings")] [Space] public UnityEvent eventOnShowInventoryList; public UnityEvent eventOnShowBlueprintList; [Space] public bool useEventOnShowObjectPanelInfo; public UnityEvent eventOnShowObjectPanelInfo; [Space] public bool useEventOnShowPressedObjectInfo; public UnityEvent eventOnShowPressedObjectInfo; [Space] public UnityEvent eventOnOpenUpgradeObjectPanel; public UnityEvent eventOnCloseUpgradeObjectPanel; [Space] public eventParameters.eventToCallWithString eventOnObjectCreated; public eventParameters.eventToCallWithString eventOnObjectNotCreated; public eventParameters.eventToCallWithString eventOnObjectRepaired; public eventParameters.eventToCallWithString eventOnObjectDisassembled; public eventParameters.eventToCallWithString eventOnShowObjectStats; [Space] [Header ("Components")] [Space] public craftingSystem mainCraftingSystem; [Space] [Header ("UI Components")] [Space] public GameObject craftingButtonInfoPrefab; public Text currentObjectNameText; public Text currentObjectDescriptionText; public Text currentAmountOfObjectsSelectedText; public InputField searcherInputField; public Text currentObjectCategoryNameText; public RectTransform craftingButtonInfoPanelList; public RawImage currentObjectSelectedImage; public GameObject craftObjectPanel; public GameObject disassembleButton; public GameObject repairButton; public GameObject repairIngredientsPanel; public GameObject disassembleIngredientsPanel; [Space] [Header ("UI Repair Components")] [Space] public RectTransform repairPanelList; public GameObject repairPanelListElementPrefab; [Space] [Header ("UI Place Object Components")] [Space] public GameObject placeObjectButton; [Space] [Header ("UI Hover Components")] [Space] public RectTransform hoverBlueprintPanel; public RectTransform hoverBlueprintPanelList; public GameObject hoverBlueprintPanelListElementPrefab; [Space] [Header ("UI Upgrade Components")] [Space] public GameObject upgradeButton; public GameObject upgradePanel; public RectTransform objectStatsPanelList; public GameObject objectStatPanelListElementPrefab; [Space] [Header ("UI Craft Objects In Time Components")] [Space] public RectTransform craftObjectsInTimePanelList; public GameObject craftObjectsInTimePanelListElementPrefab; [Space] [Header ("Inventory Components")] [Space] public RectTransform inventoryPanelList; public GameObject inventoryPanelListElementPrefab; [Space] [Header ("Disassemble Ingredients Components")] [Space] public RectTransform disassembleIngredientsPanelList; public GameObject isassembleIngredientsPanelListElementPrefab; GameObject currentButtonObjectPressed; bool UIElementSpawned; craftingObjectButtonInfo currentButtonInfo; GameObject currentObjectMesh; bool unableToCreateObjectsFromStatsActive; void Start () { if (!mainCraftingSystemAssigned) { if (mainCraftingSystem != null) { mainCraftingSystemAssigned = true; } } } public void showInventoryList () { showingInventoryList = true; eventOnShowInventoryList.Invoke (); updateCategoryObjectPanelInfo (); selectFirstCategoryPanel (); disassembleButton.SetActive (true); repairButton.SetActive (true); } public void showBlueprintList () { showingInventoryList = false; showAllCategoriesActive = true; repairIngredientsPanel.SetActive (false); disassembleIngredientsPanel.SetActive (false); eventOnShowBlueprintList.Invoke (); updateCategoryObjectPanelInfo (); selectFirstCategoryPanel (); placeObjectButton.SetActive (false); disassembleButton.SetActive (false); repairButton.SetActive (false); setCraftObjectPanelActiveState (true); } void setCraftObjectPanelActiveState (bool state) { if (craftObjectPanel != null) { if (craftObjectPanel.activeSelf != state) { craftObjectPanel.SetActive (state); } } } //Upgrade Functions public void showUpgradePanel () { if (!useUpgradePanelEnabled) { return; } upgradePanelActive = true; eventOnOpenUpgradeObjectPanel.Invoke (); upgradePanel.SetActive (true); } public void closeUpgradePanel () { if (!useUpgradePanelEnabled) { return; } upgradePanelActive = false; eventOnCloseUpgradeObjectPanel.Invoke (); upgradePanel.SetActive (false); } void updateObjectStatsPanelListInfo () { for (int i = 0; i < objectStatButtonInfoList.Count; i++) { objectStatButtonInfo currentObjectStatButtonInfo = objectStatButtonInfoList [i]; if (currentObjectStatButtonInfo.buttonGameObject.activeSelf) { currentObjectStatButtonInfo.buttonGameObject.SetActive (false); currentObjectStatButtonInfo.objectAssigned = false; } } List objectStatInfoList = mainCraftingSystem.getStatsFromObjectByName (currentObjectSelectedName); if (objectStatInfoList != null && objectStatInfoList.Count > 0) { if (showDebugPrint) { print ("list of stats found " + objectStatInfoList.Count); } for (int i = 0; i < objectStatInfoList.Count; i++) { int currentAmount = mainCraftingSystem.getInventoryObjectAmountByName (objectStatInfoList [i].Name); if (currentAmount < 0) { currentAmount = 0; } objectStatButtonInfo currentObjectStatButtonInfo = objectStatButtonInfoList [i]; currentObjectStatButtonInfo.buttonGameObject.SetActive (true); currentObjectStatButtonInfo.objectAssigned = true; currentObjectStatButtonInfo.statNameText.text = objectStatInfoList [i].Name; currentObjectStatButtonInfo.statImage.texture = objectStatInfoList [i].statIcon; if (currentObjectStatButtonInfo.statSlider.gameObject.activeSelf != objectStatInfoList [i].statIsAmount) { currentObjectStatButtonInfo.statSlider.gameObject.SetActive (objectStatInfoList [i].statIsAmount); currentObjectStatButtonInfo.statValueText.gameObject.SetActive (objectStatInfoList [i].statIsAmount); } if (currentObjectStatButtonInfo.statToggle.gameObject.activeSelf == objectStatInfoList [i].statIsAmount) { currentObjectStatButtonInfo.statToggle.gameObject.SetActive (objectStatInfoList [i].statIsAmount); } if (objectStatInfoList [i].statIsAmount) { currentObjectStatButtonInfo.statValueText.text = objectStatInfoList [i].currentFloatValue.ToString (); currentObjectStatButtonInfo.statSlider.value = objectStatInfoList [i].currentFloatValue; currentObjectStatButtonInfo.statSlider.maxValue = objectStatInfoList [i].maxFloatValue; } else { currentObjectStatButtonInfo.statToggle.isOn = objectStatInfoList [i].currentBoolState; } } } } public void setShowAllObjectsOrOnlyAvailableToCreate (bool state) { if (state) { } else { } } public void repairCurrentObjectSelectedOnInventoryMenu () { int objectIndex = mainCraftingSystem.getCurrentInventoryObjectIndex (); if (objectIndex != -1) { repairObjectExternallyByIndex (objectIndex); } } public void repairObjectExternallyByIndex (int objectIndex) { inventoryInfo currentInventoryInfo = mainCraftingSystem.getInventoryInfoByIndex (objectIndex); if (showDebugPrint) { print ("Checking to repair object " + objectIndex); } if (currentInventoryInfo.objectIsBroken) { if (showDebugPrint) { print ("Object is broken, sending to repair"); } currentObjectIsBroken = true; currentObjectCategorySelectedName = currentInventoryInfo.categoryName; currentObjectSelectedName = currentInventoryInfo.Name; currentObjectSelectedIndex = objectIndex; bool activateRepairObjectResult = activateRepairObject (currentObjectCategorySelectedName, currentObjectSelectedName); mainCraftingSystem.updateUIAfterRepairingCurrentObjectSelectedOnInventoryMenu (activateRepairObjectResult); if (activateRepairObjectResult) { if (showDebugPrint) { print ("Object repaired, updating UI"); } } } } public void repairObject () { if (currentObjectIsBroken) { if (currentButtonInfo != null) { activateRepairObject (currentButtonInfo.objectCategoryName, currentButtonInfo.objectName); } } } bool activateRepairObject (string objectCategoryName, string objectName) { if (canObjectBeRepaired (objectCategoryName, objectName)) { if (showDebugPrint) { print ("Object can be repaired " + objectName); } int currentCategoryIndex = craftingBlueprintInfoTemplateDataList.FindIndex (s => s.Name.Equals (currentObjectCategorySelectedName)); if (currentCategoryIndex > -1) { int currentIndex = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList.FindIndex (s => s.Name.Equals (currentObjectSelectedName)); if (currentIndex > -1) { List repairIngredientObjectInfoList = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex].repairIngredientObjectInfoList; for (int i = 0; i < repairIngredientObjectInfoList.Count; i++) { mainCraftingSystem.removeObjectAmountFromInventoryByName (repairIngredientObjectInfoList [i].Name, repairIngredientObjectInfoList [i].amountRequired); } } } if (mainCraftingSystem.repairDurabilityObjectByIndex (currentObjectSelectedIndex)) { if (showDebugPrint) { print ("repair successful " + objectName); } string newMessage = messageOnObjectRepaired; if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, currentObjectSelectedName); } eventOnObjectRepaired.Invoke (newMessage); selectFirstCategoryPanel (); mainCraftingSystem.checkStateOnCraftObject (); return true; } } else { string newMessage = messageOnUnableToRepairObject; if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, currentObjectSelectedName); } eventOnObjectRepaired.Invoke (newMessage); if (showDebugPrint) { print ("Object can't be repaired " + objectName); } } return false; } public void disassembleObject () { if (currentObjectCanbeDisassembled) { mainCraftingSystem.removeObjectAmountFromInventoryByIndex (currentObjectSelectedIndex, 1); int currentCategoryIndex = craftingBlueprintInfoTemplateDataList.FindIndex (s => s.Name.Equals (currentObjectCategorySelectedName)); if (currentCategoryIndex > -1) { int currentIndex = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList.FindIndex (s => s.Name.Equals (currentObjectSelectedName)); if (currentIndex > -1) { List currentIngredientObjectInfoList = null; if (currentObjectIsBroken) { currentIngredientObjectInfoList = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex].brokenIngredientObjectInfoList; } else { currentIngredientObjectInfoList = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex].disassembleIngredientObjectInfoList; } for (int i = 0; i < currentIngredientObjectInfoList.Count; i++) { mainCraftingSystem.giveInventoryObjectToCharacter (currentIngredientObjectInfoList [i].Name, currentIngredientObjectInfoList [i].amountRequired); } } } string newMessage = messageOnObjectDisassembled; if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, currentObjectSelectedName); } eventOnObjectDisassembled.Invoke (newMessage); if (showingInventoryList) { showInventoryList (); } else { showBlueprintList (); } mainCraftingSystem.checkStateOnCraftObject (); } } public void checkShowAllObjectsByFilter () { string currentTextToSearch = searcherInputField.text; if (currentTextToSearch != "") { currentTextToSearch = currentTextToSearch.ToLower (); print (currentTextToSearch); if (showingInventoryList) { for (int i = 0; i < currentInventoryInfoList.Count; i++) { craftingObjectButtonInfo currentInventoryInfo = currentInventoryInfoList [i]; if (currentInventoryInfo.buttonGameObject.activeSelf) { currentInventoryInfo.buttonGameObject.SetActive (false); } } for (int i = 0; i < currentInventoryInfoList.Count; i++) { craftingObjectButtonInfo currentInventoryInfo = currentInventoryInfoList [i]; if (currentInventoryInfo.objectName != "") { string objectName = currentInventoryInfo.objectName.ToLower (); if (objectName.Contains (currentTextToSearch) || objectName.Equals (currentTextToSearch)) { currentInventoryInfo.buttonGameObject.SetActive (true); } } } } else { for (int i = 0; i < craftingObjectButtonInfoList.Count; i++) { craftingObjectButtonInfo currentCraftingInfo = craftingObjectButtonInfoList [i]; if (currentCraftingInfo.buttonGameObject.activeSelf) { currentCraftingInfo.buttonGameObject.SetActive (false); } } for (int i = 0; i < craftingObjectButtonInfoList.Count; i++) { craftingObjectButtonInfo currentCraftingInfo = craftingObjectButtonInfoList [i]; if (currentCraftingInfo.objectName != "") { bool canShowObjectResult = true; if (useOnlyBlueprintsUnlocked) { if (!blueprintsUnlockedList.Contains (currentCraftingInfo.objectName)) { canShowObjectResult = false; } } if (canShowObjectResult) { string objectName = currentCraftingInfo.objectName.ToLower (); if (objectName.Contains (currentTextToSearch) || objectName.Equals (currentTextToSearch)) { if (isCurrentObjectCategoryAvailable (currentCraftingInfo.objectCategoryName)) { currentCraftingInfo.buttonGameObject.SetActive (true); } } } } } } showAllCategoriesActive = false; objectFilterActive = true; } else { removeObjectsFilter (); } } public void removeObjectsFilter () { if (objectFilterActive) { searcherInputField.text = ""; showAllCategoriesActive = true; objectFilterActive = false; updateCategoryObjectPanelInfoActive (); } } bool checkIfStatValueAvailable (string statName, int statAmount) { return mainCraftingSystem.checkIfStatValueAvailable (statName, statAmount); } void addOrRemovePlayerStatAmount (string statName, int statAmount) { mainCraftingSystem.addOrRemovePlayerStatAmount (statName, statAmount); } public void confirmToCreate () { if (!menuOpened) { return; } float timeToCraftObject = 0; bool craftObjectInTimeResult = isObjectCreatedInTime (currentObjectCategorySelectedName, currentObjectSelectedName, ref timeToCraftObject); if (craftObjectInTimeResult) { bool allObjectsCanbeCreated = canObjectBeCreated (currentObjectCategorySelectedName, currentObjectSelectedName, currentAmountToCreate, true); if (allObjectsCanbeCreated) { craftObjectInTime (timeToCraftObject); string newMessage = messageOnObjectInProcess; if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, currentObjectSelectedName); } if (currentAmountToCreate > 1) { if (newMessage.Contains (objectAmountField)) { newMessage = newMessage.Replace (objectAmountField, (" x " + currentAmountToCreate.ToString ())); } } else { if (newMessage.Contains (objectAmountField)) { newMessage = newMessage.Replace (objectAmountField, ""); } } eventOnObjectCreated.Invoke (newMessage); } else { string newMessage = messageOnUnableToCreateObject; if (unableToCreateObjectsFromStatsActive) { newMessage = messageOnUnableToCreateObjectFromStats; } if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, currentObjectSelectedName); } if (unableToCreateObjectsFromStatsActive) { showObjectStatsInfo (); } eventOnObjectNotCreated.Invoke (newMessage); } } else { bool allObjectsCreated = createObjects (currentAmountToCreate, currentObjectCategorySelectedName, currentObjectSelectedName, menuOpenedFromWorkbench, -1); if (allObjectsCreated) { string newMessage = messageOnObjectCreated; if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, currentObjectSelectedName); } if (currentAmountToCreate > 1) { if (newMessage.Contains (objectAmountField)) { newMessage = newMessage.Replace (objectAmountField, (" x " + currentAmountToCreate.ToString ())); } } else { if (newMessage.Contains (objectAmountField)) { newMessage = newMessage.Replace (objectAmountField, ""); } } eventOnObjectCreated.Invoke (newMessage); checkButtonPressedOnEventSystem (currentButtonObjectPressed); mainCraftingSystem.checkStateOnCraftObject (); } else { string newMessage = messageOnUnableToCreateObject; if (unableToCreateObjectsFromStatsActive) { newMessage = messageOnUnableToCreateObjectFromStats; } if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, currentObjectSelectedName); } if (unableToCreateObjectsFromStatsActive) { showObjectStatsInfo (); } eventOnObjectNotCreated.Invoke (newMessage); } } } void showObjectStatsInfo () { string statsInfoString = getCrafStatsString (); if (statsInfoString != "") { if (messageToShowObjectStats.Contains (objectStatsField)) { messageToShowObjectStats = messageToShowObjectStats.Replace (objectStatsField, statsInfoString); } } if (messageToShowObjectStats != "") { eventOnShowObjectStats.Invoke (messageToShowObjectStats); } } bool createObjects (int amountToCreate, string categoryName, string objectName, bool menuOpenedFromWorkbenchValue, int workbenchID) { bool allObjectsCreated = true; bool canBeCreatedResult = true; bool canCreateNextObject = true; for (int j = 0; j < amountToCreate; j++) { if (canCreateNextObject) { canBeCreatedResult = canObjectBeCreated (categoryName, objectName, 1, true); if (canBeCreatedResult) { int amountToObtain = 1; int currentCategoryIndex = craftingBlueprintInfoTemplateDataList.FindIndex (s => s.Name.Equals (categoryName)); if (currentCategoryIndex > -1) { int currentIndex = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList.FindIndex (s => s.Name.Equals (objectName)); if (currentIndex > -1) { craftingBlueprintInfoTemplate currentcraftingBlueprintInfoTemplate = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex]; amountToObtain = currentcraftingBlueprintInfoTemplate.amountObtained; List craftingIngredientObjectInfoList = currentcraftingBlueprintInfoTemplate.craftingIngredientObjectInfoList; for (int i = 0; i < craftingIngredientObjectInfoList.Count; i++) { mainCraftingSystem.removeObjectAmountFromInventoryByName (craftingIngredientObjectInfoList [i].Name, craftingIngredientObjectInfoList [i].amountRequired); } if (!ignoreStatsOnCraftObjectsEnabled) { if (currentcraftingBlueprintInfoTemplate.checkStatsInfoToCraft) { for (int i = 0; i < currentcraftingBlueprintInfoTemplate.craftingStatInfoToCraftList.Count; i++) { craftingStatInfo currentcraftingStatInfo = currentcraftingBlueprintInfoTemplate.craftingStatInfoToCraftList [i]; if (currentcraftingStatInfo.useStatValue) { addOrRemovePlayerStatAmount (currentcraftingStatInfo.statName, currentcraftingStatInfo.statValueToUse); } } } } } } //comprobar si hay espacio para obtener la pieza antes bool storeObjectOnPlayerInventoryResult = true; if (menuOpenedFromWorkbenchValue) { if (workbenchID != -1) { craftingWorkbenchSystem [] craftingWorkbenchSystemList = FindObjectsOfType (); foreach (craftingWorkbenchSystem currentWorkbench in craftingWorkbenchSystemList) { if (currentWorkbench.getWorkbenchID () == workbenchID) { if (currentWorkbench.storeCraftedObjectsOnInventoryBank) { bool storeObjectOnWorkbenchResult = true; if (currentWorkbench.storeCraftedObjectsOnInventoryBankOnlyIfPlayerInventoryIsFull) { if (!mainCraftingSystem.checkIfPlayerInventoryIsFull (objectName, amountToObtain)) { storeObjectOnWorkbenchResult = false; } } if (storeObjectOnWorkbenchResult) { currentWorkbench.addInventoryObjectByName (objectName, amountToObtain); storeObjectOnPlayerInventoryResult = false; } } } } } else { if (currentCraftingWorkbenchSystem != null && currentCraftingWorkbenchSystem.storeCraftedObjectsOnInventoryBank) { bool storeObjectOnWorkbenchResult = true; if (currentCraftingWorkbenchSystem.storeCraftedObjectsOnInventoryBankOnlyIfPlayerInventoryIsFull) { if (!mainCraftingSystem.checkIfPlayerInventoryIsFull (objectName, amountToObtain)) { storeObjectOnWorkbenchResult = false; } } if (storeObjectOnWorkbenchResult) { currentCraftingWorkbenchSystem.addInventoryObjectByName (objectName, amountToObtain); storeObjectOnPlayerInventoryResult = false; } } } } if (storeObjectOnPlayerInventoryResult) { mainCraftingSystem.giveInventoryObjectToCharacter (objectName, amountToObtain); } } else { canCreateNextObject = false; allObjectsCreated = false; } } } return allObjectsCreated; } string getCrafStatsString () { string statsString = ""; int currentCategoryIndex = craftingBlueprintInfoTemplateDataList.FindIndex (s => s.Name.Equals (currentObjectCategorySelectedName)); if (currentCategoryIndex > -1) { int currentIndex = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList.FindIndex (s => s.Name.Equals (currentObjectSelectedName)); if (currentIndex > -1) { craftingBlueprintInfoTemplate currentcraftingBlueprintInfoTemplate = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex]; statsString += "\n"; // statsString += "Stats Required: \n"; for (int j = 0; j < currentcraftingBlueprintInfoTemplate.craftingStatInfoToCraftList.Count; j++) { craftingStatInfo currentcraftingStatInfo = currentcraftingBlueprintInfoTemplate.craftingStatInfoToCraftList [j]; statsString += " -" + currentcraftingStatInfo.statName; if (currentcraftingStatInfo.useStatValue) { statsString += ": " + currentcraftingStatInfo.statValueToUse; } else { statsString += ": " + currentcraftingStatInfo.valueRequired; } statsString += "\n"; } } } return statsString; } void craftObjectInTime (float timeToCraftObjectValue) { craftObjectInTimeInfo newCraftObjectInTimeInfo = new craftObjectInTimeInfo (); newCraftObjectInTimeInfo.objectName = currentObjectSelectedName; newCraftObjectInTimeInfo.objectCategoryName = currentObjectCategorySelectedName; newCraftObjectInTimeInfo.amount = currentAmountToCreate; newCraftObjectInTimeInfo.timeToCraftObject = timeToCraftObjectValue; if (menuOpenedFromWorkbench) { newCraftObjectInTimeInfo.objectCreatedOnWorkbench = true; newCraftObjectInTimeInfo.workbenchID = currentCraftingWorkbenchSystem.getWorkbenchID (); } craftObjectInTimeInfoList.Add (newCraftObjectInTimeInfo); newCraftObjectInTimeInfo.craftObjectCoroutine = StartCoroutine (craftObjectInTimeCoroutine (newCraftObjectInTimeInfo)); } IEnumerator craftObjectInTimeCoroutine (craftObjectInTimeInfo newCraftObjectInTimeInfo) { float timeToCraftObject = newCraftObjectInTimeInfo.timeToCraftObject * newCraftObjectInTimeInfo.amount; bool buttonLocated = false; for (int i = 0; i < currentCraftObjectInTimeInfoList.Count; i++) { if (!buttonLocated) { if (!currentCraftObjectInTimeInfoList [i].objectAssigned) { craftingObjectButtonInfo currentCraftingObjectButtonInfo = currentCraftObjectInTimeInfoList [i]; currentCraftingObjectButtonInfo.buttonGameObject.SetActive (true); currentCraftingObjectButtonInfo.objectAssigned = true; currentCraftingObjectButtonInfo.objectNameText.text = newCraftObjectInTimeInfo.objectName; currentCraftingObjectButtonInfo.objectImage.texture = mainCraftingSystem.getInventoryObjectIconByName (newCraftObjectInTimeInfo.objectName); currentCraftingObjectButtonInfo.objectSlider.maxValue = timeToCraftObject; newCraftObjectInTimeInfo.currentCraftingObjectButtonInfo = currentCraftingObjectButtonInfo; buttonLocated = true; } } } bool targetReached = false; float timer = timeToCraftObject; while (!targetReached) { timer -= Time.deltaTime; if (timer <= 0) { targetReached = true; } else { newCraftObjectInTimeInfo.currentCraftingObjectButtonInfo.amountAvailableToCreateText.text = timer.ToString ("0.#"); newCraftObjectInTimeInfo.currentCraftingObjectButtonInfo.objectSlider.value = timer; } yield return null; } createObjects (newCraftObjectInTimeInfo.amount, newCraftObjectInTimeInfo.objectCategoryName, newCraftObjectInTimeInfo.objectName, newCraftObjectInTimeInfo.objectCreatedOnWorkbench, newCraftObjectInTimeInfo.workbenchID); if (menuOpened) { string newMessage = messageOnObjectCreated; if (newMessage.Contains (objectNameField)) { newMessage = newMessage.Replace (objectNameField, newCraftObjectInTimeInfo.objectName); } if (currentAmountToCreate > 1) { if (newMessage.Contains (objectAmountField)) { newMessage = newMessage.Replace (objectAmountField, (" x " + newCraftObjectInTimeInfo.amount.ToString ())); } } else { if (newMessage.Contains (objectAmountField)) { newMessage = newMessage.Replace (objectAmountField, ""); } } eventOnObjectCreated.Invoke (newMessage); checkButtonPressedOnEventSystem (currentButtonObjectPressed); } craftObjectInTimeInfoList.Remove (newCraftObjectInTimeInfo); newCraftObjectInTimeInfo.currentCraftingObjectButtonInfo.buttonGameObject.SetActive (false); newCraftObjectInTimeInfo.currentCraftingObjectButtonInfo.objectAssigned = false; StopCoroutine (newCraftObjectInTimeInfo.craftObjectCoroutine); } public void increaseOrDecreaseAmountToCreate (bool state) { if (state) { currentAmountToCreate++; bool canCreateNextObject = true; if (!canObjectBeCreated (currentObjectCategorySelectedName, currentObjectSelectedName, currentAmountToCreate, true)) { canCreateNextObject = false; } if (showDebugPrint) { print ("can create all current amount result " + canCreateNextObject); } if (!canCreateNextObject) { currentAmountToCreate--; } } else { currentAmountToCreate--; } if (currentAmountToCreate < 1) { currentAmountToCreate = 1; } updatecurrentAmountOfObjectsSelectedText (); } void updatecurrentAmountOfObjectsSelectedText () { currentAmountOfObjectsSelectedText.text = currentAmountToCreate.ToString (); } public void resetAmountToCreate () { currentAmountToCreate = 1; updatecurrentAmountOfObjectsSelectedText (); } public void selectFirstObjectAvailableButton () { if (showAllCategoriesActive) { if (showingInventoryList) { checkButtonPressedOnEventSystem (currentInventoryInfoList [0].buttonGameObject); } else { if (useOnlyBlueprintsUnlocked) { for (int i = 0; i < craftingObjectButtonInfoList.Count; i++) { craftingObjectButtonInfo currentCraftingInfo = craftingObjectButtonInfoList [i]; if (blueprintsUnlockedList.Contains (currentCraftingInfo.objectName)) { if (isCurrentObjectCategoryAvailable (currentCraftingInfo.objectCategoryName)) { checkButtonPressedOnEventSystem (currentCraftingInfo.buttonGameObject); } return; } } } else { for (int i = 0; i < craftingObjectButtonInfoList.Count; i++) { craftingObjectButtonInfo currentCraftingInfo = craftingObjectButtonInfoList [i]; if (isCurrentObjectCategoryAvailable (currentCraftingInfo.objectCategoryName)) { checkButtonPressedOnEventSystem (currentCraftingInfo.buttonGameObject); return; } } } removeObjectPanelInfoContent (); } } else { int firstObjectIndexActive = -1; if (showingInventoryList) { for (int i = 0; i < currentInventoryInfoList.Count; i++) { craftingObjectButtonInfo currentInventoryInfo = currentInventoryInfoList [i]; if (firstObjectIndexActive == -1 && currentInventoryInfo.buttonGameObject.activeSelf) { if (canObjectBeCreated (currentInventoryInfo.objectCategoryName, currentInventoryInfo.objectName, 1, false)) { checkButtonPressedOnEventSystem (currentInventoryInfo.buttonGameObject); return; } else { firstObjectIndexActive = i; } } } if (firstObjectIndexActive != -1) { checkButtonPressedOnEventSystem (currentInventoryInfoList [firstObjectIndexActive].buttonGameObject); } else { removeObjectPanelInfoContent (); } } else { for (int i = 0; i < craftingObjectButtonInfoList.Count; i++) { craftingObjectButtonInfo currentCraftingInfo = craftingObjectButtonInfoList [i]; if (firstObjectIndexActive == -1 && currentCraftingInfo.buttonGameObject.activeSelf) { if (isCurrentObjectCategoryAvailable (currentCraftingInfo.objectCategoryName) && canObjectBeCreated (currentCraftingInfo.objectCategoryName, currentCraftingInfo.objectName, 1, false)) { checkButtonPressedOnEventSystem (currentCraftingInfo.buttonGameObject); return; } else { firstObjectIndexActive = i; } } } if (firstObjectIndexActive != -1) { checkButtonPressedOnEventSystem (craftingObjectButtonInfoList [firstObjectIndexActive].buttonGameObject); } else { removeObjectPanelInfoContent (); } } } } bool canObjectBeCreated (string objectCategoryName, string objectName, int amountMultiplier, bool checkForStats) { if (mainCraftingSystemAssigned) { if (mainCraftingSystem.isIgnoreCheckMaterialsNeededToCraftEnabled ()) { return true; } } unableToCreateObjectsFromStatsActive = false; int currentCategoryIndex = craftingBlueprintInfoTemplateDataList.FindIndex (s => s.Name.Equals (objectCategoryName)); if (currentCategoryIndex > -1) { int currentIndex = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList.FindIndex (s => s.Name.Equals (objectName)); if (currentIndex > -1) { craftingBlueprintInfoTemplate currentcraftingBlueprintInfoTemplate = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex]; List craftingIngredientObjectInfoList = currentcraftingBlueprintInfoTemplate.craftingIngredientObjectInfoList; if (!ignoreStatsOnCraftObjectsEnabled) { if (checkForStats) { if (currentcraftingBlueprintInfoTemplate.checkStatsInfoToCraft) { for (int j = 0; j < currentcraftingBlueprintInfoTemplate.craftingStatInfoToCraftList.Count; j++) { craftingStatInfo currentcraftingStatInfo = currentcraftingBlueprintInfoTemplate.craftingStatInfoToCraftList [j]; if (currentcraftingStatInfo.useStatValue) { if (!checkIfStatValueAvailable (currentcraftingStatInfo.statName, currentcraftingStatInfo.statValueToUse)) { unableToCreateObjectsFromStatsActive = true; return false; } } else { if (!checkIfStatValueAvailable (currentcraftingStatInfo.statName, currentcraftingStatInfo.valueRequired)) { unableToCreateObjectsFromStatsActive = true; return false; } } } } } } for (int i = 0; i < craftingIngredientObjectInfoList.Count; i++) { int currentAmount = mainCraftingSystem.getInventoryObjectAmountByName (craftingIngredientObjectInfoList [i].Name); if (currentAmount < (craftingIngredientObjectInfoList [i].amountRequired * amountMultiplier)) { return false; } } return true; } } return false; } bool canObjectBeRepaired (string objectCategoryName, string objectName) { if (mainCraftingSystemAssigned) { if (mainCraftingSystem.isIgnoreCheckMaterialsNeededToCraftEnabled ()) { return true; } } int currentCategoryIndex = craftingBlueprintInfoTemplateDataList.FindIndex (s => s.Name.Equals (objectCategoryName)); if (currentCategoryIndex > -1) { int currentIndex = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList.FindIndex (s => s.Name.Equals (objectName)); if (currentIndex > -1) { List repairIngredientObjectInfoList = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex].repairIngredientObjectInfoList; for (int i = 0; i < repairIngredientObjectInfoList.Count; i++) { int currentAmount = mainCraftingSystem.getInventoryObjectAmountByName (repairIngredientObjectInfoList [i].Name); if (currentAmount < repairIngredientObjectInfoList [i].amountRequired) { return false; } } return true; } } return false; } bool isObjectCreatedInTime (string objectCategoryName, string objectName, ref float timeToCraftObject) { int currentCategoryIndex = craftingBlueprintInfoTemplateDataList.FindIndex (s => s.Name.Equals (objectCategoryName)); if (currentCategoryIndex > -1) { int currentIndex = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList.FindIndex (s => s.Name.Equals (objectName)); if (currentIndex > -1) { timeToCraftObject = craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex].timeToCraftObject; return craftingBlueprintInfoTemplateDataList [currentCategoryIndex].craftingBlueprintInfoTemplateList [currentIndex].craftObjectInTime; } } return false; } public void checkButtonPressedWithoutCheckIfPreviouslyPressed (GameObject buttonObject) { checkButton (buttonObject); } void checkButtonPressedOnEventSystem (GameObject buttonObject) { if (buttonObject != null) { Button currentButton = buttonObject.GetComponent