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

#include <StatusEffectDB.hpp>

+ Collaboration diagram for Horizon::Zone::StatusEffectDatabase:

Public Member Functions

 StatusEffectDatabase ()
 
 ~StatusEffectDatabase ()
 
bool load ()
 
std::shared_ptr< const status_effect_config_dataget_status_effect_by_id (int32_t id)
 

Static Public Member Functions

static StatusEffectDatabaseget_instance ()
 

Protected Member Functions

bool load_internal (sol::object const &key, sol::object const &value)
 

Private Attributes

LockedLookupTable< uint32_t, std::shared_ptr< const status_effect_config_data > > _status_effect_db
 

Constructor & Destructor Documentation

◆ StatusEffectDatabase()

StatusEffectDatabase::StatusEffectDatabase ( )
38{
39 //
40}

◆ ~StatusEffectDatabase()

StatusEffectDatabase::~StatusEffectDatabase ( )
43{
44 //
45}

Member Function Documentation

◆ get_instance()

static StatusEffectDatabase * Horizon::Zone::StatusEffectDatabase::get_instance ( )
inlinestatic
58 {
59 static StatusEffectDatabase instance;
60 return &instance;
61 }
StatusEffectDatabase()
Definition: StatusEffectDB.cpp:37

◆ get_status_effect_by_id()

std::shared_ptr< const status_effect_config_data > Horizon::Zone::StatusEffectDatabase::get_status_effect_by_id ( int32_t  id)
inline
69{ return _status_effect_db.at(id); }
LockedLookupTable< uint32_t, std::shared_ptr< const status_effect_config_data > > _status_effect_db
Definition: StatusEffectDB.hpp:72

References _status_effect_db.

◆ load()

bool StatusEffectDatabase::load ( )

Skill DB

48{
49 std::shared_ptr<sol::state> lua = std::make_shared<sol::state>();
50
51 lua->open_libraries(sol::lib::base);
52 lua->open_libraries(sol::lib::package);
53
54 std::shared_ptr<StatusEffectComponent> sec = std::make_shared<StatusEffectComponent>();
55
56 sec->sync_definitions(lua);
57 sec->sync_data_types(lua);
58 sec->sync_functions(lua);
59
63 try {
64 int total_entries = 0;
65 std::string file_path = sZone->config().get_static_db_path().string() + "status_effect_db.lua";
66 sol::load_result fx = lua->load_file(file_path);
67 sol::table status_tbl = fx();
68 status_tbl.for_each([this, &total_entries] (sol::object const &key, sol::object const &value) {
69 total_entries += load_internal(key, value) ? 1 : 0;
70 });
71 HLog(info) << "Loaded " << total_entries << " entries from '" << file_path << "'.";
72 } catch (sol::error &e) {
73 HLog(error) << "StatusEffectDatabase::load: " << e.what();
74 return false;
75 }
76
77 return true;
78}
#define HLog(type)
Definition: Logger.hpp:122
#define sZone
Definition: Zone.hpp:247
bool load_internal(sol::object const &key, sol::object const &value)
Definition: StatusEffectDB.cpp:80

References HLog, load_internal(), and sZone.

+ Here is the call graph for this function:

◆ load_internal()

bool StatusEffectDatabase::load_internal ( sol::object const &  key,
sol::object const &  value 
)
protected
81{
82 try {
84 if (!key.is<std::string>()) {
85 HLog(error) << "String expected for key name in 'db/status_effect_db.lua', unknown type provided... skipping.";
86 return false;
87 }
88
89 se_conf.name = key.as<std::string>();
90
91 if (value.get_type() != sol::type::table) {
92 HLog(error) << "Table expected for value of entry '" << se_conf.name << "' unknown type provided... skipping.";
93 return false;
94 }
95
96 sol::table v_tbl = value.as<sol::table>();
97
98 int status_id = v_tbl.get_or("Id", -1);
99
100 if (status_id == -1) {
101 HLog(error) << "Id is a mandatory field, Id was not provided for status effect '" << se_conf.name << "'... skipping.";
102 return false;
103 }
104
105 se_conf.status_id = status_id;
106
107 se_conf.visible = v_tbl.get_or("Visible", false);
108
109 sol::optional<sol::table> maybe_tbl = v_tbl.get<sol::optional<sol::table>>("Behavior");
110 if (maybe_tbl) {
111 sol::table a_tbl = maybe_tbl.value();
112
113 for (auto const &a : a_tbl) {
114 sol::object const &v = a.second;
115
116 if (v.get_type() != sol::type::number) {
117 HLog(error) << "Number expected for value of Behavior in status '" << se_conf.name << "', unknown type provided... skipping.";
118 continue;
119 }
120
121 se_conf.behavior |= v.as<int>();
122 }
123 }
124
125 se_conf.icon = v_tbl.get_or("Icon", std::string(""));
126
127 se_conf.on_start_script = v_tbl.get_or("OnStart", std::string(""));
128
129 se_conf.on_end_script = v_tbl.get_or("OnEnd", std::string(""));
130
131 se_conf.per_second_script = v_tbl.get_or("PerSecond", std::string(""));
132
133 _status_effect_db.insert(se_conf.status_id, std::make_shared<status_effect_config_data>(se_conf));
134 } catch (sol::error &e) {
135 HLog(error) << "StatusEffectDatabase::load_internal: " << e.what();
136 }
137 return true;
138}
Definition: StatusEffectDB.hpp:43
std::string on_start_script
Definition: StatusEffectDB.hpp:49
int32_t behavior
Definition: StatusEffectDB.hpp:46
bool visible
Definition: StatusEffectDB.hpp:48
std::string icon
Definition: StatusEffectDB.hpp:47
std::string on_end_script
Definition: StatusEffectDB.hpp:49
std::string name
Definition: StatusEffectDB.hpp:45
int32_t status_id
Definition: StatusEffectDB.hpp:44
std::string per_second_script
Definition: StatusEffectDB.hpp:49

References _status_effect_db, Horizon::Zone::status_effect_config_data::behavior, HLog, Horizon::Zone::status_effect_config_data::icon, Horizon::Zone::status_effect_config_data::name, Horizon::Zone::status_effect_config_data::on_end_script, Horizon::Zone::status_effect_config_data::on_start_script, Horizon::Zone::status_effect_config_data::per_second_script, Horizon::Zone::status_effect_config_data::status_id, and Horizon::Zone::status_effect_config_data::visible.

Referenced by load().

+ Here is the caller graph for this function:

Member Data Documentation

◆ _status_effect_db

LockedLookupTable<uint32_t, std::shared_ptr<const status_effect_config_data> > Horizon::Zone::StatusEffectDatabase::_status_effect_db
private

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