BasicBlocks.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #pragma once
  2. #include "Block.h"
  3. #include "BlockType.h"
  4. #include "Item.h"
  5. #include "TypeRegistry.h"
  6. class BlockType;
  7. class ItemType;
  8. class BasicBlockType;
  9. class BasicBlock : public Block
  10. {
  11. public:
  12. BasicBlock(int typeId, Framework::Vec3<int> pos, int dimensionId);
  13. BasicBlock(int typeId,
  14. Framework::Vec3<int> pos,
  15. int dimensionId,
  16. bool hasInventory);
  17. virtual bool onTick(
  18. TickQueue* zQueue, int numTicks, bool& blocked) override;
  19. virtual void onPostTick() override;
  20. friend BasicBlockType;
  21. };
  22. class BasicBlockType : public BlockType
  23. {
  24. private:
  25. Framework::Text itemTypeName;
  26. int itemTypeId;
  27. bool transparent;
  28. bool passable;
  29. float speedModifier;
  30. bool interactable;
  31. Framework::RCArray<ItemSlot> itemSlots;
  32. protected:
  33. virtual void createSuperBlock(Block* zBlock, Item* zItem) const override;
  34. public:
  35. BasicBlockType();
  36. virtual bool initialize(Game* zGame) override;
  37. virtual Block* createBlock(
  38. Framework::Vec3<int> position, int dimensionId) const override;
  39. virtual Item* createItem() const override;
  40. Framework::Text getItemTypeName() const;
  41. virtual ItemType* createItemType() const override;
  42. void setItemTypeName(Framework::Text itemTypeName);
  43. int getItemTypeId() const;
  44. void setTransparent(bool transparent);
  45. bool isTransparent() const;
  46. void setPassable(bool passable);
  47. bool isPassable() const;
  48. void setSpeedModifier(float speedModifier);
  49. float getSpeedModifier() const;
  50. void setInteractable(bool interactable);
  51. bool isInteractable() const;
  52. const Framework::RCArray<ItemSlot>& getInventorySlots() const;
  53. void addInventorySlot(ItemSlot* slot);
  54. };
  55. template<class T,
  56. typename = std::enable_if<std::is_base_of<BasicBlockType, T>::value>>
  57. class BasicBlockTypeFactory : public BlockTypeFactoryBase<T>
  58. {
  59. public:
  60. BasicBlockTypeFactory()
  61. : BlockTypeFactoryBase<T>()
  62. {}
  63. virtual T* createValue(Framework::JSON::JSONObject* zJson) const override
  64. {
  65. return (T*)new BasicBlockType();
  66. }
  67. virtual T* fromJson(Framework::JSON::JSONObject* zJson) const override
  68. {
  69. T* result = BlockTypeFactoryBase<T>::fromJson(zJson);
  70. if (zJson->zValue("itemType")->getType()
  71. == Framework::AbstractType::STRING)
  72. {
  73. result->setItemTypeName(
  74. zJson->zValue("itemType")->asString()->getString());
  75. }
  76. else
  77. {
  78. result->setItemTypeName("");
  79. }
  80. result->setTransparent(
  81. zJson->zValue("transparent")->asBool()->getBool());
  82. result->setPassable(zJson->zValue("passable")->asBool()->getBool());
  83. result->setSpeedModifier(
  84. (float)zJson->zValue("speedModifier")->asNumber()->getNumber());
  85. result->setInteractable(
  86. (float)zJson->zValue("interactable")->asBool()->getBool());
  87. for (Framework::JSON::JSONValue* value :
  88. *zJson->zValue("inventorySlots")->asArray())
  89. {
  90. result->addInventorySlot(
  91. Game::INSTANCE->zTypeRegistry()->fromJson<ItemSlot>(
  92. value->asObject()));
  93. }
  94. return result;
  95. }
  96. virtual Framework::JSON::JSONObject* toJsonObject(T* zObject) const override
  97. {
  98. Framework::JSON::JSONObject* result
  99. = BlockTypeFactoryBase<T>::toJsonObject(zObject);
  100. if (zObject->getItemTypeName().istGleich(""))
  101. {
  102. result->addValue("itemType", new Framework::JSON::JSONValue());
  103. }
  104. else
  105. {
  106. result->addValue("itemType",
  107. new Framework::JSON::JSONString(zObject->getItemTypeName()));
  108. }
  109. result->addValue("transparent",
  110. new Framework::JSON::JSONBool(zObject->isTransparent()));
  111. result->addValue(
  112. "passable", new Framework::JSON::JSONBool(zObject->isPassable()));
  113. result->addValue("speedModifier",
  114. new Framework::JSON::JSONNumber(zObject->getSpeedModifier()));
  115. result->addValue("interactable",
  116. new Framework::JSON::JSONBool(zObject->isInteractable()));
  117. Framework::JSON::JSONArray* inventorySlots
  118. = new Framework::JSON::JSONArray();
  119. for (ItemSlot* slot : zObject->getInventorySlots())
  120. {
  121. inventorySlots->addValue(
  122. Game::INSTANCE->zTypeRegistry()->toJson<ItemSlot>(slot));
  123. }
  124. result->addValue("inventorySlots", inventorySlots);
  125. return result;
  126. }
  127. virtual JSONObjectValidationBuilder* addToValidator(
  128. JSONObjectValidationBuilder* builder) const override
  129. {
  130. return BlockTypeFactoryBase<T>::addToValidator(
  131. builder
  132. ->withRequiredAttribute("itemType",
  133. Game::INSTANCE->zTypeRegistry()
  134. ->getValidator<Framework::Text>(
  135. ItemTypeNameFactory::TYPE_ID),
  136. true,
  137. false)
  138. ->withRequiredBool("transparent")
  139. ->withDefault(false)
  140. ->finishBool()
  141. ->withRequiredBool("passable")
  142. ->withDefault(false)
  143. ->finishBool()
  144. ->withRequiredNumber("speedModifier")
  145. ->withDefault(1.0)
  146. ->finishNumber()
  147. ->withRequiredBool("interactable")
  148. ->withDefault(true)
  149. ->finishBool())
  150. ->withRequiredArray("inventorySlots")
  151. ->withDefault(new Framework::JSON::JSONArray())
  152. ->addAcceptedTypeInArray(
  153. Game::INSTANCE->zTypeRegistry()->getValidator<ItemSlot>())
  154. ->finishArray();
  155. }
  156. virtual const char* getTypeToken() const override
  157. {
  158. return "basicBlock";
  159. }
  160. };