BasicBlocks.h 7.2 KB

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