InteractionConfig.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #pragma once
  2. #include <Either.h>
  3. #include <ReferenceCounter.h>
  4. #include "Game.h"
  5. #include "ItemFilter.h"
  6. #include "TypeRegistry.h"
  7. class Block;
  8. class Entity;
  9. class Item;
  10. class InteractionConfig : public virtual Framework::ReferenceCounter
  11. {
  12. private:
  13. ItemFilter* filter;
  14. public:
  15. InteractionConfig();
  16. ~InteractionConfig();
  17. void setItemFilter(ItemFilter* filter);
  18. ItemFilter* zItemFilter() const;
  19. bool doInteraction(Framework::Either<Block*, Entity*> target,
  20. Item* zItem,
  21. Entity* actor,
  22. bool& itemChanged);
  23. protected:
  24. virtual bool onInteraction(Framework::Either<Block*, Entity*> target,
  25. Item* zItem,
  26. Entity* actor,
  27. bool& itemChanged)
  28. = 0;
  29. };
  30. template<class T> class InteractionConfigFactory
  31. : public SubTypeFactory<InteractionConfig, T>
  32. {
  33. public:
  34. virtual JSONObjectValidationBuilder* addToValidator(
  35. JSONObjectValidationBuilder* builder) const
  36. {
  37. return builder->withRequiredAttribute("itemFilter",
  38. Game::INSTANCE->zTypeRegistry()->getValidator<ItemFilter>(),
  39. false,
  40. true);
  41. }
  42. virtual T* fromJson(Framework::JSON::JSONObject* zJson) const
  43. {
  44. T* result = createValue(zJson);
  45. if (zJson->hasValue("itemFilter"))
  46. {
  47. ItemFilter* itemFilter
  48. = Game::INSTANCE->zTypeRegistry()->fromJson<ItemFilter>(
  49. zJson->zValue("itemFilter"));
  50. result->setItemFilter(itemFilter);
  51. }
  52. return result;
  53. }
  54. virtual Framework::JSON::JSONObject* toJsonObject(T* zObject) const
  55. {
  56. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  57. if (zObject->zItemFilter())
  58. {
  59. result->addValue("itemFilter",
  60. Game::INSTANCE->zTypeRegistry()->toJson(
  61. zObject->zItemFilter()));
  62. }
  63. return result;
  64. }
  65. protected:
  66. virtual T* createValue(Framework::JSON::JSONObject* zJson) const = 0;
  67. };