From 6623a9dc4253e7b55cea3ff2e7a9a8946b24a736 Mon Sep 17 00:00:00 2001 From: Malcrom Date: Fri, 21 Jun 2013 23:14:59 -0230 Subject: Core/Scripting: Renamed Dark Portal scripts to The Black Morass --- src/server/game/Scripting/ScriptLoader.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index e65c5884319..b240100f642 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -294,11 +294,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(); @@ -940,11 +940,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(); -- cgit v1.2.3 From 0b00481b847ea5194443a0f322cda965b4d166c3 Mon Sep 17 00:00:00 2001 From: Malcrom Date: Sat, 22 Jun 2013 01:43:33 -0230 Subject: Core/WaypointMovementGenerator: Make error message more useful. --- .../game/Movement/MovementGenerators/WaypointMovementGenerator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 3e0274255fa..861b986dcdb 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -40,8 +40,8 @@ void WaypointMovementGenerator::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; } -- cgit v1.2.3 From e5a8f6cd98aa15ef792947551d3de8dab277012d Mon Sep 17 00:00:00 2001 From: Malcrom Date: Sat, 22 Jun 2013 02:05:32 -0230 Subject: Core: Fix some error messages, more useful, less engrish. --- src/server/game/AI/CreatureAISelector.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/game') 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/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6ff4fe09876..2f584fdb5d4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14362,7 +14362,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; -- cgit v1.2.3 From 55fa58af19b39ab92bdea7407a5c12b603931b75 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 22 Jun 2013 13:42:13 +0200 Subject: Core/Movement: Prevent dynamic changes of movement flags for charmed creatures Closes #10075 Closes #10079 --- src/server/game/Entities/Creature/Creature.cpp | 11 +++++++++-- src/server/game/Entities/Unit/Unit.cpp | 22 +++++++++++++++++++++- src/server/game/Server/WorldSession.cpp | 4 ++++ src/server/game/Spells/Auras/SpellAuraEffects.cpp | 19 ++----------------- 4 files changed, 36 insertions(+), 20 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 33f29820b12..3900f532d5c 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2586,12 +2586,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); @@ -2604,6 +2608,9 @@ void Creature::UpdateMovementFlags() SetDisableGravity(false); } + if (!isInAir) + RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + SetSwim(GetCreatureTemplate()->InhabitType & INHABIT_WATER && IsInWater()); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 541c5d9f107..9f6b5f76cb4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -17406,9 +17406,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); + } + } return true; } @@ -17432,9 +17442,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); + } + } return true; } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 00aa43a4f47..5519f1d4d0e 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -869,6 +869,10 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED), MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY); + //! Cannot fly and fall at the same time + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY) && mi->HasMovementFlag(MOVEMENTFLAG_FALLING), + MOVEMENTFLAG_FALLING); + #undef REMOVE_VIOLATING_FLAGS } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index f8bc67c7aac..a361d54bbc8 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2558,17 +2558,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(); } @@ -2955,16 +2947,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(); } -- cgit v1.2.3 From 1addad4dbd38d4690c24ad9c07456e06e443c78e Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 22 Jun 2013 16:10:48 +0200 Subject: Core/Vehicles: Fixed crashes in StopCastingCharm happening when unit was attempting to enter 2 vehicles at the same time Closes #9293 Closes #9618 --- src/server/game/Entities/Unit/Unit.cpp | 4 ++-- src/server/game/Entities/Vehicle/Vehicle.cpp | 3 ++- src/server/game/Spells/Auras/SpellAuras.cpp | 27 ++++++++++++++++++++++++++- src/server/game/Spells/Auras/SpellAuras.h | 5 +++-- src/server/game/Spells/SpellInfo.cpp | 22 ---------------------- src/server/game/Spells/SpellInfo.h | 1 - 6 files changed, 33 insertions(+), 29 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9f6b5f76cb4..aad567e942f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3263,7 +3263,7 @@ 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())); @@ -3274,7 +3274,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(); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index fa3203159ba..c2eb526f3a3 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -803,6 +803,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(); @@ -835,7 +836,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); Passenger->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 7e6f1d1b402..32ccaf028ad 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -937,6 +937,31 @@ bool Aura::CanBeSentToClient() const return !IsPassive() || GetSpellInfo()->HasAreaAuraEffect() || HasEffectType(SPELL_AURA_ABILITY_IGNORE_AURASTATE); } +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); @@ -1890,7 +1915,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 5225ff77e95..c813f9bbd27 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1212,28 +1212,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 3e6ba0023b1..6d0778087ce 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -413,7 +413,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; -- cgit v1.2.3 From 89466f76acd9fc8562f80d5c6df75eac84bfdae2 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 23 Jun 2013 11:20:13 +0200 Subject: Core/Auras: Fixed crashes introduced in 1addad4dbd38d4690c24ad9c07456e06e443c78e Closes #10081 --- src/server/game/Entities/Unit/Unit.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index aad567e942f..6fb3ef18462 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3266,7 +3266,13 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) 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 -- cgit v1.2.3