예제 #1
0
    void Update()
    {
        Player player = Player.localPlayer;

        // use collider point(s) to also work with big entities
        if (player != null &&
            player.target != null &&
            player.target is Npc npc &&
            Utils.ClosestDistance(player, player.target) <= player.interactionRange)
        {
            // instantiate/destroy enough slots
            List <ScriptableQuest> questsAvailable = npc.quests.QuestsVisibleFor(player);
            UIUtils.BalancePrefabs(slotPrefab.gameObject, questsAvailable.Count, content);

            // refresh all
            for (int i = 0; i < questsAvailable.Count; ++i)
            {
                ScriptableQuest npcQuest = questsAvailable[i];
                UINpcQuestSlot  slot     = content.GetChild(i).GetComponent <UINpcQuestSlot>();

                // find quest index in original npc quest list (unfiltered)
                int npcIndex = npc.quests.GetIndexByName(questsAvailable[i].name);

                // find quest index in player quest list
                int questIndex = player.quests.GetIndexByName(npcQuest.name);
                if (questIndex != -1)
                {
                    // running quest: shows description with current progress
                    // instead of static one
                    Quest          quest    = player.quests.quests[questIndex];
                    ScriptableItem reward   = npcQuest.rewardItem;
                    bool           hasSpace = reward == null || player.inventory.CanAdd(new Item(reward), 1);

                    // description + not enough space warning (if needed)
                    slot.descriptionText.text = quest.ToolTip(player);
                    if (!hasSpace)
                    {
                        slot.descriptionText.text += "\n<color=red>Not enough inventory space!</color>";
                    }

                    slot.actionButton.interactable = player.quests.CanComplete(quest.name);
                    slot.actionButton.GetComponentInChildren <Text>().text = "Complete";
                    slot.actionButton.onClick.SetListener(() => {
                        player.quests.CmdComplete(npcIndex);
                        panel.SetActive(false);
                    });
                }
                else
                {
                    // new quest
                    slot.descriptionText.text      = new Quest(npcQuest).ToolTip(player);
                    slot.actionButton.interactable = true;
                    slot.actionButton.GetComponentInChildren <Text>().text = "Accept";
                    slot.actionButton.onClick.SetListener(() => {
                        player.quests.CmdAccept(npcIndex);
                    });
                }
            }
        }
예제 #2
0
    void Update()
    {
        Player player = Utils.ClientLocalPlayer();

        if (!player)
        {
            return;
        }

        // npc quest
        // use collider point(s) to also work with big entities
        if (player.target != null && player.target is Npc &&
            Utils.ClosestDistance(player.collider, player.target.collider) <= player.interactionRange)
        {
            Npc npc = (Npc)player.target;

            // instantiate/destroy enough slots
            List <ScriptableQuest> questsAvailable = npc.QuestsVisibleFor(player);
            UIUtils.BalancePrefabs(slotPrefab.gameObject, questsAvailable.Count, content);

            // refresh all
            for (int i = 0; i < questsAvailable.Count; ++i)
            {
                UINpcQuestSlot slot = content.GetChild(i).GetComponent <UINpcQuestSlot>();

                // find quest index in original npc quest list (unfiltered)
                int npcIndex = Array.FindIndex(npc.quests, q => q.name == questsAvailable[i].name);

                // find quest index in player quest list
                int questIndex = player.GetQuestIndexByName(npc.quests[npcIndex].name);
                if (questIndex != -1)
                {
                    // running quest: shows description with current progress
                    // instead of static one
                    Quest          quest    = player.quests[questIndex];
                    ScriptableItem reward   = npc.quests[npcIndex].rewardItem;
                    int            gathered = quest.gatherItem != null?player.InventoryCount(new Item(quest.gatherItem)) : 0;

                    bool hasSpace = reward == null || player.InventoryCanAdd(new Item(reward), 1);

                    slot.descriptionText.text = quest.ToolTip(gathered);
                    if (!hasSpace)
                    {
                        slot.descriptionText.text += "\n<color=red>Not enough inventory space!</color>";
                    }

                    slot.actionButton.interactable = quest.IsFulfilled(gathered) && hasSpace;
                    slot.actionButton.GetComponentInChildren <Text>().text = "Complete";
                    slot.actionButton.onClick.SetListener(() => {
                        player.CmdCompleteQuest(npcIndex);
                        panel.SetActive(false);
                    });
                }
                else
                {
                    // new quest
                    slot.descriptionText.text      = new Quest(npc.quests[npcIndex]).ToolTip();
                    slot.actionButton.interactable = true;
                    slot.actionButton.GetComponentInChildren <Text>().text = "Accept";
                    slot.actionButton.onClick.SetListener(() => {
                        player.CmdAcceptQuest(npcIndex);
                    });
                }
            }
        }
        else
        {
            panel.SetActive(false);  // hide
        }
        // addon system hooks
        Utils.InvokeMany(typeof(UINpcQuests), this, "Update_");
    }