void Update() { Player player = Player.localPlayer; if (player) { UIUtils.BalancePrefabs(ingredientSlotPrefab.gameObject, player.crafting.indices.Count, ingredientContent); for (int i = 0; i < player.crafting.indices.Count; ++i) { UICraftingIngredientSlot slot = ingredientContent.GetChild(i).GetComponent <UICraftingIngredientSlot>(); slot.dragAndDropable.name = i.ToString(); int itemIndex = player.crafting.indices[i]; if (0 <= itemIndex && itemIndex < player.inventory.slots.Count && player.inventory.slots[itemIndex].amount > 0) { ItemSlot itemSlot = player.inventory.slots[itemIndex]; slot.tooltip.enabled = true; if (slot.tooltip.IsVisible()) { slot.tooltip.text = itemSlot.ToolTip(); } slot.dragAndDropable.dragable = true; slot.image.color = Color.white; slot.image.sprite = itemSlot.item.image; slot.amountOverlay.SetActive(itemSlot.amount > 1); slot.amountText.text = itemSlot.amount.ToString(); } else { player.crafting.indices[i] = -1; slot.tooltip.enabled = false; slot.dragAndDropable.dragable = false; slot.image.color = Color.clear; slot.image.sprite = null; slot.amountOverlay.SetActive(false); } } List <int> validIndices = player.crafting.indices.Where( index => 0 <= index && index < player.inventory.slots.Count && player.inventory.slots[index].amount > 0 ).ToList(); List <ItemSlot> items = validIndices.Select(index => player.inventory.slots[index]).ToList(); CraftingRecipe recipe = CraftingRecipe.Find(items); if (recipe != null) { Item item = new Item(recipe.result); resultSlotToolTip.enabled = true; if (resultSlotToolTip.IsVisible()) { resultSlotToolTip.text = new ItemSlot(item).ToolTip(); } resultSlotImage.color = Color.white; resultSlotImage.sprite = recipe.result.image; } else { resultSlotToolTip.enabled = false; resultSlotImage.color = Color.clear; resultSlotImage.sprite = null; } if (player.crafting.craftingState == CraftingState.Success) { resultText.color = successColor; resultText.text = "Success!"; } else if (player.crafting.craftingState == CraftingState.Failed) { resultText.color = failedColor; resultText.text = "Failed :("; } else { resultText.text = ""; } craftButton.GetComponentInChildren <Text>().text = recipe != null && recipe.probability < 1 ? "Try Craft" : "Craft"; craftButton.interactable = recipe != null && player.crafting.craftingState != CraftingState.InProgress && player.inventory.CanAdd(new Item(recipe.result), 1); craftButton.onClick.SetListener(() => { player.crafting.craftingState = CraftingState.InProgress; player.crafting.CmdCraft(recipe.name, validIndices.ToArray()); }); } }
void Update() { Player player = Player.localPlayer; if (player) { // hotkey (not while typing in chat, etc.) if (Input.GetKeyDown(hotKey) && !UIUtils.AnyInputActive()) { panel.SetActive(!panel.activeSelf); } // only update the panel if it's active if (panel.activeSelf) { // instantiate/destroy enough slots UIUtils.BalancePrefabs(ingredientSlotPrefab.gameObject, player.crafting.indices.Count, ingredientContent); // refresh all for (int i = 0; i < player.crafting.indices.Count; ++i) { UICraftingIngredientSlot slot = ingredientContent.GetChild(i).GetComponent <UICraftingIngredientSlot>(); slot.dragAndDropable.name = i.ToString(); // drag and drop index int itemIndex = player.crafting.indices[i]; if (0 <= itemIndex && itemIndex < player.inventory.slots.Count && player.inventory.slots[itemIndex].amount > 0) { ItemSlot itemSlot = player.inventory.slots[itemIndex]; // refresh valid item // only build tooltip while it's actually shown. this // avoids MASSIVE amounts of StringBuilder allocations. slot.tooltip.enabled = true; if (slot.tooltip.IsVisible()) { slot.tooltip.text = itemSlot.ToolTip(); } slot.dragAndDropable.dragable = true; // use durability colors? if (itemSlot.item.maxDurability > 0) { if (itemSlot.item.durability == 0) { slot.image.color = brokenDurabilityColor; } else if (itemSlot.item.DurabilityPercent() < lowDurabilityThreshold) { slot.image.color = lowDurabilityColor; } else { slot.image.color = Color.white; } } else { slot.image.color = Color.white; // reset for no-durability items } slot.image.sprite = itemSlot.item.image; slot.amountOverlay.SetActive(itemSlot.amount > 1); slot.amountText.text = itemSlot.amount.ToString(); } else { // reset the index because it's invalid player.crafting.indices[i] = -1; // refresh invalid item slot.tooltip.enabled = false; slot.dragAndDropable.dragable = false; slot.image.color = Color.clear; slot.image.sprite = null; slot.amountOverlay.SetActive(false); } } // find valid indices => item templates => matching recipe List <int> validIndices = player.crafting.indices.Where( index => 0 <= index && index < player.inventory.slots.Count && player.inventory.slots[index].amount > 0 ).ToList(); List <ItemSlot> items = validIndices.Select(index => player.inventory.slots[index]).ToList(); ScriptableRecipe recipe = ScriptableRecipe.Find(items); if (recipe != null) { // refresh valid recipe Item item = new Item(recipe.result); // only build tooltip while it's actually shown. this // avoids MASSIVE amounts of StringBuilder allocations. resultSlotToolTip.enabled = true; if (resultSlotToolTip.IsVisible()) { resultSlotToolTip.text = new ItemSlot(item).ToolTip(); // ItemSlot so that {AMOUNT} is replaced too } resultSlotImage.color = Color.white; resultSlotImage.sprite = recipe.result.image; // show progress bar while crafting // (show 100% if craft time = 0 because it's just better feedback) progressSlider.gameObject.SetActive(player.state == "CRAFTING"); double startTime = player.crafting.endTime - recipe.craftingTime; double elapsedTime = NetworkTime.time - startTime; progressSlider.value = recipe.craftingTime > 0 ? (float)elapsedTime / recipe.craftingTime : 1; } else { // refresh invalid recipe resultSlotToolTip.enabled = false; resultSlotImage.color = Color.clear; resultSlotImage.sprite = null; progressSlider.gameObject.SetActive(false); } // craft result // (no recipe != null check because it will be null if those were // the last two ingredients in our inventory) if (player.crafting.state == CraftingState.Success) { resultText.color = successColor; resultText.text = "Success!"; } else if (player.crafting.state == CraftingState.Failed) { resultText.color = failedColor; resultText.text = "Failed :("; } else { resultText.text = ""; } // craft button with 'Try' prefix to let people know that it might fail // (disabled while in progress) craftButton.GetComponentInChildren <Text>().text = recipe != null && recipe.probability < 1 ? "Try Craft" : "Craft"; craftButton.interactable = recipe != null && player.state != "CRAFTING" && player.crafting.state != CraftingState.InProgress && player.inventory.CanAdd(new Item(recipe.result), 1); craftButton.onClick.SetListener(() => { player.crafting.state = CraftingState.InProgress; // wait for result // pass original array so server can copy it to it's own // craftingIndices. we pass original one and not only the valid // indicies because then in host mode we would make the crafting // indices array smaller by only copying the valid indices, // hence losing crafting slots player.crafting.CmdCraft(recipe.name, player.crafting.indices.ToArray()); }); } } else { panel.SetActive(false); } }
void Update() { Player player = Player.localPlayer; if (player) { if (player.interaction.current != null && ((NetworkBehaviour)player.interaction.current).GetComponent <Furnace>() != null) { panel.SetActive(true); Furnace furnace = ((NetworkBehaviour)player.interaction.current).GetComponent <Furnace>(); if (furnace.ingredientSlot.amount > 0) { ingredientToolip.enabled = true; if (ingredientToolip.IsVisible()) { ingredientToolip.text = furnace.ingredientSlot.ToolTip(); } ingredient.dragable = true; if (furnace.ingredientSlot.item.maxDurability > 0) { if (furnace.ingredientSlot.item.durability == 0) { ingredientImage.color = brokenDurabilityColor; } else if (furnace.ingredientSlot.item.DurabilityPercent() < lowDurabilityThreshold) { ingredientImage.color = lowDurabilityColor; } else { ingredientImage.color = Color.white; } } else { ingredientImage.color = Color.white; } ingredientImage.sprite = furnace.ingredientSlot.item.image; ingredientOverlay.SetActive(furnace.ingredientSlot.amount > 1); ingredientAmountText.text = furnace.ingredientSlot.amount.ToString(); } else { ingredientToolip.enabled = false; ingredient.dragable = false; ingredientImage.color = Color.clear; ingredientImage.sprite = null; ingredientOverlay.SetActive(false); } if (furnace.fuelSlot.amount > 0) { fuelToolip.enabled = true; if (fuelToolip.IsVisible()) { fuelToolip.text = furnace.fuelSlot.ToolTip(); } fuel.dragable = true; if (furnace.fuelSlot.item.maxDurability > 0) { if (furnace.fuelSlot.item.durability == 0) { fuelImage.color = brokenDurabilityColor; } else if (furnace.fuelSlot.item.DurabilityPercent() < lowDurabilityThreshold) { fuelImage.color = lowDurabilityColor; } else { fuelImage.color = Color.white; } } else { fuelImage.color = Color.white; } fuelImage.sprite = furnace.fuelSlot.item.image; fuelOverlay.SetActive(furnace.fuelSlot.amount > 1); fuelAmountText.text = furnace.fuelSlot.amount.ToString(); } else { fuelToolip.enabled = false; fuel.dragable = false; fuelImage.color = Color.clear; fuelImage.sprite = null; fuelOverlay.SetActive(false); } if (furnace.resultSlot.amount > 0) { resultToolip.enabled = true; if (resultToolip.IsVisible()) { resultToolip.text = furnace.resultSlot.ToolTip(); } result.dragable = true; if (furnace.resultSlot.item.maxDurability > 0) { if (furnace.resultSlot.item.durability == 0) { resultImage.color = brokenDurabilityColor; } else if (furnace.resultSlot.item.DurabilityPercent() < lowDurabilityThreshold) { resultImage.color = lowDurabilityColor; } else { resultImage.color = Color.white; } } else { resultImage.color = Color.white; } resultImage.sprite = furnace.resultSlot.item.image; resultOverlay.SetActive(furnace.resultSlot.amount > 1); resultAmountText.text = furnace.resultSlot.amount.ToString(); } else { resultToolip.enabled = false; result.dragable = false; resultImage.color = Color.clear; resultImage.sprite = null; resultOverlay.SetActive(false); } double elapsedTime = NetworkTime.time - furnace.bakeTimeStart; double bakingTime = furnace.bakeTimeEnd - furnace.bakeTimeStart; progressSlider.value = furnace.IsBaking() ? (float)(elapsedTime / bakingTime) : 0; } else { panel.SetActive(false); } } }