aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Conditions/ConditionMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rwxr-xr-xsrc/server/game/Conditions/ConditionMgr.cpp175
1 files changed, 138 insertions, 37 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 977657a985c..be57ed5c303 100755
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -29,8 +29,10 @@
// Checks if object meets the condition
// Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: eventAI)
-bool Condition::Meets(WorldObject* object, WorldObject* invoker)
+bool Condition::Meets(ConditionSourceInfo& sourceInfo)
{
+ ASSERT(mConditionTarget < MAX_CONDITION_TARGETS);
+ WorldObject* object = sourceInfo.mConditionTargets[mConditionTarget];
// object not present, return false
if (!object)
{
@@ -257,24 +259,14 @@ bool Condition::Meets(WorldObject* object, WorldObject* invoker)
condMeets = false;
break;
}
- switch (mSourceType)
- {
- case CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET:
- case CONDITION_SOURCE_TYPE_SPELL:
- sendErrorMsg = true;
- break;
- default:
- break;
- }
if (mNegativeCondition)
condMeets = !condMeets;
- if (Player* player = object->ToPlayer())
- if (sendErrorMsg && ErrorTextd && (!condMeets))//send special error from DB
- player->m_ConditionErrorMsgId = ErrorTextd;
+ if (!condMeets)
+ sourceInfo.mLastFailedCondition = this;
- bool script = sScriptMgr->OnConditionCheck(this, object, invoker); // Returns true by default.
+ bool script = sScriptMgr->OnConditionCheck(this, sourceInfo); // Returns true by default.
return condMeets && script;
}
@@ -296,7 +288,7 @@ ConditionList ConditionMgr::GetConditionReferences(uint32 refId)
return conditions;
}
-bool ConditionMgr::IsObjectMeetToConditionList(WorldObject* object, ConditionList const& conditions, WorldObject* invoker /*= NULL*/)
+bool ConditionMgr::IsObjectMeetToConditionList(ConditionSourceInfo& sourceInfo, ConditionList const& conditions)
{
std::map<uint32, bool> ElseGroupStore;
for (ConditionList::const_iterator i = conditions.begin(); i != conditions.end(); ++i)
@@ -315,7 +307,7 @@ bool ConditionMgr::IsObjectMeetToConditionList(WorldObject* object, ConditionLis
ConditionReferenceContainer::const_iterator ref = ConditionReferenceStore.find((*i)->mReferenceId);
if (ref != ConditionReferenceStore.end())
{
- if (!IsObjectMeetToConditionList(object, (*ref).second, invoker))
+ if (!IsObjectMeetToConditionList(sourceInfo, (*ref).second))
ElseGroupStore[(*i)->mElseGroup] = false;
}
else
@@ -327,7 +319,7 @@ bool ConditionMgr::IsObjectMeetToConditionList(WorldObject* object, ConditionLis
}
else //handle normal condition
{
- if (!(*i)->Meets(object, invoker))
+ if (!(*i)->Meets(sourceInfo))
ElseGroupStore[(*i)->mElseGroup] = false;
}
}
@@ -339,23 +331,18 @@ bool ConditionMgr::IsObjectMeetToConditionList(WorldObject* object, ConditionLis
return false;
}
-bool ConditionMgr::IsObjectMeetToConditions(WorldObject* object, ConditionList const& conditions, WorldObject* invoker /*= NULL*/)
+bool ConditionMgr::IsObjectMeetToConditions(WorldObject* object, ConditionList const& conditions)
+{
+ return IsObjectMeetToConditions(ConditionSourceInfo(object), conditions);
+}
+
+bool ConditionMgr::IsObjectMeetToConditions(ConditionSourceInfo& sourceInfo, ConditionList const& conditions)
{
if (conditions.empty())
return true;
- Player* player = object ? object->ToPlayer() : NULL;
-
- if (player)
- player->m_ConditionErrorMsgId = 0;
-
- sLog->outDebug(LOG_FILTER_CONDITIONSYS, "ConditionMgr::IsPlayerMeetToConditions");
- bool result = IsObjectMeetToConditionList(player, conditions, invoker);
-
- if (player && player->m_ConditionErrorMsgId && player->GetSession() && !result)
- player->GetSession()->SendNotification(player->m_ConditionErrorMsgId); //m_ConditionErrorMsgId is set only if a condition was not met
-
- return result;
+ sLog->outDebug(LOG_FILTER_CONDITIONSYS, "ConditionMgr::IsObjectMeetToConditions");
+ return IsObjectMeetToConditionList(sourceInfo, conditions);
}
ConditionList ConditionMgr::GetConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry)
@@ -439,7 +426,7 @@ void ConditionMgr::LoadConditions(bool isReload)
sObjectMgr->LoadGossipMenuItems();
}
- QueryResult result = WorldDatabase.Query("SELECT SourceTypeOrReferenceId, SourceGroup, SourceEntry, SourceId, ElseGroup, ConditionTypeOrReference, "
+ QueryResult result = WorldDatabase.Query("SELECT SourceTypeOrReferenceId, SourceGroup, SourceEntry, SourceId, ElseGroup, ConditionTypeOrReference, ConditionTarget, "
" ConditionValue1, ConditionValue2, ConditionValue3, NegativeCondition, ErrorTextId, ScriptName FROM conditions");
if (!result)
@@ -463,12 +450,13 @@ void ConditionMgr::LoadConditions(bool isReload)
cond->mSourceId = fields[3].GetUInt32();
cond->mElseGroup = fields[4].GetUInt32();
int32 iConditionTypeOrReference = fields[5].GetInt32();
- cond->mConditionValue1 = fields[6].GetUInt32();
- cond->mConditionValue2 = fields[7].GetUInt32();
- cond->mConditionValue3 = fields[8].GetUInt32();
- cond->mNegativeCondition = fields[9].GetUInt8();
- cond->ErrorTextd = fields[10].GetUInt32();
- cond->mScriptId = sObjectMgr->GetScriptId(fields[11].GetCString());
+ cond->mConditionTarget = fields[6].GetUInt8();
+ cond->mConditionValue1 = fields[7].GetUInt32();
+ cond->mConditionValue2 = fields[8].GetUInt32();
+ cond->mConditionValue3 = fields[9].GetUInt32();
+ cond->mNegativeCondition = fields[10].GetUInt8();
+ cond->ErrorTextd = fields[11].GetUInt32();
+ cond->mScriptId = sObjectMgr->GetScriptId(fields[12].GetCString());
if (iConditionTypeOrReference >= 0)
cond->mConditionType = ConditionType(iConditionTypeOrReference);
@@ -487,6 +475,8 @@ void ConditionMgr::LoadConditions(bool isReload)
if (iSourceTypeOrReferenceId >= 0)
rowType = "reference";
//check for useless data
+ if (cond->mConditionTarget)
+ sLog->outErrorDb("Condition %s %i has useless data in ConditionTarget (%u)!", rowType, iSourceTypeOrReferenceId, cond->mConditionTarget);
if (cond->mConditionValue1)
sLog->outErrorDb("Condition %s %i has useless data in value1 (%u)!", rowType, iSourceTypeOrReferenceId, cond->mConditionValue1);
if (cond->mConditionValue2)
@@ -742,6 +732,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_DISENCHANT_LOOT_TEMPLATE:
@@ -759,6 +755,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_FISHING_LOOT_TEMPLATE:
@@ -776,6 +778,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_GAMEOBJECT_LOOT_TEMPLATE:
@@ -793,6 +801,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_ITEM_LOOT_TEMPLATE:
@@ -810,6 +824,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_MAIL_LOOT_TEMPLATE:
@@ -827,6 +847,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_MILLING_LOOT_TEMPLATE:
@@ -844,6 +870,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_PICKPOCKETING_LOOT_TEMPLATE:
@@ -861,6 +893,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_PROSPECTING_LOOT_TEMPLATE:
@@ -878,6 +916,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_REFERENCE_LOOT_TEMPLATE:
@@ -895,6 +939,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_SKINNING_LOOT_TEMPLATE:
@@ -912,6 +962,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_SPELL_LOOT_TEMPLATE:
@@ -929,6 +985,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, does not exist in `item_template`, ignoring.", cond->mSourceType, cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET:
@@ -998,6 +1060,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceEntry %u in `condition` table, does not exist in `creature_template`, ignoring.", cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_SPELL:
@@ -1008,6 +1076,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceEntry %u in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->mSourceEntry);
return false;
}
+
+ if (cond->mConditionTarget > 2)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_ITEM_REQUIRED_TARGET:
@@ -1052,6 +1126,12 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
", or the spells are already listed in CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET conditions.", cond->mSourceEntry);
break;
}
+
+ if (cond->mConditionTarget > 2)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
}
case CONDITION_SOURCE_TYPE_QUEST_ACCEPT:
@@ -1060,6 +1140,11 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("CONDITION_SOURCE_TYPE_QUEST_ACCEPT specifies non-existing quest (%u), skipped", cond->mSourceEntry);
return false;
}
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
case CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK:
if (!sObjectMgr->GetQuestTemplate(cond->mSourceEntry))
@@ -1067,6 +1152,11 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK specifies non-existing quest (%u), skipped", cond->mSourceEntry);
return false;
}
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
case CONDITION_SOURCE_TYPE_VEHICLE_SPELL:
if (!sObjectMgr->GetCreatureTemplate(cond->mSourceGroup))
@@ -1080,10 +1170,21 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
sLog->outErrorDb("SourceEntry %u in `condition` table, does not exist in `spell.dbc`, ignoring.", cond->mSourceEntry);
return false;
}
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
break;
case CONDITION_SOURCE_TYPE_GOSSIP_MENU:
case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION:
case CONDITION_SOURCE_TYPE_SMART_EVENT:
+ if (cond->mConditionTarget)
+ {
+ sLog->outErrorDb("SourceType %u, SourceEntry %u in `condition` table, has incorrect ConditionTarget set, ignoring.", cond->mSourceType, cond->mSourceEntry);
+ return false;
+ }
+ break;
case CONDITION_SOURCE_TYPE_NONE:
default:
break;