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
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)
839 else
841
842 maybe_val = stbl.get<sol::optional<int>>("SkillTarget");
843 if (maybe_val)
845 else
847
848 maybe_val = stbl.get<sol::optional<int>>("SkillState");
849 if (maybe_val)
851 else
853
854 maybe_val = stbl.get<sol::optional<int>>("Rate");
855 if (maybe_val)
857 else
859
860 maybe_val = stbl.get<sol::optional<int>>("CastTime");
861 if (maybe_val)
863 else
865
866 maybe_val = stbl.get<sol::optional<int>>("Delay");
867 if (maybe_val)
868 mskd.
delay = maybe_val.value();
869 else
871
872 sol::optional<bool> maybe_bool = stbl.get<sol::optional<bool>>("Cancellable");
873 if (maybe_bool)
875
876 maybe_val = stbl.get<sol::optional<int>>("CastCondition");
877 if (maybe_val)
879 else
881
882 maybe_val = stbl.get<sol::optional<int>>("ConditionData");
883 if (maybe_val)
885 else
887
888 maybe_val = stbl.get<sol::optional<int>>("val0");
889 if (maybe_val)
890 mskd.
val[0] = maybe_val.value();
891 else
893
894 maybe_val = stbl.get<sol::optional<int>>("val1");
895 if (maybe_val)
896 mskd.
val[1] = maybe_val.value();
897 else
899
900 maybe_val = stbl.get<sol::optional<int>>("val2");
901 if (maybe_val)
902 mskd.
val[2] = maybe_val.value();
903 else
905
906 maybe_val = stbl.get<sol::optional<int>>("val3");
907 if (maybe_val)
908 mskd.
val[3] = maybe_val.value();
909 else
911
912 maybe_val = stbl.get<sol::optional<int>>("val4");
913 if (maybe_val)
914 mskd.
val[4] = maybe_val.value();
915 else
917
918 maybe_val = stbl.get<sol::optional<int>>("Emotion");
919 if (maybe_val)
921 else
923
924 maybe_val = stbl.get<sol::optional<int>>("ChatMsgID");
925 if (maybe_val)
926 mskd.
msg_id = maybe_val.value();
927 else
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