aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-06-23 14:51:52 +0200
committerShauren <shauren.trinity@gmail.com>2013-06-23 14:51:52 +0200
commit3f3a32df3498368be953c3f0fbcfabe6aa6f28f9 (patch)
tree33425be0cc4338bbae28bc79236ac0237a8d5bb1 /src/server/game
parent6cbced8e1665415f42de3f46164121fe26bbb984 (diff)
parent89466f76acd9fc8562f80d5c6df75eac84bfdae2 (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.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp11
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp34
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp3
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp4
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp12
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp19
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp27
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h5
-rw-r--r--src/server/game/Spells/SpellInfo.cpp22
-rw-r--r--src/server/game/Spells/SpellInfo.h1
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;