diff options
author | ForesterDev <11771800+ForesterDev@users.noreply.github.com> | 2020-02-08 23:37:34 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-08 20:37:34 +0100 |
commit | 58313fc33092236b4eedbbfb25e10ab42bec6b0e (patch) | |
tree | 4af2ab726c2b87c5ff9a7a0b96ce5cdbf70741b0 /src/server | |
parent | f87a4543ad886eb119a02f65ba4423fd4f208ec6 (diff) |
Core/PacketIO: update cinematic packets to new system. Implement CMSG_OPENING_CINEMATIC and CMSG_COMPLETE_MOVIE (#24135)
* Server/PacketIO: Enable SMSG_TRIGGER_CINEMATIC & SMSG_TRIGGER_MOVIE.
* Update SMSG_TRIGGER_CINEMATIC & SMSG_TRIGGER_MOVIE to new Format.
Signed-off-by: AriDEV <aridev666@gmail.com>
# Conflicts:
# src/server/game/Entities/Player/Player.cpp
# src/server/game/Server/Packets/MiscPackets.cpp
# src/server/game/Server/Packets/MiscPackets.h
# src/server/game/Server/Protocol/Opcodes.cpp
* Core/Scripts: Add server-side script support for movie completion (#18308)
# Conflicts:
# src/server/game/Entities/Player/Player.h
# src/server/game/Handlers/MiscHandler.cpp
# src/server/game/Scripting/ScriptMgr.h
# src/server/game/Server/Packets/MiscPackets.h
# src/server/game/Server/Protocol/Opcodes.cpp
# src/server/game/Server/WorldSession.h
* Core/PacketIO: CMSG_COMPLETE_CINEMATIC, CMSG_NEXT_CINEMATIC_CAMERA and enabled some opcodes
# Conflicts:
# src/server/game/Server/Protocol/Opcodes.cpp
# src/server/game/Server/WorldSession.h
* Core/Protocol: Implemented CMSG_OPENING_CINEMATIC
# Conflicts:
# src/server/game/Handlers/GuildHandler.cpp
# src/server/game/Server/Protocol/Opcodes.cpp
# src/server/game/Server/WorldSession.h
* fix build
Co-authored-by: Krudor <erikstrandberg93@hotmail.com>
Co-authored-by: MitchesD <majklprofik@seznam.cz>
Co-authored-by: Kaelima <kaelima@live.se>
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 7 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.h | 4 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AllPackets.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 52 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 13 |
11 files changed, 132 insertions, 14 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bd9137d5588..b56d9bcd121 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -236,6 +236,8 @@ Player::Player(WorldSession* session): Unit(true) m_cinematic = 0; + m_movie = 0; + PlayerTalkClass = new PlayerMenu(GetSession()); m_currentBuybackSlot = BUYBACK_SLOT_START; @@ -6395,18 +6397,20 @@ void Player::SendDirectMessage(WorldPacket const* data) const void Player::SendCinematicStart(uint32 CinematicSequenceId) const { - WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4); - data << uint32(CinematicSequenceId); - SendDirectMessage(&data); + WorldPackets::Misc::TriggerCinematic packet; + packet.CinematicID = CinematicSequenceId; + SendDirectMessage(packet.Write()); + if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId)) _cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera); } -void Player::SendMovieStart(uint32 MovieId) const +void Player::SendMovieStart(uint32 movieId) { - WorldPacket data(SMSG_TRIGGER_MOVIE, 4); - data << uint32(MovieId); - SendDirectMessage(&data); + SetMovie(movieId); + WorldPackets::Misc::TriggerMovie packet; + packet.MovieID = movieId; + SendDirectMessage(packet.Write()); } void Player::CheckAreaExploreAndOutdoor() diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index bcb0dfdc198..da31e503e59 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1507,6 +1507,9 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint8 getCinematic() const { return m_cinematic; } void setCinematic(uint8 cine) { m_cinematic = cine; } + uint32 GetMovie() const { return m_movie; } + void SetMovie(uint32 movie) { m_movie = movie; } + ActionButton* addActionButton(uint8 button, uint32 action, uint8 type); void removeActionButton(uint8 button); ActionButton const* GetActionButton(uint8 button); @@ -2033,7 +2036,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool IsPetNeedBeTemporaryUnsummoned() const; void SendCinematicStart(uint32 CinematicSequenceId) const; - void SendMovieStart(uint32 MovieId) const; + void SendMovieStart(uint32 movieId); uint32 DoRandomRoll(uint32 minimum, uint32 maximum); @@ -2346,6 +2349,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint8 m_cinematic; + uint32 m_movie; + TradeData* m_trade; bool m_DailyQuestChanged; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b4a488d887f..dd444b1c501 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2191,3 +2191,18 @@ void WorldSession::SendBarberShopResult(BarberShopResult result) data << uint32(result); SendPacket(&data); } + +void WorldSession::HandleOpeningCinematic(WorldPackets::Misc::OpeningCinematic& /*packet*/) +{ + // Only players that has not yet gained any experience can use this + if (_player->GetUInt32Value(PLAYER_XP)) + return; + + if (ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(_player->GetClass())) + { + if (classEntry->CinematicSequence) + _player->SendCinematicStart(classEntry->CinematicSequence); + else if (ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(_player->GetRace())) + _player->SendCinematicStart(raceEntry->CinematicSequence); + } +} diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 12fc66216a2..38e0ea8a19f 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -868,13 +868,13 @@ void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recvData) GetPlayer()->addActionButton(button, ACTION_BUTTON_ACTION(packetData), ACTION_BUTTON_TYPE(packetData)); } -void WorldSession::HandleCompleteCinematic(WorldPacket& /*recvData*/) +void WorldSession::HandleCompleteCinematic(WorldPackets::Misc::CompleteCinematic& /*packet*/) { // If player has sight bound to visual waypoint NPC we should remove it GetPlayer()->GetCinematicMgr()->EndCinematic(); } -void WorldSession::HandleNextCinematicCamera(WorldPacket& /*recvData*/) +void WorldSession::HandleNextCinematicCamera(WorldPackets::Misc::NextCinematicCamera& /*packet*/) { // Sent by client when cinematic actually begun. So we begin the server side process GetPlayer()->GetCinematicMgr()->BeginCinematic(); @@ -938,6 +938,16 @@ void WorldSession::HandleMoveRootAck(WorldPacket& recvData) */ } +void WorldSession::HandleCompleteMovie(WorldPackets::Misc::CompleteMovie& /*packet*/) +{ + uint32 movie = _player->GetMovie(); + if (!movie) + return; + + _player->SetMovie(0); + sScriptMgr->OnMovieComplete(_player, movie); +} + void WorldSession::HandleSetActionBarToggles(WorldPacket& recvData) { uint8 actionBar; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 18d1f459104..185be99ae00 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1965,6 +1965,11 @@ void ScriptMgr::OnQuestObjectiveProgress(Player* player, Quest const* quest, uin FOREACH_SCRIPT(PlayerScript)->OnQuestObjectiveProgress(player, quest, objectiveIndex, progress); } +void ScriptMgr::OnMovieComplete(Player* player, uint32 movieId) +{ + FOREACH_SCRIPT(PlayerScript)->OnMovieComplete(player, movieId); +} + // Account void ScriptMgr::OnAccountLogin(uint32 accountId) { diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index d540c821cea..8f5199b860c 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -710,6 +710,9 @@ class TC_GAME_API PlayerScript : public ScriptObject // Called after a player's quest status has been changed virtual void OnQuestStatusChange(Player* /*player*/, uint32 /*questId*/) { } + // Called when a player completes a movie + virtual void OnMovieComplete(Player* /*player*/, uint32 /*movieId*/) { } + // Called when a player presses release when he died virtual void OnPlayerRepop(Player* /*player*/) { } }; @@ -1021,6 +1024,7 @@ class TC_GAME_API ScriptMgr void OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea); void OnQuestObjectiveProgress(Player* player, Quest const* quest, uint32 objectiveIndex, uint16 progress); void OnQuestStatusChange(Player* player, uint32 questId); + void OnMovieComplete(Player* player, uint32 movieId); void OnPlayerRepop(Player* player); public: /* AccountScript */ diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index d78edbbf670..afcf072b91d 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -19,6 +19,7 @@ #define AllPackets_h__ #include "NPCPackets.h" +#include "MiscPackets.h" #include "QueryPackets.h" #include "QuestPackets.h" #include "SpellPackets.h" diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index db7d62304a2..efd9bc1f44e 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -57,6 +57,19 @@ WorldPacket const* WorldPackets::Misc::LoginSetTimeSpeed::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Misc::TriggerMovie::Write() +{ + _worldPacket << uint32(MovieID); + + return &_worldPacket; +} +WorldPacket const* WorldPackets::Misc::TriggerCinematic::Write() +{ + _worldPacket << uint32(CinematicID); + + return &_worldPacket; +} + WorldPackets::Misc::Weather::Weather() : ServerPacket(SMSG_WEATHER, 4 + 4 + 1) { } WorldPackets::Misc::Weather::Weather(WeatherState weatherID, float intensity /*= 0.0f*/, bool abrupt /*= false*/) diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 4fdb9d05554..0ae667a8fa2 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -87,6 +87,26 @@ namespace WorldPackets int32 GameTimeHolidayOffset = 0; }; + class TriggerCinematic final : public ServerPacket + { + public: + TriggerCinematic() : ServerPacket(SMSG_TRIGGER_CINEMATIC, 4) { } + + WorldPacket const* Write() override; + + uint32 CinematicID = 0; + }; + + class TriggerMovie final : public ServerPacket + { + public: + TriggerMovie() : ServerPacket(SMSG_TRIGGER_MOVIE, 4) { } + + WorldPacket const* Write() override; + + uint32 MovieID = 0; + }; + class TC_GAME_API Weather final : public ServerPacket { public: @@ -136,6 +156,38 @@ namespace WorldPackets uint32 SoundKitID = 0; }; + class CompleteCinematic final : public ClientPacket + { + public: + CompleteCinematic(WorldPacket&& packet) : ClientPacket(CMSG_COMPLETE_CINEMATIC, std::move(packet)) { } + + void Read() override { } + }; + + class NextCinematicCamera final : public ClientPacket + { + public: + NextCinematicCamera(WorldPacket&& packet) : ClientPacket(CMSG_NEXT_CINEMATIC_CAMERA, std::move(packet)) { } + + void Read() override { } + }; + + class CompleteMovie final : public ClientPacket + { + public: + CompleteMovie(WorldPacket&& packet) : ClientPacket(CMSG_COMPLETE_MOVIE, std::move(packet)) { } + + void Read() override { } + }; + + class OpeningCinematic final : public ClientPacket + { + public: + OpeningCinematic(WorldPacket&& packet) : ClientPacket(CMSG_OPENING_CINEMATIC, std::move(packet)) { } + + void Read() override { } + }; + class OverrideLight final : public ServerPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 755e1720506..fa8b1ecfbde 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -377,7 +377,7 @@ void OpcodeTable::Initialize() /*0x0F6*/ DEFINE_HANDLER(CMSG_MOVE_HOVER_ACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveHoverAck ); /*0x0F7*/ DEFINE_SERVER_OPCODE_HANDLER(MSG_MOVE_HOVER, STATUS_NEVER); /*0x0F8*/ DEFINE_HANDLER(CMSG_TRIGGER_CINEMATIC_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - /*0x0F9*/ DEFINE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + /*0x0F9*/ DEFINE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); /*0x0FA*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER); /*0x0FB*/ DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera ); /*0x0FC*/ DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCompleteCinematic ); @@ -1253,7 +1253,7 @@ void OpcodeTable::Initialize() /*0x462*/ DEFINE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); /*0x463*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, STATUS_NEVER); /*0x464*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER); - /*0x465*/ DEFINE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + /*0x465*/ DEFINE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCompleteMovie ); /*0x466*/ DEFINE_HANDLER(CMSG_SET_GLYPH_SLOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x467*/ DEFINE_HANDLER(CMSG_SET_GLYPH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x468*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 2fec036002f..66b1a9b99b5 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -83,6 +83,13 @@ namespace WorldPackets class Hello; class TrainerBuySpell; } + namespace Misc + { + class CompleteCinematic; + class CompleteMovie; + class NextCinematicCamera; + class OpeningCinematic; + } namespace Query { class QueryCreature; @@ -484,6 +491,7 @@ class TC_GAME_API WorldSession void HandleAlterAppearance(WorldPacket& recvData); void HandleCharCustomize(WorldPacket& recvData); void HandleCharCustomizeCallback(std::shared_ptr<CharacterCustomizeInfo> customizeInfo, PreparedQueryResult result); + void HandleOpeningCinematic(WorldPackets::Misc::OpeningCinematic& packet); void SendCharCreate(ResponseCodes result); void SendCharDelete(ResponseCodes result); @@ -804,8 +812,9 @@ class TC_GAME_API WorldSession void HandleGetChannelMemberCount(WorldPacket& recvPacket); void HandleSetChannelWatch(WorldPacket& recvPacket); - void HandleCompleteCinematic(WorldPacket& recvPacket); - void HandleNextCinematicCamera(WorldPacket& recvPacket); + void HandleCompleteCinematic(WorldPackets::Misc::CompleteCinematic& packet); + void HandleNextCinematicCamera(WorldPackets::Misc::NextCinematicCamera& packet); + void HandleCompleteMovie(WorldPackets::Misc::CompleteMovie& packet); void HandlePageTextQueryOpcode(WorldPacket& recvPacket); |