mob.hpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #ifndef MOB_HPP
  4. #define MOB_HPP
  5. #include <vector>
  6. #include "../common/database.hpp"
  7. #include "../common/mmo.hpp" // struct item
  8. #include "../common/timer.hpp"
  9. #include "status.hpp" // struct status data, struct status_change
  10. #include "unit.hpp" // unit_stop_walking(), unit_stop_attack()
  11. struct guardian_data;
  12. //This is the distance at which @autoloot works,
  13. //if the item drops farther from the player than this,
  14. //it will not be autolooted. [Skotlex]
  15. //Note: The range is unlimited unless this define is set.
  16. //#define AUTOLOOT_DISTANCE AREA_SIZE
  17. //The number of drops all mobs have and the max drop-slot that the steal skill will attempt to steal from.
  18. #define MAX_MOB_DROP 10
  19. #define MAX_MVP_DROP 3
  20. #define MAX_MOB_DROP_ADD 5
  21. #define MAX_MVP_DROP_ADD 2
  22. #define MAX_MOB_DROP_TOTAL (MAX_MOB_DROP+MAX_MOB_DROP_ADD)
  23. #define MAX_MVP_DROP_TOTAL (MAX_MVP_DROP+MAX_MVP_DROP_ADD)
  24. #define MAX_MINCHASE 30 //Max minimum chase value to use for mobs.
  25. //Min time between AI executions
  26. const t_tick MIN_MOBTHINKTIME = 100;
  27. //Min time before mobs do a check to call nearby friends for help (or for slaves to support their master)
  28. const t_tick MIN_MOBLINKTIME = 1000;
  29. //Min time between random walks
  30. const t_tick MIN_RANDOMWALKTIME = 4000;
  31. //Distance that slaves should keep from their master.
  32. #define MOB_SLAVEDISTANCE 2
  33. //Used to determine default enemy type of mobs (for use in eachinrange calls)
  34. #define DEFAULT_ENEMY_TYPE(md) (md->special_state.ai?BL_CHAR:BL_MOB|BL_PC|BL_HOM|BL_MER)
  35. /**
  36. * Mob constants
  37. * Added definitions for WoE:SE objects and other [L0ne_W0lf], [aleos]
  38. */
  39. enum MOBID {
  40. MOBID_PORING = 1002,
  41. MOBID_RED_PLANT = 1078,
  42. MOBID_BLUE_PLANT,
  43. MOBID_GREEN_PLANT,
  44. MOBID_YELLOW_PLANT,
  45. MOBID_WHITE_PLANT,
  46. MOBID_SHINING_PLANT,
  47. MOBID_BLACK_MUSHROOM = 1084,
  48. MOBID_MARINE_SPHERE = 1142,
  49. MOBID_EMPERIUM = 1288,
  50. MOBID_G_PARASITE = 1555,
  51. MOBID_G_FLORA = 1575,
  52. MOBID_G_HYDRA = 1579,
  53. MOBID_G_MANDRAGORA = 1589,
  54. MOBID_G_GEOGRAPHER = 1590,
  55. MOBID_GUARDIAN_STONE1 = 1907,
  56. MOBID_GUARDIAN_STONE2,
  57. MOBID_SILVERSNIPER = 2042,
  58. MOBID_MAGICDECOY_FIRE,
  59. MOBID_MAGICDECOY_WATER,
  60. MOBID_MAGICDECOY_EARTH,
  61. MOBID_MAGICDECOY_WIND,
  62. MOBID_ZANZOU = 2308,
  63. MOBID_S_HORNET = 2158,
  64. MOBID_S_GIANT_HORNET,
  65. MOBID_S_LUCIOLA_VESPA,
  66. MOBID_GUILD_SKILL_FLAG = 20269,
  67. MOBID_ABR_BATTLE_WARIOR = 20834,
  68. MOBID_ABR_DUAL_CANNON,
  69. MOBID_ABR_MOTHER_NET,
  70. MOBID_ABR_INFINITY,
  71. MOBID_BIONIC_WOODENWARRIOR = 20848,
  72. MOBID_BIONIC_WOODEN_FAIRY,
  73. MOBID_BIONIC_CREEPER,
  74. MOBID_BIONIC_HELLTREE,
  75. };
  76. ///Mob skill states.
  77. enum MobSkillState {
  78. MSS_ANY = -1,
  79. MSS_IDLE,
  80. MSS_WALK,
  81. MSS_LOOT,
  82. MSS_DEAD,
  83. MSS_BERSERK, //Aggressive mob attacking
  84. MSS_ANGRY, //Mob retaliating from being attacked.
  85. MSS_RUSH, //Mob following a player after being attacked.
  86. MSS_FOLLOW, //Mob following a player without being attacked.
  87. MSS_ANYTARGET,
  88. };
  89. enum MobDamageLogFlag
  90. {
  91. MDLF_NORMAL = 0,
  92. MDLF_HOMUN,
  93. MDLF_PET,
  94. MDLF_SELF
  95. };
  96. enum e_size : uint8 {
  97. SZ_SMALL = 0,
  98. SZ_MEDIUM,
  99. SZ_BIG,
  100. SZ_ALL,
  101. SZ_MAX
  102. };
  103. /// Random Monster Groups
  104. enum e_random_monster : uint16 {
  105. MOBG_BRANCH_OF_DEAD_TREE = 0,
  106. MOBG_PORING_BOX,
  107. MOBG_BLOODY_DEAD_BRANCH,
  108. MOBG_RED_POUCH_OF_SURPRISE,
  109. MOBG_CLASSCHANGE,
  110. MOBG_TAEKWON_MISSION,
  111. MOBG_MAX,
  112. };
  113. /// Random Monster Group Flags
  114. enum e_random_monster_flags {
  115. RMF_NONE = 0x00, ///< Apply no flags
  116. RMF_DB_RATE = 0x01, ///< Apply the summon success chance found in the list (otherwise get any monster from the db)
  117. RMF_CHECK_MOB_LV = 0x02, ///< Apply a monster level check
  118. RMF_MOB_NOT_BOSS = 0x04, ///< Selected monster should not be a Boss type (except those from MOBG_BLOODY_DEAD_BRANCH)
  119. RMF_MOB_NOT_SPAWN = 0x08, ///< Selected monster must have normal spawn
  120. RMF_MOB_NOT_PLANT = 0x10, ///< Selected monster should not be a Plant type
  121. RMF_ALL = 0xFF, ///< Apply all flags
  122. };
  123. enum e_mob_bosstype : uint8{
  124. BOSSTYPE_NONE,
  125. BOSSTYPE_MINIBOSS,
  126. BOSSTYPE_MVP
  127. };
  128. /// Monster Aegis AI types
  129. enum e_aegis_monstertype : uint16 {
  130. MONSTER_TYPE_01 = 0x81,
  131. MONSTER_TYPE_02 = 0x83,
  132. MONSTER_TYPE_03 = 0x1089,
  133. MONSTER_TYPE_04 = 0x3885,
  134. MONSTER_TYPE_05 = 0x2085,
  135. MONSTER_TYPE_06 = 0,
  136. MONSTER_TYPE_07 = 0x108B,
  137. MONSTER_TYPE_08 = 0x7085,
  138. MONSTER_TYPE_09 = 0x3095,
  139. MONSTER_TYPE_10 = 0x84,
  140. MONSTER_TYPE_11 = 0x84,
  141. MONSTER_TYPE_12 = 0x2085,
  142. MONSTER_TYPE_13 = 0x308D,
  143. //MONSTER_TYPE_14
  144. //MONSTER_TYPE_15
  145. //MONSTER_TYPE_16
  146. MONSTER_TYPE_17 = 0x91,
  147. //MONSTER_TYPE_18
  148. MONSTER_TYPE_19 = 0x3095,
  149. MONSTER_TYPE_20 = 0x3295,
  150. MONSTER_TYPE_21 = 0x3695,
  151. //MONSTER_TYPE_22
  152. //MONSTER_TYPE_23
  153. MONSTER_TYPE_24 = 0xA1,
  154. MONSTER_TYPE_25 = 0x1,
  155. MONSTER_TYPE_26 = 0xB695,
  156. MONSTER_TYPE_27 = 0x8084,
  157. };
  158. /// Aegis monster class types
  159. enum e_aegis_monsterclass : int8 {
  160. CLASS_NONE = -1,
  161. CLASS_NORMAL = 0,
  162. CLASS_BOSS,
  163. CLASS_GUARDIAN,
  164. CLASS_BATTLEFIELD = 4,
  165. CLASS_EVENT,
  166. CLASS_ALL,
  167. CLASS_MAX,
  168. };
  169. struct s_mob_skill {
  170. enum MobSkillState state;
  171. uint16 skill_id,skill_lv;
  172. short permillage;
  173. int casttime,delay;
  174. short cancel;
  175. short cond1;
  176. int64 cond2;
  177. short target;
  178. int val[5];
  179. short emotion;
  180. unsigned short msg_id;
  181. };
  182. struct s_mob_chat {
  183. uint16 msg_id;
  184. uint32 color;
  185. std::string msg;
  186. };
  187. class MobChatDatabase : public TypesafeYamlDatabase<uint16, s_mob_chat> {
  188. public:
  189. MobChatDatabase() : TypesafeYamlDatabase("MOB_CHAT_DB", 1) {
  190. }
  191. const std::string getDefaultLocation() override;
  192. uint64 parseBodyNode(const ryml::NodeRef& node) override;
  193. };
  194. struct s_mob_item_drop_ratio {
  195. t_itemid nameid;
  196. uint16 drop_ratio;
  197. std::vector<uint16> mob_ids;
  198. };
  199. class MobItemRatioDatabase : public TypesafeYamlDatabase<t_itemid, s_mob_item_drop_ratio> {
  200. public:
  201. MobItemRatioDatabase() : TypesafeYamlDatabase("MOB_ITEM_RATIO_DB", 1) {
  202. }
  203. const std::string getDefaultLocation() override;
  204. uint64 parseBodyNode(const ryml::NodeRef& node) override;
  205. };
  206. struct spawn_info {
  207. unsigned short mapindex;
  208. unsigned short qty;
  209. };
  210. /// Loooitem struct
  211. struct s_mob_lootitem {
  212. struct item item; ///< Item info
  213. unsigned short mob_id; ///< ID of monster that dropped the item
  214. };
  215. /// Struct for monster's drop item
  216. struct s_mob_drop {
  217. t_itemid nameid;
  218. uint32 rate;
  219. uint16 randomopt_group;
  220. bool steal_protected;
  221. };
  222. struct s_mob_db {
  223. uint32 id;
  224. std::string sprite, name, jname;
  225. t_exp base_exp;
  226. t_exp job_exp;
  227. t_exp mexp;
  228. uint16 range2, range3;
  229. std::vector<e_race2> race2; // celest
  230. uint16 lv;
  231. s_mob_drop dropitem[MAX_MOB_DROP_TOTAL], mvpitem[MAX_MVP_DROP_TOTAL];
  232. status_data status;
  233. view_data vd;
  234. uint32 option;
  235. std::vector<std::shared_ptr<s_mob_skill>> skill;
  236. uint16 damagetaken;
  237. e_mob_bosstype get_bosstype();
  238. };
  239. class MobDatabase : public TypesafeCachedYamlDatabase <uint32, s_mob_db> {
  240. private:
  241. bool parseDropNode(std::string nodeName, const ryml::NodeRef& node, uint8 max, s_mob_drop *drops);
  242. public:
  243. MobDatabase() : TypesafeCachedYamlDatabase("MOB_DB", 3, 1) {
  244. }
  245. const std::string getDefaultLocation() override;
  246. uint64 parseBodyNode(const ryml::NodeRef& node) override;
  247. void loadingFinished() override;
  248. };
  249. extern MobDatabase mob_db;
  250. struct s_map_mob_drop{
  251. uint16 mob_id;
  252. std::shared_ptr<s_mob_drop> drop;
  253. };
  254. struct s_map_drops{
  255. uint16 mapid;
  256. std::unordered_map<uint16, std::shared_ptr<s_mob_drop>> globals;
  257. std::unordered_map<uint16, std::unordered_map<uint16, std::shared_ptr<s_mob_drop>>> specific;
  258. };
  259. class MapDropDatabase : public TypesafeYamlDatabase<uint16, s_map_drops>{
  260. public:
  261. MapDropDatabase() : TypesafeYamlDatabase( "MAP_DROP_DB", 1 ){
  262. }
  263. const std::string getDefaultLocation() override;
  264. uint64 parseBodyNode( const ryml::NodeRef& node ) override;
  265. private:
  266. bool parseDrop( const ryml::NodeRef& node, std::unordered_map<uint16, std::shared_ptr<s_mob_drop>>& drops );
  267. };
  268. extern MapDropDatabase map_drop_db;
  269. struct mob_data {
  270. struct block_list bl;
  271. struct unit_data ud;
  272. struct view_data *vd;
  273. bool vd_changed;
  274. struct status_data status, *base_status; //Second one is in case of leveling up mobs, or tiny/large mobs.
  275. status_change sc;
  276. std::shared_ptr<s_mob_db> db; //For quick data access (saves doing mob_db(md->mob_id) all the time) [Skotlex]
  277. char name[NAME_LENGTH];
  278. struct s_specialState {
  279. unsigned int size : 2; //Small/Big monsters.
  280. enum mob_ai ai; //Special ai for summoned monsters.
  281. unsigned int clone : 1;/* is clone? 1:0 */
  282. } special_state; //Special mob information that does not needs to be zero'ed on mob respawn.
  283. struct s_MobState {
  284. unsigned int aggressive : 1; //Signals whether the mob AI is in aggressive mode or reactive mode. [Skotlex]
  285. unsigned int steal_coin_flag : 1;
  286. unsigned int soul_change_flag : 1; // Celest
  287. unsigned int alchemist: 1;
  288. unsigned int npc_killmonster: 1; //for new killmonster behavior
  289. unsigned int rebirth: 1; // NPC_Rebirth used
  290. unsigned int boss : 1;
  291. unsigned int copy_master_mode : 1; ///< Whether the spawned monster should copy the master's mode.
  292. enum MobSkillState skillstate;
  293. unsigned char steal_flag; //number of steal tries (to prevent steal exploit on mobs with few items) [Lupus]
  294. unsigned char attacked_count; //For rude attacked.
  295. int provoke_flag; // Celest
  296. } state;
  297. struct guardian_data* guardian_data;
  298. struct s_dmglog {
  299. int id; //char id
  300. unsigned int dmg;
  301. unsigned int flag : 2; //0: Normal. 1: Homunc exp. 2: Pet exp
  302. } dmglog[DAMAGELOG_SIZE];
  303. uint32 spotted_log[DAMAGELOG_SIZE];
  304. struct spawn_data *spawn; //Spawn data.
  305. int spawn_timer; //Required for Convex Mirror
  306. struct s_mob_lootitem *lootitems;
  307. short mob_id;
  308. unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex]
  309. int level;
  310. int target_id,attacked_id,norm_attacked_id;
  311. int areanpc_id; //Required in OnTouchNPC (to avoid multiple area touchs)
  312. int bg_id; // BattleGround System
  313. t_tick next_walktime,last_thinktime,last_linktime,last_pcneartime,dmgtick;
  314. short move_fail_count;
  315. short lootitem_count;
  316. short min_chase;
  317. unsigned char walktoxy_fail_count; //Pathfinding succeeds but the actual walking failed (e.g. Icewall lock)
  318. int deletetimer;
  319. int master_id,master_dist;
  320. int8 skill_idx; // Index of last used skill from db->skill[]
  321. t_tick skilldelay[MAX_MOBSKILL];
  322. char npc_event[EVENT_NAME_LENGTH];
  323. char idle_event[EVENT_NAME_LENGTH];
  324. /**
  325. * Did this monster summon something?
  326. * Used to flag summon deletions, saves a worth amount of memory
  327. **/
  328. bool can_summon;
  329. /**
  330. * MvP Tombstone NPC ID
  331. **/
  332. int tomb_nid;
  333. uint16 damagetaken;
  334. e_mob_bosstype get_bosstype();
  335. };
  336. class MobAvailDatabase : public YamlDatabase {
  337. public:
  338. MobAvailDatabase() : YamlDatabase("MOB_AVAIL_DB", 1) {
  339. }
  340. void clear() override{ };
  341. const std::string getDefaultLocation() override;
  342. uint64 parseBodyNode(const ryml::NodeRef& node) override;
  343. };
  344. struct s_randomsummon_entry {
  345. uint16 mob_id;
  346. uint32 rate;
  347. };
  348. struct s_randomsummon_group {
  349. uint16 random_id;
  350. uint16 default_mob_id;
  351. std::unordered_map<uint16, std::shared_ptr<s_randomsummon_entry>> list;
  352. };
  353. class MobSummonDatabase : public TypesafeYamlDatabase<uint16, s_randomsummon_group> {
  354. public:
  355. MobSummonDatabase() : TypesafeYamlDatabase("MOB_SUMMONABLE_DB", 1) {
  356. }
  357. const std::string getDefaultLocation() override;
  358. uint64 parseBodyNode(const ryml::NodeRef& node) override;
  359. };
  360. enum e_mob_skill_target {
  361. MST_TARGET = 0,
  362. MST_RANDOM, //Random Target!
  363. MST_SELF,
  364. MST_FRIEND,
  365. MST_MASTER,
  366. MST_AROUND5,
  367. MST_AROUND6,
  368. MST_AROUND7,
  369. MST_AROUND8,
  370. MST_AROUND1,
  371. MST_AROUND2,
  372. MST_AROUND3,
  373. MST_AROUND4,
  374. MST_AROUND = MST_AROUND4,
  375. };
  376. enum e_mob_skill_condition {
  377. MSC_ALWAYS = 0x0000,
  378. MSC_MYHPLTMAXRATE,
  379. MSC_MYHPINRATE,
  380. MSC_FRIENDHPLTMAXRATE,
  381. MSC_FRIENDHPINRATE,
  382. MSC_MYSTATUSON,
  383. MSC_MYSTATUSOFF,
  384. MSC_FRIENDSTATUSON,
  385. MSC_FRIENDSTATUSOFF,
  386. MSC_ATTACKPCGT,
  387. MSC_ATTACKPCGE,
  388. MSC_SLAVELT,
  389. MSC_SLAVELE,
  390. MSC_CLOSEDATTACKED,
  391. MSC_LONGRANGEATTACKED,
  392. MSC_AFTERSKILL,
  393. MSC_SKILLUSED,
  394. MSC_CASTTARGETED,
  395. MSC_RUDEATTACKED,
  396. MSC_MASTERHPLTMAXRATE,
  397. MSC_MASTERATTACKED,
  398. MSC_ALCHEMIST,
  399. MSC_SPAWN,
  400. MSC_MOBNEARBYGT,
  401. MSC_GROUNDATTACKED,
  402. MSC_DAMAGEDGT,
  403. };
  404. // The data structures for storing delayed item drops
  405. struct item_drop {
  406. struct item item_data;
  407. unsigned short mob_id;
  408. enum bl_type src_type;
  409. struct item_drop* next;
  410. };
  411. struct item_drop_list {
  412. int16 m, x, y; // coordinates
  413. int first_charid, second_charid, third_charid; // charid's of players with higher pickup priority
  414. struct item_drop* item; // linked list of drops
  415. };
  416. uint16 mobdb_searchname(const char * const str);
  417. std::shared_ptr<s_mob_db> mobdb_search_aegisname( const char* str );
  418. uint16 mobdb_searchname_array(const char *str, uint16 * out, uint16 size);
  419. int mobdb_checkid(const int id);
  420. struct view_data* mob_get_viewdata(int mob_id);
  421. void mob_set_dynamic_viewdata( struct mob_data* md );
  422. void mob_free_dynamic_viewdata( struct mob_data* md );
  423. struct mob_data *mob_once_spawn_sub(struct block_list *bl, int16 m, int16 x, int16 y, const char *mobname, int mob_id, const char *event, unsigned int size, enum mob_ai ai);
  424. int mob_once_spawn(map_session_data* sd, int16 m, int16 x, int16 y,
  425. const char* mobname, int mob_id, int amount, const char* event, unsigned int size, enum mob_ai ai);
  426. int mob_once_spawn_area(map_session_data* sd, int16 m,
  427. int16 x0, int16 y0, int16 x1, int16 y1, const char* mobname, int mob_id, int amount, const char* event, unsigned int size, enum mob_ai ai);
  428. bool mob_ksprotected (struct block_list *src, struct block_list *target);
  429. int mob_spawn_guardian(const char* mapname, int16 x, int16 y, const char* mobname, int mob_id, const char* event, int guardian, bool has_index); // Spawning Guardians [Valaris]
  430. int mob_spawn_bg(const char* mapname, int16 x, int16 y, const char* mobname, int mob_id, const char* event, unsigned int bg_id);
  431. int mob_guardian_guildchange(struct mob_data *md); //Change Guardian's ownership. [Skotlex]
  432. int mob_randomwalk(struct mob_data *md,t_tick tick);
  433. int mob_warpchase(struct mob_data *md, struct block_list *target);
  434. int mob_target(struct mob_data *md,struct block_list *bl,int dist);
  435. int mob_unlocktarget(struct mob_data *md, t_tick tick);
  436. struct mob_data* mob_spawn_dataset(struct spawn_data *data);
  437. int mob_spawn(struct mob_data *md);
  438. TIMER_FUNC(mob_delayspawn);
  439. int mob_setdelayspawn(struct mob_data *md);
  440. int mob_parse_dataset(struct spawn_data *data);
  441. void mob_log_damage(struct mob_data *md, struct block_list *src, int damage);
  442. void mob_damage(struct mob_data *md, struct block_list *src, int damage);
  443. int mob_dead(struct mob_data *md, struct block_list *src, int type);
  444. void mob_revive(struct mob_data *md, unsigned int hp);
  445. void mob_heal(struct mob_data *md,unsigned int heal);
  446. #define mob_stop_walking(md, type) unit_stop_walking(&(md)->bl, type)
  447. #define mob_stop_attack(md) unit_stop_attack(&(md)->bl)
  448. void mob_clear_spawninfo();
  449. void do_init_mob(void);
  450. void do_final_mob(bool is_reload);
  451. TIMER_FUNC(mob_timer_delete);
  452. int mob_deleteslave(struct mob_data *md);
  453. int mob_random_class (int *value, size_t count);
  454. int mob_get_random_id(int type, enum e_random_monster_flags flag, int lv);
  455. int mob_class_change(struct mob_data *md,int mob_id);
  456. int mob_warpslave(struct block_list *bl, int range);
  457. int mob_linksearch(struct block_list *bl,va_list ap);
  458. bool mob_chat_display_message (mob_data &md, uint16 msg_id);
  459. int mobskill_use(struct mob_data *md,t_tick tick,int event, int64 damage = 0);
  460. int mobskill_event(struct mob_data *md,struct block_list *src,t_tick tick, int flag, int64 damage = 0);
  461. int mob_summonslave(struct mob_data *md2,int *value,int amount,uint16 skill_id);
  462. int mob_countslave(struct block_list *bl);
  463. int mob_count_sub(struct block_list *bl, va_list ap);
  464. int mob_is_clone(int mob_id);
  465. int mob_clone_spawn(map_session_data *sd, int16 m, int16 x, int16 y, const char *event, int master_id, enum e_mode mode, int flag, unsigned int duration);
  466. int mob_clone_delete(struct mob_data *md);
  467. void mob_reload_itemmob_data(void);
  468. void mob_reload(void);
  469. void mob_add_spawn(uint16 mob_id, const struct spawn_info& new_spawn);
  470. const std::vector<spawn_info> mob_get_spawns(uint16 mob_id);
  471. bool mob_has_spawn(uint16 mob_id);
  472. int mob_getdroprate(struct block_list *src, std::shared_ptr<s_mob_db> mob, int base_rate, int drop_modifier, mob_data* md = nullptr);
  473. // MvP Tomb System
  474. int mvptomb_setdelayspawn(struct npc_data *nd);
  475. TIMER_FUNC(mvptomb_delayspawn);
  476. void mvptomb_create(struct mob_data *md, char *killer, time_t time);
  477. void mvptomb_destroy(struct mob_data *md);
  478. void mob_setdropitem_option(struct item *itm, struct s_mob_drop *mobdrop);
  479. #define CHK_MOBSIZE(size) ((size) >= SZ_SMALL && (size) < SZ_MAX) /// Check valid Monster Size
  480. #endif /* MOB_HPP */