instance.hpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #ifndef INSTANCE_HPP
  4. #define INSTANCE_HPP
  5. #include <deque>
  6. #include <memory>
  7. #include <string>
  8. #include <unordered_map>
  9. #include <vector>
  10. #include <common/cbasetypes.hpp>
  11. #include <common/database.hpp>
  12. #include <common/mmo.hpp>
  13. #include "script.hpp"
  14. enum send_target : uint8;
  15. struct block_list;
  16. extern int16 instance_start;
  17. extern int instance_count;
  18. #define INSTANCE_NAME_LENGTH (60+1)
  19. enum e_instance_state : uint8 {
  20. INSTANCE_IDLE,
  21. INSTANCE_BUSY
  22. };
  23. enum e_instance_mode : uint8 {
  24. IM_NONE,
  25. IM_CHAR,
  26. IM_PARTY,
  27. IM_GUILD,
  28. IM_CLAN,
  29. IM_MAX,
  30. };
  31. enum e_instance_enter : uint8 {
  32. IE_OK,
  33. IE_NOMEMBER,
  34. IE_NOINSTANCE,
  35. IE_OTHER
  36. };
  37. enum e_instance_notify : uint8 {
  38. IN_NOTIFY = 0,
  39. IN_DESTROY_LIVE_TIMEOUT,
  40. IN_DESTROY_ENTER_TIMEOUT,
  41. IN_DESTROY_USER_REQUEST,
  42. IN_CREATE_FAIL,
  43. };
  44. struct s_instance_map {
  45. int16 m, src_m;
  46. };
  47. /// Instance data
  48. struct s_instance_data {
  49. int id; ///< Instance DB ID
  50. e_instance_state state; ///< State of instance
  51. e_instance_mode mode; ///< Mode of instance
  52. int owner_id; ///< Owner ID of instance
  53. int64 keep_limit; ///< Life time of instance
  54. int keep_timer; ///< Life time ID
  55. int64 idle_limit; ///< Idle time of instance
  56. int idle_timer; ///< Idle timer ID
  57. bool nonpc;
  58. bool nomapflag;
  59. struct reg_db regs; ///< Instance variables for scripts
  60. std::vector<s_instance_map> map; ///< Array of maps in instance
  61. s_instance_data() :
  62. id(0),
  63. state(INSTANCE_IDLE),
  64. mode(IM_PARTY),
  65. owner_id(0),
  66. keep_limit(0),
  67. keep_timer(INVALID_TIMER),
  68. idle_limit(0),
  69. idle_timer(INVALID_TIMER),
  70. nonpc(false),
  71. nomapflag(false),
  72. regs(),
  73. map() { }
  74. };
  75. /// Instance DB entry
  76. struct s_instance_db {
  77. int id; ///< Instance DB ID
  78. std::string name; ///< Instance name
  79. int64 limit, ///< Duration limit
  80. timeout; ///< Timeout limit
  81. bool nonpc;
  82. bool nomapflag;
  83. bool destroyable; ///< Destroyable flag
  84. bool infinite_limit; ///< Infinite limit flag
  85. bool infinite_timeout; ///< Infinite timeout limit flag
  86. struct point enter; ///< Instance entry point
  87. std::vector<int16> maplist; ///< Maps in instance
  88. };
  89. class InstanceDatabase : public TypesafeYamlDatabase<int32, s_instance_db> {
  90. public:
  91. InstanceDatabase() : TypesafeYamlDatabase("INSTANCE_DB", 2, 1) {
  92. }
  93. const std::string getDefaultLocation() override;
  94. uint64 parseBodyNode(const ryml::NodeRef& node) override;
  95. };
  96. extern InstanceDatabase instance_db;
  97. extern std::unordered_map<int, std::shared_ptr<s_instance_data>> instances;
  98. std::shared_ptr<s_instance_db> instance_search_db_name(const char* name);
  99. void instance_getsd(int instance_id, map_session_data *&sd, enum send_target *target);
  100. int instance_create(int owner_id, const char *name, e_instance_mode mode);
  101. bool instance_destroy(int instance_id);
  102. void instance_destroy_command(map_session_data *sd);
  103. e_instance_enter instance_enter(map_session_data *sd, int instance_id, const char *name, short x, short y);
  104. bool instance_reqinfo(map_session_data *sd, int instance_id);
  105. bool instance_addusers(int instance_id);
  106. bool instance_delusers(int instance_id);
  107. void instance_generate_mapname(int map_id, int instance_id, char outname[MAP_NAME_LENGTH]);
  108. int16 instance_mapid(int16 m, int instance_id);
  109. size_t instance_addmap( int instance_id );
  110. void instance_addnpc(std::shared_ptr<s_instance_data> idata);
  111. void do_reload_instance(void);
  112. void do_init_instance(void);
  113. void do_final_instance(void);
  114. #endif /* INSTANCE_HPP */