BasicBlocks.h 7.5 KB

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