Пример #1
0
    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());
            });
        }
    }
Пример #2
0
    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);
        }
    }
Пример #3
0
    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);
            }
        }
    }