Просмотр исходного кода

fix problems with item_in_inventory quest requirement

Kolja Strohm 16 часов назад
Родитель
Сommit
3e05da3ad6

+ 12 - 25
FactoryCraft/Entity.cpp

@@ -264,7 +264,18 @@ Entity::Entity(
       movementFlags(0),
       collisionMap(0),
       collisionMapLength(0)
-{}
+{
+    registerAfterPushStackCall(
+        [this](ItemSlot* zSlot, Direction dir, const Item* zItem, int count) {
+            if (count > 0)
+            {
+                Game::INSTANCE->zQuestManager()->processEvent(
+                    new QuestEventItemPickup(dynamic_cast<Entity*>(getThis()),
+                        zItem->getTypeId(),
+                        count));
+            }
+        });
+}
 
 void Entity::onDeath(Entity* zActor, Item* zUsedItem, ItemSkill* zUsedSkill)
 {
@@ -869,18 +880,6 @@ bool Entity::isCollidingWithBlock(
     return false;
 }
 
-void Entity::addItems(ItemStack* zItems, Direction dir, ItemFilter* zFilter)
-{
-    int size = zItems->getSize();
-    int type = zItems->zItem() ? zItems->zItem()->getTypeId() : -1;
-    Inventory::addItems(zItems, dir, zFilter);
-    if (zItems->getSize() < size && type >= 0)
-    {
-        Game::INSTANCE->zQuestManager()->processEvent(new QuestEventItemPickup(
-            dynamic_cast<Entity*>(getThis()), type, size - zItems->getSize()));
-    }
-}
-
 void Entity::prepareTick(const Dimension* zDimension, double seconds) {}
 
 void Entity::tick(const Dimension* zDimension, double seconds)
@@ -1627,15 +1626,3 @@ float Entity::getRotation() const
 {
     return rotation;
 }
-
-void Entity::addItems(ItemSlot* zSlot, ItemStack* zItems, Direction dir)
-{
-    int size = zItems->getSize();
-    int type = zItems->zItem() ? zItems->zItem()->getTypeId() : -1;
-    Inventory::addItems(zSlot, zItems, dir);
-    if (zItems->getSize() < size && type >= 0)
-    {
-        Game::INSTANCE->zQuestManager()->processEvent(new QuestEventItemPickup(
-            dynamic_cast<Entity*>(getThis()), type, size - zItems->getSize()));
-    }
-}

+ 0 - 3
FactoryCraft/Entity.h

@@ -109,8 +109,6 @@ protected:
     bool isCollidingWithBlock(const Dimension* zDimension);
     bool isCollidingWithBlock(
         const Dimension* zDimension, int x, int y, int xl, int yl);
-    void addItems(
-        ItemStack* zItems, Direction dir, ItemFilter* zFilter) override;
 
 public:
     virtual void prepareTick(const Dimension* zDimension, double seconds);
@@ -163,7 +161,6 @@ public:
     double getHitDistance(Framework::Vec3<float> rayOrigin,
         Framework::Vec3<float> rayDirection) const;
     float getRotation() const;
-    void addItems(ItemSlot* zSlot, ItemStack* zItems, Direction dir) override;
 
     friend EntityType;
 };

+ 1 - 0
FactoryCraft/ItemEntity.cpp

@@ -24,6 +24,7 @@ ItemEntity::ItemEntity(
     setStamina(10);
     setHunger(10);
     setThirst(10);
+    setJumpSpeed(5.f);
     targetDistanceLimit = 4;
     maxMovementSpeed = 1;
     movementFlags |= MovementFlags::ROTATE_TO_FACE | MovementFlags::FLYING;

+ 1 - 1
FactoryCraft/Quest.cpp

@@ -368,7 +368,7 @@ bool Quest::isVisible(QuestParty* zParty, QuestManager* zManager)
     {
         return 1;
     }
-    bool visible = 0;
+    bool visible = requiredQuestsIds.getEintragAnzahl() == 0;
     for (Framework::Text* requiredQuestId : requiredQuestsIds)
     {
         visible |= zParty->zQuestStorage(*requiredQuestId)->isQuestFinished();

+ 25 - 22
FactoryCraft/QuestDialog.cpp

@@ -67,29 +67,32 @@ void QuestDialog::api(
         {   // open quest graph
             int selection;
             zRequest->lese((char*)&selection, 4);
-            auto questGraph = this->uiml->selectChildsByName("questGraph");
-            questGraph.selectChildren().remove();
-            auto listItems
-                = uiml->selectChildsByName("listView").selectChildren();
-            listItems.removeAttribute("selected");
-            QuestManager* zManager = Game::INSTANCE->zQuestManager();
-            auto questCollection = zManager->zCollection(selection);
-            QuestParty* zParty = zManager->zParty(getPlayerId());
-            for (Quest* quest : questCollection->quests)
+            if (selection >= 0)
             {
-                if (quest->isVisible(zParty, zManager))
+                auto questGraph = this->uiml->selectChildsByName("questGraph");
+                questGraph.selectChildren().remove();
+                auto listItems
+                    = uiml->selectChildsByName("listView").selectChildren();
+                listItems.removeAttribute("selected");
+                QuestManager* zManager = Game::INSTANCE->zQuestManager();
+                auto questCollection = zManager->zCollection(selection);
+                QuestParty* zParty = zManager->zParty(getPlayerId());
+                for (Quest* quest : questCollection->quests)
                 {
-                    questGraph.addChild(getQuestGraphItem(quest, zParty));
+                    if (quest->isVisible(zParty, zManager))
+                    {
+                        questGraph.addChild(getQuestGraphItem(quest, zParty));
+                    }
                 }
+                listItems
+                    .whereAttributeEquals(
+                        "id", Framework::Text("quest_collection_") + selection)
+                    .forEach(
+                        [this, &questGraph](Framework::XML::Element* zElement) {
+                            zElement->setAttribute("selected", "");
+                        });
+                update();
             }
-            listItems
-                .whereAttributeEquals(
-                    "id", Framework::Text("quest_collection_") + selection)
-                .forEach(
-                    [this, &questGraph](Framework::XML::Element* zElement) {
-                        zElement->setAttribute("selected", "");
-                    });
-            update();
             break;
         }
     case 1: // onClick Message of questGraphItem
@@ -382,7 +385,7 @@ Framework::XML::Element* QuestDialog::getQuestGraphItem(
             ->setRequirements(requirements)
             ->setWidth(zQuest->mainQuest ? 50 : 30)
             ->setHeight(zQuest->mainQuest ? 50 : 30)
-            ->setOnClickMessage("quests", {1})
+            ->setOnClickMessage("quests", {"(char)1", zQuest->questId})
             ->build();
     }
 }
@@ -469,7 +472,7 @@ void QuestDialog::showQuestDetails(
             ->setMarginRight(10)
             ->setAlignTopToElement("quest_requirements")
             ->setMarginTop(10)
-            ->setOnClickMessage("quests", {2})
+            ->setOnClickMessage("quests", {"(char)2"})
             ->build());
     if (zStorage->isQuestFinished() && !zStorage->isQuestRewarded())
     {
@@ -481,7 +484,7 @@ void QuestDialog::showQuestDetails(
                 ->setMarginLeft(10)
                 ->setAlignTopToElement("quest_requirements")
                 ->setMarginTop(10)
-                ->setOnClickMessage("quests", {3})
+                ->setOnClickMessage("quests", {"(char)3"})
                 ->build());
     }
     update();

+ 5 - 5
FactoryCraft/UIMLBuilder.h

@@ -407,14 +407,13 @@ public:
     }
 
     T* setOnClickMessage(
-        const char* dialogName, std::initializer_list<char> message)
+        const char* dialogName, std::initializer_list<const char*> message)
     {
         Framework::Text value(dialogName);
-        value += ";";
-        for (char c : message)
+        for (const char* c : message)
         {
-            value += "(char)";
-            value.appendHex((int)c);
+            value += ";";
+            value += c;
         }
         result->setAttribute("onClick", value);
         return (T*)this;
@@ -1575,6 +1574,7 @@ public:
     UIMLDialogBuilder(const char* id)
         : result(new Framework::XML::Element())
     {
+        result->setName("dialog");
         result->setAttribute("id", id);
     }
 

+ 6 - 5
Windows Version/data/quests/quests.json

@@ -72,13 +72,14 @@
                 "questId": "wood_sticks",
                 "questName": "Wooden Sticks",
                 "description": "You can get some wooden sticks by harvesting tree leaves.",
-                "imagePath": "data/images/gui_icons.ltdb/questdialog.png",
+                "imagePath": "itemType:Wooden Stick",
                 "requirements": [
                     {
-                        "id": "1",
-                        "description": "Open the quest dialog",
-                        "type": "open_dialog",
-                        "dialogId": "quests"
+                        "type": "item_in_inventory",
+                        "amount": 10,
+                        "itemType": "Wooden Stick",
+                        "id": "wooden_sticks_requirement",
+                        "description": "Wooden Sticks"
                     }
                 ],
                 "rewards": [