92 "AreaTrigger Client Triggered",
94 "Object Visibility (by ID)",
100 {
"None",
false,
false,
false,
false },
101 {
"Aura",
true,
true,
true,
false },
102 {
"Item Stored",
true,
true,
true,
false },
103 {
"Item Equipped",
true,
false,
false,
false },
104 {
"Zone",
true,
false,
false,
false },
105 {
"Reputation",
true,
true,
false,
false },
106 {
"Team",
true,
false,
false,
false },
107 {
"Skill",
true,
true,
false,
false },
108 {
"Quest Rewarded",
true,
false,
false,
false },
109 {
"Quest Taken",
true,
false,
false,
false },
110 {
"Drunken",
true,
false,
false,
false },
111 {
"WorldState",
true,
true,
false,
false },
112 {
"Active Event",
true,
false,
false,
false },
113 {
"Instance Info",
true,
true,
true,
false },
114 {
"Quest None",
true,
false,
false,
false },
115 {
"Class",
true,
false,
false,
false },
116 {
"Race",
true,
false,
false,
false },
117 {
"Achievement",
true,
false,
false,
false },
118 {
"Title",
true,
false,
false,
false },
119 {
"SpawnMask",
true,
false,
false,
false },
120 {
"Gender",
true,
false,
false,
false },
121 {
"Unit State",
true,
false,
false,
false },
122 {
"Map",
true,
false,
false,
false },
123 {
"Area",
true,
false,
false,
false },
124 {
"CreatureType",
true,
false,
false,
false },
125 {
"Spell Known",
true,
false,
false,
false },
126 {
"Phase",
true,
false,
false,
false },
127 {
"Level",
true,
true,
false,
false },
128 {
"Quest Completed",
true,
false,
false,
false },
129 {
"Near Creature",
true,
true,
true,
false },
130 {
"Near GameObject",
true,
true,
false,
false },
131 {
"Object Entry or Guid",
true,
true,
true,
false },
132 {
"Object TypeMask",
true,
false,
false,
false },
133 {
"Relation",
true,
true,
false,
false },
134 {
"Reaction",
true,
true,
false,
false },
135 {
"Distance",
true,
true,
true,
false },
136 {
"Alive",
false,
false,
false,
false },
137 {
"Health Value",
true,
true,
false,
false },
138 {
"Health Pct",
true,
true,
false,
false },
139 {
"Realm Achievement",
true,
false,
false,
false },
140 {
"In Water",
false,
false,
false,
false },
141 {
"Terrain Swap",
true,
false,
false,
false },
142 {
"Sit/stand state",
true,
true,
false,
false },
143 {
"Daily Quest Completed",
true,
false,
false,
false },
144 {
"Charmed",
false,
false,
false,
false },
145 {
"Pet type",
true,
false,
false,
false },
146 {
"On Taxi",
false,
false,
false,
false },
147 {
"Quest state mask",
true,
true,
false,
false },
148 {
"Quest objective progress",
true,
false,
true,
false },
149 {
"Map Difficulty",
true,
false,
false,
false },
150 {
"Is Gamemaster",
true,
false,
false,
false },
151 {
"Object Entry or Guid",
true,
true,
true,
false },
152 {
"Object TypeMask",
true,
false,
false,
false },
153 {
"BattlePet Species Learned",
true,
true,
true,
false },
154 {
"On Scenario Step",
true,
false,
false,
false },
155 {
"Scene In Progress",
true,
false,
false,
false },
156 {
"Player Condition",
true,
false,
false,
false },
157 {
"String ID",
false,
false,
false,
true }
185 std::size_t hashVal = 0;
199 bool condMeets =
false;
200 bool needsObject =
false;
213 if (
InstanceScript const* instance = instanceMap->GetInstanceScript())
234 ZoneScript const* zoneScript = bgMap->GetBG();
273 if (
Scenario const* scenario = instanceMap->GetInstanceScenario())
285 if (needsObject && !
object)
323 condMeets = (
ConditionValue2 & (1 << player->GetReputationMgr().GetRank(faction))) != 0;
466 condMeets = unit == toUnit;
510 condMeets = unit->IsAlive();
551 condMeets = unit->IsInWater();
566 condMeets = unit->IsStandState();
568 condMeets = unit->IsSitState();
581 condMeets = unit->IsCharmed();
587 if (
Pet const* pet = player->GetPet())
594 condMeets = player->IsInFlight();
637 condMeets = player->CanBeGameMaster();
639 condMeets = player->IsGameMaster();
654 condMeets = player->GetSceneMgr().GetActiveSceneCount(
ConditionValue1) > 0;
666 condMeets = !
object->GetPrivateObjectOwner().IsEmpty();
682 condMeets = !condMeets;
687 return condMeets &&
sScriptMgr->OnConditionCheck(
this, sourceInfo);
893 ABORT_MSG(
"Condition::GetSearcherTypeMaskForCondition - missing condition handling!");
922 std::ostringstream ss;
928 ss <<
" (Reference)";
959 if (conditions.empty())
962 std::map<uint32, uint32> elseGroupSearcherTypeMasks;
963 for (ConditionContainer::const_iterator i = conditions.begin(); i != conditions.end(); ++i)
966 ASSERT(i->isLoaded() &&
"ConditionMgr::GetSearcherTypeMaskForConditionList - not yet loaded condition found in list");
967 std::map<uint32, uint32>::const_iterator itr = elseGroupSearcherTypeMasks.find(i->ElseGroup);
969 if (itr == elseGroupSearcherTypeMasks.end())
972 else if (!itr->second)
985 elseGroupSearcherTypeMasks[i->ElseGroup] &= i->GetSearcherTypeMaskForCondition();
991 for (std::map<uint32, uint32>::const_iterator i = elseGroupSearcherTypeMasks.begin(); i != elseGroupSearcherTypeMasks.end(); ++i)
1000 std::map<uint32, bool> elseGroupStore;
1001 for (
Condition const& condition : conditions)
1003 TC_LOG_DEBUG(
"condition",
"ConditionMgr::IsPlayerMeetToConditionList {} val1: {}", condition.ToString(), condition.ConditionValue1);
1004 if (condition.isLoaded())
1007 std::map<uint32, bool>::iterator itr = elseGroupStore.try_emplace(condition.ElseGroup,
true).first;
1011 if (condition.ReferenceId)
1017 itr->second =
false;
1021 TC_LOG_DEBUG(
"condition",
"ConditionMgr::IsPlayerMeetToConditionList {} Reference template -{} not found",
1022 condition.ToString(), condition.ReferenceId);
1028 if (!condition.Meets(sourceInfo))
1029 itr->second =
false;
1033 for (std::map<uint32, bool>::const_iterator i = elseGroupStore.begin(); i != elseGroupStore.end(); ++i)
1054 if (conditions.empty())
1057 TC_LOG_DEBUG(
"condition",
"ConditionMgr::IsObjectMeetToConditions");
1100 switch (conditionType)
1128 TC_LOG_DEBUG(
"condition",
"GetConditionsForNotGroupedEntry: found conditions for type {} and entry {}",
uint32(sourceType), entry);
1161 TC_LOG_DEBUG(
"condition",
"IsObjectMeetingSpellClickConditions: found conditions for SpellClickEvent entry {} spell {}", creatureId, spellId);
1173 TC_LOG_DEBUG(
"condition",
"HasConditionsForSpellClickEvent: found conditions for SpellClickEvent entry {} spell {}", creatureId, spellId);
1184 TC_LOG_DEBUG(
"condition",
"GetConditionsForVehicleSpell: found conditions for Vehicle entry {} spell {}", creatureId, spellId);
1196 TC_LOG_DEBUG(
"condition",
"GetConditionsForSmartEvent: found conditions for Smart Event entry or guid {} eventId {}", entryOrGuid, eventId);
1208 TC_LOG_DEBUG(
"condition",
"GetConditionsForNpcVendor: found conditions for creature entry {} item {}", creatureId, itemId);
1224 return itr->second.get();
1233 TC_LOG_DEBUG(
"condition",
"IsObjectMeetingTrainerSpellConditions: found conditions for trainer id {} spell {}", trainerId, spellId);
1244 TC_LOG_DEBUG(
"condition",
"IsObjectMeetingVisibilityByObjectIdConditions: found conditions for objectType {} entry {}", objectType, entry);
1265 sSpellMgr->UnloadSpellInfoImplicitTargetConditionLists();
1270 QueryResult result =
WorldDatabase.Query(
"SELECT SourceTypeOrReferenceId, SourceGroup, SourceEntry, SourceId, ElseGroup, ConditionTypeOrReference, ConditionTarget, "
1271 "ConditionValue1, ConditionValue2, ConditionValue3, ConditionStringValue1, "
1272 "NegativeCondition, ErrorType, ErrorTextId, ScriptName FROM conditions");
1276 TC_LOG_INFO(
"server.loading",
">> Loaded 0 conditions. DB table `conditions` is empty!");
1284 auto [itr, inserted] =
ConditionStore[sourceType].try_emplace(
id,
nullptr);
1286 itr->second = std::make_shared<std::vector<Condition>>();
1292 Field* fields = result->Fetch();
1311 if (iConditionTypeOrReference >= 0)
1314 if (iSourceTypeOrReferenceId >= 0)
1317 if (iConditionTypeOrReference < 0)
1319 if (iConditionTypeOrReference == iSourceTypeOrReferenceId)
1321 TC_LOG_ERROR(
"sql.sql",
"Condition reference {} is referencing self, skipped", iSourceTypeOrReferenceId);
1327 char const* rowType =
"reference template";
1328 if (iSourceTypeOrReferenceId >= 0)
1329 rowType =
"reference";
1332 TC_LOG_ERROR(
"sql.sql",
"Condition {} {} has useless data in ConditionTarget ({})!", rowType, iSourceTypeOrReferenceId, cond.
ConditionTarget);
1334 TC_LOG_ERROR(
"sql.sql",
"Condition {} {} has useless data in value1 ({})!", rowType, iSourceTypeOrReferenceId, cond.
ConditionValue1);
1336 TC_LOG_ERROR(
"sql.sql",
"Condition {} {} has useless data in value2 ({})!", rowType, iSourceTypeOrReferenceId, cond.
ConditionValue2);
1338 TC_LOG_ERROR(
"sql.sql",
"Condition {} {} has useless data in value3 ({})!", rowType, iSourceTypeOrReferenceId, cond.
ConditionValue3);
1340 TC_LOG_ERROR(
"sql.sql",
"Condition {} {} has useless data in NegativeCondition ({})!", rowType, iSourceTypeOrReferenceId, cond.
NegativeCondition);
1345 if (iSourceTypeOrReferenceId < 0)
1348 TC_LOG_ERROR(
"sql.sql",
"Condition reference template {} has useless data in SourceGroup ({})!", iSourceTypeOrReferenceId, cond.
SourceGroup);
1350 TC_LOG_ERROR(
"sql.sql",
"Condition reference template {} has useless data in SourceEntry ({})!", iSourceTypeOrReferenceId, cond.
SourceEntry);
1352 TC_LOG_ERROR(
"sql.sql",
"Condition reference template {} has useless data in SourceId ({})!", iSourceTypeOrReferenceId, cond.
SourceId);
1384 getOrInitConditions(cond.
SourceType, { cond.SourceGroup, cond.SourceEntry, cond.SourceId })->emplace_back(std::move(cond));
1387 while (result->NextRow());
1433 for (
Condition const& condition : *conditions)
1438 for (
Condition const& condition : *conditions)
1454 for (
Condition const& condition : *conditions)
1455 TC_LOG_ERROR(
"sql.sql",
"{} LootTemplate {} not found.", condition.ToString(),
id.SourceGroup);
1462 for (
Condition const& condition : *conditions)
1463 TC_LOG_ERROR(
"sql.sql",
"{} Item {} not found in LootTemplate {}.", condition.ToString(),
id.SourceEntry,
id.SourceGroup);
1470 if (pMenuBounds.first != pMenuBounds.second)
1472 for (GossipMenusContainer::iterator itr = pMenuBounds.first; itr != pMenuBounds.second; ++itr)
1473 if (itr->second.MenuID ==
id.SourceGroup && (itr->second.TextID ==
uint32(
id.SourceEntry) ||
id.SourceEntry == 0))
1474 itr->second.Conditions = { conditions };
1479 for (
Condition const& condition : *conditions)
1480 TC_LOG_ERROR(
"sql.sql",
"{} GossipMenu {} not found.", condition.ToString(),
id.SourceGroup);
1486 for (
auto& [_, gossipMenuItem] : pMenuItemBounds)
1488 if (gossipMenuItem.MenuID ==
id.SourceGroup && gossipMenuItem.OrderIndex ==
uint32(
id.SourceEntry))
1490 gossipMenuItem.Conditions = { conditions };
1495 for (
Condition const& condition : *conditions)
1496 TC_LOG_ERROR(
"sql.sql",
"{} GossipMenuId {} Item {} not found.", condition.ToString(),
id.SourceGroup,
id.SourceEntry);
1503 uint32 conditionEffMask = cond.SourceGroup;
1504 std::list<uint32> sharedMasks;
1505 for (SpellEffectInfo const& spellEffectInfo : spellInfo->GetEffects())
1508 if (conditionEffMask & (1 << spellEffectInfo.EffectIndex))
1510 switch (cond.ConditionType)
1512 case CONDITION_OBJECT_ENTRY_GUID:
1514 uint32 implicitTargetMask = GetTargetFlagMask(spellEffectInfo.TargetA.GetObjectType()) | GetTargetFlagMask(spellEffectInfo.TargetB.GetObjectType());
1515 if ((implicitTargetMask & TARGET_FLAG_UNIT_MASK) && cond.ConditionValue1 != TYPEID_UNIT && cond.ConditionValue1 != TYPEID_PLAYER)
1517 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table - spell {} EFFECT_{} - "
1518 "target requires ConditionValue1 to be either TYPEID_UNIT ({}) or TYPEID_PLAYER ({})", cond.ToString(), spellInfo->Id, uint32(spellEffectInfo.EffectIndex), uint32(TYPEID_UNIT), uint32(TYPEID_PLAYER));
1522 if ((implicitTargetMask & TARGET_FLAG_GAMEOBJECT_MASK) && cond.ConditionValue1 != TYPEID_GAMEOBJECT)
1524 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table - spell {} EFFECT_{} - "
1525 "target requires ConditionValue1 to be TYPEID_GAMEOBJECT ({})", cond.ToString(), spellInfo->Id, uint32(spellEffectInfo.EffectIndex), uint32(TYPEID_GAMEOBJECT));
1529 if ((implicitTargetMask & TARGET_FLAG_CORPSE_MASK) && cond.ConditionValue1 != TYPEID_CORPSE)
1531 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table - spell {} EFFECT_{} - "
1532 "target requires ConditionValue1 to be TYPEID_CORPSE ({})", cond.ToString(), spellInfo->Id, uint32(spellEffectInfo.EffectIndex), uint32(TYPEID_CORPSE));
1543 auto itr = std::find_if(sharedMasks.begin(), sharedMasks.end(), [&](uint32 mask) { return !!(mask & (1 << spellEffectInfo.EffectIndex)); });
1544 if (itr != sharedMasks.end())
1548 uint32 sharedMask = 1 << spellEffectInfo.EffectIndex;
1549 for (size_t effIndex = spellEffectInfo.EffectIndex + 1; effIndex < spellInfo->GetEffects().size(); ++effIndex)
1550 if (spellInfo->GetEffect(SpellEffIndex(effIndex)).ImplicitTargetConditions == spellEffectInfo.ImplicitTargetConditions)
1551 sharedMask |= 1 << effIndex;
1553 sharedMasks.push_back(sharedMask);
1556 for (
uint32 effectMask : sharedMasks)
1559 if (
uint32 commonMask = effectMask & conditionEffMask)
1561 size_t firstEffIndex = 0;
1562 for (; firstEffIndex < spellInfo->
GetEffects().
size(); ++firstEffIndex)
1563 if ((1 << firstEffIndex) & effectMask)
1566 if (firstEffIndex >= spellInfo->
GetEffects().size())
1570 std::shared_ptr<ConditionContainer> sharedList = spellInfo->
GetEffect(
SpellEffIndex(firstEffIndex)).ImplicitTargetConditions;
1576 if (conditionEffMask != effectMask)
1578 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table, has incorrect SourceGroup {} (spell effectMask) set - "
1579 "effect masks are overlapping (all SourceGroup values having given bit set must be equal) - ignoring (Difficulty {}).",
1588 sharedList = std::make_shared<ConditionContainer>();
1589 bool assigned =
false;
1590 for (
size_t i = firstEffIndex; i < spellInfo->
GetEffects().
size(); ++i)
1592 if ((1 << i) & commonMask)
1602 sharedList->push_back(cond);
1611 if (!
id.SourceEntry)
1616 for (
uint32 areaId : phaseInfo->Areas)
1618 if (std::vector<PhaseAreaInfo>* phases =
const_cast<std::vector<PhaseAreaInfo>*
>(
sObjectMgr->GetPhasesForArea(areaId)))
1622 if (phase.PhaseInfo->Id ==
id.SourceGroup)
1624 phase.Conditions.insert(phase.Conditions.end(), conditions->begin(), conditions->end());
1635 else if (std::vector<PhaseAreaInfo>* phases =
const_cast<std::vector<PhaseAreaInfo>*
>(
sObjectMgr->GetPhasesForArea(
id.SourceEntry)))
1639 if (phase.PhaseInfo->Id ==
id.SourceGroup)
1641 phase.Conditions.insert(phase.Conditions.end(), conditions->begin(), conditions->end());
1647 for (
Condition const& condition : *conditions)
1648 TC_LOG_ERROR(
"sql.sql",
"{} Area {} does not have phase {}.", condition.ToString(),
id.SourceEntry,
id.SourceGroup);
1655 graveyard->Conditions = { conditions };
1659 for (
Condition const& condition : *conditions)
1660 TC_LOG_ERROR(
"sql.sql",
"{}, Graveyard {} does not have ghostzone {}.", condition.ToString(),
id.SourceEntry,
id.SourceGroup);
1671 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `creature_loot_template`, ignoring.", cond->
ToString());
1679 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1688 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `disenchant_loot_template`, ignoring.", cond->
ToString());
1696 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1705 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `fishing_loot_template`, ignoring.", cond->
ToString());
1713 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1722 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `gameobject_loot_template`, ignoring.", cond->
ToString());
1730 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1739 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `item_loot_template`, ignoring.", cond->
ToString());
1747 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1756 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `mail_loot_template`, ignoring.", cond->
ToString());
1764 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1773 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `milling_loot_template`, ignoring.", cond->
ToString());
1781 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1790 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `pickpocketing_loot_template`, ignoring.", cond->
ToString());
1798 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1807 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `prospecting_loot_template`, ignoring.", cond->
ToString());
1815 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1824 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `reference_loot_template`, ignoring.", cond->
ToString());
1832 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1841 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `skinning_loot_template`, ignoring.", cond->
ToString());
1849 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1858 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `spell_loot_template`, ignoring.", cond->
ToString());
1866 TC_LOG_ERROR(
"sql.sql",
"{} SourceType, SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
1876 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table does not exist in `Spell.db2`, ignoring.", cond->
ToString());
1882 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table, has incorrect SourceGroup (spell effectMask) set, ignoring.", cond->
ToString());
1890 if (!((1 << spellEffectInfo.EffectIndex) & cond->
SourceGroup))
1893 if (spellEffectInfo.ChainTargets > 0)
1896 switch (spellEffectInfo.TargetA.GetSelectionCategory())
1908 switch (spellEffectInfo.TargetB.GetSelectionCategory())
1920 switch (spellEffectInfo.Effect)
1937 TC_LOG_ERROR(
"sql.sql",
"SourceEntry {} SourceGroup {} in `condition` table - spell {} does not have implicit targets of types: _AREA_, _CONE_, _NEARBY_, __CHAIN__ or is not SPELL_EFFECT_PERSISTENT_AREA_AURA or SPELL_EFFECT_APPLY_AREA_AURA_* for effect {}, SourceGroup needs correction, ignoring.", cond->
SourceEntry, origGroup, cond->
SourceEntry,
uint32(spellEffectInfo.EffectIndex));
1938 cond->
SourceGroup &= ~(1 << spellEffectInfo.EffectIndex);
1949 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exist in `creature_template`, ignoring.", cond->
ToString());
1960 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table does not exist in `Spell.db2`, ignoring.", cond->
ToString());
1968 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry specifies non-existing quest, skipped.", cond->
ToString());
1975 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `creature_template`, ignoring.", cond->
ToString());
1981 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table does not exist in `Spell.db2`, ignoring.", cond->
ToString());
1988 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `creature_template`, ignoring.", cond->
ToString());
1994 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table does not exist in `Spell.db2`, ignoring.", cond->
ToString());
2002 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `creature_template`, ignoring.", cond->
ToString());
2008 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, item does not exist, ignoring.", cond->
ToString());
2017 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exist in Map.db2, ignoring.", cond->
ToString());
2026 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exist in AreaTable.db2, ignoring.", cond->
ToString());
2038 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exist in `graveyard_zone`, ignoring.", cond->
ToString());
2045 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table, unexpected SourceEntry value (expected 0 or 1), ignoring.", cond->
ToString());
2048 if (!
sAreaTriggerDataStore->GetAreaTriggerTemplate({ uint32(cond->SourceGroup), cond->SourceEntry == 1 }))
2050 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table, does not exist in `areatrigger_template`, ignoring.", cond->
ToString());
2057 TC_LOG_ERROR(
"sql.sql",
"{} does not exist in `conversation_line_template`, ignoring.", cond->
ToString());
2064 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exists in AreaTrigger.db2, ignoring.", cond->
ToString());
2072 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, does not exist in `trainer`, ignoring.", cond->
ToString());
2077 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table does not exist in `Spell.db2`, ignoring.", cond->
ToString());
2086 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, is no valid object type, ignoring.", cond->
ToString());
2094 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exist in `creature_template`, ignoring.", cond->
ToString());
2102 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exist in `gameobject_template`, ignoring.", cond->
ToString());
2108 TC_LOG_ERROR(
"sql.sql",
"{} SourceGroup in `condition` table, uses unchecked type id, ignoring.", cond->
ToString());
2118 TC_LOG_ERROR(
"sql.sql",
"{} SourceEntry in `condition` table, does not exist in `spawn_group_template`, ignoring.", cond->
ToString());
2123 TC_LOG_ERROR(
"sql.sql",
"{} in `spawn_group_template` table cannot have SPAWNGROUP_FLAG_SYSTEM flags, ignoring.", cond->
ToString());
2129 TC_LOG_ERROR(
"sql.sql",
"{} Invalid ConditionSourceType in `condition` table, ignoring.", cond->
ToString());
2166 TC_LOG_ERROR(
"sql.sql",
"{} Zero item count in ConditionValue2, skipped.", cond->
ToString(
true));
2284 if (!invalidRaceMask.
IsEmpty())
2545 TC_LOG_ERROR(
"sql.sql",
"{} using deprecated condition type CONDITION_SPAWNMASK.", cond->
ToString(
true));
2652 TC_LOG_ERROR(
"sql.sql",
"{} has invalid (greater than {}) value2 ({}), skipped.", cond->
ToString(
true),
2690 TC_LOG_ERROR(
"sql.sql",
"{} Invalid ConditionType in `condition` table, ignoring.", cond->
ToString());
2696 TC_LOG_ERROR(
"sql.sql",
"{} in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->
ToString(
true));
2714 TC_LOG_ERROR(
"sql.sql",
"{} has useless data in ConditionValue{} ({})!", cond->
ToString(
true), index, value);
2719 TC_LOG_ERROR(
"sql.sql",
"{} has useless data in ConditionStringValue{} ({})!", cond->
ToString(
true), index, value);
2725 conditionsMap.clear();
2732 switch (comparisonType)
2735 return value1 == value2;
2737 return value1 != value2;
2739 return value1 > value2;
2741 return value1 >= value2;
2743 return value1 < value2;
2745 return value1 <= value2;
2752template<std::
size_t N>
2755 static_assert(N < 16,
"Logic array size must be equal to or less than 16");
2757 for (std::size_t i = 0; i < results.size(); ++i)
2758 if ((logic >> (16 + i)) & 1)
2761 bool result = results[0];
2762 for (std::size_t i = 1; i < results.size(); ++i)
2764 switch ((logic >> (2 * (i - 1))) & 3)
2767 result = result && results[i];
2770 result = result || results[i];
2799 if (!selectedRandomDungeon)
2803 if (
Quest const* quest =
sObjectMgr->GetQuestTemplate(reward->firstQuest))
2829 uint8 minLevel = condition->
Flags & 0x800 ? levels->MinLevelWithDelta : levels->MinLevel;
2831 if (!(condition->
Flags & 0x20))
2832 maxLevel = condition->
Flags & 0x800 ? levels->MaxLevelWithDelta : levels->MaxLevel;
2834 if (condition->
Flags & 0x80)
2836 if (minLevel && player->
GetLevel() >= minLevel && (!maxLevel || player->
GetLevel() <= maxLevel))
2839 if (maxLevel && player->
GetLevel() <= maxLevel && (!minLevel || player->
GetLevel() >= minLevel))
2844 if (minLevel && player->
GetLevel() < minLevel)
2847 if (maxLevel && player->
GetLevel() > maxLevel)
2885 std::array<bool, std::tuple_size_v<
decltype(condition->
SkillID)>> results;
2887 for (std::size_t i = 0; i < condition->
SkillID.size(); ++i)
2892 results[i] = skillValue != 0 && skillValue > condition->
MinSkill[i] && skillValue < condition->
MaxSkill[i];
2902 int32 languageSkill = 0;
2904 languageSkill = 300;
2908 languageSkill = std::max<int32>(languageSkill, player->
GetSkillValue(languageDesc.second.SkillId));
2911 if (condition->
MinLanguage && languageSkill < condition->MinLanguage)
2932 std::array<bool, std::tuple_size_v<
decltype(condition->
MinFactionID)> + 1> results;
2934 for (std::size_t i = 0; i < condition->
MinFactionID.size(); ++i)
3018 std::array<bool, std::tuple_size_v<
decltype(condition->
PrevQuestID)>> results;
3020 for (std::size_t i = 0; i < condition->
PrevQuestID.size(); ++i)
3022 results[i] = (player->
m_activePlayerData->QuestCompleted[((questBit - 1) >> 6)] & (
UI64LIT(1) << ((questBit - 1) & 63))) != 0;
3030 std::array<bool, std::tuple_size_v<
decltype(condition->
CurrQuestID)>> results;
3032 for (std::size_t i = 0; i < condition->
CurrQuestID.size(); ++i)
3054 std::array<bool, std::tuple_size_v<
decltype(condition->
SpellID)>> results;
3056 for (std::size_t i = 0; i < condition->
SpellID.size(); ++i)
3064 if (condition->
ItemID[0])
3066 std::array<bool, std::tuple_size_v<
decltype(condition->
ItemID)>> results;
3068 for (std::size_t i = 0; i < condition->
ItemID.size(); ++i)
3069 if (condition->
ItemID[i])
3078 std::array<bool, std::tuple_size_v<
decltype(condition->
CurrencyID)>> results;
3080 for (std::size_t i = 0; i < condition->
CurrencyID.size(); ++i)
3090 for (std::size_t i = 0; i < condition->
Explored.size(); ++i)
3098 std::array<bool, std::tuple_size_v<
decltype(condition->
AuraSpellID)>> results;
3100 for (std::size_t i = 0; i < condition->
AuraSpellID.size(); ++i)
3115 if (condition->
Time[0])
3120 if (condition->
Time[1])
3135 if (!worldStateExpression)
3148 std::array<bool, std::tuple_size_v<
decltype(condition->
Achievement)>> results;
3150 for (std::size_t i = 0; i < condition->
Achievement.size(); ++i)
3166 std::array<bool, std::tuple_size_v<
decltype(condition->
LfgStatus)>> results;
3168 for (std::size_t i = 0; i < condition->
LfgStatus.size(); ++i)
3178 if (condition->
AreaID[0])
3180 std::array<bool, std::tuple_size_v<
decltype(condition->
AreaID)>> results;
3182 for (std::size_t i = 0; i < condition->
AreaID.size(); ++i)
3183 if (condition->
AreaID[i])
3211 std::array<bool, std::tuple_size_v<
decltype(condition->
QuestKillMonster)>> results;
3219 return objective.Type == QUEST_OBJECTIVE_MONSTER && uint32(objective.ObjectID) == condition->QuestKillMonster[i];
3264 return traitEntry.
Rank;
3269 std::array<bool, std::tuple_size_v<
decltype(condition->
TraitNodeEntryID)>> results;
3310 return irand(std::min(arg1, arg2), std::max(arg1, arg2));
3329 return localTime->tm_hour *
MINUTE + localTime->tm_min;
3342 return currentHour <= 12 ? (currentHour ? currentHour : 12) : currentHour - 12;
3349 return difficulty->OldEnumValue;
3382 uint32 raidOrigin = 1135695600;
3384 raidOrigin = region->Raidorigin;
3386 return (now - raidOrigin) /
WEEK;
3520 std::mt19937 mt(arg2 ? arg2 : 1);
3521 return mt() % arg1 + 1;
3602 switch (operatorType)
3622 return leftValue != 0;
3626 switch (compareLogic)
3647 bool enabled = buffer.
read<
bool>();
3651 bool finalResult =
EvalRelOp(buffer, map);
3656 bool secondResult =
EvalRelOp(buffer, map);
3658 switch (resultLogic)
3667 if (buffer.
rpos() >= buffer.
size())
3687 return unit == otherUnit;
3718 }) !=
nullptr ? value : 0;
3723 }) !=
nullptr ? value : 0;
3728 }) !=
nullptr ? value : 0;
3733 }) !=
nullptr ? value : 0;
3738 }) !=
nullptr ? value : 0;
3743 }) !=
nullptr ? value : 0;
3748 }) !=
nullptr ? value : 0;
3776 float distance = std::max(unit->GetCombatReach() + attacker->GetCombatReach() + 1.3333334f, 5.0f);
3777 if (unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || attacker->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
3779 return unit->GetExactDistSq(attacker) < distance * distance;
3825 float distance = std::max(unit->GetCombatReach() + attacker->GetCombatReach() + 1.3333334f, 5.0f);
3826 if (unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || attacker->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
3828 return unit->GetExactDistSq(attacker) >= distance * distance;
3835 float distance = std::max(unit->
GetCombatReach() + target->GetCombatReach() + 1.3333334f, 5.0f);
3844 float distance = std::max(unit->
GetCombatReach() + target->GetCombatReach() + 1.3333334f, 5.0f);
3853 return unit->
HasSpell(value) ? value : 0;
3888 return unit->
HasAura(value) ? value : 0;
3923 return unit->
GetLevel() >= levelRange->MinLevel && unit->
GetLevel() <= levelRange->MaxLevel ? value : 0;
3938 }) !=
nullptr ? value : 0;
3958 meets = unitValue == condition->
Value[i];
3961 meets = unitValue != condition->
Value[i];
3964 meets = unitValue < condition->
Value[i];
3967 meets = unitValue <= condition->
Value[i];
3970 meets = unitValue > condition->
Value[i];
3973 meets = unitValue >= condition->
Value[i];
#define sAreaTriggerDataStore
bool PlayerConditionLogic(uint32 logic, std::array< bool, N > &results)
bool PlayerConditionCompare(int32 comparisonType, int32 value1, int32 value2)
int32 GetUnitConditionVariable(Unit const *unit, Unit const *otherUnit, UnitConditionVariable variable, int32 value)
bool EvalRelOp(ByteBuffer &buffer, Map const *map)
int32 EvalSingleValue(ByteBuffer &buffer, Map const *map)
ByteBuffer HexToBytes(const std::string &hex)
int32 EvalValue(ByteBuffer &buffer, Map const *map)
std::vector< Condition > ConditionContainer
@ CONDITION_SOURCE_TYPE_MAX
@ CONDITION_SOURCE_TYPE_CONVERSATION_LINE
@ CONDITION_SOURCE_TYPE_VEHICLE_SPELL
@ CONDITION_SOURCE_TYPE_DISENCHANT_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_REFERENCE_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_TERRAIN_SWAP
@ CONDITION_SOURCE_TYPE_NPC_VENDOR
@ CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION
@ CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT
@ CONDITION_SOURCE_TYPE_REFERENCE_CONDITION
@ CONDITION_SOURCE_TYPE_MAIL_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_PHASE
@ CONDITION_SOURCE_TYPE_SPELL_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_SMART_EVENT
@ CONDITION_SOURCE_TYPE_PICKPOCKETING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_PROSPECTING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_AREATRIGGER_CLIENT_TRIGGERED
@ CONDITION_SOURCE_TYPE_AREATRIGGER
@ CONDITION_SOURCE_TYPE_SPAWN_GROUP
@ CONDITION_SOURCE_TYPE_SPELL
@ CONDITION_SOURCE_TYPE_FISHING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_OBJECT_ID_VISIBILITY
@ CONDITION_SOURCE_TYPE_GOSSIP_MENU
@ CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE
@ CONDITION_SOURCE_TYPE_ITEM_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_SPELL_IMPLICIT_TARGET
@ CONDITION_SOURCE_TYPE_GRAVEYARD
@ CONDITION_SOURCE_TYPE_SKINNING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_TRAINER_SPELL
@ CONDITION_SOURCE_TYPE_CREATURE_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_GAMEOBJECT_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_MILLING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_SPELL_PROC
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
@ CONDITION_SOURCE_TYPE_NONE
@ CONDITION_SOURCE_TYPE_MAX_DB_ALLOWED
@ INSTANCE_INFO_BOSS_STATE
@ INSTANCE_INFO_GUID_DATA
@ CONDITION_NEAR_GAMEOBJECT
@ CONDITION_QUESTREWARDED
@ CONDITION_REALM_ACHIEVEMENT
@ CONDITION_QUEST_OBJECTIVE_PROGRESS
@ CONDITION_DAILY_QUEST_DONE
@ CONDITION_SPAWNMASK_DEPRECATED
@ CONDITION_INSTANCE_INFO
@ CONDITION_PRIVATE_OBJECT
@ CONDITION_OBJECT_ENTRY_GUID
@ CONDITION_DIFFICULTY_ID
@ CONDITION_SCENARIO_STEP
@ CONDITION_BATTLE_PET_COUNT
@ CONDITION_REPUTATION_RANK
@ CONDITION_QUEST_COMPLETE
@ CONDITION_OBJECT_ENTRY_GUID_LEGACY
@ CONDITION_ITEM_EQUIPPED
@ CONDITION_SCENE_IN_PROGRESS
@ CONDITION_PLAYER_CONDITION
@ CONDITION_NEAR_CREATURE
@ CONDITION_CREATURE_TYPE
@ CONDITION_TYPE_MASK_LEGACY
@ RELATION_IN_RAID_OR_PARTY
#define sConversationDataStore
DB2Storage< PhaseEntry > sPhaseStore("Phase.db2", &PhaseLoadInfo::Instance)
DB2Storage< DifficultyEntry > sDifficultyStore("Difficulty.db2", &DifficultyLoadInfo::Instance)
DB2Storage< SkillLineEntry > sSkillLineStore("SkillLine.db2", &SkillLineLoadInfo::Instance)
DB2Storage< AchievementEntry > sAchievementStore("Achievement.db2", &AchievementLoadInfo::Instance)
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
DB2Storage< WorldStateExpressionEntry > sWorldStateExpressionStore("WorldStateExpression.db2", &WorldStateExpressionLoadInfo::Instance)
DB2Storage< CharTitlesEntry > sCharTitlesStore("CharTitles.db2", &CharTitlesLoadInfo::Instance)
DB2Storage< ChrSpecializationEntry > sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance)
DB2Storage< SceneScriptPackageEntry > sSceneScriptPackageStore("SceneScriptPackage.db2", &SceneScriptPackageLoadInfo::Instance)
DB2Storage< ScenarioStepEntry > sScenarioStepStore("ScenarioStep.db2", &ScenarioStepLoadInfo::Instance)
DB2Storage< BattlePetSpeciesEntry > sBattlePetSpeciesStore("BattlePetSpecies.db2", &BattlePetSpeciesLoadInfo::Instance)
DB2Storage< AreaTriggerEntry > sAreaTriggerStore("AreaTrigger.db2", &AreaTriggerLoadInfo::Instance)
DB2Storage< Cfg_RegionsEntry > sCfgRegionsStore("Cfg_Regions.db2", &CfgRegionsLoadInfo::Instance)
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
DB2Storage< FactionEntry > sFactionStore("Faction.db2", &FactionLoadInfo::Instance)
#define MAX_UNIT_CONDITION_VALUES
@ InLFGFirstRandomDungeon
@ HasHarmfulAuraCanceledByDamage
@ HasHarmfulAuraWithPeriodicDamage
@ LevelWithinContentTuning
@ NumberOfRangedAttackers
@ HasHarmfulAuraDispelType
@ HasHelpfulAuraDispelType
WorldStateExpressionFunctions
WorldStateExpressionValueType
WorldStateExpressionComparisonType
#define MAX_SPELL_EFFECTS
WorldStateExpressionLogic
WorldStateExpressionOperatorType
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
bool IsHolidayActive(HolidayIds id)
@ GRID_MAP_TYPE_MASK_PLAYER
@ GRID_MAP_TYPE_MASK_CREATURE
@ GRID_MAP_TYPE_MASK_GAMEOBJECT
@ GRID_MAP_TYPE_MASK_CORPSE
@ GRID_MAP_TYPE_MASK_AREATRIGGER
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
LootStore LootTemplates_Spell("spell_loot_template", "spell id (random item creating)", false)
LootStore LootTemplates_Skinning("skinning_loot_template", "creature skinning id", true)
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
LootStore LootTemplates_Item("item_loot_template", "item entry", true)
LootStore LootTemplates_Milling("milling_loot_template", "item entry (herb)", true)
LootStore LootTemplates_Reference("reference_loot_template", "reference id", false)
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
LootStore LootTemplates_Prospecting("prospecting_loot_template", "item entry (ore)", true)
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
LootStore LootTemplates_Mail("mail_loot_template", "mail template id", false)
LootStore LootTemplates_Fishing("fishing_loot_template", "area id", true)
#define NUM_CLIENT_OBJECT_TYPES
std::pair< GossipMenusContainer::iterator, GossipMenusContainer::iterator > GossipMenusMapBoundsNonConst
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ EQUIPMENT_SLOT_MAINHAND
#define INVENTORY_SLOT_BAG_0
#define MAX_QUEST_LOG_SIZE
@ QUEST_STATUS_INCOMPLETE
int32 irand(int32 min, int32 max)
@ CREATURE_TYPE_GAS_CLOUD
@ SPELL_EFFECT_APPLY_AREA_AURA_PARTY
@ SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
@ SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM
@ SPELL_EFFECT_APPLY_AURA_ON_PET
@ SPELL_EFFECT_APPLY_AREA_AURA_PET
@ SPELL_EFFECT_APPLY_AREA_AURA_RAID
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
@ SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
@ SPELL_EFFECT_APPLY_AREA_AURA_SUMMONS
@ SPELL_EFFECT_APPLY_AREA_AURA_OWNER
#define CLASSMASK_ALL_PLAYABLE
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_COMPREHEND_LANGUAGE
@ TARGET_SELECT_CATEGORY_CONE
@ TARGET_SELECT_CATEGORY_AREA
@ TARGET_SELECT_CATEGORY_NEARBY
@ TARGET_SELECT_CATEGORY_LINE
@ TARGET_SELECT_CATEGORY_TRAJ
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
@ UNIT_STAND_STATE_SUBMERGED
@ MOVEMENTFLAG_STRAFE_LEFT
@ MOVEMENTFLAG_STRAFE_RIGHT
@ UNIT_FLAG_PLAYER_CONTROLLED
@ UNIT_STATE_ALL_STATE_SUPPORTED
bool CompareValues(ComparisionType type, T val1, T val2)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
uint32 GetEffectMask() const
AuraApplication const * GetApplicationOfTarget(ObjectGuid guid) const
SpellInfo const * GetSpellInfo() const
bool isConditionTypeValid(Condition *cond) const
bool IsSpellUsedInSpellClickConditions(uint32 spellId) const
std::unordered_set< uint32 > SpellsUsedInSpellClickConditions
void addToLootTemplate(ConditionId const &id, std::shared_ptr< std::vector< Condition > > conditions, LootTemplate *loot) const
bool IsObjectMeetingVendorItemConditions(uint32 creatureId, uint32 itemId, Player const *player, Creature const *vendor) const
bool IsObjectMeetToConditions(WorldObject const *object, ConditionContainer const &conditions) const
bool isSourceTypeValid(Condition *cond) const
static bool IsPlayerMeetingCondition(Player const *player, PlayerConditionEntry const *condition)
uint32 GetSearcherTypeMaskForConditionList(ConditionContainer const &conditions) const
bool IsObjectMeetingNotGroupedConditions(ConditionSourceType sourceType, uint32 entry, ConditionSourceInfo &sourceInfo) const
static ConditionMgr * instance()
static bool IsMeetingWorldStateExpression(Map const *map, WorldStateExpressionEntry const *expression)
void addToGraveyardData(ConditionId const &id, std::shared_ptr< std::vector< Condition > > conditions) const
bool HasConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry) const
bool IsObjectMeetToConditionList(ConditionSourceInfo &sourceInfo, ConditionContainer const &conditions) const
bool IsObjectMeetingSpellClickConditions(uint32 creatureId, uint32 spellId, WorldObject const *clicker, WorldObject const *target) const
static bool IsUnitMeetingCondition(Unit const *unit, Unit const *otherUnit, UnitConditionEntry const *condition)
bool HasConditionsForSpellClickEvent(uint32 creatureId, uint32 spellId) const
static void LogUselessConditionValue(Condition const *cond, uint8 index, uint32 value)
bool IsMapMeetingNotGroupedConditions(ConditionSourceType sourceType, uint32 entry, Map const *map) const
bool IsObjectMeetingTrainerSpellConditions(uint32 trainerId, uint32 spellId, Player *player) const
ConditionEntriesByTypeArray ConditionStore
ConditionContainer const * GetConditionsForAreaTrigger(uint32 areaTriggerId, bool isServerSide) const
void addToSpellImplicitTargetConditions(Condition const &cond) const
void addToPhases(ConditionId const &id, std::shared_ptr< std::vector< Condition > > conditions) const
bool IsObjectMeetingSmartEventConditions(int64 entryOrGuid, uint32 eventId, uint32 sourceType, Unit const *unit, WorldObject const *baseObject) const
static bool CanHaveSourceGroupSet(ConditionSourceType sourceType)
void addToGossipMenuItems(ConditionId const &id, std::shared_ptr< std::vector< Condition > > conditions) const
void addToGossipMenus(ConditionId const &id, std::shared_ptr< std::vector< Condition > > conditions) const
static char const *const StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX_DB_ALLOWED]
bool IsObjectMeetingVisibilityByObjectIdConditions(uint32 objectType, uint32 entry, WorldObject const *seer) const
static uint32 GetPlayerConditionLfgValue(Player const *player, PlayerConditionLfgStatus status)
static bool CanHaveConditionType(ConditionSourceType sourceType, ConditionTypes conditionType)
static bool CanHaveSourceIdSet(ConditionSourceType sourceType)
static ConditionTypeInfo const StaticConditionTypeData[CONDITION_MAX]
bool IsObjectMeetingVehicleSpellConditions(uint32 creatureId, uint32 spellId, Player const *player, Unit const *vehicle) const
void LoadConditions(bool isReload=false)
static bool IsInArea(uint32 objectAreaId, uint32 areaId)
constexpr bool HasFlag(T flag) const
Class used to access individual fields of database query result.
std::string GetString() const
std::vector< GameEventData > GameEventDataMap
ItemTemplate const * GetTemplate() const
LootTemplate * GetLootForConditionFill(uint32 loot_id)
bool HaveLootFor(uint32 loot_id) const
bool isReference(uint32 id)
bool LinkConditions(ConditionId const &id, ConditionsReference reference)
bool IsBattlegroundOrArena() const
BattlegroundMap * ToBattlegroundMap()
Difficulty GetDifficultyID() const
InstanceMap * ToInstanceMap()
WeatherState GetZoneWeather(uint32 zoneId) const
static Creature * ToCreature(Object *o)
static Unit * ToUnit(Object *o)
static GameObject * ToGameObject(Object *o)
static ObjectGuid GetGUID(Object const *o)
static Player * ToPlayer(Object *o)
static bool InDbPhaseShift(WorldObject const *object, uint8 phaseUseFlags, uint16 phaseId, uint32 phaseGroupId)
ChrSpecialization GetPrimarySpecialization() const
UF::UpdateField< UF::PlayerData, 0, TYPEID_PLAYER > m_playerData
Gender GetNativeGender() const override
uint16 GetSkillValue(uint32 skill) const
uint16 FindQuestSlot(uint32 quest_id) const
bool CanRewardQuest(Quest const *quest, bool msg) const
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
bool HasAchieved(uint32 achievementId) const
WorldSession * GetSession() const
Item * GetItemByPos(uint16 pos) const
bool ModifierTreeSatisfied(uint32 modifierTreeId) const
bool HasExploredZone(uint32 areaId) const
bool IsGameMaster() const
QuestStatus GetQuestStatus(uint32 quest_id) const
UF::UpdateField< UF::ActivePlayerData, 0, TYPEID_ACTIVE_PLAYER > m_activePlayerData
static bool IsValidGender(uint8 Gender)
ReputationRank GetReputationRank(uint32 faction_id) const
bool HasSpell(uint32 spell) const override
Group * GetGroup(Optional< uint8 > partyIndex)
int32 GetQuestSlotObjectiveData(uint16 slot, QuestObjective const &objective) const
ChrSpecializationEntry const * GetPrimarySpecializationEntry() const
ReputationMgr & GetReputationMgr()
static DrunkenState GetDrunkenstateByValue(uint8 value)
uint32 GetCurrencyQuantity(uint32 id) const
QuestObjectives const & GetObjectives() const
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
::Difficulty const Difficulty
SpellSchoolMask GetSchoolMask() const
uint64 GetSpellMechanicMaskByEffectMask(uint32 effectMask) const
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
std::vector< SpellEffectInfo > const & GetEffects() const
size_t GetThreatListSize() const
Utility class to enable range for loop syntax for multimap.equal_range uses.
uint32 GetChannelSpellId() const
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
float GetHealthPct() const
uint32 GetUnitMovementFlags() const
ThreatManager & GetThreatManager()
bool HasAuraTypeWithMiscvalue(AuraType auraType, int32 miscValue) const
std::array< ObjectGuid, MAX_SUMMON_SLOT > m_SummonSlot
uint32 GetClassMask() const
uint32 GetMountDisplayId() const
ObjectGuid GetOwnerGUID() const override
bool HasUnitFlag(UnitFlags flags) const
ObjectGuid GetCharmedGUID() const
float GetCombatReach() const override
int32 GetMaxPower(Powers power) const
ObjectGuid GetCharmerOrOwnerGUID() const override
virtual bool HasSpell(uint32) const
ObjectGuid GetCreatorGUID() const override
bool IsOnVehicle(Unit const *vehicle) const
uint32 GetCreatureType() const
bool HasNegativeAuraWithInterruptFlag(InterruptFlags flag, ObjectGuid guid=ObjectGuid::Empty) const
uint32 GetVirtualItemId(uint32 slot) const
uint32 GetAuraCount(uint32 spellId) const
ObjectGuid GetMinionGUID() const
bool HasUnitMovementFlag(uint32 f) const
AttackerSet const & getAttackers() const
bool HasAuraType(AuraType auraType) const
ObjectGuid GetCritterGUID() const
uint32 GetExtraUnitMovementFlags() const
int32 GetPower(Powers power) const
bool IsInRaidWith(Unit const *unit) const
float GetPowerPct(Powers power) const
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
ObjectGuid GetCharmerGUID() const
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraApplication *except=nullptr) const
bool IsInPartyWith(Unit const *unit) const
ObjectGuid GetTarget() const
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
constexpr uint32 GetMapId() const
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
ReputationRank GetReactionTo(WorldObject const *target) const
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
float GetDistance(WorldObject const *obj) const
uint8 GetExpansion() const
void SetPackedTime(uint32 packedTime)
bool IsInRange(WowTime const &from, WowTime const &to) const
virtual uint32 GetData(uint32) const
virtual uint64 GetData64(uint32) const
ObjectData const creatureData[]
@ DEFAULT_MAX_BATTLE_PETS_PER_SPECIES
WowTime const * GetWowTime()
tm const * GetDateAndTime()
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_COMMON_API void HexStrToByteArray(std::string_view str, uint8 *out, size_t outlen, bool reverse=false)
constexpr TypeMask ConvertLegacyTypeMask(uint32 legacyTypeMask)
constexpr ::TypeID ConvertLegacyTypeID(TypeID legacyTypeID)
void hash_combine(std::size_t &seed, T const &val)
constexpr std::size_t size()
TC_PROTO_API ::google::protobuf::internal::ExtensionIdentifier< ::google::protobuf::FieldOptions, ::google::protobuf::internal::MessageTypeTraits< ::bgs::protocol::FieldRestriction >, 11, false > valid
EnumFlag< AreaFlags > GetFlags() const
EnumFlag< ChrSpecializationFlag > GetFlags() const
ChrSpecializationRole GetRole() const
std::size_t GetHash() const
bool HasConditionStringValue1
ConditionSourceInfo(WorldObject const *target0, WorldObject const *target1=nullptr, WorldObject const *target2=nullptr)
Condition const * mLastFailedCondition
WorldObject const * mConditionTargets[MAX_CONDITION_TARGETS]
Map const * mConditionMap
ConditionTypes ConditionType
std::string ToString(bool ext=false) const
std::string ConditionStringValue1
uint32 GetSearcherTypeMaskForCondition() const
ConditionSourceType SourceType
uint32 GetMaxAvailableConditionTargets() const
bool Meets(ConditionSourceInfo &sourceInfo) const
uint32 GetSubClass() const
std::array< int32, 4 > AuraSpellID
std::array< int32, 4 > TraitNodeEntryID
std::array< uint32, 4 > ItemCount
std::array< uint32, 2 > Time
uint16 WorldStateExpressionID
std::array< uint32, 4 > LfgValue
std::array< uint8, 4 > LfgCompare
std::array< uint16, 4 > MaxSkill
std::array< uint16, 4 > TraitNodeEntryMaxRank
std::array< uint16, 4 > Achievement
uint32 CurrentCompletedQuestLogic
std::array< int32, 4 > CurrentCompletedQuestID
std::array< uint8, 4 > LfgStatus
std::array< int32, 4 > PrevQuestID
std::array< int32, 4 > CurrQuestID
std::array< uint16, 4 > SkillID
int8 ChrSpecializationRole
std::array< int32, 2 > MovementFlags
std::array< uint16, 2 > Explored
uint16 MinAvgEquippedItemLevel
std::array< uint32, 3 > MinFactionID
std::array< uint32, 4 > CurrencyCount
std::array< uint8, 4 > AuraStacks
std::array< uint16, 4 > AreaID
int8 ChrSpecializationIndex
std::array< uint32, 6 > QuestKillMonster
std::array< uint16, 4 > MinSkill
std::array< uint8, 3 > MinReputation
std::array< uint16, 4 > TraitNodeEntryMinRank
std::array< int32, 4 > ItemID
Trinity::RaceMask< int64 > RaceMask
std::array< int32, 4 > SpellID
uint16 MaxAvgEquippedItemLevel
uint32 TraitNodeEntryLogic
std::array< uint32, 4 > CurrencyID
float GetExactDist(float x, float y, float z) const
constexpr float GetExactDistSq(float x, float y, float z) const
bool IsStoringFlag() const
Battlenet::RealmHandle Id
constexpr bool HasRace(uint8 raceId) const
constexpr bool IsEmpty() const
UpdateField< int32, 4, 5 > Type
UpdateField< int32, 8, 9 > CombatConfigFlags
DynamicUpdateField< UF::TraitEntry, 0, 1 > Entries
UpdateField< int32, 0, 2 > ID
EnumFlag< UnitConditionFlags > GetFlags() const
std::array< int32, MAX_UNIT_CONDITION_VALUES > Value
std::array< int8, MAX_UNIT_CONDITION_VALUES > Op
std::array< uint8, MAX_UNIT_CONDITION_VALUES > Variable