diff options
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rwxr-xr-x | src/server/game/Conditions/ConditionMgr.cpp | 318 |
1 files changed, 217 insertions, 101 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 8562c66c29f..9391636c619 100755 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -27,16 +27,16 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" -// Checks if player meets the condition +// Checks if object meets the condition // Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: eventAI) -bool Condition::Meets(Player* player, Unit* invoker) +bool Condition::Meets(WorldObject* object, WorldObject* invoker) { - if (!player) + // object not present, return false + if (!object) { - sLog->outDebug(LOG_FILTER_CONDITIONSYS, "Condition player not found"); - return false; // player not present, return false + sLog->outDebug(LOG_FILTER_CONDITIONSYS, "Condition object not found"); + return false; } - uint32 refId = mConditionValue3;//value 3 can be a 'quick' reference bool condMeets = false; bool sendErrorMsg = false; switch (mConditionType) @@ -45,164 +45,233 @@ bool Condition::Meets(Player* player, Unit* invoker) condMeets = true; // empty condition, always met break; case CONDITION_AURA: - refId = 0; - if (!mConditionValue3) - condMeets = player->HasAuraEffect(mConditionValue1, mConditionValue2); - else if (Unit* target = player->GetSelectedUnit()) - condMeets = target->HasAuraEffect(mConditionValue1, mConditionValue2); + { + if (Unit* unit = object->ToUnit()) + { + if (!mConditionValue3) + condMeets = unit->HasAuraEffect(mConditionValue1, mConditionValue2); + else if (Player* player = unit->ToPlayer()) + { + if (Unit* target = player->GetSelectedUnit()) + condMeets = target->HasAuraEffect(mConditionValue1, mConditionValue2); + } + } break; + } case CONDITION_ITEM: - condMeets = (mConditionValue2 && player->HasItemCount(mConditionValue1, mConditionValue2)) || (!mConditionValue2 && !player->HasItemCount(mConditionValue1, mConditionValue2));//HasItemCount returns false if 0 count is used + { + if (Player* player = object->ToPlayer()) + { + // don't allow 0 items (it's checked during table load) + ASSERT(mConditionValue2); + bool checkBank = mConditionValue3 ? true : false; + condMeets = player->HasItemCount(mConditionValue1, mConditionValue2, checkBank); + } break; + } case CONDITION_ITEM_EQUIPPED: - condMeets = player->HasItemOrGemWithIdEquipped(mConditionValue1, 1); + { + if (Player* player = object->ToPlayer()) + condMeets = player->HasItemOrGemWithIdEquipped(mConditionValue1, 1); break; + } case CONDITION_ZONEID: - condMeets = player->GetZoneId() == mConditionValue1; + condMeets = object->GetZoneId() == mConditionValue1; break; case CONDITION_REPUTATION_RANK: { - if (FactionEntry const* faction = sFactionStore.LookupEntry(mConditionValue1)) - condMeets = (mConditionValue2 & (1 << player->GetReputationMgr().GetRank(faction))); + if (Player* player = object->ToPlayer()) + { + if (FactionEntry const* faction = sFactionStore.LookupEntry(mConditionValue1)) + condMeets = (mConditionValue2 & (1 << player->GetReputationMgr().GetRank(faction))); + } break; } case CONDITION_ACHIEVEMENT: - condMeets = player->GetAchievementMgr().HasAchieved(mConditionValue1); + { + if (Player* player = object->ToPlayer()) + condMeets = player->GetAchievementMgr().HasAchieved(mConditionValue1); break; + } case CONDITION_TEAM: - condMeets = player->GetTeam() == mConditionValue1; + { + if (Player* player = object->ToPlayer()) + condMeets = player->GetTeam() == mConditionValue1; break; + } case CONDITION_CLASS: - condMeets = player->getClassMask() & mConditionValue1; + { + if (Player* player = object->ToPlayer()) + condMeets = player->getClassMask() & mConditionValue1; break; + } case CONDITION_RACE: - condMeets = player->getRaceMask() & mConditionValue1; + { + if (Player* player = object->ToPlayer()) + condMeets = player->getRaceMask() & mConditionValue1; break; + } case CONDITION_SKILL: - condMeets = player->HasSkill(mConditionValue1) && player->GetBaseSkillValue(mConditionValue1) >= mConditionValue2; + { + if (Player* player = object->ToPlayer()) + condMeets = player->HasSkill(mConditionValue1) && player->GetBaseSkillValue(mConditionValue1) >= mConditionValue2; break; + } case CONDITION_QUESTREWARDED: - condMeets = (player->GetQuestRewardStatus(mConditionValue1) == !mConditionValue2); + { + if (Player* player = object->ToPlayer()) + condMeets = (player->GetQuestRewardStatus(mConditionValue1) == !mConditionValue2); break; + } case CONDITION_QUESTTAKEN: { - QuestStatus status = player->GetQuestStatus(mConditionValue1); - condMeets = ((status == QUEST_STATUS_INCOMPLETE) == !mConditionValue2); + if (Player* player = object->ToPlayer()) + { + QuestStatus status = player->GetQuestStatus(mConditionValue1); + condMeets = ((status == QUEST_STATUS_INCOMPLETE) == !mConditionValue2); + } break; } case CONDITION_QUEST_COMPLETE: { - QuestStatus status = player->GetQuestStatus(mConditionValue1); - condMeets = ((status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(mConditionValue1)) == !mConditionValue2); + if (Player* player = object->ToPlayer()) + { + QuestStatus status = player->GetQuestStatus(mConditionValue1); + condMeets = ((status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(mConditionValue1)) == !mConditionValue2); + } break; } case CONDITION_QUEST_NONE: { - QuestStatus status = player->GetQuestStatus(mConditionValue1); - condMeets = ((status == QUEST_STATUS_NONE) == !mConditionValue2); + if (Player* player = object->ToPlayer()) + { + QuestStatus status = player->GetQuestStatus(mConditionValue1); + condMeets = ((status == QUEST_STATUS_NONE) == !mConditionValue2); + } break; } case CONDITION_NO_AURA: - condMeets = !player->HasAuraEffect(mConditionValue1, mConditionValue2); + { + if (Unit* unit = object->ToUnit()) + condMeets = !unit->HasAuraEffect(mConditionValue1, mConditionValue2); break; + } case CONDITION_ACTIVE_EVENT: condMeets = sGameEventMgr->IsActiveEvent(mConditionValue1); break; case CONDITION_INSTANCE_DATA: { - Map* map = player->GetMap(); + Map* map = object->GetMap(); if (map && map->IsDungeon() && ((InstanceMap*)map)->GetInstanceScript()) condMeets = ((InstanceMap*)map)->GetInstanceScript()->GetData(mConditionValue1) == mConditionValue2; break; } case CONDITION_SPELL_SCRIPT_TARGET: condMeets = true;//spell target condition is handled in spellsystem, here it is always true - refId = 0;//cant have references! use CONDITION_SOURCE_TYPE_SPELL for it break; case CONDITION_CREATURE_TARGET: { - Unit* target = player->GetSelectedUnit(); - if (target) - if (Creature* cTarget = target->ToCreature()) - if (cTarget->GetEntry() == mConditionValue1) - condMeets = true; + if (Player* player = object->ToPlayer()) + { + Unit* target = player->GetSelectedUnit(); + if (target) + if (Creature* cTarget = target->ToCreature()) + if (cTarget->GetEntry() == mConditionValue1) + condMeets = true; + } break; } case CONDITION_TARGET_HEALTH_BELOW_PCT: { - Unit* target = player->GetSelectedUnit(); - if (target) - condMeets = !target->HealthAbovePct(mConditionValue1); - break; + if (Player* player = object->ToPlayer()) + { + Unit* target = player->GetSelectedUnit(); + if (target) + condMeets = !target->HealthAbovePct(mConditionValue1); + break; + } } case CONDITION_TARGET_RANGE: { - if (Unit* target = player->GetSelectedUnit()) - if (player->GetDistance(target) >= mConditionValue1 && (!mConditionValue2 || player->GetDistance(target) <= mConditionValue2)) - condMeets = true; + if (Player* player = object->ToPlayer()) + { + if (Unit* target = player->GetSelectedUnit()) + if (player->GetDistance(target) >= mConditionValue1 && (!mConditionValue2 || player->GetDistance(target) <= mConditionValue2)) + condMeets = true; + } break; } case CONDITION_MAPID: - condMeets = player->GetMapId() == mConditionValue1; + condMeets = object->GetMapId() == mConditionValue1; break; case CONDITION_AREAID: - condMeets = player->GetAreaId() == mConditionValue1; + condMeets = object->GetAreaId() == mConditionValue1; break; case CONDITION_ITEM_TARGET: { - condMeets = true;//handled in Item::IsTargetValidForItemUse - refId = 0;//cant have references for now + condMeets = true; //handled in Item::IsTargetValidForItemUse break; } case CONDITION_SPELL: - if (mConditionValue2 == 1) - condMeets = player->HasSpell(mConditionValue1); - else - condMeets = !player->HasSpell(mConditionValue1); + { + if (Player* player = object->ToPlayer()) + { + if (mConditionValue2 == 1) + condMeets = player->HasSpell(mConditionValue1); + else + condMeets = !player->HasSpell(mConditionValue1); + } break; + } case CONDITION_NOITEM: - condMeets = !player->HasItemCount(mConditionValue1, 1, mConditionValue2 ? true : false); + { + if (Player* player = object->ToPlayer()) + condMeets = !player->HasItemCount(mConditionValue1, 1, mConditionValue2 ? true : false); break; + } case CONDITION_LEVEL: { - switch (mConditionValue2) + if (Unit* unit = object->ToUnit()) { - case LVL_COND_EQ: - condMeets = player->getLevel() == mConditionValue1; - break; - case LVL_COND_HIGH: - condMeets = player->getLevel() > mConditionValue1; - break; - case LVL_COND_LOW: - condMeets = player->getLevel() < mConditionValue1; - break; - case LVL_COND_HIGH_EQ: - condMeets = player->getLevel() >= mConditionValue1; - break; - case LVL_COND_LOW_EQ: - condMeets = player->getLevel() <= mConditionValue1; - break; + switch (mConditionValue2) + { + case LVL_COND_EQ: + condMeets = unit->getLevel() == mConditionValue1; + break; + case LVL_COND_HIGH: + condMeets = unit->getLevel() > mConditionValue1; + break; + case LVL_COND_LOW: + condMeets = unit->getLevel() < mConditionValue1; + break; + case LVL_COND_HIGH_EQ: + condMeets = unit->getLevel() >= mConditionValue1; + break; + case LVL_COND_LOW_EQ: + condMeets = unit->getLevel() <= mConditionValue1; + break; + } } break; } case CONDITION_DRUNKENSTATE: { - condMeets = (uint32)Player::GetDrunkenstateByValue(player->GetDrunkValue()) >= mConditionValue1; + if (Player* player = object->ToPlayer()) + condMeets = (uint32)Player::GetDrunkenstateByValue(player->GetDrunkValue()) >= mConditionValue1; break; } case CONDITION_NEAR_CREATURE: { - condMeets = GetClosestCreatureWithEntry(player, mConditionValue1, (float)mConditionValue2) ? true : false; + condMeets = GetClosestCreatureWithEntry(object, mConditionValue1, (float)mConditionValue2) ? true : false; break; } case CONDITION_NEAR_GAMEOBJECT: { - condMeets = GetClosestGameObjectWithEntry(player, mConditionValue1, (float)mConditionValue2) ? true : false; + condMeets = GetClosestGameObjectWithEntry(object, mConditionValue1, (float)mConditionValue2) ? true : false; break; } default: condMeets = false; - refId = 0; break; } switch (mSourceType) @@ -215,20 +284,15 @@ bool Condition::Meets(Player* player, Unit* invoker) break; } - bool refMeets = false; - if (condMeets && refId)//only have to check references if 'this' is met - { - ConditionList ref = sConditionMgr->GetConditionReferences(refId); - refMeets = sConditionMgr->IsPlayerMeetToConditions(player, ref); - } - else - refMeets = true; + if (mNegativeCondition) + condMeets = !condMeets; - if (sendErrorMsg && ErrorTextd && (!condMeets || !refMeets))//send special error from DB - player->m_ConditionErrorMsgId = ErrorTextd; + if (Player* player = object->ToPlayer()) + if (sendErrorMsg && ErrorTextd && (!condMeets))//send special error from DB + player->m_ConditionErrorMsgId = ErrorTextd; - bool script = sScriptMgr->OnConditionCheck(this, player, invoker); // Returns true by default. - return condMeets && refMeets && script; + bool script = sScriptMgr->OnConditionCheck(this, object, invoker); // Returns true by default. + return condMeets && script; } ConditionMgr::ConditionMgr() @@ -249,7 +313,7 @@ ConditionList ConditionMgr::GetConditionReferences(uint32 refId) return conditions; } -bool ConditionMgr::IsPlayerMeetToConditionList(Player* player, ConditionList const& conditions, Unit* invoker /*= NULL*/) +bool ConditionMgr::IsObjectMeetToConditionList(WorldObject* object, ConditionList const& conditions, WorldObject* invoker /*= NULL*/) { std::map<uint32, bool> ElseGroupStore; for (ConditionList::const_iterator i = conditions.begin(); i != conditions.end(); ++i) @@ -268,7 +332,7 @@ bool ConditionMgr::IsPlayerMeetToConditionList(Player* player, ConditionList con ConditionReferenceContainer::const_iterator ref = ConditionReferenceStore.find((*i)->mReferenceId); if (ref != ConditionReferenceStore.end()) { - if (!IsPlayerMeetToConditionList(player, (*ref).second, invoker)) + if (!IsObjectMeetToConditionList(object, (*ref).second, invoker)) ElseGroupStore[(*i)->mElseGroup] = false; } else @@ -280,7 +344,7 @@ bool ConditionMgr::IsPlayerMeetToConditionList(Player* player, ConditionList con } else //handle normal condition { - if (!(*i)->Meets(player, invoker)) + if (!(*i)->Meets(object, invoker)) ElseGroupStore[(*i)->mElseGroup] = false; } } @@ -292,16 +356,18 @@ bool ConditionMgr::IsPlayerMeetToConditionList(Player* player, ConditionList con return false; } -bool ConditionMgr::IsPlayerMeetToConditions(Player* player, ConditionList const& conditions, Unit* invoker /*= NULL*/) +bool ConditionMgr::IsObjectMeetToConditions(WorldObject* object, ConditionList const& conditions, WorldObject* invoker /*= NULL*/) { 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 = IsPlayerMeetToConditionList(player, conditions, invoker); + 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 @@ -391,7 +457,7 @@ void ConditionMgr::LoadConditions(bool isReload) } QueryResult result = WorldDatabase.Query("SELECT SourceTypeOrReferenceId, SourceGroup, SourceEntry, SourceId, ElseGroup, ConditionTypeOrReference, " - " ConditionValue1, ConditionValue2, ConditionValue3, ErrorTextId, ScriptName FROM conditions"); + " ConditionValue1, ConditionValue2, ConditionValue3, NegativeCondition, ErrorTextId, ScriptName FROM conditions"); if (!result) { @@ -417,8 +483,9 @@ void ConditionMgr::LoadConditions(bool isReload) cond->mConditionValue1 = fields[6].GetUInt32(); cond->mConditionValue2 = fields[7].GetUInt32(); cond->mConditionValue3 = fields[8].GetUInt32(); - cond->ErrorTextd = fields[9].GetUInt32(); - cond->mScriptId = sObjectMgr->GetScriptId(fields[10].GetCString()); + cond->mNegativeCondition = fields[9].GetUInt8(); + cond->ErrorTextd = fields[10].GetUInt32(); + cond->mScriptId = sObjectMgr->GetScriptId(fields[11].GetCString()); if (iConditionTypeOrReference >= 0) cond->mConditionType = ConditionType(iConditionTypeOrReference); @@ -443,6 +510,8 @@ void ConditionMgr::LoadConditions(bool isReload) sLog->outErrorDb("Condition %s %i has useless data in value2 (%u)!", rowType, iSourceTypeOrReferenceId, cond->mConditionValue2); if (cond->mConditionValue3) sLog->outErrorDb("Condition %s %i has useless data in value3 (%u)!", rowType, iSourceTypeOrReferenceId, cond->mConditionValue3); + if (cond->mNegativeCondition) + sLog->outErrorDb("Condition %s %i has useless data in NegativeCondition (%u)!", rowType, iSourceTypeOrReferenceId, cond->mNegativeCondition); if (cond->mSourceGroup && iSourceTypeOrReferenceId < 0) sLog->outErrorDb("Condition %s %i has useless data in SourceGroup (%u)!", rowType, iSourceTypeOrReferenceId, cond->mSourceGroup); if (cond->mSourceEntry && iSourceTypeOrReferenceId < 0) @@ -1091,6 +1160,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("ItemEquipped condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("ItemEquipped condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_ZONEID: @@ -1098,18 +1169,20 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(cond->mConditionValue1); if (!areaEntry) { - sLog->outErrorDb("Zone condition has non existing area (%u), skipped", cond->mConditionValue1); + sLog->outErrorDb("ZoneID condition has non existing area (%u), skipped", cond->mConditionValue1); return false; } if (areaEntry->zone != 0) { - sLog->outErrorDb("Zone condition requires to be in area (%u) which is a subzone but zone expected, skipped", cond->mConditionValue1); + sLog->outErrorDb("ZoneID condition requires to be in area (%u) which is a subzone but zone expected, skipped", cond->mConditionValue1); return false; } if (cond->mConditionValue2) - sLog->outErrorDb("Zone condition has useless data in value2 (%u)!", cond->mConditionValue2); + sLog->outErrorDb("ZoneID condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("ZoneID condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_REPUTATION_RANK: @@ -1120,6 +1193,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("Reputation condition has non existing faction (%u), skipped", cond->mConditionValue1); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("Reputation condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_TEAM: @@ -1132,6 +1207,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("Team condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("Team condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_SKILL: @@ -1148,6 +1225,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("Skill condition specifies invalid skill value (%u), skipped", cond->mConditionValue2); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("Skill condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_QUESTREWARDED: @@ -1163,21 +1242,25 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2 > 1) sLog->outErrorDb("Quest condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("Quest condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_NO_AURA: { if (!sSpellMgr->GetSpellInfo(cond->mConditionValue1)) { - sLog->outErrorDb("Aura condition has non existing spell (Id: %d), skipped", cond->mConditionValue1); + sLog->outErrorDb("NoAura condition has non existing spell (Id: %d), skipped", cond->mConditionValue1); return false; } if (cond->mConditionValue2 > 2) { - sLog->outErrorDb("Aura condition has non existing effect index (%u) in value2 (must be 0..2), skipped", cond->mConditionValue2); + sLog->outErrorDb("NoAura condition has non existing effect index (%u) in value2 (must be 0..2), skipped", cond->mConditionValue2); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("NoAura condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_ACTIVE_EVENT: @@ -1185,12 +1268,14 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap(); if (cond->mConditionValue1 >=events.size() || !events[cond->mConditionValue1].isValid()) { - sLog->outErrorDb("Active event condition has non existing event id (%u), skipped", cond->mConditionValue1); + sLog->outErrorDb("ActiveEvent condition has non existing event id (%u), skipped", cond->mConditionValue1); return false; } if (cond->mConditionValue2) - sLog->outErrorDb("Active event condition has useless data in value2 (%u)!", cond->mConditionValue2); + sLog->outErrorDb("ActiveEvent condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("ActiveEvent condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_ACHIEVEMENT: @@ -1198,12 +1283,14 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) AchievementEntry const* achievement = GetAchievementStore()->LookupEntry(cond->mConditionValue1); if (!achievement) { - sLog->outErrorDb("Achivemen condition has non existing achivement id (%u), skipped", cond->mConditionValue1); + sLog->outErrorDb("Achivement condition has non existing achivement id (%u), skipped", cond->mConditionValue1); return false; } if (cond->mConditionValue2) - sLog->outErrorDb("Achivemen condition has useless data in value2 (%u)!", cond->mConditionValue2); + sLog->outErrorDb("Achivement condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("Achivement condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_CLASS: @@ -1216,6 +1303,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("Class condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("Class condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_RACE: @@ -1228,6 +1317,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("Race condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("Race condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_SPELL_SCRIPT_TARGET: @@ -1280,6 +1371,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("CreatureTarget condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("CreatureTarget condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_TARGET_HEALTH_BELOW_PCT: @@ -1292,6 +1385,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("TargetHealthBelowPct condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("TargetHealthBelowPct condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_TARGET_RANGE: @@ -1301,6 +1396,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("TargetRange condition has max distance closer then min distance, skipped"); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("TargetRange condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_MAPID: @@ -1314,6 +1411,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("Map condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("Map condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_ITEM_TARGET: @@ -1344,6 +1443,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) if (cond->mConditionValue2) sLog->outErrorDb("Spell condition has useless data in value2 (%u)!", cond->mConditionValue2); + if (cond->mConditionValue3) + sLog->outErrorDb("Spell condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_NOITEM: @@ -1354,6 +1455,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("NoItem condition has non existing item (%u), skipped", cond->mConditionValue1); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("NoItem condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_LEVEL: @@ -1363,6 +1466,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("Level condition has invalid option (%u), skipped", cond->mConditionValue2); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("Level condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_DRUNKENSTATE: @@ -1372,6 +1477,13 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("DrunkState condition has invalid state (%u), skipped", cond->mConditionValue1); return false; } + if (cond->mConditionValue2) + { + sLog->outErrorDb("DrunkState condition has useless data in value2 (%u)!", cond->mConditionValue2); + return false; + } + if (cond->mConditionValue3) + sLog->outErrorDb("DrunkState condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_NEAR_CREATURE: @@ -1381,6 +1493,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("NearCreature condition has non existing creature template entry (%u), skipped", cond->mConditionValue1); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("NearCreature condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_NEAR_GAMEOBJECT: @@ -1390,6 +1504,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) sLog->outErrorDb("NearGameObject condition has non existing gameobject template entry (%u), skipped", cond->mConditionValue1); return false; } + if (cond->mConditionValue3) + sLog->outErrorDb("NearGameObject condition has useless data in value3 (%u)!", cond->mConditionValue3); break; } case CONDITION_AREAID: |