Horizon Official Technical Documentation
Horizon::Zone::MonsterDatabase Class Reference

#include <MonsterDB.hpp>

+ Collaboration diagram for Horizon::Zone::MonsterDatabase:

Public Member Functions

 MonsterDatabase ()
 
 ~MonsterDatabase ()
 
bool load ()
 
std::shared_ptr< const monster_config_dataget_monster_by_id (uint32_t id)
 
std::shared_ptr< const monster_config_dataget_monster_by_name (std::string name)
 
std::shared_ptr< std::vector< std::shared_ptr< const monster_skill_config_data > > > get_monster_skill_by_id (uint32_t monster_id)
 

Static Public Member Functions

static MonsterDatabaseget_instance ()
 

Protected Member Functions

bool load_internal (sol::object const &key, sol::object const &value)
 
bool parse_level (sol::table const &table, monster_config_data &data)
 
bool parse_hp (sol::table const &table, monster_config_data &data)
 
bool parse_sp (sol::table const &table, monster_config_data &data)
 
bool parse_reward_base_exp (sol::table const &table, monster_config_data &data)
 
bool parse_reward_job_exp (sol::table const &table, monster_config_data &data)
 
bool parse_attack_range (sol::table const &table, monster_config_data &data)
 
bool parse_attack (sol::table const &table, monster_config_data &data)
 
bool parse_defense (sol::table const &table, monster_config_data &data)
 
bool parse_magic_defense (sol::table const &table, monster_config_data &data)
 
bool parse_view_range (sol::table const &table, monster_config_data &data)
 
bool parse_chase_range (sol::table const &table, monster_config_data &data)
 
bool parse_size (sol::table const &table, monster_config_data &data)
 
bool parse_race (sol::table const &table, monster_config_data &data)
 
bool parse_element (sol::table const &table, monster_config_data &data)
 
bool parse_mode (sol::table const &table, monster_config_data &data)
 
bool parse_move_speed (sol::table const &table, monster_config_data &data)
 
bool parse_attack_delay (sol::table const &table, monster_config_data &data)
 
bool parse_attack_motion (sol::table const &table, monster_config_data &data)
 
bool parse_damage_motion (sol::table const &table, monster_config_data &data)
 
bool parse_mvp_exp (sol::table const &table, monster_config_data &data)
 
bool parse_damage_taken_rate (sol::table const &table, monster_config_data &data)
 
bool parse_stats (sol::table const &table, monster_config_data &data)
 
bool parse_drops (sol::table const &table, monster_config_data &data, bool mvp)
 
bool parse_view (sol::table const &table, monster_config_data &data)
 
bool load_skill_internal (sol::object const &key, sol::object const &value)
 

Private Attributes

LockedLookupTable< uint32_t, std::shared_ptr< const monster_config_data > > _monster_db
 
LockedLookupTable< std::string, std::shared_ptr< const monster_config_data > > _monster_str_db
 
LockedLookupTable< uint32_t, std::shared_ptr< std::vector< std::shared_ptr< const monster_skill_config_data > > > > _monster_skill_db
 

Constructor & Destructor Documentation

◆ MonsterDatabase()

MonsterDatabase::MonsterDatabase ( )
43{
44 //
45}

◆ ~MonsterDatabase()

MonsterDatabase::~MonsterDatabase ( )
48{
49 //
50}

Member Function Documentation

◆ get_instance()

static MonsterDatabase * Horizon::Zone::MonsterDatabase::get_instance ( )
inlinestatic
49 {
50 static MonsterDatabase instance;
51 return &instance;
52 }
MonsterDatabase()
Definition: MonsterDB.cpp:42

◆ get_monster_by_id()

std::shared_ptr< const monster_config_data > Horizon::Zone::MonsterDatabase::get_monster_by_id ( uint32_t  id)
inline
89{ return _monster_db.at(id, nullptr); }
LockedLookupTable< uint32_t, std::shared_ptr< const monster_config_data > > _monster_db
Definition: MonsterDB.hpp:94
Value at(Key const &key, Value const &default_value=Value()) const
Definition: LockedLookupTable.hpp:63

References _monster_db, and LockedLookupTable< Key, Value, Hash >::at().

+ Here is the call graph for this function:

◆ get_monster_by_name()

std::shared_ptr< const monster_config_data > Horizon::Zone::MonsterDatabase::get_monster_by_name ( std::string  name)
inline
90{ return _monster_str_db.at(name); }
LockedLookupTable< std::string, std::shared_ptr< const monster_config_data > > _monster_str_db
Definition: MonsterDB.hpp:95

References _monster_str_db, and LockedLookupTable< Key, Value, Hash >::at().

+ Here is the call graph for this function:

◆ get_monster_skill_by_id()

std::shared_ptr< std::vector< std::shared_ptr< const monster_skill_config_data > > > Horizon::Zone::MonsterDatabase::get_monster_skill_by_id ( uint32_t  monster_id)
inline
92{ return _monster_skill_db.at(monster_id); }
LockedLookupTable< uint32_t, std::shared_ptr< std::vector< std::shared_ptr< const monster_skill_config_data > > > > _monster_skill_db
Definition: MonsterDB.hpp:96

References _monster_skill_db, and LockedLookupTable< Key, Value, Hash >::at().

+ Here is the call graph for this function:

◆ load()

bool MonsterDatabase::load ( )
53{
54 std::shared_ptr<sol::state> lua = std::make_shared<sol::state>();
55
56 lua->open_libraries(sol::lib::base);
57 lua->open_libraries(sol::lib::package);
58
59 std::shared_ptr<UnitComponent> unit_component = std::make_shared<UnitComponent>();
60 std::shared_ptr<MonsterComponent> monster_component = std::make_shared<MonsterComponent>();
61 std::shared_ptr<ItemComponent> item_component = std::make_shared<ItemComponent>();
62
63 unit_component->sync_definitions(lua);
64 unit_component->sync_data_types(lua);
65 unit_component->sync_functions(lua);
66
67 monster_component->sync_definitions(lua);
68 monster_component->sync_data_types(lua);
69
70 item_component->sync_definitions(lua);
71 item_component->sync_data_types(lua);
72 item_component->sync_functions(lua);
73
74 try {
75 int total_entries = 0;
76 std::string file_path = sZone->config().get_static_db_path().string() + "monster_db.lua";
77 sol::load_result fx = lua->load_file(file_path);
78 sol::table mob_tbl = fx();
79 mob_tbl.for_each([this, &total_entries] (sol::object const &key, sol::object const &value) {
80 total_entries += load_internal(key, value);
81 });
82 HLog(info) << "Loaded " << total_entries << " entries from '" << file_path << "'.";
83 } catch(const std::exception &e) {
84 HLog(error) << "MonsterDatabase::load: " << e.what();
85 return false;
86 }
87
88 try {
89 int total_entries = 0;
90 std::string file_path = sZone->config().get_static_db_path().string() + "monster_skill_db.lua";
91 lua->script_file(file_path);
92 sol::load_result fx = lua->load_file(file_path);
93 sol::table mob_tbl = fx();
94 mob_tbl.for_each([this, &total_entries] (sol::object const &key, sol::object const &value) {
95 total_entries += load_skill_internal(key, value);
96 });
97 HLog(info) << "Loaded " << total_entries << " entries from '" << file_path << "'.";
98 } catch(const std::exception &e) {
99 HLog(error) << "MonsterDatabase::load: " << e.what();
100 return false;
101 }
102
103 return true;
104}
#define HLog(type)
Definition: Logger.hpp:122
#define sZone
Definition: Zone.hpp:247
bool load_skill_internal(sol::object const &key, sol::object const &value)
Definition: MonsterDB.cpp:779
bool load_internal(sol::object const &key, sol::object const &value)
Definition: MonsterDB.cpp:106

References HLog, load_internal(), load_skill_internal(), and sZone.

+ Here is the call graph for this function:

◆ load_internal()

bool MonsterDatabase::load_internal ( sol::object const &  key,
sol::object const &  value 
)
protected
107{
109
110// -- ================ Mandatory fields ==============================
111 std::string sprite_name = key.as<std::string>();
112 std::strncpy(data.sprite_name, sprite_name.c_str(), MAX_UNIT_NAME_LENGTH);
113
114 if (value.get_type() != sol::type::table) {
115 HLog(error) << "Value for '" << data.sprite_name << "' is not a table... skipping.";
116 return false;
117 }
118
119 sol::table m_tbl = value.as<sol::table>();
120
121 data.monster_id = m_tbl.get_or<uint16_t>("Id", 0);
122
123 if (data.monster_id <= 0 || data.monster_id > MAX_MOB_DB) {
124 HLog(warning) << "Monster ID for '" << data.name << "' is out of range... skipping.";
125 return false;
126 }
127
128 std::string name = m_tbl.get_or<std::string>("Name", "");
129 std::strncpy(data.name, name.c_str(), MAX_UNIT_NAME_LENGTH);
130
131 if (name.size() == 0) {
132 HLog(warning) << "Monster Name for '" << data.monster_id << "' is a mandatory field... skipping.";
133 return false;
134 }
135
136// -- ================ Optional fields ==============================
137 std::string alt_name = m_tbl.get_or<std::string>("JName", "");
138 std::strncpy(data.alt_name, alt_name.c_str(), MAX_UNIT_NAME_LENGTH);
139
140 if (parse_level(m_tbl, data) == false)
141 return false;
142
143 if (parse_hp(m_tbl, data) == false)
144 return false;
145
146 if (parse_sp(m_tbl, data) == false)
147 return false;
148
149 if (parse_reward_base_exp(m_tbl, data) == false)
150 return false;
151
152 if (parse_reward_job_exp(m_tbl, data) == false)
153 return false;
154
155 if (parse_attack_range(m_tbl, data) == false)
156 return false;
157
158 if (parse_attack(m_tbl, data) == false)
159 return false;
160
161 if (parse_defense(m_tbl, data) == false)
162 return false;
163
164 if (parse_magic_defense(m_tbl, data) == false)
165 return false;
166
167 if (parse_view_range(m_tbl, data) == false)
168 return false;
169
170 if (parse_chase_range(m_tbl, data) == false)
171 return false;
172
173 if (parse_size(m_tbl, data) == false)
174 return false;
175
176 if (parse_race(m_tbl, data) == false)
177 return false;
178
179 if (parse_element(m_tbl, data) == false)
180 return false;
181
182 if (parse_mode(m_tbl, data) == false)
183 return false;
184
185 if (parse_move_speed(m_tbl, data) == false)
186 return false;
187
188 if (parse_attack_delay(m_tbl, data) == false)
189 return false;
190
191 if (parse_attack_motion(m_tbl, data) == false)
192 return false;
193
194 if (parse_damage_motion(m_tbl, data) == false)
195 return false;
196
197 if (parse_mvp_exp(m_tbl, data) == false)
198 return false;
199
200 if (parse_damage_taken_rate(m_tbl, data) == false)
201 return false;
202
203 if (parse_stats(m_tbl, data) == false)
204 return false;
205
206 if (parse_drops(m_tbl, data, false) == false)
207 return false;
208
209 if (parse_drops(m_tbl, data, true) == false)
210 return false;
211
212 if (parse_view(m_tbl, data) == false)
213 return false;
214
215 _monster_db.insert(data.monster_id, std::make_shared<monster_config_data>(data));
216
217 _monster_str_db.insert(data.sprite_name, std::make_shared<monster_config_data>(data));
218
219 return true;
220}
#define MAX_UNIT_NAME_LENGTH
Definition: Client.hpp:34
#define MAX_MOB_DB
Definition: MonsterDefinitions.hpp:40
bool parse_chase_range(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:380
bool parse_reward_job_exp(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:282
bool parse_reward_base_exp(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:267
bool parse_mvp_exp(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:528
bool parse_damage_taken_rate(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:543
bool parse_move_speed(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:468
bool parse_defense(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:335
bool parse_hp(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:237
bool parse_damage_motion(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:513
bool parse_attack_delay(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:483
bool parse_size(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:395
bool parse_stats(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:558
bool parse_element(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:425
bool parse_attack_motion(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:498
bool parse_race(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:410
bool parse_sp(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:252
bool parse_view_range(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:365
bool parse_level(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:222
bool parse_view(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:680
bool parse_drops(sol::table const &table, monster_config_data &data, bool mvp)
Definition: MonsterDB.cpp:615
bool parse_magic_defense(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:350
bool parse_mode(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:448
bool parse_attack(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:312
bool parse_attack_range(sol::table const &table, monster_config_data &data)
Definition: MonsterDB.cpp:297
void insert(const Key &key, const Value &value)
Definition: LockedLookupTable.hpp:68
Definition: MonsterDefinitions.hpp:203
char sprite_name[MAX_UNIT_NAME_LENGTH]
Definition: MonsterDefinitions.hpp:205
char alt_name[MAX_UNIT_NAME_LENGTH]
Definition: MonsterDefinitions.hpp:207
uint16_t monster_id
Definition: MonsterDefinitions.hpp:204
char name[MAX_UNIT_NAME_LENGTH]
Definition: MonsterDefinitions.hpp:206

References _monster_db, _monster_str_db, monster_config_data::alt_name, HLog, LockedLookupTable< Key, Value, Hash >::insert(), MAX_MOB_DB, MAX_UNIT_NAME_LENGTH, monster_config_data::monster_id, monster_config_data::name, parse_attack(), parse_attack_delay(), parse_attack_motion(), parse_attack_range(), parse_chase_range(), parse_damage_motion(), parse_damage_taken_rate(), parse_defense(), parse_drops(), parse_element(), parse_hp(), parse_level(), parse_magic_defense(), parse_mode(), parse_move_speed(), parse_mvp_exp(), parse_race(), parse_reward_base_exp(), parse_reward_job_exp(), parse_size(), parse_sp(), parse_stats(), parse_view(), parse_view_range(), and monster_config_data::sprite_name.

Referenced by load().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_skill_internal()

bool MonsterDatabase::load_skill_internal ( sol::object const &  key,
sol::object const &  value 
)
protected
780{
781 try {
782 std::vector<std::shared_ptr<const monster_skill_config_data>> skills;
783 std::shared_ptr<const monster_config_data> monster = nullptr;
784 if (key.is<std::string>()) {
785 std::string mob_name = key.as<std::string>();
786 if ((monster = MonsterDB->get_monster_by_name(mob_name)) == nullptr) {
787 HLog(error) << "Error parsing skills for non-existent monster '" << mob_name << "'.";
788 return false;
789 }
790 } else if (key.is<int>()) {
791 int mob_id = key.as<int>();
792 if ((monster = MonsterDB->get_monster_by_id(mob_id)) == nullptr) {
793 HLog(error) << "Error parsing skills for non-existent monster with ID " << mob_id << ".";
794 return false;
795 }
796 }
797
798 if (value.get_type() != sol::type::table) {
799 HLog(error) << "MonsterDatabase::load_skill_internal: Error parsing value of unexpected type, value should be a table.";
800 return false;
801 }
802
803 sol::table skill_tbl = value.as<sol::table>();
804
805 for (auto const &s : skill_tbl) {
806 sol::object const &k = s.first;
807 sol::object const &v = s.second;
809
810 std::shared_ptr<const skill_config_data> skill = nullptr;
811 if (k.is<std::string>()) {
812 std::string skill_name = k.as<std::string>();
813
814 if ((skill = SkillDB->get_skill_by_name(skill_name)) == nullptr) {
815 HLog(error) << "Error loading non-existent skill '" << skill_name << "' for monster '" << monster->sprite_name << "'.";
816 continue;
817 }
818 } else if (k.is<int>()) {
819 int skill_id = k.as<int>();
820
821 if ((skill = SkillDB->get_skill_by_id(skill_id)) == nullptr) {
822 HLog(error) << "Error loading non-existent skill with Id " << skill_id << " for monster '" << monster->sprite_name << "'.";
823 continue;
824 }
825 }
826
827 mskd.skill_id = skill->skill_id;
828
829 if (v.get_type() != sol::type::table) {
830 HLog(error) << "MonsterDatabase::load_skill_internal: Error loading value for skill '" << skill->name << "' of monster '" << monster->sprite_name << "'.";
831 continue;
832 }
833
834 sol::table stbl = v.as<sol::table>();
835
836 sol::optional<int> maybe_val = stbl.get<sol::optional<int>>("SkillLevel");
837 if (maybe_val)
838 mskd.skill_level = maybe_val.value();
839 else
840 mskd.skill_level = 1;
841
842 maybe_val = stbl.get<sol::optional<int>>("SkillTarget");
843 if (maybe_val)
844 mskd.target = (monster_skill_target_type) maybe_val.value();
845 else
846 mskd.target = MONSTER_SKILL_TARGET_CURRENT;
847
848 maybe_val = stbl.get<sol::optional<int>>("SkillState");
849 if (maybe_val)
850 mskd.state = (monster_skill_state_type) maybe_val.value();
851 else
852 mskd.state = MONSTER_SKILL_STATE_ANY;
853
854 maybe_val = stbl.get<sol::optional<int>>("Rate");
855 if (maybe_val)
856 mskd.skill_invoke_rate = maybe_val.value();
857 else
858 mskd.skill_invoke_rate = 500;
859
860 maybe_val = stbl.get<sol::optional<int>>("CastTime");
861 if (maybe_val)
862 mskd.cast_time = maybe_val.value();
863 else
864 mskd.cast_time = 0;
865
866 maybe_val = stbl.get<sol::optional<int>>("Delay");
867 if (maybe_val)
868 mskd.delay = maybe_val.value();
869 else
870 mskd.delay = 0;
871
872 sol::optional<bool> maybe_bool = stbl.get<sol::optional<bool>>("Cancellable");
873 if (maybe_bool)
874 mskd.cancelable = maybe_bool.value();
875
876 maybe_val = stbl.get<sol::optional<int>>("CastCondition");
877 if (maybe_val)
878 mskd.cast_condition = maybe_val.value();
879 else
880 mskd.cast_condition = 0;
881
882 maybe_val = stbl.get<sol::optional<int>>("ConditionData");
883 if (maybe_val)
884 mskd.condition_data = maybe_val.value();
885 else
886 mskd.condition_data = 0;
887
888 maybe_val = stbl.get<sol::optional<int>>("val0");
889 if (maybe_val)
890 mskd.val[0] = maybe_val.value();
891 else
892 mskd.val[0] = 0;
893
894 maybe_val = stbl.get<sol::optional<int>>("val1");
895 if (maybe_val)
896 mskd.val[1] = maybe_val.value();
897 else
898 mskd.val[1] = 0;
899
900 maybe_val = stbl.get<sol::optional<int>>("val2");
901 if (maybe_val)
902 mskd.val[2] = maybe_val.value();
903 else
904 mskd.val[2] = 0;
905
906 maybe_val = stbl.get<sol::optional<int>>("val3");
907 if (maybe_val)
908 mskd.val[3] = maybe_val.value();
909 else
910 mskd.val[3] = 0;
911
912 maybe_val = stbl.get<sol::optional<int>>("val4");
913 if (maybe_val)
914 mskd.val[4] = maybe_val.value();
915 else
916 mskd.val[4] = 0;
917
918 maybe_val = stbl.get<sol::optional<int>>("Emotion");
919 if (maybe_val)
920 mskd.emotion_id = maybe_val.value();
921 else
922 mskd.emotion_id = 0;
923
924 maybe_val = stbl.get<sol::optional<int>>("ChatMsgID");
925 if (maybe_val)
926 mskd.msg_id = maybe_val.value();
927 else
928 mskd.msg_id = 0;
929
930 skills.push_back(std::make_shared<const monster_skill_config_data>(mskd));
931 }
932
933 _monster_skill_db.insert(monster->monster_id, std::make_shared<std::vector<std::shared_ptr<const monster_skill_config_data>>>(skills));
934
935 } catch (sol::error &e) {
936 HLog(error) << "MonsterDatabase::load_skill_internal:" << e.what();
937 }
938
939 return true;
940}
#define MonsterDB
Definition: MonsterDB.hpp:101
monster_skill_target_type
Definition: MonsterDefinitions.hpp:125
@ MONSTER_SKILL_TARGET_CURRENT
Definition: MonsterDefinitions.hpp:126
monster_skill_state_type
Definition: MonsterDefinitions.hpp:112
@ MONSTER_SKILL_STATE_ANY
Definition: MonsterDefinitions.hpp:113
#define SkillDB
Definition: SkillDB.hpp:145
Definition: MonsterDefinitions.hpp:186
int16_t emotion_id
Definition: MonsterDefinitions.hpp:196
int cast_time
Definition: MonsterDefinitions.hpp:190
uint16_t skill_level
Definition: MonsterDefinitions.hpp:188
uint16_t skill_id
Definition: MonsterDefinitions.hpp:187
bool cancelable
Definition: MonsterDefinitions.hpp:192
int16_t cast_condition
Definition: MonsterDefinitions.hpp:193
int delay
Definition: MonsterDefinitions.hpp:191
uint16_t msg_id
Definition: MonsterDefinitions.hpp:197
int val[5]
Definition: MonsterDefinitions.hpp:195
int16_t skill_invoke_rate
Definition: MonsterDefinitions.hpp:189
int32_t condition_data
Definition: MonsterDefinitions.hpp:194

References _monster_skill_db, monster_skill_config_data::cancelable, monster_skill_config_data::cast_condition, monster_skill_config_data::cast_time, monster_skill_config_data::condition_data, monster_skill_config_data::delay, monster_skill_config_data::emotion_id, HLog, LockedLookupTable< Key, Value, Hash >::insert(), MONSTER_SKILL_STATE_ANY, MONSTER_SKILL_TARGET_CURRENT, MonsterDB, monster_skill_config_data::msg_id, monster_skill_config_data::skill_id, monster_skill_config_data::skill_invoke_rate, monster_skill_config_data::skill_level, SkillDB, and monster_skill_config_data::val.

Referenced by load().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_attack()

bool MonsterDatabase::parse_attack ( sol::table const &  table,
monster_config_data data 
)
protected
313{
314 try {
315 sol::optional<sol::table> maybe_val = table.get<sol::optional<sol::table>>("Attack");
316 if (maybe_val) {
317 sol::table r_tbl = maybe_val.value();
318 if (r_tbl[1].get_type() != sol::type::number || r_tbl[2].get_type() != sol::type::number) {
319 HLog(error) << "Attack for monster '" << data.sprite_name << "' is not a numeric type... skipping.";
320 return false;
321 }
322 data.attack_damage[0] = r_tbl[1];
323 data.attack_damage[1] = r_tbl[2];
324 } else {
325 data.attack_damage[0] = 0;
326 data.attack_damage[1] = 0;
327 }
328 } catch (sol::error &error) {
329 HLog(error) << "Error parsing Attack for monster '" << data.sprite_name << "' - " << error.what() << ".";
330 }
331
332 return true;
333}
int32_t attack_damage[2]
Definition: MonsterDefinitions.hpp:213

References monster_config_data::attack_damage, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_attack_delay()

bool MonsterDatabase::parse_attack_delay ( sol::table const &  table,
monster_config_data data 
)
protected
484{
485 try {
486 sol::optional<int> maybe_val = table.get<sol::optional<int>>("AttackDelay");
487 if (maybe_val)
488 data.attack_delay = maybe_val.value();
489 else
490 data.attack_delay = 0;
491 } catch (sol::error &error) {
492 HLog(error) << "Error parsing AttackDelay for monster '" << data.sprite_name << "' - " << error.what() << ".";
493 }
494
495 return true;
496}
int32_t attack_delay
Definition: MonsterDefinitions.hpp:235

References monster_config_data::attack_delay, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_attack_motion()

bool MonsterDatabase::parse_attack_motion ( sol::table const &  table,
monster_config_data data 
)
protected
499{
500 try {
501 sol::optional<int> maybe_val = table.get<sol::optional<int>>("AttackMotion");
502 if (maybe_val)
503 data.attack_motion = maybe_val.value();
504 else
505 data.attack_motion = 0;
506 } catch (sol::error &error) {
507 HLog(error) << "Error parsing AttackMotion for monster '" << data.sprite_name << "' - " << error.what() << ".";
508 }
509
510 return true;
511}
int32_t attack_motion
Definition: MonsterDefinitions.hpp:236

References monster_config_data::attack_motion, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_attack_range()

bool MonsterDatabase::parse_attack_range ( sol::table const &  table,
monster_config_data data 
)
protected
298{
299 try {
300 sol::optional<int> maybe_val = table.get<sol::optional<int>>("AttackRange");
301 if (maybe_val)
302 data.attack_range = maybe_val.value();
303 else
304 data.attack_range = 1;
305 } catch (sol::error &error) {
306 HLog(error) << "Error parsing AttackRange for monster '" << data.sprite_name << "' - " << error.what() << ".";
307 }
308
309 return true;
310}
int32_t attack_range
Definition: MonsterDefinitions.hpp:212

References monster_config_data::attack_range, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_chase_range()

bool MonsterDatabase::parse_chase_range ( sol::table const &  table,
monster_config_data data 
)
protected
381{
382 try {
383 sol::optional<int> maybe_val = table.get<sol::optional<int>>("ChaseRange");
384 if (maybe_val)
385 data.chase_range = maybe_val.value();
386 else
387 data.chase_range = 1;
388 } catch (sol::error &error) {
389 HLog(error) << "Error parsing ChaseRange for monster '" << data.sprite_name << "' - " << error.what() << ".";
390 }
391
392 return true;
393}
short chase_range
Definition: MonsterDefinitions.hpp:227

References monster_config_data::chase_range, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_damage_motion()

bool MonsterDatabase::parse_damage_motion ( sol::table const &  table,
monster_config_data data 
)
protected
514{
515 try {
516 sol::optional<int> maybe_val = table.get<sol::optional<int>>("DamageMotion");
517 if (maybe_val)
518 data.damage_motion = maybe_val.value();
519 else
520 data.damage_motion = 0;
521 } catch (sol::error &error) {
522 HLog(error) << "Error parsing DamageMotion for monster '" << data.sprite_name << "' - " << error.what() << ".";
523 }
524
525 return true;
526}
int32_t damage_motion
Definition: MonsterDefinitions.hpp:237

References monster_config_data::damage_motion, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_damage_taken_rate()

bool MonsterDatabase::parse_damage_taken_rate ( sol::table const &  table,
monster_config_data data 
)
protected
544{
545 try {
546 sol::optional<int> maybe_val = table.get<sol::optional<int>>("DamageTakenRate");
547 if (maybe_val)
548 data.damage_taken_rate = maybe_val.value();
549 else
550 data.damage_taken_rate = 100;
551 } catch (sol::error &error) {
552 HLog(error) << "Error parsing DamageTakenRate for monster '" << data.sprite_name << "' - " << error.what() << ".";
553 }
554
555 return true;
556}
int32_t damage_taken_rate
Definition: MonsterDefinitions.hpp:238

References monster_config_data::damage_taken_rate, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_defense()

bool MonsterDatabase::parse_defense ( sol::table const &  table,
monster_config_data data 
)
protected
336{
337 try {
338 sol::optional<int> maybe_val = table.get<sol::optional<int>>("Def");
339 if (maybe_val)
340 data.defense = maybe_val.value();
341 else
342 data.defense = 0;
343 } catch (sol::error &error) {
344 HLog(error) << "Error parsing Def for monster '" << data.sprite_name << "' - " << error.what() << ".";
345 }
346
347 return true;
348}
int32_t defense
Definition: MonsterDefinitions.hpp:214

References monster_config_data::defense, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_drops()

bool MonsterDatabase::parse_drops ( sol::table const &  table,
monster_config_data data,
bool  mvp 
)
protected
616{
617 try {
618 sol::optional<sol::table> maybe_tbl = table.get<sol::optional<sol::table>>(mvp ? "MvpDrops" : "Drops");
619 if (maybe_tbl) {
620 sol::table drop_tbl = maybe_tbl.value();
621 int i = 0;
622 std::vector<monster_config_data::rewards::drops> items;
623 for (auto const &d : drop_tbl) {
624 sol::object const &k = d.first;
625 sol::object const &v = d.second;
626 std::shared_ptr<const item_config_data> it = nullptr;
628
629 if (k.is<std::string>()) {
630 std::string name = k.as<std::string>();
631 it = ItemDB->get_item_by_key_name(name);
632 if (it == nullptr) {
633 HLog(error) << "Error parsing MvpDrop for monster '" << data.sprite_name << "', item '" << name << "' doesn't exist.";
634 continue;
635 }
636 } else if (k.is<int>()) {
637 int item_id = k.as<int>();
638 it = ItemDB->get_item_by_id(item_id);
639 if (it == nullptr) {
640 HLog(error) << "Error parsing MvpDrop for monster '" << data.sprite_name << "', item with ID '" << item_id << "' doesn't exist.";
641 continue;
642 }
643 }
644
645 if (v.get_type() != sol::type::number) {
646 HLog(error) << "Error parsing chance for item '" << it->key_name << "', non-numeric value provided.";
647 continue;
648 }
649
650 if ((mvp && i >= MAX_MVP_DROP) || (!mvp && i >= MAX_MOB_DROP)) {
651 HLog(warning) << "Number of "<< (mvp ? "mvp " : "") << "drops for monster '" << data.sprite_name << "', exceeds maximum limit... skipping.";
652 continue;
653 }
654
655 drop.item_id = it->item_id;
656 drop.chance = v.as<int>();
657
658 i++;
659
660 items.push_back(drop);
661 }
662
663 i = 0;
664 for (auto it : items) {
665 if (mvp) {
666 data.rewards.items_mvp[i] = items[i];
667 } else {
668 data.rewards.items[i] = items[i];
669 }
670 i++;
671 }
672 }
673 } catch (sol::error &error) {
674 HLog(error) << "Error parsing " << (mvp ? "MvpDrops" : "Drops") << " for monster '" << data.sprite_name << "' - " << error.what() << ".";
675 }
676
677 return true;
678}
#define ItemDB
Definition: ItemDB.hpp:119
#define MAX_MVP_DROP
Definition: MonsterDefinitions.hpp:39
#define MAX_MOB_DROP
Definition: MonsterDefinitions.hpp:38
Definition: MonsterDefinitions.hpp:260
int item_id
Definition: MonsterDefinitions.hpp:260
int chance
Definition: MonsterDefinitions.hpp:260
struct drops items_mvp[MAX_MVP_DROP]
Definition: MonsterDefinitions.hpp:265
struct drops items[MAX_MOB_DROP]
Definition: MonsterDefinitions.hpp:264
struct monster_config_data::rewards rewards

References monster_config_data::rewards::drops::chance, HLog, monster_config_data::rewards::drops::item_id, ItemDB, monster_config_data::rewards::items, monster_config_data::rewards::items_mvp, MAX_MOB_DROP, MAX_MVP_DROP, monster_config_data::rewards, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_element()

bool MonsterDatabase::parse_element ( sol::table const &  table,
monster_config_data data 
)
protected
426{
427 try {
428 sol::optional<sol::table> maybe_tbl = table.get<sol::optional<sol::table>>("Element");
429 if (maybe_tbl) {
430 sol::table r_tbl = maybe_tbl.value();
431 if (r_tbl[1].get_type() != sol::type::number || r_tbl[2].get_type() != sol::type::number) {
432 HLog(error) << "Element for monster '" << data.sprite_name << "' is not a numeric type... skipping.";
433 return false;
434 }
435 data.element = (element_type) r_tbl[1];
436 data.element_level = r_tbl[2];
437 } else {
438 data.element = ELE_NEUTRAL;
439 data.element_level = 1;
440 }
441 } catch (sol::error &error) {
442 HLog(error) << "Error parsing Element for monster '" << data.sprite_name << "' - " << error.what() << ".";
443 }
444
445 return true;
446}
element_type
Definition: UnitDefinitions.hpp:970
@ ELE_NEUTRAL
Definition: UnitDefinitions.hpp:971
element_type element
Definition: MonsterDefinitions.hpp:231
int8_t element_level
Definition: MonsterDefinitions.hpp:232

References ELE_NEUTRAL, monster_config_data::element, monster_config_data::element_level, HLog, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_hp()

bool MonsterDatabase::parse_hp ( sol::table const &  table,
monster_config_data data 
)
protected
238{
239 try {
240 sol::optional<int> maybe_val = table.get<sol::optional<int>>("Hp");
241 if (maybe_val)
242 data.hp = maybe_val.value();
243 else
244 data.hp = 1;
245 } catch (sol::error &error) {
246 HLog(error) << "Error parsing Hp for monster '" << data.sprite_name << "' - " << error.what() << ".";
247 }
248
249 return true;
250}
int32_t hp
Definition: MonsterDefinitions.hpp:210

References HLog, monster_config_data::hp, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_level()

bool MonsterDatabase::parse_level ( sol::table const &  table,
monster_config_data data 
)
protected
223{
224 try {
225 sol::optional<int> maybe_val = table.get<sol::optional<int>>("Lv");
226 if (maybe_val)
227 data.level = maybe_val.value();
228 else
229 data.level = 1;
230 } catch (sol::error &error) {
231 HLog(error) << "Error parsing Lv for monster '" << data.sprite_name << "' - " << error.what() << ".";
232 }
233
234 return true;
235}
uint16_t level
Definition: MonsterDefinitions.hpp:209

References HLog, monster_config_data::level, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_magic_defense()

bool MonsterDatabase::parse_magic_defense ( sol::table const &  table,
monster_config_data data 
)
protected
351{
352 try {
353 sol::optional<int> maybe_val = table.get<sol::optional<int>>("MDef");
354 if (maybe_val)
355 data.magic_defense = maybe_val.value();
356 else
357 data.magic_defense = 0;
358 } catch (sol::error &error) {
359 HLog(error) << "Error parsing MDef for monster '" << data.sprite_name << "' - " << error.what() << ".";
360 }
361
362 return true;
363}
int32_t magic_defense
Definition: MonsterDefinitions.hpp:215

References HLog, monster_config_data::magic_defense, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_mode()

bool MonsterDatabase::parse_mode ( sol::table const &  table,
monster_config_data data 
)
protected
449{
450 try {
451 sol::optional<sol::table> maybe_tbl = table.get<sol::optional<sol::table>>("Mode");
452 if (maybe_tbl) {
453 sol::table mode_tbl = maybe_tbl.value();
454 for (auto const &m : mode_tbl) {
455 sol::object const &v = m.second;
456 data.mode |= v.as<int>();
457 }
458 } else {
459 data.mode = 0;
460 }
461 } catch (sol::error &error) {
462 HLog(error) << "Error parsing Mode for monster '" << data.sprite_name << "' - " << error.what() << ".";
463 }
464
465 return true;
466}
int32_t mode
Definition: MonsterDefinitions.hpp:233

References HLog, monster_config_data::mode, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_move_speed()

bool MonsterDatabase::parse_move_speed ( sol::table const &  table,
monster_config_data data 
)
protected
469{
470 try {
471 sol::optional<int> maybe_val = table.get<sol::optional<int>>("MoveSpeed");
472 if (maybe_val)
473 data.move_speed = maybe_val.value();
474 else
475 data.move_speed = 0;
476 } catch (sol::error &error) {
477 HLog(error) << "Error parsing MoveSpeed for monster '" << data.sprite_name << "' - " << error.what() << ".";
478 }
479
480 return true;
481}
int32_t move_speed
Definition: MonsterDefinitions.hpp:234

References HLog, monster_config_data::move_speed, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_mvp_exp()

bool MonsterDatabase::parse_mvp_exp ( sol::table const &  table,
monster_config_data data 
)
protected
529{
530 try {
531 sol::optional<int> maybe_val = table.get<sol::optional<int>>("MvpExp");
532 if (maybe_val)
533 data.rewards.mvp_exp = maybe_val.value();
534 else
535 data.rewards.mvp_exp = 0;
536 } catch (sol::error &error) {
537 HLog(error) << "Error parsing MvpExp for monster '" << data.sprite_name << "' - " << error.what() << ".";
538 }
539
540 return true;
541}
unsigned int mvp_exp
Definition: MonsterDefinitions.hpp:263

References HLog, monster_config_data::rewards::mvp_exp, monster_config_data::rewards, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_race()

bool MonsterDatabase::parse_race ( sol::table const &  table,
monster_config_data data 
)
protected
411{
412 try {
413 sol::optional<int> maybe_val = table.get<sol::optional<int>>("Race");
414 if (maybe_val)
415 data.primary_race = (monster_primary_race_type) maybe_val.value();
416 else
418 } catch (sol::error &error) {
419 HLog(error) << "Error parsing Race for monster '" << data.sprite_name << "' - " << error.what() << ".";
420 }
421
422 return true;
423}
monster_primary_race_type
Definition: MonsterDefinitions.hpp:48
@ MONSTER_RACE_FORMLESS
Formless.
Definition: MonsterDefinitions.hpp:50
monster_primary_race_type primary_race
Definition: MonsterDefinitions.hpp:229

References HLog, MONSTER_RACE_FORMLESS, monster_config_data::primary_race, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_reward_base_exp()

bool MonsterDatabase::parse_reward_base_exp ( sol::table const &  table,
monster_config_data data 
)
protected
268{
269 try {
270 sol::optional<int> maybe_val = table.get<sol::optional<int>>("Exp");
271 if (maybe_val)
272 data.rewards.base_exp = maybe_val.value();
273 else
274 data.rewards.base_exp = 0;
275 } catch (sol::error &error) {
276 HLog(error) << "Error parsing Exp for monster '" << data.sprite_name << "' - " << error.what() << ".";
277 }
278
279 return true;
280}
unsigned int base_exp
Definition: MonsterDefinitions.hpp:262

References monster_config_data::rewards::base_exp, HLog, monster_config_data::rewards, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_reward_job_exp()

bool MonsterDatabase::parse_reward_job_exp ( sol::table const &  table,
monster_config_data data 
)
protected
283{
284 try {
285 sol::optional<int> maybe_val = table.get<sol::optional<int>>("JExp");
286 if (maybe_val)
287 data.rewards.job_exp = maybe_val.value();
288 else
289 data.rewards.job_exp = 1;
290 } catch (sol::error &error) {
291 HLog(error) << "Error parsing JExp for monster '" << data.sprite_name << "' - " << error.what() << ".";
292 }
293
294 return true;
295}
unsigned int job_exp
Definition: MonsterDefinitions.hpp:262

References HLog, monster_config_data::rewards::job_exp, monster_config_data::rewards, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_size()

bool MonsterDatabase::parse_size ( sol::table const &  table,
monster_config_data data 
)
protected
396{
397 try {
398 sol::optional<int> maybe_val = table.get<sol::optional<int>>("Size");
399 if (maybe_val)
400 data.size = (unit_size_type) maybe_val.value();
401 else
402 data.size = ESZ_SMALL;
403 } catch (sol::error &error) {
404 HLog(error) << "Error parsing Size for monster '" << data.sprite_name << "' - " << error.what() << ".";
405 }
406
407 return true;
408}
unit_size_type
Definition: UnitDefinitions.hpp:36
@ ESZ_SMALL
Definition: UnitDefinitions.hpp:37
unit_size_type size
Definition: MonsterDefinitions.hpp:228

References ESZ_SMALL, HLog, monster_config_data::size, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_sp()

bool MonsterDatabase::parse_sp ( sol::table const &  table,
monster_config_data data 
)
protected
253{
254 try {
255 sol::optional<int> maybe_val = table.get<sol::optional<int>>("Sp");
256 if (maybe_val)
257 data.sp = maybe_val.value();
258 else
259 data.sp = 1;
260 } catch (sol::error &error) {
261 HLog(error) << "Error parsing Sp for monster '" << data.sprite_name << "' - " << error.what() << ".";
262 }
263
264 return true;
265}
int32_t sp
Definition: MonsterDefinitions.hpp:211

References HLog, monster_config_data::sp, and monster_config_data::sprite_name.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_stats()

bool MonsterDatabase::parse_stats ( sol::table const &  table,
monster_config_data data 
)
protected
559{
560 try {
561 sol::optional<sol::table> maybe_tbl = table.get<sol::optional<sol::table>>("Stats");
562 if (maybe_tbl) {
563 sol::table s_tbl = maybe_tbl.value();
564
565 sol::optional<int> maybe_val = s_tbl.get<sol::optional<int>>("Str");
566 if (maybe_val)
567 data.stats.str = maybe_val.value();
568 else
569 data.stats.str = 1;
570
571 maybe_val = s_tbl.get<sol::optional<int>>("Agi");
572 if (maybe_val)
573 data.stats.agi = maybe_val.value();
574 else
575 data.stats.agi = 1;
576
577 maybe_val = s_tbl.get<sol::optional<int>>("Vit");
578 if (maybe_val)
579 data.stats.vit = maybe_val.value();
580 else
581 data.stats.vit = 1;
582
583 maybe_val = s_tbl.get<sol::optional<int>>("Int");
584 if (maybe_val)
585 data.stats.int_ = maybe_val.value();
586 else
587 data.stats.int_ = 1;
588
589 maybe_val = s_tbl.get<sol::optional<int>>("Dex");
590 if (maybe_val)
591 data.stats.dex = maybe_val.value();
592 else
593 data.stats.dex = 1;
594
595 maybe_val = s_tbl.get<sol::optional<int>>("Luk");
596 if (maybe_val)
597 data.stats.luk = maybe_val.value();
598 else
599 data.stats.luk = 1;
600 } else {
601 data.stats.str = 1;
602 data.stats.agi = 1;
603 data.stats.vit = 1;
604 data.stats.int_ = 1;
605 data.stats.dex = 1;
606 data.stats.luk = 1;
607 }
608 } catch (sol::error &error) {
609 HLog(error) << "Error parsing Stats for monster '" << data.sprite_name << "' - " << error.what() << ".";
610 }
611
612 return true;
613}
int16_t vit
Definition: MonsterDefinitions.hpp:220
int16_t agi
Definition: MonsterDefinitions.hpp:219
struct monster_config_data::@132 stats
int16_t dex
Definition: MonsterDefinitions.hpp:222
int16_t str
Definition: MonsterDefinitions.hpp:218
int16_t luk
Definition: MonsterDefinitions.hpp:223
int16_t int_
Definition: MonsterDefinitions.hpp:221

References monster_config_data::agi, monster_config_data::dex, HLog, monster_config_data::int_, monster_config_data::luk, monster_config_data::sprite_name, monster_config_data::stats, monster_config_data::str, and monster_config_data::vit.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_view()

bool MonsterDatabase::parse_view ( sol::table const &  table,
monster_config_data data 
)
protected
681{
682 try {
683 sol::optional<sol::table> maybe_tbl = table.get<sol::optional<sol::table>>("ViewData");
684 if (maybe_tbl) {
685 sol::table s_tbl = maybe_tbl.value();
686
687 sol::optional<int> maybe_val = s_tbl.get<sol::optional<int>>("SpriteId");
688 if (maybe_val)
689 data.view.sprite_id = maybe_val.value();
690 else
691 data.view.sprite_id = 0;
692
693 maybe_val = s_tbl.get<sol::optional<int>>("WeaponId");
694 if (maybe_val)
695 data.view.weapon_id = maybe_val.value();
696 else
697 data.view.weapon_id = 0;
698
699 maybe_val = s_tbl.get<sol::optional<int>>("ShieldId");
700 if (maybe_val)
701 data.view.shield_id = maybe_val.value();
702 else
703 data.view.shield_id = 0;
704
705 maybe_val = s_tbl.get<sol::optional<int>>("RobeId");
706 if (maybe_val)
707 data.view.robe_id = maybe_val.value();
708 else
709 data.view.robe_id = 0;
710
711 maybe_val = s_tbl.get<sol::optional<int>>("HeadTopId");
712 if (maybe_val)
713 data.view.headgear_top_id = maybe_val.value();
714 else
715 data.view.headgear_top_id = 0;
716
717 maybe_val = s_tbl.get<sol::optional<int>>("HeadMidId");
718 if (maybe_val)
719 data.view.headgear_middle_id = maybe_val.value();
720 else
721 data.view.headgear_middle_id = 0;
722
723 maybe_val = s_tbl.get<sol::optional<int>>("HeadLowId");
724 if (maybe_val)
725 data.view.headgear_bottom_id = maybe_val.value();
726 else
727 data.view.headgear_bottom_id = 0;
728
729 maybe_val = s_tbl.get<sol::optional<int>>("HairStyleId");
730 if (maybe_val)
731 data.view.hair_style_id = maybe_val.value();
732 else
733 data.view.hair_style_id = 0;
734
735 maybe_val = s_tbl.get<sol::optional<int>>("BodyStyleId");
736 if (maybe_val)
737 data.view.body_style_id = maybe_val.value();
738 else
739 data.view.body_style_id = 0;
740
741 maybe_val = s_tbl.get<sol::optional<int>>("HairColorId");
742 if (maybe_val)
743 data.view.hair_color_id = maybe_val.value();
744 else
745 data.view.hair_color_id = 0;
746
747 maybe_val = s_tbl.get<sol::optional<int>>("BodyColorId");
748 if (maybe_val)
749 data.view.body_color_id = maybe_val.value();
750 else
751 data.view.body_color_id = 0;
752
753 maybe_val = s_tbl.get<sol::optional<int>>("Gender");
754 if (maybe_val)
755 data.view.gender = (unit_gender_types) maybe_val.value();
756 else
758 } else {
759 data.view.sprite_id = 0;
760 data.view.weapon_id = 0;
761 data.view.shield_id = 0;
762 data.view.robe_id = 0;
763 data.view.headgear_top_id = 0;
764 data.view.headgear_middle_id = 0;
765 data.view.headgear_bottom_id = 0;
766 data.view.hair_style_id = 0;
767 data.view.body_style_id = 0;
768 data.view.hair_color_id = 0;
769 data.view.body_color_id = 0;
771 }
772 } catch (sol::error &error) {
773 HLog(error) << "Error parsing Stats for monster '" << data.sprite_name << "' - " << error.what() << ".";
774 }
775
776 return true;
777}
unit_gender_types
Definition: UnitDefinitions.hpp:988
@ UNIT_GENDER_FEMALE
Definition: UnitDefinitions.hpp:989
unit_gender_types gender
Definition: MonsterDefinitions.hpp:252
int32_t body_color_id
Definition: MonsterDefinitions.hpp:251
int32_t body_style_id
Definition: MonsterDefinitions.hpp:249
int32_t headgear_top_id
Definition: MonsterDefinitions.hpp:245
int32_t headgear_bottom_id
Definition: MonsterDefinitions.hpp:247
int32_t hair_color_id
Definition: MonsterDefinitions.hpp:250
int32_t hair_style_id
Definition: MonsterDefinitions.hpp:248
int32_t shield_id
Definition: MonsterDefinitions.hpp:243
int32_t headgear_middle_id
Definition: MonsterDefinitions.hpp:246
int32_t robe_id
Definition: MonsterDefinitions.hpp:244
int32_t weapon_id
Definition: MonsterDefinitions.hpp:242
int32_t sprite_id
Definition: MonsterDefinitions.hpp:241
struct monster_config_data::monster_view_data view

References monster_config_data::monster_view_data::body_color_id, monster_config_data::monster_view_data::body_style_id, monster_config_data::monster_view_data::gender, monster_config_data::monster_view_data::hair_color_id, monster_config_data::monster_view_data::hair_style_id, monster_config_data::monster_view_data::headgear_bottom_id, monster_config_data::monster_view_data::headgear_middle_id, monster_config_data::monster_view_data::headgear_top_id, HLog, monster_config_data::monster_view_data::robe_id, monster_config_data::monster_view_data::shield_id, monster_config_data::monster_view_data::sprite_id, monster_config_data::sprite_name, UNIT_GENDER_FEMALE, monster_config_data::view, and monster_config_data::monster_view_data::weapon_id.

Referenced by load_internal().

+ Here is the caller graph for this function:

◆ parse_view_range()

bool MonsterDatabase::parse_view_range ( sol::table const &  table,
monster_config_data data 
)
protected
366{
367 try {
368 sol::optional<int> maybe_val = table.get<sol::optional<int>>("ViewRange");
369 if (maybe_val)
370 data.view_range = maybe_val.value();
371 else
372 data.view_range = 1;
373 } catch (sol::error &error) {
374 HLog(error) << "Error parsing ViewRange for monster '" << data.sprite_name << "' - " << error.what() << ".";
375 }
376
377 return true;
378}
short view_range
Definition: MonsterDefinitions.hpp:226

References HLog, monster_config_data::sprite_name, and monster_config_data::view_range.

Referenced by load_internal().

+ Here is the caller graph for this function:

Member Data Documentation

◆ _monster_db

LockedLookupTable<uint32_t, std::shared_ptr<const monster_config_data> > Horizon::Zone::MonsterDatabase::_monster_db
private

Referenced by get_monster_by_id(), and load_internal().

◆ _monster_skill_db

LockedLookupTable<uint32_t, std::shared_ptr<std::vector<std::shared_ptr<const monster_skill_config_data> > > > Horizon::Zone::MonsterDatabase::_monster_skill_db
private

◆ _monster_str_db

LockedLookupTable<std::string, std::shared_ptr<const monster_config_data> > Horizon::Zone::MonsterDatabase::_monster_str_db
private

The documentation for this class was generated from the following files: