aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2017-01-29 00:00:43 +0100
committerjoschiwald <joschiwald.trinity@gmail.com>2017-01-29 00:00:43 +0100
commit6ab3877c91c9440b81cf1c7c66a1275ee04ea26a (patch)
tree9930d19512eef247d1c0a23284caa446ceef21c8 /src/server/game/Server
parent5818dd364ca6a8b0cb068710291adf26b571aa23 (diff)
Core/Entities: Basic AreaTrigger System (#18035)
* Implemented AreaTrigger Templates * Implemented AreaTrigger Splines * Implemented SPELL_AURA_AREA_TRIGGER * and many more
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/AllPackets.h1
-rw-r--r--src/server/game/Server/Packets/AreaTriggerPackets.cpp97
-rw-r--r--src/server/game/Server/Packets/AreaTriggerPackets.h107
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h22
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h8
7 files changed, 215 insertions, 33 deletions
diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h
index 034496d027d..732a8c1d081 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 "AchievementPackets.h"
+#include "AreaTriggerPackets.h"
#include "ArtifactPackets.h"
#include "AuctionHousePackets.h"
#include "AuthenticationPackets.h"
diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.cpp b/src/server/game/Server/Packets/AreaTriggerPackets.cpp
new file mode 100644
index 00000000000..446a37534a9
--- /dev/null
+++ b/src/server/game/Server/Packets/AreaTriggerPackets.cpp
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "AreaTriggerPackets.h"
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AreaTrigger::AreaTriggerSplineInfo const& areaTriggerSpline)
+{
+ data << uint32(areaTriggerSpline.TimeToTarget);
+ data << uint32(areaTriggerSpline.ElapsedTimeForMovement);
+
+ data.WriteBits(areaTriggerSpline.Points.size(), 16);
+ data.FlushBits();
+
+ for (G3D::Vector3 const& point : areaTriggerSpline.Points)
+ data << point;
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AreaTrigger::AreaTriggerUnkTypeInfo const& areaTriggerUnkType)
+{
+ data.WriteBit(areaTriggerUnkType.AreaTriggerUnkGUID.is_initialized());
+ data.WriteBit(areaTriggerUnkType.Center.is_initialized());
+ data.WriteBit(areaTriggerUnkType.UnkBit1);
+ data.WriteBit(areaTriggerUnkType.UnkBit2);
+
+ data << uint32(areaTriggerUnkType.UnkUInt1);
+ data << int32(areaTriggerUnkType.UnkInt1);
+ data << uint32(areaTriggerUnkType.UnkUInt2);
+ data << float(areaTriggerUnkType.Radius);
+ data << float(areaTriggerUnkType.BlendFromRadius);
+ data << float(areaTriggerUnkType.InitialAngel);
+ data << float(areaTriggerUnkType.ZOffset);
+
+ if (areaTriggerUnkType.AreaTriggerUnkGUID)
+ data << *areaTriggerUnkType.AreaTriggerUnkGUID;
+
+ if (areaTriggerUnkType.Center)
+ data << *areaTriggerUnkType.Center;
+
+ return data;
+}
+
+void WorldPackets::AreaTrigger::AreaTrigger::Read()
+{
+ _worldPacket >> AreaTriggerID;
+ Entered = _worldPacket.ReadBit();
+ FromClient = _worldPacket.ReadBit();
+}
+
+WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerDenied::Write()
+{
+ _worldPacket << int32(AreaTriggerID);
+ _worldPacket.WriteBit(Entered);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerRePath::Write()
+{
+ _worldPacket << TriggerGUID;
+ _worldPacket << AreaTriggerSpline;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerReShape::Write()
+{
+ _worldPacket << TriggerGUID;
+
+ _worldPacket.WriteBit(AreaTriggerSpline.is_initialized());
+ _worldPacket.WriteBit(AreaTriggerUnkType.is_initialized());
+ _worldPacket.FlushBits();
+
+ if (AreaTriggerSpline)
+ _worldPacket << *AreaTriggerSpline;
+
+ if (AreaTriggerUnkType)
+ _worldPacket << *AreaTriggerUnkType;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.h b/src/server/game/Server/Packets/AreaTriggerPackets.h
new file mode 100644
index 00000000000..967a8ba0f5f
--- /dev/null
+++ b/src/server/game/Server/Packets/AreaTriggerPackets.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef AreaTriggerPackets_h__
+#define AreaTriggerPackets_h__
+
+#include "Packet.h"
+#include "PacketUtilities.h"
+#include "ObjectGuid.h"
+
+namespace WorldPackets
+{
+ namespace AreaTrigger
+ {
+ struct AreaTriggerSplineInfo
+ {
+ uint32 TimeToTarget = 0;
+ uint32 ElapsedTimeForMovement = 0;
+ std::vector<G3D::Vector3> Points;
+ };
+
+ struct AreaTriggerUnkTypeInfo
+ {
+ Optional<ObjectGuid> AreaTriggerUnkGUID;
+ Optional<G3D::Vector3> Center;
+ bool UnkBit1 = false;
+ bool UnkBit2 = false;
+ uint32 UnkUInt1 = 0;
+ int32 UnkInt1 = 0;
+ uint32 UnkUInt2 = 0;
+ float Radius = 0.0;
+ float BlendFromRadius = 0.0f;
+ float InitialAngel = 0.0f;
+ float ZOffset = 0.0f;
+ };
+
+ class AreaTrigger final : public ClientPacket
+ {
+ public:
+ AreaTrigger(WorldPacket&& packet) : ClientPacket(CMSG_AREA_TRIGGER, std::move(packet)) { }
+
+ void Read() override;
+
+ int32 AreaTriggerID = 0;
+ bool Entered = false;
+ bool FromClient = false;
+ };
+
+ class AreaTriggerDenied final : public ServerPacket
+ {
+ public:
+ AreaTriggerDenied() : ServerPacket(SMSG_AREA_TRIGGER_DENIED, 5) { }
+
+ int32 AreaTriggerID = 0;
+ bool Entered = false;
+
+ WorldPacket const* Write() override;
+ };
+
+ class AreaTriggerNoCorpse final : public ServerPacket
+ {
+ public:
+ AreaTriggerNoCorpse() : ServerPacket(SMSG_AREA_TRIGGER_NO_CORPSE, 0) { }
+
+ WorldPacket const* Write() override { return &_worldPacket; }
+ };
+
+ class AreaTriggerRePath final : public ServerPacket
+ {
+ public:
+ AreaTriggerRePath() : ServerPacket(SMSG_AREA_TRIGGER_RE_PATH, 50) { }
+
+ WorldPacket const* Write() override;
+
+ AreaTriggerSplineInfo AreaTriggerSpline;
+ ObjectGuid TriggerGUID;
+ };
+
+ class AreaTriggerReShape final : public ServerPacket
+ {
+ public:
+ AreaTriggerReShape() : ServerPacket(SMSG_AREA_TRIGGER_RE_SHAPE, 17) { }
+
+ WorldPacket const* Write() override;
+
+ Optional<AreaTriggerSplineInfo> AreaTriggerSpline;
+ Optional<AreaTriggerUnkTypeInfo> AreaTriggerUnkType;
+ ObjectGuid TriggerGUID;
+ };
+ }
+}
+
+#endif // AreaTriggerPackets_h__
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index 18e46e81356..4880b750319 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -178,13 +178,6 @@ WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write()
return &_worldPacket;
}
-void WorldPackets::Misc::AreaTrigger::Read()
-{
- _worldPacket >> AreaTriggerID;
- Entered = _worldPacket.ReadBit();
- FromClient = _worldPacket.ReadBit();
-}
-
void WorldPackets::Misc::SetDungeonDifficulty::Read()
{
_worldPacket >> DifficultyID;
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index becb5c81661..b9ee1dd0480 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -247,18 +247,6 @@ namespace WorldPackets
Optional<uint32> InstanceGroupSize;
};
- class AreaTrigger final : public ClientPacket
- {
- public:
- AreaTrigger(WorldPacket&& packet) : ClientPacket(CMSG_AREA_TRIGGER, std::move(packet)) { }
-
- void Read() override;
-
- int32 AreaTriggerID = 0;
- bool Entered = false;
- bool FromClient = false;
- };
-
class SetDungeonDifficulty final : public ClientPacket
{
public:
@@ -390,15 +378,7 @@ namespace WorldPackets
uint32 Response = 0;
};
- class AreaTriggerNoCorpse final : public ServerPacket
- {
- public:
- AreaTriggerNoCorpse() : ServerPacket(SMSG_AREA_TRIGGER_NO_CORPSE, 0) { }
-
- WorldPacket const* Write() override { return &_worldPacket; }
- };
-
- class TC_GAME_API Weather final : public ServerPacket
+ class TC_GAME_API Weather final : public ServerPacket
{
public:
Weather();
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 26f151a5d2b..7bc9b2c59d0 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -857,10 +857,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_GUILD_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARCHAEOLOGY_SURVERY_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_NO_CORPSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_APPEARANCE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index dd5c32133c3..1469a1f1d4f 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -81,6 +81,11 @@ namespace WorldPackets
class GuildGetAchievementMembers;
}
+ namespace AreaTrigger
+ {
+ class AreaTrigger;
+ }
+
namespace Artifact
{
class ArtifactAddPower;
@@ -405,7 +410,6 @@ namespace WorldPackets
namespace Misc
{
- class AreaTrigger;
class SetSelection;
class ViolenceLevel;
class TimeSyncResponse;
@@ -1228,7 +1232,7 @@ class TC_GAME_API WorldSession
void HandleDelIgnoreOpcode(WorldPackets::Social::DelIgnore& packet);
void HandleSetContactNotesOpcode(WorldPackets::Social::SetContactNotes& packet);
- void HandleAreaTriggerOpcode(WorldPackets::Misc::AreaTrigger& packet);
+ void HandleAreaTriggerOpcode(WorldPackets::AreaTrigger::AreaTrigger& packet);
void HandleSetFactionAtWar(WorldPackets::Character::SetFactionAtWar& packet);
void HandleSetFactionNotAtWar(WorldPackets::Character::SetFactionNotAtWar& packet);