diff options
| author | Shauren <shauren.trinity@gmail.com> | 2013-06-23 14:51:52 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2013-06-23 14:51:52 +0200 |
| commit | 3f3a32df3498368be953c3f0fbcfabe6aa6f28f9 (patch) | |
| tree | 33425be0cc4338bbae28bc79236ac0237a8d5bb1 /src/server/game | |
| parent | 6cbced8e1665415f42de3f46164121fe26bbb984 (diff) | |
| parent | 89466f76acd9fc8562f80d5c6df75eac84bfdae2 (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/AI/CreatureAISelector.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 34 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 3 | ||||
| -rwxr-xr-x | src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Scripting/ScriptLoader.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 19 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 27 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 5 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 22 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.h | 1 |
12 files changed, 82 insertions, 60 deletions
diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp index d9cc356aaad..203ee37edb3 100644 --- a/src/server/game/AI/CreatureAISelector.cpp +++ b/src/server/game/AI/CreatureAISelector.cpp @@ -95,7 +95,7 @@ namespace FactorySelector // select NullCreatureAI if not another cases ainame = (ai_factory == NULL) ? "NullCreatureAI" : ai_factory->key(); - TC_LOG_DEBUG(LOG_FILTER_TSCR, "Creature %u used AI is %s.", creature->GetGUIDLow(), ainame.c_str()); + TC_LOG_DEBUG(LOG_FILTER_TSCR, "Creature %s (Entry: %u GUID: %u DB GUID: %u) is using AI type: %s.", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUIDLow(), creature->GetDBTableGUIDLow(), ainame.c_str()); return (ai_factory == NULL ? new NullCreatureAI(creature) : ai_factory->Create(creature)); } diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index d8da1e5e286..e9adab4527e 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2484,12 +2484,16 @@ Unit* Creature::SelectNearestHostileUnitInAggroRange(bool useLOS) const void Creature::UpdateMovementFlags() { + // Do not update movement flags if creature is controlled by a player (charm/vehicle) + if (m_movedPlayer) + return; + // Set the movement flags if the creature is in that mode. (Only fly if actually in air, only swim if in water, etc) float ground = GetMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZMinusOffset()); - bool isInAir = !IsFalling() && (G3D::fuzzyGt(GetPositionZMinusOffset(), ground + 0.05f) || G3D::fuzzyLt(GetPositionZMinusOffset(), ground - 0.05f)); // Can be underground too, prevent the falling + bool isInAir = (G3D::fuzzyGt(GetPositionZMinusOffset(), ground + 0.05f) || G3D::fuzzyLt(GetPositionZMinusOffset(), ground - 0.05f)); // Can be underground too, prevent the falling - if (GetCreatureTemplate()->InhabitType & INHABIT_AIR && isInAir) + if (GetCreatureTemplate()->InhabitType & INHABIT_AIR && isInAir && !IsFalling()) { if (GetCreatureTemplate()->InhabitType & INHABIT_GROUND) SetCanFly(true); @@ -2502,6 +2506,9 @@ void Creature::UpdateMovementFlags() SetDisableGravity(false); } + if (!isInAir) + RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + SetSwim(GetCreatureTemplate()->InhabitType & INHABIT_WATER && IsInWater()); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0aa00b00ab2..61e662e654c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14417,7 +14417,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool VendorItemData const* vendorItems = creature->GetVendorItems(); if (!vendorItems || vendorItems->Empty()) { - TC_LOG_ERROR(LOG_FILTER_SQL, "Creature (GUID: %u, Entry: %u) have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUIDLow(), creature->GetEntry()); + TC_LOG_ERROR(LOG_FILTER_SQL, "Creature %s (Entry: %u GUID: %u DB GUID: %u) has UNIT_NPC_FLAG_VENDOR set but has an empty trading item list.", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUIDLow(), creature->GetDBTableGUIDLow()); canTalk = false; } break; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d88efd1227d..1f5213fac22 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3029,10 +3029,16 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) if (aura->IsRemoved()) return; - aura->SetIsSingleTarget(caster && aura->GetSpellInfo()->IsSingleTarget()); + aura->SetIsSingleTarget(caster && (aura->GetSpellInfo()->IsSingleTarget() || aura->HasEffectType(SPELL_AURA_CONTROL_VEHICLE))); if (aura->IsSingleTarget()) { - ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID())); + ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()) || + (isBeingLoaded() && aura->HasEffectType(SPELL_AURA_CONTROL_VEHICLE))); + /* @HACK: Player is not in world during loading auras. + * Single target auras are not saved or loaded from database + * but may be created as a result of aura links (player mounts with passengers) + */ + // register single target aura caster->GetSingleCastAuras().push_back(aura); // remove other single target auras @@ -3040,7 +3046,7 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();) { if ((*itr) != aura && - (*itr)->GetSpellInfo()->IsSingleTargetWith(aura->GetSpellInfo())) + (*itr)->IsSingleTargetWith(aura)) { (*itr)->Remove(); itr = scAuras.begin(); @@ -16699,9 +16705,19 @@ bool Unit::SetDisableGravity(bool disable, bool packetOnly /*= false*/) return false; if (disable) + { AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + } else + { RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + if (!HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY)) + { + m_movementInfo.SetFallTime(0); + AddUnitMovementFlag(MOVEMENTFLAG_FALLING); + } + } } if (disable) @@ -16736,9 +16752,19 @@ bool Unit::SetCanFly(bool enable) return false; if (enable) + { AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); + RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + } else - RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); + { + RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_MASK_MOVING_FLY); + if (!IsLevitating()) + { + m_movementInfo.SetFallTime(0); + AddUnitMovementFlag(MOVEMENTFLAG_FALLING); + } + } if (enable) Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY).Send(); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 28429387400..f690160b464 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -801,6 +801,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) ASSERT(Target->GetBase()->HasAuraTypeWithCaster(SPELL_AURA_CONTROL_VEHICLE, Passenger->GetGUID())); Target->RemovePendingEventsForSeat(Seat->first); + Target->RemovePendingEventsForPassenger(Passenger); Passenger->SetVehicle(Target); Seat->second.Passenger = Passenger->GetGUID(); @@ -833,7 +834,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) player->UnsummonPetTemporaryIfAny(); } - if (Seat->second.SeatInfo->m_flags && !(Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_ALLOW_TURNING)) + if (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_HIDE_PASSENGER) Passenger->AddUnitState(UNIT_STATE_ONVEHICLE); VehicleSeatEntry const* veSeat = Seat->second.SeatInfo; diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 56621c8aac5..1e275b0be9f 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -40,8 +40,8 @@ void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) if (!i_path) { - // No movement found for entry - TC_LOG_ERROR(LOG_FILTER_SQL, "WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %u) doesn't have waypoint path id: %u", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUIDLow(), path_id); + // No path id found for entry + TC_LOG_ERROR(LOG_FILTER_SQL, "WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %u DB GUID: %u) doesn't have waypoint path id: %u", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUIDLow(), creature->GetDBTableGUIDLow(), path_id); return; } diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 3b3f3e45799..f644047b298 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -290,11 +290,11 @@ void AddSC_boss_epoch_hunter(); void AddSC_boss_lieutenant_drake(); void AddSC_instance_old_hillsbrad(); void AddSC_old_hillsbrad(); -void AddSC_boss_aeonus(); //CoT The Dark Portal +void AddSC_boss_aeonus(); //CoT The Black Morass void AddSC_boss_chrono_lord_deja(); void AddSC_boss_temporus(); -void AddSC_dark_portal(); -void AddSC_instance_dark_portal(); +void AddSC_the_black_morass(); +void AddSC_instance_the_black_morass(); void AddSC_boss_epoch(); //CoT Culling Of Stratholme void AddSC_boss_infinite_corruptor(); void AddSC_boss_salramm(); @@ -937,11 +937,11 @@ void AddKalimdorScripts() AddSC_boss_lieutenant_drake(); AddSC_instance_old_hillsbrad(); AddSC_old_hillsbrad(); - AddSC_boss_aeonus(); //CoT The Dark Portal + AddSC_boss_aeonus(); //CoT The Black Morass AddSC_boss_chrono_lord_deja(); AddSC_boss_temporus(); - AddSC_dark_portal(); - AddSC_instance_dark_portal(); + AddSC_the_black_morass(); + AddSC_instance_the_black_morass(); AddSC_boss_epoch(); //CoT Culling Of Stratholme AddSC_boss_infinite_corruptor(); AddSC_boss_salramm(); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index c4952659b64..aa6936d2abf 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2631,17 +2631,9 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode return; } - //! Not entirely sure if this should be sent for creatures as well, but I don't think so. - if (!apply) - { - target->m_movementInfo.SetFallTime(0); - target->RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING_FLY); - target->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); - } - target->SetCanFly(apply); - if (target->GetTypeId() == TYPEID_UNIT) + if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } @@ -3028,16 +3020,9 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK && (apply || (!target->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !target->HasAuraType(SPELL_AURA_FLY)))) { - if (!apply) - { - target->m_movementInfo.SetFallTime(0); - target->RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING_FLY); - target->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); - } - target->SetCanFly(apply); - if (target->GetTypeId() == TYPEID_UNIT) + if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index e6351a18fe3..097b81fc449 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -967,6 +967,31 @@ bool Aura::CanBeSentToClient() const return !IsPassive() || GetSpellInfo()->HasAreaAuraEffect() || HasEffectType(SPELL_AURA_ABILITY_IGNORE_AURASTATE) || HasEffectType(SPELL_AURA_CAST_WHILE_WALKING); } +bool Aura::IsSingleTargetWith(Aura const* aura) const +{ + // Same spell? + if (GetSpellInfo()->IsRankOf(aura->GetSpellInfo())) + return true; + + SpellSpecificType spec = GetSpellInfo()->GetSpellSpecific(); + // spell with single target specific types + switch (spec) + { + case SPELL_SPECIFIC_JUDGEMENT: + case SPELL_SPECIFIC_MAGE_POLYMORPH: + if (aura->GetSpellInfo()->GetSpellSpecific() == spec) + return true; + break; + default: + break; + } + + if (HasEffectType(SPELL_AURA_CONTROL_VEHICLE) && aura->HasEffectType(SPELL_AURA_CONTROL_VEHICLE)) + return true; + + return false; +} + void Aura::UnregisterSingleTarget() { ASSERT(m_isSingleTarget); @@ -1609,7 +1634,7 @@ bool Aura::CanStackWith(Aura const* existingAura) const if (!veh->GetAvailableSeatCount()) return false; // No empty seat available - return !sameCaster; // Empty seat available (skip rest) and different caster + return true; // Empty seat available (skip rest) } // spell of same spell rank chain diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 73832a632c3..56927a09ae6 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -165,8 +165,9 @@ class Aura bool IsRemoved() const { return m_isRemoved; } bool CanBeSentToClient() const; // Single cast aura helpers - bool IsSingleTarget() const {return m_isSingleTarget;} - void SetIsSingleTarget(bool val) { m_isSingleTarget = val;} + bool IsSingleTarget() const {return m_isSingleTarget; } + bool IsSingleTargetWith(Aura const* aura) const; + void SetIsSingleTarget(bool val) { m_isSingleTarget = val; } void UnregisterSingleTarget(); int32 CalcDispelChance(Unit* auraTarget, bool offensive) const; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 85e23f36312..0f92bdad061 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1384,28 +1384,6 @@ bool SpellInfo::IsSingleTarget() const return false; } -bool SpellInfo::IsSingleTargetWith(SpellInfo const* spellInfo) const -{ - // Same spell? - if (IsRankOf(spellInfo)) - return true; - - SpellSpecificType spec = GetSpellSpecific(); - // spell with single target specific types - switch (spec) - { - case SPELL_SPECIFIC_JUDGEMENT: - case SPELL_SPECIFIC_MAGE_POLYMORPH: - if (spellInfo->GetSpellSpecific() == spec) - return true; - break; - default: - break; - } - - return false; -} - bool SpellInfo::IsAuraExclusiveBySpecificWith(SpellInfo const* spellInfo) const { SpellSpecificType spellSpec1 = GetSpellSpecific(); diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 4be90e5c100..013f55d6fa9 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -464,7 +464,6 @@ public: bool CanDispelAura(SpellInfo const* aura) const; bool IsSingleTarget() const; - bool IsSingleTargetWith(SpellInfo const* spellInfo) const; bool IsAuraExclusiveBySpecificWith(SpellInfo const* spellInfo) const; bool IsAuraExclusiveBySpecificPerCasterWith(SpellInfo const* spellInfo) const; |
