BasicBlocks.h 7.1 KB

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