BasicBlocks.h 7.5 KB

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