Merge branch 'master' of git://github.com/TrinityCore/TrinityCore

This commit is contained in:
Malcrom
2012-02-10 12:33:25 -03:30
24 changed files with 325 additions and 194 deletions
@@ -0,0 +1 @@
ALTER TABLE `conditions` ADD COLUMN `NegativeCondition` tinyint(3) UNSIGNED NOT NULL default '0' AFTER `ConditionValue3`;
@@ -0,0 +1,3 @@
-- Picnic Basket
UPDATE `gameobject_template` SET `flags`=0, `AIName`='' WHERE `entry`=187267;
DELETE FROM `smart_scripts` WHERE `entryorguid`=187267 AND `source_type`=1;
+1 -1
View File
@@ -326,7 +326,7 @@ void VehicleAI::CheckConditions(const uint32 diff)
{
if (Player* player = passenger->ToPlayer())
{
if (!sConditionMgr->IsPlayerMeetToConditions(player, conditions))
if (!sConditionMgr->IsObjectMeetToConditions(player, conditions))
{
player->ExitVehicle();
return;//check other pessanger in next tick
@@ -90,7 +90,7 @@ void SmartScript::ProcessEventsFor(SMART_EVENT e, Unit* unit, uint32 var0, uint3
if (Player* player = unit->ToPlayer())
{
ConditionList conds = sConditionMgr->GetConditionsForSmartEvent((*i).entryOrGuid, (*i).event_id, (*i).source_type);
meets = sConditionMgr->IsPlayerMeetToConditions(player, conds);
meets = sConditionMgr->IsObjectMeetToConditions(player, conds);
}
}
+217 -101
View File
@@ -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:
+33 -31
View File
@@ -30,35 +30,35 @@ enum ConditionType
{ // value1 value2 value3
CONDITION_NONE = 0, // 0 0 0 always true
CONDITION_AURA = 1, // spell_id effindex use target? true if player (or target, if value3) has aura of spell_id with effect effindex
CONDITION_ITEM = 2, // item_id count +referenceID true if has #count of item_ids
CONDITION_ITEM_EQUIPPED = 3, // item_id 0 +referenceID true if has item_id equipped
CONDITION_ZONEID = 4, // zone_id 0 +referenceID true if in zone_id
CONDITION_REPUTATION_RANK = 5, // faction_id min_rank +referenceID true if has min_rank for faction_id
CONDITION_TEAM = 6, // player_team 0, +referenceID 469 - Alliance, 67 - Horde)
CONDITION_SKILL = 7, // skill_id skill_value +referenceID true if has skill_value for skill_id
CONDITION_QUESTREWARDED = 8, // quest_id 0 +referenceID true if quest_id was rewarded before
CONDITION_QUESTTAKEN = 9, // quest_id 0, +referenceID true while quest active
CONDITION_DRUNKENSTATE = 10, // DrunkenState 0, +referenceID true if player is drunk enough
CONDITION_NO_AURA = 11, // spell_id effindex +referenceID true if does not have aura of spell_id with effect effindex
CONDITION_ACTIVE_EVENT = 12, // event_id 0 +referenceID true if event is active
CONDITION_INSTANCE_DATA = 13, // entry data +referenceID true if data is set in current instance
CONDITION_QUEST_NONE = 14, // quest_id 0 +referenceID true if doesn't have quest saved
CONDITION_CLASS = 15, // class 0 +referenceID true if player's class is equal to class
CONDITION_RACE = 16, // race 0 +referenceID true if player's race is equal to race
CONDITION_ACHIEVEMENT = 17, // achievement_id 0 +referenceID true if achievement is complete
CONDITION_SPELL_SCRIPT_TARGET = 18, // SpellScriptTargetType, TargetEntry, 0
CONDITION_CREATURE_TARGET = 19, // creature entry 0 +referenceID true if current target is creature with value1 entry
CONDITION_TARGET_HEALTH_BELOW_PCT = 20, // 0-100 0 +referenceID true if target's health is below value1 percent, false if over or no target
CONDITION_TARGET_RANGE = 21, // minDistance maxDist +referenceID true if target is closer then minDist and further then maxDist or if max is 0 then max dist is infinit
CONDITION_MAPID = 22, // map_id 0 +referenceID true if in map_id
CONDITION_AREAID = 23, // area_id 0 +referenceID true if in area_id
CONDITION_ITEM = 2, // item_id count bank true if has #count of item_ids (if 'bank' is set it searches in bank slots too)
CONDITION_ITEM_EQUIPPED = 3, // item_id 0 0 true if has item_id equipped
CONDITION_ZONEID = 4, // zone_id 0 0 true if in zone_id
CONDITION_REPUTATION_RANK = 5, // faction_id min_rank 0 true if has min_rank for faction_id
CONDITION_TEAM = 6, // player_team 0, 0 469 - Alliance, 67 - Horde)
CONDITION_SKILL = 7, // skill_id skill_value 0 true if has skill_value for skill_id
CONDITION_QUESTREWARDED = 8, // quest_id 0 0 true if quest_id was rewarded before
CONDITION_QUESTTAKEN = 9, // quest_id 0, 0 true while quest active
CONDITION_DRUNKENSTATE = 10, // DrunkenState 0, 0 true if player is drunk enough
CONDITION_NO_AURA = 11, // spell_id effindex 0 true if does not have aura of spell_id with effect effindex
CONDITION_ACTIVE_EVENT = 12, // event_id 0 0 true if event is active
CONDITION_INSTANCE_DATA = 13, // entry data 0 true if data is set in current instance
CONDITION_QUEST_NONE = 14, // quest_id 0 0 true if doesn't have quest saved
CONDITION_CLASS = 15, // class 0 0 true if player's class is equal to class
CONDITION_RACE = 16, // race 0 0 true if player's race is equal to race
CONDITION_ACHIEVEMENT = 17, // achievement_id 0 0 true if achievement is complete
CONDITION_SPELL_SCRIPT_TARGET = 18, // SpellScriptTargetType, TargetEntry, 0
CONDITION_CREATURE_TARGET = 19, // creature entry 0 0 true if current target is creature with value1 entry
CONDITION_TARGET_HEALTH_BELOW_PCT = 20, // 0-100 0 0 true if target's health is below value1 percent, false if over or no target
CONDITION_TARGET_RANGE = 21, // minDistance maxDist 0 true if target is closer then minDist and further then maxDist or if max is 0 then max dist is infinit
CONDITION_MAPID = 22, // map_id 0 0 true if in map_id
CONDITION_AREAID = 23, // area_id 0 0 true if in area_id
CONDITION_ITEM_TARGET = 24, // ItemRequiredTargetType, TargetEntry, 0
CONDITION_SPELL = 25, // spell_id bool +referenceID bool 1 for true 0 for false
CONDITION_NOITEM = 26, // item_id bank +referenceID true if player does not have any of the item (if 'bank' is set it searches in bank slots too)
CONDITION_LEVEL = 27, // level opt +referenceID true if player's level is equal to param1 (param2 can modify the statement)
CONDITION_QUEST_COMPLETE = 28, // quest_id 0 +referenceID true if player has quest_id with all objectives complete, but not yet rewarded
CONDITION_NEAR_CREATURE = 29, // creature entry distance +referenceID true if there is a creature of entry in range
CONDITION_NEAR_GAMEOBJECT = 30, // gameobject entry distance +referenceID true if there is a gameobject of entry in range
CONDITION_SPELL = 25, // spell_id bool 0 bool 1 for true 0 for false
CONDITION_NOITEM = 26, // item_id bank 0 true if player does not have any of the item (if 'bank' is set it searches in bank slots too)
CONDITION_LEVEL = 27, // level opt 0 true if player's level is equal to param1 (param2 can modify the statement)
CONDITION_QUEST_COMPLETE = 28, // quest_id 0 0 true if player has quest_id with all objectives complete, but not yet rewarded
CONDITION_NEAR_CREATURE = 29, // creature entry distance 0 true if there is a creature of entry in range
CONDITION_NEAR_GAMEOBJECT = 30, // gameobject entry distance 0 true if there is a gameobject of entry in range
CONDITION_MAX = 31 // MAX
};
@@ -114,6 +114,7 @@ struct Condition
uint32 ErrorTextd;
uint32 mReferenceId;
uint32 mScriptId;
bool mNegativeCondition;
Condition()
{
@@ -128,9 +129,10 @@ struct Condition
mReferenceId = 0;
ErrorTextd = 0;
mScriptId = 0;
mNegativeCondition = false;
}
bool Meets(Player* player, Unit* invoker = NULL);
bool Meets(WorldObject* player, WorldObject* invoker = NULL);
bool isLoaded() const { return mConditionType > CONDITION_NONE || mReferenceId; }
};
@@ -155,7 +157,7 @@ class ConditionMgr
bool isConditionTypeValid(Condition* cond);
ConditionList GetConditionReferences(uint32 refId);
bool IsPlayerMeetToConditions(Player* player, ConditionList const& conditions, Unit* invoker = NULL);
bool IsObjectMeetToConditions(WorldObject* object, ConditionList const& conditions, WorldObject* invoker = NULL);
ConditionList GetConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry);
ConditionList GetConditionsForSmartEvent(int32 entryOrGuid, uint32 eventId, uint32 sourceType);
ConditionList GetConditionsForVehicleSpell(uint32 creatureID, uint32 spellID);
@@ -165,7 +167,7 @@ class ConditionMgr
bool addToLootTemplate(Condition* cond, LootTemplate* loot);
bool addToGossipMenus(Condition* cond);
bool addToGossipMenuItems(Condition* cond);
bool IsPlayerMeetToConditionList(Player* player, ConditionList const& conditions, Unit* invoker = NULL);
bool IsObjectMeetToConditionList(WorldObject* player, ConditionList const& conditions, WorldObject* invoker = NULL);
bool isGroupable(ConditionSourceType sourceType) const
{
@@ -220,7 +220,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa
SetGoArtKit(0); // unknown what this is
SetByteValue(GAMEOBJECT_BYTES_1, 2, artKit);
switch (goinfo->type)
{
@@ -1901,8 +1901,8 @@ void GameObject::SetLootState(LootState state, Unit* unit)
{
// startOpen determines whether we are going to add or remove the LoS on activation
bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false);
if (GetGOData()->go_state == GO_NOT_READY)
if (GetGOData() && GetGOData()->go_state == GO_NOT_READY)
startOpen = !startOpen;
if (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED)
@@ -1923,7 +1923,7 @@ void GameObject::SetGoState(GOState state)
// startOpen determines whether we are going to add or remove the LoS on activation
bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false);
if (GetGOData()->go_state == GO_NOT_READY)
if (GetGOData() && GetGOData()->go_state == GO_NOT_READY)
startOpen = !startOpen;
if (state == GO_STATE_ACTIVE || state == GO_STATE_ACTIVE_ALTERNATIVE)
@@ -1949,7 +1949,7 @@ void GameObject::EnableCollision(bool enable)
{
if (!m_model)
return;
/*if (enable && !GetMap()->Contains(*m_model))
GetMap()->Insert(*m_model);*/
+1 -1
View File
@@ -1243,7 +1243,7 @@ void Pet::_SaveAuras(SQLTransaction& trans)
}
// don't save guid of caster in case we are caster of the spell - guid for pet is generated every pet load, so it won't match saved guid anyways
uint64 casterGUID = (itr->second->GetCasterGUID() == GetGUID()) ? NULL : itr->second->GetCasterGUID();
uint64 casterGUID = (itr->second->GetCasterGUID() == GetGUID()) ? 0 : itr->second->GetCasterGUID();
trans->PAppend("INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) "
"VALUES ('%u', '" UI64FMTD "', '%u', '%u', '%u', '%u', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%u')",
+4 -4
View File
@@ -14088,7 +14088,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool
for (GossipMenuItemsMap::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
{
bool canTalk = true;
if (!sConditionMgr->IsPlayerMeetToConditions(this, itr->second.Conditions))
if (!sConditionMgr->IsObjectMeetToConditions(this, itr->second.Conditions))
continue;
if (source->GetTypeId() == TYPEID_UNIT)
@@ -14390,7 +14390,7 @@ uint32 Player::GetGossipTextId(uint32 menuId)
GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
for (GossipMenusMap::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
if (sConditionMgr->IsPlayerMeetToConditions(this, itr->second.conditions))
if (sConditionMgr->IsObjectMeetToConditions(this, itr->second.conditions))
textId = itr->second.text_id;
return textId;
@@ -15378,7 +15378,7 @@ bool Player::SatisfyQuestStatus(Quest const* qInfo, bool msg)
bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg)
{
ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_ACCEPT, qInfo->GetQuestId());
if (!sConditionMgr->IsPlayerMeetToConditions(this, conditions))
if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
{
if (msg)
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
@@ -19861,7 +19861,7 @@ void Player::VehicleSpellInitialize()
}
ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(veh->GetEntry(), spellId);
if (!sConditionMgr->IsPlayerMeetToConditions(this, conditions))
if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
{
sLog->outDebug(LOG_FILTER_CONDITIONSYS, "VehicleSpellInitialize: conditions not met for Vehicle entry %u spell %u", veh->ToCreature()->GetEntry(), spellId);
data << uint16(0) << uint8(0) << uint8(i+8);
@@ -496,7 +496,7 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
ResetMap();
Map* newMap = sMapMgr->CreateBaseMap(newMapid);
SetMap(newMap);
ASSERT (GetMap());
ASSERT(GetMap());
AddToWorld();
if (oldMap != newMap)
-8
View File
@@ -12704,14 +12704,6 @@ void Unit::setDeathState(DeathState s)
}
else if (s == JUST_ALIVED)
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
if (oldDeathState != ALIVE && s == ALIVE)
{
// Reset display id on resurection - needed by corpse explosion to cleanup after display change
// TODO: fix this
if (!HasAuraType(SPELL_AURA_TRANSFORM))
SetDisplayId(GetNativeDisplayId());
}
}
/*########################################
+1 -2
View File
@@ -433,8 +433,7 @@ void Vehicle::RemovePassenger(Unit* unit)
void Vehicle::RelocatePassengers(float x, float y, float z, float ang)
{
Map* map = _me->GetMap();
ASSERT(map != NULL);
ASSERT(_me->GetMap());
// not sure that absolute position calculation is correct, it must depend on vehicle orientation and pitch angle
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
+6 -14
View File
@@ -1470,20 +1470,14 @@ void WorldSession::HandleTimeSyncResp(WorldPacket & recv_data)
void WorldSession::HandleResetInstancesOpcode(WorldPacket & /*recv_data*/)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_RESET_INSTANCES");
Group* group = _player->GetGroup();
if (group)
if (Group* group = _player->GetGroup())
{
if (group->IsLeader(_player->GetGUID()))
{
group->ResetInstances(INSTANCE_RESET_ALL, false, _player);
group->ResetInstances(INSTANCE_RESET_ALL, true, _player);
}
}
else
{
_player->ResetInstances(INSTANCE_RESET_ALL, false);
_player->ResetInstances(INSTANCE_RESET_ALL, true);
}
}
void WorldSession::HandleSetDungeonDifficultyOpcode(WorldPacket & recv_data)
@@ -1503,7 +1497,7 @@ void WorldSession::HandleSetDungeonDifficultyOpcode(WorldPacket & recv_data)
return;
// cannot reset while in an instance
Map* map = _player->GetMap();
Map* map = _player->FindMap();
if (map && map->IsDungeon())
{
sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player (Name: %s, GUID: %u) tried to reset the instance while player is inside!", _player->GetName(), _player->GetGUIDLow());
@@ -1524,8 +1518,7 @@ void WorldSession::HandleSetDungeonDifficultyOpcode(WorldPacket & recv_data)
if (!pGroupGuy->IsInMap(pGroupGuy))
return;
map = pGroupGuy->GetMap();
if (map && map->IsNonRaidDungeon())
if (pGroupGuy->GetMap()->IsNonRaidDungeon())
{
sLog->outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while group member (Name: %s, GUID: %u) is inside!", _player->GetGUIDLow(), pGroupGuy->GetName(), pGroupGuy->GetGUIDLow());
return;
@@ -1558,7 +1551,7 @@ void WorldSession::HandleSetRaidDifficultyOpcode(WorldPacket & recv_data)
}
// cannot reset while in an instance
Map* map = _player->GetMap();
Map* map = _player->FindMap();
if (map && map->IsDungeon())
{
sLog->outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
@@ -1582,8 +1575,7 @@ void WorldSession::HandleSetRaidDifficultyOpcode(WorldPacket & recv_data)
if (!pGroupGuy->IsInMap(pGroupGuy))
return;
map = pGroupGuy->GetMap();
if (map && map->IsRaid())
if (pGroupGuy->GetMap()->IsRaid())
{
sLog->outError("WorldSession::HandleSetRaidDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
return;
+2 -2
View File
@@ -651,7 +651,7 @@ uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver, uint32
if (!pQuest) continue;
ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK, pQuest->GetQuestId());
if (!sConditionMgr->IsPlayerMeetToConditions(player, conditions))
if (!sConditionMgr->IsObjectMeetToConditions(player, conditions))
continue;
QuestStatus status = player->GetQuestStatus(quest_id);
@@ -679,7 +679,7 @@ uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver, uint32
continue;
ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK, pQuest->GetQuestId());
if (!sConditionMgr->IsPlayerMeetToConditions(player, conditions))
if (!sConditionMgr->IsObjectMeetToConditions(player, conditions))
continue;
QuestStatus status = player->GetQuestStatus(quest_id);
+1 -1
View File
@@ -341,7 +341,7 @@ LootItem::LootItem(LootStoreItem const& li)
bool LootItem::AllowedForPlayer(Player const* player) const
{
// DB conditions check
if (!sConditionMgr->IsPlayerMeetToConditions(const_cast<Player*>(player), conditions))
if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(player), conditions))
return false;
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
+2 -1
View File
@@ -668,7 +668,8 @@ void Map::RemovePlayerFromMap(Player* player, bool remove)
if (remove)
DeleteFromWorld(player);
sScriptMgr->OnPlayerLeaveMap(this, player);
if (remove)
sScriptMgr->OnPlayerLeaveMap(this, player);
}
template<class T>
+3 -3
View File
@@ -1036,14 +1036,14 @@ void ScriptMgr::OnAuctionExpire(AuctionHouseObject* ah, AuctionEntry* entry)
FOREACH_SCRIPT(AuctionHouseScript)->OnAuctionExpire(ah, entry);
}
bool ScriptMgr::OnConditionCheck(Condition* condition, Player* player, Unit* invoker)
bool ScriptMgr::OnConditionCheck(Condition* condition, WorldObject* object, WorldObject* invoker)
{
ASSERT(condition);
ASSERT(player);
ASSERT(object);
// invoker can be NULL.
GET_SCRIPT_RET(ConditionScript, condition->mScriptId, tmpscript, true);
return tmpscript->OnConditionCheck(condition, player, invoker);
return tmpscript->OnConditionCheck(condition, object, invoker);
}
void ScriptMgr::OnInstall(Vehicle* veh)
+2 -2
View File
@@ -572,7 +572,7 @@ class ConditionScript : public ScriptObject
bool IsDatabaseBound() const { return true; }
// Called when a single condition is checked for a player.
virtual bool OnConditionCheck(Condition* /*condition*/, Player* /*player*/, Unit* /*invoker*/) { return true; }
virtual bool OnConditionCheck(Condition* /*condition*/, WorldObject* /*object*/, WorldObject* /*invoker*/) { return true; }
};
class VehicleScript : public ScriptObject
@@ -938,7 +938,7 @@ class ScriptMgr
public: /* ConditionScript */
bool OnConditionCheck(Condition* condition, Player* player, Unit* invoker);
bool OnConditionCheck(Condition* condition, WorldObject* object, WorldObject* invoker);
public: /* VehicleScript */
+2 -2
View File
@@ -519,8 +519,8 @@ void WorldSession::LogoutPlayer(bool Save)
// calls to GetMap in this case may cause crashes
_player->CleanupsBeforeDelete();
sLog->outChar("Account: %d (IP: %s) Logout Character:[%s] (GUID: %u)", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName(), _player->GetGUIDLow());
Map* _map = _player->GetMap();
_map->RemovePlayerFromMap(_player, true);
if (Map* _map = _player->FindMap())
_map->RemovePlayerFromMap(_player, true);
SetPlayer(NULL); // deleted in Remove call
///- Send the 'logout complete' packet to the client
+1 -1
View File
@@ -4720,7 +4720,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (Player* plrCaster = m_caster->GetCharmerOrOwnerPlayerOrPlayerItself())
{
ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL, m_spellInfo->Id);
if (!conditions.empty() && !sConditionMgr->IsPlayerMeetToConditions(plrCaster, conditions))
if (!conditions.empty() && !sConditionMgr->IsObjectMeetToConditions(plrCaster, conditions))
return SPELL_FAILED_DONT_REPORT;
}
+3 -3
View File
@@ -3048,7 +3048,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
uint32 numSummons;
// some spells need to summon many units, for those spells number of summons is stored in effect value
// however so far noone found a generic check to find all of those (there's no related data in summonproperties.dbc
// however so far noone found a generic check to find all of those (there's no related data in summonproperties.dbc
// and in spell attributes, possibly we need to add a table for those)
// so here's a list of MiscValueB values, which is currently most generic check
switch (properties->Id)
@@ -5691,7 +5691,7 @@ void Spell::EffectSummonPlayer(SpellEffIndex /*effIndex*/)
return;
float x, y, z;
m_caster->GetClosePoint(x, y, z, unitTarget->GetObjectSize());
m_caster->GetPosition(x, y, z);
unitTarget->ToPlayer()->SetSummonPoint(m_caster->GetMapId(), x, y, z);
@@ -7142,7 +7142,7 @@ void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const*
float radius = 5.0f;
int32 duration = m_spellInfo->GetDuration();
if (Player* modOwner = m_originalCaster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);
@@ -597,6 +597,16 @@ class npc_spinestalker : public CreatureScript
{
}
void InitializeAI()
{
// Increase add count
if (!me->isDead())
{
_instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1); // this cannot be in Reset because reset also happens on evade
Reset();
}
}
void Reset()
{
_events.Reset();
@@ -712,6 +722,16 @@ class npc_rimefang : public CreatureScript
{
}
void InitializeAI()
{
// Increase add count
if (!me->isDead())
{
_instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1); // this cannot be in Reset because reset also happens on evade
Reset();
}
}
void Reset()
{
_events.Reset();
@@ -860,7 +880,10 @@ class npc_sindragosa_trash : public CreatureScript
_frostwyrmId = (me->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER;
// Increase add count
if (!me->isDead())
{
_instance->SetData(_frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade
Reset();
}
}
void Reset()
@@ -1344,6 +1367,9 @@ class spell_frostwarden_handler_order_whelp : public SpellScriptLoader
++itr;
}
if (unitList.empty())
return;
Unit* target = SelectRandomContainerElement(unitList);
unitList.clear();
unitList.push_back(target);
@@ -1356,7 +1382,10 @@ class spell_frostwarden_handler_order_whelp : public SpellScriptLoader
std::list<Creature*> unitList;
GetCreatureListWithEntryInGrid(unitList, GetCaster(), NPC_FROSTWING_WHELP, 150.0f);
if (Creature* creature = GetCaster()->ToCreature())
unitList.remove_if (OrderWhelpTargetSelector(creature));
unitList.remove_if(OrderWhelpTargetSelector(creature));
if (unitList.empty())
return;
SelectRandomContainerElement(unitList)->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
}
@@ -279,13 +279,9 @@ class instance_icecrown_citadel : public InstanceMapScript
break;
case NPC_SPINESTALKER:
SpinestalkerGUID = creature->GetGUID();
if (!creature->isDead())
++FrostwyrmCount;
break;
case NPC_RIMEFANG:
RimefangGUID = creature->GetGUID();
if (!creature->isDead())
++FrostwyrmCount;
break;
case NPC_THE_LICH_KING:
TheLichKingGUID = creature->GetGUID();
+5 -5
View File
@@ -29,8 +29,8 @@ enum DeathKnightSpells
DK_SPELL_RUNIC_POWER_ENERGIZE = 49088,
DK_SPELL_ANTI_MAGIC_SHELL_TALENT = 51052,
DK_SPELL_CORPSE_EXPLOSION_TRIGGERED = 43999,
DK_SPELL_CORPSE_EXPLOSION_VISUAL = 51270,
DK_SPELL_GHOUL_EXPLODE = 47496,
DISPLAY_GHOUL_CORPSE = 25537,
DK_SPELL_SCOURGE_STRIKE_TRIGGERED = 70890,
DK_SPELL_BLOOD_BOIL_TRIGGERED = 65658,
DK_SPELL_WILL_OF_THE_NECROPOLIS_TALENT_R1 = 49189,
@@ -208,6 +208,8 @@ class spell_dk_corpse_explosion : public SpellScriptLoader
return false;
if (!sSpellMgr->GetSpellInfo(DK_SPELL_GHOUL_EXPLODE))
return false;
if (!sSpellMgr->GetSpellInfo(DK_SPELL_CORPSE_EXPLOSION_VISUAL))
return false;
return true;
}
@@ -227,9 +229,9 @@ class spell_dk_corpse_explosion : public SpellScriptLoader
GetCaster()->CastCustomSpell(unitTarget, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), &bp, NULL, NULL, true);
// Corpse Explosion (Suicide)
unitTarget->CastSpell(unitTarget, DK_SPELL_CORPSE_EXPLOSION_TRIGGERED, true);
// Set corpse look
unitTarget->SetDisplayId(DISPLAY_GHOUL_CORPSE + urand(0, 3));
}
// Set corpse look
GetCaster()->CastSpell(unitTarget, DK_SPELL_CORPSE_EXPLOSION_VISUAL, true);
}
}
@@ -261,8 +263,6 @@ class spell_dk_ghoul_explode : public SpellScriptLoader
{
// Corpse Explosion (Suicide)
unitTarget->CastSpell(unitTarget, DK_SPELL_CORPSE_EXPLOSION_TRIGGERED, true);
// Set corpse look
unitTarget->SetDisplayId(DISPLAY_GHOUL_CORPSE + urand(0, 3));
}
}