aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMalcrom <malcromdev@gmail.com>2012-02-10 12:33:25 -0330
committerMalcrom <malcromdev@gmail.com>2012-02-10 12:33:25 -0330
commitbe64238b45bc5550fc61071ae4752c941b45d331 (patch)
tree5f03891228bcdba9c6986a49c0a81f540a894568 /src
parentcefececdf99764872b7f866f9e5c1441f32c7a52 (diff)
parent586a76e3a0345a86f0e372f59aef082580bd266a (diff)
Merge branch 'master' of git://github.com/TrinityCore/TrinityCore
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/AI/CoreAI/CombatAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rwxr-xr-xsrc/server/game/Conditions/ConditionMgr.cpp318
-rwxr-xr-xsrc/server/game/Conditions/ConditionMgr.h64
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.cpp10
-rwxr-xr-xsrc/server/game/Entities/Pet/Pet.cpp2
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp8
-rwxr-xr-xsrc/server/game/Entities/Transport/Transport.cpp2
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp8
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp3
-rwxr-xr-xsrc/server/game/Handlers/MiscHandler.cpp20
-rwxr-xr-xsrc/server/game/Handlers/QuestHandler.cpp4
-rwxr-xr-xsrc/server/game/Loot/LootMgr.cpp2
-rwxr-xr-xsrc/server/game/Maps/Map.cpp3
-rwxr-xr-xsrc/server/game/Scripting/ScriptMgr.cpp6
-rwxr-xr-xsrc/server/game/Scripting/ScriptMgr.h4
-rwxr-xr-xsrc/server/game/Server/WorldSession.cpp4
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp2
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp6
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp31
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp4
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp10
22 files changed, 321 insertions, 194 deletions
diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp
index 6ce8ce330cf..d8def36f999 100755
--- a/src/server/game/AI/CoreAI/CombatAI.cpp
+++ b/src/server/game/AI/CoreAI/CombatAI.cpp
@@ -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
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index a6923ea19e0..42a23236182 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -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);
}
}
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:
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 1641642dd86..1a666abbf2b 100755
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -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
{
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index c36dbc35249..040bd8b70dd 100755
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -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);*/
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index bf6dc3b67d9..566ee06218e 100755
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -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')",
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 38af97f61cb..c6ea26a2dfd 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -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);
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 891cf6b6697..a425640e36d 100755
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -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)
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 5b18713740f..3859c8dcafe 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -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());
- }
}
/*########################################
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index fc6c6cb063e..348ce132da8 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -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)
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index f109332e235..dbe2fc871bc 100755
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -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;
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index f9aa40cdcda..05d945d3a93 100755
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -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);
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index c9e8f68af52..89c13dd6b5c 100755
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -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);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 71fc2ef00a1..6e13e70d1cd 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -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>
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index d5e8f71e1fd..eccf12aa7e1 100755
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -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)
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index 60052bea0ea..853db564a6d 100755
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -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 */
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 6bd09f2b3a7..ab107fd0599 100755
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -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
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 45cf64266e1..9dccb0ff341 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -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;
}
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index d3fd3a6b117..6802cbdd90d 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -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);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index fb04d9ce7a4..1d9c3c14897 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -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);
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index 2a61d00d119..98f5c04ba42 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -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();
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index f62d62c671a..5c0f6bcce59 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -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));
}
}