[Tasks] Add pre-task update event (#2512)

This adds the player EVENT_TASK_BEFORE_UPDATE event which will allow
quests to prevent a source controlled task update by returning non-zero.
This commit is contained in:
hg 2022-10-29 20:46:08 -04:00 committed by GitHub
parent 43ec9dc815
commit 444a4f6744
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 16 additions and 1 deletions

View File

@ -160,6 +160,7 @@ const char *QuestEventSubroutines[_LargestEventID] = {
"EVENT_MERCHANT_BUY",
"EVENT_MERCHANT_SELL",
"EVENT_INSPECT",
"EVENT_TASK_BEFORE_UPDATE",
};
PerlembParser::PerlembParser() : perl(nullptr)
@ -1465,6 +1466,7 @@ void PerlembParser::ExportEventVariables(
}
case EVENT_TASK_COMPLETE:
case EVENT_TASK_BEFORE_UPDATE:
case EVENT_TASK_UPDATE: {
Seperator sep(data);
ExportVar(package_name.c_str(), "donecount", sep.arg[0]);

View File

@ -103,6 +103,7 @@ typedef enum {
EVENT_MERCHANT_BUY,
EVENT_MERCHANT_SELL,
EVENT_INSPECT,
EVENT_TASK_BEFORE_UPDATE,
_LargestEventID
} QuestEventID;

View File

@ -4307,7 +4307,8 @@ luabind::scope lua_register_events() {
luabind::value("alt_currency_merchant_sell", static_cast<int>(EVENT_ALT_CURRENCY_MERCHANT_SELL)),
luabind::value("merchant_buy", static_cast<int>(EVENT_MERCHANT_BUY)),
luabind::value("merchant_sell", static_cast<int>(EVENT_MERCHANT_SELL)),
luabind::value("inspect", static_cast<int>(EVENT_INSPECT))
luabind::value("inspect", static_cast<int>(EVENT_INSPECT)),
luabind::value("task_before_update", static_cast<int>(EVENT_TASK_BEFORE_UPDATE))
];
}

View File

@ -147,6 +147,7 @@ const char *LuaEvents[_LargestEventID] = {
"event_merchant_buy",
"event_merchant_sell",
"event_inspect",
"event_task_before_update",
};
extern Zone *zone;
@ -222,6 +223,7 @@ LuaParser::LuaParser() {
PlayerArgumentDispatch[EVENT_TASK_STAGE_COMPLETE] = handle_player_task_stage_complete;
PlayerArgumentDispatch[EVENT_TASK_COMPLETE] = handle_player_task_update;
PlayerArgumentDispatch[EVENT_TASK_UPDATE] = handle_player_task_update;
PlayerArgumentDispatch[EVENT_TASK_BEFORE_UPDATE] = handle_player_task_update;
PlayerArgumentDispatch[EVENT_COMMAND] = handle_player_command;
PlayerArgumentDispatch[EVENT_COMBINE_SUCCESS] = handle_player_combine;
PlayerArgumentDispatch[EVENT_COMBINE_FAILURE] = handle_player_combine;

View File

@ -564,6 +564,15 @@ int ClientTaskState::UpdateTasks(Client* client, const TaskUpdateFilter& filter,
if (CanUpdate(client, filter, client_task.task_id, activity, client_activity))
{
auto args = fmt::format("{} {} {}", count, client_activity.activity_id, client_task.task_id);
if (parse->EventPlayer(EVENT_TASK_BEFORE_UPDATE, client, args, 0) != 0)
{
LogTasks("[UpdateTasks] client [{}] task [{}]-[{}] update prevented by quest",
client->GetName(), client_task.task_id, client_activity.activity_id);
continue;
}
LogTasks("[UpdateTasks] client [{}] task [{}] activity [{}] increment [{}]",
client->GetName(), client_task.task_id, client_activity.activity_id, count);