diff --git a/sql/custom/world/world.DKS.sql b/sql/custom/world/world.DKS.sql new file mode 100644 index 00000000000..07b32c31df8 --- /dev/null +++ b/sql/custom/world/world.DKS.sql @@ -0,0 +1,4 @@ +-- npc id lich king +-- Original npcflag was 2 +-- no previous scriptname +UPDATE `creature_template` SET `npcflag`='3', `ScriptName`='npc_tc_skip_lich' WHERE `entry`=25462; diff --git a/src/server/scripts/Custom/SkipDK.cpp b/src/server/scripts/Custom/SkipDK.cpp new file mode 100644 index 00000000000..ebc3b753cb0 --- /dev/null +++ b/src/server/scripts/Custom/SkipDK.cpp @@ -0,0 +1,323 @@ +/* +* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . +* +* Skip Death Knight Module +* Original Module From Single Player Project Consolidated Skip Module +* Rewritten for TC 335 By Single Player Project Developer MDic +* Original Concept from conanhun513 +* Assistance and Review by JinnaiX +*/ + +#include "AccountMgr.h" +#include "ScriptMgr.h" +#include "Player.h" +#include "Config.h" +#include "Common.h" +#include "Chat.h" +#include "ObjectAccessor.h" +#include "ObjectMgr.h" +#include "Player.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" +#include "SharedDefines.h" +#include "World.h" +#include "WorldSession.h" + +class Trinitycore_skip_deathknight_announce : public PlayerScript +{ +public: + Trinitycore_skip_deathknight_announce() : PlayerScript("Trinitycore_skip_deathknight_announce") { } + + void OnLogin(Player* Player, bool /*firstLogin*/) override + { + if (sConfigMgr->GetBoolDefault("Skip.Deathknight.Starter.Announce.enable", true)) + { + ChatHandler(Player->GetSession()).SendSysMessage("This server is running the |cff4CFF00Trinitycore Skip Deathknight Starter |rmodule."); + } + } +}; + +class Trinitycore_skip_deathknight : public PlayerScript +{ +public: + Trinitycore_skip_deathknight() : PlayerScript("Trinitycore_skip_deathknight") { } + + void OnLogin(Player* player, bool firstLogin) override + { + int DKL = sConfigMgr->GetFloatDefault("Skip.Deathknight.Start.Level", 58); + + if (sConfigMgr->GetBoolDefault("Skip.Deathknight.Starter.Enable", true)) + { + if (player->GetAreaId() == 4342) + { + if (!firstLogin) + return; + player->SetLevel(DKL); + player->LearnSpell(53428, false);//runeforging + player->LearnSpell(53441, false);//runeforging + player->LearnSpell(53344, false);//runeforging + player->LearnSpell(62158, false);//runeforging + player->LearnSpell(33391, false);//journeyman riding + player->LearnSpell(54586, false);//runeforging credit + player->LearnSpell(48778, false);//acherus deathcharger + player->LearnSkillRewardedSpells(776, 375);//Runeforging + player->LearnSkillRewardedSpells(960, 375);//Runeforging + player->EquipNewItem(EQUIPMENT_SLOT_HEAD, 38661, true);//Greathelm of the Scourge Champion + player->EquipNewItem(EQUIPMENT_SLOT_WRISTS, 38666, true);//Plated Saronite Bracers + player->EquipNewItem(EQUIPMENT_SLOT_WAIST, 38668, true);//The Plaguebringer's Girdle + player->EquipNewItem(EQUIPMENT_SLOT_HANDS, 38667, true);//Bloodbane's Gauntlets of Command + player->EquipNewItem(EQUIPMENT_SLOT_CHEST, 38665, true);//Saronite War Plate + player->EquipNewItem(EQUIPMENT_SLOT_LEGS, 38669, true);//Engraved Saronite Legplates + player->EquipNewItem(EQUIPMENT_SLOT_SHOULDERS, 38663, true);// Blood-Soaked Saronite Plated Spaulders + player->EquipNewItem(EQUIPMENT_SLOT_FEET, 38670, true);//Greaves of the Slaughter + player->EquipNewItem(EQUIPMENT_SLOT_TRINKET1, 38675, true);//Signet of the Dark Brotherhood + player->EquipNewItem(EQUIPMENT_SLOT_TRINKET2, 38674, true);//Soul Harvester's Charm + player->EquipNewItem(EQUIPMENT_SLOT_FINGER1, 38671, true);//Valanar's Signet Ring + player->EquipNewItem(EQUIPMENT_SLOT_FINGER2, 38672, true);// Keleseth's Signet Ring + player->AddItem(39320, true);//Sky Darkener's Shroud of Blood + player->AddItem(38664, true);//Sky Darkener's Shroud of the Unholy + player->AddItem(39322, true);//Shroud of the North Wind + player->AddItem(38632, true);//Greatsword of the Ebon Blade + player->AddItem(6948, true);//Hearthstone + player->AddItem(38707, true);//Runed Soulblade + player->AddItem(40483, true);//Insignia of the Scourge + + if (player->GetQuestStatus(12657) == QUEST_STATUS_NONE)//The Might Of The Scourge + { + player->AddQuest(sObjectMgr->GetQuestTemplate(12657), nullptr); + player->RewardQuest(sObjectMgr->GetQuestTemplate(12657), false, player); + } + if (player->GetQuestStatus(12801) == QUEST_STATUS_NONE)//The Light of Dawn + { + player->AddQuest(sObjectMgr->GetQuestTemplate(12801), nullptr); + player->RewardQuest(sObjectMgr->GetQuestTemplate(12801), false, player); + } + if (player->GetTeam() == ALLIANCE && player->GetQuestStatus(13188) == QUEST_STATUS_NONE)//Where Kings Walk + player->AddQuest(sObjectMgr->GetQuestTemplate(13188), nullptr); + else if (player->GetTeam() == HORDE && player->GetQuestStatus(13189) == QUEST_STATUS_NONE)//Saurfang's Blessing + player->AddQuest(sObjectMgr->GetQuestTemplate(13189), nullptr); + if (player->GetTeam() == ALLIANCE) + player->TeleportTo(0, -8833.37f, 628.62f, 94.00f, 1.06f);//Stormwind + else + player->TeleportTo(1, 1569.59f, -4397.63f, 16.06f, 0.54f);//Orgrimmar + ObjectAccessor::SaveAllPlayers();//Save + } + } + + if (sConfigMgr->GetBoolDefault("GM.Skip.Deathknight.Starter.Enable", true)) + { + if (player->GetSession()->GetSecurity() >= SEC_MODERATOR && player->GetAreaId() == 4342) + { + if (!firstLogin) + return; + player->SetLevel(DKL); + player->LearnSpell(53428, false);//runeforging + player->LearnSpell(53441, false);//runeforging + player->LearnSpell(53344, false);//runeforging + player->LearnSpell(62158, false);//runeforging + player->LearnSpell(33391, false);//journeyman riding + player->LearnSpell(54586, false);//runeforging credit + player->LearnSpell(48778, false);//acherus deathcharger + player->LearnSkillRewardedSpells(776, 375);//Runeforging + player->LearnSkillRewardedSpells(960, 375);//Runeforging + player->EquipNewItem(EQUIPMENT_SLOT_HEAD, 38661, true);//Greathelm of the Scourge Champion + player->EquipNewItem(EQUIPMENT_SLOT_WRISTS, 38666, true);//Plated Saronite Bracers + player->EquipNewItem(EQUIPMENT_SLOT_WAIST, 38668, true);//The Plaguebringer's Girdle + player->EquipNewItem(EQUIPMENT_SLOT_HANDS, 38667, true);//Bloodbane's Gauntlets of Command + player->EquipNewItem(EQUIPMENT_SLOT_CHEST, 38665, true);//Saronite War Plate + player->EquipNewItem(EQUIPMENT_SLOT_LEGS, 38669, true);//Engraved Saronite Legplates + player->EquipNewItem(EQUIPMENT_SLOT_SHOULDERS, 38663, true);// Blood-Soaked Saronite Plated Spaulders + player->EquipNewItem(EQUIPMENT_SLOT_FEET, 38670, true);//Greaves of the Slaughter + player->EquipNewItem(EQUIPMENT_SLOT_TRINKET1, 38675, true);//Signet of the Dark Brotherhood + player->EquipNewItem(EQUIPMENT_SLOT_TRINKET2, 38674, true);//Soul Harvester's Charm + player->EquipNewItem(EQUIPMENT_SLOT_FINGER1, 38671, true);//Valanar's Signet Ring + player->EquipNewItem(EQUIPMENT_SLOT_FINGER2, 38672, true);// Keleseth's Signet Ring + player->AddItem(39320, true);//Sky Darkener's Shroud of Blood + player->AddItem(38664, true);//Sky Darkener's Shroud of the Unholy + player->AddItem(39322, true);//Shroud of the North Wind + player->AddItem(38632, true);//Greatsword of the Ebon Blade + player->AddItem(6948, true);//Hearthstone + player->AddItem(38707, true);//Runed Soulblade + player->AddItem(40483, true);//Insignia of the Scourge + + if (player->GetQuestStatus(12657) == QUEST_STATUS_NONE)//The Might Of The Scourge + { + player->AddQuest(sObjectMgr->GetQuestTemplate(12657), nullptr); + player->RewardQuest(sObjectMgr->GetQuestTemplate(12657), false, player); + } + if (player->GetQuestStatus(12801) == QUEST_STATUS_NONE)//The Light of Dawn + { + player->AddQuest(sObjectMgr->GetQuestTemplate(12801), nullptr); + player->RewardQuest(sObjectMgr->GetQuestTemplate(12801), false, player); + } + if (player->GetTeam() == ALLIANCE && player->GetQuestStatus(13188) == QUEST_STATUS_NONE)//Where Kings Walk + player->AddQuest(sObjectMgr->GetQuestTemplate(13188), nullptr); + else if (player->GetTeam() == HORDE && player->GetQuestStatus(13189) == QUEST_STATUS_NONE)//Saurfang's Blessing + player->AddQuest(sObjectMgr->GetQuestTemplate(13189), nullptr); + if (player->GetTeam() == ALLIANCE) + player->TeleportTo(0, -8833.37f, 628.62f, 94.00f, 1.06f);//Stormwind + else + player->TeleportTo(1, 1569.59f, -4397.63f, 16.06f, 0.54f);//Orgrimmar + ObjectAccessor::SaveAllPlayers();//Save + } + } + } +}; + +#define LOCALE_LICHKING_0 "I wish to skip the Death Knight starter questline." +#define LOCALE_LICHKING_1 "죽음의 기사 스타터 퀘스트 라인을 건너뛰고 싶습니다." +#define LOCALE_LICHKING_2 "Je souhaite sauter la série de quêtes de démarrage du Chevalier de la mort." +#define LOCALE_LICHKING_3 "Ich möchte die Todesritter-Starter-Questreihe überspringen." +#define LOCALE_LICHKING_4 "我想跳過死亡騎士新手任務線。" +#define LOCALE_LICHKING_5 "我想跳過死亡騎士新手任務線。" +#define LOCALE_LICHKING_6 "Deseo saltarme la línea de misiones de inicio del Caballero de la Muerte." +#define LOCALE_LICHKING_7 "Deseo saltarme la línea de misiones de inicio del Caballero de la Muerte." +#define LOCALE_LICHKING_8 "Я хочу пропустить начальную цепочку заданий Рыцаря Смерти." + +class Trinitycore_optional_deathknight_skip : public CreatureScript +{ +public: + Trinitycore_optional_deathknight_skip() : CreatureScript("npc_tc_skip_lich") { } + + struct npc_SkipLichAI : public ScriptedAI + { + npc_SkipLichAI(Creature* creature) : ScriptedAI(creature) { } + + bool OnGossipHello(Player* player) override + { + if (me->IsQuestGiver()) + { + player->PrepareQuestMenu(me->GetGUID()); + } + + if (sConfigMgr->GetBoolDefault("Skip.Deathknight.Optional.Enable", true)) + { + char const* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_koKR: localizedEntry = LOCALE_LICHKING_1; break; + case LOCALE_frFR: localizedEntry = LOCALE_LICHKING_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_LICHKING_3; break; + case LOCALE_zhCN: localizedEntry = LOCALE_LICHKING_4; break; + case LOCALE_zhTW: localizedEntry = LOCALE_LICHKING_5; break; + case LOCALE_esES: localizedEntry = LOCALE_LICHKING_6; break; + case LOCALE_esMX: localizedEntry = LOCALE_LICHKING_7; break; + case LOCALE_ruRU: localizedEntry = LOCALE_LICHKING_8; break; + case LOCALE_enUS: localizedEntry = LOCALE_LICHKING_0; break; + default: localizedEntry = LOCALE_LICHKING_0; + } + AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, 11); + } + + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + int DKL = sConfigMgr->GetFloatDefault("Skip.Deathknight.Start.Level", 58); + CloseGossipMenuFor(player); + + switch (gossipListId) + { + case 11: + AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, "Yes", GOSSIP_SENDER_MAIN, 12); + AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, "No", GOSSIP_SENDER_MAIN, 13); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + + case 12: + if (player->GetLevel() <= DKL) + { + player->SetLevel(DKL); + } + player->LearnSpell(53428, false);//runeforging + player->LearnSpell(53441, false);//runeforging + player->LearnSpell(53344, false);//runeforging + player->LearnSpell(62158, false);//runeforging + player->LearnSpell(33391, false);//journeyman riding + player->LearnSpell(54586, false);//runeforging credit + player->LearnSpell(48778, false);//acherus deathcharger + player->LearnSkillRewardedSpells(776, 375);//Runeforging + player->LearnSkillRewardedSpells(960, 375);//Runeforging + player->EquipNewItem(EQUIPMENT_SLOT_HEAD, 38661, true);//Greathelm of the Scourge Champion + player->EquipNewItem(EQUIPMENT_SLOT_WRISTS, 38666, true);//Plated Saronite Bracers + player->EquipNewItem(EQUIPMENT_SLOT_WAIST, 38668, true);//The Plaguebringer's Girdle + player->EquipNewItem(EQUIPMENT_SLOT_HANDS, 38667, true);//Bloodbane's Gauntlets of Command + player->EquipNewItem(EQUIPMENT_SLOT_CHEST, 38665, true);//Saronite War Plate + player->EquipNewItem(EQUIPMENT_SLOT_LEGS, 38669, true);//Engraved Saronite Legplates + player->EquipNewItem(EQUIPMENT_SLOT_SHOULDERS, 38663, true);// Blood-Soaked Saronite Plated Spaulders + player->EquipNewItem(EQUIPMENT_SLOT_FEET, 38670, true);//Greaves of the Slaughter + player->EquipNewItem(EQUIPMENT_SLOT_TRINKET1, 38675, true);//Signet of the Dark Brotherhood + player->EquipNewItem(EQUIPMENT_SLOT_TRINKET2, 38674, true);//Soul Harvester's Charm + player->EquipNewItem(EQUIPMENT_SLOT_FINGER1, 38671, true);//Valanar's Signet Ring + player->EquipNewItem(EQUIPMENT_SLOT_FINGER2, 38672, true);// Keleseth's Signet Ring + player->AddItem(39320, true);//Sky Darkener's Shroud of Blood + player->AddItem(38664, true);//Sky Darkener's Shroud of the Unholy + player->AddItem(39322, true);//Shroud of the North Wind + player->AddItem(38632, true);//Greatsword of the Ebon Blade + player->AddItem(6948, true);//Hearthstone + player->AddItem(38707, true);//Runed Soulblade + player->AddItem(40483, true);//Insignia of the Scourge + + if (player->GetQuestStatus(12657) == QUEST_STATUS_NONE)//The Might Of The Scourge + { + player->AddQuest(sObjectMgr->GetQuestTemplate(12657), nullptr); + player->RewardQuest(sObjectMgr->GetQuestTemplate(12657), false, player); + } + if (player->GetQuestStatus(12801) == QUEST_STATUS_NONE)//The Light of Dawn + { + player->AddQuest(sObjectMgr->GetQuestTemplate(12801), nullptr); + player->RewardQuest(sObjectMgr->GetQuestTemplate(12801), false, player); + } + if (player->GetTeam() == ALLIANCE && player->GetQuestStatus(13188) == QUEST_STATUS_NONE)//Where Kings Walk + player->AddQuest(sObjectMgr->GetQuestTemplate(13188), nullptr); + else if (player->GetTeam() == HORDE && player->GetQuestStatus(13189) == QUEST_STATUS_NONE)//Saurfang's Blessing + player->AddQuest(sObjectMgr->GetQuestTemplate(13189), nullptr); + if (player->GetTeam() == ALLIANCE) + player->TeleportTo(0, -8833.37f, 628.62f, 94.00f, 1.06f);//Stormwind + else + player->TeleportTo(1, 1569.59f, -4397.63f, 16.06f, 0.54f);//Orgrimmar + ObjectAccessor::SaveAllPlayers();//Save + CloseGossipMenuFor(player); + break; + + case 13://close + CloseGossipMenuFor(player); + break; + + default: + + break; + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_SkipLichAI(creature); + } +}; + +void AddSC_skip_StarterArea() +{ + new Trinitycore_skip_deathknight_announce; + new Trinitycore_skip_deathknight; + new Trinitycore_optional_deathknight_skip; +} diff --git a/src/server/scripts/Custom/custom_script_loader.cpp b/src/server/scripts/Custom/custom_script_loader.cpp index 9e5e9ba2bfd..702789c280b 100644 --- a/src/server/scripts/Custom/custom_script_loader.cpp +++ b/src/server/scripts/Custom/custom_script_loader.cpp @@ -19,6 +19,9 @@ // The name of this function should match: // void Add${NameOfDirectory}Scripts() +void AddSC_skip_StarterArea(); + void AddCustomScripts() { + AddSC_skip_StarterArea(); } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index f475d0248e8..ed28b5e296a 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -4125,3 +4125,49 @@ Metric.OverallStatusInterval = 1 # ################################################################################################### + +################################################################################################### +#Skip Death Knight Starting Area# +################################# +# +# Skip Death Knight Starting Area +# Enable this if you want to skip the Deathknight starting area +# Start with level 58 DK with Runeforging. +# +# Skip.Deathknight.Starter.Announce.enable +# Description: Announces Module when player logs in. +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Skip.Deathknight.Starter.Announce.enable = 1 + +# Skip.DeathKnight.Starter.Enable +# Active Module for all new accounts regardless of account level. Instant Skip on DK Creation. +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Skip.Deathknight.Starter.Enable = 0 + +# GM.Skip.Deathknight.Starter.Enable +# Active Module for all new accounts of a GM account level ONLY. Instant Skip on DK Creation. +# Ensure you have Skip.Deathknight.Starter.Enable set to 0 if using this conf. +# Default: 0 - (Disabled) +# 1 - (Enabled) + +GM.Skip.Deathknight.Starter.Enable = 0 + +# Skip.Deathknight.Start.Level +# Adjusted Death Knight Start Level if module is used. +# Default: 58 - (Default) +# + +Skip.Deathknight.Start.Level = 58 + +# Skip.Deathknight.Optional.Enable +# Enables optional to skip when talking to lich king on first creation of dk. +# Default: 1 - (Active) + +Skip.Deathknight.Optional.Enable = 1 + +# +################################################################################################### \ No newline at end of file