aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2018-10-04 18:50:21 +0200
committerShauren <shauren.trinity@gmail.com>2018-11-05 00:00:34 +0100
commit0a779bd791fb63b2fc1663206279c7eaa9c02c6f (patch)
treecf13cec2eaab909646f278242981dd51349fddfd /src/server/game/Entities
parent7512ffb0587eccd8fbb2a2841900d572056dbae3 (diff)
Core/PacketIO: Updated packet structures to 8.0.1
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp19
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp3
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h12
-rw-r--r--src/server/game/Entities/Conversation/Conversation.cpp7
-rw-r--r--src/server/game/Entities/Conversation/Conversation.h9
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp8
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp11
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h49
-rw-r--r--src/server/game/Entities/Item/Item.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.cpp161
-rw-r--r--src/server/game/Entities/Object/Object.h31
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp1
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h56
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.h23
-rw-r--r--src/server/game/Entities/Player/Player.cpp91
-rw-r--r--src/server/game/Entities/Player/Player.h20
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp80
-rw-r--r--src/server/game/Entities/Unit/Unit.h11
22 files changed, 357 insertions, 247 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index b03bdab76ce..4e4e70e1b0a 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -46,7 +46,8 @@ AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr),
m_objectType |= TYPEMASK_AREATRIGGER;
m_objectTypeId = TYPEID_AREATRIGGER;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_AREATRIGGER;
+ m_updateFlag.Stationary = true;
+ m_updateFlag.AreaTrigger = true;
m_valuesCount = AREATRIGGER_END;
_dynamicValuesCount = AREATRIGGER_DYNAMIC_END;
@@ -142,7 +143,7 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn
{
AreaTriggerCircularMovementInfo cmi = GetMiscTemplate()->CircularMovementInfo;
if (target && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED))
- cmi.TargetGUID = target->GetGUID();
+ cmi.PathTarget = target->GetGUID();
else
cmi.Center = pos;
@@ -637,12 +638,12 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> splinePoints, uint32 tim
{
if (_reachedDestination)
{
- WorldPackets::AreaTrigger::AreaTriggerReShape reshape;
+ WorldPackets::AreaTrigger::AreaTriggerRePath reshape;
reshape.TriggerGUID = GetGUID();
SendMessageToSet(reshape.Write(), true);
}
- WorldPackets::AreaTrigger::AreaTriggerReShape reshape;
+ WorldPackets::AreaTrigger::AreaTriggerRePath reshape;
reshape.TriggerGUID = GetGUID();
reshape.AreaTriggerSpline = boost::in_place();
reshape.AreaTriggerSpline->ElapsedTimeForMovement = GetElapsedTimeForMovement();
@@ -664,7 +665,7 @@ bool AreaTrigger::HasSplines() const
void AreaTrigger::InitCircularMovement(AreaTriggerCircularMovementInfo const& cmi, uint32 timeToTarget)
{
// Circular movement requires either a center position or an attached unit
- ASSERT(cmi.Center.is_initialized() || cmi.TargetGUID.is_initialized());
+ ASSERT(cmi.Center.is_initialized() || cmi.PathTarget.is_initialized());
// should be sent in object create packets only
m_uint32Values[AREATRIGGER_TIME_TO_TARGET] = timeToTarget;
@@ -676,7 +677,7 @@ void AreaTrigger::InitCircularMovement(AreaTriggerCircularMovementInfo const& cm
if (IsInWorld())
{
- WorldPackets::AreaTrigger::AreaTriggerReShape reshape;
+ WorldPackets::AreaTrigger::AreaTriggerRePath reshape;
reshape.TriggerGUID = GetGUID();
reshape.AreaTriggerCircularMovement = _circularMovementInfo;
@@ -691,11 +692,11 @@ bool AreaTrigger::HasCircularMovement() const
Position const* AreaTrigger::GetCircularMovementCenterPosition() const
{
- if (_circularMovementInfo.is_initialized())
+ if (!_circularMovementInfo.is_initialized())
return nullptr;
- if (_circularMovementInfo->TargetGUID.is_initialized())
- if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *_circularMovementInfo->TargetGUID))
+ if (_circularMovementInfo->PathTarget.is_initialized())
+ if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *_circularMovementInfo->PathTarget))
return center;
if (_circularMovementInfo->Center.is_initialized())
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
index 633988b17b0..431c4cc7d57 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
@@ -96,6 +96,9 @@ AreaTriggerMiscTemplate::AreaTriggerMiscTemplate()
MorphCurveId = 0;
FacingCurveId = 0;
+ AnimId = 0;
+ AnimKitId = 0;
+
DecalPropertiesId = 0;
TimeToTarget = 0;
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
index 35be0f40f7f..2371c65cf09 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
@@ -36,10 +36,11 @@ enum AreaTriggerFlags
AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN = 0x00010, // NYI
AREATRIGGER_FLAG_UNK1 = 0x00020,
AREATRIGGER_FLAG_HAS_TARGET_ROLL_PITCH_YAW = 0x00040, // NYI
- AREATRIGGER_FLAG_UNK2 = 0x00080,
+ AREATRIGGER_FLAG_HAS_ANIM_ID = 0x00080,
AREATRIGGER_FLAG_UNK3 = 0x00100,
- AREATRIGGER_FLAG_UNK4 = 0x00200,
- AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400
+ AREATRIGGER_FLAG_HAS_ANIM_KIT_ID = 0x00200,
+ AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400,
+ AREATRIGGER_FLAG_UNK5 = 0x00800,
};
enum AreaTriggerTypes
@@ -96,7 +97,7 @@ struct AreaTriggerScaleInfo
struct AreaTriggerCircularMovementInfo
{
- Optional<ObjectGuid> TargetGUID;
+ Optional<ObjectGuid> PathTarget;
Optional<TaggedPosition<Position::XYZ>> Center;
bool CounterClockwise = false;
bool CanLoop = false;
@@ -190,6 +191,9 @@ public:
uint32 MorphCurveId;
uint32 FacingCurveId;
+ int32 AnimId;
+ int32 AnimKitId;
+
uint32 DecalPropertiesId;
uint32 TimeToTarget;
diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp
index 13339f3169f..0445f8ff6bc 100644
--- a/src/server/game/Entities/Conversation/Conversation.cpp
+++ b/src/server/game/Entities/Conversation/Conversation.cpp
@@ -30,7 +30,8 @@ Conversation::Conversation() : WorldObject(false), _duration(0)
m_objectType |= TYPEMASK_CONVERSATION;
m_objectTypeId = TYPEID_CONVERSATION;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
+ m_updateFlag.Stationary = true;
+ m_updateFlag.Conversation = true;
m_valuesCount = CONVERSATION_END;
_dynamicValuesCount = CONVERSATION_DYNAMIC_END;
@@ -123,13 +124,15 @@ bool Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry,
SetUInt32Value(CONVERSATION_LAST_LINE_END_TIME, conversationTemplate->LastLineEndTime);
_duration = conversationTemplate->LastLineEndTime;
+ _textureKitId = conversationTemplate->TextureKitId;
for (uint16 actorIndex = 0; actorIndex < conversationTemplate->Actors.size(); ++actorIndex)
{
if (ConversationActorTemplate const* actor = conversationTemplate->Actors[actorIndex])
{
ConversationDynamicFieldActor actorField;
- actorField.ActorTemplate = *actor;
+ actorField.ActorTemplate.CreatureId = actor->CreatureId;
+ actorField.ActorTemplate.CreatureModelId = actor->CreatureModelId;
actorField.Type = ConversationDynamicFieldActor::ActorType::CreatureActor;
SetDynamicStructuredValue(CONVERSATION_DYNAMIC_FIELD_ACTORS, actorIndex, &actorField);
}
diff --git a/src/server/game/Entities/Conversation/Conversation.h b/src/server/game/Entities/Conversation/Conversation.h
index 860264b1de8..ddc44ddfea9 100644
--- a/src/server/game/Entities/Conversation/Conversation.h
+++ b/src/server/game/Entities/Conversation/Conversation.h
@@ -47,8 +47,11 @@ struct ConversationDynamicFieldActor
union
{
ObjectGuid ActorGuid;
-
- ConversationActorTemplate ActorTemplate;
+ struct
+ {
+ uint32 CreatureId;
+ uint32 CreatureModelId;
+ } ActorTemplate;
struct
{
@@ -75,6 +78,7 @@ class TC_GAME_API Conversation : public WorldObject, public GridObject<Conversat
void Update(uint32 diff) override;
void Remove();
int32 GetDuration() const { return _duration; }
+ uint32 GetTextureKitId() const { return _textureKitId; }
static Conversation* CreateConversation(uint32 conversationEntry, Unit* creator, Position const& pos, GuidUnorderedSet&& participants, SpellInfo const* spellInfo = nullptr);
bool Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry, Map* map, Unit* creator, Position const& pos, GuidUnorderedSet&& participants, SpellInfo const* spellInfo = nullptr);
@@ -95,6 +99,7 @@ class TC_GAME_API Conversation : public WorldObject, public GridObject<Conversat
Position _stationaryPosition;
ObjectGuid _creatorGuid;
uint32 _duration;
+ uint32 _textureKitId;
GuidUnorderedSet _participants;
};
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index a62b2ecbbc1..a2956b61cb3 100644
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -33,7 +33,7 @@ Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES), m_type(type
m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
+ m_updateFlag.Stationary = true;
m_valuesCount = CORPSE_END;
_dynamicValuesCount = CORPSE_DYNAMIC_END;
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 9d4724417fe..b6d6e44a3fe 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -430,6 +430,8 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/,
SetUInt32Value(OBJECT_DYNAMIC_FLAGS, dynamicFlags);
+ SetUInt32Value(UNIT_FIELD_STATE_ANIM_ID, sAnimationDataStore.GetNumRows());
+
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
SetBaseAttackTime(BASE_ATTACK, cInfo->BaseAttackTime);
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 58c77eb63b6..89b553d0792 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -286,6 +286,7 @@ void PlayerMenu::SendPointOfInterest(uint32 id) const
}
WorldPackets::NPC::GossipPOI packet;
+ packet.ID = pointOfInterest->ID;
packet.Name = pointOfInterest->Name;
LocaleConstant localeConstant = _session->GetSessionDbLocaleIndex();
@@ -438,6 +439,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
packet.InformUnit = _session->GetPlayer()->GetDivider();
packet.QuestID = quest->GetQuestId();
packet.PortraitGiver = quest->GetQuestGiverPortrait();
+ packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
packet.AutoLaunched = autoLaunched;
packet.DisplayPopup = displayPopup;
@@ -512,6 +514,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.QuestID = quest->GetQuestId();
packet.Info.QuestType = quest->GetQuestType();
packet.Info.QuestLevel = quest->GetQuestLevel();
+ packet.Info.QuestScalingFactionGroup = quest->GetQuestScalingFactionGroup();
packet.Info.QuestMaxScalingLevel = quest->GetQuestMaxScalingLevel();
packet.Info.QuestPackageID = quest->GetQuestPackageID();
packet.Info.QuestMinLevel = quest->GetMinLevel();
@@ -543,12 +546,14 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.StartItem = quest->GetSrcItemId();
packet.Info.Flags = quest->GetFlags();
packet.Info.FlagsEx = quest->GetFlagsEx();
+ packet.Info.FlagsEx2 = quest->GetFlagsEx2();
packet.Info.RewardTitle = quest->GetRewTitle();
packet.Info.RewardArenaPoints = quest->GetRewArenaPoints();
packet.Info.RewardSkillLineID = quest->GetRewardSkillId();
packet.Info.RewardNumSkillUps = quest->GetRewardSkillPoints();
packet.Info.RewardFactionFlags = quest->GetRewardReputationMask();
packet.Info.PortraitGiver = quest->GetQuestGiverPortrait();
+ packet.Info.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
packet.Info.PortraitTurnIn = quest->GetQuestTurnInPortrait();
for (uint8 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
@@ -585,7 +590,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
packet.Info.POIPriority = quest->GetPOIPriority();
packet.Info.AllowableRaces = quest->GetAllowableRaces();
- packet.Info.QuestRewardID = quest->GetRewardId();
+ packet.Info.TreasurePickerID = quest->GetTreasurePickerId();
packet.Info.Expansion = quest->GetExpansion();
for (QuestObjective const& questObjective : quest->GetObjectives())
@@ -666,6 +671,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
packet.PortraitGiver = quest->GetQuestGiverPortrait();
+ packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
packet.QuestPackageID = quest->GetQuestPackageID();
_session->SendPacket(packet.Write());
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index ed5e3dc043b..8ee595cb179 100644
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -38,7 +38,7 @@ DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject),
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
- m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
+ m_updateFlag.Stationary = true;
m_valuesCount = DYNAMICOBJECT_END;
_dynamicValuesCount = DYNAMICOBJECT_DYNAMIC_END;
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 89b59a11ab2..435ccc5c9a9 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -61,7 +61,8 @@ GameObject::GameObject() : WorldObject(false), MapObject(),
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
- m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION);
+ m_updateFlag.Stationary = true;
+ m_updateFlag.Rotation = true;
m_valuesCount = GAMEOBJECT_END;
_dynamicValuesCount = GAMEOBJECT_DYNAMIC_END;
@@ -238,7 +239,7 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
else
{
guid = ObjectGuid::Create<HighGuid::Transport>(map->GenerateLowGuid<HighGuid::Transport>());
- m_updateFlag |= UPDATEFLAG_TRANSPORT;
+ m_updateFlag.ServerTime = true;
}
Object::_Create(guid);
@@ -271,7 +272,7 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
if (m_goTemplateAddon->WorldEffectID)
{
- m_updateFlag |= UPDATEFLAG_GAMEOBJECT;
+ m_updateFlag.GameObject = true;
SetWorldEffectID(m_goTemplateAddon->WorldEffectID);
}
}
@@ -292,6 +293,8 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
SetGoState(goState);
SetGoArtKit(artKit);
+ SetUInt32Value(GAMEOBJECT_STATE_ANIM_ID, sAnimationDataStore.GetNumRows());
+
switch (goInfo->type)
{
case GAMEOBJECT_TYPE_FISHINGHOLE:
@@ -376,7 +379,7 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
if (gameObjectAddon && gameObjectAddon->WorldEffectID)
{
- m_updateFlag |= UPDATEFLAG_GAMEOBJECT;
+ m_updateFlag.GameObject = true;
SetWorldEffectID(gameObjectAddon->WorldEffectID);
}
diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h
index c6411c24f0a..2bf4a423590 100644
--- a/src/server/game/Entities/GameObject/GameObjectData.h
+++ b/src/server/game/Entities/GameObject/GameObjectData.h
@@ -104,7 +104,7 @@ struct GameObjectTemplate
uint32 usegrouplootrules; // 15 use group loot rules, enum { false, true, }; Default: false
uint32 floatingTooltip; // 16 floatingTooltip, enum { false, true, }; Default: false
uint32 conditionID1; // 17 conditionID1, References: PlayerCondition, NoValue = 0
- int32 xpLevel; // 18 xpLevel, int, Min value: -1, Max value: 123, Default value: 0
+ uint32 XPLevelRange; // 18 XP Level Range, References: ContentTuning, NoValue = 0
uint32 xpDifficulty; // 19 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp
uint32 lootLevel; // 20 lootLevel, int, Min value: 0, Max value: 123, Default value: 0
uint32 GroupXP; // 21 Group XP, enum { false, true, }; Default: false
@@ -119,6 +119,7 @@ struct GameObjectTemplate
uint32 chestPersonalLoot; // 30 chest Personal Loot, References: Treasure, NoValue = 0
uint32 turnpersonallootsecurityoff; // 31 turn personal loot security off, enum { false, true, }; Default: false
uint32 ChestProperties; // 32 Chest Properties, References: ChestProperties, NoValue = 0
+ uint32 chestPushLoot; // 33 chest Push Loot, References: Treasure, NoValue = 0
} chest;
// 4 GAMEOBJECT_TYPE_BINDER
struct
@@ -331,6 +332,7 @@ struct GameObjectTemplate
{
uint32 creatureID; // 0 creatureID, References: Creature, NoValue = 0
uint32 charges; // 1 charges, int, Min value: 0, Max value: 65535, Default value: 1
+ uint32 Preferonlyifinlineofsight; // 2 Prefer only if in line of sight (expensive), enum { false, true, }; Default: false
} guardPost;
// 22 GAMEOBJECT_TYPE_SPELLCASTER
struct
@@ -502,7 +504,10 @@ struct GameObjectTemplate
uint32 startOpen; // 1 startOpen, enum { false, true, }; Default: false
uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
uint32 BlocksPathsDown; // 3 Blocks Paths Down, enum { false, true, }; Default: false
- uint32 PathBlockerBump; // 4 Path Blocker Bump (ft), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ int32 PathBlockerBump; // 4 Path Blocker Bump (ft), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ uint32 GiganticAOI; // 5 Gigantic AOI, enum { false, true, }; Default: false
+ uint32 InfiniteAOI; // 6 Infinite AOI, enum { false, true, }; Default: false
+ uint32 DoorisOpaque; // 7 Door is Opaque (Disable portal on close), enum { false, true, }; Default: false
} trapdoor;
// 36 GAMEOBJECT_TYPE_NEW_FLAG
struct
@@ -580,7 +585,7 @@ struct GameObjectTemplate
struct
{
int32 SpawnMap; // 0 Spawn Map, References: Map, NoValue = -1
- uint32 AreaNameSet; // 1 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ int32 AreaNameSet; // 1 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
uint32 DoodadSetA; // 2 Doodad Set A, int, Min value: 0, Max value: 2147483647, Default value: 0
uint32 DoodadSetB; // 3 Doodad Set B, int, Min value: 0, Max value: 2147483647, Default value: 0
} phaseableMO;
@@ -615,7 +620,7 @@ struct GameObjectTemplate
// 48 GAMEOBJECT_TYPE_UI_LINK
struct
{
- uint32 UILinkType; // 0 UI Link Type, enum { Adventure Journal, Obliterum Forge, }; Default: Adventure Journal
+ uint32 UILinkType; // 0 UI Link Type, enum { Adventure Journal, Obliterum Forge, Scrapping Machine, }; Default: Adventure Journal
uint32 allowMounted; // 1 allowMounted, enum { false, true, }; Default: false
uint32 GiganticAOI; // 2 Gigantic AOI, enum { false, true, }; Default: false
uint32 spellFocusType; // 3 spellFocusType, References: SpellFocusObject, NoValue = 0
@@ -640,7 +645,7 @@ struct GameObjectTemplate
uint32 openTextID; // 9 openTextID, References: BroadcastText, NoValue = 0
uint32 floatingTooltip; // 10 floatingTooltip, enum { false, true, }; Default: false
uint32 conditionID1; // 11 conditionID1, References: PlayerCondition, NoValue = 0
- uint32 xpLevel; // 12 xpLevel, int, Min value: -1, Max value: 123, Default value: 0
+ uint32 XPLevelRange; // 12 XP Level Range, References: ContentTuning, NoValue = 0
uint32 xpDifficulty; // 13 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp
uint32 spell; // 14 spell, References: Spell, NoValue = 0
uint32 GiganticAOI; // 15 Gigantic AOI, enum { false, true, }; Default: false
@@ -649,13 +654,45 @@ struct GameObjectTemplate
uint32 MaxNumberofLoots; // 18 Max Number of Loots, int, Min value: 1, Max value: 40, Default value: 10
uint32 logloot; // 19 log loot, enum { false, true, }; Default: false
uint32 linkedTrap; // 20 linkedTrap, References: GameObjects, NoValue = 0
+ uint32 PlayOpenAnimationonOpening; // 21 Play Open Animation on Opening, enum { false, true, }; Default: false
} gatheringNode;
// 51 GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD
struct
{
uint32 chestLoot; // 0 chestLoot, References: Treasure, NoValue = 0
uint32 WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0
+ uint32 open; // 2 open, References: Lock_, NoValue = 0
+ uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
} challengeModeReward;
+ // 52 GAMEOBJECT_TYPE_MULTI
+ struct
+ {
+ uint32 MultiProperties; // 0 Multi Properties, References: MultiProperties, NoValue = 0
+ } multi;
+ // 53 GAMEOBJECT_TYPE_SIEGEABLE_MULTI
+ struct
+ {
+ uint32 MultiProperties; // 0 Multi Properties, References: MultiProperties, NoValue = 0
+ uint32 InitialDamage; // 1 Initial Damage, enum { None, Raw, Ratio, }; Default: None
+ } siegeableMulti;
+ // 54 GAMEOBJECT_TYPE_SIEGEABLE_MO
+ struct
+ {
+ uint32 SiegeableProperties; // 0 Siegeable Properties, References: SiegeableProperties, NoValue = 0
+ uint32 DoodadSetA; // 1 Doodad Set A, int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 DoodadSetB; // 2 Doodad Set B, int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 DoodadSetC; // 3 Doodad Set C, int, Min value: 0, Max value: 2147483647, Default value: 0
+ int32 SpawnMap; // 4 Spawn Map, References: Map, NoValue = -1
+ int32 AreaNameSet; // 5 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
+ } siegeableMO;
+ // 55 GAMEOBJECT_TYPE_PVP_REWARD
+ struct
+ {
+ uint32 chestLoot; // 0 chestLoot, References: Treasure, NoValue = 0
+ uint32 WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0
+ uint32 open; // 2 open, References: Lock_, NoValue = 0
+ uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
+ } pvpReward;
struct
{
uint32 data[MAX_GAMEOBJECT_DATA];
@@ -708,6 +745,8 @@ struct GameObjectTemplate
case GAMEOBJECT_TYPE_NEW_FLAG_DROP: return newflagdrop.open;
case GAMEOBJECT_TYPE_CAPTURE_POINT: return capturePoint.open;
case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.open;
+ case GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD: return challengeModeReward.open;
+ case GAMEOBJECT_TYPE_PVP_REWARD: return pvpReward.open;
default: return 0;
}
}
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index d63d5246d5a..847c3c47c79 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -275,8 +275,6 @@ Item::Item()
m_objectType |= TYPEMASK_ITEM;
m_objectTypeId = TYPEID_ITEM;
- m_updateFlag = 0;
-
m_valuesCount = ITEM_END;
_dynamicValuesCount = ITEM_DYNAMIC_END;
m_slot = 0;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 201f5c1515c..9d8a17ecbd7 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -55,7 +55,7 @@ Object::Object()
{
m_objectTypeId = TYPEID_OBJECT;
m_objectType = TYPEMASK_OBJECT;
- m_updateFlag = UPDATEFLAG_NONE;
+ m_updateFlag.Clear();
m_uint32Values = nullptr;
_dynamicValues = nullptr;
@@ -170,12 +170,19 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
if (!target)
return;
- uint8 updateType = UPDATETYPE_CREATE_OBJECT;
- uint32 flags = m_updateFlag;
+ uint8 updateType = UPDATETYPE_CREATE_OBJECT;
+ uint8 objectType = m_objectTypeId;
+ uint16 objectTypeMask = m_objectType;
+ CreateObjectBits flags = m_updateFlag;
/** lower flag1 **/
if (target == this) // building packet for yourself
- flags |= UPDATEFLAG_SELF;
+ {
+ flags.ThisIsYou = true;
+ flags.ActivePlayer = true;
+ objectType = TYPEID_ACTIVE_PLAYER;
+ objectTypeMask |= TYPEMASK_ACTIVE_PLAYER;
+ }
switch (GetGUID().GetHigh())
{
@@ -208,15 +215,14 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
if (WorldObject const* worldObject = dynamic_cast<WorldObject const*>(this))
{
- if (!(flags & UPDATEFLAG_LIVING))
- if (!worldObject->m_movementInfo.transport.guid.IsEmpty())
- flags |= UPDATEFLAG_TRANSPORT_POSITION;
+ if (!flags.MovementUpdate && !worldObject->m_movementInfo.transport.guid.IsEmpty())
+ flags.MovementTransport = true;
if (worldObject->GetAIAnimKitId() || worldObject->GetMovementAnimKitId() || worldObject->GetMeleeAnimKitId())
- flags |= UPDATEFLAG_ANIMKITS;
+ flags.AnimKit = true;
}
- if (flags & UPDATEFLAG_STATIONARY_POSITION)
+ if (flags.Stationary)
{
// UPDATETYPE_CREATE_OBJECT2 for some gameobject types...
if (isType(TYPEMASK_GAMEOBJECT))
@@ -237,12 +243,13 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
if (Unit const* unit = ToUnit())
if (unit->GetVictim())
- flags |= UPDATEFLAG_HAS_TARGET;
+ flags.CombatVictim = true;
ByteBuffer buf(0x400);
buf << uint8(updateType);
buf << GetGUID();
- buf << uint8(m_objectTypeId);
+ buf << uint8(objectType);
+ buf << uint32(objectTypeMask);
BuildMovementUpdate(&buf, flags);
BuildValuesUpdate(updateType, &buf, target);
@@ -337,25 +344,8 @@ ObjectGuid const& Object::GetGuidValue(uint16 index) const
return *((ObjectGuid*)&(m_uint32Values[index]));
}
-void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
-{
- bool NoBirthAnim = false;
- bool EnablePortals = false;
- bool PlayHoverAnim = false;
- bool HasMovementUpdate = (flags & UPDATEFLAG_LIVING) != 0;
- bool HasMovementTransport = (flags & UPDATEFLAG_TRANSPORT_POSITION) != 0;
- bool Stationary = (flags & UPDATEFLAG_STATIONARY_POSITION) != 0;
- bool CombatVictim = (flags & UPDATEFLAG_HAS_TARGET) != 0;
- bool ServerTime = (flags & UPDATEFLAG_TRANSPORT) != 0;
- bool VehicleCreate = (flags & UPDATEFLAG_VEHICLE) != 0;
- bool AnimKitCreate = (flags & UPDATEFLAG_ANIMKITS) != 0;
- bool Rotation = (flags & UPDATEFLAG_ROTATION) != 0;
- bool HasAreaTrigger = (flags & UPDATEFLAG_AREATRIGGER) != 0;
- bool HasGameObject = (flags & UPDATEFLAG_GAMEOBJECT) != 0;
- bool ThisIsYou = (flags & UPDATEFLAG_SELF) != 0;
- bool SmoothPhasing = false;
- bool SceneObjCreate = false;
- bool PlayerCreateData = GetTypeId() == TYPEID_PLAYER && ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS;
+void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
+{
std::vector<uint32> const* PauseTimes = nullptr;
uint32 PauseTimesCount = 0;
if (GameObject const* go = ToGameObject())
@@ -367,26 +357,27 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
}
}
- data->WriteBit(NoBirthAnim);
- data->WriteBit(EnablePortals);
- data->WriteBit(PlayHoverAnim);
- data->WriteBit(HasMovementUpdate);
- data->WriteBit(HasMovementTransport);
- data->WriteBit(Stationary);
- data->WriteBit(CombatVictim);
- data->WriteBit(ServerTime);
- data->WriteBit(VehicleCreate);
- data->WriteBit(AnimKitCreate);
- data->WriteBit(Rotation);
- data->WriteBit(HasAreaTrigger);
- data->WriteBit(HasGameObject);
- data->WriteBit(SmoothPhasing);
- data->WriteBit(ThisIsYou);
- data->WriteBit(SceneObjCreate);
- data->WriteBit(PlayerCreateData);
+ data->WriteBit(flags.NoBirthAnim);
+ data->WriteBit(flags.EnablePortals);
+ data->WriteBit(flags.PlayHoverAnim);
+ data->WriteBit(flags.MovementUpdate);
+ data->WriteBit(flags.MovementTransport);
+ data->WriteBit(flags.Stationary);
+ data->WriteBit(flags.CombatVictim);
+ data->WriteBit(flags.ServerTime);
+ data->WriteBit(flags.Vehicle);
+ data->WriteBit(flags.AnimKit);
+ data->WriteBit(flags.Rotation);
+ data->WriteBit(flags.AreaTrigger);
+ data->WriteBit(flags.GameObject);
+ data->WriteBit(flags.SmoothPhasing);
+ data->WriteBit(flags.ThisIsYou);
+ data->WriteBit(flags.SceneObject);
+ data->WriteBit(flags.ActivePlayer);
+ data->WriteBit(flags.Conversation);
data->FlushBits();
- if (HasMovementUpdate)
+ if (flags.MovementUpdate)
{
Unit const* unit = ToUnit();
bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
@@ -457,6 +448,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
// *data << uint32(TransportID);
// *data << float(Magnitude);
// data->WriteBits(Type, 2);
+ // data->FlushBits();
//}
if (HasSpline)
@@ -465,7 +457,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint32(PauseTimesCount);
- if (Stationary)
+ if (flags.Stationary)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
*data << float(self->GetStationaryX());
@@ -474,10 +466,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << float(self->GetStationaryO());
}
- if (CombatVictim)
+ if (flags.CombatVictim)
*data << ToUnit()->GetVictim()->GetGUID(); // CombatVictim
- if (ServerTime)
+ if (flags.ServerTime)
{
GameObject const* go = ToGameObject();
/** @TODO Use IsTransport() to also handle type 11 (TRANSPORT)
@@ -491,14 +483,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint32(getMSTime());
}
- if (VehicleCreate)
+ if (flags.Vehicle)
{
Unit const* unit = ToUnit();
*data << uint32(unit->GetVehicleKit()->GetVehicleInfo()->ID); // RecID
*data << float(unit->GetOrientation()); // InitialRawFacing
}
- if (AnimKitCreate)
+ if (flags.AnimKit)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
*data << uint16(self->GetAIAnimKitId()); // AiID
@@ -506,19 +498,19 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint16(self->GetMeleeAnimKitId()); // MeleeID
}
- if (Rotation)
+ if (flags.Rotation)
*data << uint64(ToGameObject()->GetPackedWorldRotation()); // Rotation
if (PauseTimesCount)
data->append(PauseTimes->data(), PauseTimes->size());
- if (HasMovementTransport)
+ if (flags.MovementTransport)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
*data << self->m_movementInfo.transport;
}
- if (HasAreaTrigger)
+ if (flags.AreaTrigger)
{
AreaTrigger const* areaTrigger = ToAreaTrigger();
AreaTriggerMiscTemplate const* areaTriggerMiscTemplate = areaTrigger->GetMiscTemplate();
@@ -539,9 +531,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
bool hasMorphCurveID = areaTriggerMiscTemplate->MorphCurveId != 0;
bool hasFacingCurveID = areaTriggerMiscTemplate->FacingCurveId != 0;
bool hasMoveCurveID = areaTriggerMiscTemplate->MoveCurveId != 0;
- bool hasUnk2 = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_UNK2);
+ bool hasAnimation = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_HAS_ANIM_ID);
bool hasUnk3 = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_UNK3);
- bool hasUnk4 = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_UNK4);
+ bool hasAnimKitID = areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_HAS_ANIM_KIT_ID);
+ bool hasAnimProgress = false;
bool hasAreaTriggerSphere = areaTriggerTemplate->IsSphere();
bool hasAreaTriggerBox = areaTriggerTemplate->IsBox();
bool hasAreaTriggerPolygon = areaTriggerTemplate->IsPolygon();
@@ -560,9 +553,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
data->WriteBit(hasMorphCurveID);
data->WriteBit(hasFacingCurveID);
data->WriteBit(hasMoveCurveID);
- data->WriteBit(hasUnk2);
+ data->WriteBit(hasAnimation);
+ data->WriteBit(hasAnimKitID);
data->WriteBit(hasUnk3);
- data->WriteBit(hasUnk4);
+ data->WriteBit(hasAnimProgress);
data->WriteBit(hasAreaTriggerSphere);
data->WriteBit(hasAreaTriggerBox);
data->WriteBit(hasAreaTriggerPolygon);
@@ -598,10 +592,13 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
if (hasMoveCurveID)
*data << uint32(areaTriggerMiscTemplate->MoveCurveId);
- if (hasUnk2)
- *data << int32(0);
+ if (hasAnimation)
+ *data << int32(areaTriggerMiscTemplate->AnimId);
+
+ if (hasAnimKitID)
+ *data << int32(areaTriggerMiscTemplate->AnimKitId);
- if (hasUnk4)
+ if (hasAnimProgress)
*data << uint32(0);
if (hasAreaTriggerSphere)
@@ -648,7 +645,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << *areaTrigger->GetCircularMovementInfo();
}
- if (HasGameObject)
+ if (flags.GameObject)
{
bool bit8 = false;
uint32 Int1 = 0;
@@ -663,7 +660,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint32(Int1);
}
- //if (SmoothPhasing)
+ //if (flags.SmoothPhasing)
//{
// data->WriteBit(ReplaceActive);
// data->WriteBit(HasReplaceObject);
@@ -672,7 +669,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
// *data << ObjectGuid(ReplaceObject);
//}
- //if (SceneObjCreate)
+ //if (flags.SceneObject)
//{
// data->WriteBit(HasLocalScriptData);
// data->WriteBit(HasPetBattleFullUpdate);
@@ -782,7 +779,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
// }
//}
- if (PlayerCreateData)
+ if (flags.ActivePlayer)
{
bool HasSceneInstanceIDs = false;
bool HasRuneState = ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS;
@@ -809,6 +806,15 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
*data << uint8((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255);
}
}
+
+ if (flags.Conversation)
+ {
+ Conversation const* self = ToConversation();
+ if (data->WriteBit(self->GetTextureKitId() != 0))
+ *data << uint32(self->GetTextureKitId());
+
+ data->FlushBits();
+ }
}
void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const
@@ -842,7 +848,11 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player
if (!target)
return;
- std::size_t blockCount = UpdateMask::GetBlockCount(_dynamicValuesCount);
+ std::size_t valueCount = _dynamicValuesCount;
+ if (target != this && GetTypeId() == TYPEID_PLAYER)
+ valueCount = PLAYER_DYNAMIC_END;
+
+ std::size_t blockCount = UpdateMask::GetBlockCount(valueCount);
uint32* flags = nullptr;
uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags);
@@ -851,7 +861,7 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player
std::size_t maskPos = data->wpos();
data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType));
- for (uint16 index = 0; index < _dynamicValuesCount; ++index)
+ for (uint16 index = 0; index < valueCount; ++index)
{
std::vector<uint32> const& values = _dynamicValues[index];
if (_fieldNotifyFlags & flags[index] ||
@@ -931,6 +941,16 @@ uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
break;
+ case TYPEID_AZERITE_EMPOWERED_ITEM:
+ flags = AzeriteEmpoweredItemUpdateFieldFlags;
+ if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
+ visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
+ break;
+ case TYPEID_AZERITE_ITEM:
+ flags = AzeriteItemUpdateFieldFlags;
+ if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
+ visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
+ break;
case TYPEID_UNIT:
case TYPEID_PLAYER:
{
@@ -972,6 +992,7 @@ uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
flags = ConversationUpdateFieldFlags;
break;
case TYPEID_OBJECT:
+ case TYPEID_ACTIVE_PLAYER:
ABORT();
break;
}
@@ -990,6 +1011,8 @@ uint32 Object::GetDynamicUpdateFieldData(Player const* target, uint32*& flags) c
{
case TYPEID_ITEM:
case TYPEID_CONTAINER:
+ case TYPEID_AZERITE_EMPOWERED_ITEM:
+ case TYPEID_AZERITE_ITEM:
flags = ItemDynamicUpdateFieldFlags;
if (((Item const*)this)->GetOwnerGUID() == target->GetGUID())
visibleFlag |= UF_FLAG_OWNER | UF_FLAG_ITEM_OWNER;
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 2ebea15a58d..79420076f5b 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -54,6 +54,33 @@ struct QuaternionData;
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
+struct CreateObjectBits
+{
+ bool NoBirthAnim : 1;
+ bool EnablePortals : 1;
+ bool PlayHoverAnim : 1;
+ bool MovementUpdate : 1;
+ bool MovementTransport : 1;
+ bool Stationary : 1;
+ bool CombatVictim : 1;
+ bool ServerTime : 1;
+ bool Vehicle : 1;
+ bool AnimKit : 1;
+ bool Rotation : 1;
+ bool AreaTrigger : 1;
+ bool GameObject : 1;
+ bool SmoothPhasing : 1;
+ bool ThisIsYou : 1;
+ bool SceneObject : 1;
+ bool ActivePlayer : 1;
+ bool Conversation : 1;
+
+ void Clear()
+ {
+ memset(this, 0, sizeof(CreateObjectBits));
+ }
+};
+
namespace UpdateMask
{
typedef uint32 BlockType;
@@ -298,14 +325,14 @@ class TC_GAME_API Object
uint32 GetUpdateFieldData(Player const* target, uint32*& flags) const;
uint32 GetDynamicUpdateFieldData(Player const* target, uint32*& flags) const;
- void BuildMovementUpdate(ByteBuffer* data, uint32 flags) const;
+ void BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const;
virtual void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const;
virtual void BuildDynamicValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const;
uint16 m_objectType;
TypeID m_objectTypeId;
- uint32 m_updateFlag;
+ CreateObjectBits m_updateFlag;
union
{
diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp
index d5094aea2b0..f8ee803ed22 100644
--- a/src/server/game/Entities/Object/ObjectGuid.cpp
+++ b/src/server/game/Entities/Object/ObjectGuid.cpp
@@ -87,6 +87,7 @@ namespace
SET_GUID_NAME(CommerceObj);
SET_GUID_NAME(ClientSession);
SET_GUID_NAME(Cast);
+ SET_GUID_NAME(ClientConnection);
#undef SET_GUID_NAME
}
diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h
index 941608f9493..0584c0d7262 100644
--- a/src/server/game/Entities/Object/ObjectGuid.h
+++ b/src/server/game/Entities/Object/ObjectGuid.h
@@ -30,35 +30,41 @@
enum TypeID
{
- TYPEID_OBJECT = 0,
- TYPEID_ITEM = 1,
- TYPEID_CONTAINER = 2,
- TYPEID_UNIT = 3,
- TYPEID_PLAYER = 4,
- TYPEID_GAMEOBJECT = 5,
- TYPEID_DYNAMICOBJECT = 6,
- TYPEID_CORPSE = 7,
- TYPEID_AREATRIGGER = 8,
- TYPEID_SCENEOBJECT = 9,
- TYPEID_CONVERSATION = 10
+ TYPEID_OBJECT = 0,
+ TYPEID_ITEM = 1,
+ TYPEID_CONTAINER = 2,
+ TYPEID_AZERITE_EMPOWERED_ITEM = 3,
+ TYPEID_AZERITE_ITEM = 4,
+ TYPEID_UNIT = 5,
+ TYPEID_PLAYER = 6,
+ TYPEID_ACTIVE_PLAYER = 7,
+ TYPEID_GAMEOBJECT = 8,
+ TYPEID_DYNAMICOBJECT = 9,
+ TYPEID_CORPSE = 10,
+ TYPEID_AREATRIGGER = 11,
+ TYPEID_SCENEOBJECT = 12,
+ TYPEID_CONVERSATION = 13
};
-#define NUM_CLIENT_OBJECT_TYPES 11
+#define NUM_CLIENT_OBJECT_TYPES 14
enum TypeMask
{
- TYPEMASK_OBJECT = 0x0001,
- TYPEMASK_ITEM = 0x0002,
- TYPEMASK_CONTAINER = 0x0004,
- TYPEMASK_UNIT = 0x0008,
- TYPEMASK_PLAYER = 0x0010,
- TYPEMASK_GAMEOBJECT = 0x0020,
- TYPEMASK_DYNAMICOBJECT = 0x0040,
- TYPEMASK_CORPSE = 0x0080,
- TYPEMASK_AREATRIGGER = 0x0100,
- TYPEMASK_SCENEOBJECT = 0x0200,
- TYPEMASK_CONVERSATION = 0x0400,
- TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
+ TYPEMASK_OBJECT = 0x0001,
+ TYPEMASK_ITEM = 0x0002,
+ TYPEMASK_CONTAINER = 0x0004,
+ TYPEMASK_AZERITE_EMPOWERED_ITEM = 0x0008,
+ TYPEMASK_AZERITE_ITEM = 0x0010,
+ TYPEMASK_UNIT = 0x0020,
+ TYPEMASK_PLAYER = 0x0040,
+ TYPEMASK_ACTIVE_PLAYER = 0x0080,
+ TYPEMASK_GAMEOBJECT = 0x0100,
+ TYPEMASK_DYNAMICOBJECT = 0x0200,
+ TYPEMASK_CORPSE = 0x0400,
+ TYPEMASK_AREATRIGGER = 0x0800,
+ TYPEMASK_SCENEOBJECT = 0x1000,
+ TYPEMASK_CONVERSATION = 0x2000,
+ TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
};
enum class HighGuid
@@ -111,6 +117,7 @@ enum class HighGuid
CommerceObj = 45,
ClientSession = 46,
Cast = 47,
+ ClientConnection = 48,
Count,
};
@@ -349,6 +356,7 @@ class TC_GAME_API ObjectGuidGeneratorBase
{
public:
ObjectGuidGeneratorBase(ObjectGuid::LowType start = UI64LIT(1)) : _nextGuid(start) { }
+ virtual ~ObjectGuidGeneratorBase() { }
virtual void Set(uint64 val) { _nextGuid = val; }
virtual ObjectGuid::LowType Generate() = 0;
diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h
index 800948c4281..9d438ed625e 100644
--- a/src/server/game/Entities/Object/Updates/UpdateData.h
+++ b/src/server/game/Entities/Object/Updates/UpdateData.h
@@ -34,29 +34,6 @@ enum OBJECT_UPDATE_TYPE
UPDATETYPE_OUT_OF_RANGE_OBJECTS = 3,
};
-enum OBJECT_UPDATE_FLAGS
-{
- UPDATEFLAG_NONE = 0x0000,
- UPDATEFLAG_SELF = 0x0001,
- UPDATEFLAG_TRANSPORT = 0x0002,
- UPDATEFLAG_HAS_TARGET = 0x0004,
- UPDATEFLAG_LIVING = 0x0008,
- UPDATEFLAG_STATIONARY_POSITION = 0x0010,
- UPDATEFLAG_VEHICLE = 0x0020,
- UPDATEFLAG_TRANSPORT_POSITION = 0x0040,
- UPDATEFLAG_ROTATION = 0x0080,
- UPDATEFLAG_ANIMKITS = 0x0100,
- UPDATEFLAG_AREATRIGGER = 0x0200,
- UPDATEFLAG_GAMEOBJECT = 0x0400,
- //UPDATEFLAG_REPLACE_ACTIVE = 0x0800,
- //UPDATEFLAG_NO_BIRTH_ANIM = 0x1000,
- //UPDATEFLAG_ENABLE_PORTALS = 0x2000,
- //UPDATEFLAG_PLAY_HOVER_ANIM = 0x4000,
- //UPDATEFLAG_IS_SUPPRESSING_GREETINGS = 0x8000
- //UPDATEFLAG_SCENEOBJECT = 0x10000,
- //UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000
-};
-
class UpdateData
{
public:
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 34609ed6698..51db53c9c61 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2419,9 +2419,8 @@ void Player::GiveLevel(uint8 level)
for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
- uint32 const* rowLevels = (getClass() != CLASS_DEATH_KNIGHT) ? DefaultTalentRowLevels : DKTalentRowLevels;
-
- packet.Cp = std::find(rowLevels, rowLevels + MAX_TALENT_TIERS, level) != (rowLevels + MAX_TALENT_TIERS);
+ packet.NumNewTalents = DB2Manager::GetNumTalentsAtLevel(level, Classes(getClass())) - DB2Manager::GetNumTalentsAtLevel(oldLevel, Classes(getClass()));
+ packet.NumNewPvpTalentSlots = sDB2Manager.GetPvpTalentNumSlotsAtLevel(level, Classes(getClass())) - sDB2Manager.GetPvpTalentNumSlotsAtLevel(oldLevel, Classes(getClass()));
GetSession()->SendPacket(packet.Write());
@@ -2505,7 +2504,7 @@ void Player::InitTalentForLevel()
if (level < MIN_SPECIALIZATION_LEVEL)
ResetTalentSpecialization();
- uint32 talentTiers = CalculateTalentsTiers();
+ uint32 talentTiers = DB2Manager::GetNumTalentsAtLevel(level, Classes(getClass()));
if (level < 15)
{
// Remove all talent points
@@ -14570,6 +14569,38 @@ uint32 Player::GetDefaultGossipMenuForSource(WorldObject* source)
/*** QUEST SYSTEM ***/
/*********************************************************/
+int32 Player::GetQuestMinLevel(Quest const* quest) const
+{
+ if (quest->GetQuestLevel() == -1 && quest->GetQuestScalingFactionGroup())
+ {
+ ChrRacesEntry const* race = sChrRacesStore.AssertEntry(getRace());
+ FactionTemplateEntry const* raceFaction = sFactionTemplateStore.LookupEntry(race->FactionID);
+ if (!raceFaction || raceFaction->FactionGroup != quest->GetQuestScalingFactionGroup())
+ return quest->GetQuestMaxScalingLevel();
+ }
+
+ return quest->GetMinLevel();
+}
+
+int32 Player::GetQuestLevel(Quest const* quest) const
+{
+ if (!quest)
+ return 0;
+
+ if (quest->GetQuestLevel() == -1)
+ {
+ int32 minLevel = GetQuestMinLevel(quest);
+ int32 maxLevel = quest->GetQuestMaxScalingLevel();
+ int32 level = getLevel();
+ if (level >= minLevel)
+ return std::min(level, maxLevel);
+
+ return minLevel;
+ }
+
+ return quest->GetQuestLevel();
+}
+
void Player::PrepareQuestMenu(ObjectGuid guid)
{
QuestRelationBounds objectQR;
@@ -14737,7 +14768,7 @@ bool Player::CanSeeStartQuest(Quest const* quest)
SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
{
- return int32(getLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF)) >= quest->GetMinLevel();
+ return int32(getLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF)) >= GetQuestMinLevel(quest);
}
return false;
@@ -15163,7 +15194,7 @@ void Player::IncompleteQuest(uint32 quest_id)
uint32 Player::GetQuestMoneyReward(Quest const* quest) const
{
- return quest->MoneyValue(getLevel()) * sWorld->getRate(RATE_MONEY_QUEST);
+ return quest->MoneyValue(this) * sWorld->getRate(RATE_MONEY_QUEST);
}
uint32 Player::GetQuestXPReward(Quest const* quest)
@@ -15174,7 +15205,7 @@ uint32 Player::GetQuestXPReward(Quest const* quest)
if (rewarded && !quest->IsDFQuest())
return 0;
- uint32 XP = quest->XPValue(getLevel()) * sWorld->getRate(RATE_XP_QUEST);
+ uint32 XP = quest->XPValue(this) * sWorld->getRate(RATE_XP_QUEST);
// handle SPELL_AURA_MOD_XP_QUEST_PCT auras
Unit::AuraEffectList const& ModXPPctAuras = GetAuraEffectsByType(SPELL_AURA_MOD_XP_QUEST_PCT);
@@ -15570,7 +15601,7 @@ bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const
bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg) const
{
- if (getLevel() < qInfo->GetMinLevel())
+ if (getLevel() < GetQuestMinLevel(qInfo))
{
if (msg)
{
@@ -19625,7 +19656,7 @@ void Player::SendRaidInfo()
{
InstanceSave* save = itr->second.save;
- WorldPackets::Instance::InstanceLockInfos lockInfos;
+ WorldPackets::Instance::InstanceLock lockInfos;
lockInfos.InstanceID = save->GetInstanceId();
lockInfos.MapID = save->GetMapId();
@@ -22328,6 +22359,8 @@ void Player::InitDisplayIds()
default:
TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has invalid gender %u", GetName().c_str(), GetGUID().ToString().c_str(), gender);
}
+
+ SetUInt32Value(UNIT_FIELD_STATE_ANIM_ID, sAnimationDataStore.GetNumRows());
}
inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int64 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore)
@@ -23999,19 +24032,15 @@ void Player::LearnDefaultSkill(SkillRaceClassInfoEntry const* rcInfo)
break;
case SKILL_RANGE_RANK:
{
- uint16 rank = 1;
- if (getClass() == CLASS_DEATH_KNIGHT && skillId == SKILL_FIRST_AID)
- rank = 4;
-
SkillTiersEntry const* tier = sObjectMgr->GetSkillTier(rcInfo->SkillTierID);
- uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
+ uint16 maxValue = tier->Value[0];
uint16 skillValue = 1;
if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
skillValue = maxValue;
else if (getClass() == CLASS_DEATH_KNIGHT)
skillValue = std::min(std::max(uint16(1), uint16((getLevel() - 1) * 5)), maxValue);
- SetSkill(skillId, rank, skillValue, maxValue);
+ SetSkill(skillId, 1, skillValue, maxValue);
break;
}
default:
@@ -26496,7 +26525,10 @@ void Player::SendTalentsInfoData()
continue;
}
- groupInfoPkt.PvPTalentIDs.push_back(uint16(pvpTalents[slot]));
+ groupInfoPkt.PvPTalents.emplace_back();
+ WorldPackets::Talent::PvPTalent& pvpTalent = groupInfoPkt.PvPTalents.back();
+ pvpTalent.PvPTalentID = pvpTalents[slot];
+ pvpTalent.Slot = slot;
}
packet.Info.TalentGroups.push_back(groupInfoPkt);
@@ -27517,6 +27549,7 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId)
displayPlayerChoice.Responses.resize(playerChoice->Responses.size());
displayPlayerChoice.CloseChoiceFrame = false;
displayPlayerChoice.HideWarboardHeader = playerChoice->HideWarboardHeader;
+ displayPlayerChoice.KeepOpenAfterChoice = playerChoice->KeepOpenAfterChoice;
for (std::size_t i = 0; i < playerChoice->Responses.size(); ++i)
{
@@ -27524,6 +27557,9 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId)
WorldPackets::Quest::PlayerChoiceResponse& playerChoiceResponse = displayPlayerChoice.Responses[i];
playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId;
playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId;
+ playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags;
+ playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID;
+ playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID;
playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer;
playerChoiceResponse.Header = playerChoiceResponseTemplate.Header;
playerChoiceResponse.Description = playerChoiceResponseTemplate.Description;
@@ -27848,29 +27884,6 @@ void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const
GetSession()->SendPacket(supercededSpells.Write());
}
-uint32 Player::CalculateTalentsTiers() const
-{
- uint32 const* rowLevels;
- switch (getClass())
- {
- case CLASS_DEATH_KNIGHT:
- rowLevels = DKTalentRowLevels;
- break;
- case CLASS_DEMON_HUNTER:
- rowLevels = DHTalentRowLevels;
- break;
- default:
- rowLevels = DefaultTalentRowLevels;
- break;
- }
-
- for (uint32 i = MAX_TALENT_TIERS; i; --i)
- if (getLevel() >= rowLevels[i - 1])
- return i;
-
- return 0;
-}
-
Difficulty Player::GetDifficultyID(MapEntry const* mapEntry) const
{
if (!mapEntry->IsRaid())
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 8f1529db7c5..e3092f0279c 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -399,7 +399,7 @@ enum PlayerFlags
PLAYER_FLAGS_GM = 0x00000008,
PLAYER_FLAGS_GHOST = 0x00000010,
PLAYER_FLAGS_RESTING = 0x00000020,
- PLAYER_FLAGS_UNK6 = 0x00000040,
+ PLAYER_FLAGS_VOICE_CHAT = 0x00000040,
PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
PLAYER_FLAGS_IN_PVP = 0x00000200,
@@ -430,7 +430,8 @@ enum PlayerFlags
enum PlayerFlagsEx
{
PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED = 0x0001,
- PLAYER_FLAGS_EX_MERCENARY_MODE = 0x0002
+ PLAYER_FLAGS_EX_MERCENARY_MODE = 0x0002,
+ PLAYER_FLAGS_EX_ARTIFACT_FORGE_CHEAT = 0x0004
};
enum PlayerLocalFlags
@@ -1009,10 +1010,6 @@ enum TalentLearnResult
TALENT_FAILED_REST_AREA = 8
};
-static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 };
-static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 };
-static uint32 const DHTalentRowLevels[MAX_TALENT_TIERS] = { 99, 100, 102, 104, 106, 108, 110 };
-
struct TC_GAME_API SpecializationInfo
{
SpecializationInfo() : ResetTalentsCost(0), ResetTalentsTime(0), PrimarySpecialization(0), ActiveGroup(0)
@@ -1357,13 +1354,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
/*** QUEST SYSTEM ***/
/*********************************************************/
- int32 GetQuestLevel(Quest const* quest) const
- {
- if (!quest)
- return getLevel();
- return quest->GetQuestLevel() > 0 ? quest->GetQuestLevel() : std::min<int32>(getLevel(), quest->GetQuestMaxScalingLevel());
- }
-
+ int32 GetQuestMinLevel(Quest const* quest) const;
+ int32 GetQuestLevel(Quest const* quest) const;
void PrepareQuestMenu(ObjectGuid guid);
void SendPreparedQuest(WorldObject* source);
bool IsActiveQuest(uint32 quest_id) const;
@@ -1653,7 +1645,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool AddTalent(TalentEntry const* talent, uint8 spec, bool learning);
bool HasTalent(uint32 spell_id, uint8 spec) const;
void RemoveTalent(TalentEntry const* talent);
- uint32 CalculateTalentsTiers() const;
void ResetTalentSpecialization();
TalentLearnResult LearnPvpTalent(uint32 talentID, uint8 slot, int32* spellOnCooldown);
@@ -1993,7 +1984,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void RestoreHealthAfterDuel() { SetHealth(healthBeforeDuel); }
void RestoreManaAfterDuel() { SetPower(POWER_MANA, manaBeforeDuel); }
- uint32 GetPrestigeLevel() const { return 0; }
uint32 GetHonorLevel() const { return GetUInt32Value(PLAYER_FIELD_HONOR_LEVEL); }
void AddHonorXP(uint32 xp);
void SetHonorLevel(uint8 honorLevel);
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 50b1897e2c5..6de4ae21027 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -38,7 +38,9 @@ Transport::Transport() : GameObject(),
_triggeredArrivalEvent(false), _triggeredDepartureEvent(false),
_passengerTeleportItr(_passengers.begin()), _delayedAddModel(false), _delayedTeleport(false)
{
- m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION;
+ m_updateFlag.ServerTime = true;
+ m_updateFlag.Stationary = true;
+ m_updateFlag.Rotation = true;
}
Transport::~Transport()
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6edf0663547..bb6a3e9dc5d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -111,13 +111,13 @@ bool DispelableAura::RollDispel() const
}
DamageInfo::DamageInfo(Unit* attacker, Unit* victim, uint32 damage, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, DamageEffectType damageType, WeaponAttackType attackType)
- : m_attacker(attacker), m_victim(victim), m_damage(damage), m_spellInfo(spellInfo), m_schoolMask(schoolMask), m_damageType(damageType), m_attackType(attackType),
+ : m_attacker(attacker), m_victim(victim), m_damage(damage), m_originalDamage(damage), m_spellInfo(spellInfo), m_schoolMask(schoolMask), m_damageType(damageType), m_attackType(attackType),
m_absorb(0), m_resist(0), m_block(0), m_hitMask(0)
{
}
DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo)
- : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)),
+ : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_originalDamage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)),
m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType), m_absorb(dmgInfo.absorb), m_resist(dmgInfo.resist), m_block(dmgInfo.blocked_amount), m_hitMask(0)
{
switch (dmgInfo.TargetState)
@@ -171,7 +171,7 @@ DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo)
}
DamageInfo::DamageInfo(SpellNonMeleeDamage const& spellNonMeleeDamage, DamageEffectType damageType, WeaponAttackType attackType, uint32 hitMask)
- : m_attacker(spellNonMeleeDamage.attacker), m_victim(spellNonMeleeDamage.target), m_damage(spellNonMeleeDamage.damage),
+ : m_attacker(spellNonMeleeDamage.attacker), m_victim(spellNonMeleeDamage.target), m_damage(spellNonMeleeDamage.damage), m_originalDamage(spellNonMeleeDamage.originalDamage),
m_spellInfo(sSpellMgr->GetSpellInfo(spellNonMeleeDamage.SpellID)), m_schoolMask(SpellSchoolMask(spellNonMeleeDamage.schoolMask)), m_damageType(damageType),
m_attackType(attackType), m_absorb(spellNonMeleeDamage.absorb), m_resist(spellNonMeleeDamage.resist), m_block(spellNonMeleeDamage.blocked), m_hitMask(hitMask)
{
@@ -226,7 +226,7 @@ uint32 DamageInfo::GetHitMask() const
}
HealInfo::HealInfo(Unit* healer, Unit* target, uint32 heal, SpellInfo const* spellInfo, SpellSchoolMask schoolMask)
- : _healer(healer), _target(target), _heal(heal), _effectiveHeal(0), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask), _hitMask(0)
+ : _healer(healer), _target(target), _heal(heal), _originalHeal(heal), _effectiveHeal(0), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask), _hitMask(0)
{
}
@@ -279,8 +279,8 @@ SpellSchoolMask ProcEventInfo::GetSchoolMask() const
}
SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _SpellXSpellVisualID, uint32 _schoolMask, ObjectGuid _castId)
- : target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), SpellXSpellVisualID(_SpellXSpellVisualID), damage(0), schoolMask(_schoolMask),
- absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth())
+ : target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), SpellXSpellVisualID(_SpellXSpellVisualID), damage(0), originalDamage(0),
+ schoolMask(_schoolMask), absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth())
{
}
@@ -297,7 +297,7 @@ Unit::Unit(bool isWorldObject) :
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
- m_updateFlag = UPDATEFLAG_LIVING;
+ m_updateFlag.MovementUpdate = true;
for (uint32 i = 0; i < MAX_ATTACK; ++i)
{
@@ -1181,6 +1181,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
damage = 0;
damageInfo->damage = damage;
+ damageInfo->originalDamage = damage;
DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE, BASE_ATTACK, PROC_HIT_NONE);
CalcAbsorbResist(dmgInfo);
damageInfo->absorb = dmgInfo.GetAbsorb();
@@ -1227,6 +1228,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
damageInfo->damageSchoolMask = GetMeleeDamageSchoolMask();
damageInfo->attackType = attackType;
damageInfo->damage = 0;
+ damageInfo->originalDamage = 0;
damageInfo->cleanDamage = 0;
damageInfo->absorb = 0;
damageInfo->resist = 0;
@@ -1295,17 +1297,20 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
case MELEE_HIT_EVADE:
damageInfo->HitInfo |= HITINFO_MISS | HITINFO_SWINGNOHITSOUND;
damageInfo->TargetState = VICTIMSTATE_EVADES;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->damage = 0;
damageInfo->cleanDamage = 0;
return;
case MELEE_HIT_MISS:
damageInfo->HitInfo |= HITINFO_MISS;
damageInfo->TargetState = VICTIMSTATE_INTACT;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->damage = 0;
damageInfo->cleanDamage = 0;
break;
case MELEE_HIT_NORMAL:
damageInfo->TargetState = VICTIMSTATE_HIT;
+ damageInfo->originalDamage = damageInfo->damage;
break;
case MELEE_HIT_CRIT:
{
@@ -1320,21 +1325,26 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
if (mod != 0)
AddPct(damageInfo->damage, mod);
+
+ damageInfo->originalDamage = damageInfo->damage;
break;
}
case MELEE_HIT_PARRY:
damageInfo->TargetState = VICTIMSTATE_PARRY;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->cleanDamage += damageInfo->damage;
damageInfo->damage = 0;
break;
case MELEE_HIT_DODGE:
damageInfo->TargetState = VICTIMSTATE_DODGE;
+ damageInfo->originalDamage = damageInfo->damage;
damageInfo->cleanDamage += damageInfo->damage;
damageInfo->damage = 0;
break;
case MELEE_HIT_BLOCK:
damageInfo->TargetState = VICTIMSTATE_HIT;
damageInfo->HitInfo |= HITINFO_BLOCK;
+ damageInfo->originalDamage = damageInfo->damage;
// 30% damage blocked, double blocked amount if block is critical
damageInfo->blocked_amount = CalculatePct(damageInfo->damage, damageInfo->target->isBlockCritical() ? damageInfo->target->GetBlockPercent() * 2 : damageInfo->target->GetBlockPercent());
damageInfo->damage -= damageInfo->blocked_amount;
@@ -1344,6 +1354,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
{
damageInfo->HitInfo |= HITINFO_GLANCING;
damageInfo->TargetState = VICTIMSTATE_HIT;
+ damageInfo->originalDamage = damageInfo->damage;
int32 leveldif = int32(victim->getLevel()) - int32(getLevel());
if (leveldif > 3)
leveldif = 3;
@@ -1358,6 +1369,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
damageInfo->TargetState = VICTIMSTATE_HIT;
// 150% normal damage
damageInfo->damage += (damageInfo->damage / 2);
+ damageInfo->originalDamage = damageInfo->damage;
break;
default:
break;
@@ -1372,6 +1384,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
resilienceReduction = damageInfo->damage - resilienceReduction;
damageInfo->damage -= resilienceReduction;
damageInfo->cleanDamage += resilienceReduction;
+ damageInfo->originalDamage -= resilienceReduction;
// Calculate absorb resist
if (int32(damageInfo->damage) > 0)
@@ -1514,7 +1527,6 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
DamageInfo damageInfo(this, victim, damage, spellInfo, spellInfo->GetSchoolMask(), SPELL_DIRECT_DAMAGE, BASE_ATTACK);
victim->CalcAbsorbResist(damageInfo);
damage = damageInfo.GetDamage();
- // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that
victim->DealDamageMods(this, damage, nullptr);
WorldPackets::CombatLog::SpellDamageShield damageShield;
@@ -1522,6 +1534,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
damageShield.Defender = GetGUID();
damageShield.SpellID = spellInfo->Id;
damageShield.TotalDamage = damage;
+ damageShield.OriginalDamage = damageInfo.GetOriginalDamage();
damageShield.OverKill = std::max(int32(damage) - int32(GetHealth()), 0);
damageShield.SchoolMask = spellInfo->SchoolMask;
damageShield.LogAbsorbed = damageInfo.GetAbsorb();
@@ -1881,6 +1894,7 @@ void Unit::CalcAbsorbResist(DamageInfo& damageInfo)
CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false);
log.damage = splitDamage;
+ log.originalDamage = splitDamage;
log.absorb = split_absorb;
SendSpellNonMeleeDamageLog(&log);
@@ -2016,6 +2030,7 @@ void Unit::FakeAttackerStateUpdate(Unit* victim, WeaponAttackType attType /*= BA
damageInfo.damageSchoolMask = GetMeleeDamageSchoolMask();
damageInfo.attackType = attType;
damageInfo.damage = 0;
+ damageInfo.originalDamage = 0;
damageInfo.cleanDamage = 0;
damageInfo.absorb = 0;
damageInfo.resist = 0;
@@ -4985,6 +5000,7 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log)
packet.CastID = log->castId;
packet.SpellID = log->SpellID;
packet.Damage = log->damage;
+ packet.OriginalDamage = log->originalDamage;
if (log->damage > log->preHitHealth)
packet.Overkill = log->damage - log->preHitHealth;
else
@@ -4997,9 +5013,9 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log)
packet.Periodic = log->periodicLog;
packet.Flags = log->HitInfo;
- WorldPackets::Spells::SandboxScalingData sandboxScalingData;
- if (sandboxScalingData.GenerateDataForUnits(log->attacker, log->target))
- packet.SandboxScaling = sandboxScalingData;
+ WorldPackets::Spells::ContentTuningParams contentTuningParams;
+ if (contentTuningParams.GenerateDataForUnits(log->attacker, log->target))
+ packet.ContentTuning = contentTuningParams;
SendCombatLogMessage(&packet);
}
@@ -5025,10 +5041,10 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info)
data.SpellID = aura->GetId();
data.LogData.Initialize(this);
- /// @todo: should send more logs in one packet when multistrike
WorldPackets::CombatLog::SpellPeriodicAuraLog::SpellLogEffect spellLogEffect;
spellLogEffect.Effect = aura->GetAuraType();
spellLogEffect.Amount = info->damage;
+ spellLogEffect.OriginalDamage = info->originalDamage;
spellLogEffect.OverHealOrKill = info->overDamage;
spellLogEffect.SchoolMaskOrPower = aura->GetSpellInfo()->GetSchoolMask();
spellLogEffect.AbsorbedOrAmplitude = info->absorb;
@@ -5036,10 +5052,10 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info)
spellLogEffect.Crit = info->critical;
/// @todo: implement debug info
- WorldPackets::Spells::SandboxScalingData sandboxScalingData;
+ WorldPackets::Spells::ContentTuningParams contentTuningParams;
if (Unit* caster = ObjectAccessor::GetUnit(*this, aura->GetCasterGUID()))
- if (sandboxScalingData.GenerateDataForUnits(caster, this))
- spellLogEffect.SandboxScaling = sandboxScalingData;
+ if (contentTuningParams.GenerateDataForUnits(caster, this))
+ spellLogEffect.ContentTuning = contentTuningParams;
data.Effects.push_back(spellLogEffect);
@@ -5081,6 +5097,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
packet.AttackerGUID = damageInfo->attacker->GetGUID();
packet.VictimGUID = damageInfo->target->GetGUID();
packet.Damage = damageInfo->damage;
+ packet.OriginalDamage = damageInfo->originalDamage;
int32 overkill = damageInfo->damage - damageInfo->target->GetHealth();
packet.OverDamage = (overkill < 0 ? -1 : overkill);
@@ -5096,9 +5113,9 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
packet.LogData.Initialize(damageInfo->attacker);
- WorldPackets::Spells::SandboxScalingData sandboxScalingData;
- if (sandboxScalingData.GenerateDataForUnits(damageInfo->attacker, damageInfo->target))
- packet.SandboxScaling = sandboxScalingData;
+ WorldPackets::Spells::ContentTuningParams contentTuningParams;
+ if (contentTuningParams.GenerateDataForUnits(damageInfo->attacker, damageInfo->target))
+ packet.ContentTuning = contentTuningParams;
SendCombatLogMessage(&packet);
}
@@ -5110,6 +5127,7 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType
dmgInfo.attacker = this;
dmgInfo.target = target;
dmgInfo.damage = Damage - AbsorbDamage - Resist - BlockedAmount;
+ dmgInfo.originalDamage = Damage;
dmgInfo.damageSchoolMask = damageSchoolMask;
dmgInfo.absorb = AbsorbDamage;
dmgInfo.resist = Resist;
@@ -6334,32 +6352,12 @@ void Unit::SendHealSpellLog(HealInfo& healInfo, bool critical /*= false*/)
spellHealLog.TargetGUID = healInfo.GetTarget()->GetGUID();
spellHealLog.CasterGUID = healInfo.GetHealer()->GetGUID();
-
spellHealLog.SpellID = healInfo.GetSpellInfo()->Id;
spellHealLog.Health = healInfo.GetHeal();
+ spellHealLog.OriginalHeal = healInfo.GetOriginalHeal();
spellHealLog.OverHeal = int32(healInfo.GetHeal()) - healInfo.GetEffectiveHeal();
spellHealLog.Absorbed = healInfo.GetAbsorb();
-
spellHealLog.Crit = critical;
-
- /// @todo: 6.x Has to be implemented
- /*
- packet.ReadBit("Multistrike");
-
- var hasCritRollMade = packet.ReadBit("HasCritRollMade");
- var hasCritRollNeeded = packet.ReadBit("HasCritRollNeeded");
- var hasLogData = packet.ReadBit("HasLogData");
-
- if (hasCritRollMade)
- packet.ReadSingle("CritRollMade");
-
- if (hasCritRollNeeded)
- packet.ReadSingle("CritRollNeeded");
-
- if (hasLogData)
- SpellParsers.ReadSpellCastLogData(packet);
- */
-
spellHealLog.LogData.Initialize(healInfo.GetTarget());
SendCombatLogMessage(&spellHealLog);
}
@@ -11665,7 +11663,7 @@ bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading /*= fa
return false;
m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
- m_updateFlag |= UPDATEFLAG_VEHICLE;
+ m_updateFlag.Vehicle = true;
m_unitTypeMask |= UNIT_MASK_VEHICLE;
if (!loading)
@@ -11687,7 +11685,7 @@ void Unit::RemoveVehicleKit(bool onRemoveFromWorld /*= false*/)
m_vehicleKit = NULL;
- m_updateFlag &= ~UPDATEFLAG_VEHICLE;
+ m_updateFlag.Vehicle = false;
m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
RemoveFlag64(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK | UNIT_NPC_FLAG_PLAYER_VEHICLE);
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 94d2fa06c75..77e23462cd8 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -576,6 +576,7 @@ class TC_GAME_API DamageInfo
Unit* const m_attacker;
Unit* const m_victim;
uint32 m_damage;
+ uint32 const m_originalDamage;
SpellInfo const* const m_spellInfo;
SpellSchoolMask const m_schoolMask;
DamageEffectType const m_damageType;
@@ -601,6 +602,7 @@ class TC_GAME_API DamageInfo
DamageEffectType GetDamageType() const { return m_damageType; }
WeaponAttackType GetAttackType() const { return m_attackType; }
uint32 GetDamage() const { return m_damage; }
+ uint32 GetOriginalDamage() const { return m_originalDamage; }
uint32 GetAbsorb() const { return m_absorb; }
uint32 GetResist() const { return m_resist; }
uint32 GetBlock() const { return m_block; }
@@ -614,6 +616,7 @@ class TC_GAME_API HealInfo
Unit* const _healer;
Unit* const _target;
uint32 _heal;
+ uint32 const _originalHeal;
uint32 _effectiveHeal;
uint32 _absorb;
SpellInfo const* const _spellInfo;
@@ -629,6 +632,7 @@ class TC_GAME_API HealInfo
Unit* GetHealer() const { return _healer; }
Unit* GetTarget() const { return _target; }
uint32 GetHeal() const { return _heal; }
+ uint32 GetOriginalHeal() const { return _originalHeal; }
uint32 GetEffectiveHeal() const { return _effectiveHeal; }
uint32 GetAbsorb() const { return _absorb; }
SpellInfo const* GetSpellInfo() const { return _spellInfo; };
@@ -682,6 +686,7 @@ struct CalcDamageInfo
Unit *target; // Target for damage
uint32 damageSchoolMask;
uint32 damage;
+ uint32 originalDamage;
uint32 absorb;
uint32 resist;
uint32 blocked_amount;
@@ -706,6 +711,7 @@ struct TC_GAME_API SpellNonMeleeDamage
uint32 SpellID;
uint32 SpellXSpellVisualID;
uint32 damage;
+ uint32 originalDamage;
uint32 schoolMask;
uint32 absorb;
uint32 resist;
@@ -720,11 +726,12 @@ struct TC_GAME_API SpellNonMeleeDamage
struct SpellPeriodicAuraLogInfo
{
- SpellPeriodicAuraLogInfo(AuraEffect const* _auraEff, uint32 _damage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical)
- : auraEff(_auraEff), damage(_damage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){ }
+ SpellPeriodicAuraLogInfo(AuraEffect const* _auraEff, uint32 _damage, uint32 _originalDamage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical)
+ : auraEff(_auraEff), damage(_damage), originalDamage(_originalDamage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){ }
AuraEffect const* auraEff;
uint32 damage;
+ uint32 originalDamage;
uint32 overDamage; // overkill/overheal
uint32 absorb;
uint32 resist;