diff options
| author | Traesh <Traesh@users.noreply.github.com> | 2017-01-29 00:00:43 +0100 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-01-29 00:00:43 +0100 |
| commit | 6ab3877c91c9440b81cf1c7c66a1275ee04ea26a (patch) | |
| tree | 9930d19512eef247d1c0a23284caa446ceef21c8 /src/server/game/Server | |
| parent | 5818dd364ca6a8b0cb068710291adf26b571aa23 (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.h | 1 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/AreaTriggerPackets.cpp | 97 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/AreaTriggerPackets.h | 107 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 22 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 8 |
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); |
