diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-10-17 23:11:46 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-10-17 23:11:46 +0200 |
| commit | 133334a902b705dae6f7e92bb1009b84cf1c51d2 (patch) | |
| tree | 5a48c30a00441d36c285b78da396b5549eabbb87 /src/server/game/Entities/Object | |
| parent | af76b41ace2917ece0aa3f97e4f46e095a7c815f (diff) | |
Core/Loot: Implemented personal loot and tag sharing for non-boss loot
Diffstat (limited to 'src/server/game/Entities/Object')
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: |
