diff options
| author | QAston <qaston@gmail.com> | 2012-02-10 23:40:38 +0100 | 
|---|---|---|
| committer | QAston <qaston@gmail.com> | 2012-02-10 23:42:08 +0100 | 
| commit | ce4a4ffe50a26fa2040d4af3933621b66813488d (patch) | |
| tree | ca1afb50445232f1c7e7a30862038c31024d8934 /src/server/game/Conditions/ConditionMgr.cpp | |
| parent | 8c2526e7d0f8cd516e0a3d3ebd6e554774c76c7b (diff) | |
Core/Db/Conditions: Add ContidionTarget column which allows selection of objects which will be checked by condition, depending on SourceTypeOrReferenceId.
So far usable only with CONDITION_SOURCE_TYPE_SPELL:
ContidionTarget = 0 - check caster
ContidionTarget = 1 - check explicit target
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
| -rwxr-xr-x | src/server/game/Conditions/ConditionMgr.cpp | 175 | 
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;  | 
