diff options
| author | Nay <dnpd.dd@gmail.com> | 2012-09-06 18:01:51 +0100 |
|---|---|---|
| committer | Nay <dnpd.dd@gmail.com> | 2012-09-06 18:01:51 +0100 |
| commit | 0522e50c8670a34698b15003ceb5e514db72e427 (patch) | |
| tree | d6406bcbd2e836f5f08be8e67f1a01de4c938d48 /src/server/game | |
| parent | 42a899a90eabae2ce6fc8ca103e7692c07153315 (diff) | |
| parent | 9f09713b3e286ba94948c15d64b76b2aed16f8cd (diff) | |
Merge remote-tracking branch 'origin/master' into mmaps
Conflicts:
src/server/game/Spells/Spell.cpp
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Battlefield/Battlefield.cpp | 4 | ||||
| -rwxr-xr-x | src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp | 1 | ||||
| -rwxr-xr-x | src/server/game/Entities/GameObject/GameObject.cpp | 31 | ||||
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 73 | ||||
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.h | 3 | ||||
| -rwxr-xr-x | src/server/game/Handlers/BattleGroundHandler.cpp | 50 | ||||
| -rwxr-xr-x | src/server/game/Loot/LootMgr.cpp | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.cpp | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.cpp | 14 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.h | 1 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 24 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 2 |
14 files changed, 110 insertions, 106 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 0b8236908a0..a7660a0a44b 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -634,8 +634,11 @@ void SmartAI::SpellHitTarget(Unit* target, const SpellInfo* spellInfo) void SmartAI::DamageTaken(Unit* doneBy, uint32& damage) { GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage); - if ((me->GetHealth() - damage) <= mInvincibilityHpLevel) - damage = me->GetHealth() - mInvincibilityHpLevel; + if ((damage >= me->GetHealth() - mInvincibilityHpLevel) && (mInvincibilityHpLevel > 0)) + { + damage = 0; + me->SetHealth(mInvincibilityHpLevel); + } } void SmartAI::HealReceived(Unit* doneBy, uint32& addhealth) diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index c0cf64ead58..cd1f64d629f 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -451,8 +451,8 @@ WorldPacket Battlefield::BuildWarningAnnPacket(std::string msg) data << uint32(1); data << uint8(0); data << uint64(0); - data << uint32(strlen(msg.c_str()) + 1); - data << msg.c_str(); + data << uint32(msg.length() + 1); + data << msg; data << uint8(0); return data; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 8df6f93a082..e4803af8a21 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -731,7 +731,6 @@ void BattlegroundWS::Reset() _bothFlagsKept = false; _flagDebuffState = 0; _flagSpellForceTimer = 0; - _lastFlagCaptureTeam = 0; _flagsDropTimer[BG_TEAM_ALLIANCE] = 0; _flagsDropTimer[BG_TEAM_HORDE] = 0; _flagsTimer[BG_TEAM_ALLIANCE] = 0; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 751107ac011..808cbd9a5e4 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -133,13 +133,13 @@ void GameObject::AddToWorld() m_zoneScript->OnGameObjectCreate(this); sObjectAccessor->AddObject(this); - bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); + // The state can be changed after GameObject::Create but before GameObject::AddToWorld - bool toggledState = GetGOData() ? GetGOData()->go_state != GO_STATE_READY : false; + bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState() == GO_READY : GetGoState() == GO_STATE_READY; if (m_model) GetMap()->InsertGameObjectModel(*m_model); - EnableCollision(startOpen ^ toggledState); + EnableCollision(toggledState); WorldObject::AddToWorld(); } } @@ -1926,17 +1926,12 @@ void GameObject::SetLootState(LootState state, Unit* unit) sScriptMgr->OnGameObjectLootStateChanged(this, state, unit); if (m_model) { - // 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); - + bool collision = false; // Use the current go state - if (GetGoState() != GO_STATE_READY) - startOpen = !startOpen; + if ((GetGoState() != GO_STATE_READY && (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED)) || state == GO_READY) + collision = !collision; - if (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED) - EnableCollision(startOpen); - else if (state == GO_READY) - EnableCollision(!startOpen); + EnableCollision(collision); } } @@ -1950,12 +1945,11 @@ void GameObject::SetGoState(GOState state) return; // 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 (state != GO_STATE_READY) - startOpen = !startOpen; + bool collision = false; + if (state == GO_STATE_READY) + collision = !collision; - EnableCollision(startOpen); + EnableCollision(collision); } } @@ -1968,7 +1962,8 @@ void GameObject::SetDisplayId(uint32 displayid) void GameObject::SetPhaseMask(uint32 newPhaseMask, bool update) { WorldObject::SetPhaseMask(newPhaseMask, update); - EnableCollision(true); + if (m_model && m_model->isEnabled()) + EnableCollision(true); } void GameObject::EnableCollision(bool enable) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4c279cad9f4..a4c130193be 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -256,6 +256,7 @@ m_HostileRefManager(this), m_TempSpeed(0.0f), m_AutoRepeatFirstCast(false) _focusSpell = NULL; _targetLocked = false; _lastLiquid = NULL; + _isWalkingBeforeCharm = false; } //////////////////////////////////////////////////////////// @@ -380,9 +381,7 @@ void Unit::MonsterMoveWithSpeed(float x, float y, float z, float speed, bool gen void Unit::UpdateSplineMovement(uint32 t_diff) { - enum{ - POSITION_UPDATE_DELAY = 400, - }; + uint32 const positionUpdateDelay = 400; if (movespline->Finalized()) return; @@ -396,7 +395,7 @@ void Unit::UpdateSplineMovement(uint32 t_diff) m_movesplineTimer.Update(t_diff); if (m_movesplineTimer.Passed() || arrived) { - m_movesplineTimer.Reset(POSITION_UPDATE_DELAY); + m_movesplineTimer.Reset(positionUpdateDelay); Movement::Location loc = movespline->ComputePosition(); if (HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) @@ -542,12 +541,11 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam GetAI()->DamageDealt(victim, damage, damagetype); if (victim->GetTypeId() == TYPEID_PLAYER) + { if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD)) return 0; - // Signal to pets that their owner was attacked - if (victim->GetTypeId() == TYPEID_PLAYER) - { + // Signal to pets that their owner was attacked Pet* pet = victim->ToPlayer()->GetPet(); if (pet && pet->isAlive()) @@ -6727,10 +6725,13 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Judgement of Light case 20185: { - // 2% of base mana - basepoints0 = int32(victim->CountPctFromMaxHealth(2)); - victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura); - return true; + if (!victim) + return false; + + // 2% of base mana + basepoints0 = int32(victim->CountPctFromMaxHealth(2)); + victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura); + return true; } // Judgement of Wisdom case 20186: @@ -9978,7 +9979,8 @@ void Unit::SetCharm(Unit* charm, bool apply) if (!charm->AddUInt64Value(UNIT_FIELD_CHARMEDBY, GetGUID())) sLog->outFatal(LOG_FILTER_UNITS, "Unit %u is being charmed, but it already has a charmer " UI64FMTD "", charm->GetEntry(), charm->GetCharmerGUID()); - if (charm->HasUnitMovementFlag(MOVEMENTFLAG_WALKING)) + _isWalkingBeforeCharm = charm->IsWalking(); + if (_isWalkingBeforeCharm) { charm->SetWalk(false); charm->SendMovementFlagUpdate(); @@ -10016,6 +10018,12 @@ void Unit::SetCharm(Unit* charm, bool apply) charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0); } + if (charm->IsWalking() != _isWalkingBeforeCharm) + { + charm->SetWalk(_isWalkingBeforeCharm); + charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player. + } + if (charm->GetTypeId() == TYPEID_PLAYER || !charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_MINION) || charm->GetOwnerGUID() != GetGUID()) @@ -10290,6 +10298,10 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin if (!spellProto || !victim || damagetype == DIRECT_DAMAGE) return pdamage; + // Some spells don't benefit from done mods + if (spellProto->AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS) + return pdamage; + // small exception for Deep Wounds, can't find any general rule // should ignore ALL damage mods, they already calculated in trigger spell if (spellProto->Id == 12721) // Deep Wounds @@ -10691,13 +10703,6 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod); } - // Some spells don't benefit from done mods - if (spellProto->AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS) - { - DoneTotal = 0; - DoneTotalMod = 1.0f; - } - float tmpDamage = (int32(pdamage) + DoneTotal) * DoneTotalMod; // apply spellmod to Done damage (flat and pct) if (Player* modOwner = GetSpellModOwner()) @@ -11081,9 +11086,12 @@ uint32 Unit::SpellCriticalDamageBonus(SpellInfo const* spellProto, uint32 damage crit_bonus -= damage; - // adds additional damage to crit_bonus (from talents) - if (Player* modOwner = GetSpellModOwner()) - modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus); + if (damage > uint32(crit_bonus)) + { + // adds additional damage to critBonus (from talents) + if (Player* modOwner = GetSpellModOwner()) + modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus); + } crit_bonus += damage; @@ -14763,11 +14771,11 @@ void Unit::StopMoving() init.Launch(); } -void Unit::SendMovementFlagUpdate() +void Unit::SendMovementFlagUpdate(bool self /* = false */) { WorldPacket data; BuildHeartBeatMsg(&data); - SendMessageToSet(&data, false); + SendMessageToSet(&data, self); } bool Unit::IsSitState() const @@ -16144,7 +16152,8 @@ void Unit::RemoveCharmedBy(Unit* charmer) if (Creature* creature = ToCreature()) { - creature->AI()->OnCharmed(false); + if (creature->AI()) + creature->AI()->OnCharmed(false); if (type != CHARM_TYPE_VEHICLE) // Vehicles' AI is never modified { @@ -17044,6 +17053,7 @@ void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* a sLog->outDebug(LOG_FILTER_VEHICLES, "EnterVehicle: %u leave vehicle %u seat %d and enter %d.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId); ChangeSeat(seatId); } + return; } else @@ -17079,6 +17089,7 @@ void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* a ASSERT(!m_vehicle); m_vehicle = vehicle; + if (!m_vehicle->AddPassenger(this, seatId)) { m_vehicle = NULL; @@ -17131,9 +17142,11 @@ void Unit::_ExitVehicle(Position const* exitPosition) m_vehicle->RemovePassenger(this); + Player* player = ToPlayer(); + // If player is on mouted duel and exits the mount should immediatly lose the duel - if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->duel && ToPlayer()->duel->isMounted) - ToPlayer()->DuelComplete(DUEL_FLED); + if (player && player->duel && player->duel->isMounted) + player->DuelComplete(DUEL_FLED); // This should be done before dismiss, because there may be some aura removal Vehicle* vehicle = m_vehicle; @@ -17150,8 +17163,8 @@ void Unit::_ExitVehicle(Position const* exitPosition) AddUnitState(UNIT_STATE_MOVE); - if (GetTypeId() == TYPEID_PLAYER) - ToPlayer()->SetFallInformation(0, GetPositionZ()); + if (player) + player->SetFallInformation(0, GetPositionZ()); else if (HasUnitMovementFlag(MOVEMENTFLAG_ROOT)) { WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8); @@ -17167,7 +17180,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) //GetMotionMaster()->MoveFall(); // Enable this once passenger positions are calculater properly (see above) - if (Player* player = ToPlayer()) + if (player) player->ResummonPetTemporaryUnSummonedIfAny(); if (vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION)) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 5c29537db40..305b0e9aa7d 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1607,7 +1607,7 @@ class Unit : public WorldObject void MonsterMoveWithSpeed(float x, float y, float z, float speed, bool generatePath = false, bool forceDestination = false); //void SetFacing(float ori, WorldObject* obj = NULL); //void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL); - void SendMovementFlagUpdate(); + void SendMovementFlagUpdate(bool self = false); /*! These methods send the same packet to the client in apply and unapply case. The client-side interpretation of this packet depends on the presence of relevant movementflags @@ -2357,6 +2357,7 @@ class Unit : public WorldObject Spell const* _focusSpell; bool _targetLocked; // locks the target during spell cast for proper facing + bool _isWalkingBeforeCharm; // Are we walking before we were charmed? }; namespace Trinity diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 475c1c42fca..72a6e0e1bec 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -244,7 +244,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data) sBattlegroundMgr->ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); } -void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket & /*recv_data*/) +void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recv_data*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd MSG_BATTLEGROUND_PLAYER_POSITIONS Message"); @@ -252,39 +252,44 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket & /*recv_ if (!bg) // can't be received if player not in battleground return; - uint32 count = 0; - Player* aplr = NULL; - Player* hplr = NULL; + uint32 flagCarrierCount = 0; + Player* allianceFlagCarrier = NULL; + Player* hordeFlagCarrier = NULL; if (uint64 guid = bg->GetFlagPickerGUID(BG_TEAM_ALLIANCE)) { - aplr = ObjectAccessor::FindPlayer(guid); - if (aplr) - ++count; + allianceFlagCarrier = ObjectAccessor::FindPlayer(guid); + if (allianceFlagCarrier) + ++flagCarrierCount; } if (uint64 guid = bg->GetFlagPickerGUID(BG_TEAM_HORDE)) { - hplr = ObjectAccessor::FindPlayer(guid); - if (hplr) - ++count; + hordeFlagCarrier = ObjectAccessor::FindPlayer(guid); + if (hordeFlagCarrier) + ++flagCarrierCount; } - WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * count); - data << 0; - data << count; - if (aplr) + WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * flagCarrierCount); + // Used to send several player positions (found used in AV) + data << 0; // CGBattlefieldInfo__m_numPlayerPositions + /* + for (CGBattlefieldInfo__m_numPlayerPositions) + data << guid << posx << posy; + */ + data << flagCarrierCount; + if (allianceFlagCarrier) { - data << uint64(aplr->GetGUID()); - data << float(aplr->GetPositionX()); - data << float(aplr->GetPositionY()); + data << uint64(allianceFlagCarrier->GetGUID()); + data << float(allianceFlagCarrier->GetPositionX()); + data << float(allianceFlagCarrier->GetPositionY()); } - if (hplr) + if (hordeFlagCarrier) { - data << uint64(hplr->GetGUID()); - data << float(hplr->GetPositionX()); - data << float(hplr->GetPositionY()); + data << uint64(hordeFlagCarrier->GetGUID()); + data << float(hordeFlagCarrier->GetPositionX()); + data << float(hordeFlagCarrier->GetPositionY()); } SendPacket(&data); @@ -457,6 +462,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recv_data) sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId); break; case 0: // leave queue + if (bg->isArena() && bg->GetStatus() != STATUS_WAIT_QUEUE) + return; + // if player leaves rated arena match before match start, it is counted as he played but he lost if (ginfo.IsRated && ginfo.IsInvitedToBGInstanceGUID) { diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 72636a5d2aa..fca8d78a3de 100755 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -524,7 +524,7 @@ QuestItemList* Loot::FillQuestLoot(Player* player) // increase once if one looter only, looter-times if free for all if (item.freeforall || !item.is_blocked) ++unlootedCount; - if (!player->GetGroup() || (player->GetGroup()->GetLootMethod() != GROUP_LOOT || player->GetGroup()->GetLootMethod() != ROUND_ROBIN)) + if (!player->GetGroup() || (player->GetGroup()->GetLootMethod() != GROUP_LOOT && player->GetGroup()->GetLootMethod() != ROUND_ROBIN)) item.is_blocked = true; if (items.size() + ql->size() == MAX_NR_LOOT_ITEMS) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index bca26bd7391..29dcde9d616 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5042,7 +5042,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool } case 43681: // Inactive { - if (!target || target->GetTypeId() != TYPEID_PLAYER || aurApp->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + if (target->GetTypeId() != TYPEID_PLAYER || aurApp->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; if (target->GetMap()->IsBattleground()) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index fb1cdc576ba..d94e6b0e9e6 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -425,7 +425,7 @@ void Aura::_UnapplyForTarget(Unit* target, Unit* caster, AuraApplication * auraA if (itr == m_applications.end()) { sLog->outError(LOG_FILTER_SPELLS_AURAS, "Aura::_UnapplyForTarget, target:%u, caster:%u, spell:%u was not found in owners application map!", - target->GetGUIDLow(), caster->GetGUIDLow(), auraApp->GetBase()->GetSpellInfo()->Id); + target->GetGUIDLow(), caster ? caster->GetGUIDLow() : 0, auraApp->GetBase()->GetSpellInfo()->Id); ASSERT(false); } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 0cbae416271..d9a3e6a4b3c 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -583,7 +583,7 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme && !m_spellInfo->IsPassive() && !m_spellInfo->IsPositive(); CleanupTargetList(); - CleanupEffectExecuteData(); + memset(m_effectExecuteData, NULL, MAX_SPELL_EFFECTS * sizeof(ByteBuffer*)); for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) m_destTargets[i] = SpellDestination(*m_caster); @@ -2526,7 +2526,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) } } - if (missInfo != SPELL_MISS_EVADE && m_caster && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL))) + if (missInfo != SPELL_MISS_EVADE && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL))) { m_caster->CombatStart(unit, !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO)); @@ -5153,6 +5153,10 @@ SpellCastResult Spell::CheckCast(bool strict) if (!target) return SPELL_FAILED_DONT_REPORT; + if (m_caster->GetTypeId() == TYPEID_PLAYER) + if (!target->isAlive()) + return SPELL_FAILED_BAD_TARGETS; + Position pos; target->GetContactPoint(m_caster, pos.m_positionX, pos.m_positionY, pos.m_positionZ); target->GetFirstCollisionPosition(pos, CONTACT_DISTANCE, target->GetRelativeAngle(m_caster)); @@ -6943,12 +6947,6 @@ void Spell::InitEffectExecuteData(uint8 effIndex) } } -void Spell::CleanupEffectExecuteData() -{ - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - m_effectExecuteData[i] = NULL; -} - void Spell::CheckEffectExecuteData() { for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 22495b3f1f0..88b82cdd929 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -617,7 +617,6 @@ class Spell // spell execution log void InitEffectExecuteData(uint8 effIndex); - void CleanupEffectExecuteData(); void CheckEffectExecuteData(); // Scripting system diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d3b21395725..da7ca3e8d65 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1725,8 +1725,7 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) pItem->SetUInt32Value(ITEM_FIELD_CREATOR, player->GetGUIDLow()); // send info to the client - if (pItem) - player->SendNewItem(pItem, num_to_add, true, bgType == 0); + player->SendNewItem(pItem, num_to_add, true, bgType == 0); // we succeeded in creating at least one item, so a levelup is possible if (bgType == 0) @@ -2080,7 +2079,8 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex) bg->EventPlayerClickedOnFlag(player, gameObjTarget); return; } - }else if (m_spellInfo->Id == 1842 && gameObjTarget->GetGOInfo()->type == GAMEOBJECT_TYPE_TRAP && gameObjTarget->GetOwner()) + } + else if (m_spellInfo->Id == 1842 && gameObjTarget->GetGOInfo()->type == GAMEOBJECT_TYPE_TRAP && gameObjTarget->GetOwner()) { gameObjTarget->SetLootState(GO_JUST_DEACTIVATED); return; @@ -2117,7 +2117,7 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex) if (gameObjTarget) SendLoot(guid, LOOT_SKINNING); - else + else if (itemTarget) itemTarget->SetFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_UNLOCKED); // not allow use skill grow at item base open @@ -4142,6 +4142,8 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) return; } case 59317: // Teleporting + { + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -4153,20 +4155,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) unitTarget->CastSpell(unitTarget, 59314, true); return; - // random spell learn instead placeholder - case 60893: // Northrend Alchemy Research - case 61177: // Northrend Inscription Research - case 61288: // Minor Inscription Research - case 61756: // Northrend Inscription Research (FAST QA VERSION) - case 64323: // Book of Glyph Mastery - { - if (m_caster->GetTypeId() != TYPEID_PLAYER) - return; - - // learn random explicit discovery recipe (if any) - if (uint32 discoveredSpell = GetExplicitDiscoverySpell(m_spellInfo->Id, m_caster->ToPlayer())) - m_caster->ToPlayer()->learnSpell(discoveredSpell, false); - return; } case 62482: // Grab Crate { diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index e17e71f8869..f718b118ad7 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1135,7 +1135,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 case 68719: // Oil Refinery - Isle of Conquest. case 68720: // Quarry - Isle of Conquest. { - if (player->GetBattlegroundTypeId() != BATTLEGROUND_IC || !player->GetBattleground()) + if (!player || player->GetBattlegroundTypeId() != BATTLEGROUND_IC || !player->GetBattleground()) return false; uint8 nodeType = spellId == 68719 ? NODE_TYPE_REFINERY : NODE_TYPE_QUARRY; |
