aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent_Michael <Vincent_Michael@gmx.de>2014-01-26 18:22:06 +0100
committerVincent_Michael <Vincent_Michael@gmx.de>2014-01-26 18:22:06 +0100
commit7cc482855421a6d6cc02c5ed9148cfde543ba8d6 (patch)
treeed54bedb7e9d0c88fa9d4326426eb1f4aef786ce /src
parentbdc150ebbd06e5f83b893d3771677f2e670c87d5 (diff)
parent79a2a0c434d24c7bf65a0625fad9dfe87533e2fd (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Spells/Spell.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp src/server/scripts/Spells/spell_paladin.cpp src/server/scripts/Spells/spell_priest.cpp src/server/scripts/Spells/spell_shaman.cpp src/server/scripts/Spells/spell_warrior.cpp
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp3
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp16
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp53
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp24
-rw-r--r--src/server/game/Entities/Unit/Unit.h24
-rw-r--r--src/server/game/Handlers/SkillHandler.cpp3
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp10
-rw-r--r--src/server/game/Spells/Spell.cpp197
-rw-r--r--src/server/game/Spells/SpellMgr.cpp6
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp7
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp60
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp57
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp6
-rw-r--r--src/server/scripts/Spells/spell_item.cpp35
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp70
-rw-r--r--src/server/scripts/Spells/spell_pet.cpp3
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp151
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp5
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp13
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp39
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp2
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp2
23 files changed, 514 insertions, 274 deletions
diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp
index e30b2948938..8c2d60aac5f 100644
--- a/src/server/game/Calendar/CalendarMgr.cpp
+++ b/src/server/game/Calendar/CalendarMgr.cpp
@@ -340,7 +340,8 @@ CalendarEventStore CalendarMgr::GetPlayerEvents(uint64 guid)
for (CalendarEventInviteStore::const_iterator itr = _invites.begin(); itr != _invites.end(); ++itr)
for (CalendarInviteStore::const_iterator itr2 = itr->second.begin(); itr2 != itr->second.end(); ++itr2)
if ((*itr2)->GetInviteeGUID() == guid)
- events.insert(GetEvent(itr->first));
+ if (CalendarEvent* event = GetEvent(itr->first)) // NULL check added as attempt to fix #11512
+ events.insert(event);
if (Player* player = ObjectAccessor::FindPlayer(guid))
for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr)
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index d9157233f0f..d8c310aa055 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2210,3 +2210,19 @@ void GameObject::GetRespawnPosition(float &x, float &y, float &z, float* ori /*
if (ori)
*ori = GetOrientation();
}
+
+float GameObject::GetInteractionDistance()
+{
+ switch (GetGoType())
+ {
+ /// @todo find out how the client calculates the maximal usage distance to spellless working
+ // gameobjects like guildbanks and mailboxes - 10.0 is a just an abitrary choosen number
+ case GAMEOBJECT_TYPE_GUILD_BANK:
+ case GAMEOBJECT_TYPE_MAILBOX:
+ return 10.0f;
+ case GAMEOBJECT_TYPE_FISHINGHOLE:
+ return 20.0f + CONTACT_DISTANCE; // max spell range
+ default:
+ return INTERACTION_DISTANCE;
+ }
+}
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index fea5d2f37fc..aade937cc6d 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -831,6 +831,8 @@ class GameObject : public WorldObject, public GridObject<GameObject>, public Map
float GetStationaryZ() const { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MO_TRANSPORT) return m_stationaryPosition.GetPositionZ(); return GetPositionZ(); }
float GetStationaryO() const { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MO_TRANSPORT) return m_stationaryPosition.GetOrientation(); return GetOrientation(); }
+ float GetInteractionDistance();
+
protected:
bool AIM_Initialize();
void UpdateModel(); // updates model in case displayId were changed
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index d57d1312add..2324057169a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2705,43 +2705,44 @@ void Player::RegenerateHealth()
return;
float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
- float addvalue = 0.0f;
+ float addValue = 0.0f;
// polymorphed case
if (IsPolymorphed())
- addvalue = (float)GetMaxHealth()/3;
+ addValue = float(GetMaxHealth()) / 3.0f;
// normal regen case (maybe partly in combat case)
else if (!IsInCombat() || HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))
{
- addvalue = HealthIncreaseRate;
+ addValue = HealthIncreaseRate;
+
if (!IsInCombat())
{
if (getLevel() < 15)
- addvalue = (0.20f*((float)GetMaxHealth())/getLevel()*HealthIncreaseRate);
+ addValue = (0.20f * ((float)GetMaxHealth()) / getLevel() * HealthIncreaseRate);
else
- addvalue = 0.015f*((float)GetMaxHealth())*HealthIncreaseRate;
+ addValue = 0.015f * ((float)GetMaxHealth()) * HealthIncreaseRate;
AuraEffectList const& mModHealthRegenPct = GetAuraEffectsByType(SPELL_AURA_MOD_HEALTH_REGEN_PERCENT);
for (AuraEffectList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
- AddPct(addvalue, (*i)->GetAmount());
+ AddPct(addValue, (*i)->GetAmount());
- addvalue += GetTotalAuraModifier(SPELL_AURA_MOD_REGEN) * 2 * IN_MILLISECONDS / (5 * IN_MILLISECONDS);
+ addValue += GetTotalAuraModifier(SPELL_AURA_MOD_REGEN) * 0.4f;
}
else if (HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))
- ApplyPct(addvalue, GetTotalAuraModifier(SPELL_AURA_MOD_REGEN_DURING_COMBAT));
+ ApplyPct(addValue, GetTotalAuraModifier(SPELL_AURA_MOD_REGEN_DURING_COMBAT));
if (!IsStandState())
- addvalue *= 1.5f;
+ addValue *= 1.5f;
}
// always regeneration bonus (including combat)
- addvalue += GetTotalAuraModifier(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT);
- addvalue += m_baseHealthRegen / 2.5f;
+ addValue += GetTotalAuraModifier(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT);
+ addValue += m_baseHealthRegen / 2.5f;
- if (addvalue < 0)
- addvalue = 0;
+ if (addValue < 0.0f)
+ addValue = 0.0f;
- ModifyHealth(int32(addvalue));
+ ModifyHealth(int32(addValue));
}
void Player::ResetAllPowers()
@@ -2844,30 +2845,14 @@ GameObject* Player::GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes
{
if (go->GetGoType() == type)
{
- float maxdist;
- switch (type)
- {
- /// @todo find out how the client calculates the maximal usage distance to spellless working
- // gameobjects like guildbanks and mailboxes - 10.0 is a just an abitrary choosen number
- case GAMEOBJECT_TYPE_GUILD_BANK:
- case GAMEOBJECT_TYPE_MAILBOX:
- maxdist = 10.0f;
- break;
- case GAMEOBJECT_TYPE_FISHINGHOLE:
- maxdist = 20.0f+CONTACT_DISTANCE; // max spell range
- break;
- default:
- maxdist = INTERACTION_DISTANCE;
- break;
- }
-
- if (go->IsWithinDistInMap(this, maxdist))
+ if (go->IsWithinDistInMap(this, go->GetInteractionDistance()))
return go;
- TC_LOG_DEBUG("maps", "IsGameObjectOfTypeInRange: GameObject '%s' [GUID: %u] is too far away from player %s [GUID: %u] to be used by him (distance=%f, maximal 10 is allowed)", go->GetGOInfo()->name.c_str(),
+ TC_LOG_DEBUG("maps", "GetGameObjectIfCanInteractWith: GameObject '%s' [GUID: %u] is too far away from player %s [GUID: %u] to be used by him (distance=%f, maximal 10 is allowed)", go->GetGOInfo()->name.c_str(),
go->GetGUIDLow(), GetName().c_str(), GetGUIDLow(), go->GetDistance(this));
}
}
+
return NULL;
}
@@ -17233,7 +17218,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
// init saved position, and fix it later if problematic
uint32 transLowGUID = uint32(fields[31].GetUInt32());
-
+
Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat());
uint32 mapId = fields[15].GetUInt16();
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index a1745d4473d..49b7543da85 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -7901,9 +7901,7 @@ void Unit::SetMinion(Minion *minion, bool apply)
}
if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
- {
SetCritterGUID(minion->GetGUID());
- }
// PvP, FFAPvP
minion->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
@@ -11506,12 +11504,14 @@ void Unit::SetLevel(uint8 lvl)
{
SetUInt32Value(UNIT_FIELD_LEVEL, lvl);
- // group update
- if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->GetGroup())
- ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_LEVEL);
+ if (Player* player = ToPlayer())
+ {
+ // group update
+ if (player->GetGroup())
+ player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_LEVEL);
- if (GetTypeId() == TYPEID_PLAYER)
- sWorld->UpdateCharacterNameDataLevel(ToPlayer()->GetGUIDLow(), lvl);
+ sWorld->UpdateCharacterNameDataLevel(GetGUIDLow(), lvl);
+ }
}
void Unit::SetHealth(uint32 val)
@@ -16152,19 +16152,21 @@ bool Unit::SetHover(bool enable, bool packetOnly /*= false*/)
if (enable == HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
return false;
+ float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
+
if (enable)
{
//! No need to check height on ascent
AddUnitMovementFlag(MOVEMENTFLAG_HOVER);
- if (float hh = GetFloatValue(UNIT_FIELD_HOVERHEIGHT))
- UpdateHeight(GetPositionZ() + hh);
+ if (hoverHeight)
+ UpdateHeight(GetPositionZ() + hoverHeight);
}
else
{
RemoveUnitMovementFlag(MOVEMENTFLAG_HOVER);
- if (float hh = GetFloatValue(UNIT_FIELD_HOVERHEIGHT))
+ if (hoverHeight)
{
- float newZ = GetPositionZ() - hh;
+ float newZ = GetPositionZ() - hoverHeight;
UpdateAllowedPositionZ(GetPositionX(), GetPositionY(), newZ);
UpdateHeight(newZ);
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index eb078a1a706..ac892373a86 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2273,12 +2273,23 @@ namespace Trinity
{
public:
PowerPctOrderPred(Powers power, bool ascending = true) : _power(power), _ascending(ascending) { }
- bool operator() (Unit const* a, Unit const* b) const
+
+ bool operator()(WorldObject const* objA, WorldObject const* objB) const
+ {
+ Unit const* a = objA->ToUnit();
+ Unit const* b = objB->ToUnit();
+ float rA = (a && a->GetMaxPower(_power)) ? float(a->GetPower(_power)) / float(a->GetMaxPower(_power)) : 0.0f;
+ float rB = (b && b->GetMaxPower(_power)) ? float(b->GetPower(_power)) / float(b->GetMaxPower(_power)) : 0.0f;
+ return _ascending ? rA < rB : rA > rB;
+ }
+
+ bool operator()(Unit const* a, Unit const* b) const
{
float rA = a->GetMaxPower(_power) ? float(a->GetPower(_power)) / float(a->GetMaxPower(_power)) : 0.0f;
float rB = b->GetMaxPower(_power) ? float(b->GetPower(_power)) / float(b->GetMaxPower(_power)) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}
+
private:
Powers const _power;
bool const _ascending;
@@ -2289,12 +2300,23 @@ namespace Trinity
{
public:
HealthPctOrderPred(bool ascending = true) : _ascending(ascending) { }
+
+ bool operator()(WorldObject const* objA, WorldObject const* objB) const
+ {
+ Unit const* a = objA->ToUnit();
+ Unit const* b = objB->ToUnit();
+ float rA = (a && a->GetMaxHealth()) ? float(a->GetHealth()) / float(a->GetMaxHealth()) : 0.0f;
+ float rB = (b && b->GetMaxHealth()) ? float(b->GetHealth()) / float(b->GetMaxHealth()) : 0.0f;
+ return _ascending ? rA < rB : rA > rB;
+ }
+
bool operator() (Unit const* a, Unit const* b) const
{
float rA = a->GetMaxHealth() ? float(a->GetHealth()) / float(a->GetMaxHealth()) : 0.0f;
float rB = b->GetMaxHealth() ? float(b->GetHealth()) / float(b->GetMaxHealth()) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}
+
private:
bool const _ascending;
};
diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp
index 72587fec552..2108b654d6b 100644
--- a/src/server/game/Handlers/SkillHandler.cpp
+++ b/src/server/game/Handlers/SkillHandler.cpp
@@ -88,6 +88,9 @@ void WorldSession::HandleTalentWipeConfirmOpcode(WorldPacket& recvData)
return;
}
+ if (!unit->isCanTrainingAndResetTalentsOf(_player))
+ return;
+
// remove fake death
if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 6386b3b4345..04e64634d88 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -285,19 +285,21 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket)
void WorldSession::HandleGameObjectUseOpcode(WorldPacket& recvData)
{
uint64 guid;
-
recvData >> guid;
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_GAMEOBJ_USE Message [guid=%u]", GUID_LOPART(guid));
if (GameObject* obj = GetPlayer()->GetMap()->GetGameObject(guid))
{
+ if (!obj->IsWithinDistInMap(GetPlayer(), obj->GetInteractionDistance()))
+ return;
+
// ignore for remote control state
- if (_player->m_mover != _player)
- if (!(_player->IsOnVehicle(_player->m_mover) || _player->IsMounted()) && !obj->GetGOInfo()->IsUsableMounted())
+ if (GetPlayer()->m_mover != GetPlayer())
+ if (!(GetPlayer()->IsOnVehicle(GetPlayer()->m_mover) || GetPlayer()->IsMounted()) && !obj->GetGOInfo()->IsUsableMounted())
return;
- obj->Use(_player);
+ obj->Use(GetPlayer());
}
}
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index a526be904a3..f1a58cb7e91 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1144,6 +1144,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge
ASSERT(false && "Spell::SelectImplicitAreaTargets: received not implemented target reference type");
return;
}
+
if (!referer)
return;
@@ -1165,6 +1166,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge
ASSERT(false && "Spell::SelectImplicitAreaTargets: received not implemented target reference type");
return;
}
+
std::list<WorldObject*> targets;
float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod;
SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), m_spellInfo->Effects[effIndex].ImplicitTargetConditions);
@@ -1242,142 +1244,19 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge
CallScriptObjectAreaTargetSelectHandlers(targets, effIndex);
- std::list<Unit*> unitTargets;
- std::list<GameObject*> gObjTargets;
- // for compability with older code - add only unit and go targets
- /// @todo remove this
- for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
- {
- if (Unit* unitTarget = (*itr)->ToUnit())
- unitTargets.push_back(unitTarget);
- else if (GameObject* gObjTarget = (*itr)->ToGameObject())
- gObjTargets.push_back(gObjTarget);
- }
-
- if (!unitTargets.empty())
+ if (!targets.empty())
{
- // Special target selection for smart heals and energizes
- uint32 maxSize = 0;
- int32 power = -1;
- switch (m_spellInfo->SpellFamilyName)
- {
- case SPELLFAMILY_GENERIC:
- switch (m_spellInfo->Id)
- {
- case 52759: // Ancestral Awakening
- case 71610: // Echoes of Light (Althor's Abacus normal version)
- case 71641: // Echoes of Light (Althor's Abacus heroic version)
- maxSize = 1;
- power = POWER_HEALTH;
- break;
- case 54968: // Glyph of Holy Light
- maxSize = m_spellInfo->MaxAffectedTargets;
- power = POWER_HEALTH;
- break;
- case 57669: // Replenishment
- // In arenas Replenishment may only affect the caster
- if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->InArena())
- {
- unitTargets.clear();
- unitTargets.push_back(m_caster);
- break;
- }
- maxSize = 10;
- power = POWER_MANA;
- break;
- default:
- break;
- }
- break;
- case SPELLFAMILY_PRIEST:
- if (m_spellInfo->SpellFamilyFlags[0] == 0x10000000) // Circle of Healing
- {
- maxSize = m_caster->HasAura(55675) ? 6 : 5; // Glyph of Circle of Healing
- power = POWER_HEALTH;
- }
- else if (m_spellInfo->Id == 64844) // Divine Hymn
- {
- maxSize = 3;
- power = POWER_HEALTH;
- }
- else if (m_spellInfo->Id == 64904) // Hymn of Hope
- {
- maxSize = 3;
- power = POWER_MANA;
- }
- else
- break;
-
- // Remove targets outside caster's raid
- for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end();)
- {
- if (!(*itr)->IsInRaidWith(m_caster))
- itr = unitTargets.erase(itr);
- else
- ++itr;
- }
- break;
- case SPELLFAMILY_DRUID:
- if (m_spellInfo->SpellFamilyFlags[1] == 0x04000000) // Wild Growth
- {
- maxSize = m_caster->HasAura(62970) ? 6 : 5; // Glyph of Wild Growth
- power = POWER_HEALTH;
- }
- else
- break;
-
- // Remove targets outside caster's raid
- for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end();)
- if (!(*itr)->IsInRaidWith(m_caster))
- itr = unitTargets.erase(itr);
- else
- ++itr;
- break;
- default:
- break;
- }
-
- if (maxSize && power != -1)
- {
- if (Powers(power) == POWER_HEALTH)
- {
- if (unitTargets.size() > maxSize)
- {
- unitTargets.sort(Trinity::HealthPctOrderPred());
- unitTargets.resize(maxSize);
- }
- }
- else
- {
- for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end();)
- if ((*itr)->getPowerType() != (Powers)power)
- itr = unitTargets.erase(itr);
- else
- ++itr;
-
- if (unitTargets.size() > maxSize)
- {
- unitTargets.sort(Trinity::PowerPctOrderPred((Powers)power));
- unitTargets.resize(maxSize);
- }
- }
- }
-
// Other special target selection goes here
if (uint32 maxTargets = m_spellValue->MaxAffectedTargets)
- Trinity::Containers::RandomResizeList(unitTargets, maxTargets);
-
- for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end(); ++itr)
- AddUnitTarget(*itr, effMask, false);
- }
-
- if (!gObjTargets.empty())
- {
- if (uint32 maxTargets = m_spellValue->MaxAffectedTargets)
- Trinity::Containers::RandomResizeList(gObjTargets, maxTargets);
+ Trinity::Containers::RandomResizeList(targets, maxTargets);
- for (std::list<GameObject*>::iterator itr = gObjTargets.begin(); itr != gObjTargets.end(); ++itr)
- AddGOTarget(*itr, effMask);
+ for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
+ {
+ if (Unit* unitTarget = (*itr)->ToUnit())
+ AddUnitTarget(unitTarget, effMask, false);
+ else if (GameObject* gObjTarget = (*itr)->ToGameObject())
+ AddGOTarget(gObjTarget, effMask);
+ }
}
}
@@ -1411,33 +1290,33 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
break;
case TARGET_DEST_CASTER_FISHING:
{
- float min_dis = m_spellInfo->GetMinRange(true);
- float max_dis = m_spellInfo->GetMaxRange(true);
- float dis = (float)rand_norm() * (max_dis - min_dis) + min_dis;
- float x, y, z, angle;
- angle = (float)rand_norm() * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f);
- m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dis, angle);
-
- float ground = z;
- float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground);
- if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level
- {
- SendCastResult(SPELL_FAILED_NOT_HERE);
- SendChannelUpdate(0);
- finish(false);
- return;
- }
-
- if (ground + 0.75 > liquidLevel)
- {
- SendCastResult(SPELL_FAILED_TOO_SHALLOW);
- SendChannelUpdate(0);
- finish(false);
- return;
- }
-
- dest = SpellDestination(x, y, liquidLevel, m_caster->GetOrientation());
- break;
+ float minDist = m_spellInfo->GetMinRange(true);
+ float maxDist = m_spellInfo->GetMaxRange(true);
+ float dist = frand(minDist, maxDist);
+ float x, y, z;
+ float angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f);
+ m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dist, angle);
+
+ float ground = z;
+ float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground);
+ if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level
+ {
+ SendCastResult(SPELL_FAILED_NOT_HERE);
+ SendChannelUpdate(0);
+ finish(false);
+ return;
+ }
+
+ if (ground + 0.75 > liquidLevel)
+ {
+ SendCastResult(SPELL_FAILED_TOO_SHALLOW);
+ SendChannelUpdate(0);
+ finish(false);
+ return;
+ }
+
+ dest = SpellDestination(x, y, liquidLevel, m_caster->GetOrientation());
+ break;
}
default:
{
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index bac84951e21..104d9feb5fd 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2928,12 +2928,18 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
case 2589:
case 2590:
case 2591:
+ case 7159:
+ case 8627:
case 8721:
case 11279:
case 11280:
case 11281:
+ case 15582:
+ case 15657:
+ case 22416:
case 25300:
case 26863:
+ case 37685:
case 48656:
case 48657:
case 703: // Garrote
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index af2e0c57b5a..76f2461bb28 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -138,13 +138,12 @@ class spell_dk_anti_magic_shell_self : public SpellScriptLoader
absorbAmount = std::min(CalculatePct(dmgInfo.GetDamage(), absorbPct), GetTarget()->CountPctFromMaxHealth(hpPct));
}
- void Trigger(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
+ void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
{
- Unit* target = GetTarget();
// damage absorbed by Anti-Magic Shell energizes the DK with additional runic power.
// This, if I'm not mistaken, shows that we get back ~20% of the absorbed damage as runic power.
- int32 bp = absorbAmount * 2 / 10;
- target->CastCustomSpell(target, SPELL_DK_RUNIC_POWER_ENERGIZE, &bp, NULL, NULL, true, NULL, aurEff);
+ int32 bp = CalculatePct(absorbAmount, 20);
+ GetTarget()->CastCustomSpell(SPELL_DK_RUNIC_POWER_ENERGIZE, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff);
}
void Register() OVERRIDE
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index 20d16dcb3e7..575c2fe2860 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -1152,6 +1152,65 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
}
};
+class RaidCheck
+{
+ public:
+ explicit RaidCheck(Unit const* caster) : _caster(caster) { }
+
+ bool operator()(WorldObject* obj) const
+ {
+ if (Unit* target = obj->ToUnit())
+ return !_caster->IsInRaidWith(target);
+
+ return true;
+ }
+
+ private:
+ Unit const* _caster;
+};
+
+// -48438 - Wild Growth
+class spell_dru_wild_growth : public SpellScriptLoader
+{
+ public:
+ spell_dru_wild_growth() : SpellScriptLoader("spell_dru_wild_growth") { }
+
+ class spell_dru_wild_growth_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dru_wild_growth_SpellScript);
+
+ bool Validate(SpellInfo const* spellInfo) OVERRIDE
+ {
+ if (spellInfo->Effects[EFFECT_2].IsEffect() || !spellInfo->Effects[EFFECT_2].CalcValue())
+ return false;
+ return true;
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove_if(RaidCheck(GetCaster()));
+
+ int32 const maxTargets = GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster());
+
+ if (targets.size() > uint32(maxTargets))
+ {
+ targets.sort(Trinity::HealthPctOrderPred());
+ targets.resize(maxTargets);
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_wild_growth_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_dru_wild_growth_SpellScript();
+ }
+};
+
void AddSC_druid_spell_scripts()
{
new spell_dru_dash();
@@ -1179,4 +1238,5 @@ void AddSC_druid_spell_scripts()
new spell_dru_tiger_s_fury();
new spell_dru_typhoon();
new spell_dru_t10_restoration_4p_bonus();
+ new spell_dru_wild_growth();
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 7fff06a0073..891f578e73e 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -2796,22 +2796,65 @@ enum Replenishment
SPELL_INFINITE_REPLENISHMENT = 61782
};
+class ReplenishmentCheck
+{
+public:
+ bool operator()(WorldObject* obj) const
+ {
+ if (Unit* target = obj->ToUnit())
+ return target->getPowerType() != POWER_MANA;
+
+ return true;
+ }
+};
+
class spell_gen_replenishment : public SpellScriptLoader
{
public:
spell_gen_replenishment() : SpellScriptLoader("spell_gen_replenishment") { }
- class spell_gen_replenishment_AuraScript : public AuraScript
+ class spell_gen_replenishment_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_gen_replenishment_AuraScript);
+ PrepareSpellScript(spell_gen_replenishment_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ void RemoveInvalidTargets(std::list<WorldObject*>& targets)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT) ||
- !sSpellMgr->GetSpellInfo(SPELL_INFINITE_REPLENISHMENT))
- return false;
- return true;
+ // In arenas Replenishment may only affect the caster
+ if (Player* caster = GetCaster()->ToPlayer())
+ {
+ if (caster->InArena())
+ {
+ targets.clear();
+ targets.push_back(caster);
+ return;
+ }
+ }
+
+ targets.remove_if(ReplenishmentCheck());
+
+ uint8 const maxTargets = 10;
+
+ if (targets.size() > maxTargets)
+ {
+ targets.sort(Trinity::PowerPctOrderPred(POWER_MANA));
+ targets.resize(maxTargets);
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_replenishment_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID);
}
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_gen_replenishment_SpellScript();
+ }
+
+ class spell_gen_replenishment_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_replenishment_AuraScript);
bool Load() OVERRIDE
{
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index 08aa19a4755..e066c8eb008 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -303,7 +303,7 @@ class spell_pilgrims_bounty_buff_food : public SpellScriptLoader
public:
spell_pilgrims_bounty_buff_food_AuraScript(uint32 triggeredSpellId) : AuraScript(), _triggeredSpellId(triggeredSpellId) { }
- bool Load()
+ bool Load() OVERRIDE
{
_handled = false;
return true;
@@ -318,7 +318,7 @@ class spell_pilgrims_bounty_buff_food : public SpellScriptLoader
GetTarget()->CastSpell(GetTarget(), _triggeredSpellId, true);
}
- void Register()
+ void Register() OVERRIDE
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_pilgrims_bounty_buff_food_AuraScript::HandleTriggerSpell, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
@@ -326,7 +326,7 @@ class spell_pilgrims_bounty_buff_food : public SpellScriptLoader
bool _handled;
};
- AuraScript* GetAuraScript() const
+ AuraScript* GetAuraScript() const OVERRIDE
{
return new spell_pilgrims_bounty_buff_food_AuraScript(_triggeredSpellId);
}
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 61aba46f001..d8d70246e99 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -349,6 +349,40 @@ class spell_item_deviate_fish : public SpellScriptLoader
}
};
+// 71610, 71641 - Echoes of Light (Althor's Abacus)
+class spell_item_echoes_of_light : public SpellScriptLoader
+{
+ public:
+ spell_item_echoes_of_light() : SpellScriptLoader("spell_item_echoes_of_light") { }
+
+ class spell_item_echoes_of_light_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_echoes_of_light_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.size() < 2)
+ return;
+
+ targets.sort(Trinity::HealthPctOrderPred());
+
+ WorldObject* target = targets.front();
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_echoes_of_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_item_echoes_of_light_SpellScript();
+ }
+};
+
// http://www.wowhead.com/item=47499 Flask of the North
// 67019 Flask of the North
enum FlaskOfTheNorthSpells
@@ -2526,6 +2560,7 @@ void AddSC_item_spell_scripts()
new spell_item_defibrillate("spell_item_gnomish_army_knife", 33);
new spell_item_desperate_defense();
new spell_item_deviate_fish();
+ new spell_item_echoes_of_light();
new spell_item_flask_of_the_north();
new spell_item_gnomish_death_ray();
new spell_item_make_a_wish();
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 991852c0547..f548255e554 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -524,6 +524,42 @@ class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader
}
};
+// -9799 - Eye for an Eye
+class spell_pal_eye_for_an_eye : public SpellScriptLoader
+{
+ public:
+ spell_pal_eye_for_an_eye() : SpellScriptLoader("spell_pal_eye_for_an_eye") { }
+
+ class spell_pal_eye_for_an_eye_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_eye_for_an_eye_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE))
+ return false;
+ return true;
+ }
+
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 damage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::HandleEffectProc, EFFECT_0, m_scriptSpellId == SPELL_PALADIN_EYE_FOR_AN_EYE_RANK_1 ? SPELL_AURA_DUMMY : SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_pal_eye_for_an_eye_AuraScript();
+ }
+};
+
// -75806 - Grand Crusader
class spell_pal_grand_crusader : public SpellScriptLoader
{
@@ -564,39 +600,36 @@ class spell_pal_grand_crusader : public SpellScriptLoader
}
};
-// -9799 - Eye for an Eye
-class spell_pal_eye_for_an_eye : public SpellScriptLoader
+// 54968 - Glyph of Holy Light
+class spell_pal_glyph_of_holy_light : public SpellScriptLoader
{
public:
- spell_pal_eye_for_an_eye() : SpellScriptLoader("spell_pal_eye_for_an_eye") { }
+ spell_pal_glyph_of_holy_light() : SpellScriptLoader("spell_pal_glyph_of_holy_light") { }
- class spell_pal_eye_for_an_eye_AuraScript : public AuraScript
+ class spell_pal_glyph_of_holy_light_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_pal_eye_for_an_eye_AuraScript);
+ PrepareSpellScript(spell_pal_glyph_of_holy_light_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ void FilterTargets(std::list<WorldObject*>& targets)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE))
- return false;
- return true;
- }
+ uint32 const maxTargets = GetSpellInfo()->MaxAffectedTargets;
- void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- int32 damage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
- GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ if (targets.size() > maxTargets)
+ {
+ targets.sort(Trinity::HealthPctOrderPred());
+ targets.resize(maxTargets);
+ }
}
void Register() OVERRIDE
{
- OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::HandleEffectProc, EFFECT_0, m_scriptSpellId == SPELL_PALADIN_EYE_FOR_AN_EYE_RANK_1 ? SPELL_AURA_DUMMY : SPELL_AURA_PROC_TRIGGER_SPELL);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_glyph_of_holy_light_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
}
};
- AuraScript* GetAuraScript() const OVERRIDE
+ SpellScript* GetSpellScript() const OVERRIDE
{
- return new spell_pal_eye_for_an_eye_AuraScript();
+ return new spell_pal_glyph_of_holy_light_SpellScript();
}
};
@@ -1073,6 +1106,7 @@ void AddSC_paladin_spell_scripts()
new spell_pal_divine_storm_dummy();
new spell_pal_exorcism_and_holy_wrath_damage();
new spell_pal_eye_for_an_eye();
+ new spell_pal_glyph_of_holy_light();
new spell_pal_grand_crusader();
new spell_pal_hand_of_sacrifice();
new spell_pal_holy_shock();
diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp
index 3877fe22bac..7c8a725ca08 100644
--- a/src/server/scripts/Spells/spell_pet.cpp
+++ b/src/server/scripts/Spells/spell_pet.cpp
@@ -1477,9 +1477,8 @@ public:
// Ravenous Dead. Check just if owner has Ravenous Dead since it's effect is not an aura
if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0))
- {
mod += aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue()/100; // Ravenous Dead edits the original scale
- }
+
// Glyph of the Ghoul
if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_DEATH_KNIGHT_GLYPH_OF_GHOUL, 0))
mod += aurEff->GetAmount()/100;
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index b923c43716e..678ad54955a 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -37,6 +37,7 @@ enum PriestSpells
SPELL_PRIEST_DISPEL_MAGIC_HOSTILE = 97691,
SPELL_PRIEST_DIVINE_AEGIS = 47753,
SPELL_PRIEST_DIVINE_TOUCH = 63544,
+ SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING = 55675,
SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC = 55677,
SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL = 56131,
SPELL_PRIEST_GLYPH_OF_LIGHTWELL = 55673,
@@ -75,6 +76,40 @@ enum MiscSpells
SPELL_GEN_REPLENISHMENT = 57669
};
+class PowerCheck
+{
+ public:
+ explicit PowerCheck(Powers power) : _power(power) { }
+
+ bool operator()(WorldObject* obj) const
+ {
+ if (Unit* target = obj->ToUnit())
+ return target->getPowerType() != _power;
+
+ return true;
+ }
+
+ private:
+ Powers _power;
+};
+
+class RaidCheck
+{
+ public:
+ explicit RaidCheck(Unit const* caster) : _caster(caster) { }
+
+ bool operator()(WorldObject* obj) const
+ {
+ if (Unit* target = obj->ToUnit())
+ return !_caster->IsInRaidWith(target);
+
+ return true;
+ }
+
+ private:
+ Unit const* _caster;
+};
+
class spell_pri_body_and_soul : public SpellScriptLoader
{
public:
@@ -126,6 +161,48 @@ class spell_pri_body_and_soul : public SpellScriptLoader
}
};
+// 34861 - Circle of Healing
+class spell_pri_circle_of_healing : public SpellScriptLoader
+{
+ public:
+ spell_pri_circle_of_healing() : SpellScriptLoader("spell_pri_circle_of_healing") { }
+
+ class spell_pri_circle_of_healing_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pri_circle_of_healing_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING))
+ return false;
+ return true;
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove_if(RaidCheck(GetCaster()));
+
+ uint32 const maxTargets = GetCaster()->HasAura(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING) ? 6 : 5; // Glyph of Circle of Healing
+
+ if (targets.size() > maxTargets)
+ {
+ targets.sort(Trinity::HealthPctOrderPred());
+ targets.resize(maxTargets);
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_circle_of_healing_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_pri_circle_of_healing_SpellScript();
+ }
+};
+
// 527 - Dispel magic
class spell_pri_dispel_magic : public SpellScriptLoader
{
@@ -235,6 +312,41 @@ class spell_pri_divine_aegis : public SpellScriptLoader
}
};
+// 64844 - Divine Hymn
+class spell_pri_divine_hymn : public SpellScriptLoader
+{
+ public:
+ spell_pri_divine_hymn() : SpellScriptLoader("spell_pri_divine_hymn") { }
+
+ class spell_pri_divine_hymn_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pri_divine_hymn_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove_if(RaidCheck(GetCaster()));
+
+ uint32 const maxTargets = 3;
+
+ if (targets.size() > maxTargets)
+ {
+ targets.sort(Trinity::HealthPctOrderPred());
+ targets.resize(maxTargets);
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_pri_divine_hymn_SpellScript();
+ }
+};
+
// 55680 - Glyph of Prayer of Healing
class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader
{
@@ -400,6 +512,42 @@ class spell_pri_guardian_spirit : public SpellScriptLoader
}
};
+// 64904 - Hymn of Hope
+class spell_pri_hymn_of_hope : public SpellScriptLoader
+{
+ public:
+ spell_pri_hymn_of_hope() : SpellScriptLoader("spell_pri_hymn_of_hope") { }
+
+ class spell_pri_hymn_of_hope_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pri_hymn_of_hope_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove_if(PowerCheck(POWER_MANA));
+ targets.remove_if(RaidCheck(GetCaster()));
+
+ uint32 const maxTargets = 3;
+
+ if (targets.size() > maxTargets)
+ {
+ targets.sort(Trinity::PowerPctOrderPred(POWER_MANA));
+ targets.resize(maxTargets);
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_hymn_of_hope_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_pri_hymn_of_hope_SpellScript();
+ }
+};
+
// 92833 - Leap of Faith
class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader
{
@@ -1077,9 +1225,12 @@ class spell_pri_vampiric_touch : public SpellScriptLoader
void AddSC_priest_spell_scripts()
{
new spell_pri_body_and_soul();
+ new spell_pri_circle_of_healing();
new spell_pri_dispel_magic();
new spell_pri_divine_aegis();
+ new spell_pri_divine_hymn();
new spell_pri_glyph_of_prayer_of_healing();
+ new spell_pri_hymn_of_hope();
new spell_pri_improved_power_word_shield();
new spell_pri_item_greater_heal_refund();
new spell_pri_guardian_spirit();
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 6c870bb55c4..7768ad7596c 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -339,10 +339,11 @@ class spell_rog_deadly_poison : public SpellScriptLoader
};
// 51690 - Killing Spree
+#define KillingSpreeScriptName "spell_rog_killing_spree"
class spell_rog_killing_spree : public SpellScriptLoader
{
public:
- spell_rog_killing_spree() : SpellScriptLoader("spell_rog_killing_spree") { }
+ spell_rog_killing_spree() : SpellScriptLoader(KillingSpreeScriptName) { }
class spell_rog_killing_spree_SpellScript : public SpellScript
{
@@ -358,7 +359,7 @@ class spell_rog_killing_spree : public SpellScriptLoader
{
if (Aura* aura = GetCaster()->GetAura(SPELL_ROGUE_KILLING_SPREE))
{
- if (spell_rog_killing_spree_AuraScript* script = dynamic_cast<spell_rog_killing_spree_AuraScript*>(aura->GetScriptByName("spell_rog_killing_spree")))
+ if (spell_rog_killing_spree_AuraScript* script = dynamic_cast<spell_rog_killing_spree_AuraScript*>(aura->GetScriptByName(KillingSpreeScriptName)))
script->AddTarget(GetHitUnit());
}
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index b8b481e0244..c3ea8ca2d62 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -126,6 +126,18 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader
return true;
}
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.size() < 2)
+ return;
+
+ targets.sort(Trinity::HealthPctOrderPred());
+
+ WorldObject* target = targets.front();
+ targets.clear();
+ targets.push_back(target);
+ }
+
void HandleDummy(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastCustomSpell(SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true);
@@ -133,6 +145,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader
void Register() OVERRIDE
{
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_ancestral_awakening_proc_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
OnEffectHitTarget += SpellEffectFn(spell_sha_ancestral_awakening_proc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index a844a4d7e69..3a8af5f0e17 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -330,39 +330,24 @@ class spell_warr_glyph_of_sunder_armor : public SpellScriptLoader
{
PrepareAuraScript(spell_warr_glyph_of_sunder_armor_AuraScript);
- bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SUNDER_ARMOR))
- return false;
- return true;
- }
-
- bool Load() OVERRIDE
+ void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
{
- _target = NULL;
- return true;
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- _target = GetTarget()->SelectNearbyTarget(eventInfo.GetProcTarget());
- return _target;
- }
+ if (!spellMod)
+ {
+ spellMod = new SpellModifier(aurEff->GetBase());
+ spellMod->op = SpellModOp(aurEff->GetMiscValue());
+ spellMod->type = SPELLMOD_FLAT;
+ spellMod->spellId = GetId();
+ spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask;
+ }
- void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(_target, SPELL_WARRIOR_SUNDER_ARMOR, true, NULL, aurEff);
+ spellMod->value = aurEff->GetAmount();
}
void Register() OVERRIDE
{
- DoCheckProc += AuraCheckProcFn(spell_warr_glyph_of_sunder_armor_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_warr_glyph_of_sunder_armor_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
+ DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warr_glyph_of_sunder_armor_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
}
-
- private:
- Unit * _target;
};
AuraScript* GetAuraScript() const OVERRIDE
@@ -638,7 +623,7 @@ class spell_warr_retaliation : public SpellScriptLoader
bool CheckProc(ProcEventInfo& eventInfo)
{
- // check attack comes not from behind
+ // check attack comes not from behind and warrior is not stunned
return GetTarget()->isInFront(eventInfo.GetProcTarget(), M_PI) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED);
}
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index 805926defa0..aa02d76fe47 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -340,7 +340,9 @@ namespace MMAP
/**************************************************************************/
void MapBuilder::buildMap(uint32 mapID)
{
+#ifndef __APPLE__
printf("[Thread %u] Building map %03u:\n", uint32(ACE_Thread::self()), mapID);
+#endif
std::set<uint32>* tiles = getTileList(mapID);
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index d2ca499d72a..fbb7cb87ebe 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -442,7 +442,7 @@ bool processArgv(int argc, char ** argv, const char *versionString)
{
hasInputPathParam = true;
strcpy(input_path, argv[i+1]);
- if (input_path[strlen(input_path) - 1] != '\\' || input_path[strlen(input_path) - 1] != '/')
+ if (input_path[strlen(input_path) - 1] != '\\' && input_path[strlen(input_path) - 1] != '/')
strcat(input_path, "/");
++i;
}