diff --git a/source/WorldServer/LuaFunctions.cpp b/source/WorldServer/LuaFunctions.cpp index 4fec750..b5fcfbe 100644 --- a/source/WorldServer/LuaFunctions.cpp +++ b/source/WorldServer/LuaFunctions.cpp @@ -3747,6 +3747,25 @@ int EQ2Emu_lua_HasQuest(lua_State* state) { return 0; } +int EQ2Emu_lua_HasPendingQuest(lua_State* state) { + if (!lua_interface) + return 0; + Spawn* player = lua_interface->GetSpawn(state); + int32 quest_id = lua_interface->GetInt32Value(state, 2); + lua_interface->ResetFunctionStack(state); + if(!player || !player->IsPlayer()) { + lua_interface->LogError("%s: LUA HasPendingQuest command error: player is not valid", lua_interface->GetScriptName(state)); + return 0; + } + + if(!player->GetClient()) { + lua_interface->LogError("%s: LUA HasPendingQuest command error: client is not valid", lua_interface->GetScriptName(state)); + return 0; + } + lua_interface->SetBooleanValue(state, (((Player*)player)->GetClient()->HasPendingQuest(quest_id))); + return 1; +} + int EQ2Emu_lua_QuestReturnNPC(lua_State* state) { if (!lua_interface) return 0; diff --git a/source/WorldServer/LuaFunctions.h b/source/WorldServer/LuaFunctions.h index 9a8e884..d15461f 100644 --- a/source/WorldServer/LuaFunctions.h +++ b/source/WorldServer/LuaFunctions.h @@ -302,6 +302,7 @@ int EQ2Emu_lua_UpdateQuestZone(lua_State* state); int EQ2Emu_lua_SetCompletedDescription(lua_State* state); int EQ2Emu_lua_ProvidesQuest(lua_State* state); int EQ2Emu_lua_HasQuest(lua_State* state); +int EQ2Emu_lua_HasPendingQuest(lua_State* state); int EQ2Emu_lua_HasCompletedQuest(lua_State* state); int EQ2Emu_lua_QuestIsComplete(lua_State* state); int EQ2Emu_lua_QuestReturnNPC(lua_State* state); diff --git a/source/WorldServer/LuaInterface.cpp b/source/WorldServer/LuaInterface.cpp index 73e92ff..41fa518 100644 --- a/source/WorldServer/LuaInterface.cpp +++ b/source/WorldServer/LuaInterface.cpp @@ -1262,6 +1262,7 @@ void LuaInterface::RegisterFunctions(lua_State* state) { lua_register(state, "OfferQuest", EQ2Emu_lua_OfferQuest); lua_register(state, "ProvidesQuest", EQ2Emu_lua_ProvidesQuest); lua_register(state, "HasQuest", EQ2Emu_lua_HasQuest); + lua_register(state, "HasPendingQuest", EQ2Emu_lua_HasPendingQuest); lua_register(state, "HasCompletedQuest", EQ2Emu_lua_HasCompletedQuest); lua_register(state, "QuestIsComplete", EQ2Emu_lua_QuestIsComplete); lua_register(state, "QuestReturnNPC", EQ2Emu_lua_QuestReturnNPC); diff --git a/source/WorldServer/client.cpp b/source/WorldServer/client.cpp index ac43c22..ef13469 100644 --- a/source/WorldServer/client.cpp +++ b/source/WorldServer/client.cpp @@ -6990,6 +6990,17 @@ void Client::AcceptQuest(int32 quest_id) { MPendingQuestAccept.unlock_shared(); } +bool Client::HasPendingQuest(int32 quest_id) { + std::shared_lock lock(MPendingQuestAccept); + if (player->pending_quests.count(quest_id) > 0) { + Quest* quest = player->pending_quests[quest_id]; + if (quest) { + return true; + } + } + return false; +} + void Client::RemovePendingQuest(int32 quest_id) { bool send_updates = false; MPendingQuestAccept.lock_shared(); diff --git a/source/WorldServer/client.h b/source/WorldServer/client.h index c130abe..ee5e7c8 100644 --- a/source/WorldServer/client.h +++ b/source/WorldServer/client.h @@ -375,6 +375,7 @@ public: void CheckPlayerQuestsLocationUpdate(); void AddPendingQuest(Quest* quest, bool forced = false); void AcceptQuest(int32 quest_id); + bool HasPendingQuest(int32 quest_id); void RemovePendingQuest(int32 quest_id); void SetPlayerQuest(Quest* quest, map* progress); void AddPlayerQuest(Quest* quest, bool call_accepted = true, bool send_packets = true);