[Quest API] Add RemoveAAPoints() and AA Loss Event to Perl/Lua (#4174)

* [Quest API] Add RemoveAAPoints() and AA Loss Event to Perl/Lua

# Perl
- Add `$client->RemoveAAPoints(points)`.
- Add `EVENT_AA_LOSS`, exports `$aa_lost`.

# Lua
- Add `client:RemoveAAPoints(points)`.
- Add `event_aa_loss`, exports `e.aa_lost`.

# Notes
- Allows operators to more easily remove AA Points.
- Has a bool return type that will return false if the player does not have enough AA Points to complete the removal.

* Update client.cpp
This commit is contained in:
Alex King 2024-03-08 21:20:33 -05:00 committed by GitHub
parent 96370e0298
commit 3bfb148bdc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 80 additions and 3 deletions

View File

@ -11473,6 +11473,37 @@ void Client::SetLockSavePosition(bool lock_save_position)
Client::m_lock_save_position = lock_save_position; Client::m_lock_save_position = lock_save_position;
} }
void Client::SetAAPoints(uint32 points)
{
const uint32 current_points = m_pp.aapoints;
m_pp.aapoints = points;
QuestEventID event_id = points > current_points ? EVENT_AA_GAIN : EVENT_AA_LOSS;
const uint32 change = event_id == EVENT_AA_GAIN ? points - current_points : current_points - points;
if (parse->PlayerHasQuestSub(event_id)) {
parse->EventPlayer(event_id, this, std::to_string(change), 0);
}
SendAlternateAdvancementStats();
}
bool Client::RemoveAAPoints(uint32 points)
{
if (m_pp.aapoints < points) {
return false;
}
m_pp.aapoints -= points;
if (parse->PlayerHasQuestSub(EVENT_AA_LOSS)) {
parse->EventPlayer(EVENT_AA_LOSS, this, std::to_string(points), 0);
}
SendAlternateAdvancementStats();
}
void Client::AddAAPoints(uint32 points) void Client::AddAAPoints(uint32 points)
{ {
m_pp.aapoints += points; m_pp.aapoints += points;

View File

@ -933,8 +933,9 @@ public:
void ResetAlternateAdvancementTimers(); void ResetAlternateAdvancementTimers();
void ResetOnDeathAlternateAdvancement(); void ResetOnDeathAlternateAdvancement();
void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAlternateAdvancementStats(); } void SetAAPoints(uint32 points);
void AddAAPoints(uint32 points); void AddAAPoints(uint32 points);
bool RemoveAAPoints(uint32 points);
int GetAAPoints() { return m_pp.aapoints; } int GetAAPoints() { return m_pp.aapoints; }
int GetSpentAA() { return m_pp.aapoints_spent; } int GetSpentAA() { return m_pp.aapoints_spent; }
uint32 GetRequiredAAExperience(); uint32 GetRequiredAAExperience();

View File

@ -200,6 +200,7 @@ const char* QuestEventSubroutines[_LargestEventID] = {
"EVENT_ENTITY_VARIABLE_DELETE", "EVENT_ENTITY_VARIABLE_DELETE",
"EVENT_ENTITY_VARIABLE_SET", "EVENT_ENTITY_VARIABLE_SET",
"EVENT_ENTITY_VARIABLE_UPDATE", "EVENT_ENTITY_VARIABLE_UPDATE",
"EVENT_AA_LOSS",
// Add new events before these or Lua crashes // Add new events before these or Lua crashes
"EVENT_SPELL_EFFECT_BOT", "EVENT_SPELL_EFFECT_BOT",
@ -2273,6 +2274,11 @@ void PerlembParser::ExportEventVariables(
break; break;
} }
case EVENT_AA_LOSS: {
ExportVar(package_name.c_str(), "aa_lost", data);
break;
}
case EVENT_AA_EXP_GAIN: { case EVENT_AA_EXP_GAIN: {
ExportVar(package_name.c_str(), "aa_exp_gained", data); ExportVar(package_name.c_str(), "aa_exp_gained", data);
break; break;

View File

@ -142,6 +142,7 @@ typedef enum {
EVENT_ENTITY_VARIABLE_DELETE, EVENT_ENTITY_VARIABLE_DELETE,
EVENT_ENTITY_VARIABLE_SET, EVENT_ENTITY_VARIABLE_SET,
EVENT_ENTITY_VARIABLE_UPDATE, EVENT_ENTITY_VARIABLE_UPDATE,
EVENT_AA_LOSS,
// Add new events before these or Lua crashes // Add new events before these or Lua crashes
EVENT_SPELL_EFFECT_BOT, EVENT_SPELL_EFFECT_BOT,

View File

@ -3296,6 +3296,12 @@ bool Lua_Client::IsInAGuild()
return self->IsInAGuild(); return self->IsInAGuild();
} }
bool Lua_Client::RemoveAAPoints(uint32 points)
{
Lua_Safe_Call_Bool();
return self->RemoveAAPoints(points);
}
luabind::scope lua_register_client() { luabind::scope lua_register_client() {
return luabind::class_<Lua_Client, Lua_Mob>("Client") return luabind::class_<Lua_Client, Lua_Mob>("Client")
.def(luabind::constructor<>()) .def(luabind::constructor<>())
@ -3669,6 +3675,7 @@ luabind::scope lua_register_client() {
.def("ReadBookByName", (void(Lua_Client::*)(std::string,uint8))&Lua_Client::ReadBookByName) .def("ReadBookByName", (void(Lua_Client::*)(std::string,uint8))&Lua_Client::ReadBookByName)
.def("RefundAA", (void(Lua_Client::*)(void))&Lua_Client::RefundAA) .def("RefundAA", (void(Lua_Client::*)(void))&Lua_Client::RefundAA)
.def("ReloadDataBuckets", (bool(Lua_Client::*)(void))&Lua_Client::ReloadDataBuckets) .def("ReloadDataBuckets", (bool(Lua_Client::*)(void))&Lua_Client::ReloadDataBuckets)
.def("RemoveAAPoints", (bool(Lua_Client::*)(uint32))&Lua_Client::RemoveAAPoints)
.def("RemoveAllExpeditionLockouts", (void(Lua_Client::*)(std::string))&Lua_Client::RemoveAllExpeditionLockouts) .def("RemoveAllExpeditionLockouts", (void(Lua_Client::*)(std::string))&Lua_Client::RemoveAllExpeditionLockouts)
.def("RemoveAllExpeditionLockouts", (void(Lua_Client::*)(void))&Lua_Client::RemoveAllExpeditionLockouts) .def("RemoveAllExpeditionLockouts", (void(Lua_Client::*)(void))&Lua_Client::RemoveAllExpeditionLockouts)
.def("RemoveExpeditionLockout", (void(Lua_Client::*)(std::string, std::string))&Lua_Client::RemoveExpeditionLockout) .def("RemoveExpeditionLockout", (void(Lua_Client::*)(std::string, std::string))&Lua_Client::RemoveExpeditionLockout)

View File

@ -566,6 +566,7 @@ public:
void SetBotSpawnLimit(int new_spawn_limit, uint8 class_id); void SetBotSpawnLimit(int new_spawn_limit, uint8 class_id);
void CampAllBots(); void CampAllBots();
void CampAllBots(uint8 class_id); void CampAllBots(uint8 class_id);
bool RemoveAAPoints(uint32 points);
void DialogueWindow(std::string markdown); void DialogueWindow(std::string markdown);

View File

@ -6733,7 +6733,8 @@ luabind::scope lua_register_events() {
luabind::value("timer_stop", static_cast<int>(EVENT_TIMER_STOP)), luabind::value("timer_stop", static_cast<int>(EVENT_TIMER_STOP)),
luabind::value("entity_variable_delete", static_cast<int>(EVENT_ENTITY_VARIABLE_DELETE)), luabind::value("entity_variable_delete", static_cast<int>(EVENT_ENTITY_VARIABLE_DELETE)),
luabind::value("entity_variable_set", static_cast<int>(EVENT_ENTITY_VARIABLE_SET)), luabind::value("entity_variable_set", static_cast<int>(EVENT_ENTITY_VARIABLE_SET)),
luabind::value("entity_variable_update", static_cast<int>(EVENT_ENTITY_VARIABLE_UPDATE)) luabind::value("entity_variable_update", static_cast<int>(EVENT_ENTITY_VARIABLE_UPDATE)),
luabind::value("aa_loss", static_cast<int>(EVENT_AA_LOSS))
)]; )];
} }

View File

@ -182,7 +182,8 @@ const char *LuaEvents[_LargestEventID] = {
"event_timer_stop", "event_timer_stop",
"event_entity_variable_delete", "event_entity_variable_delete",
"event_entity_variable_set", "event_entity_variable_set",
"event_entity_variable_update" "event_entity_variable_update",
"event_aa_loss"
}; };
extern Zone *zone; extern Zone *zone;
@ -343,6 +344,7 @@ LuaParser::LuaParser() {
PlayerArgumentDispatch[EVENT_ENTITY_VARIABLE_DELETE] = handle_player_entity_variable; PlayerArgumentDispatch[EVENT_ENTITY_VARIABLE_DELETE] = handle_player_entity_variable;
PlayerArgumentDispatch[EVENT_ENTITY_VARIABLE_SET] = handle_player_entity_variable; PlayerArgumentDispatch[EVENT_ENTITY_VARIABLE_SET] = handle_player_entity_variable;
PlayerArgumentDispatch[EVENT_ENTITY_VARIABLE_UPDATE] = handle_player_entity_variable; PlayerArgumentDispatch[EVENT_ENTITY_VARIABLE_UPDATE] = handle_player_entity_variable;
PlayerArgumentDispatch[EVENT_AA_LOSS] = handle_player_aa_loss;
ItemArgumentDispatch[EVENT_ITEM_CLICK] = handle_item_click; ItemArgumentDispatch[EVENT_ITEM_CLICK] = handle_item_click;
ItemArgumentDispatch[EVENT_ITEM_CLICK_CAST] = handle_item_click; ItemArgumentDispatch[EVENT_ITEM_CLICK_CAST] = handle_item_click;

View File

@ -1667,6 +1667,18 @@ void handle_player_entity_variable(
} }
} }
void handle_player_aa_loss(
QuestInterface *parse,
lua_State* L,
Client* client,
std::string data,
uint32 extra_data,
std::vector<std::any> *extra_pointers
) {
lua_pushinteger(L, Strings::ToInt(data));
lua_setfield(L, -2, "aa_lost");
}
// Item // Item
void handle_item_click( void handle_item_click(
QuestInterface *parse, QuestInterface *parse,

View File

@ -827,6 +827,15 @@ void handle_player_entity_variable(
std::vector<std::any> *extra_pointers std::vector<std::any> *extra_pointers
); );
void handle_player_aa_loss(
QuestInterface *parse,
lua_State* L,
Client* client,
std::string data,
uint32 extra_data,
std::vector<std::any> *extra_pointers
);
// Item // Item
void handle_item_click( void handle_item_click(
QuestInterface *parse, QuestInterface *parse,

View File

@ -3103,6 +3103,11 @@ bool Perl_Client_IsInAGuild(Client* self)
return self->IsInAGuild(); return self->IsInAGuild();
} }
bool Perl_Client_RemoveAAPoints(Client* self, uint32 points)
{
return self->RemoveAAPoints(points);
}
void perl_register_client() void perl_register_client()
{ {
perl::interpreter perl(PERL_GET_THX); perl::interpreter perl(PERL_GET_THX);
@ -3470,6 +3475,7 @@ void perl_register_client()
package.add("ReadBookByName", &Perl_Client_ReadBookByName); package.add("ReadBookByName", &Perl_Client_ReadBookByName);
package.add("RefundAA", &Perl_Client_RefundAA); package.add("RefundAA", &Perl_Client_RefundAA);
package.add("ReloadDataBuckets", &Perl_Client_ReloadDataBuckets); package.add("ReloadDataBuckets", &Perl_Client_ReloadDataBuckets);
package.add("RemoveAAPoints", &Perl_Client_RemoveAAPoints);
package.add("RemoveAllExpeditionLockouts", (void(*)(Client*))&Perl_Client_RemoveAllExpeditionLockouts); package.add("RemoveAllExpeditionLockouts", (void(*)(Client*))&Perl_Client_RemoveAllExpeditionLockouts);
package.add("RemoveAllExpeditionLockouts", (void(*)(Client*, std::string))&Perl_Client_RemoveAllExpeditionLockouts); package.add("RemoveAllExpeditionLockouts", (void(*)(Client*, std::string))&Perl_Client_RemoveAllExpeditionLockouts);
package.add("RemoveEbonCrystals", &Perl_Client_RemoveEbonCrystals); package.add("RemoveEbonCrystals", &Perl_Client_RemoveEbonCrystals);