aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/Player/Player.cpp18
-rw-r--r--src/server/game/Entities/Player/Player.h7
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp15
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp14
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp5
-rw-r--r--src/server/game/Scripting/ScriptMgr.h4
-rw-r--r--src/server/game/Server/Packets/AllPackets.h1
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp13
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h52
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h13
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);