eluna-scripts-ornfelt/lua/WowEmulationScriptPack/C++/npc_quest_giver.cpp
2024-09-23 07:59:23 +02:00

251 lines
No EOL
9.2 KiB
C++

#include "Chat.h"
#include "CollectionMgr.h"
#include "DatabaseEnv.h"
#include "MapManager.h"
#include "QuestData.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
enum Data
{
DB_MENU_ID = 600023,
DB_GOSSIP = 300000,
fishing = 356,
firstaid = 129,
cooking = 185,
archaeology = 794,
};
class npc_quest_restore : public CreatureScript
{
public:
npc_quest_restore() : CreatureScript("npc_quest_restore") {}
bool OnGossipHello(Player* player, Creature* creature) override
{
LocaleConstant localeConstant = player->GetSession()->GetSessionDbLocaleIndex();
player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, sObjectMgr->GetTrinityString(600023, localeConstant), GOSSIP_SENDER_MAIN, 1, "", 0, true);
player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, sObjectMgr->GetTrinityString(600024, localeConstant), GOSSIP_SENDER_MAIN, 2, "", 1, true);
player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, sObjectMgr->GetTrinityString(600029, localeConstant), GOSSIP_SENDER_MAIN, 3, "", 1, true);
player->ADD_GOSSIP_ITEM_DB(DB_MENU_ID, 3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM_DB(DB_MENU_ID, 4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM_DB(DB_MENU_ID, 5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
player->SEND_GOSSIP_MENU(DB_GOSSIP, creature->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
{
player->PlayerTalkClass->ClearMenus();
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
{
if (player->getLevel() <= 101)
return false;
ObjectGuid::LowType lowGuid = player->GetGUIDLow();
sMapMgr->SetUnloadGarrison(lowGuid);
uint32 id = player->GetTeam() == HORDE ? 71 : 2;
player->SaveToDB();
player->GetSession()->KickPlayer();
creature->AddDelayedEvent(1000, [this, lowGuid, id]() -> void
{
SQLTransaction trans = CharacterDatabase.BeginTransaction();
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_ONLY);
stmt->setUInt64(0, lowGuid);
trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BLUEPRINTS);
stmt->setUInt64(0, lowGuid);
trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BUILDINGS);
stmt->setUInt64(0, lowGuid);
trans->Append(stmt);
trans->PAppend("insert into `character_reward` (`id`, `type`, `owner_guid`)value ('%u','10', '%u')", id, lowGuid);
CharacterDatabase.CommitTransaction(trans);
});
}
break;
case GOSSIP_ACTION_INFO_DEF + 2:
{
ChatHandler(player).PSendSysMessage(600225);
}
break;
case GOSSIP_ACTION_INFO_DEF + 3:
{
switch (player->getClass())
{
case CLASS_WARRIOR:
QuestCheckAndComplete(player, 42605, 42606, 42598, 0);
break;
case CLASS_PALADIN:
QuestCheckAndComplete(player, 42881, 42881, 42846, 42846);
break;
case CLASS_HUNTER:
QuestCheckAndComplete(player, 40957, 42409, 42519, 0);
break;
case CLASS_ROGUE:
QuestCheckAndComplete(player, 43262, 43261, 42139, 0);
break;
case CLASS_PRIEST:
QuestCheckAndComplete(player, 43271, 43272, 43270, 0);
break;
case CLASS_DEATH_KNIGHT:
QuestCheckAndComplete(player, 39816, 39818, 43264, 0);
break;
case CLASS_SHAMAN:
QuestCheckAndComplete(player, 42197, 42198, 42383, 0);
break;
case CLASS_MAGE:
QuestCheckAndComplete(player, 42662, 42685, 42663, 0);
break;
case CLASS_WARLOCK:
QuestCheckAndComplete(player, 41748, 41750, 42608, 0);
break;
case CLASS_MONK:
QuestCheckAndComplete(player, 41115, 40704, 42187, 0);
break;
case CLASS_DRUID:
QuestCheckAndComplete(player, 42096, 40650, 42583, 0);
break;
case CLASS_DEMON_HUNTER:
QuestCheckAndComplete(player, 42695, 42697, 42671, 0);
break;
}
break;
}
}
player->CLOSE_GOSSIP_MENU();
return true;
}
bool OnGossipSelectCode(Player* player, Creature* creature, uint32 /*sender*/, uint32 action, const char* code) override
{
player->PlayerTalkClass->ClearMenus();
switch (action)
{
case 1:
{
questID = atol(code);
if (player->GetQuestStatus(questID) == QUEST_STATUS_REWARDED)
{
player->UpdateAchievementCriteria(CRITERIA_TYPE_COMPLETE_QUEST, questID);
ChatHandler(player).PSendSysMessage("Quest %u has been recompleted in achievement progress for your character.", questID);
}
else
ChatHandler(player).PSendSysMessage("You doesn't have saved quest %u on this character.", questID);
break;
}
case 2:
{
achievementID = atol(code);
if (AchievementEntry const *achiev = sAchievementStore.LookupEntry(achievementID))
{
if (player->GetAchievementMgr()->IsCompletedAchievement(achiev, player))
{
player->CompletedAchievement(achiev);
ChatHandler(player).PSendSysMessage("Achievement %u has been completed for your character.", achievementID);
}
else
ChatHandler(player).PSendSysMessage("You doesn't have requried conditions for achievement: %u. Or have it already.", achievementID);
}
else
ChatHandler(player).PSendSysMessage("Incorrect achievement or criteria ID.");
if (achievementID >= 16000)
{
if (player->HasSpell(achievementID))
player->UpdateAchievementCriteria(CRITERIA_TYPE_LEARN_SPELL, achievementID);
}
uint32 speciesID = 0;
if (auto speciesInfo = sDB2Manager.GetSpeciesByCreatureID(achievementID))
{
speciesID = speciesInfo->ID;
if (player->GetBattlePetCountForSpecies(speciesID))
player->UpdateAchievementCriteria(CRITERIA_TYPE_ADD_BATTLE_PET_JOURNAL, achievementID);
}
if (achievementID == 10000)
{
if (auto skill = player->GetBaseSkillValue(fishing))
player->UpdateAchievementCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, fishing);
if (auto skill = player->GetBaseSkillValue(firstaid))
player->UpdateAchievementCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, firstaid);
if (auto skill = player->GetBaseSkillValue(cooking))
player->UpdateAchievementCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, cooking);
if (auto skill = player->GetBaseSkillValue(archaeology))
player->UpdateAchievementCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, archaeology);
}
break;
}
case 3:
{
mountSpell = atol(code);
auto accountId = player->GetSession()->GetAccountId();
QueryResult result = CharacterDatabase.PQuery("SELECT spell FROM account_mounts WHERE account = %u and spell = %u", accountId, mountSpell);
if (result)
{
player->removeSpell(mountSpell, false);
player->learnSpell(mountSpell, false);
ChatHandler(player).PSendSysMessage(600031);
}
break;
}
}
return OnGossipHello(player, creature);
}
private:
uint32 questID = 0;
uint32 achievementID = 0;
uint32 mountSpell = 0;
bool QuestCheckAndComplete(Player* player, uint32 checkId1, uint32 checkId2, uint32 completeId1, uint32 completeId2)
{
if (checkId1)
{
if (player->GetQuestStatus(checkId1) != QUEST_STATUS_REWARDED)
return false;
}
if (checkId2)
{
if (player->GetQuestStatus(checkId2) != QUEST_STATUS_REWARDED)
return false;
}
player->CompleteQuest(completeId1);
player->CompleteQuest(completeId2);
return true;
}
};
void AddSC_npc_quest_giver()
{
new npc_quest_restore();
}