TrinityCore
ViewerDependentValues.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef ViewerDependentValues_h__
19#define ViewerDependentValues_h__
20
21#include "Conversation.h"
22#include "Creature.h"
23#include "GameObject.h"
24#include "Map.h"
25#include "ObjectMgr.h"
26#include "Player.h"
27#include "SpellInfo.h"
28#include "SpellMgr.h"
29#include "TemporarySummon.h"
30#include "World.h"
31#include "WorldSession.h"
32
33namespace UF
34{
35template<typename Tag>
37{
38};
39
40template<>
42{
43public:
45
46 static value_type GetValue(UF::ObjectData const* objectData, Object const* object, Player const* receiver)
47 {
48 value_type entryId = objectData->EntryID;
49
50 if (Unit const* unit = object->ToUnit())
51 if (TempSummon const* summon = unit->ToTempSummon())
52 if (summon->GetSummonerGUID() == receiver->GetGUID() && summon->GetCreatureIdVisibleToSummoner())
53 entryId = *summon->GetCreatureIdVisibleToSummoner();
54
55 return entryId;
56 }
57};
58
59template<>
61{
62public:
64
65 static value_type GetValue(UF::ObjectData const* objectData, Object const* object, Player const* receiver)
66 {
67 value_type dynamicFlags = objectData->DynamicFlags;
68 if (Unit const* unit = object->ToUnit())
69 {
70 if (Creature const* creature = object->ToCreature())
71 {
72 if (dynamicFlags & UNIT_DYNFLAG_TAPPED && creature->isTappedBy(receiver))
73 dynamicFlags &= ~UNIT_DYNFLAG_TAPPED;
74
75 if (dynamicFlags & UNIT_DYNFLAG_LOOTABLE && !receiver->isAllowedToLoot(creature))
76 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
77
78 if (dynamicFlags & UNIT_DYNFLAG_CAN_SKIN && creature->IsSkinnedBy(receiver))
79 dynamicFlags &= ~UNIT_DYNFLAG_CAN_SKIN;
80 }
81
82 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
83 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
84 if (!unit->HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, receiver->GetGUID()))
85 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
86 }
87 else if (GameObject const* gameObject = object->ToGameObject())
88 {
89 uint16 dynFlags = 0;
90 uint16 pathProgress = 0xFFFF;
91 switch (gameObject->GetGoType())
92 {
94 if (gameObject->ActivateToQuest(receiver))
95 dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
96 break;
98 if (gameObject->ActivateToQuest(receiver))
100 else if (receiver->IsGameMaster())
101 dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
102 break;
104 if (gameObject->ActivateToQuest(receiver))
105 {
106 dynFlags |= GO_DYNFLAG_LO_HIGHLIGHT;
107 if (gameObject->GetGoStateFor(receiver->GetGUID()) != GO_STATE_ACTIVE)
108 dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
109 }
110 else if (receiver->IsGameMaster())
111 dynFlags |= GO_DYNFLAG_LO_ACTIVATE;
112 break;
114 if (gameObject->ActivateToQuest(receiver))
116 break;
119 {
120 dynFlags = dynamicFlags & 0xFFFF;
121 pathProgress = dynamicFlags >> 16;
122 break;
123 }
125 if (!gameObject->CanInteractWithCapturePoint(receiver))
126 dynFlags |= GO_DYNFLAG_LO_NO_INTERACT;
127 else
128 dynFlags &= ~GO_DYNFLAG_LO_NO_INTERACT;
129 break;
131 if (gameObject->ActivateToQuest(receiver))
133 if (gameObject->GetGoStateFor(receiver->GetGUID()) == GO_STATE_ACTIVE)
134 dynFlags |= GO_DYNFLAG_LO_DEPLETED;
135 break;
136 default:
137 break;
138 }
139
140 if (!gameObject->MeetsInteractCondition(receiver))
141 dynFlags |= GO_DYNFLAG_LO_NO_INTERACT;
142
143 dynamicFlags = (uint32(pathProgress) << 16) | uint32(dynFlags);
144 }
145
146 return dynamicFlags;
147 }
148};
149
150template<>
152{
153public:
155
156 static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
157 {
158 value_type displayId = unitData->DisplayID;
159 if (unit->IsCreature())
160 {
161 CreatureTemplate const* cinfo = unit->ToCreature()->GetCreatureTemplate();
162
163 if (TempSummon const* summon = unit->ToTempSummon())
164 {
165 if (summon->GetSummonerGUID() == receiver->GetGUID())
166 {
167 if (summon->GetCreatureIdVisibleToSummoner())
168 cinfo = sObjectMgr->GetCreatureTemplate(*summon->GetCreatureIdVisibleToSummoner());
169
170 if (summon->GetDisplayIdVisibleToSummoner())
171 displayId = *summon->GetDisplayIdVisibleToSummoner();
172 }
173 }
174
175 // this also applies for transform auras
176 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(unit->GetTransformSpell(), unit->GetMap()->GetDifficultyID()))
177 {
178 for (SpellEffectInfo const& spellEffectInfo : transform->GetEffects())
179 {
180 if (spellEffectInfo.IsAura(SPELL_AURA_TRANSFORM))
181 {
182 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(spellEffectInfo.MiscValue))
183 {
184 cinfo = transformInfo;
185 break;
186 }
187 }
188 }
189 }
190
192 if (receiver->IsGameMaster())
193 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
194 }
195
196 return displayId;
197 }
198};
199
200template<>
202{
203public:
205
206 static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
207 {
208 value_type factionTemplate = unitData->FactionTemplate;
209 if (unit->IsControlledByPlayer() && receiver != unit && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && unit->IsInRaidWith(receiver))
210 {
212 FactionTemplateEntry const* ft2 = receiver->GetFactionTemplateEntry();
213 if (ft1 && ft2 && !ft1->IsFriendlyTo(ft2))
214 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
215 factionTemplate = receiver->GetFaction();
216 }
217
218 return factionTemplate;
219 }
220};
221
222template<>
224{
225public:
227
228 static value_type GetValue(UF::UnitData const* unitData, Unit const* /*unit*/, Player const* receiver)
229 {
230 value_type flags = unitData->Flags;
231 // Gamemasters should be always able to interact with units - remove uninteractible flag
232 if (receiver->IsGameMaster())
233 flags &= ~UNIT_FLAG_UNINTERACTIBLE;
234
235 return flags;
236 }
237};
238
239template<>
241{
242public:
244
245 static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
246 {
247 value_type flags = unitData->Flags3;
248 if (flags & UNIT_FLAG3_ALREADY_SKINNED && unit->IsCreature() && !unit->ToCreature()->IsSkinnedBy(receiver))
249 flags &= ~UNIT_FLAG3_ALREADY_SKINNED;
250
251 return flags;
252 }
253};
254
255template<>
257{
258public:
260
261 static value_type GetValue(UF::UnitData const* /*unitData*/, Unit const* unit, Player const* receiver)
262 {
263 // Check per caster aura states to not enable using a spell in client if specified aura is not by target
264 return unit->BuildAuraStateUpdateForTarget(receiver);
265 }
266};
267
268template<>
270{
271public:
273
274 static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
275 {
276 value_type pvpFlags = unitData->PvpFlags;
277 if (unit->IsControlledByPlayer() && receiver != unit && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && unit->IsInRaidWith(receiver))
278 {
280 FactionTemplateEntry const* ft2 = receiver->GetFactionTemplateEntry();
281 if (ft1 && ft2 && !ft1->IsFriendlyTo(ft2))
282 // Allow targeting opposite faction in party when enabled in config
283 pvpFlags &= UNIT_BYTE2_FLAG_SANCTUARY;
284 }
285
286 return pvpFlags;
287 }
288};
289
290template<>
292{
293public:
295
296 static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
297 {
298 value_type interactSpellId = unitData->InteractSpellID;
299 if (unitData->NpcFlags[0] & UNIT_NPC_FLAG_SPELLCLICK && !interactSpellId)
300 {
301 // this field is not set if there are multiple available spellclick spells
302 auto clickBounds = sObjectMgr->GetSpellClickInfoMapBounds(unit->GetEntry());
303 for (auto const& [creatureId, spellClickInfo] : clickBounds)
304 {
305 if (!spellClickInfo.IsFitToRequirements(receiver, unit))
306 continue;
307
308 if (!sConditionMgr->IsObjectMeetingSpellClickConditions(unit->GetEntry(), spellClickInfo.spellId, receiver, unit))
309 continue;
310
311 interactSpellId = spellClickInfo.spellId;
312 break;
313 }
314
315 }
316 return interactSpellId;
317 }
318};
319
320template<>
322{
323public:
325
326 static value_type GetValue(UF::UnitData const* unitData, uint32 i, Unit const* unit, Player const* receiver)
327 {
328 value_type npcFlag = unitData->NpcFlags[i];
329 if (npcFlag)
330 {
331 if ((!unit->IsInteractionAllowedInCombat() && unit->IsInCombat())
332 || (!unit->IsInteractionAllowedWhileHostile() && unit->IsHostileTo(receiver)))
333 npcFlag = 0;
334 else if (Creature const* creature = unit->ToCreature())
335 {
336 if (i == 0)
337 {
338 if (!receiver->CanSeeGossipOn(creature))
340
341 if (!receiver->CanSeeSpellClickOn(creature))
342 npcFlag &= ~UNIT_NPC_FLAG_SPELLCLICK;
343 }
344 }
345 }
346 return npcFlag;
347 }
348};
349
350template<>
352{
353public:
355
356 static value_type GetValue(UF::GameObjectData const* gameObjectData, GameObject const* gameObject, Player const* receiver)
357 {
359 if (gameObject->GetGoType() == GAMEOBJECT_TYPE_CHEST)
360 if (gameObject->GetGOInfo()->chest.usegrouplootrules && !gameObject->IsLootAllowedFor(receiver))
362
363 return flags;
364 }
365};
366
367template<>
369{
370public:
372
373 static value_type GetValue(UF::GameObjectData const* /*gameObjectData*/, GameObject const* gameObject, Player const* receiver)
374 {
375 return gameObject->GetGoStateFor(receiver->GetGUID());
376 }
377};
378
379template<>
381{
382public:
384
385 static value_type GetValue(UF::ConversationData const* /*conversationData*/, Conversation const* conversation, Player const* receiver)
386 {
387 LocaleConstant locale = receiver->GetSession()->GetSessionDbLocaleIndex();
388 return conversation->GetLastLineEndTime(locale).count();
389 }
390};
391
392template<>
394{
395public:
397
398 static value_type GetValue(UF::ConversationLine const* conversationLineData, Conversation const* conversation, Player const* receiver)
399 {
400 value_type startTime = conversationLineData->StartTime;
401 LocaleConstant locale = receiver->GetSession()->GetSessionDbLocaleIndex();
402
403 if (Milliseconds const* localizedStartTime = conversation->GetLineStartTime(locale, conversationLineData->ConversationLineID))
404 startTime = localizedStartTime->count();
405
406 return startTime;
407 }
408};
409}
410
411#endif // ViewerDependentValues_h__
LocaleConstant
Definition: Common.h:48
#define sConditionMgr
Definition: ConditionMgr.h:365
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition: CreatureData.h:341
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
uint16 flags
Definition: DisableMgr.cpp:49
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
#define sObjectMgr
Definition: ObjectMgr.h:1946
@ GAMEOBJECT_TYPE_CAPTURE_POINT
@ GAMEOBJECT_TYPE_TRANSPORT
@ GAMEOBJECT_TYPE_GENERIC
@ GAMEOBJECT_TYPE_CHEST
@ GAMEOBJECT_TYPE_QUESTGIVER
@ GAMEOBJECT_TYPE_GOOBER
@ GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT
@ GAMEOBJECT_TYPE_GATHERING_NODE
@ UNIT_DYNFLAG_TAPPED
@ UNIT_DYNFLAG_LOOTABLE
@ UNIT_DYNFLAG_TRACK_UNIT
@ UNIT_DYNFLAG_CAN_SKIN
@ GO_DYNFLAG_LO_ACTIVATE
@ GO_DYNFLAG_LO_HIGHLIGHT
@ GO_DYNFLAG_LO_SPARKLE
@ GO_DYNFLAG_LO_NO_INTERACT
@ GO_DYNFLAG_LO_DEPLETED
@ GO_FLAG_NOT_SELECTABLE
@ GO_FLAG_LOCKED
@ GO_STATE_ACTIVE
@ SPELL_AURA_MOD_STALKED
@ SPELL_AURA_TRANSFORM
#define sSpellMgr
Definition: SpellMgr.h:849
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:298
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:321
@ UNIT_FLAG3_ALREADY_SKINNED
Definition: UnitDefines.h:263
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition: UnitDefines.h:96
Milliseconds const * GetLineStartTime(LocaleConstant locale, int32 lineId) const
Milliseconds GetLastLineEndTime(LocaleConstant locale) const
bool IsSkinnedBy(Player const *player) const
Definition: Creature.cpp:1409
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:250
GOState GetGoStateFor(ObjectGuid const &viewer) const
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:202
GameobjectTypes GetGoType() const
Definition: GameObject.h:279
bool IsLootAllowedFor(Player const *player) const
Difficulty GetDifficultyID() const
Definition: Map.h:324
Definition: Object.h:150
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static Unit * ToUnit(Object *o)
Definition: Object.h:225
static GameObject * ToGameObject(Object *o)
Definition: Object.h:231
uint32 GetEntry() const
Definition: Object.h:161
bool IsCreature() const
Definition: Object.h:218
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
bool isAllowedToLoot(Creature const *creature) const
Definition: Player.cpp:18565
WorldSession * GetSession() const
Definition: Player.h:2101
bool IsGameMaster() const
Definition: Player.h:1178
bool CanSeeGossipOn(Creature const *creature) const
Definition: Player.cpp:27233
bool CanSeeSpellClickOn(Creature const *creature) const
Definition: Player.cpp:27266
UF::ConversationData::LastLineEndTimeTag::value_type value_type
static value_type GetValue(UF::ConversationData const *, Conversation const *conversation, Player const *receiver)
UF::ConversationLine::StartTimeTag::value_type value_type
static value_type GetValue(UF::ConversationLine const *conversationLineData, Conversation const *conversation, Player const *receiver)
static value_type GetValue(UF::GameObjectData const *gameObjectData, GameObject const *gameObject, Player const *receiver)
static value_type GetValue(UF::GameObjectData const *, GameObject const *gameObject, Player const *receiver)
static value_type GetValue(UF::ObjectData const *objectData, Object const *object, Player const *receiver)
UF::ObjectData::DynamicFlagsTag::value_type value_type
static value_type GetValue(UF::ObjectData const *objectData, Object const *object, Player const *receiver)
static value_type GetValue(UF::UnitData const *, Unit const *unit, Player const *receiver)
static value_type GetValue(UF::UnitData const *unitData, Unit const *unit, Player const *receiver)
static value_type GetValue(UF::UnitData const *unitData, Unit const *unit, Player const *receiver)
UF::UnitData::FactionTemplateTag::value_type value_type
static value_type GetValue(UF::UnitData const *unitData, Unit const *unit, Player const *receiver)
static value_type GetValue(UF::UnitData const *unitData, Unit const *, Player const *receiver)
UF::UnitData::InteractSpellIDTag::value_type value_type
static value_type GetValue(UF::UnitData const *unitData, Unit const *unit, Player const *receiver)
static value_type GetValue(UF::UnitData const *unitData, uint32 i, Unit const *unit, Player const *receiver)
static value_type GetValue(UF::UnitData const *unitData, Unit const *unit, Player const *receiver)
Definition: Unit.h:627
bool IsInteractionAllowedInCombat() const
Definition: Unit.h:1052
uint32 GetTransformSpell() const
Definition: Unit.h:1574
uint32 BuildAuraStateUpdateForTarget(Unit const *target) const
Definition: Unit.cpp:5950
TempSummon * ToTempSummon()
Definition: Unit.h:1756
uint32 GetFaction() const override
Definition: Unit.h:858
bool IsInRaidWith(Unit const *unit) const
Definition: Unit.cpp:11546
bool IsInteractionAllowedWhileHostile() const
Definition: Unit.h:1049
bool IsControlledByPlayer() const
Definition: Unit.h:1193
bool IsInCombat() const
Definition: Unit.h:1043
Map * GetMap() const
Definition: Object.h:624
bool IsHostileTo(WorldObject const *target) const
Definition: Object.cpp:2860
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Object.cpp:2679
LocaleConstant GetSessionDbLocaleIndex() const
#define sWorld
Definition: World.h:931
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: World.h:111
ObjectData const objectData[]
ObjectData const gameObjectData[]
Definition: Object.h:109
uint32 CreatureDisplayID
Definition: CreatureData.h:432
CreatureModel const * GetFirstVisibleModel() const
Definition: Creature.cpp:152
bool IsFriendlyTo(FactionTemplateEntry const *entry) const
struct GameObjectTemplate::@213::@218 chest
UpdateField< int32, 96, 114 > InteractSpellID
Definition: UpdateFields.h:378
UpdateFieldArray< uint32, 2, 127, 128 > NpcFlags
Definition: UpdateFields.h:392
UpdateField< int32, 0, 5 > DisplayID
Definition: UpdateFields.h:266
UpdateField< uint32, 32, 46 > Flags3
Definition: UpdateFields.h:309
UpdateField< uint8, 64, 83 > PvpFlags
Definition: UpdateFields.h:347
UpdateField< uint32, 32, 44 > Flags
Definition: UpdateFields.h:306
UpdateField< int32, 32, 43 > FactionTemplate
Definition: UpdateFields.h:304