diff options
Diffstat (limited to 'src')
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; } |