From 5f268ea9790d29800e550c38430f20f868602203 Mon Sep 17 00:00:00 2001
From: zgn <zgn88@mail.ru>
Date: Wed, 20 Apr 2022 21:33:19 +0300
Subject: [PATCH] Chromie base staff TODO: quest add, spell script
---
sql/custom/world/.gitignore | 1 -
sql/custom/world/2022_04_20_00_custom.sql | 16 ++++++
src/server/game/Handlers/MiscHandler.cpp | 20 +++++++
src/server/game/Miscellaneous/SharedDefines.h | 10 ++++
.../game/Server/Packets/MiscPackets.cpp | 18 +++++++
src/server/game/Server/Packets/MiscPackets.h | 29 +++++++++++
src/server/game/Server/Protocol/Opcodes.cpp | 6 +--
src/server/game/Server/WorldSession.h | 2 +
src/server/scripts/World/npcs_special.cpp | 52 +++++++++++++++++++
9 files changed, 150 insertions(+), 4 deletions(-)
delete mode 100644 sql/custom/world/.gitignore
create mode 100644 sql/custom/world/2022_04_20_00_custom.sql
diff --git a/sql/custom/world/.gitignore b/sql/custom/world/.gitignore
deleted file mode 100644
index d1b811b7de..0000000000
--- a/sql/custom/world/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.sql
diff --git a/sql/custom/world/2022_04_20_00_custom.sql b/sql/custom/world/2022_04_20_00_custom.sql
new file mode 100644
index 0000000000..a7c00afab0
--- /dev/null
+++ b/sql/custom/world/2022_04_20_00_custom.sql
@@ -0,0 +1,16 @@
+DELETE FROM `creature_questender` WHERE `quest` IN (62567, 62568);
+INSERT INTO `creature_questender` VALUES
+(167032, 62567),
+(167032, 62568);
+
+UPDATE `creature_template` SET `ScriptName`='npc_chromie_167032' WHERE `entry`=167032;
+
+DELETE FROM `gossip_menu` WHERE `MenuID`=25426;
+INSERT INTO `gossip_menu` VALUES
+(25426, 40347, 38134);
+
+DELETE FROM `gossip_menu_option` WHERE `MenuID`=25426;
+INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `VerifiedBuild`) VALUES
+('25426','0','40','Select a timeline.','0','1','1','38134'),
+('25426','1','40','Select a different timeline.','0','1','1','38134'),
+('25426','2','0','I want to go back to the present, Chromie.','0','1','1','38134');
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index aff58ca046..10c5f87201 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -50,6 +50,7 @@
#include "ScriptMgr.h"
#include "Spell.h"
#include "SpellPackets.h"
+#include "SharedDefines.h"
#include "WhoListStorage.h"
#include "WhoPackets.h"
#include "World.h"
@@ -1179,3 +1180,22 @@ void WorldSession::HandleRequestLatestSplashScreen(WorldPackets::Misc::RequestLa
splashScreenShowLatest.UISplashScreenID = splashScreen ? splashScreen->ID : 0;
SendPacket(splashScreenShowLatest.Write());
}
+
+void WorldSession::HandleChromieTimeSelectExpansionOpcode(WorldPackets::Misc::ChromieTimeSelectExpansion& selectExpansion)
+{
+ if (selectExpansion.Expansion == Cataclysm)
+ _player->CastSpell(_player, 325537, true);
+ else if (selectExpansion.Expansion == Outland)
+ _player->CastSpell(_player, 325400, true);
+ else if (selectExpansion.Expansion == Northrend)
+ _player->CastSpell(_player, 325042, true);
+ else if (selectExpansion.Expansion == Pandaria)
+ _player->CastSpell(_player, 325530, true);
+ else if (selectExpansion.Expansion == Draenor)
+ _player->CastSpell(_player, 325534, true);
+ else if (selectExpansion.Expansion == Legion)
+ _player->CastSpell(_player, 325539, true);
+
+ WorldPackets::Misc::ChromieTimeSelectExpansionSuccess Expansion;
+ SendPacket(Expansion.Write());
+}
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 06f1613427..9486b1c202 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -7848,4 +7848,14 @@ enum WorldState : uint32
WS_GUILD_WEEKLY_RESET_TIME = 20050, // Next guild week reset time
};
+enum ChromieTime
+{
+ Cataclysm = 5,
+ Outland = 6,
+ Northrend = 7,
+ Pandaria = 8,
+ Draenor = 9,
+ Legion = 10
+};
+
#endif
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index efb9da38cc..28ca3d2f18 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -773,3 +773,21 @@ WorldPacket const* WorldPackets::Misc::DisplayToast::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Misc::ChromieTimeOpenNpc::Write()
+{
+ _worldPacket << ObjectGUID;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Misc::ChromieTimeSelectExpansionSuccess::Write()
+{
+ return &_worldPacket;
+}
+
+void WorldPackets::Misc::ChromieTimeSelectExpansion::Read()
+{
+ _worldPacket >> ObjectGUID;
+ _worldPacket >> Expansion;
+}
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index 5bf83f3597..78dbc8d889 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -988,6 +988,35 @@ namespace WorldPackets
::Gender Gender = GENDER_NONE;
uint32 CurrencyID = 0;
};
+
+ class ChromieTimeSelectExpansion final : public ClientPacket
+ {
+ public:
+ ChromieTimeSelectExpansion(WorldPacket && packet) : ClientPacket(CMSG_CHROMIE_TIME_SELECT_EXPANSION, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid ObjectGUID;
+ uint32 Expansion = 0;
+ };
+
+ class ChromieTimeOpenNpc final : public ServerPacket
+ {
+ public:
+ ChromieTimeOpenNpc() : ServerPacket(SMSG_CHROMIE_TIME_OPEN_NPC, 11) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid ObjectGUID;
+ };
+
+ class ChromieTimeSelectExpansionSuccess final : public ServerPacket
+ {
+ public:
+ ChromieTimeSelectExpansionSuccess() : ServerPacket(SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS) { }
+
+ WorldPacket const* Write() override;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 5f932030f3..eaded8f12d 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -315,7 +315,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CHECK_CHARACTER_NAME_AVAILABILITY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCheckCharacterNameAvailability);
DEFINE_HANDLER(CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CHOICE_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePlayerChoiceResponse);
- DEFINE_HANDLER(CMSG_CHROMIE_TIME_SELECT_EXPANSION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CHROMIE_TIME_SELECT_EXPANSION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChromieTimeSelectExpansionOpcode);
DEFINE_HANDLER(CMSG_CLAIM_WEEKLY_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLEAR_NEW_APPEARANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearRaidMarker);
@@ -1149,8 +1149,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_ABANDON_NPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT,STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_WARGAME_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHROMIE_TIME_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHROMIE_TIME_OPEN_NPC, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLAIM_RAF_REWARD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 96debb5151..81e2207fd8 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -521,6 +521,7 @@ namespace WorldPackets
class CloseInteraction;
class ConversationLineStarted;
class RequestLatestSplashScreen;
+ class ChromieTimeSelectExpansion;
}
namespace Movement
@@ -1735,6 +1736,7 @@ class TC_GAME_API WorldSession
void HandleRequestCategoryCooldowns(WorldPackets::Spells::RequestCategoryCooldowns& requestCategoryCooldowns);
void HandleCloseInteraction(WorldPackets::Misc::CloseInteraction& closeInteraction);
void HandleConversationLineStarted(WorldPackets::Misc::ConversationLineStarted& conversationLineStarted);
+ void HandleChromieTimeSelectExpansionOpcode(WorldPackets::Misc::ChromieTimeSelectExpansion& selectExpansion);
// Adventure Journal
void HandleAdventureJournalOpenQuest(WorldPackets::AdventureJournal::AdventureJournalOpenQuest& openQuest);
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index e4c5af9010..e4b25ea997 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -39,6 +39,7 @@
#include "SpellMgr.h"
#include "TemporarySummon.h"
#include "Vehicle.h"
+#include "MiscPackets.h"
/*########
# npc_air_force_bots
@@ -2350,6 +2351,56 @@ private:
TaskScheduler _scheduler;
};
+enum Chromie
+{
+ GOSSIP_MENU_SELECT_CHROMIE_TIME = 25426
+};
+
+struct npc_chromie_167032 : public ScriptedAI
+{
+ npc_chromie_167032(Creature* creature) : ScriptedAI(creature) { }
+
+ bool OnGossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ AddGossipItemFor(player, GOSSIP_MENU_SELECT_CHROMIE_TIME, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ AddGossipItemFor(player, GOSSIP_MENU_SELECT_CHROMIE_TIME, GOSSIP_OPTION_1 + 1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ AddGossipItemFor(player, GOSSIP_MENU_SELECT_CHROMIE_TIME, GOSSIP_OPTION_1 + 2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ SendGossipMenuFor(player, GOSSIP_MENU_SELECT_CHROMIE_TIME, me->GetGUID());
+
+ return true;
+ }
+
+ void SendChromieTimeMenu(Player* player)
+ {
+ WorldPackets::Misc::ChromieTimeOpenNpc worldpark;
+ worldpark.ObjectGUID = me->GetGUID();
+ player->GetSession()->SendPacket(worldpark.Write());
+ }
+
+ bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ SendChromieTimeMenu(player);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ break;
+ }
+ return true;
+ }
+
+
+};
+
void AddSC_npcs_special()
{
new npc_air_force_bots();
@@ -2374,4 +2425,5 @@ void AddSC_npcs_special()
new npc_argent_squire_gruntling();
new npc_bountiful_table();
RegisterCreatureAI(npc_gen_void_zone);
+ RegisterCreatureAI(npc_chromie_167032);
}
--
2.35.2.windows.1