mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-16 22:58:34 +00:00
[Quest API] Add Timer Events to Perl/Lua (#4099)
* [Quest API] Add Timer Events to Perl/Lua # DRAFT * Cleanup
This commit is contained in:
+572
-191
@@ -500,317 +500,698 @@ void QuestManager::ZoneRaid(const char *zone_name) {
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::settimer(const char* timer_name, int seconds, Mob* mob) {
|
||||
void QuestManager::settimer(const std::string& timer_name, uint32 seconds, Mob* m)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
if(questitem) {
|
||||
if (questitem) {
|
||||
questitem->SetTimer(timer_name, seconds * 1000);
|
||||
|
||||
if (parse->ItemHasQuestSub(questitem, EVENT_TIMER_START)) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
seconds * 1000
|
||||
);
|
||||
|
||||
parse->EventItem(EVENT_TIMER_START, nullptr, questitem, nullptr, export_string, 0);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
|
||||
end = QTimerList.end();
|
||||
|
||||
const auto m = mob ? mob : owner;
|
||||
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == m && cur->name == timer_name) {
|
||||
cur->Timer_.Enable();
|
||||
cur->Timer_.Start(seconds * 1000, false);
|
||||
return;
|
||||
}
|
||||
++cur;
|
||||
if (!m && !owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
QTimerList.emplace_back(QuestTimer(seconds * 1000, owner, timer_name));
|
||||
Mob* mob = m ? m : owner;
|
||||
|
||||
if (!mob) {
|
||||
return;
|
||||
}
|
||||
|
||||
const bool has_start_event = (
|
||||
(mob->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_START)) ||
|
||||
(mob->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_START)) ||
|
||||
(mob->IsNPC() && parse->HasQuestSub(mob->GetNPCTypeID(), EVENT_TIMER_START))
|
||||
);
|
||||
|
||||
if (!QTimerList.empty()) {
|
||||
for (auto e : QTimerList) {
|
||||
if (e.mob && e.mob == mob && e.name == timer_name) {
|
||||
e.Timer_.Enable();
|
||||
e.Timer_.Start(seconds * 1000, false);
|
||||
|
||||
if (has_start_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
seconds * 1000
|
||||
);
|
||||
|
||||
if (mob->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_START, mob->CastToClient(), export_string, 0);
|
||||
} else if (mob->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_START, mob->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (mob->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_START, mob->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QTimerList.emplace_back(QuestTimer(seconds * 1000, mob, timer_name));
|
||||
|
||||
if (has_start_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
seconds * 1000
|
||||
);
|
||||
|
||||
if (mob->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_START, mob->CastToClient(), export_string, 0);
|
||||
} else if (mob->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_START, mob->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (mob->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_START, mob->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::settimerMS(const char* timer_name, int milliseconds) {
|
||||
void QuestManager::settimerMS(const std::string& timer_name, uint32 milliseconds)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
if(questitem) {
|
||||
questitem->SetTimer(timer_name, milliseconds);
|
||||
if (!owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
const bool has_start_event = (
|
||||
(owner->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_START)) ||
|
||||
(owner->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_START)) ||
|
||||
(owner->IsNPC() && parse->HasQuestSub(owner->GetNPCTypeID(), EVENT_TIMER_START))
|
||||
);
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if(cur->mob && cur->mob == owner && cur->name == timer_name)
|
||||
{
|
||||
cur->Timer_.Enable();
|
||||
cur->Timer_.Start(milliseconds, false);
|
||||
return;
|
||||
if (questitem) {
|
||||
questitem->SetTimer(timer_name, milliseconds);
|
||||
|
||||
if (parse->ItemHasQuestSub(questitem, EVENT_TIMER_START)) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
parse->EventItem(EVENT_TIMER_START, nullptr, questitem, nullptr, export_string, 0);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!QTimerList.empty()) {
|
||||
for (auto e : QTimerList) {
|
||||
if (e.mob && e.mob == owner && e.name == timer_name) {
|
||||
e.Timer_.Enable();
|
||||
e.Timer_.Start(milliseconds, false);
|
||||
|
||||
if (has_start_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
e.name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (owner->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_START, owner->CastToClient(), export_string, 0);
|
||||
} else if (owner->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_START, owner->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (owner->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_START, owner->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
++cur;
|
||||
}
|
||||
|
||||
QTimerList.emplace_back(QuestTimer(milliseconds, owner, timer_name));
|
||||
|
||||
if (has_start_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (owner->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_START, owner->CastToClient(), export_string, 0);
|
||||
} else if (owner->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_START, owner->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (owner->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_START, owner->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::settimerMS(const char* timer_name, int milliseconds, EQ::ItemInstance *inst) {
|
||||
void QuestManager::settimerMS(const std::string& timer_name, uint32 milliseconds, EQ::ItemInstance* inst)
|
||||
{
|
||||
if (inst) {
|
||||
inst->SetTimer(timer_name, milliseconds);
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::settimerMS(const char* timer_name, int milliseconds, Mob *mob) {
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == mob && cur->name == timer_name)
|
||||
{
|
||||
cur->Timer_.Enable();
|
||||
cur->Timer_.Start(milliseconds, false);
|
||||
return;
|
||||
}
|
||||
++cur;
|
||||
void QuestManager::settimerMS(const std::string& timer_name, uint32 milliseconds, Mob* m)
|
||||
{
|
||||
if (!m) {
|
||||
return;
|
||||
}
|
||||
|
||||
QTimerList.emplace_back(QuestTimer(milliseconds, mob, timer_name));
|
||||
const bool has_start_event = (
|
||||
(m->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_START)) ||
|
||||
(m->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_START)) ||
|
||||
(m->IsNPC() && parse->HasQuestSub(m->GetNPCTypeID(), EVENT_TIMER_START))
|
||||
);
|
||||
|
||||
if (!QTimerList.empty()) {
|
||||
for (auto e : QTimerList) {
|
||||
if (e.mob && e.mob == m && e.name == timer_name) {
|
||||
e.Timer_.Enable();
|
||||
e.Timer_.Start(milliseconds, false);
|
||||
|
||||
if (has_start_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (m->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_START, m->CastToClient(), export_string, 0);
|
||||
} else if (m->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_START, m->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (m->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_START, m->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QTimerList.emplace_back(QuestTimer(milliseconds, m, timer_name));
|
||||
|
||||
if (has_start_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (m->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_START, m->CastToClient(), export_string, 0);
|
||||
} else if (m->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_START, m->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (m->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_START, m->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::stoptimer(const char* timer_name) {
|
||||
void QuestManager::stoptimer(const std::string& timer_name)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
if (questitem) {
|
||||
questitem->StopTimer(timer_name);
|
||||
|
||||
if (parse->ItemHasQuestSub(questitem, EVENT_TIMER_STOP)) {
|
||||
parse->EventItem(EVENT_TIMER_STOP, nullptr, questitem, nullptr, timer_name, 0);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
if (!owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == owner && cur->name == timer_name) {
|
||||
QTimerList.erase(cur);
|
||||
return;
|
||||
if (QTimerList.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const bool has_stop_event = (
|
||||
(owner->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(owner->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(owner->IsNPC() && parse->HasQuestSub(owner->GetNPCTypeID(), EVENT_TIMER_STOP))
|
||||
);
|
||||
|
||||
for (auto e = QTimerList.begin(); e != QTimerList.end(); ++e) {
|
||||
LogInfo("Current [{}] Timer [{}]", e->name, timer_name);
|
||||
|
||||
if (e->mob && e->mob == owner && e->name == timer_name) {
|
||||
LogInfo("Matched [{}] Timer [{}]", e->name, timer_name);
|
||||
|
||||
if (has_stop_event) {
|
||||
if (owner->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_STOP, owner->CastToClient(), timer_name, 0);
|
||||
} else if (owner->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_STOP, owner->CastToBot(), nullptr, timer_name, 0);
|
||||
} else if (owner->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_STOP, owner->CastToNPC(), nullptr, timer_name, 0);
|
||||
}
|
||||
}
|
||||
|
||||
QTimerList.erase(e);
|
||||
break;
|
||||
}
|
||||
++cur;
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::stoptimer(const char* timer_name, EQ::ItemInstance *inst) {
|
||||
void QuestManager::stoptimer(const std::string& timer_name, EQ::ItemInstance* inst)
|
||||
{
|
||||
if (inst) {
|
||||
inst->StopTimer(timer_name);
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::stoptimer(const char* timer_name, Mob *mob) {
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
void QuestManager::stoptimer(const std::string& timer_name, Mob* m)
|
||||
{
|
||||
if (!m) {
|
||||
return;
|
||||
}
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == mob && cur->name == timer_name) {
|
||||
QTimerList.erase(cur);
|
||||
return;
|
||||
if (QTimerList.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const bool has_stop_event = (
|
||||
(m->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(m->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(m->IsNPC() && parse->HasQuestSub(m->GetNPCTypeID(), EVENT_TIMER_STOP))
|
||||
);
|
||||
|
||||
for (auto e = QTimerList.begin(); e != QTimerList.end();) {
|
||||
if (e->mob && e->mob == m) {
|
||||
if (has_stop_event) {
|
||||
if (m->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_STOP, m->CastToClient(), e->name, 0);
|
||||
} else if (m->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_STOP, m->CastToBot(), nullptr, e->name, 0);
|
||||
} else if (m->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_STOP, m->CastToNPC(), nullptr, e->name, 0);
|
||||
}
|
||||
}
|
||||
|
||||
QTimerList.erase(e);
|
||||
break;
|
||||
}
|
||||
++cur;
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::stopalltimers() {
|
||||
void QuestManager::stopalltimers()
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
if(questitem) {
|
||||
if (questitem) {
|
||||
if (parse->ItemHasQuestSub(questitem, EVENT_TIMER_STOP)) {
|
||||
auto item_timers = questitem->GetTimers();
|
||||
|
||||
if (item_timers.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto e = item_timers.begin(); e != item_timers.end(); ++e) {
|
||||
if (parse->ItemHasQuestSub(questitem, EVENT_TIMER_STOP)) {
|
||||
parse->EventItem(EVENT_TIMER_STOP, nullptr, questitem, nullptr, e->first, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
questitem->ClearTimers();
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end, tmp;
|
||||
if (!owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if(cur->mob && cur->mob == owner)
|
||||
cur = QTimerList.erase(cur);
|
||||
else
|
||||
++cur;
|
||||
if (QTimerList.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const bool has_stop_event = (
|
||||
(owner->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(owner->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(owner->IsNPC() && parse->HasQuestSub(owner->GetNPCTypeID(), EVENT_TIMER_STOP))
|
||||
);
|
||||
|
||||
for (auto e = QTimerList.begin(); e != QTimerList.end();) {
|
||||
if (e->mob && e->mob == owner) {
|
||||
if (has_stop_event) {
|
||||
if (owner->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_STOP, owner->CastToClient(), e->name, 0);
|
||||
} else if (owner->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_STOP, owner->CastToBot(), nullptr, e->name, 0);
|
||||
} else if (owner->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_STOP, owner->CastToNPC(), nullptr, e->name, 0);
|
||||
}
|
||||
}
|
||||
|
||||
e = QTimerList.erase(e);
|
||||
} else {
|
||||
++e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::stopalltimers(EQ::ItemInstance *inst) {
|
||||
void QuestManager::stopalltimers(EQ::ItemInstance* inst)
|
||||
{
|
||||
if (inst) {
|
||||
if (parse->ItemHasQuestSub(inst, EVENT_TIMER_STOP)) {
|
||||
auto item_timers = inst->GetTimers();
|
||||
|
||||
if (item_timers.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto e = item_timers.begin(); e != item_timers.begin(); ++e) {
|
||||
if (parse->ItemHasQuestSub(inst, EVENT_TIMER_STOP)) {
|
||||
parse->EventItem(EVENT_TIMER_STOP, nullptr, inst, nullptr, e->first, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inst->ClearTimers();
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::stopalltimers(Mob *mob) {
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end, tmp;
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == mob)
|
||||
cur = QTimerList.erase(cur);
|
||||
else
|
||||
++cur;
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::pausetimer(const char* timer_name, Mob* mob) {
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
if (!mob && !owner) {
|
||||
void QuestManager::stopalltimers(Mob* m)
|
||||
{
|
||||
if (!m) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
std::list<PausedTimer>::iterator pcur = PTimerList.begin(), pend;
|
||||
PausedTimer pt;
|
||||
uint32 milliseconds = 0;
|
||||
if (QTimerList.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto m = mob ? mob : owner;
|
||||
const bool has_stop_event = (
|
||||
(m->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(m->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_STOP)) ||
|
||||
(m->IsNPC() && parse->HasQuestSub(m->GetNPCTypeID(), EVENT_TIMER_STOP))
|
||||
);
|
||||
|
||||
pend = PTimerList.end();
|
||||
while (pcur != pend) {
|
||||
if (pcur->owner && pcur->owner == m && pcur->name == timer_name) {
|
||||
LogQuests("Timer [{}] is already paused for [{}]. Returning", timer_name, owner->GetName());
|
||||
for (auto e = QTimerList.begin(); e != QTimerList.end();) {
|
||||
if (e->mob && e->mob == m) {
|
||||
if (has_stop_event) {
|
||||
if (m->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_STOP, m->CastToClient(), e->name, 0);
|
||||
} else if (m->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_STOP, m->CastToBot(), nullptr, e->name, 0);
|
||||
} else if (m->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_STOP, m->CastToNPC(), nullptr, e->name, 0);
|
||||
}
|
||||
}
|
||||
|
||||
e = QTimerList.erase(e);
|
||||
} else {
|
||||
++e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QuestManager::pausetimer(const std::string& timer_name, Mob* m)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
if (!m && !owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* mob = m ? m : owner;
|
||||
|
||||
if (!mob) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (QTimerList.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const auto& e : PTimerList) {
|
||||
if (e.owner && e.owner == mob && e.name == timer_name) {
|
||||
LogQuests("Timer [{}] is already paused for [{}]", timer_name, owner->GetName());
|
||||
return;
|
||||
}
|
||||
++pcur;
|
||||
}
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == m && cur->name == timer_name) {
|
||||
milliseconds = cur->Timer_.GetRemainingTime();
|
||||
QTimerList.erase(cur);
|
||||
break;
|
||||
uint32 milliseconds = 0;
|
||||
|
||||
const bool has_pause_event = (
|
||||
(mob->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_PAUSE)) ||
|
||||
(mob->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_PAUSE)) ||
|
||||
(mob->IsNPC() && parse->HasQuestSub(mob->GetNPCTypeID(), EVENT_TIMER_PAUSE))
|
||||
);
|
||||
|
||||
if (!QTimerList.empty()) {
|
||||
for (auto e = QTimerList.begin(); e != QTimerList.end(); ++e) {
|
||||
if (e->mob && e->mob == mob && e->name == timer_name) {
|
||||
milliseconds = e->Timer_.GetRemainingTime();
|
||||
QTimerList.erase(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PTimerList.emplace_back(
|
||||
PausedTimer{
|
||||
.owner = owner,
|
||||
.name = timer_name,
|
||||
.time = milliseconds
|
||||
}
|
||||
);
|
||||
|
||||
if (has_pause_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (mob->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_PAUSE, mob->CastToClient(), export_string, 0);
|
||||
} else if (mob->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_PAUSE, mob->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (mob->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_PAUSE, mob->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
++cur;
|
||||
}
|
||||
|
||||
std::string timername = timer_name;
|
||||
pt.name = timername;
|
||||
pt.owner = owner;
|
||||
pt.time = milliseconds;
|
||||
LogQuests("Pausing timer [{}] for [{}] with [{}] ms remaining", timer_name, owner->GetName(), milliseconds);
|
||||
PTimerList.push_back(pt);
|
||||
}
|
||||
|
||||
void QuestManager::resumetimer(const char* timer_name, Mob* mob) {
|
||||
void QuestManager::resumetimer(const std::string& timer_name, Mob* m)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
if (!mob && !owner) {
|
||||
if (!m && !owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
std::list<PausedTimer>::iterator pcur = PTimerList.begin(), pend;
|
||||
PausedTimer pt;
|
||||
uint32 milliseconds = 0;
|
||||
|
||||
const auto m = mob ? mob : owner;
|
||||
Mob* mob = m ? m : owner;
|
||||
|
||||
pend = PTimerList.end();
|
||||
while (pcur != pend) {
|
||||
if (pcur->owner && pcur->owner == m && pcur->name == timer_name) {
|
||||
milliseconds = pcur->time;
|
||||
PTimerList.erase(pcur);
|
||||
break;
|
||||
}
|
||||
++pcur;
|
||||
}
|
||||
|
||||
if (milliseconds == 0) {
|
||||
LogQuests("Paused timer [{}] not found or has expired. Returning", timer_name);
|
||||
if (!mob) {
|
||||
return;
|
||||
}
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == m && cur->name == timer_name) {
|
||||
cur->Timer_.Enable();
|
||||
cur->Timer_.Start(milliseconds, false);
|
||||
LogQuests("Resuming timer [{}] for [{}] with [{}] ms remaining",
|
||||
timer_name,
|
||||
owner->GetName(),
|
||||
milliseconds);
|
||||
return;
|
||||
if (PTimerList.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto e = PTimerList.begin(); e != PTimerList.end(); ++e) {
|
||||
if (e->owner && e->owner == mob && e->name == timer_name) {
|
||||
milliseconds = e->time;
|
||||
PTimerList.erase(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!milliseconds) {
|
||||
LogQuests("Paused timer [{}] not found or has expired.", timer_name);
|
||||
return;
|
||||
}
|
||||
|
||||
const bool has_resume_event = (
|
||||
(mob->IsClient() && parse->PlayerHasQuestSub(EVENT_TIMER_RESUME)) ||
|
||||
(mob->IsBot() && parse->BotHasQuestSub(EVENT_TIMER_RESUME)) ||
|
||||
(mob->IsNPC() && parse->HasQuestSub(mob->GetNPCTypeID(), EVENT_TIMER_RESUME))
|
||||
);
|
||||
|
||||
if (!QTimerList.empty()) {
|
||||
for (auto e : QTimerList) {
|
||||
if (e.mob && e.mob == mob && e.name == timer_name) {
|
||||
e.Timer_.Enable();
|
||||
e.Timer_.Start(milliseconds, false);
|
||||
LogQuests(
|
||||
"Resuming timer [{}] for [{}] with [{}] ms remaining",
|
||||
timer_name,
|
||||
owner->GetName(),
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (has_resume_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (mob->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_RESUME, mob->CastToClient(), export_string, 0);
|
||||
} else if (mob->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_RESUME, mob->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (mob->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_RESUME, mob->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
++cur;
|
||||
}
|
||||
|
||||
QTimerList.emplace_back(QuestTimer(milliseconds, m, timer_name));
|
||||
LogQuests("Creating a new timer and resuming [{}] for [{}] with [{}] ms remaining", timer_name, owner->GetName(), milliseconds);
|
||||
|
||||
if (has_resume_event) {
|
||||
const std::string& export_string = fmt::format(
|
||||
"{} {}",
|
||||
timer_name,
|
||||
milliseconds
|
||||
);
|
||||
|
||||
if (mob->IsClient()) {
|
||||
parse->EventPlayer(EVENT_TIMER_RESUME, mob->CastToClient(), export_string, 0);
|
||||
} else if (mob->IsBot()) {
|
||||
parse->EventBot(EVENT_TIMER_RESUME, mob->CastToBot(), nullptr, export_string, 0);
|
||||
} else if (mob->IsNPC()) {
|
||||
parse->EventNPC(EVENT_TIMER_RESUME, mob->CastToNPC(), nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
|
||||
LogQuests(
|
||||
"Creating a new timer and resuming [{}] for [{}] with [{}] ms remaining",
|
||||
timer_name,
|
||||
owner->GetName(),
|
||||
milliseconds
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
bool QuestManager::ispausedtimer(const char* timer_name, Mob* mob) {
|
||||
bool QuestManager::ispausedtimer(const std::string& timer_name, Mob* m)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
std::list<PausedTimer>::iterator pcur = PTimerList.begin(), pend;
|
||||
|
||||
const auto m = mob ? mob : owner;
|
||||
|
||||
pend = PTimerList.end();
|
||||
while (pcur != pend) {
|
||||
if (pcur->owner && pcur->owner == m && pcur->name == timer_name) {
|
||||
return true;
|
||||
}
|
||||
++pcur;
|
||||
if (!m && !owner) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
Mob* mob = m ? m : owner;
|
||||
|
||||
if (!mob) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto& e = std::find_if(
|
||||
PTimerList.begin(),
|
||||
PTimerList.end(),
|
||||
[&timer_name, &mob](PausedTimer e) {
|
||||
return e.owner && e.owner == mob && e.name == timer_name;
|
||||
}
|
||||
);
|
||||
|
||||
return e != PTimerList.end();
|
||||
}
|
||||
|
||||
bool QuestManager::hastimer(const char* timer_name, Mob* mob) {
|
||||
bool QuestManager::hastimer(const std::string& timer_name, Mob* m)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
|
||||
const auto m = mob ? mob : owner;
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == m && cur->name == timer_name) {
|
||||
if (cur->Timer_.Enabled()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
++cur;
|
||||
if (!m && !owner) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
|
||||
Mob* mob = m ? m : owner;
|
||||
|
||||
if (!mob) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto& e = std::find_if(
|
||||
QTimerList.begin(),
|
||||
QTimerList.end(),
|
||||
[&timer_name, &mob](QuestTimer e) {
|
||||
return e.mob && e.mob == mob && e.name == timer_name;
|
||||
}
|
||||
);
|
||||
|
||||
return e != QTimerList.end();
|
||||
}
|
||||
|
||||
uint32 QuestManager::getremainingtimeMS(const char* timer_name, Mob* mob) {
|
||||
uint32 QuestManager::getremainingtimeMS(const std::string& timer_name, Mob* m)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
|
||||
const auto m = mob ? mob : owner;
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == m && cur->name == timer_name) {
|
||||
if (cur->Timer_.Enabled()) {
|
||||
return cur->Timer_.GetRemainingTime();
|
||||
}
|
||||
}
|
||||
++cur;
|
||||
if (!m && !owner) {
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
const auto mob = m ? m : owner;
|
||||
|
||||
if (!mob) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const auto& e = std::find_if(
|
||||
QTimerList.begin(),
|
||||
QTimerList.end(),
|
||||
[&timer_name, &mob](QuestTimer e) {
|
||||
return e.mob && e.mob == mob && e.name == timer_name;
|
||||
}
|
||||
);
|
||||
|
||||
return e != QTimerList.end() ? e->Timer_.GetRemainingTime() : 0;
|
||||
}
|
||||
|
||||
uint32 QuestManager::gettimerdurationMS(const char* timer_name, Mob* mob) {
|
||||
uint32 QuestManager::gettimerdurationMS(const std::string& timer_name, Mob* m)
|
||||
{
|
||||
QuestManagerCurrentQuestVars();
|
||||
|
||||
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
|
||||
|
||||
const auto m = mob ? mob : owner;
|
||||
|
||||
end = QTimerList.end();
|
||||
while (cur != end) {
|
||||
if (cur->mob && cur->mob == m && cur->name == timer_name) {
|
||||
if (cur->Timer_.Enabled()) {
|
||||
return cur->Timer_.GetDuration();
|
||||
}
|
||||
}
|
||||
++cur;
|
||||
if (!m && !owner) {
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
const auto mob = m ? m : owner;
|
||||
|
||||
if (!mob) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const auto& e = std::find_if(
|
||||
QTimerList.begin(),
|
||||
QTimerList.end(),
|
||||
[&timer_name, &mob](QuestTimer e) {
|
||||
return e.mob && e.mob == mob && e.name == timer_name;
|
||||
}
|
||||
);
|
||||
|
||||
return e != QTimerList.end() ? e->Timer_.GetDuration() : 0;
|
||||
}
|
||||
|
||||
void QuestManager::emote(const char *str) {
|
||||
|
||||
Reference in New Issue
Block a user