[Experience] Add SetExp/SetAAExp lua mods (#4292)

This commit is contained in:
Xackery
2024-05-04 16:10:27 -07:00
committed by GitHub
parent aa0e53f5fc
commit 758859eea6
23 changed files with 236 additions and 57 deletions
+107
View File
@@ -633,6 +633,113 @@ void LuaMod::GetEXPForLevel(Client *self, uint16 level, uint32 &returnValue, boo
}
}
void LuaMod::SetEXP(Mob *self, ExpSource exp_source, uint64 current_exp, uint64 set_exp, bool is_rezz_exp, uint64 &return_value, bool &ignore_default)
{
int start = lua_gettop(L);
try {
if (!m_has_set_exp) {
return;
}
lua_getfield(L, LUA_REGISTRYINDEX, package_name_.c_str());
lua_getfield(L, -1, "SetEXP");
Lua_Mob l_self(self);
luabind::adl::object e = luabind::newtable(L);
e["self"] = l_self;
e["exp_source"] = exp_source;
e["current_exp"] = current_exp;
e["set_exp"] = set_exp;
e["is_rezz_exp"] = is_rezz_exp;
e.push(L);
if (lua_pcall(L, 1, 1, 0)) {
std::string error = lua_tostring(L, -1);
parser_->AddError(error);
lua_pop(L, 2);
return;
}
if (lua_type(L, -1) == LUA_TTABLE) {
luabind::adl::object ret(luabind::from_stack(L, -1));
auto ignore_default_obj = ret["ignore_default"];
if (luabind::type(ignore_default_obj) == LUA_TBOOLEAN) {
ignore_default = ignore_default || luabind::object_cast<bool>(ignore_default_obj);
}
auto return_value_obj = ret["return_value"];
if (luabind::type(return_value_obj) == LUA_TNUMBER) {
return_value = luabind::object_cast<int64>(return_value_obj);
}
}
}
catch (std::exception &ex) {
parser_->AddError(ex.what());
}
int end = lua_gettop(L);
int n = end - start;
if (n > 0) {
lua_pop(L, n);
}
}
void LuaMod::SetAAEXP(Mob *self, ExpSource exp_source, uint64 current_aa_exp, uint64 set_aa_exp, bool is_rezz_exp, uint64 &return_value, bool &ignore_default)
{
int start = lua_gettop(L);
try {
if (!m_has_set_aa_exp) {
return;
}
lua_getfield(L, LUA_REGISTRYINDEX, package_name_.c_str());
lua_getfield(L, -1, "SetAAEXP");
Lua_Mob l_self(self);
luabind::adl::object e = luabind::newtable(L);
e["self"] = l_self;
e["exp_source"] = exp_source;
e["current_aa_exp"] = current_aa_exp;
e["set_aa_exp"] = set_aa_exp;
e["is_rezz_exp"] = is_rezz_exp;
e.push(L);
if (lua_pcall(L, 1, 1, 0)) {
std::string error = lua_tostring(L, -1);
parser_->AddError(error);
lua_pop(L, 2);
return;
}
if (lua_type(L, -1) == LUA_TTABLE) {
luabind::adl::object ret(luabind::from_stack(L, -1));
auto ignore_default_obj = ret["ignore_default"];
if (luabind::type(ignore_default_obj) == LUA_TBOOLEAN) {
ignore_default = ignore_default || luabind::object_cast<bool>(ignore_default_obj);
}
auto return_value_obj = ret["return_value"];
if (luabind::type(return_value_obj) == LUA_TNUMBER) {
return_value = luabind::object_cast<int64>(return_value_obj);
}
}
}
catch (std::exception &ex) {
parser_->AddError(ex.what());
}
int end = lua_gettop(L);
int n = end - start;
if (n > 0) {
lua_pop(L, n);
}
}
void LuaMod::GetExperienceForKill(Client *self, Mob *against, uint64 &returnValue, bool &ignoreDefault)
{
int start = lua_gettop(L);