aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-10-17 23:11:46 +0200
committerShauren <shauren.trinity@gmail.com>2022-10-17 23:11:46 +0200
commit133334a902b705dae6f7e92bb1009b84cf1c51d2 (patch)
tree5a48c30a00441d36c285b78da396b5549eabbb87 /src/server/game/Entities/Object
parentaf76b41ace2917ece0aa3f97e4f46e095a7c815f (diff)
Core/Loot: Implemented personal loot and tag sharing for non-boss loot
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp4
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h1
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h21
3 files changed, 22 insertions, 4 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index b12c585a788..c9f7d991d67 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -1006,7 +1006,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
}
data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
data << uint32(Flags2);
- data << uint32(Flags3);
+ data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver));
for (uint32 i = 0; i < 2; ++i)
{
@@ -1397,7 +1397,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[45])
{
- data << uint32(Flags3);
+ data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
}
if (changesMask[46])
{
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index b19fdebafb0..41f47ffa22f 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -303,6 +303,7 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<194>
struct FlagsTag : ViewerDependentValueTag<uint32> {};
UpdateField<uint32, 32, 44> Flags2;
UpdateField<uint32, 32, 45> Flags3;
+ struct Flags3Tag : ViewerDependentValueTag<uint32> {};
UpdateField<uint32, 32, 46> AuraState;
struct AuraStateTag : ViewerDependentValueTag<uint32> {};
UpdateField<uint32, 32, 47> RangedAttackRoundBaseTime;
diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
index 028fdd91a26..3ddef2b2db8 100644
--- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
+++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
@@ -67,8 +67,6 @@ public:
value_type dynamicFlags = objectData->DynamicFlags;
if (Unit const* unit = object->ToUnit())
{
- dynamicFlags &= ~UNIT_DYNFLAG_TAPPED;
-
if (Creature const* creature = object->ToCreature())
{
if (creature->hasLootRecipient() && !creature->isTappedBy(receiver))
@@ -76,6 +74,9 @@ public:
if (!receiver->isAllowedToLoot(creature))
dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
+
+ if (dynamicFlags & UNIT_DYNFLAG_CAN_SKIN && creature->IsSkinnedBy(receiver))
+ dynamicFlags &= ~UNIT_DYNFLAG_CAN_SKIN;
}
// unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
@@ -218,6 +219,22 @@ public:
};
template<>
+class ViewerDependentValue<UF::UnitData::Flags3Tag>
+{
+public:
+ using value_type = UF::UnitData::Flags3Tag::value_type;
+
+ static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
+ {
+ value_type flags = unitData->Flags3;
+ if (flags & UNIT_FLAG3_ALREADY_SKINNED && unit->IsCreature() && !unit->ToCreature()->IsSkinnedBy(receiver))
+ flags &= ~UNIT_FLAG3_ALREADY_SKINNED;
+
+ return flags;
+ }
+};
+
+template<>
class ViewerDependentValue<UF::UnitData::AuraStateTag>
{
public: