EntityType.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #pragma once
  2. #include <Reader.h>
  3. #include <ReferenceCounter.h>
  4. #include <Vec3.h>
  5. #include <Writer.h>
  6. #include "DropConfig.h"
  7. #include "ModelInfo.h"
  8. class Entity;
  9. class Game;
  10. class EntityTypeEnum
  11. {
  12. public:
  13. static const int PLAYER = 0;
  14. static const int ITEM = 1;
  15. };
  16. class EntityType : public virtual Framework::ReferenceCounter
  17. {
  18. private:
  19. Framework::Text name;
  20. int id;
  21. ModelInfo* model;
  22. Framework::RCArray<DropConfig> dropConfigs;
  23. protected:
  24. EntityType();
  25. ~EntityType();
  26. virtual void loadSuperEntity(
  27. Entity* zEntity, Framework::StreamReader* zReader) const;
  28. virtual void saveSuperEntity(
  29. Entity* zEntity, Framework::StreamWriter* zWriter) const;
  30. virtual void createSuperEntity(Entity* zEntity) const;
  31. public:
  32. virtual bool initialize(Game* zGame);
  33. void addDropConfig(DropConfig* config);
  34. void setName(Framework::Text name);
  35. void setModel(ModelInfo* model);
  36. const Framework::RCArray<DropConfig>& getDropConfigs() const;
  37. virtual Entity* loadEntity(Framework::StreamReader* zReader) const;
  38. virtual void saveEntity(
  39. Entity* zEntity, Framework::StreamWriter* zWriter) const;
  40. virtual Entity* createEntityAt(
  41. Framework::Vec3<float> position, int dimensionId) const;
  42. virtual Entity* createEntity(
  43. Framework::Vec3<float> position, int dimensionId, int entityId) const
  44. = 0;
  45. int getId() const;
  46. ModelInfo* zModel() const;
  47. void setTypeId(int id);
  48. Framework::Text getName() const;
  49. };
  50. template<typename S> class EntityTypeFactoryBase
  51. : public SubTypeFactory<EntityType, S>
  52. {
  53. public:
  54. EntityTypeFactoryBase()
  55. : SubTypeFactory<EntityType, S>()
  56. {}
  57. virtual S* fromJson(Framework::JSON::JSONObject* zJson) const override
  58. {
  59. S* result = createValue(zJson);
  60. EntityType* zType = dynamic_cast<EntityType*>(result);
  61. zType->setModel(Game::INSTANCE->zTypeRegistry()->fromJson<ModelInfo>(
  62. zJson->zValue("model")->asObject()));
  63. zType->setName(zJson->zValue("typeName")->asString()->getString());
  64. for (Framework::JSON::JSONValue* value :
  65. *zJson->zValue("drops")->asArray())
  66. {
  67. zType->addDropConfig(
  68. Game::INSTANCE->zTypeRegistry()->fromJson<DropConfig>(
  69. value->asObject()));
  70. }
  71. return result;
  72. }
  73. virtual Framework::JSON::JSONObject* toJsonObject(S* zObject) const override
  74. {
  75. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  76. EntityType* zType = dynamic_cast<EntityType*>(zObject);
  77. result->addValue("model",
  78. Game::INSTANCE->zTypeRegistry()->toJson<ModelInfo>(
  79. zType->zModel()));
  80. result->addValue(
  81. "typeName", new Framework::JSON::JSONString(zType->getName()));
  82. Framework::JSON::JSONArray* drops = new Framework::JSON::JSONArray();
  83. for (DropConfig* drop : zType->getDropConfigs())
  84. {
  85. drops->addValue(
  86. Game::INSTANCE->zTypeRegistry()->toJson<DropConfig>(drop));
  87. }
  88. result->addValue("drops", drops);
  89. addToJson(result, zObject);
  90. return result;
  91. }
  92. virtual JSONObjectValidationBuilder* addToValidator(
  93. JSONObjectValidationBuilder* builder) const override
  94. {
  95. return builder
  96. ->withRequiredAttribute("model",
  97. Game::INSTANCE->zTypeRegistry()->getValidator<ModelInfo>())
  98. ->withRequiredString("typeName")
  99. ->finishString()
  100. ->withRequiredAttribute("drops",
  101. Framework::Validator::DataValidator::buildForArray()
  102. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  103. ->getValidator<DropConfig>())
  104. ->finishArray());
  105. }
  106. protected:
  107. virtual S* createValue(Framework::JSON::JSONObject* zJson) const = 0;
  108. virtual void addToJson(Framework::JSON::JSONObject* zJson, S* zObject) const
  109. = 0;
  110. };