[Feature] Zone Scripting (#4908)

* [Feature] Add Zone Scripting Capabilities

* Push

* Update zone.cpp

* Fix crashes

* Lua

* Add other events, finish Lua

* Add EVENT_ENTER_ZONE

* Final

* Push

* Push

* [Feature] Add Zone Scripting Capabilities

* Push

* Update zone.cpp

* Fix crashes

* Add EVENT_ENTER_ZONE

* Remove duplicates

* Update embparser.cpp
This commit is contained in:
Alex King
2025-07-10 15:08:08 -04:00
committed by GitHub
parent ab45d4358d
commit 323a0c0b27
22 changed files with 2009 additions and 340 deletions
+60 -54
View File
@@ -64,10 +64,10 @@ QuestManager quest_manager;
EQ::ItemInstance* questitem = nullptr; \
const SPDat_Spell_Struct* questspell = nullptr; \
bool depop_npc = false; \
std::string encounter; \
std::string encounter = ""; \
do { \
if(!quests_running_.empty()) { \
running_quest e = quests_running_.top(); \
if(!m_running_quests.empty()) { \
RunningQuest e = m_running_quests.top(); \
owner = e.owner; \
initiator = e.initiator; \
questitem = e.questitem; \
@@ -124,33 +124,30 @@ void QuestManager::Process() {
}
}
void QuestManager::StartQuest(Mob *_owner, Client *_initiator, EQ::ItemInstance* _questitem, const SPDat_Spell_Struct* _questspell, std::string encounter) {
running_quest run;
run.owner = _owner;
run.initiator = _initiator;
run.questitem = _questitem;
run.questspell = _questspell;
run.depop_npc = false;
run.encounter = encounter;
quests_running_.push(run);
void QuestManager::StartQuest(const RunningQuest& q)
{
m_running_quests.push(q);
}
void QuestManager::EndQuest() {
running_quest run = quests_running_.top();
if(run.depop_npc && run.owner->IsNPC()) {
RunningQuest run = m_running_quests.top();
if (run.depop_npc && run.owner->IsNPC()) {
//clear out any timers for them...
std::list<QuestTimer>::iterator cur = QTimerList.begin(), end;
end = QTimerList.end();
while (cur != end) {
if (cur->mob == run.owner)
if (cur->mob == run.owner) {
cur = QTimerList.erase(cur);
else
} else {
++cur;
}
}
run.owner->Depop();
}
quests_running_.pop();
m_running_quests.pop();
}
void QuestManager::ClearAllTimers() {
@@ -1098,18 +1095,18 @@ void QuestManager::depop(int npc_type) {
tmp->CastToNPC()->Depop();
}
else {
running_quest e = quests_running_.top();
RunningQuest e = m_running_quests.top();
e.depop_npc = true;
quests_running_.pop();
quests_running_.push(e);
m_running_quests.pop();
m_running_quests.push(e);
}
}
}
else { //depop self
running_quest e = quests_running_.top();
RunningQuest e = m_running_quests.top();
e.depop_npc = true;
quests_running_.pop();
quests_running_.push(e);
m_running_quests.pop();
m_running_quests.push(e);
}
}
}
@@ -1606,7 +1603,7 @@ void QuestManager::save() {
void QuestManager::faction(int faction_id, int faction_value, int temp) {
QuestManagerCurrentQuestVars();
running_quest run = quests_running_.top();
RunningQuest run = m_running_quests.top();
if(run.owner->IsCharmed() == false && initiator) {
if(faction_id != 0 && faction_value != 0) {
initiator->SetFactionLevel2(
@@ -2077,10 +2074,10 @@ void QuestManager::respawn(int npcTypeID, int grid) {
if (!owner || !owner->IsNPC())
return;
running_quest e = quests_running_.top();
RunningQuest e = m_running_quests.top();
e.depop_npc = true;
quests_running_.pop();
quests_running_.push(e);
m_running_quests.pop();
m_running_quests.push(e);
const NPCType* npcType = nullptr;
if ((npcType = content_db.LoadNPCTypesData(npcTypeID)))
@@ -3980,81 +3977,90 @@ void QuestManager::ReloadZoneStaticData()
}
}
Client *QuestManager::GetInitiator() const {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
Client* QuestManager::GetInitiator() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return e.initiator;
}
return nullptr;
}
NPC *QuestManager::GetNPC() const {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
NPC* QuestManager::GetNPC() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return (e.owner && e.owner->IsNPC()) ? e.owner->CastToNPC() : nullptr;
}
return nullptr;
}
Bot *QuestManager::GetBot() const {
if (!quests_running_.empty()) {
running_quest e = quests_running_.top();
Bot* QuestManager::GetBot() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return (e.owner && e.owner->IsBot()) ? e.owner->CastToBot() : nullptr;
}
return nullptr;
}
Merc *QuestManager::GetMerc() const {
if (!quests_running_.empty()) {
running_quest e = quests_running_.top();
Merc* QuestManager::GetMerc() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return (e.owner && e.owner->IsMerc()) ? e.owner->CastToMerc() : nullptr;
}
return nullptr;
}
Mob *QuestManager::GetOwner() const {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
Mob* QuestManager::GetOwner() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return e.owner;
}
return nullptr;
}
EQ::InventoryProfile *QuestManager::GetInventory() const {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
EQ::InventoryProfile* QuestManager::GetInventory() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return &e.initiator->GetInv();
}
return nullptr;
}
EQ::ItemInstance *QuestManager::GetQuestItem() const {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
EQ::ItemInstance* QuestManager::GetQuestItem() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return e.questitem;
}
return nullptr;
}
const SPDat_Spell_Struct *QuestManager::GetQuestSpell() {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
const SPDat_Spell_Struct* QuestManager::GetQuestSpell()
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return e.questspell;
}
return nullptr;
}
std::string QuestManager::GetEncounter() const {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
std::string QuestManager::GetEncounter() const
{
if (!m_running_quests.empty()) {
RunningQuest e = m_running_quests.top();
return e.encounter;
}