diff options
Diffstat (limited to 'src/server/game')
182 files changed, 2684 insertions, 1783 deletions
diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp index 85088bbeff4..3ad52aedb34 100644 --- a/src/server/game/AI/CoreAI/CombatAI.cpp +++ b/src/server/game/AI/CoreAI/CombatAI.cpp @@ -272,7 +272,7 @@ void TurretAI::UpdateAI(uint32 /*diff*/) //VehicleAI ////////////// -VehicleAI::VehicleAI(Creature* c) : CreatureAI(c), m_vehicle(c->GetVehicleKit()), m_IsVehicleInUse(false), m_ConditionsTimer(VEHICLE_CONDITION_CHECK_TIME) +VehicleAI::VehicleAI(Creature* c) : CreatureAI(c), m_IsVehicleInUse(false), m_ConditionsTimer(VEHICLE_CONDITION_CHECK_TIME) { LoadConditions(); m_DoDismiss = false; @@ -291,7 +291,9 @@ void VehicleAI::UpdateAI(uint32 diff) m_DoDismiss = false; me->SetVisible(false); me->DespawnOrUnsummon(); - }else m_DismissTimer -= diff; + } + else + m_DismissTimer -= diff; } } @@ -310,6 +312,7 @@ void VehicleAI::OnCharmed(bool apply) } else if (apply) m_DoDismiss = false;//in use again + m_DismissTimer = VEHICLE_DISMISS_TIME;//reset timer m_IsVehicleInUse = apply; } @@ -327,19 +330,22 @@ void VehicleAI::CheckConditions(const uint32 diff) { if (!conditions.empty()) { - for (SeatMap::iterator itr = m_vehicle->Seats.begin(); itr != m_vehicle->Seats.end(); ++itr) - if (Unit* passenger = ObjectAccessor::GetUnit(*m_vehicle->GetBase(), itr->second.Passenger.Guid)) - { - if (Player* player = passenger->ToPlayer()) + if( Vehicle* vehicleKit = me->GetVehicleKit()) + for (SeatMap::iterator itr = vehicleKit->Seats.begin(); itr != vehicleKit->Seats.end(); ++itr) + if (Unit* passenger = ObjectAccessor::GetUnit(*me, itr->second.Passenger.Guid)) { - if (!sConditionMgr->IsObjectMeetToConditions(player, me, conditions)) + if (Player* player = passenger->ToPlayer()) { - player->ExitVehicle(); - return;//check other pessanger in next tick + if (!sConditionMgr->IsObjectMeetToConditions(player, me, conditions)) + { + player->ExitVehicle(); + return;//check other pessanger in next tick + } } } - } } m_ConditionsTimer = VEHICLE_CONDITION_CHECK_TIME; - } else m_ConditionsTimer -= diff; + } + else + m_ConditionsTimer -= diff; } diff --git a/src/server/game/AI/CoreAI/CombatAI.h b/src/server/game/AI/CoreAI/CombatAI.h index 315ff861da9..16167d1be59 100644 --- a/src/server/game/AI/CoreAI/CombatAI.h +++ b/src/server/game/AI/CoreAI/CombatAI.h @@ -28,7 +28,7 @@ class Creature; class AggressorAI : public CreatureAI { public: - explicit AggressorAI(Creature* c) : CreatureAI(c) {} + explicit AggressorAI(Creature* c) : CreatureAI(c) { } void UpdateAI(uint32); static int Permissible(const Creature*); @@ -39,7 +39,7 @@ typedef std::vector<uint32> SpellVct; class CombatAI : public CreatureAI { public: - explicit CombatAI(Creature* c) : CreatureAI(c) {} + explicit CombatAI(Creature* c) : CreatureAI(c) { } void InitializeAI(); void Reset(); @@ -100,12 +100,11 @@ struct VehicleAI : public CreatureAI void UpdateAI(uint32 diff); static int Permissible(const Creature*); void Reset(); - void MoveInLineOfSight(Unit*) {} - void AttackStart(Unit*) {} + void MoveInLineOfSight(Unit*) { } + void AttackStart(Unit*) { } void OnCharmed(bool apply); private: - Vehicle* m_vehicle; bool m_IsVehicleInUse; void LoadConditions(); void CheckConditions(const uint32 diff); diff --git a/src/server/game/AI/CoreAI/GameObjectAI.cpp b/src/server/game/AI/CoreAI/GameObjectAI.cpp index 06e3a4b9ec4..adc82d7b018 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.cpp +++ b/src/server/game/AI/CoreAI/GameObjectAI.cpp @@ -18,7 +18,7 @@ #include "GameObjectAI.h" -//GameObjectAI::GameObjectAI(GameObject* g) : go(g) {} +//GameObjectAI::GameObjectAI(GameObject* g) : go(g) { } int GameObjectAI::Permissible(const GameObject* go) { if (go->GetAIName() == "GameObjectAI") @@ -26,4 +26,4 @@ int GameObjectAI::Permissible(const GameObject* go) return PERMIT_BASE_NO; } -NullGameObjectAI::NullGameObjectAI(GameObject* g) : GameObjectAI(g) {} +NullGameObjectAI::NullGameObjectAI(GameObject* g) : GameObjectAI(g) { } diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 32a6e9a670c..0d5af4f8802 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -30,18 +30,18 @@ class GameObjectAI protected: GameObject* const go; public: - explicit GameObjectAI(GameObject* g) : go(g) {} - virtual ~GameObjectAI() {} + explicit GameObjectAI(GameObject* g) : go(g) { } + virtual ~GameObjectAI() { } - virtual void UpdateAI(uint32 /*diff*/) {} + virtual void UpdateAI(uint32 /*diff*/) { } virtual void InitializeAI() { Reset(); } virtual void Reset() { } // Pass parameters between AI - virtual void DoAction(int32 /*param = 0 */) {} - virtual void SetGUID(uint64 /*guid*/, int32 /*id = 0 */) {} + virtual void DoAction(int32 /*param = 0 */) { } + virtual void SetGUID(uint64 /*guid*/, int32 /*id = 0 */) { } virtual uint64 GetGUID(int32 /*id = 0 */) const { return 0; } static int Permissible(GameObject const* go); @@ -52,14 +52,14 @@ class GameObjectAI virtual bool QuestAccept(Player* /*player*/, Quest const* /*quest*/) { return false; } virtual bool QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } virtual uint32 GetDialogStatus(Player* /*player*/) { return 100; } - virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) {} + virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) { } virtual uint32 GetData(uint32 /*id*/) const { return 0; } - virtual void SetData64(uint32 /*id*/, uint64 /*value*/) {} + virtual void SetData64(uint32 /*id*/, uint64 /*value*/) { } virtual uint64 GetData64(uint32 /*id*/) const { return 0; } - virtual void SetData(uint32 /*id*/, uint32 /*value*/) {} - virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) {} - virtual void OnStateChanged(uint32 /*state*/, Unit* /*unit*/) {} - virtual void EventInform(uint32 /*eventId*/) {} + virtual void SetData(uint32 /*id*/, uint32 /*value*/) { } + virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } + virtual void OnStateChanged(uint32 /*state*/, Unit* /*unit*/) { } + virtual void EventInform(uint32 /*eventId*/) { } }; class NullGameObjectAI : public GameObjectAI @@ -67,7 +67,7 @@ class NullGameObjectAI : public GameObjectAI public: explicit NullGameObjectAI(GameObject* g); - void UpdateAI(uint32 /*diff*/) {} + void UpdateAI(uint32 /*diff*/) { } static int Permissible(GameObject const* /*go*/) { return PERMIT_BASE_IDLE; } }; diff --git a/src/server/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp index 220d53a20e0..188ad4fb450 100644 --- a/src/server/game/AI/CoreAI/GuardAI.cpp +++ b/src/server/game/AI/CoreAI/GuardAI.cpp @@ -31,9 +31,7 @@ int GuardAI::Permissible(Creature const* creature) return PERMIT_BASE_NO; } -GuardAI::GuardAI(Creature* creature) : ScriptedAI(creature) -{ -} +GuardAI::GuardAI(Creature* creature) : ScriptedAI(creature) { } bool GuardAI::CanSeeAlways(WorldObject const* obj) { diff --git a/src/server/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h index cb047ff364b..58c9a348fe9 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.h +++ b/src/server/game/AI/CoreAI/PassiveAI.h @@ -26,8 +26,8 @@ class PassiveAI : public CreatureAI public: explicit PassiveAI(Creature* c); - void MoveInLineOfSight(Unit*) {} - void AttackStart(Unit*) {} + void MoveInLineOfSight(Unit*) { } + void AttackStart(Unit*) { } void UpdateAI(uint32); static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; } @@ -38,10 +38,10 @@ class PossessedAI : public CreatureAI public: explicit PossessedAI(Creature* c); - void MoveInLineOfSight(Unit*) {} + void MoveInLineOfSight(Unit*) { } void AttackStart(Unit* target); void UpdateAI(uint32); - void EnterEvadeMode() {} + void EnterEvadeMode() { } void JustDied(Unit*); void KilledUnit(Unit* victim); @@ -54,11 +54,11 @@ class NullCreatureAI : public CreatureAI public: explicit NullCreatureAI(Creature* c); - void MoveInLineOfSight(Unit*) {} - void AttackStart(Unit*) {} - void UpdateAI(uint32) {} - void EnterEvadeMode() {} - void OnCharmed(bool /*apply*/) {} + void MoveInLineOfSight(Unit*) { } + void AttackStart(Unit*) { } + void UpdateAI(uint32) { } + void EnterEvadeMode() { } + void OnCharmed(bool /*apply*/) { } static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; } }; @@ -66,7 +66,7 @@ class NullCreatureAI : public CreatureAI class CritterAI : public PassiveAI { public: - explicit CritterAI(Creature* c) : PassiveAI(c) {} + explicit CritterAI(Creature* c) : PassiveAI(c) { } void DamageTaken(Unit* done_by, uint32& /*damage*/); void EnterEvadeMode(); @@ -75,7 +75,7 @@ class CritterAI : public PassiveAI class TriggerAI : public NullCreatureAI { public: - explicit TriggerAI(Creature* c) : NullCreatureAI(c) {} + explicit TriggerAI(Creature* c) : NullCreatureAI(c) { } void IsSummonedBy(Unit* summoner); }; diff --git a/src/server/game/AI/CoreAI/PetAI.h b/src/server/game/AI/CoreAI/PetAI.h index efb088160f3..9cce00440e1 100644 --- a/src/server/game/AI/CoreAI/PetAI.h +++ b/src/server/game/AI/CoreAI/PetAI.h @@ -45,9 +45,9 @@ class PetAI : public CreatureAI // The following aren't used by the PetAI but need to be defined to override // default CreatureAI functions which interfere with the PetAI // - void MoveInLineOfSight(Unit* /*who*/) {} // CreatureAI interferes with returning pets - void MoveInLineOfSight_Safe(Unit* /*who*/) {} // CreatureAI interferes with returning pets - void EnterEvadeMode() {} // For fleeing, pets don't use this type of Evade mechanic + void MoveInLineOfSight(Unit* /*who*/) { } // CreatureAI interferes with returning pets + void MoveInLineOfSight_Safe(Unit* /*who*/) { } // CreatureAI interferes with returning pets + void EnterEvadeMode() { } // For fleeing, pets don't use this type of Evade mechanic private: bool _isVisible(Unit*) const; diff --git a/src/server/game/AI/CoreAI/ReactorAI.h b/src/server/game/AI/CoreAI/ReactorAI.h index 449458f39be..42f9c425ceb 100644 --- a/src/server/game/AI/CoreAI/ReactorAI.h +++ b/src/server/game/AI/CoreAI/ReactorAI.h @@ -27,9 +27,9 @@ class ReactorAI : public CreatureAI { public: - explicit ReactorAI(Creature* c) : CreatureAI(c) {} + explicit ReactorAI(Creature* c) : CreatureAI(c) { } - void MoveInLineOfSight(Unit*) {} + void MoveInLineOfSight(Unit*) { } void UpdateAI(uint32 diff); static int Permissible(const Creature*); diff --git a/src/server/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp index bc865b8b6aa..03ba024384f 100644 --- a/src/server/game/AI/CoreAI/TotemAI.cpp +++ b/src/server/game/AI/CoreAI/TotemAI.cpp @@ -40,9 +40,7 @@ TotemAI::TotemAI(Creature* c) : CreatureAI(c), i_victimGuid(0) ASSERT(c->IsTotem()); } -void TotemAI::MoveInLineOfSight(Unit* /*who*/) -{ -} +void TotemAI::MoveInLineOfSight(Unit* /*who*/) { } void TotemAI::EnterEvadeMode() { diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index f048c049b34..71fc86f112b 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -120,8 +120,8 @@ class UnitAI protected: Unit* const me; public: - explicit UnitAI(Unit* unit) : me(unit) {} - virtual ~UnitAI() {} + explicit UnitAI(Unit* unit) : me(unit) { } + virtual ~UnitAI() { } virtual bool CanAIAttack(Unit const* /*target*/) const { return true; } virtual void AttackStart(Unit* /*target*/); @@ -129,16 +129,16 @@ class UnitAI virtual void InitializeAI() { if (!me->isDead()) Reset(); } - virtual void Reset() {}; + virtual void Reset() { }; // Called when unit is charmed virtual void OnCharmed(bool apply) = 0; // Pass parameters between AI - virtual void DoAction(int32 /*param*/) {} + virtual void DoAction(int32 /*param*/) { } virtual uint32 GetData(uint32 /*id = 0*/) const { return 0; } - virtual void SetData(uint32 /*id*/, uint32 /*value*/) {} - virtual void SetGUID(uint64 /*guid*/, int32 /*id*/ = 0) {} + virtual void SetData(uint32 /*id*/, uint32 /*value*/) { } + virtual void SetGUID(uint64 /*guid*/, int32 /*id*/ = 0) { } virtual uint64 GetGUID(int32 /*id*/ = 0) const { return 0; } Unit* SelectTarget(SelectAggroTarget targetType, uint32 position = 0, float dist = 0.0f, bool playerOnly = false, int32 aura = 0); @@ -225,17 +225,17 @@ class UnitAI // Called at any Damage from any attacker (before damage apply) // Note: it for recalculation damage or special reaction at damage // for attack reaction use AttackedBy called for not DOT damage in Unit::DealDamage also - virtual void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) {} + virtual void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) { } // Called when the creature receives heal - virtual void HealReceived(Unit* /*done_by*/, uint32& /*addhealth*/) {} + virtual void HealReceived(Unit* /*done_by*/, uint32& /*addhealth*/) { } // Called when the unit heals - virtual void HealDone(Unit* /*done_to*/, uint32& /*addhealth*/) {} + virtual void HealDone(Unit* /*done_to*/, uint32& /*addhealth*/) { } /// Called when a spell is interrupted by Spell::EffectInterruptCast /// Use to reschedule next planned cast of spell. - virtual void SpellInterrupted(uint32 /*spellId*/, uint32 /*unTimeMs*/) {} + virtual void SpellInterrupted(uint32 /*spellId*/, uint32 /*unTimeMs*/) { } void AttackStartCaster(Unit* victim, float dist); @@ -254,15 +254,15 @@ class UnitAI static AISpellInfoType* AISpellInfo; static void FillAISpellInfo(); - virtual void sGossipHello(Player* /*player*/) {} - virtual void sGossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) {} - virtual void sGossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) {} - virtual void sQuestAccept(Player* /*player*/, Quest const* /*quest*/) {} - virtual void sQuestSelect(Player* /*player*/, Quest const* /*quest*/) {} - virtual void sQuestComplete(Player* /*player*/, Quest const* /*quest*/) {} - virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) {} + virtual void sGossipHello(Player* /*player*/) { } + virtual void sGossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) { } + virtual void sGossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { } + virtual void sQuestAccept(Player* /*player*/, Quest const* /*quest*/) { } + virtual void sQuestSelect(Player* /*player*/, Quest const* /*quest*/) { } + virtual void sQuestComplete(Player* /*player*/, Quest const* /*quest*/) { } + virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } virtual bool sOnDummyEffect(Unit* /*caster*/, uint32 /*spellId*/, SpellEffIndex /*effIndex*/) { return false; } - virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) {} + virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) { } }; class PlayerAI : public UnitAI @@ -270,7 +270,7 @@ class PlayerAI : public UnitAI protected: Player* const me; public: - explicit PlayerAI(Player* player) : UnitAI((Unit*)player), me(player) {} + explicit PlayerAI(Player* player) : UnitAI((Unit*)player), me(player) { } void OnCharmed(bool apply); }; @@ -279,7 +279,7 @@ class SimpleCharmedAI : public PlayerAI { public: void UpdateAI(uint32 diff); - SimpleCharmedAI(Player* player): PlayerAI(player) {} + SimpleCharmedAI(Player* player): PlayerAI(player) { } }; #endif diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 34339859a95..14cf0a05109 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -79,9 +79,9 @@ class CreatureAI : public UnitAI public: void Talk(uint8 id, uint64 WhisperGuid = 0); - explicit CreatureAI(Creature* creature) : UnitAI(creature), me(creature), m_MoveInLineOfSight_locked(false) {} + explicit CreatureAI(Creature* creature) : UnitAI(creature), me(creature), m_MoveInLineOfSight_locked(false) { } - virtual ~CreatureAI() {} + virtual ~CreatureAI() { } /// == Reactions At ================================= @@ -95,61 +95,61 @@ class CreatureAI : public UnitAI virtual void EnterEvadeMode(); // Called for reaction at enter to combat if not in combat yet (enemy can be NULL) - virtual void EnterCombat(Unit* /*victim*/) {} + virtual void EnterCombat(Unit* /*victim*/) { } // Called when the creature is killed - virtual void JustDied(Unit* /*killer*/) {} + virtual void JustDied(Unit* /*killer*/) { } // Called when the creature kills a unit - virtual void KilledUnit(Unit* /*victim*/) {} + virtual void KilledUnit(Unit* /*victim*/) { } // Called when the creature summon successfully other creature - virtual void JustSummoned(Creature* /*summon*/) {} - virtual void IsSummonedBy(Unit* /*summoner*/) {} + virtual void JustSummoned(Creature* /*summon*/) { } + virtual void IsSummonedBy(Unit* /*summoner*/) { } - virtual void SummonedCreatureDespawn(Creature* /*summon*/) {} - virtual void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) {} + virtual void SummonedCreatureDespawn(Creature* /*summon*/) { } + virtual void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) { } // Called when hit by a spell - virtual void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) {} + virtual void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) { } // Called when spell hits a target - virtual void SpellHitTarget(Unit* /*target*/, SpellInfo const* /*spell*/) {} + virtual void SpellHitTarget(Unit* /*target*/, SpellInfo const* /*spell*/) { } // Called when the creature is target of hostile action: swing, hostile spell landed, fear/etc) - virtual void AttackedBy(Unit* /*attacker*/) {} + virtual void AttackedBy(Unit* /*attacker*/) { } virtual bool IsEscorted() { return false; } // Called when creature is spawned or respawned (for reseting variables) virtual void JustRespawned() { Reset(); } // Called at waypoint reached or point movement finished - virtual void MovementInform(uint32 /*type*/, uint32 /*id*/) {} + virtual void MovementInform(uint32 /*type*/, uint32 /*id*/) { } void OnCharmed(bool apply); // Called at reaching home after evade - virtual void JustReachedHome() {} + virtual void JustReachedHome() { } void DoZoneInCombat(Creature* creature = NULL, float maxRangeToNearestTarget = 50.0f); // Called at text emote receive from player - virtual void ReceiveEmote(Player* /*player*/, uint32 /*emoteId*/) {} + virtual void ReceiveEmote(Player* /*player*/, uint32 /*emoteId*/) { } // Called when owner takes damage - virtual void OwnerAttackedBy(Unit* /*attacker*/) {} + virtual void OwnerAttackedBy(Unit* /*attacker*/) { } // Called when owner attacks something - virtual void OwnerAttacked(Unit* /*target*/) {} + virtual void OwnerAttacked(Unit* /*target*/) { } /// == Triggered Actions Requested ================== // Called when creature attack expected (if creature can and no have current victim) // Note: for reaction at hostile action must be called AttackedBy function. - //virtual void AttackStart(Unit*) {} + //virtual void AttackStart(Unit*) { } // Called at World update tick - //virtual void UpdateAI(const uint32 /*diff*/) {} + //virtual void UpdateAI(const uint32 /*diff*/) { } /// == State checks ================================= @@ -157,7 +157,7 @@ class CreatureAI : public UnitAI //virtual bool IsVisible(Unit*) const { return false; } // called when the corpse of this creature gets removed - virtual void CorpseRemoved(uint32& /*respawnDelay*/) {} + virtual void CorpseRemoved(uint32& /*respawnDelay*/) { } // Called when victim entered water and creature can not enter water //virtual bool CanReachByRangeAttack(Unit*) { return false; } @@ -167,7 +167,7 @@ class CreatureAI : public UnitAI // Pointer to controlled by AI creature //Creature* const me; - virtual void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool /*apply*/) {} + virtual void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool /*apply*/) { } virtual void OnSpellClick(Unit* /*clicker*/, bool& /*result*/) { } diff --git a/src/server/game/AI/CreatureAIFactory.h b/src/server/game/AI/CreatureAIFactory.h index b4e031fbe6f..30576cf28bd 100644 --- a/src/server/game/AI/CreatureAIFactory.h +++ b/src/server/game/AI/CreatureAIFactory.h @@ -25,13 +25,13 @@ struct SelectableAI : public FactoryHolder<CreatureAI>, public Permissible<Creature> { - SelectableAI(const char* id) : FactoryHolder<CreatureAI>(id) {} + SelectableAI(const char* id) : FactoryHolder<CreatureAI>(id) { } }; template<class REAL_AI> struct CreatureAIFactory : public SelectableAI { - CreatureAIFactory(const char* name) : SelectableAI(name) {} + CreatureAIFactory(const char* name) : SelectableAI(name) { } CreatureAI* Create(void*) const; @@ -53,13 +53,13 @@ typedef FactoryHolder<CreatureAI>::FactoryHolderRepository CreatureAIRepository; //GO struct SelectableGameObjectAI : public FactoryHolder<GameObjectAI>, public Permissible<GameObject> { - SelectableGameObjectAI(const char* id) : FactoryHolder<GameObjectAI>(id) {} + SelectableGameObjectAI(const char* id) : FactoryHolder<GameObjectAI>(id) { } }; template<class REAL_GO_AI> struct GameObjectAIFactory : public SelectableGameObjectAI { - GameObjectAIFactory(const char* name) : SelectableGameObjectAI(name) {} + GameObjectAIFactory(const char* name) : SelectableGameObjectAI(name) { } GameObjectAI* Create(void*) const; diff --git a/src/server/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h index 6c5cb5622b3..6b190938596 100644 --- a/src/server/game/AI/CreatureAIImpl.h +++ b/src/server/game/AI/CreatureAIImpl.h @@ -327,7 +327,7 @@ class EventMap typedef std::multimap<uint32, uint32> EventStore; public: - EventMap() : _time(0), _phase(0) {} + EventMap() : _time(0), _phase(0) { } /** * @name Reset @@ -686,7 +686,7 @@ enum AICondition struct AISpellInfoType { AISpellInfoType() : target(AITARGET_SELF), condition(AICOND_COMBAT) - , cooldown(AI_DEFAULT_COOLDOWN), realCooldown(0), maxRange(0.0f){} + , cooldown(AI_DEFAULT_COOLDOWN), realCooldown(0), maxRange(0.0f){ } AITarget target; AICondition condition; uint32 cooldown; diff --git a/src/server/game/AI/EventAI/CreatureEventAI.h b/src/server/game/AI/EventAI/CreatureEventAI.h index d98dbfdc234..c16f0901b05 100644 --- a/src/server/game/AI/EventAI/CreatureEventAI.h +++ b/src/server/game/AI/EventAI/CreatureEventAI.h @@ -564,7 +564,7 @@ typedef UNORDERED_MAP<uint32, CreatureEventAI_Summon> CreatureEventAI_Summon_Map struct CreatureEventAIHolder { - CreatureEventAIHolder(CreatureEventAI_Event const& p) : Event(p), Time(0), Enabled(true){} + CreatureEventAIHolder(CreatureEventAI_Event const& p) : Event(p), Time(0), Enabled(true){ } CreatureEventAI_Event Event; uint32 Time; @@ -592,7 +592,7 @@ class CreatureEventAI : public CreatureAI void MoveInLineOfSight(Unit* who); void SpellHit(Unit* unit, const SpellInfo* spell); void DamageTaken(Unit* done_by, uint32& damage); - void HealReceived(Unit* /*done_by*/, uint32& /*addhealth*/) {} + void HealReceived(Unit* /*done_by*/, uint32& /*addhealth*/) { } void UpdateAI(uint32 diff); void ReceiveEmote(Player* player, uint32 textEmote); static int Permissible(const Creature*); diff --git a/src/server/game/AI/EventAI/CreatureEventAIMgr.h b/src/server/game/AI/EventAI/CreatureEventAIMgr.h index 8e862a9279b..577958b6f5b 100644 --- a/src/server/game/AI/EventAI/CreatureEventAIMgr.h +++ b/src/server/game/AI/EventAI/CreatureEventAIMgr.h @@ -27,8 +27,8 @@ class CreatureEventAIMgr friend class ACE_Singleton<CreatureEventAIMgr, ACE_Null_Mutex>; private: - CreatureEventAIMgr(){} - ~CreatureEventAIMgr(){} + CreatureEventAIMgr(){ } + ~CreatureEventAIMgr(){ } public: void LoadCreatureEventAI_Texts(); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index f5d6932db00..837129fdaa6 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -448,9 +448,7 @@ BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature), instance(creature->GetInstanceScript()), summons(creature), _boundary(instance ? instance->GetBossBoundary(bossId) : NULL), - _bossId(bossId) -{ -} + _bossId(bossId) { } void BossAI::_Reset() { @@ -584,9 +582,7 @@ void BossAI::UpdateAI(uint32 diff) WorldBossAI::WorldBossAI(Creature* creature) : ScriptedAI(creature), - summons(creature) -{ -} + summons(creature) { } void WorldBossAI::_Reset() { diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 4523080adbd..a111898e3e1 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -116,7 +116,7 @@ private: class EntryCheckPredicate { public: - EntryCheckPredicate(uint32 entry) : _entry(entry) {} + EntryCheckPredicate(uint32 entry) : _entry(entry) { } bool operator()(uint64 guid) { return GUID_ENPART(guid) == _entry; } private: @@ -132,7 +132,7 @@ class DummyEntryCheckPredicate struct ScriptedAI : public CreatureAI { explicit ScriptedAI(Creature* creature); - virtual ~ScriptedAI() {} + virtual ~ScriptedAI() { } // ************* //CreatureAI Functions @@ -141,34 +141,34 @@ struct ScriptedAI : public CreatureAI void AttackStartNoMove(Unit* target); // Called at any Damage from any attacker (before damage apply) - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) {} + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) { } //Called at World update tick virtual void UpdateAI(uint32 diff); //Called at creature death - void JustDied(Unit* /*killer*/) {} + void JustDied(Unit* /*killer*/) { } //Called at creature killing another unit - void KilledUnit(Unit* /*victim*/) {} + void KilledUnit(Unit* /*victim*/) { } // Called when the creature summon successfully other creature - void JustSummoned(Creature* /*summon*/) {} + void JustSummoned(Creature* /*summon*/) { } // Called when a summoned creature is despawned - void SummonedCreatureDespawn(Creature* /*summon*/) {} + void SummonedCreatureDespawn(Creature* /*summon*/) { } // Called when hit by a spell - void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) {} + void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) { } // Called when spell hits a target - void SpellHitTarget(Unit* /*target*/, SpellInfo const* /*spell*/) {} + void SpellHitTarget(Unit* /*target*/, SpellInfo const* /*spell*/) { } //Called at waypoint reached or PointMovement end - void MovementInform(uint32 /*type*/, uint32 /*id*/) {} + void MovementInform(uint32 /*type*/, uint32 /*id*/) { } // Called when AI is temporarily replaced or put back when possess is applied or removed - void OnPossess(bool /*apply*/) {} + void OnPossess(bool /*apply*/) { } // ************* // Variables @@ -185,10 +185,10 @@ struct ScriptedAI : public CreatureAI // ************* //Called at creature reset either by death or evade - void Reset() {} + void Reset() { } //Called at creature aggro either by MoveInLOS or Attack Start - void EnterCombat(Unit* /*victim*/) {} + void EnterCombat(Unit* /*victim*/) { } // Called before EnterCombat even before the creature is in combat. void AttackStart(Unit* /*target*/); @@ -334,7 +334,7 @@ class BossAI : public ScriptedAI { public: BossAI(Creature* creature, uint32 bossId); - virtual ~BossAI() {} + virtual ~BossAI() { } InstanceScript* const instance; BossBoundaryMap const* GetBoundary() const { return _boundary; } @@ -385,7 +385,7 @@ class WorldBossAI : public ScriptedAI { public: WorldBossAI(Creature* creature); - virtual ~WorldBossAI() {} + virtual ~WorldBossAI() { } void JustSummoned(Creature* summon); void SummonedCreatureDespawn(Creature* summon); diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index ef15ef27ec4..a21e7787197 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -35,7 +35,7 @@ npc_escortAI::npc_escortAI(Creature* creature) : ScriptedAI(creature), DespawnAtFar(true), ScriptWP(false), HasImmuneToNPCFlags(false) -{} +{ } void npc_escortAI::AttackStart(Unit* who) { diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h index 919b24a916c..4b0f4e97a1c 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h @@ -39,7 +39,7 @@ struct npc_escortAI : public ScriptedAI { public: explicit npc_escortAI(Creature* creature); - ~npc_escortAI() {} + ~npc_escortAI() { } // CreatureAI functions void AttackStart(Unit* who); @@ -72,7 +72,7 @@ struct npc_escortAI : public ScriptedAI bool GetWaypointPosition(uint32 pointId, float& x, float& y, float& z); virtual void WaypointReached(uint32 pointId) = 0; - virtual void WaypointStart(uint32 /*pointId*/) {} + virtual void WaypointStart(uint32 /*pointId*/) { } void Start(bool isActiveAttacker = true, bool run = false, uint64 playerGUID = 0, Quest const* quest = NULL, bool instantRespawn = false, bool canLoopPath = false, bool resetWaypoints = true); diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index befd6b9d16e..a5176644f34 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -26,7 +26,7 @@ FollowerAI::FollowerAI(Creature* creature) : ScriptedAI(creature), m_uiUpdateFollowTimer(2500), m_uiFollowState(STATE_FOLLOW_NONE), m_pQuestForFollow(NULL) -{} +{ } void FollowerAI::AttackStart(Unit* who) { diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h index ccc8af6197a..cdd6d31c0b4 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h @@ -22,7 +22,7 @@ class FollowerAI : public ScriptedAI { public: explicit FollowerAI(Creature* creature); - ~FollowerAI() {} + ~FollowerAI() { } //virtual void WaypointReached(uint32 uiPointId) = 0; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 57fd7ea2d73..4ec0a3e52f2 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -674,9 +674,7 @@ void SmartAI::SummonedCreatureDespawn(Creature* unit) GetScript()->ProcessEventsFor(SMART_EVENT_SUMMON_DESPAWNED, unit); } -void SmartAI::UpdateAIWhileCharmed(const uint32 /*diff*/) -{ -} +void SmartAI::UpdateAIWhileCharmed(const uint32 /*diff*/) { } void SmartAI::CorpseRemoved(uint32& respawnDelay) { @@ -720,9 +718,7 @@ void SmartAI::SetData(uint32 id, uint32 value) GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, NULL, id, value); } -void SmartAI::SetGUID(uint64 /*guid*/, int32 /*id*/) -{ -} +void SmartAI::SetGUID(uint64 /*guid*/, int32 /*id*/) { } uint64 SmartAI::GetGUID(int32 /*id*/) const { @@ -755,9 +751,7 @@ void SmartAI::sGossipSelect(Player* player, uint32 sender, uint32 action) GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action); } -void SmartAI::sGossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) -{ -} +void SmartAI::sGossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { } void SmartAI::sQuestAccept(Player* player, Quest const* quest) { @@ -933,7 +927,7 @@ class SmartTrigger : public AreaTriggerScript { public: - SmartTrigger() : AreaTriggerScript("SmartTrigger") {} + SmartTrigger() : AreaTriggerScript("SmartTrigger") { } bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) { diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 4b4909e9c6c..ae6719aa8f3 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -45,7 +45,7 @@ enum SmartEscortVars class SmartAI : public CreatureAI { public: - ~SmartAI(){} + ~SmartAI(){ } explicit SmartAI(Creature* c); // Start moving to the desired MovePoint @@ -237,8 +237,8 @@ class SmartAI : public CreatureAI class SmartGameObjectAI : public GameObjectAI { public: - SmartGameObjectAI(GameObject* g) : GameObjectAI(g), go(g) {} - ~SmartGameObjectAI() {} + SmartGameObjectAI(GameObject* g) : GameObjectAI(g), go(g) { } + ~SmartGameObjectAI() { } void UpdateAI(uint32 diff); void InitializeAI(); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 3823f7ba287..d064c5e62bc 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -34,6 +34,7 @@ #include "SmartScript.h" #include "SpellMgr.h" #include "Vehicle.h" +#include "MoveSplineInit.h" #include "GameEventMgr.h" class TrinityStringTextBuilder @@ -251,7 +252,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (IsUnit(*itr)) { - (*itr)->SendPlaySound(e.action.sound.sound, e.action.sound.onlySelf > 0 ? true : false); + (*itr)->SendPlaySound(e.action.sound.sound, e.action.sound.onlySelf > 0); TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SOUND: target: %s (GuidLow: %u), sound: %u, onlyself: %u", (*itr)->GetName().c_str(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.onlySelf); } @@ -507,18 +508,20 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) { - if (IsUnit(*itr)) + if (!IsUnit(*itr)) + continue; + + if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell)) { if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS) me->InterruptNonMeleeSpells(false); - if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell)) - me->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false); - else - TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId())); + me->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED)); TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_CAST:: Creature %u casts spell %u on target %u with castflags %u", me->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags); } + else + TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId())); } delete targets; @@ -536,19 +539,20 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) { - if (IsUnit(*itr)) - { - if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS) - tempLastInvoker->InterruptNonMeleeSpells(false); + if (!IsUnit(*itr)) + continue; if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell)) - tempLastInvoker->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false); + { + if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS) + tempLastInvoker->InterruptNonMeleeSpells(false); + + tempLastInvoker->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED)); + TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell %u on target %u with castflags %u", + tempLastInvoker->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags); + } else TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId())); - - TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell %u on target %u with castflags %u", - tempLastInvoker->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags); - } } delete targets; @@ -693,7 +697,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetAutoAttack(e.action.autoAttack.attack ? true : false); + CAST_AI(SmartAI, me->AI())->SetAutoAttack(e.action.autoAttack.attack); TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_AUTO_ATTACK: Creature: %u bool on = %u", me->GetGUIDLow(), e.action.autoAttack.attack); break; @@ -703,7 +707,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - bool move = e.action.combatMove.move ? true : false; + bool move = e.action.combatMove.move; CAST_AI(SmartAI, me->AI())->SetCombatMove(move); TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_ALLOW_COMBAT_MOVEMENT: Creature %u bool on = %u", me->GetGUIDLow(), e.action.combatMove.move); @@ -1278,7 +1282,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly ? true : false); + CAST_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly); break; } case SMART_ACTION_SET_RUN: @@ -1286,7 +1290,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetRun(e.action.setRun.run ? true : false); + CAST_AI(SmartAI, me->AI())->SetRun(e.action.setRun.run); break; } case SMART_ACTION_SET_SWIM: @@ -1294,7 +1298,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetSwim(e.action.setSwim.swim ? true : false); + CAST_AI(SmartAI, me->AI())->SetSwim(e.action.setSwim.swim); break; } case SMART_ACTION_WP_START: @@ -1302,9 +1306,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - bool run = e.action.wpStart.run ? true : false; + bool run = e.action.wpStart.run; uint32 entry = e.action.wpStart.pathID; - bool repeat = e.action.wpStart.repeat ? true : false; + bool repeat = e.action.wpStart.repeat; ObjectList* targets = GetTargets(e, unit); StoreTargetList(targets, SMART_ESCORT_TARGETS); me->SetReactState((ReactStates)e.action.wpStart.reactState); @@ -1332,7 +1336,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u uint32 DespawnTime = e.action.wpStop.despawnTime; uint32 quest = e.action.wpStop.quest; - bool fail = e.action.wpStop.fail ? true : false; + bool fail = e.action.wpStop.fail; CAST_AI(SmartAI, me->AI())->StopPath(DespawnTime, quest, fail); break; } @@ -1350,7 +1354,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; if (e.GetTargetType() == SMART_TARGET_SELF) - me->SetFacingTo(me->GetHomePosition().GetOrientation()); + me->SetFacingTo((me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && me->GetTransGUID() ? + me->GetTransportHomePosition() : me->GetHomePosition()).GetOrientation()); else if (e.GetTargetType() == SMART_TARGET_POSITION) me->SetFacingTo(e.target.o); else if (ObjectList* targets = GetTargets(e, unit)) @@ -1403,7 +1408,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } if (!target) - me->GetMotionMaster()->MovePoint(e.action.MoveToPos.pointId, e.target.x, e.target.y, e.target.z); + { + G3D::Vector3 dest(e.target.x, e.target.y, e.target.z); + if (e.action.MoveToPos.transport) + if (TransportBase* trans = me->GetDirectTransport()) + trans->CalculatePassengerPosition(dest.x, dest.y, dest.z); + + me->GetMotionMaster()->MovePoint(e.action.MoveToPos.pointId, dest.x, dest.y, dest.z); + } else me->GetMotionMaster()->MovePoint(e.action.MoveToPos.pointId, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); break; @@ -1659,21 +1671,28 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (ObjectList::const_iterator itr = casters->begin(); itr != casters->end(); ++itr) { - if (IsUnit(*itr)) + if (!IsUnit(*itr)) + continue; + + bool interruptedSpell = false; + + for (ObjectList::const_iterator it = targets->begin(); it != targets->end(); ++it) { - if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS) - (*itr)->ToUnit()->InterruptNonMeleeSpells(false); + if (!IsUnit(*it)) + continue; - for (ObjectList::const_iterator it = targets->begin(); it != targets->end(); ++it) + if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*it)->ToUnit()->HasAura(e.action.cast.spell)) { - if (IsUnit(*it)) + if (!interruptedSpell && e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS) { - if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*it)->ToUnit()->HasAura(e.action.cast.spell)) - (*itr)->ToUnit()->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false); - else - TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*it)->GetGUID(), (*it)->GetEntry(), uint32((*it)->GetTypeId())); + (*itr)->ToUnit()->InterruptNonMeleeSpells(false); + interruptedSpell = true; } + + (*itr)->ToUnit()->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED)); } + else + TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*it)->GetGUID(), (*it)->GetEntry(), uint32((*it)->GetTypeId())); } } @@ -2031,7 +2050,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) if (IsCreature(*itr)) - (*itr)->ToCreature()->setRegeneratingHealth(e.action.setHealthRegen.regenHealth ? true : false); + (*itr)->ToCreature()->setRegeneratingHealth(e.action.setHealthRegen.regenHealth); delete targets; break; @@ -2044,7 +2063,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) if (IsCreature(*itr)) - (*itr)->ToCreature()->SetControlled(e.action.setRoot.root ? true : false, UNIT_STATE_ROOT); + (*itr)->ToCreature()->SetControlled(e.action.setRoot.root, UNIT_STATE_ROOT); delete targets; break; @@ -2500,7 +2519,7 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /* } case SMART_TARGET_CLOSEST_CREATURE: { - Creature* target = GetClosestCreatureWithEntry(baseObject, e.target.closest.entry, (float)(e.target.closest.dist ? e.target.closest.dist : 100), e.target.closest.dead ? false : true); + Creature* target = GetClosestCreatureWithEntry(baseObject, e.target.closest.entry, (float)(e.target.closest.dist ? e.target.closest.dist : 100), !e.target.closest.dead); if (target) l->push_back(target); break; @@ -2667,7 +2686,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui ProcessTimedAction(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax, me->GetVictim()); break; } - case SMART_EVENT_TARGET_CASTING: + case SMART_EVENT_VICTIM_CASTING: { if (!me || !me->IsInCombat()) return; @@ -3129,7 +3148,7 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff) case SMART_EVENT_MANA_PCT: case SMART_EVENT_TARGET_MANA_PCT: case SMART_EVENT_RANGE: - case SMART_EVENT_TARGET_CASTING: + case SMART_EVENT_VICTIM_CASTING: case SMART_EVENT_FRIENDLY_HEALTH: case SMART_EVENT_FRIENDLY_IS_CC: case SMART_EVENT_FRIENDLY_MISSING_BUFF: @@ -3344,43 +3363,29 @@ void SmartScript::OnMoveInLineOfSight(Unit* who) } /* -void SmartScript::UpdateAIWhileCharmed(const uint32 diff) -{ -} +void SmartScript::UpdateAIWhileCharmed(const uint32 diff) { } -void SmartScript::DoAction(const int32 param) -{ -} +void SmartScript::DoAction(const int32 param) { } uint32 SmartScript::GetData(uint32 id) { return 0; } -void SmartScript::SetData(uint32 id, uint32 value) -{ -} +void SmartScript::SetData(uint32 id, uint32 value) { } -void SmartScript::SetGUID(uint64 guid, int32 id) -{ -} +void SmartScript::SetGUID(uint64 guid, int32 id) { } uint64 SmartScript::GetGUID(int32 id) { return 0; } -void SmartScript::MovepointStart(uint32 id) -{ -} +void SmartScript::MovepointStart(uint32 id) { } -void SmartScript::SetRun(bool run) -{ -} +void SmartScript::SetRun(bool run) { } -void SmartScript::SetMovePathEndAction(SMART_ACTION action) -{ -} +void SmartScript::SetMovePathEndAction(SMART_ACTION action) { } uint32 SmartScript::DoChat(int8 id, uint64 whisperGuid) { diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 361cf025647..87c35d59cc0 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -438,7 +438,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) if (e.event.kill.creature && !IsCreatureValid(e, e.event.kill.creature)) return false; break; - case SMART_EVENT_TARGET_CASTING: + case SMART_EVENT_VICTIM_CASTING: if (e.event.targetCasting.spellId > 0 && !sSpellMgr->GetSpellInfo(e.event.targetCasting.spellId)) { sLog->outError(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Spell entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.spellHit.spell); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 56fa7ed1275..50289d9c620 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -94,7 +94,7 @@ enum SMART_EVENT SMART_EVENT_OOC_LOS = 10, // NoHostile, MaxRnage, CooldownMin, CooldownMax SMART_EVENT_RESPAWN = 11, // type, MapId, ZoneId SMART_EVENT_TARGET_HEALTH_PCT = 12, // HPMin%, HPMax%, RepeatMin, RepeatMax - SMART_EVENT_TARGET_CASTING = 13, // RepeatMin, RepeatMax, spellid + SMART_EVENT_VICTIM_CASTING = 13, // RepeatMin, RepeatMax, spellid SMART_EVENT_FRIENDLY_HEALTH = 14, // HPDeficit, Radius, RepeatMin, RepeatMax SMART_EVENT_FRIENDLY_IS_CC = 15, // Radius, RepeatMin, RepeatMax SMART_EVENT_FRIENDLY_MISSING_BUFF = 16, // SpellId, Radius, RepeatMin, RepeatMax @@ -907,6 +907,7 @@ struct SmartAction struct { uint32 pointId; + uint32 transport; } MoveToPos; struct @@ -1195,7 +1196,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = {SMART_EVENT_OOC_LOS, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_RESPAWN, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_TARGET_HEALTH_PCT, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_TARGET_CASTING, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_VICTIM_CASTING, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_FRIENDLY_HEALTH, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_FRIENDLY_IS_CC, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_FRIENDLY_MISSING_BUFF, SMART_SCRIPT_TYPE_MASK_CREATURE }, @@ -1290,7 +1291,7 @@ struct SmartScriptHolder { SmartScriptHolder() : entryOrGuid(0), source_type(SMART_SCRIPT_TYPE_CREATURE) , event_id(0), link(0), event(), action(), target(), timer(0), active(false), runOnce(false) - , enableTimed(false) {} + , enableTimed(false) { } int32 entryOrGuid; SmartScriptType source_type; @@ -1321,7 +1322,7 @@ typedef UNORDERED_MAP<uint32, ObjectList*> ObjectListMap; class SmartWaypointMgr { friend class ACE_Singleton<SmartWaypointMgr, ACE_Null_Mutex>; - SmartWaypointMgr() {} + SmartWaypointMgr() { } public: ~SmartWaypointMgr(); @@ -1347,9 +1348,9 @@ typedef UNORDERED_MAP<int32, SmartAIEventList> SmartAIEventMap; class SmartAIMgr { friend class ACE_Singleton<SmartAIMgr, ACE_Null_Mutex>; - SmartAIMgr(){} + SmartAIMgr(){ } public: - ~SmartAIMgr(){} + ~SmartAIMgr(){ } void LoadSmartAIFromDB(); diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index 6d79c6c77a1..4d95b913e05 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -25,9 +25,7 @@ #include "SHA1.h" #include "WorldSession.h" -AccountMgr::AccountMgr() -{ -} +AccountMgr::AccountMgr() { } AccountMgr::~AccountMgr() { @@ -466,7 +464,7 @@ void AccountMgr::LoadRBAC() secId = newId; permissions = &_defaultPermissions[secId]; } - + permissions->insert(field[1].GetUInt32()); ++count3; } diff --git a/src/server/game/Accounts/RBAC.cpp b/src/server/game/Accounts/RBAC.cpp index 8cd70721976..f7c9444cdb0 100644 --- a/src/server/game/Accounts/RBAC.cpp +++ b/src/server/game/Accounts/RBAC.cpp @@ -231,13 +231,13 @@ void RBACData::ExpandPermissions(RBACPermissionContainer& permissions) {
RBACPermissionContainer toCheck = permissions;
permissions.clear();
-
+
while (!toCheck.empty())
{
// remove the permission from original list
uint32 permissionId = *toCheck.begin();
toCheck.erase(toCheck.begin());
-
+
RBACPermission const* permission = sAccountMgr->GetRBACPermission(permissionId);
if (!permission)
continue;
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index e12e6835cb8..bcc4122ea5b 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -303,7 +303,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_GOBJECT_SET_STATE = 397, RBAC_PERM_COMMAND_GOBJECT_TARGET = 398, RBAC_PERM_COMMAND_GOBJECT_TURN = 399, - // 400 - reuse + RBAC_PERM_COMMAND_DEBUG_TRANSPORT = 400, RBAC_PERM_COMMAND_GUILD = 401, RBAC_PERM_COMMAND_GUILD_CREATE = 402, RBAC_PERM_COMMAND_GUILD_DELETE = 403, diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index befe591c321..2449aa76992 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -47,7 +47,7 @@ namespace Trinity { public: AchievementChatBuilder(Player const& player, ChatMsg msgtype, int32 textId, uint32 ach_id) - : i_player(player), i_msgtype(msgtype), i_textId(textId), i_achievementId(ach_id) {} + : i_player(player), i_msgtype(msgtype), i_textId(textId), i_achievementId(ach_id) { } void operator()(WorldPacket& data, LocaleConstant loc_idx) { char const* text = sObjectMgr->GetTrinityString(i_textId, loc_idx); @@ -437,9 +437,7 @@ AchievementMgr::AchievementMgr(Player* player) m_player = player; } -AchievementMgr::~AchievementMgr() -{ -} +AchievementMgr::~AchievementMgr() { } void AchievementMgr::Reset() { diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index f57c05a2769..65a936c3d40 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -202,7 +202,7 @@ struct AchievementCriteriaData struct AchievementCriteriaDataSet { - AchievementCriteriaDataSet() : criteria_id(0) {} + AchievementCriteriaDataSet() : criteria_id(0) { } typedef std::vector<AchievementCriteriaData> Storage; void Add(AchievementCriteriaData const& data) { storage.push_back(data); } bool Meets(Player const* source, Unit const* target, uint32 miscValue = 0) const; @@ -293,8 +293,8 @@ class AchievementMgr class AchievementGlobalMgr { friend class ACE_Singleton<AchievementGlobalMgr, ACE_Null_Mutex>; - AchievementGlobalMgr() {} - ~AchievementGlobalMgr() {} + AchievementGlobalMgr() { } + ~AchievementGlobalMgr() { } public: AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type) const diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index ef50746b9ea..7c3c1a59712 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -37,9 +37,7 @@ enum eAuctionHouse AH_MINIMUM_DEPOSIT = 100 }; -AuctionHouseMgr::AuctionHouseMgr() -{ -} +AuctionHouseMgr::AuctionHouseMgr() { } AuctionHouseMgr::~AuctionHouseMgr() { diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index 788bbf9cb2e..70805dd3a97 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -80,7 +80,7 @@ class BfCapturePoint virtual ~BfCapturePoint() { } - virtual void FillInitialWorldStates(WorldPacket& /*data*/) {} + virtual void FillInitialWorldStates(WorldPacket& /*data*/) { } // Send world state update to all players present void SendUpdateWorldState(uint32 field, uint32 value); @@ -98,7 +98,7 @@ class BfCapturePoint // Returns true if the state of the objective has changed, in this case, the OutdoorPvP must send a world state ui update. virtual bool Update(uint32 diff); - virtual void ChangeTeam(TeamId /*oldTeam*/) {} + virtual void ChangeTeam(TeamId /*oldTeam*/) { } virtual void SendChangePhase(); bool SetCapturePointData(GameObject* capturePoint); @@ -223,7 +223,7 @@ class Battlefield : public ZoneScript void InvitePlayersInZoneToWar(); /// Called when a Unit is kill in battlefield zone - virtual void HandleKill(Player* /*killer*/, Unit* /*killed*/) {}; + virtual void HandleKill(Player* /*killer*/, Unit* /*killed*/) { }; uint32 GetTypeId() { return m_TypeId; } uint32 GetZoneId() { return m_ZoneId; } @@ -398,7 +398,7 @@ class Battlefield : public ZoneScript void KickAfkPlayers(); // use for switch off all worldstate for client - virtual void SendRemoveWorldStates(Player* /*player*/) {} + virtual void SendRemoveWorldStates(Player* /*player*/) { } // use for send a packet for all player list void BroadcastPacketToZone(WorldPacket& data) const; diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index 6103ff4c5ce..f246f15a81d 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -166,7 +166,7 @@ bool BattlefieldWG::SetupBattlefield() { Position towerCannonPos; WGTurret[i].GetPosition(&towerCannonPos); - if (Creature* creature = SpawnCreature(NPC_TOWER_CANNON, towerCannonPos, TEAM_ALLIANCE)) + if (Creature* creature = SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos, TEAM_ALLIANCE)) { CanonList.insert(creature->GetGUID()); HideNpc(creature); diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h index e13eddd7672..ee18545b0c4 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.h +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h @@ -208,7 +208,6 @@ enum WintergraspNpcs NPC_TAUNKA_SPIRIT_GUIDE = 31841, // Horde spirit guide for Wintergrasp NPC_DWARVEN_SPIRIT_GUIDE = 31842, // Alliance spirit guide for Wintergrasp - NPC_TOWER_CANNON = 28366, NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE = 28312, NPC_WINTERGRASP_SIEGE_ENGINE_HORDE = 32627, @@ -1338,7 +1337,7 @@ struct BfWGGameObjectBuilding { Position towerCannonPos; TowerCannon[towerid].TurretTop[i].GetPosition(&towerCannonPos); - if (Creature* turret = m_WG->SpawnCreature(28366, towerCannonPos, TeamId(0))) + if (Creature* turret = m_WG->SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos, TeamId(0))) { m_TurretTopList.insert(turret->GetGUID()); switch (go->GetEntry()) diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 211ab6caf77..8f0cc0c8688 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -87,7 +87,7 @@ namespace Trinity { public: Battleground2ChatBuilder(ChatMsg msgtype, int32 textId, Player const* source, int32 arg1, int32 arg2) - : _msgtype(msgtype), _textId(textId), _source(source), _arg1(arg1), _arg2(arg2) {} + : _msgtype(msgtype), _textId(textId), _source(source), _arg1(arg1), _arg2(arg2) { } void operator()(WorldPacket& data, LocaleConstant loc_idx) { @@ -1894,9 +1894,7 @@ int32 Battleground::GetObjectType(uint64 guid) return -1; } -void Battleground::HandleKillUnit(Creature* /*victim*/, Player* /*killer*/) -{ -} +void Battleground::HandleKillUnit(Creature* /*victim*/, Player* /*killer*/) { } void Battleground::CheckArenaAfterTimerConditions() { diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 76ff08e0281..eebf5bead25 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -162,7 +162,7 @@ struct BattlegroundPlayer struct BattlegroundObjectInfo { - BattlegroundObjectInfo() : object(NULL), timer(0), spellid(0) {} + BattlegroundObjectInfo() : object(NULL), timer(0), spellid(0) { } GameObject *object; int32 timer; @@ -287,7 +287,7 @@ class Battleground virtual void StartingEventOpenDoors() { } virtual void ResetBGSubclass() { } // must be implemented in BG subclass - virtual void DestroyGate(Player* /*player*/, GameObject* /*go*/) {} + virtual void DestroyGate(Player* /*player*/, GameObject* /*go*/) { } /* achievement req. */ virtual bool IsAllNodesControlledByTeam(uint32 /*team*/) const { return false; } @@ -409,7 +409,7 @@ class Battleground // Packet Transfer // method that should fill worldpacket with actual world states (not yet implemented for all battlegrounds!) - virtual void FillInitialWorldStates(WorldPacket& /*data*/) {} + virtual void FillInitialWorldStates(WorldPacket& /*data*/) { } void SendPacketToTeam(uint32 TeamID, WorldPacket* packet, Player* sender = NULL, bool self = true); void SendPacketToAll(WorldPacket* packet); void YellToAll(Creature* creature, const char* text, uint32 language); @@ -474,17 +474,17 @@ class Battleground virtual void HandleKillUnit(Creature* /*unit*/, Player* /*killer*/); // Battleground events - virtual void EventPlayerDroppedFlag(Player* /*player*/) {} - virtual void EventPlayerClickedOnFlag(Player* /*player*/, GameObject* /*target_obj*/) {} + virtual void EventPlayerDroppedFlag(Player* /*player*/) { } + virtual void EventPlayerClickedOnFlag(Player* /*player*/, GameObject* /*target_obj*/) { } void EventPlayerLoggedIn(Player* player); void EventPlayerLoggedOut(Player* player); - virtual void EventPlayerDamagedGO(Player* /*player*/, GameObject* /*go*/, uint32 /*eventType*/) {} - virtual void EventPlayerUsedGO(Player* /*player*/, GameObject* /*go*/){} + virtual void EventPlayerDamagedGO(Player* /*player*/, GameObject* /*go*/, uint32 /*eventType*/) { } + virtual void EventPlayerUsedGO(Player* /*player*/, GameObject* /*go*/){ } // this function can be used by spell to interact with the BG map - virtual void DoAction(uint32 /*action*/, uint64 /*var*/) {} + virtual void DoAction(uint32 /*action*/, uint64 /*var*/) { } - virtual void HandlePlayerResurrect(Player* /*player*/) {} + virtual void HandlePlayerResurrect(Player* /*player*/) { } // Death related virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player); @@ -531,8 +531,8 @@ class Battleground bool CanAwardArenaPoints() const { return m_LevelMin >= BG_AWARD_ARENA_POINTS_MIN_LEVEL; } virtual uint64 GetFlagPickerGUID(int32 /*team*/ = -1) const { return 0; } - virtual void SetDroppedFlagGUID(uint64 /*guid*/, int32 /*team*/ = -1) {} - virtual void HandleQuestComplete(uint32 /*questid*/, Player* /*player*/) {} + virtual void SetDroppedFlagGUID(uint64 /*guid*/, int32 /*team*/ = -1) { } + virtual void HandleQuestComplete(uint32 /*questid*/, Player* /*player*/) { } virtual bool CanActivateGO(int32 /*entry*/, uint32 /*team*/) const { return true; } virtual bool IsSpellAllowed(uint32 /*spellId*/, Player const* /*player*/) const { return true; } uint32 GetTeamScore(uint32 TeamID) const; @@ -559,7 +559,7 @@ class Battleground // Scorekeeping BattlegroundScoreMap PlayerScores; // Player scores // must be implemented in BG subclass - virtual void RemovePlayer(Player* /*player*/, uint64 /*guid*/, uint32 /*team*/) {} + virtual void RemovePlayer(Player* /*player*/, uint64 /*guid*/, uint32 /*team*/) { } // Player lists, those need to be accessible by inherited classes BattlegroundPlayerMap m_Players; diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h index 0595d73fcc6..34c9e5ea1c7 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.h +++ b/src/server/game/Battlegrounds/BattlegroundQueue.h @@ -106,7 +106,7 @@ class BattlegroundQueue class SelectionPool { public: - SelectionPool(): PlayerCount(0) {}; + SelectionPool(): PlayerCount(0) { }; void Init(); bool AddGroup(GroupQueueInfo* ginfo, uint32 desiredCount); bool KickGroup(uint32 size); @@ -163,9 +163,9 @@ class BGQueueRemoveEvent : public BasicEvent public: BGQueueRemoveEvent(uint64 pl_guid, uint32 bgInstanceGUID, BattlegroundTypeId BgTypeId, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime) : m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_RemoveTime(removeTime), m_BgTypeId(BgTypeId), m_BgQueueTypeId(bgQueueTypeId) - {} + { } - virtual ~BGQueueRemoveEvent() {} + virtual ~BGQueueRemoveEvent() { } virtual bool Execute(uint64 e_time, uint32 p_time); virtual void Abort(uint64 e_time); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index da292d050e9..d7cb4af5a42 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -41,9 +41,7 @@ BattlegroundAB::BattlegroundAB() StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_AB_HAS_BEGUN; } -BattlegroundAB::~BattlegroundAB() -{ -} +BattlegroundAB::~BattlegroundAB() { } void BattlegroundAB::PostUpdateImpl(uint32 diff) { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index f8c9e888176..d5d9ac7577f 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -39,9 +39,7 @@ BattlegroundAV::BattlegroundAV() StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_AV_HAS_BEGUN; } -BattlegroundAV::~BattlegroundAV() -{ -} +BattlegroundAV::~BattlegroundAV() { } uint16 BattlegroundAV::GetBonusHonor(uint8 kills) /// @todo move this function to Battleground.cpp (needs to find a way to get m_MaxLevel) { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 95808065d62..600106dbdc1 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -50,9 +50,7 @@ BattlegroundEY::BattlegroundEY() StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_EY_HAS_BEGUN; } -BattlegroundEY::~BattlegroundEY() -{ -} +BattlegroundEY::~BattlegroundEY() { } void BattlegroundEY::PostUpdateImpl(uint32 diff) { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index f03b458e7ff..26c6d276311 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -249,7 +249,7 @@ enum BG_EY_Objectives struct BattlegroundEYPointIconsStruct { BattlegroundEYPointIconsStruct(uint32 _WorldStateControlIndex, uint32 _WorldStateAllianceControlledIndex, uint32 _WorldStateHordeControlledIndex) - : WorldStateControlIndex(_WorldStateControlIndex), WorldStateAllianceControlledIndex(_WorldStateAllianceControlledIndex), WorldStateHordeControlledIndex(_WorldStateHordeControlledIndex) {} + : WorldStateControlIndex(_WorldStateControlIndex), WorldStateAllianceControlledIndex(_WorldStateAllianceControlledIndex), WorldStateHordeControlledIndex(_WorldStateHordeControlledIndex) { } uint32 WorldStateControlIndex; uint32 WorldStateAllianceControlledIndex; uint32 WorldStateHordeControlledIndex; @@ -270,7 +270,7 @@ struct BattlegroundEYLosingPointStruct : SpawnNeutralObjectType(_SpawnNeutralObjectType), DespawnObjectTypeAlliance(_DespawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance), DespawnObjectTypeHorde(_DespawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde) - {} + { } uint32 SpawnNeutralObjectType; uint32 DespawnObjectTypeAlliance; @@ -286,7 +286,7 @@ struct BattlegroundEYCapturingPointStruct SpawnObjectTypeAlliance(_SpawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance), SpawnObjectTypeHorde(_SpawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde), GraveYardId(_GraveYardId) - {} + { } uint32 DespawnNeutralObjectType; uint32 SpawnObjectTypeAlliance; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index 29d4e4124c0..60a725b3eb7 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -45,6 +45,7 @@ BattlegroundIC::BattlegroundIC() closeFortressDoorsTimer = CLOSE_DOORS_TIME; // the doors are closed again... in a special way doorsClosed = false; + docksTimer = DOCKS_UPDATE_TIME; resourceTimer = IC_RESOURCE_TIME; for (uint8 i = NODE_TYPE_REFINERY; i < MAX_NODE_TYPES; ++i) @@ -56,11 +57,7 @@ BattlegroundIC::BattlegroundIC() gunshipAlliance = NULL; } -BattlegroundIC::~BattlegroundIC() -{ - delete gunshipHorde; - delete gunshipAlliance; -} +BattlegroundIC::~BattlegroundIC() { } void BattlegroundIC::HandlePlayerResurrect(Player* player) { @@ -71,22 +68,6 @@ void BattlegroundIC::HandlePlayerResurrect(Player* player) player->CastSpell(player, SPELL_OIL_REFINERY, true); } -void BattlegroundIC::SendTransportInit(Player* player) -{ - if (!gunshipAlliance || !gunshipHorde) - return; - - UpdateData transData; - - gunshipAlliance->BuildCreateUpdateBlockForPlayer(&transData, player); - gunshipHorde->BuildCreateUpdateBlockForPlayer(&transData, player); - - WorldPacket packet; - - transData.BuildPacket(&packet); - player->SendDirectMessage(&packet); -} - void BattlegroundIC::DoAction(uint32 action, uint64 var) { if (action != ACTION_TELEPORT_PLAYER_TO_TRANSPORT) @@ -300,8 +281,6 @@ void BattlegroundIC::AddPlayer(Player* player) if (nodePoint[NODE_TYPE_REFINERY].nodeState == (player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H)) player->CastSpell(player, SPELL_OIL_REFINERY, true); - - SendTransportInit(player); } void BattlegroundIC::RemovePlayer(Player* player, uint64 /*guid*/, uint32 /*team*/) @@ -409,8 +388,8 @@ bool BattlegroundIC::SetupBattleground() return false; } - gunshipHorde = CreateTransport(GO_HORDE_GUNSHIP, TRANSPORT_PERIOD_TIME); - gunshipAlliance = CreateTransport(GO_ALLIANCE_GUNSHIP, TRANSPORT_PERIOD_TIME); + gunshipHorde = sTransportMgr->CreateTransport(GO_HORDE_GUNSHIP, 0, GetBgMap()); + gunshipAlliance = sTransportMgr->CreateTransport(GO_ALLIANCE_GUNSHIP, 0, GetBgMap()); if (!gunshipAlliance || !gunshipHorde) { @@ -420,10 +399,8 @@ bool BattlegroundIC::SetupBattleground() //Send transport init packet to all player in map for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) - { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) - SendTransportInit(player); - } + GetBgMap()->SendInitTransports(player); // setting correct factions for Keep Cannons for (uint8 i = BG_IC_NPC_KEEP_CANNON_1; i < BG_IC_NPC_KEEP_CANNON_12; ++i) @@ -616,8 +593,8 @@ void BattlegroundIC::HandleContestedNodes(ICNodePoint* nodePoint) { if (nodePoint->nodeType == NODE_TYPE_HANGAR) { - if (gunshipAlliance && gunshipHorde) - (nodePoint->faction == TEAM_ALLIANCE ? gunshipHorde : gunshipAlliance)->BuildStopMovePacket(GetBgMap()); + if (gunshipAlliance && gunshipHorde) + (nodePoint->faction == TEAM_ALLIANCE ? gunshipHorde : gunshipAlliance)->EnableMovement(false); for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_1; u < BG_IC_GO_HANGAR_TELEPORTER_3; ++u) DelObject(u); @@ -656,8 +633,8 @@ void BattlegroundIC::HandleCapturedNodes(ICNodePoint* nodePoint, bool recapture) //TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "BG_IC_GO_HANGAR_BANNER CAPTURED Faction: %u", nodePoint->faction); - (nodePoint->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)->BuildStartMovePacket(GetBgMap()); - (nodePoint->faction == TEAM_ALLIANCE ? gunshipHorde : gunshipAlliance)->BuildStopMovePacket(GetBgMap()); + (nodePoint->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)->EnableMovement(true); + (nodePoint->faction == TEAM_ALLIANCE ? gunshipHorde : gunshipAlliance)->EnableMovement(false); // we should spawn teleporters break; case BG_IC_GO_QUARRY_BANNER: @@ -863,10 +840,7 @@ void BattlegroundIC::DestroyGate(Player* player, GameObject* go) SendMessage2ToAll(lang_entry, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP)); } -void BattlegroundIC::EventPlayerDamagedGO(Player* /*player*/, GameObject* /*go*/, uint32 /*eventType*/) -{ - -} +void BattlegroundIC::EventPlayerDamagedGO(Player* /*player*/, GameObject* /*go*/, uint32 /*eventType*/) { } WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player) { @@ -907,52 +881,6 @@ WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player) return good_entry; } -Transport* BattlegroundIC::CreateTransport(uint32 goEntry, uint32 period) -{ - Transport* t = new Transport(period, 0); - - GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(goEntry); - - if (!goinfo) - { - TC_LOG_ERROR(LOG_FILTER_SQL, "Transport ID: %u will not be loaded, gameobject_template missing", goEntry); - delete t; - return NULL; - } - - std::set<uint32> mapsUsed; - - if (!t->GenerateWaypoints(goinfo->moTransport.taxiPathId, mapsUsed)) - // skip transports with empty waypoints list - { - TC_LOG_ERROR(LOG_FILTER_SQL, "Transport (path id %u) path size = 0. Transport ignored, check DBC files or transport GO data0 field.", goinfo->moTransport.taxiPathId); - delete t; - return NULL; - } - - uint32 mapid = t->m_WayPoints[0].mapid; - - float x = t->m_WayPoints[0].x; - float y = t->m_WayPoints[0].y; - float z = t->m_WayPoints[0].z; - float o = 1; - - // creates the Gameobject - if (!t->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT), goEntry, mapid, x, y, z, o, 255, 0)) - { - delete t; - return NULL; - } - - //If we someday decide to use the grid to track transports, here: - t->SetMap(GetBgMap()); - - for (uint8 i = 0; i < 5; ++i) - t->AddNPCPassenger(0, (goEntry == GO_HORDE_GUNSHIP ? NPC_HORDE_GUNSHIP_CANNON : NPC_ALLIANCE_GUNSHIP_CANNON), (goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetPositionX() : allianceGunshipPassengers[i].GetPositionX()), (goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetPositionY() : allianceGunshipPassengers[i].GetPositionY()), (goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetPositionZ() : allianceGunshipPassengers[i].GetPositionZ()), (goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetOrientation() : allianceGunshipPassengers[i].GetOrientation())); - - return t; -} - bool BattlegroundIC::IsAllNodesControlledByTeam(uint32 team) const { uint32 count = 0; @@ -983,4 +911,4 @@ bool BattlegroundIC::IsSpellAllowed(uint32 spellId, Player const* player) const } return true; -}
\ No newline at end of file +} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h index 6fdc97f25c5..acb5046444c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h @@ -956,8 +956,6 @@ class BattlegroundIC : public Battleground void UpdateNodeWorldState(ICNodePoint* nodePoint); void HandleCapturedNodes(ICNodePoint* nodePoint, bool recapture); void HandleContestedNodes(ICNodePoint* nodePoint); - Transport* CreateTransport(uint32 goEntry, uint32 period); - void SendTransportInit(Player* player); }; #endif diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp index 3ca9b6d4f72..d88c9c7a73f 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp @@ -73,9 +73,7 @@ void BattlegroundRV::PostUpdateImpl(uint32 diff) setTimer(getTimer() - diff); } -void BattlegroundRV::StartingEventCloseDoors() -{ -} +void BattlegroundRV::StartingEventCloseDoors() { } void BattlegroundRV::StartingEventOpenDoors() { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 03c4b84b817..4eb56db700a 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -44,9 +44,7 @@ BattlegroundSA::BattlegroundSA() memset(&GraveyardStatus, 0, sizeof(GraveyardStatus)); } -BattlegroundSA::~BattlegroundSA() -{ -} +BattlegroundSA::~BattlegroundSA() { } void BattlegroundSA::Reset() { @@ -392,13 +390,9 @@ void BattlegroundSA::PostUpdateImpl(uint32 diff) } } -void BattlegroundSA::StartingEventCloseDoors() -{ -} +void BattlegroundSA::StartingEventCloseDoors() { } -void BattlegroundSA::StartingEventOpenDoors() -{ -} +void BattlegroundSA::StartingEventOpenDoors() { } void BattlegroundSA::FillInitialWorldStates(WorldPacket& data) { @@ -472,9 +466,7 @@ void BattlegroundSA::AddPlayer(Player* player) PlayerScores[player->GetGUID()] = sc; } -void BattlegroundSA::RemovePlayer(Player* /*player*/, uint64 /*guid*/, uint32 /*team*/) -{ -} +void BattlegroundSA::RemovePlayer(Player* /*player*/, uint64 /*guid*/, uint32 /*team*/) { } void BattlegroundSA::HandleAreaTrigger(Player* /*Source*/, uint32 /*Trigger*/) { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 5e0cade9b37..f0e66d1e15d 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -56,9 +56,7 @@ BattlegroundWS::BattlegroundWS() _flagDebuffState = 0; } -BattlegroundWS::~BattlegroundWS() -{ -} +BattlegroundWS::~BattlegroundWS() { } void BattlegroundWS::PostUpdateImpl(uint32 diff) { diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index d2a166c492c..3272ded7829 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -34,9 +34,7 @@ CalendarEvent::~CalendarEvent() sCalendarMgr->FreeEventId(_eventId); } -CalendarMgr::CalendarMgr() -{ -} +CalendarMgr::CalendarMgr() { } CalendarMgr::~CalendarMgr() { diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index f03514461f8..74a0d622e80 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -51,7 +51,7 @@ class ChannelMgr void MakeNotOnPacket(WorldPacket* data, std::string const& name); }; -class AllianceChannelMgr : public ChannelMgr {}; -class HordeChannelMgr : public ChannelMgr {}; +class AllianceChannelMgr : public ChannelMgr { }; +class HordeChannelMgr : public ChannelMgr { }; #endif diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 405bf7384ae..9574d3b38c3 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -50,8 +50,8 @@ class ChatHandler { public: WorldSession* GetSession() { return m_session; } - explicit ChatHandler(WorldSession* session) : m_session(session), sentErrorMessage(false) {} - virtual ~ChatHandler() {} + explicit ChatHandler(WorldSession* session) : m_session(session), sentErrorMessage(false) { } + virtual ~ChatHandler() { } static void FillMessageData(WorldPacket* data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit* speaker); @@ -129,7 +129,7 @@ class ChatHandler bool ShowHelpForCommand(ChatCommand* table, const char* cmd); protected: - explicit ChatHandler() : m_session(NULL), sentErrorMessage(false) {} // for CLI subclass + explicit ChatHandler() : m_session(NULL), sentErrorMessage(false) { } // for CLI subclass static bool SetDataForCommandInTable(ChatCommand* table, const char* text, uint32 permission, std::string const& help, std::string const& fullcommand); bool ExecuteCommandInTable(ChatCommand* table, const char* text, std::string const& fullcmd); bool ShowHelpForSubCommands(ChatCommand* table, char const* cmd, char const* subcmd); @@ -146,7 +146,7 @@ class CliHandler : public ChatHandler { public: typedef void Print(void*, char const*); - explicit CliHandler(void* callbackArg, Print* zprint) : m_callbackArg(callbackArg), m_print(zprint) {} + explicit CliHandler(void* callbackArg, Print* zprint) : m_callbackArg(callbackArg), m_print(zprint) { } // overwrite functions const char *GetTrinityString(int32 entry) const; diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 729bbb60bf7..3305492520b 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -536,9 +536,7 @@ bool GlyphChatLink::Initialize(std::istringstream& iss) return true; } -LinkExtractor::LinkExtractor(const char* msg) : _iss(msg) -{ -} +LinkExtractor::LinkExtractor(const char* msg) : _iss(msg) { } LinkExtractor::~LinkExtractor() { diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index b24979d9131..ed23a72bee1 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -390,9 +390,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR //=================== ThreatManager ========================== //============================================================ -ThreatManager::ThreatManager(Unit* owner) : iCurrentVictim(NULL), iOwner(owner), iUpdateTimer(THREAT_UPDATE_INTERVAL) -{ -} +ThreatManager::ThreatManager(Unit* owner) : iCurrentVictim(NULL), iOwner(owner), iUpdateTimer(THREAT_UPDATE_INTERVAL) { } //============================================================ diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h index 9b249bd4bee..2d13d8b61e2 100644 --- a/src/server/game/Combat/ThreatManager.h +++ b/src/server/game/Combat/ThreatManager.h @@ -281,7 +281,7 @@ namespace Trinity class ThreatOrderPred { public: - ThreatOrderPred(bool ascending = false) : m_ascending(ascending) {} + ThreatOrderPred(bool ascending = false) : m_ascending(ascending) { } bool operator() (HostileReference const* a, HostileReference const* b) const { return m_ascending ? a->getThreat() < b->getThreat() : a->getThreat() > b->getThreat(); diff --git a/src/server/game/Combat/UnitEvents.h b/src/server/game/Combat/UnitEvents.h index 21cd2d80964..0e568d139a8 100644 --- a/src/server/game/Combat/UnitEvents.h +++ b/src/server/game/Combat/UnitEvents.h @@ -123,8 +123,8 @@ class ThreatManagerEvent : public ThreatRefStatusChangeEvent private: ThreatContainer* iThreatContainer; public: - ThreatManagerEvent(uint32 pType) : ThreatRefStatusChangeEvent(pType), iThreatContainer(NULL) {} - ThreatManagerEvent(uint32 pType, HostileReference* pHostileReference) : ThreatRefStatusChangeEvent(pType, pHostileReference), iThreatContainer(NULL) {} + ThreatManagerEvent(uint32 pType) : ThreatRefStatusChangeEvent(pType), iThreatContainer(NULL) { } + ThreatManagerEvent(uint32 pType, HostileReference* pHostileReference) : ThreatRefStatusChangeEvent(pType, pHostileReference), iThreatContainer(NULL) { } void setThreatContainer(ThreatContainer* pThreatContainer) { iThreatContainer = pThreatContainer; } diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 933d77cc2e8..f6d6c47e96f 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -515,9 +515,7 @@ uint32 Condition::GetMaxAvailableConditionTargets() } } -ConditionMgr::ConditionMgr() -{ -} +ConditionMgr::ConditionMgr() { } ConditionMgr::~ConditionMgr() { diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index a7189ea415a..171d0fe8cc2 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -344,6 +344,12 @@ enum ItemLimitCategoryMode ITEM_LIMIT_CATEGORY_MODE_EQUIP = 1 // limit applied to amount equipped items (including used gems) }; +enum SpellCategoryFlags +{ + SPELL_CATEGORY_FLAG_COOLDOWN_SCALES_WITH_WEAPON_SPEED = 0x01, // unused + SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT = 0x04 +}; + enum TotemCategoryType { TOTEM_CATEGORY_TYPE_KNIFE = 1, diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 71fbf1c62b2..aa292934021 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -20,6 +20,7 @@ #include "Log.h" #include "SharedDefines.h" #include "SpellMgr.h" +#include "TransportMgr.h" #include "DBCfmt.h" #include "Timer.h" #include "ObjectDefines.h" @@ -153,10 +154,11 @@ DBCStorage <SoundEntriesEntry> sSoundEntriesStore(SoundEntriesfmt); DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); DBCStorage <SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt); DBCStorage <SpellEntry> sSpellStore(SpellEntryfmt); -SpellCategoryStore sSpellCategoryStore; +SpellCategoryStore sSpellsByCategoryStore; PetFamilySpellsStore sPetFamilySpellsStore; DBCStorage <SpellCastTimesEntry> sSpellCastTimesStore(SpellCastTimefmt); +DBCStorage <SpellCategoryEntry> sSpellCategoryStore(SpellCategoryfmt); DBCStorage <SpellDifficultyEntry> sSpellDifficultyStore(SpellDifficultyfmt); DBCStorage <SpellDurationEntry> sSpellDurationStore(SpellDurationfmt); DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore(SpellFocusObjectfmt); @@ -190,6 +192,8 @@ static DBCStorage <TaxiPathNodeEntry> sTaxiPathNodeStore(TaxiPathNodeEntryfmt); DBCStorage <TeamContributionPointsEntry> sTeamContributionPointsStore(TeamContributionPointsfmt); DBCStorage <TotemCategoryEntry> sTotemCategoryStore(TotemCategoryEntryfmt); +DBCStorage <TransportAnimationEntry> sTransportAnimationStore(TransportAnimationfmt); +DBCStorage <TransportRotationEntry> sTransportRotationStore(TransportRotationfmt); DBCStorage <VehicleEntry> sVehicleStore(VehicleEntryfmt); DBCStorage <VehicleSeatEntry> sVehicleSeatStore(VehicleSeatEntryfmt); DBCStorage <WMOAreaTableEntry> sWMOAreaTableStore(WMOAreaTableEntryfmt); @@ -405,7 +409,7 @@ void LoadDBCStores(const std::string& dataPath) { SpellEntry const* spell = sSpellStore.LookupEntry(i); if (spell && spell->Category) - sSpellCategoryStore[spell->Category].insert(i); + sSpellsByCategoryStore[spell->Category].insert(i); } for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) @@ -439,6 +443,7 @@ void LoadDBCStores(const std::string& dataPath) } LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCastTimesStore, dbcPath, "SpellCastTimes.dbc"); + LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCategoryStore, dbcPath, "SpellCategory.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sSpellDifficultyStore, dbcPath, "SpellDifficulty.dbc", &CustomSpellDifficultyfmt, &CustomSpellDifficultyIndex); LoadDBC(availableDbcLocales, bad_dbc_files, sSpellDurationStore, dbcPath, "SpellDuration.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sSpellFocusObjectStore, dbcPath, "SpellFocusObject.dbc"); @@ -604,6 +609,25 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sTeamContributionPointsStore, dbcPath, "TeamContributionPoints.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sTotemCategoryStore, dbcPath, "TotemCategory.dbc"); + LoadDBC(availableDbcLocales, bad_dbc_files, sTransportAnimationStore, dbcPath, "TransportAnimation.dbc"); + for (uint32 i = 0; i < sTransportAnimationStore.GetNumRows(); ++i) + { + TransportAnimationEntry const* anim = sTransportAnimationStore.LookupEntry(i); + if (!anim) + continue; + + sTransportMgr->AddPathNodeToTransport(anim->TransportEntry, anim->TimeSeg, anim); + } + + LoadDBC(availableDbcLocales, bad_dbc_files, sTransportRotationStore, dbcPath, "TransportRotation.dbc"); + for (uint32 i = 0; i < sTransportRotationStore.GetNumRows(); ++i) + { + TransportRotationEntry const* rot = sTransportRotationStore.LookupEntry(i); + if (!rot) + continue; + + sTransportMgr->AddPathRotationToTransport(rot->TransportEntry, rot->TimeSeg, rot); + } LoadDBC(availableDbcLocales, bad_dbc_files, sVehicleStore, dbcPath, "Vehicle.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sVehicleSeatStore, dbcPath, "VehicleSeat.dbc"); diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index cac93a120a5..808ebb78fa5 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -148,12 +148,13 @@ extern DBCStorage <SkillLineEntry> sSkillLineStore; extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore; extern DBCStorage <SoundEntriesEntry> sSoundEntriesStore; extern DBCStorage <SpellCastTimesEntry> sSpellCastTimesStore; +extern DBCStorage <SpellCategoryEntry> sSpellCategoryStore; extern DBCStorage <SpellDifficultyEntry> sSpellDifficultyStore; extern DBCStorage <SpellDurationEntry> sSpellDurationStore; extern DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore; extern DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore; extern DBCStorage <SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore; -extern SpellCategoryStore sSpellCategoryStore; +extern SpellCategoryStore sSpellsByCategoryStore; extern PetFamilySpellsStore sPetFamilySpellsStore; extern DBCStorage <SpellRadiusEntry> sSpellRadiusStore; extern DBCStorage <SpellRangeEntry> sSpellRangeStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index e12f70baa41..0c1f6af5506 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1675,6 +1675,12 @@ struct SpellCastTimesEntry //int32 MinCastTime; // 3 unsure }; +struct SpellCategoryEntry +{ + uint32 Id; + uint32 Flags; +}; + struct SpellDifficultyEntry { uint32 ID; // 0 @@ -1875,6 +1881,28 @@ struct TotemCategoryEntry uint32 categoryMask; // 19 (compatibility mask for same type: different for totems, compatible from high to low for rods) }; +struct TransportAnimationEntry +{ + //uint32 Id; + uint32 TransportEntry; + uint32 TimeSeg; + float X; + float Y; + float Z; + //uint32 MovementId; +}; + +struct TransportRotationEntry +{ + //uint32 Id; + uint32 TransportEntry; + uint32 TimeSeg; + float X; + float Y; + float Z; + float W; +}; + #define MAX_VEHICLE_SEATS 8 struct VehicleEntry @@ -2073,8 +2101,8 @@ struct WorldStateUI // Structures not used for casting to loaded DBC data and not required then packing struct MapDifficulty { - MapDifficulty() : resetTime(0), maxPlayers(0), hasErrorMessage(false) {} - MapDifficulty(uint32 _resetTime, uint32 _maxPlayers, bool _hasErrorMessage) : resetTime(_resetTime), maxPlayers(_maxPlayers), hasErrorMessage(_hasErrorMessage) {} + MapDifficulty() : resetTime(0), maxPlayers(0), hasErrorMessage(false) { } + MapDifficulty(uint32 _resetTime, uint32 _maxPlayers, bool _hasErrorMessage) : resetTime(_resetTime), maxPlayers(_maxPlayers), hasErrorMessage(_hasErrorMessage) { } uint32 resetTime; uint32 maxPlayers; @@ -2083,8 +2111,8 @@ struct MapDifficulty struct TalentSpellPos { - TalentSpellPos() : talent_id(0), rank(0) {} - TalentSpellPos(uint16 _talent_id, uint8 _rank) : talent_id(_talent_id), rank(_rank) {} + TalentSpellPos() : talent_id(0), rank(0) { } + TalentSpellPos(uint16 _talent_id, uint8 _rank) : talent_id(_talent_id), rank(_rank) { } uint16 talent_id; uint8 rank; @@ -2094,8 +2122,8 @@ typedef std::map<uint32, TalentSpellPos> TalentSpellPosMap; struct TaxiPathBySourceAndDestination { - TaxiPathBySourceAndDestination() : ID(0), price(0) {} - TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) {} + TaxiPathBySourceAndDestination() : ID(0), price(0) { } + TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { } uint32 ID; uint32 price; @@ -2105,8 +2133,8 @@ typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource; struct TaxiPathNodePtr { - TaxiPathNodePtr() : i_ptr(NULL) {} - TaxiPathNodePtr(TaxiPathNodeEntry const* ptr) : i_ptr(ptr) {} + TaxiPathNodePtr() : i_ptr(NULL) { } + TaxiPathNodePtr(TaxiPathNodeEntry const* ptr) : i_ptr(ptr) { } TaxiPathNodeEntry const* i_ptr; operator TaxiPathNodeEntry const& () const { return *i_ptr; } }; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index a81eec51338..0066db2b049 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -97,6 +97,7 @@ char const SkillLinefmt[] = "nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxx char const SkillLineAbilityfmt[] = "niiiixxiiiiixx"; char const SoundEntriesfmt[] = "nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; char const SpellCastTimefmt[] = "nixx"; +char const SpellCategoryfmt[] = "ni"; char const SpellDifficultyfmt[] = "niiii"; const std::string CustomSpellDifficultyfmt = "ppppp"; const std::string CustomSpellDifficultyIndex = "id"; @@ -120,6 +121,8 @@ char const TaxiPathEntryfmt[] = "niii"; char const TaxiPathNodeEntryfmt[] = "diiifffiiii"; char const TeamContributionPointsfmt[] = "df"; char const TotemCategoryEntryfmt[] = "nxxxxxxxxxxxxxxxxxii"; +char const TransportAnimationfmt[] = "diifffx"; +char const TransportRotationfmt[] = "diiffff"; char const VehicleEntryfmt[] = "niffffiiiiiiiifffffffffffffffssssfifiixx"; char const VehicleSeatEntryfmt[] = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxx"; char const WMOAreaTableEntryfmt[] = "niiixxxxxiixxxxxxxxxxxxxxxxx"; diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 96fedb65547..83b4142ae36 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -151,7 +151,7 @@ typedef UNORDERED_MAP<uint32, LFGDungeonData> LFGDungeonContainer; struct LfgJoinResultData { LfgJoinResultData(LfgJoinResult _result = LFG_JOIN_OK, LfgRoleCheckState _state = LFG_ROLECHECK_DEFAULT): - result(_result), state(_state) {} + result(_result), state(_state) { } LfgJoinResult result; LfgRoleCheckState state; LfgLockPartyMap lockmap; @@ -178,7 +178,7 @@ struct LfgQueueStatusData LfgQueueStatusData(uint32 _dungeonId = 0, int32 _waitTime = -1, int32 _waitTimeAvg = -1, int32 _waitTimeTank = -1, int32 _waitTimeHealer = -1, int32 _waitTimeDps = -1, uint32 _queuedTime = 0, uint8 _tanks = 0, uint8 _healers = 0, uint8 _dps = 0) : dungeonId(_dungeonId), waitTime(_waitTime), waitTimeAvg(_waitTimeAvg), waitTimeTank(_waitTimeTank), waitTimeHealer(_waitTimeHealer), - waitTimeDps(_waitTimeDps), queuedTime(_queuedTime), tanks(_tanks), healers(_healers), dps(_dps) {} + waitTimeDps(_waitTimeDps), queuedTime(_queuedTime), tanks(_tanks), healers(_healers), dps(_dps) { } uint32 dungeonId; int32 waitTime; diff --git a/src/server/game/DungeonFinding/LFGPlayerData.cpp b/src/server/game/DungeonFinding/LFGPlayerData.cpp index e8ef430bc1f..305263cb73d 100644 --- a/src/server/game/DungeonFinding/LFGPlayerData.cpp +++ b/src/server/game/DungeonFinding/LFGPlayerData.cpp @@ -22,11 +22,9 @@ namespace lfg LfgPlayerData::LfgPlayerData(): m_State(LFG_STATE_NONE), m_OldState(LFG_STATE_NONE), m_Team(0), m_Group(0), m_Roles(0), m_Comment("") -{} +{ } -LfgPlayerData::~LfgPlayerData() -{ -} +LfgPlayerData::~LfgPlayerData() { } void LfgPlayerData::SetState(LfgState state) { diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h index db7e7bbf318..128b2aa2f0b 100644 --- a/src/server/game/DungeonFinding/LFGQueue.h +++ b/src/server/game/DungeonFinding/LFGQueue.h @@ -71,7 +71,7 @@ struct LfgQueueData struct LfgWaitTime { - LfgWaitTime(): time(-1), number(0) {} + LfgWaitTime(): time(-1), number(0) { } int32 time; ///< Wait time uint32 number; ///< Number of people used to get that wait time }; diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index 9dfbb0e9fb3..2a4096a45ae 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -32,9 +32,7 @@ namespace lfg { -LFGPlayerScript::LFGPlayerScript() : PlayerScript("LFGPlayerScript") -{ -} +LFGPlayerScript::LFGPlayerScript() : PlayerScript("LFGPlayerScript") { } void LFGPlayerScript::OnLevelChanged(Player* player, uint8 /*oldLevel*/) { @@ -120,9 +118,7 @@ void LFGPlayerScript::OnMapChanged(Player* player) player->RemoveAurasDueToSpell(LFG_SPELL_LUCK_OF_THE_DRAW); } -LFGGroupScript::LFGGroupScript() : GroupScript("LFGGroupScript") -{ -} +LFGGroupScript::LFGGroupScript() : GroupScript("LFGGroupScript") { } void LFGGroupScript::OnAddMember(Group* group, uint64 guid) { diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index ccceec7185b..58e21b5096c 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -41,9 +41,7 @@ Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES), m_type(type lootRecipient = NULL; } -Corpse::~Corpse() -{ -} +Corpse::~Corpse() { } void Corpse::AddToWorld() { diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 4efd78d5932..e4fda515c8a 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -52,7 +52,7 @@ #include "World.h" #include "WorldPacket.h" -// apply implementation of the singletons +#include "Transport.h" TrainerSpell const* TrainerSpellData::Find(uint32 spell_id) const { @@ -141,7 +141,7 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) return true; } -Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapCreature(), +Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), lootForPickPocketed(false), lootForBody(false), m_groupLootTimer(0), lootingGroupLowGUID(0), m_PlayerDamageReq(0), m_lootRecipient(0), m_lootRecipientGroup(0), m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_reactState(REACT_AGGRESSIVE), @@ -934,7 +934,8 @@ void Creature::SaveToDB() return; } - SaveToDB(GetMapId(), data->spawnMask, GetPhaseMask()); + uint32 mapId = GetTransport() ? GetTransport()->GetGOInfo()->moTransport.mapID : GetMapId(); + SaveToDB(mapId, data->spawnMask, GetPhaseMask()); } void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) @@ -973,10 +974,21 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) data.phaseMask = phaseMask; data.displayid = displayId; data.equipmentId = GetCurrentEquipmentId(); - data.posX = GetPositionX(); - data.posY = GetPositionY(); - data.posZ = GetPositionZMinusOffset(); - data.orientation = GetOrientation(); + if (!GetTransport()) + { + data.posX = GetPositionX(); + data.posY = GetPositionY(); + data.posZ = GetPositionZMinusOffset(); + data.orientation = GetOrientation(); + } + else + { + data.posX = GetTransOffsetX(); + data.posY = GetTransOffsetY(); + data.posZ = GetTransOffsetZ(); + data.orientation = GetTransOffsetO(); + } + data.spawntimesecs = m_respawnDelay; // prevent add data integrity problems data.spawndist = GetDefaultMovementType() == IDLE_MOTION_TYPE ? 0.0f : m_respawnradius; @@ -2129,8 +2141,8 @@ void Creature::AddCreatureSpellCooldown(uint32 spellid) if (cooldown) _AddCreatureSpellCooldown(spellid, time(NULL) + cooldown/IN_MILLISECONDS); - if (spellInfo->Category) - _AddCreatureCategoryCooldown(spellInfo->Category, time(NULL)); + if (spellInfo->GetCategory()) + _AddCreatureCategoryCooldown(spellInfo->GetCategory(), time(NULL)); } bool Creature::HasCategoryCooldown(uint32 spell_id) const @@ -2139,7 +2151,7 @@ bool Creature::HasCategoryCooldown(uint32 spell_id) const if (!spellInfo) return false; - CreatureSpellCooldowns::const_iterator itr = m_CreatureCategoryCooldowns.find(spellInfo->Category); + CreatureSpellCooldowns::const_iterator itr = m_CreatureCategoryCooldowns.find(spellInfo->GetCategory()); return(itr != m_CreatureCategoryCooldowns.end() && time_t(itr->second + (spellInfo->CategoryRecoveryTime / IN_MILLISECONDS)) > time(NULL)); } @@ -2173,7 +2185,7 @@ void Creature::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs } // Not send cooldown for this spells - if (spellInfo->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + if (spellInfo->IsCooldownStartedOnEvent()) continue; if (spellInfo->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 3a07d9c101b..08d3610594f 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -246,7 +246,7 @@ typedef UNORDERED_MAP<uint32, EquipmentInfoContainerInternal> EquipmentInfoConta // from `creature` table struct CreatureData { - CreatureData() : dbData(true) {} + CreatureData() : dbData(true) { } uint32 id; // entry in creature_template uint16 mapid; uint32 phaseMask; @@ -325,7 +325,7 @@ typedef UNORDERED_MAP<uint32, CreatureAddon> CreatureAddonContainer; struct VendorItem { VendorItem(uint32 _item, int32 _maxcount, uint32 _incrtime, uint32 _ExtendedCost) - : item(_item), maxcount(_maxcount), incrtime(_incrtime), ExtendedCost(_ExtendedCost) {} + : item(_item), maxcount(_maxcount), incrtime(_incrtime), ExtendedCost(_ExtendedCost) { } uint32 item; uint32 maxcount; // 0 for infinity item amount @@ -367,7 +367,7 @@ struct VendorItemData struct VendorItemCount { explicit VendorItemCount(uint32 _item, uint32 _count) - : itemId(_item), count(_count), lastIncrementTime(time(NULL)) {} + : itemId(_item), count(_count), lastIncrementTime(time(NULL)) { } uint32 itemId; uint32 count; @@ -399,7 +399,7 @@ typedef UNORDERED_MAP<uint32 /*spellid*/, TrainerSpell> TrainerSpellMap; struct TrainerSpellData { - TrainerSpellData() : trainerType(0) {} + TrainerSpellData() : trainerType(0) { } ~TrainerSpellData() { spellList.clear(); } TrainerSpellMap spellList; @@ -415,36 +415,7 @@ typedef std::map<uint32, time_t> CreatureSpellCooldowns; #define MAX_VENDOR_ITEMS 150 // Limitation in 3.x.x item count in SMSG_LIST_INVENTORY -enum CreatureCellMoveState -{ - CREATURE_CELL_MOVE_NONE, // not in move list - CREATURE_CELL_MOVE_ACTIVE, // in move list - CREATURE_CELL_MOVE_INACTIVE // in move list but should not move -}; - -class MapCreature -{ - friend class Map; // map for moving creatures - friend class ObjectGridLoader; // grid loader for loading creatures - -protected: - MapCreature() : _moveState(CREATURE_CELL_MOVE_NONE) {} - -private: - Cell _currentCell; - Cell const& GetCurrentCell() const { return _currentCell; } - void SetCurrentCell(Cell const& cell) { _currentCell = cell; } - - CreatureCellMoveState _moveState; - Position _newPosition; - void SetNewCellPosition(float x, float y, float z, float o) - { - _moveState = CREATURE_CELL_MOVE_ACTIVE; - _newPosition.Relocate(x, y, z, o); - } -}; - -class Creature : public Unit, public GridObject<Creature>, public MapCreature +class Creature : public Unit, public GridObject<Creature>, public MapObject { public: @@ -476,7 +447,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature bool IsTrigger() const { return GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER; } bool IsGuard() const { return GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_GUARD; } bool CanWalk() const { return GetCreatureTemplate()->InhabitType & INHABIT_GROUND; } - bool CanSwim() const { return GetCreatureTemplate()->InhabitType & INHABIT_WATER; } + bool CanSwim() const { return GetCreatureTemplate()->InhabitType & INHABIT_WATER || IsPet(); } bool CanFly() const { return GetCreatureTemplate()->InhabitType & INHABIT_AIR; } void SetReactState(ReactStates st) { m_reactState = st; } @@ -696,9 +667,6 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature float m_SightDistance, m_CombatDistance; - void SetGUIDTransport(uint32 guid) { guid_transport=guid; } - uint32 GetGUIDTransport() { return guid_transport; } - void FarTeleportTo(Map* map, float X, float Y, float Z, float O); bool m_isTempWorldObject; //true when possessed diff --git a/src/server/game/Entities/Creature/CreatureGroups.h b/src/server/game/Entities/Creature/CreatureGroups.h index fb5b823fbe9..91a7ac7ff5e 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.h +++ b/src/server/game/Entities/Creature/CreatureGroups.h @@ -60,8 +60,8 @@ class CreatureGroup public: //Group cannot be created empty - explicit CreatureGroup(uint32 id) : m_leader(NULL), m_groupID(id), m_Formed(false) {} - ~CreatureGroup() {} + explicit CreatureGroup(uint32 id) : m_leader(NULL), m_groupID(id), m_Formed(false) { } + ~CreatureGroup() { } Creature* getLeader() const { return m_leader; } uint32 GetId() const { return m_groupID; } diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 46f5c1300a4..03fcd4cd74d 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -41,14 +41,14 @@ class TempSummon : public Creature { public: explicit TempSummon(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject); - virtual ~TempSummon() {} + virtual ~TempSummon() { } void Update(uint32 time); virtual void InitStats(uint32 lifetime); virtual void InitSummon(); virtual void UnSummon(uint32 msTime = 0); void RemoveFromWorld(); void SetTempSummonType(TempSummonType type); - void SaveToDB(uint32 /*mapid*/, uint8 /*spawnMask*/, uint32 /*phaseMask*/) {} + void SaveToDB(uint32 /*mapid*/, uint8 /*spawnMask*/, uint32 /*phaseMask*/) { } Unit* GetSummoner() const; Creature* GetSummonerCreatureBase() const; uint64 GetSummonerGUID() const { return m_summonerGUID; } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index eef416b339d..6d940623963 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -16,6 +16,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <G3D/Quat.h> #include "GameObjectAI.h" #include "Battleground.h" #include "CellImpl.h" @@ -32,8 +33,10 @@ #include "SpellMgr.h" #include "UpdateFieldFlags.h" #include "World.h" +#include "Transport.h" -GameObject::GameObject(): WorldObject(false), m_model(NULL), m_goValue(), m_AI(NULL) +GameObject::GameObject() : WorldObject(false), MapObject(), + m_model(NULL), m_goValue(), m_AI(NULL) { m_objectType |= TYPEMASK_GAMEOBJECT; m_objectTypeId = TYPEID_GAMEOBJECT; @@ -100,6 +103,13 @@ void GameObject::CleanupsBeforeDelete(bool /*finalCleanup*/) if (m_uint32Values) // field array can be not exist if GameOBject not loaded RemoveFromOwner(); + + if (GetTransport() && !ToTransport()) + { + GetTransport()->RemovePassenger(this); + SetTransport(NULL); + m_movementInfo.transport.Reset(); + } } void GameObject::RemoveFromOwner() @@ -169,6 +179,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa SetMap(map); Relocate(x, y, z, ang); + m_stationaryPosition.Relocate(x, y, z, ang); if (!IsPositionValid()) { TC_LOG_ERROR(LOG_FILTER_GENERAL, "Gameobject (GUID: %u Entry: %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", guidlow, name_id, x, y); @@ -192,6 +203,9 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa return false; } + if (goinfo->type == GAMEOBJECT_TYPE_TRANSPORT) + m_updateFlag = (m_updateFlag | UPDATEFLAG_TRANSPORT) & ~UPDATEFLAG_POSITION; + Object::_Create(guidlow, goinfo->entry, HIGHGUID_GAMEOBJECT); m_goInfo = goinfo; @@ -238,9 +252,11 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa break; case GAMEOBJECT_TYPE_TRANSPORT: SetUInt32Value(GAMEOBJECT_LEVEL, goinfo->transport.pause); - if (goinfo->transport.startOpen) - SetGoState(GO_STATE_ACTIVE); + SetGoState(goinfo->transport.startOpen ? GO_STATE_ACTIVE : GO_STATE_READY); SetGoAnimProgress(animprogress); + m_goValue.Transport.PathProgress = 0; + m_goValue.Transport.AnimationInfo = sTransportMgr->GetTransportAnimInfo(goinfo->entry); + m_goValue.Transport.CurrentSeg = 0; break; case GAMEOBJECT_TYPE_FISHINGNODE: SetGoAnimProgress(0); @@ -274,18 +290,10 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa void GameObject::Update(uint32 diff) { - if (!AI()) - { - if (!AIM_Initialize()) - TC_LOG_ERROR(LOG_FILTER_GENERAL, "Could not initialize GameObjectAI"); - } else + if (AI()) AI()->UpdateAI(diff); - - if (IS_MO_TRANSPORT_GUID(GetGUID())) - { - //((Transport*)this)->Update(p_time); - return; - } + else if (!AIM_Initialize()) + TC_LOG_ERROR(LOG_FILTER_GENERAL, "Could not initialize GameObjectAI"); switch (m_lootState) { @@ -308,6 +316,38 @@ void GameObject::Update(uint32 diff) m_lootState = GO_READY; break; } + /* TODO: Fix movement in unloaded grid - currently GO will just disappear + case GAMEOBJECT_TYPE_TRANSPORT: + { + if (!m_goValue.Transport.AnimationInfo) + break; + + if (GetGoState() == GO_STATE_READY) + { + m_goValue.Transport.PathProgress += diff; + uint32 timer = m_goValue.Transport.PathProgress % m_goValue.Transport.AnimationInfo->TotalTime; + TransportAnimationEntry const* node = m_goValue.Transport.AnimationInfo->GetAnimNode(timer); + if (node && m_goValue.Transport.CurrentSeg != node->TimeSeg) + { + m_goValue.Transport.CurrentSeg = node->TimeSeg; + + G3D::Quat rotation = m_goValue.Transport.AnimationInfo->GetAnimRotation(timer); + G3D::Vector3 pos = rotation.toRotationMatrix() + * G3D::Matrix3::fromEulerAnglesZYX(GetOrientation(), 0.0f, 0.0f) + * G3D::Vector3(node->X, node->Y, node->Z); + + pos += G3D::Vector3(GetStationaryX(), GetStationaryY(), GetStationaryZ()); + + G3D::Vector3 src(GetPositionX(), GetPositionY(), GetPositionZ()); + + sLog->outInfo(LOG_FILTER_GENERAL, "Src: %s Dest: %s", src.toString().c_str(), pos.toString().c_str()); + + GetMap()->GameObjectRelocation(this, pos.x, pos.y, pos.z, GetOrientation()); + } + } + break; + } + */ case GAMEOBJECT_TYPE_FISHINGNODE: { // fishing code (bobber ready) @@ -1182,10 +1222,12 @@ void GameObject::Use(Unit* user) if (itr->second) { if (Player* ChairUser = ObjectAccessor::FindPlayer(itr->second)) + { if (ChairUser->IsSitState() && ChairUser->getStandState() != UNIT_STAND_STATE_SIT && ChairUser->GetExactDist2d(x_i, y_i) < 0.1f) continue; // This seat is already occupied by ChairUser. NOTE: Not sure if the ChairUser->getStandState() != UNIT_STAND_STATE_SIT check is required. else itr->second = 0; // This seat is unoccupied. + } else itr->second = 0; // The seat may of had an occupant, but they're offline. } @@ -2102,6 +2144,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t if (index == GAMEOBJECT_DYNAMIC) { uint16 dynFlags = 0; + int16 pathProgress = -1; switch (GetGoType()) { case GAMEOBJECT_TYPE_CHEST: @@ -2115,12 +2158,15 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t if (ActivateToQuest(target)) dynFlags |= GO_DYNFLAG_LO_SPARKLE; break; + case GAMEOBJECT_TYPE_MO_TRANSPORT: + pathProgress = int16(float(m_goValue.Transport.PathProgress) / float(GetUInt32Value(GAMEOBJECT_LEVEL)) * 65535.0f); + break; default: break; } fieldBuffer << uint16(dynFlags); - fieldBuffer << uint16(-1); + fieldBuffer << int16(pathProgress); } else if (index == GAMEOBJECT_FLAGS) { @@ -2140,3 +2186,25 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t updateMask.AppendToPacket(data); data->append(fieldBuffer); } + +void GameObject::GetRespawnPosition(float &x, float &y, float &z, float* ori /* = NULL*/) const +{ + if (m_DBTableGuid) + { + if (GameObjectData const* data = sObjectMgr->GetGOData(GetDBTableGUIDLow())) + { + x = data->posX; + y = data->posY; + z = data->posZ; + if (ori) + *ori = data->orientation; + return; + } + } + + x = GetPositionX(); + y = GetPositionY(); + z = GetPositionZ(); + if (ori) + *ori = GetOrientation(); +} diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 3bddac81ee9..27ea15c38ff 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -28,6 +28,7 @@ class GameObjectAI; class Group; +class Transport; #define MAX_GAMEOBJECT_QUEST_ITEMS 6 @@ -229,6 +230,7 @@ struct GameObjectTemplate uint32 transportPhysics; //5 uint32 mapID; //6 uint32 worldState1; //7 + uint32 canBeStopped; //8 } moTransport; //16 GAMEOBJECT_TYPE_DUELFLAG - empty //17 GAMEOBJECT_TYPE_FISHINGNODE - empty @@ -539,9 +541,17 @@ struct GameObjectTemplate typedef UNORDERED_MAP<uint32, GameObjectTemplate> GameObjectTemplateContainer; class OPvPCapturePoint; +struct TransportAnimation; union GameObjectValue { + //11 GAMEOBJECT_TYPE_TRANSPORT + struct + { + uint32 PathProgress; + TransportAnimation const* AnimationInfo; + uint32 CurrentSeg; + } Transport; //25 GAMEOBJECT_TYPE_FISHINGHOLE struct { @@ -579,7 +589,7 @@ enum GOState // from `gameobject` struct GameObjectData { - explicit GameObjectData() : dbData(true) {} + explicit GameObjectData() : dbData(true) { } uint32 id; // entry in gamobject_template uint16 mapid; uint32 phaseMask; @@ -617,7 +627,7 @@ class GameObjectModel; // 5 sec for bobber catch #define FISHING_BOBBER_READY_TIME 5 -class GameObject : public WorldObject, public GridObject<GameObject> +class GameObject : public WorldObject, public GridObject<GameObject>, public MapObject { public: explicit GameObject(); @@ -811,8 +821,19 @@ class GameObject : public WorldObject, public GridObject<GameObject> uint32 GetDisplayId() const { return GetUInt32Value(GAMEOBJECT_DISPLAYID); } GameObjectModel* m_model; + void GetRespawnPosition(float &x, float &y, float &z, float* ori = NULL) const; + + Transport* ToTransport() { if (GetGOInfo()->type == GAMEOBJECT_TYPE_MO_TRANSPORT) return reinterpret_cast<Transport*>(this); else return NULL; } + Transport const* ToTransport() const { if (GetGOInfo()->type == GAMEOBJECT_TYPE_MO_TRANSPORT) return reinterpret_cast<Transport const*>(this); else return NULL; } + + float GetStationaryX() const { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MO_TRANSPORT) return m_stationaryPosition.GetPositionX(); return GetPositionX(); } + float GetStationaryY() const { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MO_TRANSPORT) return m_stationaryPosition.GetPositionY(); return GetPositionY(); } + 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(); } + protected: bool AIM_Initialize(); + void UpdateModel(); // updates model in case displayId were changed uint32 m_spellId; time_t m_respawnTime; // (secs) time of next respawn (or despawn if GO have owner()), uint32 m_respawnDelayTime; // (secs) if 0 then current GO state no dependent from timer @@ -835,6 +856,7 @@ class GameObject : public WorldObject, public GridObject<GameObject> GameObjectValue m_goValue; uint64 m_rotation; + Position m_stationaryPosition; uint64 m_lootRecipient; uint32 m_lootRecipientGroup; @@ -842,7 +864,6 @@ class GameObject : public WorldObject, public GridObject<GameObject> private: void RemoveFromOwner(); void SwitchDoorOrButton(bool activate, bool alternative = false); - void UpdateModel(); // updates model in case displayId were changed //! Object distance/size - overridden from Object::_IsWithinDist. Needs to take in account proper GO size. bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool /*is3D*/) const diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index ba9604fcd52..1d0b7b66d6d 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -33,10 +33,10 @@ struct EnchStoreItem float chance; EnchStoreItem() - : ench(0), chance(0) {} + : ench(0), chance(0) { } EnchStoreItem(uint32 _ench, float _chance) - : ench(_ench), chance(_chance) {} + : ench(_ench), chance(_chance) { } }; typedef std::vector<EnchStoreItem> EnchStoreList; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 9d77e144c0b..b7417c0e7c6 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -219,9 +219,6 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c case GAMEOBJECT_TYPE_FLAGDROP: updateType = UPDATETYPE_CREATE_OBJECT2; break; - case GAMEOBJECT_TYPE_TRANSPORT: - flags |= UPDATEFLAG_TRANSPORT; - break; default: break; } @@ -414,13 +411,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const // 0x40 if (flags & UPDATEFLAG_STATIONARY_POSITION) { - *data << object->GetPositionX(); - *data << object->GetPositionY(); - if (isType(TYPEMASK_UNIT)) - *data << unit->GetPositionZMinusOffset(); - else - *data << object->GetPositionZ(); - *data << object->GetOrientation(); + *data << object->GetStationaryX(); + *data << object->GetStationaryY(); + *data << object->GetStationaryZ(); + *data << object->GetStationaryO(); } } } @@ -473,7 +467,11 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const // 0x2 if (flags & UPDATEFLAG_TRANSPORT) { - *data << uint32(getMSTime()); // Unknown - getMSTime is wrong. + GameObject const* go = ToGameObject(); + if (go && go->IsTransport()) + *data << uint32(go->GetGOValue()->Transport.PathProgress); + else + *data << uint32(getMSTime()); } // 0x80 @@ -1883,7 +1881,7 @@ namespace Trinity { public: MonsterChatBuilder(WorldObject const& obj, ChatMsg msgtype, int32 textId, uint32 language, uint64 targetGUID) - : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(language), i_targetGUID(targetGUID) {} + : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(language), i_targetGUID(targetGUID) { } void operator()(WorldPacket& data, LocaleConstant loc_idx) { char const* text = sObjectMgr->GetTrinityString(i_textId, loc_idx); @@ -1904,7 +1902,7 @@ namespace Trinity { public: MonsterCustomChatBuilder(WorldObject const& obj, ChatMsg msgtype, const char* text, uint32 language, uint64 targetGUID) - : i_object(obj), i_msgtype(msgtype), i_text(text), i_language(language), i_targetGUID(targetGUID) {} + : i_object(obj), i_msgtype(msgtype), i_text(text), i_language(language), i_targetGUID(targetGUID) { } void operator()(WorldPacket& data, LocaleConstant loc_idx) { /// @todo i_object.GetName() also must be localized? @@ -2428,10 +2426,10 @@ namespace Trinity { public: NearUsedPosDo(WorldObject const& obj, WorldObject const* searcher, float angle, ObjectPosSelector& selector) - : i_object(obj), i_searcher(searcher), i_angle(angle), i_selector(selector) {} + : i_object(obj), i_searcher(searcher), i_angle(angle), i_selector(selector) { } - void operator()(Corpse*) const {} - void operator()(DynamicObject*) const {} + void operator()(Corpse*) const { } + void operator()(DynamicObject*) const { } void operator()(Creature* c) const { @@ -2675,7 +2673,8 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle) // Prevent invalid coordinates here, position is unchanged if (!Trinity::IsValidMapCoord(destx, desty, pos.m_positionZ)) { - TC_LOG_FATAL(LOG_FILTER_GENERAL, "WorldObject::MovePosition invalid coordinates X: %f and Y: %f were passed!", destx, desty); + TC_LOG_FATAL(LOG_FILTER_GENERAL, "WorldObject::MovePosition: Object (TypeId: %u Entry: %u GUID: %u) has invalid coordinates X: %f and Y: %f were passed!", + GetTypeId(), GetEntry(), GetGUIDLow(), destx, desty); return; } @@ -2851,7 +2850,7 @@ struct WorldObjectChangeAccumulator UpdateDataMapType& i_updateDatas; WorldObject& i_object; std::set<uint64> plr_list; - WorldObjectChangeAccumulator(WorldObject &obj, UpdateDataMapType &d) : i_updateDatas(d), i_object(obj) {} + WorldObjectChangeAccumulator(WorldObject &obj, UpdateDataMapType &d) : i_updateDatas(d), i_object(obj) { } void Visit(PlayerMapType &m) { Player* source = NULL; @@ -2913,7 +2912,7 @@ struct WorldObjectChangeAccumulator } } - template<class SKIP> void Visit(GridRefManager<SKIP> &) {} + template<class SKIP> void Visit(GridRefManager<SKIP> &) { } }; void WorldObject::BuildUpdate(UpdateDataMapType& data_map) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 66b3a737e0c..f03b95d0cc7 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -200,7 +200,7 @@ class Object virtual bool hasQuest(uint32 /* quest_id */) const { return false; } virtual bool hasInvolvedQuest(uint32 /* quest_id */) const { return false; } - virtual void BuildUpdate(UpdateDataMapType&) {} + virtual void BuildUpdate(UpdateDataMapType&) { } void BuildFieldsUpdate(Player*, UpdateDataMapType &) const; void SetFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags |= flag; } @@ -275,13 +275,13 @@ struct Position { struct PositionXYZStreamer { - explicit PositionXYZStreamer(Position& pos) : m_pos(&pos) {} + explicit PositionXYZStreamer(Position& pos) : m_pos(&pos) { } Position* m_pos; }; struct PositionXYZOStreamer { - explicit PositionXYZOStreamer(Position& pos) : m_pos(&pos) {} + explicit PositionXYZOStreamer(Position& pos) : m_pos(&pos) { } Position* m_pos; }; @@ -523,6 +523,35 @@ class FlaggedValuesArray32 T_FLAGS m_flags; }; +enum MapObjectCellMoveState +{ + MAP_OBJECT_CELL_MOVE_NONE, //not in move list + MAP_OBJECT_CELL_MOVE_ACTIVE, //in move list + MAP_OBJECT_CELL_MOVE_INACTIVE, //in move list but should not move +}; + +class MapObject +{ + friend class Map; //map for moving creatures + friend class ObjectGridLoader; //grid loader for loading creatures + + protected: + MapObject() : _moveState(MAP_OBJECT_CELL_MOVE_NONE) { } + + private: + Cell _currentCell; + Cell const& GetCurrentCell() const { return _currentCell; } + void SetCurrentCell(Cell const& cell) { _currentCell = cell; } + + MapObjectCellMoveState _moveState; + Position _newPosition; + void SetNewCellPosition(float x, float y, float z, float o) + { + _moveState = MAP_OBJECT_CELL_MOVE_ACTIVE; + _newPosition.Relocate(x, y, z, o); + } +}; + class WorldObject : public Object, public WorldLocation { protected: @@ -621,7 +650,7 @@ class WorldObject : public Object, public WorldLocation void SendObjectDeSpawnAnim(uint64 guid); - virtual void SaveRespawnTime() {} + virtual void SaveRespawnTime() { } void AddObjectToRemoveList(); float GetGridActivationRange() const; @@ -700,16 +729,22 @@ class WorldObject : public Object, public WorldLocation // Transports Transport* GetTransport() const { return m_transport; } - virtual float GetTransOffsetX() const { return 0; } - virtual float GetTransOffsetY() const { return 0; } - virtual float GetTransOffsetZ() const { return 0; } - virtual float GetTransOffsetO() const { return 0; } - virtual uint32 GetTransTime() const { return 0; } - virtual int8 GetTransSeat() const { return -1; } + float GetTransOffsetX() const { return m_movementInfo.transport.pos.GetPositionX(); } + float GetTransOffsetY() const { return m_movementInfo.transport.pos.GetPositionY(); } + float GetTransOffsetZ() const { return m_movementInfo.transport.pos.GetPositionZ(); } + float GetTransOffsetO() const { return m_movementInfo.transport.pos.GetOrientation(); } + uint32 GetTransTime() const { return m_movementInfo.transport.time; } + int8 GetTransSeat() const { return m_movementInfo.transport.seat; } virtual uint64 GetTransGUID() const; void SetTransport(Transport* t) { m_transport = t; } MovementInfo m_movementInfo; + + virtual float GetStationaryX() const { return GetPositionX(); } + virtual float GetStationaryY() const { return GetPositionY(); } + virtual float GetStationaryZ() const { return GetPositionZ(); } + virtual float GetStationaryO() const { return GetOrientation(); } + protected: std::string m_name; bool m_isActive; @@ -739,7 +774,6 @@ class WorldObject : public Object, public WorldLocation uint16 m_notifyflags; uint16 m_executed_notifies; - virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const; bool CanNeverSee(WorldObject const* obj) const; @@ -755,7 +789,7 @@ namespace Trinity class ObjectDistanceOrderPred { public: - ObjectDistanceOrderPred(WorldObject const* pRefObj, bool ascending = true) : m_refObj(pRefObj), m_ascending(ascending) {} + ObjectDistanceOrderPred(WorldObject const* pRefObj, bool ascending = true) : m_refObj(pRefObj), m_ascending(ascending) { } bool operator()(WorldObject const* pLeft, WorldObject const* pRight) const { return m_ascending ? m_refObj->GetDistanceOrder(pLeft, pRight) : !m_refObj->GetDistanceOrder(pLeft, pRight); diff --git a/src/server/game/Entities/Object/ObjectPosSelector.h b/src/server/game/Entities/Object/ObjectPosSelector.h index d381fb5627e..d3f43654969 100644 --- a/src/server/game/Entities/Object/ObjectPosSelector.h +++ b/src/server/game/Entities/Object/ObjectPosSelector.h @@ -34,7 +34,7 @@ struct ObjectPosSelector { struct UsedPos { - UsedPos(float sign_, float size_, float dist_) : sign(sign_), size(size_), dist(dist_) {} + UsedPos(float sign_, float size_, float dist_) : sign(sign_), size(size_), dist(dist_) { } float sign; diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index ba4a4070e63..acf1e12b11b 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -25,9 +25,7 @@ #include "World.h" #include "zlib.h" -UpdateData::UpdateData() : m_blockCount(0) -{ -} +UpdateData::UpdateData() : m_blockCount(0) { } void UpdateData::AddOutOfRangeGUID(std::set<uint64>& guids) { diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 9758564c8f2..dfe658a30d3 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -2056,7 +2056,7 @@ void Pet::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) } // Not send cooldown for this spells - if (spellInfo->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + if (spellInfo->IsCooldownStartedOnEvent()) continue; if (spellInfo->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9ada25b1c81..ea18a9836a7 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -923,9 +923,6 @@ void Player::CleanupsBeforeDelete(bool finalCleanup) Unit::CleanupsBeforeDelete(finalCleanup); - if (m_transport) - m_transport->RemovePassenger(this); - // clean up player-instance binds, may unload some instance saves for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) @@ -2181,8 +2178,26 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (!(options & TELE_TO_NOT_LEAVE_COMBAT)) CombatStop(); + // new final coordinates + float final_x = x; + float final_y = y; + float final_z = z; + float final_o = orientation; + + // Calculate final positions if on transport + if (m_transport) + { + float tx, ty, tz, to; + m_movementInfo.transport.pos.GetPosition(tx, ty, tz, to); + + final_x = x + tx * std::cos(orientation) - ty * std::sin(orientation); + final_y = y + ty * std::cos(orientation) + tx * std::sin(orientation); + final_z = z + tz; + final_o = Position::NormalizeOrientation(orientation + m_movementInfo.transport.pos.GetOrientation()); + } + // this will be used instead of the current location in SaveToDB - m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); + m_teleport_dest = WorldLocation(mapid, final_x, final_y, final_z, final_o); SetFallInformation(0, z); // code for finish transfer called in WorldSession::HandleMovementOpcodes() @@ -2193,7 +2208,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati { Position oldPos; GetPosition(&oldPos); - Relocate(x, y, z, orientation); + Relocate(final_x, final_y, final_z, final_o); SendTeleportAckPacket(); SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place } @@ -2295,16 +2310,20 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati float final_z = z; float final_o = orientation; + // Calculate final positions if on transport if (m_transport) { - final_x += m_movementInfo.transport.pos.GetPositionX(); - final_y += m_movementInfo.transport.pos.GetPositionY(); - final_z += m_movementInfo.transport.pos.GetPositionZ(); - final_o += m_movementInfo.transport.pos.GetOrientation(); + float tx, ty, tz, to; + m_movementInfo.transport.pos.GetPosition(tx, ty, tz, to); + + final_x = x + tx * std::cos(orientation) - ty * std::sin(orientation); + final_y = y + ty * std::cos(orientation) + tx * std::sin(orientation); + final_z = z + tz; + final_o = Position::NormalizeOrientation(orientation + m_movementInfo.transport.pos.GetOrientation()); } m_teleport_dest = WorldLocation(mapid, final_x, final_y, final_z, final_o); - SetFallInformation(0, final_z); + SetFallInformation(0, z); // if the player is saved before worldportack (at logout for example) // this will be used instead of the current location in SaveToDB @@ -3365,7 +3384,7 @@ void Player::SendInitialSpells() data << uint32(itr->first); data << uint16(itr->second.itemid); // cast item id - data << uint16(sEntry->Category); // spell category + data << uint16(sEntry->GetCategory()); // spell category // send infinity cooldown in special format if (itr->second.end >= infTime) @@ -3377,7 +3396,7 @@ void Player::SendInitialSpells() time_t cooldown = itr->second.end > curTime ? (itr->second.end-curTime)*IN_MILLISECONDS : 0; - if (sEntry->Category) // may be wrong, but anyway better than nothing... + if (sEntry->GetCategory()) // may be wrong, but anyway better than nothing... { data << uint32(0); // cooldown data << uint32(cooldown); // category cooldown @@ -4240,16 +4259,16 @@ void Player::RemoveSpellCooldown(uint32 spell_id, bool update /* = false */) // I am not sure which one is more efficient void Player::RemoveCategoryCooldown(uint32 cat) { - SpellCategoryStore::const_iterator i_scstore = sSpellCategoryStore.find(cat); - if (i_scstore != sSpellCategoryStore.end()) + SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat); + if (i_scstore != sSpellsByCategoryStore.end()) for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset) RemoveSpellCooldown(*i_scset, true); } void Player::RemoveSpellCategoryCooldown(uint32 cat, bool update /* = false */) { - SpellCategoryStore::const_iterator ct = sSpellCategoryStore.find(cat); - if (ct == sSpellCategoryStore.end()) + SpellCategoryStore::const_iterator ct = sSpellsByCategoryStore.find(cat); + if (ct == sSpellsByCategoryStore.end()) return; const SpellCategorySet& ct_set = ct->second; @@ -6196,7 +6215,7 @@ bool Player::UpdateFishingSkill() // levels sync. with spell requirement for skill levels to learn // bonus abilities in sSkillLineAbilityStore // Used only to avoid scan DBC at each skill grow -static uint32 bonusSkillLevels[] = {75, 150, 225, 300, 375, 450}; +static uint32 bonusSkillLevels[ ] = {75, 150, 225, 300, 375, 450}; static const size_t bonusSkillLevelsSize = sizeof(bonusSkillLevels) / sizeof(uint32); bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) @@ -15459,9 +15478,6 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) // can be start if only all quests in prev quest exclusive group completed and rewarded ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup())); - // always must be found if qPrevInfo->ExclusiveGroup != 0 - ASSERT(range.first != range.second); - for (; range.first != range.second; ++range.first) { uint32 exclude_Id = range.first->second; @@ -15495,9 +15511,6 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) // can be start if only all quests in prev quest exclusive group active ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup())); - // always must be found if qPrevInfo->ExclusiveGroup != 0 - ASSERT(range.first != range.second); - for (; range.first != range.second; ++range.first) { uint32 exclude_Id = range.first->second; @@ -15665,9 +15678,6 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup())); - // always must be found if qInfo->ExclusiveGroup != 0 - ASSERT(range.first != range.second); - for (; range.first != range.second; ++range.first) { uint32 exclude_Id = range.first->second; @@ -17182,17 +17192,15 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) } else { - for (MapManager::TransportSet::iterator iter = sMapMgr->m_Transports.begin(); iter != sMapMgr->m_Transports.end(); ++iter) + if (GameObject* go = HashMapHolder<GameObject>::Find(m_movementInfo.transport.guid)) + m_transport = go->ToTransport(); + + if (m_transport) { - if ((*iter)->GetGUIDLow() == transGUID) - { - m_transport = *iter; - m_transport->AddPassenger(this); - mapId = (m_transport->GetMapId()); - break; - } + m_transport->AddPassenger(this); + mapId = m_transport->GetMapId(); } - if (!m_transport) + else { TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player (guidlow %d) have problems with transport guid (%u). Teleport to bind location.", guid, transGUID); @@ -20425,13 +20433,13 @@ void Player::PetSpellInitialize() time_t cooldown = (itr->second > curTime) ? (itr->second - curTime) * IN_MILLISECONDS : 0; data << uint32(itr->first); // spell ID - CreatureSpellCooldowns::const_iterator categoryitr = pet->m_CreatureCategoryCooldowns.find(spellInfo->Category); + CreatureSpellCooldowns::const_iterator categoryitr = pet->m_CreatureCategoryCooldowns.find(spellInfo->GetCategory()); if (categoryitr != pet->m_CreatureCategoryCooldowns.end()) { time_t categoryCooldown = (categoryitr->second > curTime) ? (categoryitr->second - curTime) * IN_MILLISECONDS : 0; - data << uint16(spellInfo->Category); // spell category - data << uint32(cooldown); // spell cooldown - data << uint32(categoryCooldown); // category cooldown + data << uint16(spellInfo->GetCategory()); // spell category + data << uint32(cooldown); // spell cooldown + data << uint32(categoryCooldown); // category cooldown } else { @@ -20538,13 +20546,13 @@ void Player::VehicleSpellInitialize() time_t cooldown = (itr->second > now) ? (itr->second - now) * IN_MILLISECONDS : 0; data << uint32(itr->first); // spell ID - CreatureSpellCooldowns::const_iterator categoryitr = vehicle->m_CreatureCategoryCooldowns.find(spellInfo->Category); + CreatureSpellCooldowns::const_iterator categoryitr = vehicle->m_CreatureCategoryCooldowns.find(spellInfo->GetCategory()); if (categoryitr != vehicle->m_CreatureCategoryCooldowns.end()) { time_t categoryCooldown = (categoryitr->second > now) ? (categoryitr->second - now) * IN_MILLISECONDS : 0; - data << uint16(spellInfo->Category); // spell category - data << uint32(cooldown); // spell cooldown - data << uint32(categoryCooldown); // category cooldown + data << uint16(spellInfo->GetCategory()); // spell category + data << uint32(cooldown); // spell cooldown + data << uint32(categoryCooldown); // category cooldown } else { @@ -21212,7 +21220,7 @@ void Player::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) } // Not send cooldown for this spells - if (spellInfo->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + if (spellInfo->IsCooldownStartedOnEvent()) continue; if (spellInfo->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) @@ -21675,7 +21683,7 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite // if no cooldown found above then base at DBC data if (rec < 0 && catrec < 0) { - cat = spellInfo->Category; + cat = spellInfo->GetCategory(); rec = spellInfo->RecoveryTime; catrec = spellInfo->CategoryRecoveryTime; } @@ -21726,8 +21734,8 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite // category spells if (cat && catrec > 0) { - SpellCategoryStore::const_iterator i_scstore = sSpellCategoryStore.find(cat); - if (i_scstore != sSpellCategoryStore.end()) + SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat); + if (i_scstore != sSpellsByCategoryStore.end()) { for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset) { @@ -22165,7 +22173,7 @@ inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, T* target, std::set template<> inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, GameObject* target, std::set<Unit*>& /*v*/) { - // Don't update only GAMEOBJECT_TYPE_TRANSPORT (or all transports and destructible buildings?) + // @HACK: This is to prevent objects like deeprun tram from disappearing when player moves far from its spawn point while riding it if ((target->GetGOInfo()->type != GAMEOBJECT_TYPE_TRANSPORT)) s64.insert(target->GetGUID()); } @@ -22185,9 +22193,7 @@ inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, Player* target, std } template<class T> -inline void BeforeVisibilityDestroy(T* /*t*/, Player* /*p*/) -{ -} +inline void BeforeVisibilityDestroy(T* /*t*/, Player* /*p*/) { } template<> inline void BeforeVisibilityDestroy<Creature>(Creature* t, Player* p) @@ -22217,9 +22223,6 @@ void Player::UpdateVisibilityOf(WorldObject* target) { if (CanSeeOrDetect(target, false, true)) { - //if (target->isType(TYPEMASK_UNIT) && ((Unit*)target)->m_Vehicle) - // UpdateVisibilityOf(((Unit*)target)->m_Vehicle); - target->SendUpdateToPlayer(this); m_clientGUIDs.insert(target->GetGUID()); @@ -22308,9 +22311,6 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& vi { if (CanSeeOrDetect(target, false, true)) { - //if (target->isType(TYPEMASK_UNIT) && ((Unit*)target)->m_Vehicle) - // UpdateVisibilityOf(((Unit*)target)->m_Vehicle, data, visibleNow); - target->BuildCreateUpdateBlockForPlayer(&data, this); UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index fee542a752e..35a3f5f10d4 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -111,7 +111,7 @@ struct PlayerTalent // Spell modifier (used for modify other spells) struct SpellModifier { - SpellModifier(Aura* _ownerAura = NULL) : op(SPELLMOD_DAMAGE), type(SPELLMOD_FLAT), charges(0), value(0), mask(), spellId(0), ownerAura(_ownerAura) {} + SpellModifier(Aura* _ownerAura = NULL) : op(SPELLMOD_DAMAGE), type(SPELLMOD_FLAT), charges(0), value(0), mask(), spellId(0), ownerAura(_ownerAura) { } SpellModOp op : 8; SpellModType type : 8; int16 charges : 16; @@ -179,7 +179,7 @@ enum ReputationSource struct ActionButton { - ActionButton() : packedData(0), uState(ACTIONBUTTON_NEW) {} + ActionButton() : packedData(0), uState(ACTIONBUTTON_NEW) { } uint32 packedData; ActionButtonUpdateState uState; @@ -205,7 +205,7 @@ typedef std::map<uint8, ActionButton> ActionButtonList; struct PlayerCreateInfoItem { - PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) {} + PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) { } uint32 item_id; uint32 item_amount; @@ -215,7 +215,7 @@ typedef std::list<PlayerCreateInfoItem> PlayerCreateInfoItems; struct PlayerClassLevelInfo { - PlayerClassLevelInfo() : basehealth(0), basemana(0) {} + PlayerClassLevelInfo() : basehealth(0), basemana(0) { } uint16 basehealth; uint16 basemana; }; @@ -238,8 +238,8 @@ typedef std::list<uint32> PlayerCreateInfoSpells; struct PlayerCreateInfoAction { - PlayerCreateInfoAction() : button(0), type(0), action(0) {} - PlayerCreateInfoAction(uint8 _button, uint32 _action, uint8 _type) : button(_button), type(_type), action(_action) {} + PlayerCreateInfoAction() : button(0), type(0), action(0) { } + PlayerCreateInfoAction(uint8 _button, uint32 _action, uint8 _type) : button(_button), type(_type), action(_action) { } uint8 button; uint8 type; @@ -270,7 +270,7 @@ struct PlayerInfo struct PvPInfo { - PvPInfo() : IsHostile(false), IsInHostileArea(false), IsInNoPvPArea(false), IsInFFAPvPArea(false), EndTimer(0) {} + PvPInfo() : IsHostile(false), IsInHostileArea(false), IsInNoPvPArea(false), IsInFFAPvPArea(false), EndTimer(0) { } bool IsHostile; bool IsInHostileArea; ///> Marks if player is in an area which forces PvP flag @@ -281,7 +281,7 @@ struct PvPInfo struct DuelInfo { - DuelInfo() : initiator(NULL), opponent(NULL), startTimer(0), startTime(0), outOfBound(0), isMounted(false) {} + DuelInfo() : initiator(NULL), opponent(NULL), startTimer(0), startTime(0), outOfBound(0), isMounted(false) { } Player* initiator; Player* opponent; @@ -343,7 +343,7 @@ struct Runes struct EnchantDuration { - EnchantDuration() : item(NULL), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) {}; + EnchantDuration() : item(NULL), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) { }; EnchantDuration(Item* _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot), leftduration(_leftduration){ ASSERT(item); }; @@ -667,7 +667,7 @@ typedef std::map<uint32, EquipmentSet> EquipmentSets; struct ItemPosCount { - ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {} + ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) { } bool isContainedIn(std::vector<ItemPosCount> const& vec) const; uint16 pos; uint32 count; @@ -833,7 +833,7 @@ struct InstancePlayerBind /* permanent PlayerInstanceBinds are created in Raid/Heroic instances for players that aren't already permanently bound when they are inside when a boss is killed or when they enter an instance that the group leader is permanently bound to. */ - InstancePlayerBind() : save(NULL), perm(false) {} + InstancePlayerBind() : save(NULL), perm(false) { } }; struct AccessRequirement @@ -900,7 +900,7 @@ class PlayerTaxi { public: PlayerTaxi(); - ~PlayerTaxi() {} + ~PlayerTaxi() { } // Nodes void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level); void LoadTaxiMask(std::string const& data); diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index 8b37fef9500..6416455ebb6 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -191,13 +191,9 @@ bool PlayerSocial::HasIgnore(uint32 ignore_guid) return false; } -SocialMgr::SocialMgr() -{ -} +SocialMgr::SocialMgr() { } -SocialMgr::~SocialMgr() -{ -} +SocialMgr::~SocialMgr() { } void SocialMgr::GetFriendInfo(Player* player, uint32 friendGUID, FriendInfo &friendInfo) { diff --git a/src/server/game/Entities/Totem/Totem.h b/src/server/game/Entities/Totem/Totem.h index 565d13cd0d0..48cb71c4918 100644 --- a/src/server/game/Entities/Totem/Totem.h +++ b/src/server/game/Entities/Totem/Totem.h @@ -36,7 +36,7 @@ class Totem : public Minion { public: Totem(SummonPropertiesEntry const* properties, Unit* owner); - virtual ~Totem() {} + virtual ~Totem() { } void Update(uint32 time); void InitStats(uint32 duration); void InitSummon(); @@ -48,12 +48,12 @@ class Totem : public Minion bool UpdateStats(Stats /*stat*/) { return true; } bool UpdateAllStats() { return true; } - void UpdateResistances(uint32 /*school*/) {} - void UpdateArmor() {} - void UpdateMaxHealth() {} - void UpdateMaxPower(Powers /*power*/) {} - void UpdateAttackPowerAndDamage(bool /*ranged*/) {} - void UpdateDamagePhysical(WeaponAttackType /*attType*/) {} + void UpdateResistances(uint32 /*school*/) { } + void UpdateArmor() { } + void UpdateMaxHealth() { } + void UpdateMaxPower(Powers /*power*/) { } + void UpdateAttackPowerAndDamage(bool /*ranged*/) { } + void UpdateDamagePhysical(WeaponAttackType /*attType*/) { } bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 23197b40ad0..ea8aae2af8c 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -26,166 +26,27 @@ #include "DBCStores.h" #include "World.h" #include "GameObjectAI.h" +#include "Vehicle.h" +#include "MapReference.h" #include "Player.h" +#include "Cell.h" +#include "CellImpl.h" -void MapManager::LoadTransports() +Transport::Transport() : GameObject(), + _transportInfo(NULL), _isMoving(true), _pendingStop(false) { - uint32 oldMSTime = getMSTime(); - - QueryResult result = WorldDatabase.Query("SELECT guid, entry, name, period, ScriptName FROM transports"); - - if (!result) - { - TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 transports. DB table `transports` is empty!"); - return; - } - - uint32 count = 0; - - do - { - - Field* fields = result->Fetch(); - uint32 lowguid = fields[0].GetUInt32(); - uint32 entry = fields[1].GetUInt32(); - std::string name = fields[2].GetString(); - uint32 period = fields[3].GetUInt32(); - uint32 scriptId = sObjectMgr->GetScriptId(fields[4].GetCString()); - - GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry); - - if (!goinfo) - { - TC_LOG_ERROR(LOG_FILTER_SQL, "Transport ID:%u, Name: %s, will not be loaded, gameobject_template missing", entry, name.c_str()); - continue; - } - - if (goinfo->type != GAMEOBJECT_TYPE_MO_TRANSPORT) - { - TC_LOG_ERROR(LOG_FILTER_SQL, "Transport ID:%u, Name: %s, will not be loaded, gameobject_template type wrong", entry, name.c_str()); - continue; - } - - // TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading transport %d between %s, %s", entry, name.c_str(), goinfo->name); - - std::set<uint32> mapsUsed; - - Transport* t = new Transport(period, scriptId); - if (!t->GenerateWaypoints(goinfo->moTransport.taxiPathId, mapsUsed)) - // skip transports with empty waypoints list - { - TC_LOG_ERROR(LOG_FILTER_SQL, "Transport (path id %u) path size = 0. Transport ignored, check DBC files or transport GO data0 field.", goinfo->moTransport.taxiPathId); - delete t; - continue; - } - - float x = t->m_WayPoints[0].x; - float y = t->m_WayPoints[0].y; - float z = t->m_WayPoints[0].z; - uint32 mapid = t->m_WayPoints[0].mapid; - float o = 1.0f; - - // creates the Gameobject - if (!t->Create(lowguid, entry, mapid, x, y, z, o, 255, 0)) - { - delete t; - continue; - } - - m_Transports.insert(t); - - for (std::set<uint32>::const_iterator i = mapsUsed.begin(); i != mapsUsed.end(); ++i) - m_TransportsByMap[*i].insert(t); - - //If we someday decide to use the grid to track transports, here: - t->SetMap(sMapMgr->CreateBaseMap(mapid)); - t->AddToWorld(); - - ++count; - } - while (result->NextRow()); - - // check transport data DB integrity - result = WorldDatabase.Query("SELECT gameobject.guid, gameobject.id, transports.name FROM gameobject, transports WHERE gameobject.id = transports.entry"); - if (result) // wrong data found - { - do - { - Field* fields = result->Fetch(); - - uint32 guid = fields[0].GetUInt32(); - uint32 entry = fields[1].GetUInt32(); - std::string name = fields[2].GetString(); - TC_LOG_ERROR(LOG_FILTER_SQL, "Transport %u '%s' have record (GUID: %u) in `gameobject`. Transports must not have any records in `gameobject` or its behavior will be unpredictable/bugged.", entry, name.c_str(), guid); - } - while (result->NextRow()); - } - - TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); -} - -void MapManager::LoadTransportNPCs() -{ - uint32 oldMSTime = getMSTime(); - - // 0 1 2 3 4 5 6 7 - QueryResult result = WorldDatabase.Query("SELECT guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO, emote FROM creature_transport"); - - if (!result) - { - TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 transport NPCs. DB table `creature_transport` is empty!"); - return; - } - - uint32 count = 0; - - do - { - Field* fields = result->Fetch(); - uint32 guid = fields[0].GetInt32(); - uint32 entry = fields[1].GetInt32(); - uint32 transportEntry = fields[2].GetInt32(); - float tX = fields[3].GetFloat(); - float tY = fields[4].GetFloat(); - float tZ = fields[5].GetFloat(); - float tO = fields[6].GetFloat(); - uint32 anim = fields[7].GetInt32(); - - for (MapManager::TransportSet::iterator itr = m_Transports.begin(); itr != m_Transports.end(); ++itr) - { - if ((*itr)->GetEntry() == transportEntry) - { - (*itr)->AddNPCPassenger(guid, entry, tX, tY, tZ, tO, anim); - break; - } - } - - ++count; - } - while (result->NextRow()); - - TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u transport npcs in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); -} - -Transport::Transport(uint32 period, uint32 script) : GameObject(), m_pathTime(0), m_timer(0), -currenttguid(0), m_period(period), ScriptId(script), m_nextNodeTime(0) -{ - m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION); + m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION; } Transport::~Transport() { - for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr) - { - (*itr)->SetTransport(NULL); - GetMap()->AddObjectToRemoveList(*itr); - } + ASSERT(_passengers.empty()); + UnloadStaticPassengers(); } -bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags) +bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress) { Relocate(x, y, z, ang); - // instance id and phaseMask isn't set to values different from std. if (!IsPositionValid()) { @@ -206,520 +67,506 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa m_goInfo = goinfo; - SetObjectScale(goinfo->size); + TransportTemplate const* tInfo = sTransportMgr->GetTransportTemplate(entry); + if (!tInfo) + { + TC_LOG_ERROR(LOG_FILTER_SQL, "Transport %u (name: %s) will not be created, missing `transport_template` entry.", entry, goinfo->name.c_str()); + return false; + } + + _transportInfo = tInfo; + // initialize waypoints + _nextFrame = tInfo->keyFrames.begin(); + _currentFrame = _nextFrame++; + _triggeredArrivalEvent = false; + _triggeredDepartureEvent = false; + + m_goValue.Transport.PathProgress = 0; + SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size); SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction); SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags); - SetUInt32Value(GAMEOBJECT_LEVEL, m_period); + SetPeriod(tInfo->pathTime); SetEntry(goinfo->entry); - SetDisplayId(goinfo->displayId); - SetGoState(GO_STATE_READY); - SetGoType(GameobjectTypes(goinfo->type)); - + _pendingStop = goinfo->moTransport.canBeStopped != 0; + SetGoType(GAMEOBJECT_TYPE_MO_TRANSPORT); SetGoAnimProgress(animprogress); - if (dynflags) - SetUInt32Value(GAMEOBJECT_DYNAMIC, MAKE_PAIR32(0, dynflags)); - SetName(goinfo->name); - - SetZoneScript(); - + UpdateRotationFields(0.0f, 1.0f); return true; } -struct keyFrame +void Transport::Update(uint32 diff) { - explicit keyFrame(TaxiPathNodeEntry const& _node) : node(&_node), - distSinceStop(-1.0f), distUntilStop(-1.0f), distFromPrev(-1.0f), tFrom(0.0f), tTo(0.0f) - { - } + uint32 const positionUpdateDelay = 200; - TaxiPathNodeEntry const* node; + if (AI()) + AI()->UpdateAI(diff); + else if (!AIM_Initialize()) + TC_LOG_ERROR(LOG_FILTER_TRANSPORTS, "Could not initialize GameObjectAI for Transport"); - float distSinceStop; - float distUntilStop; - float distFromPrev; - float tFrom, tTo; -}; + if (GetKeyFrames().size() <= 1) + return; -bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) -{ - if (pathid >= sTaxiPathNodesByPath.size()) - return false; + m_goValue.Transport.PathProgress += diff; - TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathid]; + uint32 timer = m_goValue.Transport.PathProgress % GetPeriod(); - std::vector<keyFrame> keyFrames; - int mapChange = 0; - mapids.clear(); - for (size_t i = 1; i < path.size() - 1; ++i) + // Set current waypoint + // Desired outcome: _currentFrame->DepartureTime < timer < _nextFrame->ArriveTime + // ... arrive | ... delay ... | departure + // event / event / + for (;;) { - if (mapChange == 0) + if (timer >= _currentFrame->ArriveTime) { - TaxiPathNodeEntry const& node_i = path[i]; - if (node_i.mapid == path[i+1].mapid) + if (!_triggeredArrivalEvent) { - keyFrame k(node_i); - keyFrames.push_back(k); - mapids.insert(k.node->mapid); + DoEventIfAny(*_currentFrame, false); + _triggeredArrivalEvent = true; } - else + + if (timer < _currentFrame->DepartureTime) { - mapChange = 1; + SetMoving(false); + if (_pendingStop) + SetGoState(GO_STATE_READY); + break; // its a stop frame and we are waiting } } - else - { - --mapChange; - } - } - - int lastStop = -1; - int firstStop = -1; - // first cell is arrived at by teleportation :S - keyFrames[0].distFromPrev = 0; - if (keyFrames[0].node->actionFlag == 2) - { - lastStop = 0; - } - - // find the rest of the distances between key points - for (size_t i = 1; i < keyFrames.size(); ++i) - { - if ((keyFrames[i].node->actionFlag == 1) || (keyFrames[i].node->mapid != keyFrames[i-1].node->mapid)) + if (_pendingStop && timer >= _currentFrame->DepartureTime && GetGoState() == GO_STATE_READY) { - keyFrames[i].distFromPrev = 0; + m_goValue.Transport.PathProgress = (m_goValue.Transport.PathProgress / GetPeriod()); + m_goValue.Transport.PathProgress *= GetPeriod(); + m_goValue.Transport.PathProgress += _currentFrame->ArriveTime; + break; } - else - { - keyFrames[i].distFromPrev = - sqrt(pow(keyFrames[i].node->x - keyFrames[i - 1].node->x, 2) + - pow(keyFrames[i].node->y - keyFrames[i - 1].node->y, 2) + - pow(keyFrames[i].node->z - keyFrames[i - 1].node->z, 2)); - } - if (keyFrames[i].node->actionFlag == 2) + + if (timer >= _currentFrame->DepartureTime && !_triggeredDepartureEvent) { - // remember first stop frame - if (firstStop == -1) - firstStop = i; - lastStop = i; + DoEventIfAny(*_currentFrame, true); // departure event + _triggeredDepartureEvent = true; } - } - - float tmpDist = 0; - for (size_t i = 0; i < keyFrames.size(); ++i) - { - int j = (i + lastStop) % keyFrames.size(); - if (keyFrames[j].node->actionFlag == 2) - tmpDist = 0; - else - tmpDist += keyFrames[j].distFromPrev; - keyFrames[j].distSinceStop = tmpDist; - } - for (int i = int(keyFrames.size()) - 1; i >= 0; i--) - { - int j = (i + (firstStop+1)) % keyFrames.size(); - tmpDist += keyFrames[(j + 1) % keyFrames.size()].distFromPrev; - keyFrames[j].distUntilStop = tmpDist; - if (keyFrames[j].node->actionFlag == 2) - tmpDist = 0; - } + if (timer >= _currentFrame->DepartureTime && timer < _currentFrame->NextArriveTime) + break; // found current waypoint - for (size_t i = 0; i < keyFrames.size(); ++i) - { - if (keyFrames[i].distSinceStop < (30 * 30 * 0.5f)) - keyFrames[i].tFrom = sqrt(2 * keyFrames[i].distSinceStop); - else - keyFrames[i].tFrom = ((keyFrames[i].distSinceStop - (30 * 30 * 0.5f)) / 30) + 30; + MoveToNextWaypoint(); - if (keyFrames[i].distUntilStop < (30 * 30 * 0.5f)) - keyFrames[i].tTo = sqrt(2 * keyFrames[i].distUntilStop); - else - keyFrames[i].tTo = ((keyFrames[i].distUntilStop - (30 * 30 * 0.5f)) / 30) + 30; + // not waiting anymore + SetMoving(true); - keyFrames[i].tFrom *= 1000; - keyFrames[i].tTo *= 1000; - } - - // for (int i = 0; i < keyFrames.size(); ++i) { - // TC_LOG_INFO(LOG_FILTER_TRANSPORTS, "%f, %f, %f, %f, %f, %f, %f", keyFrames[i].x, keyFrames[i].y, keyFrames[i].distUntilStop, keyFrames[i].distSinceStop, keyFrames[i].distFromPrev, keyFrames[i].tFrom, keyFrames[i].tTo); - // } + // Enable movement + if (GetGOInfo()->moTransport.canBeStopped) + SetGoState(GO_STATE_ACTIVE); - // Now we're completely set up; we can move along the length of each waypoint at 100 ms intervals - // speed = max(30, t) (remember x = 0.5s^2, and when accelerating, a = 1 unit/s^2 - int t = 0; - bool teleport = false; - if (keyFrames[keyFrames.size() - 1].node->mapid != keyFrames[0].node->mapid) - teleport = true; + // Departure event + if (_currentFrame->IsTeleportFrame()) + TeleportTransport(_nextFrame->Node->mapid, _nextFrame->Node->x, _nextFrame->Node->y, _nextFrame->Node->z); - m_WayPoints[0] = WayPoint(keyFrames[0].node->mapid, keyFrames[0].node->x, keyFrames[0].node->y, keyFrames[0].node->z, teleport, 0, - keyFrames[0].node->arrivalEventID, keyFrames[0].node->departureEventID); + sScriptMgr->OnRelocate(this, _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z); - t += keyFrames[0].node->delay * 1000; + TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, "Transport %u (%s) moved to node %u %u %f %f %f", GetEntry(), GetName().c_str(), _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z); + } - uint32 cM = keyFrames[0].node->mapid; - for (size_t i = 0; i < keyFrames.size() - 1; ++i) + // Set position + _positionChangeTimer.Update(diff); + if (_positionChangeTimer.Passed()) { - float d = 0; - float tFrom = keyFrames[i].tFrom; - float tTo = keyFrames[i].tTo; - - // keep the generation of all these points; we use only a few now, but may need the others later - if (((d < keyFrames[i + 1].distFromPrev) && (tTo > 0))) + _positionChangeTimer.Reset(positionUpdateDelay); + if (IsMoving()) { - while ((d < keyFrames[i + 1].distFromPrev) && (tTo > 0)) - { - tFrom += 100; - tTo -= 100; - - if (d > 0) - { - float newX = keyFrames[i].node->x + (keyFrames[i + 1].node->x - keyFrames[i].node->x) * d / keyFrames[i + 1].distFromPrev; - float newY = keyFrames[i].node->y + (keyFrames[i + 1].node->y - keyFrames[i].node->y) * d / keyFrames[i + 1].distFromPrev; - float newZ = keyFrames[i].node->z + (keyFrames[i + 1].node->z - keyFrames[i].node->z) * d / keyFrames[i + 1].distFromPrev; - - teleport = false; - if (keyFrames[i].node->mapid != cM) - { - teleport = true; - cM = keyFrames[i].node->mapid; - } - - // TC_LOG_INFO(LOG_FILTER_TRANSPORTS, "T: %d, D: %f, x: %f, y: %f, z: %f", t, d, newX, newY, newZ); - if (teleport) - m_WayPoints[t] = WayPoint(keyFrames[i].node->mapid, newX, newY, newZ, teleport, 0); - } - - if (tFrom < tTo) // caught in tFrom dock's "gravitational pull" - { - if (tFrom <= 30000) - { - d = 0.5f * (tFrom / 1000) * (tFrom / 1000); - } - else - { - d = 0.5f * 30 * 30 + 30 * ((tFrom - 30000) / 1000); - } - d = d - keyFrames[i].distSinceStop; - } - else - { - if (tTo <= 30000) - { - d = 0.5f * (tTo / 1000) * (tTo / 1000); - } - else - { - d = 0.5f * 30 * 30 + 30 * ((tTo - 30000) / 1000); - } - d = keyFrames[i].distUntilStop - d; - } - t += 100; - } - t -= 100; + float t = CalculateSegmentPos(float(timer) * 0.001f); + G3D::Vector3 pos, dir; + _currentFrame->Spline->evaluate_percent(_currentFrame->Index, t, pos); + _currentFrame->Spline->evaluate_derivative(_currentFrame->Index, t, dir); + UpdatePosition(pos.x, pos.y, pos.z, atan2(dir.x, dir.y)); } - - if (keyFrames[i + 1].tFrom > keyFrames[i + 1].tTo) - t += 100 - ((long)keyFrames[i + 1].tTo % 100); - else - t += (long)keyFrames[i + 1].tTo % 100; - - teleport = false; - if ((keyFrames[i + 1].node->actionFlag == 1) || (keyFrames[i + 1].node->mapid != keyFrames[i].node->mapid)) - { - teleport = true; - cM = keyFrames[i + 1].node->mapid; - } - - m_WayPoints[t] = WayPoint(keyFrames[i + 1].node->mapid, keyFrames[i + 1].node->x, keyFrames[i + 1].node->y, keyFrames[i + 1].node->z, teleport, - 0, keyFrames[i + 1].node->arrivalEventID, keyFrames[i + 1].node->departureEventID); - // TC_LOG_INFO(LOG_FILTER_TRANSPORTS, "T: %d, x: %f, y: %f, z: %f, t:%d", t, pos.x, pos.y, pos.z, teleport); - - t += keyFrames[i + 1].node->delay * 1000; } - uint32 timer = t; - - // TC_LOG_INFO(LOG_FILTER_TRANSPORTS, " Generated %lu waypoints, total time %u.", (unsigned long)m_WayPoints.size(), timer); - - m_curr = m_WayPoints.begin(); - m_next = GetNextWayPoint(); - m_pathTime = timer; + sScriptMgr->OnTransportUpdate(this, diff); +} - m_nextNodeTime = m_curr->first; +void Transport::AddPassenger(WorldObject* passenger) +{ + if (_passengers.insert(passenger).second) + { + TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, "Object %s boarded transport %s.", passenger->GetName().c_str(), GetName().c_str()); - return true; + if (Player* plr = passenger->ToPlayer()) + sScriptMgr->OnAddPassenger(this, plr); + } } -Transport::WayPointMap::const_iterator Transport::GetNextWayPoint() +void Transport::RemovePassenger(WorldObject* passenger) { - WayPointMap::const_iterator iter = m_curr; - ++iter; - if (iter == m_WayPoints.end()) - iter = m_WayPoints.begin(); - return iter; + if (_passengers.erase(passenger) || _staticPassengers.erase(passenger)) // static passenger can remove itself in case of grid unload + { + TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, "Object %s removed from transport %s.", passenger->GetName().c_str(), GetName().c_str()); + + if (Player* plr = passenger->ToPlayer()) + sScriptMgr->OnRemovePassenger(this, plr); + } } -void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z) +Creature* Transport::CreateNPCPassenger(uint32 guid, CreatureData const* data) { - Map const* oldMap = GetMap(); - Relocate(x, y, z); + Map* map = GetMap(); + Creature* creature = new Creature(); - for (PlayerSet::const_iterator itr = m_passengers.begin(); itr != m_passengers.end();) + if (!creature->LoadCreatureFromDB(guid, map, false)) { - Player* player = *itr; - ++itr; - - if (player->isDead() && !player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) - player->ResurrectPlayer(1.0f); - - player->TeleportTo(newMapid, x, y, z, GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT); + delete creature; + return NULL; } - //we need to create and save new Map object with 'newMapid' because if not done -> lead to invalid Map object reference... - //player far teleport would try to create same instance, but we need it NOW for transport... + float x = data->posX; + float y = data->posY; + float z = data->posZ; + float o = data->orientation; + + creature->SetTransport(this); + creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); + creature->m_movementInfo.transport.guid = GetGUID(); + creature->m_movementInfo.transport.pos.Relocate(x, y, z, o); + CalculatePassengerPosition(x, y, z, &o); + creature->Relocate(x, y, z, o); + creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation()); + creature->SetTransportHomePosition(creature->m_movementInfo.transport.pos); - RemoveFromWorld(); - ResetMap(); - Map* newMap = sMapMgr->CreateBaseMap(newMapid); - SetMap(newMap); - ASSERT(GetMap()); - AddToWorld(); + if (!creature->IsPositionValid()) + { + TC_LOG_ERROR(LOG_FILTER_TRANSPORTS, "Creature (guidlow %d, entry %d) not created. Suggested coordinates aren't valid (X: %f Y: %f)",creature->GetGUIDLow(),creature->GetEntry(),creature->GetPositionX(),creature->GetPositionY()); + delete creature; + return NULL; + } - if (oldMap != newMap) + if (!map->AddToMap(creature)) { - UpdateForMap(oldMap); - UpdateForMap(newMap); + delete creature; + return NULL; } - for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr) - (*itr)->FarTeleportTo(newMap, x, y, z, (*itr)->GetOrientation()); + _staticPassengers.insert(creature); + sScriptMgr->OnAddCreaturePassenger(this, creature); + return creature; } -bool Transport::AddPassenger(Player* passenger) +GameObject* Transport::CreateGOPassenger(uint32 guid, GameObjectData const* data) { - if (m_passengers.insert(passenger).second) - TC_LOG_INFO(LOG_FILTER_TRANSPORTS, "Player %s boarded transport %s.", passenger->GetName().c_str(), GetName().c_str()); + Map* map = GetMap(); + GameObject* go = new GameObject(); - sScriptMgr->OnAddPassenger(this, passenger); - return true; -} + if (!go->LoadGameObjectFromDB(guid, map, false)) + { + delete go; + return NULL; + } -bool Transport::RemovePassenger(Player* passenger) -{ - if (m_passengers.erase(passenger)) - TC_LOG_INFO(LOG_FILTER_TRANSPORTS, "Player %s removed from transport %s.", passenger->GetName().c_str(), GetName().c_str()); + float x = data->posX; + float y = data->posY; + float z = data->posZ; + float o = data->orientation; - sScriptMgr->OnRemovePassenger(this, passenger); - return true; -} + go->SetTransport(this); + go->m_movementInfo.transport.guid = GetGUID(); + go->m_movementInfo.transport.pos.Relocate(x, y, z, o); + CalculatePassengerPosition(x, y, z, &o); + go->Relocate(x, y, z, o); -void Transport::Update(uint32 p_diff) -{ - if (!AI()) + if (!go->IsPositionValid()) { - if (!AIM_Initialize()) - TC_LOG_ERROR(LOG_FILTER_TRANSPORTS, "Could not initialize GameObjectAI for Transport"); - } else - AI()->UpdateAI(p_diff); - - if (m_WayPoints.size() <= 1) - return; + TC_LOG_ERROR(LOG_FILTER_TRANSPORTS, "GameObject (guidlow %d, entry %d) not created. Suggested coordinates aren't valid (X: %f Y: %f)", go->GetGUIDLow(), go->GetEntry(), go->GetPositionX(), go->GetPositionY()); + delete go; + return NULL; + } - m_timer = getMSTime() % m_period; - while (((m_timer - m_curr->first) % m_pathTime) > ((m_next->first - m_curr->first) % m_pathTime)) + if (!map->AddToMap(go)) { - DoEventIfAny(*m_curr, true); - - m_curr = GetNextWayPoint(); - m_next = GetNextWayPoint(); - - DoEventIfAny(*m_curr, false); - - // first check help in case client-server transport coordinates de-synchronization - if (m_curr->second.mapid != GetMapId() || m_curr->second.teleport) - { - TeleportTransport(m_curr->second.mapid, m_curr->second.x, m_curr->second.y, m_curr->second.z); - } - else - { - Relocate(m_curr->second.x, m_curr->second.y, m_curr->second.z, GetAngle(m_next->second.x, m_next->second.y) + float(M_PI)); - UpdatePassengerPositions(); // COME BACK MARKER - } + delete go; + return NULL; + } - sScriptMgr->OnRelocate(this, m_curr->first, m_curr->second.mapid, m_curr->second.x, m_curr->second.y, m_curr->second.z); + _staticPassengers.insert(go); + return go; +} - m_nextNodeTime = m_curr->first; +void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const +{ + float inx = x, iny = y, inz = z; + if (o) + *o = Position::NormalizeOrientation(GetOrientation() + *o); - if (m_curr == m_WayPoints.begin()) - TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, " ************ BEGIN ************** %s", m_name.c_str()); + x = GetPositionX() + inx * std::cos(GetOrientation()) - iny * std::sin(GetOrientation()); + y = GetPositionY() + iny * std::cos(GetOrientation()) + inx * std::sin(GetOrientation()); + z = GetPositionZ() + inz; +} - TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, "%s moved to %d %f %f %f %d", m_name.c_str(), m_curr->second.id, m_curr->second.x, m_curr->second.y, m_curr->second.z, m_curr->second.mapid); - } +void Transport::CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const +{ + if (o) + *o = Position::NormalizeOrientation(*o - GetOrientation()); - sScriptMgr->OnTransportUpdate(this, p_diff); + z -= GetPositionZ(); + y -= GetPositionY(); // y = searchedY * std::cos(o) + searchedX * std::sin(o) + x -= GetPositionX(); // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi) + float inx = x, iny = y; + y = (iny - inx * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())); + x = (inx + iny * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())); } -void Transport::UpdateForMap(Map const* targetMap) +void Transport::UpdatePosition(float x, float y, float z, float o) { - Map::PlayerList const& player = targetMap->GetPlayers(); - if (player.isEmpty()) - return; + bool newActive = GetMap()->IsGridLoaded(x, y); + + Relocate(x, y, z, o); + + UpdatePassengerPositions(_passengers); + + /* There are four possible scenarios that trigger loading/unloading passengers: + 1. transport moves from inactive to active grid + 2. the grid that transport is currently in becomes active + 3. transport moves from active to inactive grid + 4. the grid that transport is currently in unloads + */ + if (_staticPassengers.empty() && newActive) // 1. and 2. + LoadStaticPassengers(); + else if (!_staticPassengers.empty() && !newActive && Cell(x, y).DiffGrid(Cell(GetPositionX(), GetPositionY()))) // 3. + UnloadStaticPassengers(); + else + UpdatePassengerPositions(_staticPassengers); + // 4. is handed by grid unload +} - if (GetMapId() == targetMap->GetId()) +void Transport::LoadStaticPassengers() +{ + if (uint32 mapId = GetGOInfo()->moTransport.mapID) { - for (Map::PlayerList::const_iterator itr = player.begin(); itr != player.end(); ++itr) + CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetSpawnMode()); + CellGuidSet::const_iterator guidEnd; + for (CellObjectGuidsMap::const_iterator cellItr = cells.begin(); cellItr != cells.end(); ++cellItr) { - if (this != itr->GetSource()->GetTransport()) - { - UpdateData transData; - BuildCreateUpdateBlockForPlayer(&transData, itr->GetSource()); - WorldPacket packet; - transData.BuildPacket(&packet); - itr->GetSource()->SendDirectMessage(&packet); - } + // Creatures on transport + guidEnd = cellItr->second.creatures.end(); + for (CellGuidSet::const_iterator guidItr = cellItr->second.creatures.begin(); guidItr != guidEnd; ++guidItr) + CreateNPCPassenger(*guidItr, sObjectMgr->GetCreatureData(*guidItr)); + + // GameObjects on transport + guidEnd = cellItr->second.gameobjects.end(); + for (CellGuidSet::const_iterator guidItr = cellItr->second.gameobjects.begin(); guidItr != guidEnd; ++guidItr) + CreateGOPassenger(*guidItr, sObjectMgr->GetGOData(*guidItr)); } } - else - { - UpdateData transData; - BuildOutOfRangeUpdateBlock(&transData); - WorldPacket out_packet; - transData.BuildPacket(&out_packet); - - for (Map::PlayerList::const_iterator itr = player.begin(); itr != player.end(); ++itr) - if (this != itr->GetSource()->GetTransport()) - itr->GetSource()->SendDirectMessage(&out_packet); - } } -void Transport::DoEventIfAny(WayPointMap::value_type const& node, bool departure) +void Transport::UnloadStaticPassengers() { - if (uint32 eventid = departure ? node.second.departureEventID : node.second.arrivalEventID) + while (!_staticPassengers.empty()) { - TC_LOG_DEBUG(LOG_FILTER_MAPSCRIPTS, "Taxi %s event %u of node %u of %s path", departure ? "departure" : "arrival", eventid, node.first, GetName().c_str()); - GetMap()->ScriptsStart(sEventScripts, eventid, this, this); - EventInform(eventid); + WorldObject* obj = *_staticPassengers.begin(); + obj->AddObjectToRemoveList(); // also removes from _staticPassengers } } -void Transport::BuildStartMovePacket(Map const* targetMap) +void Transport::EnableMovement(bool enabled) { - SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - SetGoState(GO_STATE_ACTIVE); - UpdateForMap(targetMap); + if (!GetGOInfo()->moTransport.canBeStopped) + return; + + _pendingStop = !enabled; } -void Transport::BuildStopMovePacket(Map const* targetMap) +void Transport::MoveToNextWaypoint() { - RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - SetGoState(GO_STATE_READY); - UpdateForMap(targetMap); + // Clear events flagging + _triggeredArrivalEvent = false; + _triggeredDepartureEvent = false; + + // Set frames + _currentFrame = _nextFrame++; + if (_nextFrame == GetKeyFrames().end()) + _nextFrame = GetKeyFrames().begin(); } -uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim) +float Transport::CalculateSegmentPos(float now) { - Map* map = GetMap(); - //make it world object so it will not be unloaded with grid - Creature* creature = new Creature(true); - - if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, GetPhaseMask(), entry, 0, GetGOInfo()->faction, 0, 0, 0, 0)) + KeyFrame const& frame = *_currentFrame; + const float speed = float(m_goInfo->moTransport.moveSpeed); + const float accel = float(m_goInfo->moTransport.accelRate); + float timeSinceStop = frame.TimeFrom + (now - (1.0f/IN_MILLISECONDS) * frame.DepartureTime); + float timeUntilStop = frame.TimeTo - (now - (1.0f/IN_MILLISECONDS) * frame.DepartureTime); + float segmentPos, dist; + float accelTime = _transportInfo->accelTime; + float accelDist = _transportInfo->accelDist; + // calculate from nearest stop, less confusing calculation... + if (timeSinceStop < timeUntilStop) { - delete creature; - return 0; + if (timeSinceStop < accelTime) + dist = 0.5f * accel * timeSinceStop * timeSinceStop; + else + dist = accelDist + (timeSinceStop - accelTime) * speed; + segmentPos = dist - frame.DistSinceStop; + } + else + { + if (timeUntilStop < _transportInfo->accelTime) + dist = 0.5f * accel * timeUntilStop * timeUntilStop; + else + dist = accelDist + (timeUntilStop - accelTime) * speed; + segmentPos = frame.DistUntilStop - dist; } - creature->SetTransport(this); - creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); - creature->m_movementInfo.guid = GetGUID(); - creature->m_movementInfo.transport.pos.Relocate(x, y, z, o); + return segmentPos / frame.NextDistFromPrev; +} - if (anim) - creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, anim); +void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z) +{ + Map const* oldMap = GetMap(); - creature->Relocate( - GetPositionX() + (x * std::cos(GetOrientation()) + y * std::sin(GetOrientation() + float(M_PI))), - GetPositionY() + (y * std::cos(GetOrientation()) + x * std::sin(GetOrientation())), - z + GetPositionZ(), - o + GetOrientation()); + if (oldMap->GetId() != newMapid) + { + Map* newMap = sMapMgr->CreateBaseMap(newMapid); + Map::PlayerList const& oldPlayers = GetMap()->GetPlayers(); + if (!oldPlayers.isEmpty()) + { + UpdateData data; + BuildOutOfRangeUpdateBlock(&data); + WorldPacket packet; + data.BuildPacket(&packet); + for (Map::PlayerList::const_iterator itr = oldPlayers.begin(); itr != oldPlayers.end(); ++itr) + if (itr->GetSource()->GetTransport() != this) + itr->GetSource()->SendDirectMessage(&packet); + } - creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation()); - creature->SetTransportHomePosition(creature->m_movementInfo.transport.pos); + UnloadStaticPassengers(); + GetMap()->RemoveFromMap<Transport>(this, false); + SetMap(newMap); - if (!creature->IsPositionValid()) - { - TC_LOG_ERROR(LOG_FILTER_TRANSPORTS, "Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", creature->GetGUIDLow(), creature->GetEntry(), creature->GetPositionX(), creature->GetPositionY()); - delete creature; - return 0; - } + Map::PlayerList const& newPlayers = GetMap()->GetPlayers(); + if (!newPlayers.isEmpty()) + { + for (Map::PlayerList::const_iterator itr = newPlayers.begin(); itr != newPlayers.end(); ++itr) + { + if (itr->GetSource()->GetTransport() != this) + { + UpdateData data; + BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); + WorldPacket packet; + data.BuildPacket(&packet); + itr->GetSource()->SendDirectMessage(&packet); + } + } + } - map->AddToMap(creature); - m_NPCPassengerSet.insert(creature); + for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end();) + { + WorldObject* obj = (*itr++); - if (tguid == 0) - { - ++currenttguid; - tguid = currenttguid; + switch (obj->GetTypeId()) + { + case TYPEID_UNIT: + if (!IS_PLAYER_GUID(obj->ToUnit()->GetOwnerGUID())) // pets should be teleported with player + obj->ToCreature()->FarTeleportTo(newMap, x, y, z, obj->GetOrientation()); + break; + case TYPEID_GAMEOBJECT: + { + GameObject* go = obj->ToGameObject(); + go->GetMap()->RemoveFromMap(go, false); + Relocate(x, y, z, go->GetOrientation()); + SetMap(newMap); + newMap->AddToMap(go); + break; + } + case TYPEID_PLAYER: + if (!obj->ToPlayer()->TeleportTo(newMapid, x, y, z, GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT)) + _passengers.erase(obj); + break; + default: + break; + } + } + + GetMap()->AddToMap<Transport>(this); } else - currenttguid = std::max(tguid, currenttguid); - - creature->SetGUIDTransport(tguid); - sScriptMgr->OnAddCreaturePassenger(this, creature); - return tguid; -} - -void Transport::UpdatePosition(MovementInfo* mi) -{ - float transport_o = mi->pos.GetOrientation() - mi->transport.pos.GetOrientation(); - float transport_x = mi->pos.m_positionX - (mi->transport.pos.m_positionX * std::cos(transport_o) - mi->transport.pos.m_positionY * std::sin(transport_o)); - float transport_y = mi->pos.m_positionY - (mi->transport.pos.m_positionY * std::cos(transport_o) + mi->transport.pos.m_positionX * std::sin(transport_o)); - float transport_z = mi->pos.m_positionZ - mi->transport.pos.m_positionZ; + { + // Teleport players, they need to know it + for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end(); ++itr) + if ((*itr)->GetTypeId() == TYPEID_PLAYER) + (*itr)->ToUnit()->NearTeleportTo(x, y, z, GetOrientation()); + } - Relocate(transport_x, transport_y, transport_z, transport_o); - UpdatePassengerPositions(); + UpdatePosition(x, y, z, GetOrientation()); } -void Transport::UpdatePassengerPositions() +void Transport::UpdatePassengerPositions(std::set<WorldObject*>& passengers) { - for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr) + for (std::set<WorldObject*>::iterator itr = passengers.begin(); itr != passengers.end(); ++itr) { - Creature* npc = *itr; + WorldObject* passenger = *itr; + // transport teleported but passenger not yet (can happen for players) + if (passenger->GetMap() != GetMap()) + continue; + + // if passenger is on vehicle we have to assume the vehicle is also on transport + // and its the vehicle that will be updating its passengers + if (Unit* unit = passenger->ToUnit()) + if (unit->GetVehicle()) + continue; + // Do not use Unit::UpdatePosition here, we don't want to remove auras + // as if regular movement occurred float x, y, z, o; - npc->m_movementInfo.transport.pos.GetPosition(x, y, z, o); + passenger->m_movementInfo.transport.pos.GetPosition(x, y, z, o); CalculatePassengerPosition(x, y, z, &o); - GetMap()->CreatureRelocation(npc, x, y, z, o, false); - npc->GetTransportHomePosition(x, y, z, o); - CalculatePassengerPosition(x, y, z, &o); - npc->SetHomePosition(x, y, z, o); + switch (passenger->GetTypeId()) + { + case TYPEID_UNIT: + { + Creature* creature = passenger->ToCreature(); + GetMap()->CreatureRelocation(creature, x, y, z, o, false); + creature->GetTransportHomePosition(x, y, z, o); + CalculatePassengerPosition(x, y, z, &o); + creature->SetHomePosition(x, y, z, o); + break; + } + case TYPEID_PLAYER: + GetMap()->PlayerRelocation(passenger->ToPlayer(), x, y, z, o); + break; + case TYPEID_GAMEOBJECT: + GetMap()->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false); + break; + default: + break; + } + + if (Unit* unit = passenger->ToUnit()) + if (Vehicle* vehicle = unit->GetVehicleKit()) + vehicle->RelocatePassengers(); } } -void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const +void Transport::DoEventIfAny(KeyFrame const& node, bool departure) { - float inx = x, iny = y, inz = z; - if (o) - *o = Position::NormalizeOrientation(GetOrientation() + *o); - - x = GetPositionX() + inx * std::cos(GetOrientation()) - iny * std::sin(GetOrientation()); - y = GetPositionY() + iny * std::cos(GetOrientation()) + inx * std::sin(GetOrientation()); - z = GetPositionZ() + inz; + if (uint32 eventid = departure ? node.Node->departureEventID : node.Node->arrivalEventID) + { + TC_LOG_DEBUG(LOG_FILTER_MAPSCRIPTS, "Taxi %s event %u of node %u of %s path", departure ? "departure" : "arrival", eventid, node.Node->index, GetName().c_str()); + GetMap()->ScriptsStart(sEventScripts, eventid, this, this); + EventInform(eventid); + } } -void Transport::CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const +void Transport::BuildUpdate(UpdateDataMapType& data_map) { - if (o) - *o = Position::NormalizeOrientation(*o - GetOrientation()); + Map::PlayerList const& players = GetMap()->GetPlayers(); + if (players.isEmpty()) + return; - z -= GetPositionZ(); - y -= GetPositionY(); // y = searchedY * std::cos(o) + searchedX * std::sin(o) - x -= GetPositionX(); // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi) - float inx = x, iny = y; - y = (iny - inx * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())); - x = (inx + iny * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + BuildFieldsUpdate(itr->GetSource(), data_map); + + ClearUpdateMask(true); } diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index 445bec456fd..0d020fe2c34 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -20,34 +20,30 @@ #define TRANSPORTS_H #include "GameObject.h" +#include "TransportMgr.h" #include "VehicleDefines.h" -#include <map> -#include <set> -#include <string> +struct CreatureData; class Transport : public GameObject, public TransportBase { + friend Transport* TransportMgr::CreateTransport(uint32, uint32, Map*); + + Transport(); public: - Transport(uint32 period, uint32 script); ~Transport(); - bool Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags); - bool GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids); - void Update(uint32 p_time); - bool AddPassenger(Player* passenger); - bool RemovePassenger(Player* passenger); + bool Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress); + void Update(uint32 diff); - void RemovePassenger(Creature* passenger) { m_NPCPassengerSet.erase(passenger); } + void BuildUpdate(UpdateDataMapType& data_map); - typedef std::set<Player*> PlayerSet; - PlayerSet const& GetPassengers() const { return m_passengers; } + void AddPassenger(WorldObject* passenger); + void RemovePassenger(WorldObject* passenger); + std::set<WorldObject*> const& GetPassengers() const { return _passengers; } - typedef std::set<Creature*> CreatureSet; - CreatureSet m_NPCPassengerSet; - uint32 AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim=0); - void UpdatePosition(MovementInfo* mi); - void UpdatePassengerPositions(); + Creature* CreateNPCPassenger(uint32 guid, CreatureData const* data); + GameObject* CreateGOPassenger(uint32 guid, GameObjectData const* data); /// This method transforms supplied transport offsets into global coordinates void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const; @@ -55,50 +51,50 @@ class Transport : public GameObject, public TransportBase /// This method transforms supplied global coordinates into local offsets void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const; - void BuildStartMovePacket(Map const* targetMap); - void BuildStopMovePacket(Map const* targetMap); - uint32 GetScriptId() const { return ScriptId; } - private: - struct WayPoint - { - WayPoint() : mapid(0), x(0), y(0), z(0), teleport(false), id(0) {} - WayPoint(uint32 _mapid, float _x, float _y, float _z, bool _teleport, uint32 _id = 0, - uint32 _arrivalEventID = 0, uint32 _departureEventID = 0) - : mapid(_mapid), x(_x), y(_y), z(_z), teleport(_teleport), id(_id), - arrivalEventID(_arrivalEventID), departureEventID(_departureEventID) - { - } - uint32 mapid; - float x; - float y; - float z; - bool teleport; - uint32 id; - uint32 arrivalEventID; - uint32 departureEventID; - }; - - typedef std::map<uint32, WayPoint> WayPointMap; - - WayPointMap::const_iterator m_curr; - WayPointMap::const_iterator m_next; - uint32 m_pathTime; - uint32 m_timer; - - PlayerSet m_passengers; - - uint32 currenttguid; - uint32 m_period; - uint32 ScriptId; - public: - WayPointMap m_WayPoints; - uint32 m_nextNodeTime; + uint32 GetPeriod() const { return GetUInt32Value(GAMEOBJECT_LEVEL); } + void SetPeriod(uint32 period) { SetUInt32Value(GAMEOBJECT_LEVEL, period); } + uint32 GetTimer() const { return GetGOValue()->Transport.PathProgress; } + + KeyFrameVec const& GetKeyFrames() const { return _transportInfo->keyFrames; } + + void UpdatePosition(float x, float y, float z, float o); + + //! Needed when transport moves from inactive to active grid + void LoadStaticPassengers(); + + //! Needed when transport enters inactive grid + void UnloadStaticPassengers(); + + void EnableMovement(bool enabled); + + TransportTemplate const* GetTransportTemplate() const { return _transportInfo; } private: + void MoveToNextWaypoint(); + float CalculateSegmentPos(float perc); void TeleportTransport(uint32 newMapid, float x, float y, float z); - void UpdateForMap(Map const* map); - void DoEventIfAny(WayPointMap::value_type const& node, bool departure); - WayPointMap::const_iterator GetNextWayPoint(); + void UpdatePassengerPositions(std::set<WorldObject*>& passengers); + void DoEventIfAny(KeyFrame const& node, bool departure); + + //! Helpers to know if stop frame was reached + bool IsMoving() const { return _isMoving; } + void SetMoving(bool val) { _isMoving = val; } + + TransportTemplate const* _transportInfo; + + KeyFrameVec::const_iterator _currentFrame; + KeyFrameVec::const_iterator _nextFrame; + uint32 _moveTimer; + TimeTrackerSmall _positionChangeTimer; + bool _isMoving; + bool _pendingStop; + + //! These are needed to properly control events triggering only once for each frame + bool _triggeredArrivalEvent; + bool _triggeredDepartureEvent; + + std::set<WorldObject*> _passengers; + std::set<WorldObject*> _staticPassengers; }; -#endif +#endif diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 985a110ff27..f861d0cba7b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4838,7 +4838,7 @@ void Unit::AddGameObject(GameObject* gameObj) { SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId()); // Need disable spell use for owner - if (createBySpell && createBySpell->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + if (createBySpell && createBySpell->IsCooldownStartedOnEvent()) // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases) ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, NULL, true); } @@ -4869,7 +4869,7 @@ void Unit::RemoveGameObject(GameObject* gameObj, bool del) { SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid); // Need activate spell use for owner - if (createBySpell && createBySpell->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + if (createBySpell && createBySpell->IsCooldownStartedOnEvent()) // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases) ToPlayer()->SendCooldownEvent(createBySpell); } @@ -7575,7 +7575,7 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp CastSpell(this, 28682, true); - return (procEx & PROC_EX_CRITICAL_HIT) ? true : false; + return (procEx & PROC_EX_CRITICAL_HIT); } // Empowered Fire case 31656: @@ -8914,6 +8914,9 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) if (GetTypeId() == TYPEID_PLAYER && IsMounted()) return false; + if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + return false; + // nobody can attack GM in GM-mode if (victim->GetTypeId() == TYPEID_PLAYER) { @@ -9379,7 +9382,7 @@ void Unit::SetMinion(Minion *minion, bool apply) // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL)); - if (spellInfo && (spellInfo->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE)) + if (spellInfo && (spellInfo->IsCooldownStartedOnEvent())) ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, NULL, true); } } @@ -9421,7 +9424,7 @@ void Unit::SetMinion(Minion *minion, bool apply) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL)); // Remove infinity cooldown - if (spellInfo && (spellInfo->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE)) + if (spellInfo && (spellInfo->IsCooldownStartedOnEvent())) ToPlayer()->SendCooldownEvent(spellInfo); } @@ -9582,7 +9585,7 @@ int32 Unit::DealHeal(Unit* victim, uint32 addhealth) gain = victim->ModifyHealth(int32(addhealth)); // Hook for OnHeal Event - sScriptMgr->OnHeal(this, victim, gain); + sScriptMgr->OnHeal(this, victim, (uint32&)gain); Unit* unit = this; @@ -10543,7 +10546,7 @@ bool Unit::isSpellCrit(Unit* victim, SpellInfo const* spellProto, SpellSchoolMas break; } // Exorcism - else if (spellProto->Category == 19) + else if (spellProto->GetCategory() == 19) { if (victim->GetCreatureTypeMask() & CREATURE_TYPEMASK_DEMON_OR_UNDEAD) return true; @@ -13349,7 +13352,7 @@ void Unit::SetPower(Powers power, uint32 val) data.append(GetPackGUID()); data << uint8(power); data << uint32(val); - SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? true : false); + SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER); // group update if (Player* player = ToPlayer()) @@ -13499,9 +13502,12 @@ void Unit::CleanupsBeforeDelete(bool finalCleanup) { CleanupBeforeRemoveFromMap(finalCleanup); - if (Creature* thisCreature = ToCreature()) - if (GetTransport()) - GetTransport()->RemovePassenger(thisCreature); + if (GetTransport()) + { + GetTransport()->RemovePassenger(this); + SetTransport(NULL); + m_movementInfo.transport.Reset(); + } } void Unit::UpdateCharmAI() @@ -13564,9 +13570,7 @@ CharmInfo::CharmInfo(Unit* unit) } } -CharmInfo::~CharmInfo() -{ -} +CharmInfo::~CharmInfo() { } void CharmInfo::RestoreState() { @@ -17329,6 +17333,8 @@ void Unit::SetFacingTo(float ori) { Movement::MoveSplineInit init(this); init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZMinusOffset(), false); + if (HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && GetTransGUID()) + init.DisableTransportPathTransformations(); // It makes no sense to target global orientation init.SetFacing(ori); init.Launch(); } @@ -17340,7 +17346,10 @@ void Unit::SetFacingToObject(WorldObject* object) return; /// @todo figure out under what conditions creature will move towards object instead of facing it where it currently is. - SetFacingTo(GetAngle(object)); + Movement::MoveSplineInit init(this); + init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZMinusOffset()); + init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming + init.Launch(); } bool Unit::SetWalk(bool enable) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 13f8c8e781f..f8d5964beca 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -786,7 +786,7 @@ struct DiminishingReturn { DiminishingReturn(DiminishingGroup group, uint32 t, uint32 count) : DRGroup(group), stack(0), hitTime(t), hitCount(count) - {} + { } DiminishingGroup DRGroup:16; uint16 stack:16; @@ -804,7 +804,7 @@ class DispelInfo { public: explicit DispelInfo(Unit* dispeller, uint32 dispellerSpellId, uint8 chargesRemoved) : - _dispellerUnit(dispeller), _dispellerSpell(dispellerSpellId), _chargesRemoved(chargesRemoved) {} + _dispellerUnit(dispeller), _dispellerSpell(dispellerSpellId), _chargesRemoved(chargesRemoved) { } Unit* GetDispeller() const { return _dispellerUnit; } uint32 GetDispellerSpellId() const { return _dispellerSpell; } @@ -822,7 +822,7 @@ private: struct CleanDamage { CleanDamage(uint32 mitigated, uint32 absorbed, WeaponAttackType _attackType, MeleeHitOutcome _hitOutCome) : - absorbed_damage(absorbed), mitigated_damage(mitigated), attackType(_attackType), hitOutCome(_hitOutCome) {} + absorbed_damage(absorbed), mitigated_damage(mitigated), attackType(_attackType), hitOutCome(_hitOutCome) { } uint32 absorbed_damage; uint32 mitigated_damage; @@ -951,7 +951,7 @@ struct SpellNonMeleeDamage SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask) : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), overkill(0), schoolMask(_schoolMask), absorb(0), resist(0), physicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0) - {} + { } Unit *target; Unit *attacker; @@ -972,7 +972,7 @@ struct SpellNonMeleeDamage struct SpellPeriodicAuraLogInfo { SpellPeriodicAuraLogInfo(AuraEffect const* _auraEff, uint32 _damage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical) - : auraEff(_auraEff), damage(_damage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){} + : auraEff(_auraEff), damage(_damage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){ } AuraEffect const* auraEff; uint32 damage; @@ -1027,7 +1027,7 @@ enum CurrentSpellTypes struct GlobalCooldown { - explicit GlobalCooldown(uint32 _dur = 0, uint32 _time = 0) : duration(_dur), cast_time(_time) {} + explicit GlobalCooldown(uint32 _dur = 0, uint32 _time = 0) : duration(_dur), cast_time(_time) { } uint32 duration; uint32 cast_time; @@ -1038,7 +1038,7 @@ typedef UNORDERED_MAP<uint32 /*category*/, GlobalCooldown> GlobalCooldownList; class GlobalCooldownMgr // Shared by Player and CharmInfo { public: - GlobalCooldownMgr() {} + GlobalCooldownMgr() { } public: bool HasGlobalCooldown(SpellInfo const* spellInfo) const; @@ -1080,7 +1080,7 @@ enum CommandStates struct UnitActionBarEntry { - UnitActionBarEntry() : packedData(uint32(ACT_DISABLED) << 24) {} + UnitActionBarEntry() : packedData(uint32(ACT_DISABLED) << 24) { } uint32 packedData; @@ -2078,12 +2078,6 @@ class Unit : public WorldObject bool IsOnVehicle(const Unit* vehicle) const; Unit* GetVehicleBase() const; Creature* GetVehicleCreatureBase() const; - float GetTransOffsetX() const { return m_movementInfo.transport.pos.GetPositionX(); } - float GetTransOffsetY() const { return m_movementInfo.transport.pos.GetPositionY(); } - float GetTransOffsetZ() const { return m_movementInfo.transport.pos.GetPositionZ(); } - float GetTransOffsetO() const { return m_movementInfo.transport.pos.GetOrientation(); } - uint32 GetTransTime() const { return m_movementInfo.transport.time; } - int8 GetTransSeat() const { return m_movementInfo.transport.seat; } uint64 GetTransGUID() const; /// Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) TransportBase* GetDirectTransport() const; @@ -2261,7 +2255,7 @@ namespace Trinity class PowerPctOrderPred { public: - PowerPctOrderPred(Powers power, bool ascending = true) : m_power(power), m_ascending(ascending) {} + PowerPctOrderPred(Powers power, bool ascending = true) : m_power(power), m_ascending(ascending) { } bool operator() (const Unit* a, const Unit* b) const { float rA = a->GetMaxPower(m_power) ? float(a->GetPower(m_power)) / float(a->GetMaxPower(m_power)) : 0.0f; @@ -2277,7 +2271,7 @@ namespace Trinity class HealthPctOrderPred { public: - HealthPctOrderPred(bool ascending = true) : m_ascending(ascending) {} + HealthPctOrderPred(bool ascending = true) : m_ascending(ascending) { } bool operator() (const Unit* a, const Unit* b) const { float rA = a->GetMaxHealth() ? float(a->GetHealth()) / float(a->GetMaxHealth()) : 0.0f; diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 9fb1b6614b5..f71ccded926 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -114,7 +114,7 @@ class VehicleJoinEvent : public BasicEvent { friend class Vehicle; protected: - VehicleJoinEvent(Vehicle* v, Unit* u) : Target(v), Passenger(u), Seat(Target->Seats.end()) {} + VehicleJoinEvent(Vehicle* v, Unit* u) : Target(v), Passenger(u), Seat(Target->Seats.end()) { } ~VehicleJoinEvent(); bool Execute(uint64, uint32); void Abort(uint64); diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index ce922b550c1..1c3a57593c3 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -81,7 +81,7 @@ struct VehicleSeat struct VehicleAccessory { VehicleAccessory(uint32 entry, int8 seatId, bool isMinion, uint8 summonType, uint32 summonTime) : - AccessoryEntry(entry), IsMinion(isMinion), SummonTime(summonTime), SeatId(seatId), SummonedType(summonType) {} + AccessoryEntry(entry), IsMinion(isMinion), SummonTime(summonTime), SeatId(seatId), SummonedType(summonType) { } uint32 AccessoryEntry; uint32 IsMinion; uint32 SummonTime; diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 0d59b7fa2f4..892a23687de 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -1493,9 +1493,7 @@ void GameEventMgr::UpdateWorldStates(uint16 event_id, bool Activate) } } -GameEventMgr::GameEventMgr() : isSystemInit(false) -{ -} +GameEventMgr::GameEventMgr() : isSystemInit(false) { } void GameEventMgr::HandleQuestComplete(uint32 quest_id) { diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h index ad4ddeeba88..d25da0db89d 100644 --- a/src/server/game/Events/GameEventMgr.h +++ b/src/server/game/Events/GameEventMgr.h @@ -55,7 +55,7 @@ typedef std::map<uint32 /*condition id*/, GameEventFinishCondition> GameEventCon struct GameEventData { - GameEventData() : start(1), end(0), nextstart(0), occurence(0), length(0), holiday_id(HOLIDAY_NONE), state(GAMEEVENT_NORMAL) {} + GameEventData() : start(1), end(0), nextstart(0), occurence(0), length(0), holiday_id(HOLIDAY_NONE), state(GAMEEVENT_NORMAL) { } time_t start; // occurs after this time time_t end; // occurs before this time time_t nextstart; // after this time the follow-up events count this phase completed @@ -98,7 +98,7 @@ class GameEventMgr private: GameEventMgr(); - ~GameEventMgr() {}; + ~GameEventMgr() { }; public: typedef std::set<uint16> ActiveEvents; diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index afc27b74ecc..77d455d72a7 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -39,13 +39,9 @@ #include <cmath> -ObjectAccessor::ObjectAccessor() -{ -} +ObjectAccessor::ObjectAccessor() { } -ObjectAccessor::~ObjectAccessor() -{ -} +ObjectAccessor::~ObjectAccessor() { } template<class T> T* ObjectAccessor::GetObjectInWorld(uint32 mapid, float x, float y, uint64 guid, T* /*fake*/) { @@ -147,6 +143,15 @@ GameObject* ObjectAccessor::GetGameObject(WorldObject const& u, uint64 guid) return GetObjectInMap(guid, u.GetMap(), (GameObject*)NULL); } +Transport* ObjectAccessor::GetTransport(WorldObject const& u, uint64 guid) +{ + if (GUID_HIPART(guid) != HIGHGUID_MO_TRANSPORT) + return NULL; + + GameObject* go = GetGameObject(u, guid); + return go ? go->ToTransport() : NULL; +} + DynamicObject* ObjectAccessor::GetDynamicObject(WorldObject const& u, uint64 guid) { return GetObjectInMap(guid, u.GetMap(), (DynamicObject*)NULL); diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 1abe3550729..4e5c12104ed 100644 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -40,6 +40,7 @@ class WorldObject; class Vehicle; class Map; class WorldRunnable; +class Transport; template <class T> class HashMapHolder @@ -74,7 +75,7 @@ class HashMapHolder private: //Non instanceable only static - HashMapHolder() {} + HashMapHolder() { } static LockType i_lock; static MapType m_objectMap; @@ -145,6 +146,7 @@ class ObjectAccessor static Object* GetObjectByTypeMask(WorldObject const&, uint64, uint32 typemask); static Corpse* GetCorpse(WorldObject const& u, uint64 guid); static GameObject* GetGameObject(WorldObject const& u, uint64 guid); + static Transport* GetTransport(WorldObject const& u, uint64 guid); static DynamicObject* GetDynamicObject(WorldObject const& u, uint64 guid); static Unit* GetUnit(WorldObject const&, uint64 guid); static Creature* GetCreature(WorldObject const& u, uint64 guid); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 2f309c07cce..d515a9c20e9 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -804,6 +804,18 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) if ((cInfo->npcflag & UNIT_NPC_FLAG_TRAINER) && cInfo->trainer_type >= MAX_TRAINER_TYPE) TC_LOG_ERROR(LOG_FILTER_SQL, "Creature (Entry: %u) has wrong trainer type %u.", cInfo->Entry, cInfo->trainer_type); + if (cInfo->speed_walk == 0.0f) + { + TC_LOG_ERROR(LOG_FILTER_SQL, "Creature (Entry: %u) has wrong value (%f) in speed_walk, set to 1.", cInfo->Entry, cInfo->speed_walk); + const_cast<CreatureTemplate*>(cInfo)->speed_walk = 1.0f; + } + + if (cInfo->speed_run == 0.0f) + { + TC_LOG_ERROR(LOG_FILTER_SQL, "Creature (Entry: %u) has wrong value (%f) in speed_run, set to 1.14286.", cInfo->Entry, cInfo->speed_run); + const_cast<CreatureTemplate*>(cInfo)->speed_run = 1.14286f; + } + if (cInfo->type && !sCreatureTypeStore.LookupEntry(cInfo->type)) { TC_LOG_ERROR(LOG_FILTER_SQL, "Creature (Entry: %u) has invalid creature type (%u) in `type`.", cInfo->Entry, cInfo->type); @@ -7796,6 +7808,25 @@ GameTele const* ObjectMgr::GetGameTele(const std::string& name) const return alt; } +GameTele const* ObjectMgr::GetGameTeleExactName(const std::string& name) const +{ + // explicit name case + std::wstring wname; + if (!Utf8toWStr(name, wname)) + return NULL; + + // converting string that we try to find to lower case + wstrToLower(wname); + + for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr) + { + if (itr->second.wnameLow == wname) + return &itr->second; + } + + return NULL; +} + bool ObjectMgr::AddGameTele(GameTele& tele) { // find max id diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index e44333c4a7a..6ec41042653 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -467,8 +467,8 @@ struct PetLevelInfo struct MailLevelReward { - MailLevelReward() : raceMask(0), mailTemplateId(0), senderEntry(0) {} - MailLevelReward(uint32 _raceMask, uint32 _mailTemplateId, uint32 _senderEntry) : raceMask(_raceMask), mailTemplateId(_mailTemplateId), senderEntry(_senderEntry) {} + MailLevelReward() : raceMask(0), mailTemplateId(0), senderEntry(0) { } + MailLevelReward(uint32 _raceMask, uint32 _mailTemplateId, uint32 _senderEntry) : raceMask(_raceMask), mailTemplateId(_mailTemplateId), senderEntry(_senderEntry) { } uint32 raceMask; uint32 mailTemplateId; @@ -556,8 +556,8 @@ struct QuestPOIPoint int32 x; int32 y; - QuestPOIPoint() : x(0), y(0) {} - QuestPOIPoint(int32 _x, int32 _y) : x(_x), y(_y) {} + QuestPOIPoint() : x(0), y(0) { } + QuestPOIPoint(int32 _x, int32 _y) : x(_x), y(_y) { } }; struct QuestPOI @@ -571,8 +571,8 @@ struct QuestPOI uint32 Unk4; std::vector<QuestPOIPoint> points; - QuestPOI() : Id(0), ObjectiveIndex(0), MapId(0), AreaId(0), Unk2(0), Unk3(0), Unk4(0) {} - QuestPOI(uint32 id, int32 objIndex, uint32 mapId, uint32 areaId, uint32 unk2, uint32 unk3, uint32 unk4) : Id(id), ObjectiveIndex(objIndex), MapId(mapId), AreaId(areaId), Unk2(unk2), Unk3(unk3), Unk4(unk4) {} + QuestPOI() : Id(0), ObjectiveIndex(0), MapId(0), AreaId(0), Unk2(0), Unk3(0), Unk4(0) { } + QuestPOI(uint32 id, int32 objIndex, uint32 mapId, uint32 areaId, uint32 unk2, uint32 unk3, uint32 unk4) : Id(id), ObjectiveIndex(objIndex), MapId(mapId), AreaId(areaId), Unk2(unk2), Unk3(unk3), Unk4(unk4) { } }; typedef std::vector<QuestPOI> QuestPOIVector; @@ -1019,6 +1019,11 @@ class ObjectMgr return _mapObjectGuidsStore[MAKE_PAIR32(mapid, spawnMode)][cell_id]; } + CellObjectGuidsMap const& GetMapObjectGuids(uint16 mapid, uint8 spawnMode) + { + return _mapObjectGuidsStore[MAKE_PAIR32(mapid, spawnMode)]; + } + /** * Gets temp summon data for all creatures of specified group. * @@ -1156,6 +1161,7 @@ class ObjectMgr return &itr->second; } GameTele const* GetGameTele(std::string const& name) const; + GameTele const* GetGameTeleExactName(std::string const& name) const; GameTeleContainer const& GetGameTeleMap() const { return _gameTeleStore; } bool AddGameTele(GameTele& data); bool DeleteGameTele(std::string const& name); diff --git a/src/server/game/Grids/Cells/Cell.h b/src/server/game/Grids/Cells/Cell.h index 33a26c62ce0..ecfdfd6ce05 100644 --- a/src/server/game/Grids/Cells/Cell.h +++ b/src/server/game/Grids/Cells/Cell.h @@ -31,8 +31,8 @@ class WorldObject; struct CellArea { - CellArea() {} - CellArea(CellCoord low, CellCoord high) : low_bound(low), high_bound(high) {} + CellArea() { } + CellArea(CellCoord low, CellCoord high) : low_bound(low), high_bound(high) { } bool operator!() const { return low_bound == high_bound; } diff --git a/src/server/game/Grids/Grid.h b/src/server/game/Grids/Grid.h index 0a5e84b8ded..57f79538e2b 100644 --- a/src/server/game/Grids/Grid.h +++ b/src/server/game/Grids/Grid.h @@ -52,7 +52,7 @@ class Grid /** destructor to clean up its resources. This includes unloading the grid if it has not been unload. */ - ~Grid() {} + ~Grid() { } /** an object of interested enters the grid */ diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h index 9250c784dd9..7ddb4647afe 100644 --- a/src/server/game/Grids/GridDefines.h +++ b/src/server/game/Grids/GridDefines.h @@ -86,11 +86,11 @@ struct CoordPair { CoordPair(uint32 x=0, uint32 y=0) : x_coord(x), y_coord(y) - {} + { } CoordPair(const CoordPair<LIMIT> &obj) : x_coord(obj.x_coord), y_coord(obj.y_coord) - {} + { } CoordPair<LIMIT> & operator=(const CoordPair<LIMIT> &obj) { diff --git a/src/server/game/Grids/GridReference.h b/src/server/game/Grids/GridReference.h index 3d662684060..18403e27a45 100644 --- a/src/server/game/Grids/GridReference.h +++ b/src/server/game/Grids/GridReference.h @@ -45,7 +45,7 @@ class GridReference : public Reference<GridRefManager<OBJECT>, OBJECT> this->getTarget()->decSize(); } public: - GridReference() : Reference<GridRefManager<OBJECT>, OBJECT>() {} + GridReference() : Reference<GridRefManager<OBJECT>, OBJECT>() { } ~GridReference() { this->unlink(); } GridReference* next() { return (GridReference*)Reference<GridRefManager<OBJECT>, OBJECT>::next(); } }; diff --git a/src/server/game/Grids/GridStates.h b/src/server/game/Grids/GridStates.h index 09682c716a9..38728d11757 100644 --- a/src/server/game/Grids/GridStates.h +++ b/src/server/game/Grids/GridStates.h @@ -34,7 +34,7 @@ class GridState void setMagic() { i_Magic = MAGIC_TESTVAL; } unsigned int i_Magic; #endif - virtual ~GridState() {}; + virtual ~GridState() { }; virtual void Update(Map &, NGridType&, GridInfo &, uint32 t_diff) const = 0; }; diff --git a/src/server/game/Grids/NGrid.h b/src/server/game/Grids/NGrid.h index 65cdd3a6033..2e244ecbc62 100644 --- a/src/server/game/Grids/NGrid.h +++ b/src/server/game/Grids/NGrid.h @@ -34,10 +34,10 @@ class GridInfo public: GridInfo() : i_timer(0), vis_Update(0, irand(0, DEFAULT_VISIBILITY_NOTIFY_PERIOD)), - i_unloadActiveLockCount(0), i_unloadExplicitLock(false), i_unloadReferenceLock(false) {} + i_unloadActiveLockCount(0), i_unloadExplicitLock(false), i_unloadReferenceLock(false) { } GridInfo(time_t expiry, bool unload = true ) : i_timer(expiry), vis_Update(0, irand(0, DEFAULT_VISIBILITY_NOTIFY_PERIOD)), - i_unloadActiveLockCount(0), i_unloadExplicitLock(!unload), i_unloadReferenceLock(false) {} + i_unloadActiveLockCount(0), i_unloadExplicitLock(!unload), i_unloadReferenceLock(false) { } const TimeTracker& getTimeTracker() const { return i_timer; } bool getUnloadLock() const { return i_unloadActiveLockCount || i_unloadExplicitLock || i_unloadReferenceLock; } void setUnloadExplicitLock(bool on) { i_unloadExplicitLock = on; } diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index b8ab75f213b..00b1e82a0ea 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -35,16 +35,28 @@ void VisibleNotifier::SendToSelf() // at this moment i_clientGUIDs have guids that not iterate at grid level checks // but exist one case when this possible and object not out of range: transports if (Transport* transport = i_player.GetTransport()) - for (Transport::PlayerSet::const_iterator itr = transport->GetPassengers().begin();itr != transport->GetPassengers().end();++itr) + for (std::set<WorldObject*>::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end();++itr) { if (vis_guids.find((*itr)->GetGUID()) != vis_guids.end()) { vis_guids.erase((*itr)->GetGUID()); - i_player.UpdateVisibilityOf((*itr), i_data, i_visibleNow); - - if (!(*itr)->isNeedNotify(NOTIFY_VISIBILITY_CHANGED)) - (*itr)->UpdateVisibilityOf(&i_player); + switch ((*itr)->GetTypeId()) + { + case TYPEID_GAMEOBJECT: + i_player.UpdateVisibilityOf((*itr)->ToGameObject(), i_data, i_visibleNow); + break; + case TYPEID_PLAYER: + i_player.UpdateVisibilityOf((*itr)->ToPlayer(), i_data, i_visibleNow); + if (!(*itr)->isNeedNotify(NOTIFY_VISIBILITY_CHANGED)) + (*itr)->ToPlayer()->UpdateVisibilityOf(&i_player); + break; + case TYPEID_UNIT: + i_player.UpdateVisibilityOf((*itr)->ToCreature(), i_data, i_visibleNow); + break; + default: + break; + } } } @@ -324,10 +336,8 @@ template<class T> void ObjectUpdater::Visit(GridRefManager<T> &m) { for (typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter) - { if (iter->GetSource()->IsInWorld()) iter->GetSource()->Update(i_timeDiff); - } } bool AnyDeadUnitObjectInRangeCheck::operator()(Player* u) @@ -360,5 +370,6 @@ bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Creature* u) return AnyDeadUnitObjectInRangeCheck::operator()(u) && i_check(u); } -template void ObjectUpdater::Visit<GameObject>(GameObjectMapType &); -template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType &); +template void ObjectUpdater::Visit<Creature>(CreatureMapType&); +template void ObjectUpdater::Visit<GameObject>(GameObjectMapType&); +template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType&); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index d0df63155b2..7bf50b60c1c 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -45,7 +45,7 @@ namespace Trinity std::set<Unit*> i_visibleNow; Player::ClientGUIDs vis_guids; - VisibleNotifier(Player &player) : i_player(player), vis_guids(player.m_clientGUIDs) {} + VisibleNotifier(Player &player) : i_player(player), vis_guids(player.m_clientGUIDs) { } template<class T> void Visit(GridRefManager<T> &m); void SendToSelf(void); }; @@ -54,8 +54,8 @@ namespace Trinity { WorldObject &i_object; - explicit VisibleChangesNotifier(WorldObject &object) : i_object(object) {} - template<class T> void Visit(GridRefManager<T> &) {} + explicit VisibleChangesNotifier(WorldObject &object) : i_object(object) { } + template<class T> void Visit(GridRefManager<T> &) { } void Visit(PlayerMapType &); void Visit(CreatureMapType &); void Visit(DynamicObjectMapType &); @@ -63,7 +63,7 @@ namespace Trinity struct PlayerRelocationNotifier : public VisibleNotifier { - PlayerRelocationNotifier(Player &player) : VisibleNotifier(player) {} + PlayerRelocationNotifier(Player &player) : VisibleNotifier(player) { } template<class T> void Visit(GridRefManager<T> &m) { VisibleNotifier::Visit(m); } void Visit(CreatureMapType &); @@ -73,8 +73,8 @@ namespace Trinity struct CreatureRelocationNotifier { Creature &i_creature; - CreatureRelocationNotifier(Creature &c) : i_creature(c) {} - template<class T> void Visit(GridRefManager<T> &) {} + CreatureRelocationNotifier(Creature &c) : i_creature(c) { } + template<class T> void Visit(GridRefManager<T> &) { } void Visit(CreatureMapType &); void Visit(PlayerMapType &); }; @@ -86,8 +86,8 @@ namespace Trinity CellCoord &p; const float i_radius; DelayedUnitRelocation(Cell &c, CellCoord &pair, Map &map, float radius) : - i_map(map), cell(c), p(pair), i_radius(radius) {} - template<class T> void Visit(GridRefManager<T> &) {} + i_map(map), cell(c), p(pair), i_radius(radius) { } + template<class T> void Visit(GridRefManager<T> &) { } void Visit(CreatureMapType &); void Visit(PlayerMapType &); }; @@ -96,8 +96,8 @@ namespace Trinity { Unit &i_unit; bool isCreature; - explicit AIRelocationNotifier(Unit &unit) : i_unit(unit), isCreature(unit.GetTypeId() == TYPEID_UNIT) {} - template<class T> void Visit(GridRefManager<T> &) {} + explicit AIRelocationNotifier(Unit &unit) : i_unit(unit), isCreature(unit.GetTypeId() == TYPEID_UNIT) { } + template<class T> void Visit(GridRefManager<T> &) { } void Visit(CreatureMapType &); }; @@ -105,7 +105,7 @@ namespace Trinity { GridType &i_grid; uint32 i_timeDiff; - GridUpdater(GridType &grid, uint32 diff) : i_grid(grid), i_timeDiff(diff) {} + GridUpdater(GridType &grid, uint32 diff) : i_grid(grid), i_timeDiff(diff) { } template<class T> void updateObjects(GridRefManager<T> &m) { @@ -141,7 +141,7 @@ namespace Trinity void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); void Visit(DynamicObjectMapType &m); - template<class SKIP> void Visit(GridRefManager<SKIP> &) {} + template<class SKIP> void Visit(GridRefManager<SKIP> &) { } void SendPacket(Player* player) { @@ -160,10 +160,10 @@ namespace Trinity struct ObjectUpdater { uint32 i_timeDiff; - explicit ObjectUpdater(const uint32 diff) : i_timeDiff(diff) {} + explicit ObjectUpdater(const uint32 diff) : i_timeDiff(diff) { } template<class T> void Visit(GridRefManager<T> &m); - void Visit(PlayerMapType &) {} - void Visit(CorpseMapType &) {} + void Visit(PlayerMapType &) { } + void Visit(CorpseMapType &) { } void Visit(CreatureMapType &); }; @@ -180,7 +180,7 @@ namespace Trinity Check &i_check; WorldObjectSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(GameObjectMapType &m); void Visit(PlayerMapType &m); @@ -188,7 +188,7 @@ namespace Trinity void Visit(CorpseMapType &m); void Visit(DynamicObjectMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Check> @@ -200,7 +200,7 @@ namespace Trinity Check &i_check; WorldObjectLastSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(GameObjectMapType &m); void Visit(PlayerMapType &m); @@ -208,7 +208,7 @@ namespace Trinity void Visit(CorpseMapType &m); void Visit(DynamicObjectMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Check> @@ -220,7 +220,7 @@ namespace Trinity Check& i_check; WorldObjectListSearcher(WorldObject const* searcher, std::list<WorldObject*> &objects, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {} + : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); @@ -228,7 +228,7 @@ namespace Trinity void Visit(GameObjectMapType &m); void Visit(DynamicObjectMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Do> @@ -239,7 +239,7 @@ namespace Trinity Do const& i_do; WorldObjectWorker(WorldObject const* searcher, Do const& _do, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {} + : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_do(_do) { } void Visit(GameObjectMapType &m) { @@ -285,7 +285,7 @@ namespace Trinity i_do(itr->GetSource()); } - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // Gameobject searchers @@ -298,11 +298,11 @@ namespace Trinity Check &i_check; GameObjectSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(GameObjectMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // Last accepted by Check GO if any (Check can change requirements at each call) @@ -314,11 +314,11 @@ namespace Trinity Check& i_check; GameObjectLastSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(GameObjectMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Check> @@ -329,18 +329,18 @@ namespace Trinity Check& i_check; GameObjectListSearcher(WorldObject const* searcher, std::list<GameObject*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } void Visit(GameObjectMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Functor> struct GameObjectWorker { GameObjectWorker(WorldObject const* searcher, Functor& func) - : _func(func), _phaseMask(searcher->GetPhaseMask()) {} + : _func(func), _phaseMask(searcher->GetPhaseMask()) { } void Visit(GameObjectMapType& m) { @@ -349,7 +349,7 @@ namespace Trinity _func(itr->GetSource()); } - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } private: Functor& _func; @@ -367,12 +367,12 @@ namespace Trinity Check & i_check; UnitSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(CreatureMapType &m); void Visit(PlayerMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // Last accepted by Check Unit if any (Check can change requirements at each call) @@ -384,12 +384,12 @@ namespace Trinity Check & i_check; UnitLastSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(CreatureMapType &m); void Visit(PlayerMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // All accepted by Check units if any @@ -401,12 +401,12 @@ namespace Trinity Check& i_check; UnitListSearcher(WorldObject const* searcher, std::list<Unit*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // Creature searchers @@ -419,11 +419,11 @@ namespace Trinity Check & i_check; CreatureSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(CreatureMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // Last accepted by Check Creature if any (Check can change requirements at each call) @@ -435,11 +435,11 @@ namespace Trinity Check & i_check; CreatureLastSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(CreatureMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Check> @@ -450,11 +450,11 @@ namespace Trinity Check& i_check; CreatureListSearcher(WorldObject const* searcher, std::list<Creature*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } void Visit(CreatureMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Do> @@ -464,7 +464,7 @@ namespace Trinity Do& i_do; CreatureWorker(WorldObject const* searcher, Do& _do) - : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {} + : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) { } void Visit(CreatureMapType &m) { @@ -473,7 +473,7 @@ namespace Trinity i_do(itr->GetSource()); } - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // Player searchers @@ -486,11 +486,11 @@ namespace Trinity Check & i_check; PlayerSearcher(WorldObject const* searcher, Player* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } void Visit(PlayerMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Check> @@ -501,11 +501,11 @@ namespace Trinity Check& i_check; PlayerListSearcher(WorldObject const* searcher, std::list<Player*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {} + : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } void Visit(PlayerMapType &m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Check> @@ -521,7 +521,7 @@ namespace Trinity void Visit(PlayerMapType& m); - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Do> @@ -531,7 +531,7 @@ namespace Trinity Do& i_do; PlayerWorker(WorldObject const* searcher, Do& _do) - : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {} + : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) { } void Visit(PlayerMapType &m) { @@ -540,7 +540,7 @@ namespace Trinity i_do(itr->GetSource()); } - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; template<class Do> @@ -551,7 +551,7 @@ namespace Trinity Do& i_do; PlayerDistWorker(WorldObject const* searcher, float _dist, Do& _do) - : i_searcher(searcher), i_dist(_dist), i_do(_do) {} + : i_searcher(searcher), i_dist(_dist), i_do(_do) { } void Visit(PlayerMapType &m) { @@ -560,7 +560,7 @@ namespace Trinity i_do(itr->GetSource()); } - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; // CHECKS && DO classes @@ -570,7 +570,7 @@ namespace Trinity class AnyDeadUnitObjectInRangeCheck { public: - AnyDeadUnitObjectInRangeCheck(Unit* searchObj, float range) : i_searchObj(searchObj), i_range(range) {} + AnyDeadUnitObjectInRangeCheck(Unit* searchObj, float range) : i_searchObj(searchObj), i_range(range) { } bool operator()(Player* u); bool operator()(Corpse* u); bool operator()(Creature* u); @@ -585,7 +585,7 @@ namespace Trinity public: AnyDeadUnitSpellTargetInRangeCheck(Unit* searchObj, float range, SpellInfo const* spellInfo, SpellTargetCheckTypes check) : AnyDeadUnitObjectInRangeCheck(searchObj, range), i_spellInfo(spellInfo), i_check(searchObj, searchObj, spellInfo, check, NULL) - {} + { } bool operator()(Player* u); bool operator()(Corpse* u); bool operator()(Creature* u); @@ -600,11 +600,11 @@ namespace Trinity class RespawnDo { public: - RespawnDo() {} + RespawnDo() { } void operator()(Creature* u) const { u->Respawn(); } void operator()(GameObject* u) const { u->Respawn(); } - void operator()(WorldObject*) const {} - void operator()(Corpse*) const {} + void operator()(WorldObject*) const { } + void operator()(Corpse*) const { } }; // GameObject checks @@ -612,7 +612,7 @@ namespace Trinity class GameObjectFocusCheck { public: - GameObjectFocusCheck(Unit const* unit, uint32 focusId) : i_unit(unit), i_focusId(focusId) {} + GameObjectFocusCheck(Unit const* unit, uint32 focusId) : i_unit(unit), i_focusId(focusId) { } bool operator()(GameObject* go) const { if (go->GetGOInfo()->type != GAMEOBJECT_TYPE_SPELL_FOCUS) @@ -634,7 +634,7 @@ namespace Trinity class NearestGameObjectFishingHole { public: - NearestGameObjectFishingHole(WorldObject const& obj, float range) : i_obj(obj), i_range(range) {} + NearestGameObjectFishingHole(WorldObject const& obj, float range) : i_obj(obj), i_range(range) { } bool operator()(GameObject* go) { if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_FISHINGHOLE && go->isSpawned() && i_obj.IsWithinDistInMap(go, i_range) && i_obj.IsWithinDistInMap(go, (float)go->GetGOInfo()->fishinghole.radius)) @@ -656,7 +656,7 @@ namespace Trinity class NearestGameObjectCheck { public: - NearestGameObjectCheck(WorldObject const& obj) : i_obj(obj), i_range(999) {} + NearestGameObjectCheck(WorldObject const& obj) : i_obj(obj), i_range(999) { } bool operator()(GameObject* go) { if (i_obj.IsWithinDistInMap(go, i_range)) @@ -679,7 +679,7 @@ namespace Trinity class NearestGameObjectEntryInObjectRangeCheck { public: - NearestGameObjectEntryInObjectRangeCheck(WorldObject const& obj, uint32 entry, float range) : i_obj(obj), i_entry(entry), i_range(range) {} + NearestGameObjectEntryInObjectRangeCheck(WorldObject const& obj, uint32 entry, float range) : i_obj(obj), i_entry(entry), i_range(range) { } bool operator()(GameObject* go) { if (go->GetEntry() == i_entry && i_obj.IsWithinDistInMap(go, i_range)) @@ -703,7 +703,7 @@ namespace Trinity class NearestGameObjectTypeInObjectRangeCheck { public: - NearestGameObjectTypeInObjectRangeCheck(WorldObject const& obj, GameobjectTypes type, float range) : i_obj(obj), i_type(type), i_range(range) {} + NearestGameObjectTypeInObjectRangeCheck(WorldObject const& obj, GameobjectTypes type, float range) : i_obj(obj), i_type(type), i_range(range) { } bool operator()(GameObject* go) { if (go->GetGoType() == i_type && i_obj.IsWithinDistInMap(go, i_range)) @@ -726,7 +726,7 @@ namespace Trinity class GameObjectWithDbGUIDCheck { public: - GameObjectWithDbGUIDCheck(WorldObject const& /*obj*/, uint32 db_guid) : i_db_guid(db_guid) {} + GameObjectWithDbGUIDCheck(WorldObject const& /*obj*/, uint32 db_guid) : i_db_guid(db_guid) { } bool operator()(GameObject const* go) const { return go->GetDBTableGUIDLow() == i_db_guid; @@ -740,7 +740,7 @@ namespace Trinity class MostHPMissingInRange { public: - MostHPMissingInRange(Unit const* obj, float range, uint32 hp) : i_obj(obj), i_range(range), i_hp(hp) {} + MostHPMissingInRange(Unit const* obj, float range, uint32 hp) : i_obj(obj), i_range(range), i_hp(hp) { } bool operator()(Unit* u) { if (u->IsAlive() && u->IsInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->GetMaxHealth() - u->GetHealth() > i_hp) @@ -759,7 +759,7 @@ namespace Trinity class FriendlyCCedInRange { public: - FriendlyCCedInRange(Unit const* obj, float range) : i_obj(obj), i_range(range) {} + FriendlyCCedInRange(Unit const* obj, float range) : i_obj(obj), i_range(range) { } bool operator()(Unit* u) { if (u->IsAlive() && u->IsInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && @@ -777,7 +777,7 @@ namespace Trinity class FriendlyMissingBuffInRange { public: - FriendlyMissingBuffInRange(Unit const* obj, float range, uint32 spellid) : i_obj(obj), i_range(range), i_spell(spellid) {} + FriendlyMissingBuffInRange(Unit const* obj, float range, uint32 spellid) : i_obj(obj), i_range(range), i_spell(spellid) { } bool operator()(Unit* u) { if (u->IsAlive() && u->IsInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && @@ -796,7 +796,7 @@ namespace Trinity class AnyUnfriendlyUnitInObjectRangeCheck { public: - AnyUnfriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {} + AnyUnfriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) { } bool operator()(Unit* u) { if (u->IsAlive() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u)) @@ -813,7 +813,7 @@ namespace Trinity class AnyUnfriendlyNoTotemUnitInObjectRangeCheck { public: - AnyUnfriendlyNoTotemUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {} + AnyUnfriendlyNoTotemUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) { } bool operator()(Unit* u) { if (!u->IsAlive()) @@ -840,7 +840,7 @@ namespace Trinity { public: AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck(Unit const* funit, float range) - : i_funit(funit), i_range(range) {} + : i_funit(funit), i_range(range) { } bool operator()(const Unit* u) { @@ -859,7 +859,7 @@ namespace Trinity class CreatureWithDbGUIDCheck { public: - CreatureWithDbGUIDCheck(WorldObject const* /*obj*/, uint32 lowguid) : i_lowguid(lowguid) {} + CreatureWithDbGUIDCheck(WorldObject const* /*obj*/, uint32 lowguid) : i_lowguid(lowguid) { } bool operator()(Creature* u) { return u->GetDBTableGUIDLow() == i_lowguid; @@ -871,7 +871,7 @@ namespace Trinity class AnyFriendlyUnitInObjectRangeCheck { public: - AnyFriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool playerOnly = false) : i_obj(obj), i_funit(funit), i_range(range), i_playerOnly(playerOnly) {} + AnyFriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool playerOnly = false) : i_obj(obj), i_funit(funit), i_range(range), i_playerOnly(playerOnly) { } bool operator()(Unit* u) { if (u->IsAlive() && i_obj->IsWithinDistInMap(u, i_range) && i_funit->IsFriendlyTo(u) && (!i_playerOnly || u->GetTypeId() == TYPEID_PLAYER)) @@ -889,7 +889,7 @@ namespace Trinity class AnyGroupedUnitInObjectRangeCheck { public: - AnyGroupedUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool raid) : _source(obj), _refUnit(funit), _range(range), _raid(raid) {} + AnyGroupedUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool raid) : _source(obj), _refUnit(funit), _range(range), _raid(raid) { } bool operator()(Unit* u) { if (G3D::fuzzyEq(_range, 0)) @@ -916,7 +916,7 @@ namespace Trinity class AnyUnitInObjectRangeCheck { public: - AnyUnitInObjectRangeCheck(WorldObject const* obj, float range) : i_obj(obj), i_range(range) {} + AnyUnitInObjectRangeCheck(WorldObject const* obj, float range) : i_obj(obj), i_range(range) { } bool operator()(Unit* u) { if (u->IsAlive() && i_obj->IsWithinDistInMap(u, i_range)) @@ -933,7 +933,7 @@ namespace Trinity class NearestAttackableUnitInObjectRangeCheck { public: - NearestAttackableUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {} + NearestAttackableUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) { } bool operator()(Unit* u) { if (u->isTargetableForAttack() && i_obj->IsWithinDistInMap(u, i_range) && @@ -993,7 +993,7 @@ namespace Trinity public: CallOfHelpCreatureInRangeDo(Unit* funit, Unit* enemy, float range) : i_funit(funit), i_enemy(enemy), i_range(range) - {} + { } void operator()(Creature* u) { if (u == i_funit) @@ -1161,7 +1161,7 @@ namespace Trinity { public: NearestAssistCreatureInCreatureRangeCheck(Creature* obj, Unit* enemy, float range) - : i_obj(obj), i_enemy(enemy), i_range(range) {} + : i_obj(obj), i_enemy(enemy), i_range(range) { } bool operator()(Creature* u) { @@ -1194,7 +1194,7 @@ namespace Trinity { public: NearestCreatureEntryWithLiveStateInObjectRangeCheck(WorldObject const& obj, uint32 entry, bool alive, float range) - : i_obj(obj), i_entry(entry), i_alive(alive), i_range(range) {} + : i_obj(obj), i_entry(entry), i_alive(alive), i_range(range) { } bool operator()(Creature* u) { @@ -1219,7 +1219,7 @@ namespace Trinity class AnyPlayerInObjectRangeCheck { public: - AnyPlayerInObjectRangeCheck(WorldObject const* obj, float range, bool reqAlive = true) : _obj(obj), _range(range), _reqAlive(reqAlive) {} + AnyPlayerInObjectRangeCheck(WorldObject const* obj, float range, bool reqAlive = true) : _obj(obj), _range(range), _reqAlive(reqAlive) { } bool operator()(Player* u) { if (_reqAlive && !u->IsAlive()) @@ -1264,7 +1264,7 @@ namespace Trinity class AllFriendlyCreaturesInGrid { public: - AllFriendlyCreaturesInGrid(Unit const* obj) : unit(obj) {} + AllFriendlyCreaturesInGrid(Unit const* obj) : unit(obj) { } bool operator() (Unit* u) { if (u->IsAlive() && u->IsVisible() && u->IsFriendlyTo(unit)) @@ -1279,7 +1279,7 @@ namespace Trinity class AllGameObjectsWithEntryInRange { public: - AllGameObjectsWithEntryInRange(const WorldObject* object, uint32 entry, float maxRange) : m_pObject(object), m_uiEntry(entry), m_fRange(maxRange) {} + AllGameObjectsWithEntryInRange(const WorldObject* object, uint32 entry, float maxRange) : m_pObject(object), m_uiEntry(entry), m_fRange(maxRange) { } bool operator() (GameObject* go) { if (go->GetEntry() == m_uiEntry && m_pObject->IsWithinDist(go, m_fRange, false)) @@ -1296,7 +1296,7 @@ namespace Trinity class AllCreaturesOfEntryInRange { public: - AllCreaturesOfEntryInRange(const WorldObject* object, uint32 entry, float maxRange) : m_pObject(object), m_uiEntry(entry), m_fRange(maxRange) {} + AllCreaturesOfEntryInRange(const WorldObject* object, uint32 entry, float maxRange) : m_pObject(object), m_uiEntry(entry), m_fRange(maxRange) { } bool operator() (Unit* unit) { if (unit->GetEntry() == m_uiEntry && m_pObject->IsWithinDist(unit, m_fRange, false)) @@ -1314,7 +1314,7 @@ namespace Trinity class PlayerAtMinimumRangeAway { public: - PlayerAtMinimumRangeAway(Unit const* unit, float fMinRange) : unit(unit), fRange(fMinRange) {} + PlayerAtMinimumRangeAway(Unit const* unit, float fMinRange) : unit(unit), fRange(fMinRange) { } bool operator() (Player* player) { //No threat list check, must be done explicit if expected to be in combat with creature @@ -1333,7 +1333,7 @@ namespace Trinity { public: GameObjectInRangeCheck(float _x, float _y, float _z, float _range, uint32 _entry = 0) : - x(_x), y(_y), z(_z), range(_range), entry(_entry) {} + x(_x), y(_y), z(_z), range(_range), entry(_entry) { } bool operator() (GameObject* go) { if (!entry || (go->GetGOInfo() && go->GetGOInfo()->entry == entry)) @@ -1348,7 +1348,7 @@ namespace Trinity class AllWorldObjectsInRange { public: - AllWorldObjectsInRange(const WorldObject* object, float maxRange) : m_pObject(object), m_fRange(maxRange) {} + AllWorldObjectsInRange(const WorldObject* object, float maxRange) : m_pObject(object), m_fRange(maxRange) { } bool operator() (WorldObject* go) { return m_pObject->IsWithinDist(go, m_fRange, false) && m_pObject->InSamePhase(go); @@ -1361,7 +1361,7 @@ namespace Trinity class ObjectTypeIdCheck { public: - ObjectTypeIdCheck(TypeID typeId, bool equals) : _typeId(typeId), _equals(equals) {} + ObjectTypeIdCheck(TypeID typeId, bool equals) : _typeId(typeId), _equals(equals) { } bool operator()(WorldObject* object) { return (object->GetTypeId() == _typeId) == _equals; @@ -1375,7 +1375,7 @@ namespace Trinity class ObjectGUIDCheck { public: - ObjectGUIDCheck(uint64 GUID) : _GUID(GUID) {} + ObjectGUIDCheck(uint64 GUID) : _GUID(GUID) { } bool operator()(WorldObject* object) { return object->GetGUID() == _GUID; @@ -1388,7 +1388,7 @@ namespace Trinity class UnitAuraCheck { public: - UnitAuraCheck(bool present, uint32 spellId, uint64 casterGUID = 0) : _present(present), _spellId(spellId), _casterGUID(casterGUID) {} + UnitAuraCheck(bool present, uint32 spellId, uint64 casterGUID = 0) : _present(present), _spellId(spellId), _casterGUID(casterGUID) { } bool operator()(Unit* unit) const { return unit->HasAura(_spellId, _casterGUID) == _present; @@ -1412,7 +1412,7 @@ namespace Trinity class LocalizedPacketDo { public: - explicit LocalizedPacketDo(Builder& builder) : i_builder(builder) {} + explicit LocalizedPacketDo(Builder& builder) : i_builder(builder) { } ~LocalizedPacketDo() { @@ -1432,7 +1432,7 @@ namespace Trinity { public: typedef std::vector<WorldPacket*> WorldPacketList; - explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) {} + explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) { } ~LocalizedPacketListDo() { diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp index 58a5bbbff06..e43c624018e 100644 --- a/src/server/game/Grids/ObjectGridLoader.cpp +++ b/src/server/game/Grids/ObjectGridLoader.cpp @@ -43,6 +43,20 @@ void ObjectGridEvacuator::Visit(CreatureMapType &m) } } +void ObjectGridEvacuator::Visit(GameObjectMapType &m) +{ + // gameobject in unloading grid can have respawn point in another grid + // if it will be unloaded then it will not respawn in original grid until unload/load original grid + // move to respawn point to prevent this case. For player view in respawn grid this will be normal respawn. + for (GameObjectMapType::iterator iter = m.begin(); iter != m.end();) + { + GameObject* go = iter->GetSource(); + ++iter; + + go->GetMap()->GameObjectRespawnRelocation(go, true); + } +} + // for loading world object at grid loading (Corpses) /// @todo to implement npc on transport, also need to load npcs at grid loading class ObjectWorldLoader @@ -50,7 +64,7 @@ class ObjectWorldLoader public: explicit ObjectWorldLoader(ObjectGridLoader& gloader) : i_cell(gloader.i_cell), i_map(gloader.i_map), i_corpses (0) - {} + { } void Visit(CorpseMapType &m); @@ -63,19 +77,31 @@ class ObjectWorldLoader uint32 i_corpses; }; -template<class T> void ObjectGridLoader::SetObjectCell(T* /*obj*/, CellCoord const& /*cellCoord*/) -{ -} +template<class T> void ObjectGridLoader::SetObjectCell(T* /*obj*/, CellCoord const& /*cellCoord*/) { } template<> void ObjectGridLoader::SetObjectCell(Creature* obj, CellCoord const& cellCoord) { Cell cell(cellCoord); + obj->SetCurrentCell(cell); +} +template<> void ObjectGridLoader::SetObjectCell(GameObject* obj, CellCoord const& cellCoord) +{ + Cell cell(cellCoord); obj->SetCurrentCell(cell); } template <class T> -void AddObjectHelper(CellCoord &cell, GridRefManager<T> &m, uint32 &count, Map* map, T *obj) +void AddObjectHelper(CellCoord &cell, GridRefManager<T> &m, uint32 &count, Map* /*map*/, T *obj) +{ + obj->AddToGrid(m); + ObjectGridLoader::SetObjectCell(obj, cell); + obj->AddToWorld(); + ++count; +} + +template <> +void AddObjectHelper(CellCoord &cell, CreatureMapType &m, uint32 &count, Map* map, Creature *obj) { obj->AddToGrid(m); ObjectGridLoader::SetObjectCell(obj, cell); diff --git a/src/server/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h index 11f91670a5f..da3baa9c03c 100644 --- a/src/server/game/Grids/ObjectGridLoader.h +++ b/src/server/game/Grids/ObjectGridLoader.h @@ -34,12 +34,12 @@ class ObjectGridLoader public: ObjectGridLoader(NGridType &grid, Map* map, const Cell &cell) : i_cell(cell), i_grid(grid), i_map(map), i_gameObjects(0), i_creatures(0), i_corpses (0) - {} + { } void Visit(GameObjectMapType &m); void Visit(CreatureMapType &m); - void Visit(CorpseMapType &) const {} - void Visit(DynamicObjectMapType&) const {} + void Visit(CorpseMapType &) const { } + void Visit(DynamicObjectMapType&) const { } void LoadN(void); @@ -59,7 +59,7 @@ class ObjectGridStoper { public: void Visit(CreatureMapType &m); - template<class T> void Visit(GridRefManager<T> &) {} + template<class T> void Visit(GridRefManager<T> &) { } }; //Move the foreign creatures back to respawn positions before unloading the NGrid @@ -67,7 +67,8 @@ class ObjectGridEvacuator { public: void Visit(CreatureMapType &m); - template<class T> void Visit(GridRefManager<T> &) {} + void Visit(GameObjectMapType &m); + template<class T> void Visit(GridRefManager<T> &) { } }; //Clean up and remove from world diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 8ec6aac9d4e..e5d737a7b36 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -39,13 +39,9 @@ Roll::Roll(uint64 _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid), itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count), totalPlayersRolling(0), totalNeed(0), totalGreed(0), totalPass(0), itemSlot(0), -rollVoteMask(ROLL_ALL_TYPE_NO_DISENCHANT) -{ -} +rollVoteMask(ROLL_ALL_TYPE_NO_DISENCHANT) { } -Roll::~Roll() -{ -} +Roll::~Roll() { } void Roll::setLoot(Loot* pLoot) { diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 356a1a59663..0f55aba464c 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -152,7 +152,7 @@ struct InstanceGroupBind bool perm; /* permanent InstanceGroupBinds exist if the leader has a permanent PlayerInstanceBind for the same instance. */ - InstanceGroupBind() : save(NULL), perm(false) {} + InstanceGroupBind() : save(NULL), perm(false) { } }; /** request member stats checken **/ diff --git a/src/server/game/Groups/GroupReference.h b/src/server/game/Groups/GroupReference.h index 6c68710aeb5..6e323eefa27 100644 --- a/src/server/game/Groups/GroupReference.h +++ b/src/server/game/Groups/GroupReference.h @@ -32,7 +32,7 @@ class GroupReference : public Reference<Group, Player> void targetObjectDestroyLink(); void sourceObjectDestroyLink(); public: - GroupReference() : Reference<Group, Player>(), iSubGroup(0) {} + GroupReference() : Reference<Group, Player>(), iSubGroup(0) { } ~GroupReference() { unlink(); } GroupReference* next() { return (GroupReference*)Reference<Group, Player>::next(); } GroupReference const* next() const { return (GroupReference const*)Reference<Group, Player>::next(); } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 031febc3806..1a3e48c8217 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1764,7 +1764,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool { //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway amount = std::min(amount, uint32(MAX_MONEY_AMOUNT)); - + if (m_bankMoney < amount) // Not enough money in bank return false; diff --git a/src/server/game/Handlers/AddonHandler.cpp b/src/server/game/Handlers/AddonHandler.cpp index 7110768cf1f..31404113eca 100644 --- a/src/server/game/Handlers/AddonHandler.cpp +++ b/src/server/game/Handlers/AddonHandler.cpp @@ -22,13 +22,9 @@ #include "Opcodes.h" #include "Log.h" -AddonHandler::AddonHandler() -{ -} +AddonHandler::AddonHandler() { } -AddonHandler::~AddonHandler() -{ -} +AddonHandler::~AddonHandler() { } bool AddonHandler::BuildAddonPacket(WorldPacket* source, WorldPacket* target) { diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 8570ad03220..35f1bbbdb56 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -503,7 +503,7 @@ namespace Trinity { public: EmoteChatBuilder(Player const& player, uint32 text_emote, uint32 emote_num, Unit const* target) - : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) {} + : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) { } void operator()(WorldPacket& data, LocaleConstant loc_idx) { diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 5f458edbb07..d9727ea7ded 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -382,7 +382,7 @@ void WorldSession::HandleItemQuerySingleOpcode(WorldPacket& recvData) else { data << uint32(spell->RecoveryTime); - data << uint32(spell->Category); + data << uint32(spell->GetCategory()); data << uint32(spell->CategoryRecoveryTime); } } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 1faa68b6ea4..955f6b3c456 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -303,30 +303,21 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) { if (!plrMover->GetTransport()) { - // elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just dismount if the guid can be found in the transport list - for (MapManager::TransportSet::const_iterator iter = sMapMgr->m_Transports.begin(); iter != sMapMgr->m_Transports.end(); ++iter) + if (Transport* transport = plrMover->GetMap()->GetTransport(movementInfo.transport.guid)) { - if ((*iter)->GetGUID() == movementInfo.transport.guid) - { - plrMover->m_transport = *iter; - (*iter)->AddPassenger(plrMover); - break; - } + plrMover->m_transport = transport; + transport->AddPassenger(plrMover); } } else if (plrMover->GetTransport()->GetGUID() != movementInfo.transport.guid) { bool foundNewTransport = false; plrMover->m_transport->RemovePassenger(plrMover); - for (MapManager::TransportSet::const_iterator iter = sMapMgr->m_Transports.begin(); iter != sMapMgr->m_Transports.end(); ++iter) + if (Transport* transport = plrMover->GetMap()->GetTransport(movementInfo.transport.guid)) { - if ((*iter)->GetGUID() == movementInfo.transport.guid) - { - foundNewTransport = true; - plrMover->m_transport = *iter; - (*iter)->AddPassenger(plrMover); - break; - } + foundNewTransport = true; + plrMover->m_transport = transport; + transport->AddPassenger(plrMover); } if (!foundNewTransport) @@ -363,7 +354,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) uint32 mstime = getMSTime(); /*----------------------*/ - if(m_clientTimeDelay == 0) + if (m_clientTimeDelay == 0) m_clientTimeDelay = mstime - movementInfo.time; /* process position-change */ diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 418709c8407..791e2d4c816 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -476,9 +476,7 @@ void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket) pet->AddCreatureSpellCooldown(spellId); } -void WorldSession::HandleCancelGrowthAuraOpcode(WorldPacket& /*recvPacket*/) -{ -} +void WorldSession::HandleCancelGrowthAuraOpcode(WorldPacket& /*recvPacket*/) { } void WorldSession::HandleCancelAutoRepeatSpellOpcode(WorldPacket& /*recvPacket*/) { diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index d7ffb70ccfa..d552f822f0a 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -163,9 +163,7 @@ void InstanceSaveManager::RemoveInstanceSave(uint32 InstanceId) InstanceSave::InstanceSave(uint16 MapId, uint32 InstanceId, Difficulty difficulty, time_t resetTime, bool canReset) : m_resetTime(resetTime), m_instanceid(InstanceId), m_mapid(MapId), - m_difficulty(difficulty), m_canReset(canReset), m_toDelete(false) -{ -} + m_difficulty(difficulty), m_canReset(canReset), m_toDelete(false) { } InstanceSave::~InstanceSave() { diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h index e3717a934c3..5dda4eb620e 100644 --- a/src/server/game/Instances/InstanceSaveMgr.h +++ b/src/server/game/Instances/InstanceSaveMgr.h @@ -148,7 +148,7 @@ class InstanceSaveManager friend class InstanceSave; private: - InstanceSaveManager() : lock_instLists(false) {}; + InstanceSaveManager() : lock_instLists(false) { }; ~InstanceSaveManager(); public: @@ -163,9 +163,9 @@ class InstanceSaveManager uint16 mapid; uint16 instanceId; - InstResetEvent() : type(0), difficulty(DUNGEON_DIFFICULTY_NORMAL), mapid(0), instanceId(0) {} + InstResetEvent() : type(0), difficulty(DUNGEON_DIFFICULTY_NORMAL), mapid(0), instanceId(0) { } InstResetEvent(uint8 t, uint32 _mapid, Difficulty d, uint16 _instanceid) - : type(t), difficulty(d), mapid(_mapid), instanceId(_instanceid) {} + : type(t), difficulty(d), mapid(_mapid), instanceId(_instanceid) { } bool operator == (const InstResetEvent& e) const { return e.instanceId == instanceId; } }; typedef std::multimap<time_t /*resetTime*/, InstResetEvent> ResetTimeQueue; diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 943ae672046..2a2faacd200 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -101,7 +101,7 @@ struct MinionData struct BossInfo { - BossInfo() : state(TO_BE_DECIDED) {} + BossInfo() : state(TO_BE_DECIDED) { } EncounterState state; DoorSet door[MAX_DOOR_TYPES]; MinionSet minion; @@ -111,7 +111,7 @@ struct BossInfo struct DoorInfo { explicit DoorInfo(BossInfo* _bossInfo, DoorType _type, BoundaryType _boundary) - : bossInfo(_bossInfo), type(_type), boundary(_boundary) {} + : bossInfo(_bossInfo), type(_type), boundary(_boundary) { } BossInfo* bossInfo; DoorType type; BoundaryType boundary; @@ -119,7 +119,7 @@ struct DoorInfo struct MinionInfo { - explicit MinionInfo(BossInfo* _bossInfo) : bossInfo(_bossInfo) {} + explicit MinionInfo(BossInfo* _bossInfo) : bossInfo(_bossInfo) { } BossInfo* bossInfo; }; @@ -131,14 +131,14 @@ typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap; class InstanceScript : public ZoneScript { public: - explicit InstanceScript(Map* map) : instance(map), completedEncounters(0) {} + explicit InstanceScript(Map* map) : instance(map), completedEncounters(0) { } - virtual ~InstanceScript() {} + virtual ~InstanceScript() { } Map* instance; //On creation, NOT load. - virtual void Initialize() {} + virtual void Initialize() { } //On load virtual void Load(char const* data) { LoadBossState(data); } @@ -148,14 +148,14 @@ class InstanceScript : public ZoneScript void SaveToDB(); - virtual void Update(uint32 /*diff*/) {} + virtual void Update(uint32 /*diff*/) { } //Used by the map's CanEnter function. //This is to prevent players from entering during boss encounters. virtual bool IsEncounterInProgress() const; //Called when a player successfully enters the instance. - virtual void OnPlayerEnter(Player* /*player*/) {} + virtual void OnPlayerEnter(Player* /*player*/) { } //Handle open / close objects //use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts @@ -212,7 +212,7 @@ class InstanceScript : public ZoneScript void SendEncounterUnit(uint32 type, Unit* unit = NULL, uint8 param1 = 0, uint8 param2 = 0); - virtual void FillInitialWorldStates(WorldPacket& /*data*/) {} + virtual void FillInitialWorldStates(WorldPacket& /*data*/) { } protected: void SetBossNumber(uint32 number) { bosses.resize(number); } diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index c2f74aab701..895d09fe7ad 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -117,7 +117,7 @@ struct LootStoreItem LootStoreItem(uint32 _itemid, float _chanceOrQuestChance, uint16 _lootmode, uint8 _group, int32 _mincountOrRef, uint8 _maxcount) : itemid(_itemid), chance(fabs(_chanceOrQuestChance)), mincountOrRef(_mincountOrRef), lootmode(_lootmode), group(_group), needs_quest(_chanceOrQuestChance < 0), maxcount(_maxcount) - {} + { } bool Roll(bool rate) const; // Checks if the entry takes it's chance (at loot generation) bool IsValid(LootStore const& store, uint32 entry) const; @@ -148,7 +148,7 @@ struct LootItem explicit LootItem(LootStoreItem const& li); // Empty constructor for creating an empty LootItem to be filled in with DB data - LootItem() : canSave(true){}; + LootItem() : canSave(true){ }; // Basic checks for player/item compatibility - if false no chance to see the item in the loot bool AllowedForPlayer(Player const* player) const; @@ -162,10 +162,10 @@ struct QuestItem bool is_looted; QuestItem() - : index(0), is_looted(false) {} + : index(0), is_looted(false) { } QuestItem(uint8 _index, bool _islooted = false) - : index(_index), is_looted(_islooted) {} + : index(_index), is_looted(_islooted) { } }; struct Loot; @@ -183,7 +183,7 @@ class LootStore { public: explicit LootStore(char const* name, char const* entryName, bool ratesAllowed) - : m_name(name), m_entryName(entryName), m_ratesAllowed(ratesAllowed) {} + : m_name(name), m_entryName(entryName), m_ratesAllowed(ratesAllowed) { } virtual ~LootStore() { Clear(); } @@ -256,9 +256,9 @@ class LootTemplate class LootValidatorRef : public Reference<Loot, LootValidatorRef> { public: - LootValidatorRef() {} - void targetObjectDestroyLink() {} - void sourceObjectDestroyLink() {} + LootValidatorRef() { } + void targetObjectDestroyLink() { } + void sourceObjectDestroyLink() { } }; //===================================================== @@ -303,7 +303,7 @@ struct Loot // Only set for inventory items that can be right-click looted uint32 containerID; - Loot(uint32 _gold = 0) : gold(_gold), unlootedCount(0), loot_type(LOOT_CORPSE), maxDuplicates(1), containerID(0) {} + Loot(uint32 _gold = 0) : gold(_gold), unlootedCount(0), loot_type(LOOT_CORPSE), maxDuplicates(1), containerID(0) { } ~Loot() { clear(); } // For deleting items at loot removal since there is no backward interface to the Item() @@ -381,7 +381,7 @@ struct LootView Player* viewer; PermissionTypes permission; LootView(Loot &_loot, Player* _viewer, PermissionTypes _permission = ALL_PERMISSION) - : loot(_loot), viewer(_viewer), permission(_permission) {} + : loot(_loot), viewer(_viewer), permission(_permission) { } }; extern LootStore LootTemplates_Creature; diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index 2fa0a03e63f..fd4bcbd5dc0 100644 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -62,9 +62,7 @@ MailSender::MailSender(CalendarEvent* sender) } MailSender::MailSender(AuctionEntry* sender) - : m_messageType(MAIL_AUCTION), m_senderId(sender->GetHouseId()), m_stationery(MAIL_STATIONERY_AUCTION) -{ -} + : m_messageType(MAIL_AUCTION), m_senderId(sender->GetHouseId()), m_stationery(MAIL_STATIONERY_AUCTION) { } MailSender::MailSender(Player* sender) { @@ -73,9 +71,7 @@ MailSender::MailSender(Player* sender) m_senderId = sender->GetGUIDLow(); } -MailReceiver::MailReceiver(Player* receiver) : m_receiver(receiver), m_receiver_lowguid(receiver->GetGUIDLow()) -{ -} +MailReceiver::MailReceiver(Player* receiver) : m_receiver(receiver), m_receiver_lowguid(receiver->GetGUIDLow()) { } MailReceiver::MailReceiver(Player* receiver, uint32 receiver_lowguid) : m_receiver(receiver), m_receiver_lowguid(receiver_lowguid) { diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h index 6357d70e4a7..d4553233b64 100644 --- a/src/server/game/Mails/Mail.h +++ b/src/server/game/Mails/Mail.h @@ -102,7 +102,7 @@ class MailSender class MailReceiver { public: // Constructors - explicit MailReceiver(uint32 receiver_lowguid) : m_receiver(NULL), m_receiver_lowguid(receiver_lowguid) {} + explicit MailReceiver(uint32 receiver_lowguid) : m_receiver(NULL), m_receiver_lowguid(receiver_lowguid) { } MailReceiver(Player* receiver); MailReceiver(Player* receiver, uint32 receiver_lowguid); public: // Accessors @@ -120,9 +120,9 @@ class MailDraft public: // Constructors explicit MailDraft(uint16 mailTemplateId, bool need_items = true) : m_mailTemplateId(mailTemplateId), m_mailTemplateItemsNeed(need_items), m_money(0), m_COD(0) - {} + { } MailDraft(std::string const& subject, std::string const& body) - : m_mailTemplateId(0), m_mailTemplateItemsNeed(false), m_subject(subject), m_body(body), m_money(0), m_COD(0) {} + : m_mailTemplateId(0), m_mailTemplateItemsNeed(false), m_subject(subject), m_body(body), m_money(0), m_COD(0) { } public: // Accessors uint16 GetMailTemplateId() const { return m_mailTemplateId; } std::string const& GetSubject() const { return m_subject; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index aaeb06462ef..3692029fa17 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -63,6 +63,19 @@ Map::~Map() obj->ResetMap(); } + for (TransportsContainer::iterator itr = _transports.begin(); itr != _transports.end();) + { + Transport* transport = *itr; + ++itr; + + // Destroy local transports + if (transport->GetTransportTemplate()->inInstance) + { + transport->RemoveFromWorld(); + delete transport; + } + } + if (!m_scriptSchedule.empty()) sScriptMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size()); @@ -223,10 +236,12 @@ void Map::DeleteStateMachine() } Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode, Map* _parent): -_creatureToMoveLock(false), i_mapEntry (sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId), +_creatureToMoveLock(false), _gameObjectsToMoveLock(false), +i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId), m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_VisibilityNotifyPeriod(DEFAULT_VISIBILITY_NOTIFY_PERIOD), -m_activeNonPlayersIter(m_activeNonPlayers.end()), i_gridExpiry(expiry), +m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()), +i_gridExpiry(expiry), i_scriptLock(false) { m_parentMap = (_parent ? _parent : this); @@ -276,6 +291,19 @@ void Map::AddToGrid(Creature* obj, Cell const& cell) obj->SetCurrentCell(cell); } +template<> +void Map::AddToGrid(GameObject* obj, Cell const& cell) +{ + NGridType* grid = getNGrid(cell.GridX(), cell.GridY()); + grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject(obj); + + obj->SetCurrentCell(cell); +} + +template<class T> +void Map::SwitchGridContainers(T* /*obj*/, bool /*on*/) { } + +template<> void Map::SwitchGridContainers(Creature* obj, bool on) { ASSERT(!obj->IsPermanentWorldObject()); @@ -297,6 +325,7 @@ void Map::SwitchGridContainers(Creature* obj, bool on) GridType &grid = ngrid->GetGridType(cell.CellX(), cell.CellY()); obj->RemoveFromGrid(); //This step is not really necessary but we want to do ASSERT in remove/add + if (on) { grid.AddWorldObject(obj); @@ -307,9 +336,45 @@ void Map::SwitchGridContainers(Creature* obj, bool on) grid.AddGridObject(obj); RemoveWorldObject(obj); } + obj->m_isTempWorldObject = on; } +template<> +void Map::SwitchGridContainers(GameObject* obj, bool on) +{ + ASSERT(!obj->IsPermanentWorldObject()); + CellCoord p = Trinity::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY()); + if (!p.IsCoordValid()) + { + TC_LOG_ERROR(LOG_FILTER_MAPS, "Map::SwitchGridContainers: Object " UI64FMTD " has invalid coordinates X:%f Y:%f grid cell [%u:%u]", obj->GetGUID(), obj->GetPositionX(), obj->GetPositionY(), p.x_coord, p.y_coord); + return; + } + + Cell cell(p); + if (!IsGridLoaded(GridCoord(cell.data.Part.grid_x, cell.data.Part.grid_y))) + return; + + TC_LOG_DEBUG(LOG_FILTER_MAPS, "Switch object " UI64FMTD " from grid[%u, %u] %u", obj->GetGUID(), cell.data.Part.grid_x, cell.data.Part.grid_y, on); + NGridType *ngrid = getNGrid(cell.GridX(), cell.GridY()); + ASSERT(ngrid != NULL); + + GridType &grid = ngrid->GetGridType(cell.CellX(), cell.CellY()); + + obj->RemoveFromGrid(); //This step is not really necessary but we want to do ASSERT in remove/add + + if (on) + { + grid.AddWorldObject(obj); + AddWorldObject(obj); + } + else + { + grid.AddGridObject(obj); + RemoveWorldObject(obj); + } +} + template<class T> void Map::DeleteFromWorld(T* obj) { @@ -431,18 +496,22 @@ bool Map::AddPlayerToMap(Player* player) } template<class T> -void Map::InitializeObject(T* /*obj*/) +void Map::InitializeObject(T* /*obj*/) { } + +template<> +void Map::InitializeObject(Creature* obj) { + obj->_moveState = MAP_OBJECT_CELL_MOVE_NONE; } template<> -void Map::InitializeObject(Creature* obj) +void Map::InitializeObject(GameObject* obj) { - obj->_moveState = CREATURE_CELL_MOVE_NONE; + obj->_moveState = MAP_OBJECT_CELL_MOVE_NONE; } template<class T> -bool Map::AddToMap(T *obj) +bool Map::AddToMap(T* obj) { /// @todo Needs clean up. An object should not be added to map twice. if (obj->IsInWorld()) @@ -486,6 +555,26 @@ bool Map::AddToMap(T *obj) return true; } +template<> +bool Map::AddToMap(Transport* obj) +{ + //TODO: Needs clean up. An object should not be added to map twice. + if (obj->IsInWorld()) + return true; + + CellCoord cellCoord = Trinity::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY()); + if (!cellCoord.IsCoordValid()) + { + TC_LOG_ERROR(LOG_FILTER_MAPS, "Map::Add: Object " UI64FMTD " has invalid coordinates X:%f Y:%f grid cell [%u:%u]", obj->GetGUID(), obj->GetPositionX(), obj->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord); + return false; //Should delete object + } + + obj->AddToWorld(); + _transports.insert(obj); + + return true; +} + bool Map::IsGridLoaded(const GridCoord &p) const { return (getNGrid(p.x_coord, p.y_coord) && isGridObjectDataLoaded(p.x_coord, p.y_coord)); @@ -571,6 +660,17 @@ void Map::Update(const uint32 t_diff) VisitNearbyCellsOf(obj, grid_object_update, world_object_update); } + for (_transportsUpdateIter = _transports.begin(); _transportsUpdateIter != _transports.end();) + { + WorldObject* obj = *_transportsUpdateIter; + ++_transportsUpdateIter; + + if (!obj->IsInWorld()) + continue; + + obj->Update(t_diff); + } + ///- Process necessary scripts if (!m_scriptSchedule.empty()) { @@ -580,6 +680,7 @@ void Map::Update(const uint32 t_diff) } MoveAllCreaturesInMoveList(); + MoveAllGameObjectsInMoveList(); if (!m_mapRefManager.isEmpty() || !m_activeNonPlayers.empty()) ProcessRelocationNotifies(t_diff); @@ -594,7 +695,7 @@ struct ResetNotifier for (typename GridRefManager<T>::iterator iter=m.begin(); iter != m.end(); ++iter) iter->GetSource()->ResetAllNotifies(); } - template<class T> void Visit(GridRefManager<T> &) {} + template<class T> void Visit(GridRefManager<T> &) { } void Visit(CreatureMapType &m) { resetNotify<Creature>(m);} void Visit(PlayerMapType &m) { resetNotify<Player>(m);} }; @@ -714,6 +815,34 @@ void Map::RemoveFromMap(T *obj, bool remove) } } +template<> +void Map::RemoveFromMap(Transport* obj, bool remove) +{ + obj->RemoveFromWorld(); + + if (_transportsUpdateIter != _transports.end()) + { + TransportsContainer::iterator itr = _transports.find(obj); + if (itr == _transports.end()) + return; + if (itr == _transportsUpdateIter) + ++_transportsUpdateIter; + _transports.erase(itr); + } + else + _transports.erase(obj); + + obj->ResetMap(); + + if (remove) + { + // if option set then object already saved at this moment + if (!sWorld->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY)) + obj->SaveRespawnTime(); + DeleteFromWorld(obj); + } +} + void Map::PlayerRelocation(Player* player, float x, float y, float z, float orientation) { ASSERT(player); @@ -783,12 +912,44 @@ void Map::CreatureRelocation(Creature* creature, float x, float y, float z, floa ASSERT(CheckGridIntegrity(creature, true)); } +void Map::GameObjectRelocation(GameObject* go, float x, float y, float z, float orientation, bool respawnRelocationOnFail) +{ + Cell integrity_check(go->GetPositionX(), go->GetPositionY()); + Cell old_cell = go->GetCurrentCell(); + + ASSERT(integrity_check == old_cell); + Cell new_cell(x, y); + + if (!respawnRelocationOnFail && !getNGrid(new_cell.GridX(), new_cell.GridY())) + return; + + // delay creature move for grid/cell to grid/cell moves + if (old_cell.DiffCell(new_cell) || old_cell.DiffGrid(new_cell)) + { +#ifdef TRINITY_DEBUG + TC_LOG_DEBUG(LOG_FILTER_MAPS, "GameObject (GUID: %u Entry: %u) added to moving list from grid[%u, %u]cell[%u, %u] to grid[%u, %u]cell[%u, %u].", go->GetGUIDLow(), go->GetEntry(), old_cell.GridX(), old_cell.GridY(), old_cell.CellX(), old_cell.CellY(), new_cell.GridX(), new_cell.GridY(), new_cell.CellX(), new_cell.CellY()); +#endif + AddGameObjectToMoveList(go, x, y, z, orientation); + // in diffcell/diffgrid case notifiers called at finishing move go in Map::MoveAllGameObjectsInMoveList + } + else + { + go->Relocate(x, y, z, orientation); + go->UpdateObjectVisibility(false); + RemoveGameObjectFromMoveList(go); + } + + old_cell = go->GetCurrentCell(); + integrity_check = Cell(go->GetPositionX(), go->GetPositionY()); + ASSERT(integrity_check == old_cell); +} + void Map::AddCreatureToMoveList(Creature* c, float x, float y, float z, float ang) { if (_creatureToMoveLock) //can this happen? return; - if (c->_moveState == CREATURE_CELL_MOVE_NONE) + if (c->_moveState == MAP_OBJECT_CELL_MOVE_NONE) _creaturesToMove.push_back(c); c->SetNewCellPosition(x, y, z, ang); } @@ -798,8 +959,27 @@ void Map::RemoveCreatureFromMoveList(Creature* c) if (_creatureToMoveLock) //can this happen? return; - if (c->_moveState == CREATURE_CELL_MOVE_ACTIVE) - c->_moveState = CREATURE_CELL_MOVE_INACTIVE; + if (c->_moveState == MAP_OBJECT_CELL_MOVE_ACTIVE) + c->_moveState = MAP_OBJECT_CELL_MOVE_INACTIVE; +} + +void Map::AddGameObjectToMoveList(GameObject* go, float x, float y, float z, float ang) +{ + if (_gameObjectsToMoveLock) //can this happen? + return; + + if (go->_moveState == MAP_OBJECT_CELL_MOVE_NONE) + _gameObjectsToMove.push_back(go); + go->SetNewCellPosition(x, y, z, ang); +} + +void Map::RemoveGameObjectFromMoveList(GameObject* go) +{ + if (_gameObjectsToMoveLock) //can this happen? + return; + + if (go->_moveState == MAP_OBJECT_CELL_MOVE_ACTIVE) + go->_moveState = MAP_OBJECT_CELL_MOVE_INACTIVE; } void Map::MoveAllCreaturesInMoveList() @@ -811,13 +991,13 @@ void Map::MoveAllCreaturesInMoveList() if (c->FindMap() != this) //pet is teleported to another map continue; - if (c->_moveState != CREATURE_CELL_MOVE_ACTIVE) + if (c->_moveState != MAP_OBJECT_CELL_MOVE_ACTIVE) { - c->_moveState = CREATURE_CELL_MOVE_NONE; + c->_moveState = MAP_OBJECT_CELL_MOVE_NONE; continue; } - c->_moveState = CREATURE_CELL_MOVE_NONE; + c->_moveState = MAP_OBJECT_CELL_MOVE_NONE; if (!c->IsInWorld()) continue; @@ -858,6 +1038,50 @@ void Map::MoveAllCreaturesInMoveList() _creatureToMoveLock = false; } +void Map::MoveAllGameObjectsInMoveList() +{ + _gameObjectsToMoveLock = true; + for (std::vector<GameObject*>::iterator itr = _gameObjectsToMove.begin(); itr != _gameObjectsToMove.end(); ++itr) + { + GameObject* go = *itr; + if (go->FindMap() != this) //transport is teleported to another map + continue; + + if (go->_moveState != MAP_OBJECT_CELL_MOVE_ACTIVE) + { + go->_moveState = MAP_OBJECT_CELL_MOVE_NONE; + continue; + } + + go->_moveState = MAP_OBJECT_CELL_MOVE_NONE; + if (!go->IsInWorld()) + continue; + + // do move or do move to respawn or remove creature if previous all fail + if (GameObjectCellRelocation(go, Cell(go->_newPosition.m_positionX, go->_newPosition.m_positionY))) + { + // update pos + go->Relocate(go->_newPosition); + go->UpdateObjectVisibility(false); + } + else + { + // if GameObject can't be move in new cell/grid (not loaded) move it to repawn cell/grid + // GameObject coordinates will be updated and notifiers send + if (!GameObjectRespawnRelocation(go, false)) + { + // ... or unload (if respawn grid also not loaded) +#ifdef TRINITY_DEBUG + sLog->outDebug(LOG_FILTER_MAPS, "GameObject (GUID: %u Entry: %u) cannot be move to unloaded respawn grid.", go->GetGUIDLow(), go->GetEntry()); +#endif + AddObjectToRemoveList(go); + } + } + } + _gameObjectsToMove.clear(); + _gameObjectsToMoveLock = false; +} + bool Map::CreatureCellRelocation(Creature* c, Cell new_cell) { Cell const& old_cell = c->GetCurrentCell(); @@ -919,6 +1143,67 @@ bool Map::CreatureCellRelocation(Creature* c, Cell new_cell) return false; } +bool Map::GameObjectCellRelocation(GameObject* go, Cell new_cell) +{ + Cell const& old_cell = go->GetCurrentCell(); + if (!old_cell.DiffGrid(new_cell)) // in same grid + { + // if in same cell then none do + if (old_cell.DiffCell(new_cell)) + { + #ifdef TRINITY_DEBUG + TC_LOG_DEBUG(LOG_FILTER_MAPS, "GameObject (GUID: %u Entry: %u) moved in grid[%u, %u] from cell[%u, %u] to cell[%u, %u].", go->GetGUIDLow(), go->GetEntry(), old_cell.GridX(), old_cell.GridY(), old_cell.CellX(), old_cell.CellY(), new_cell.CellX(), new_cell.CellY()); + #endif + + go->RemoveFromGrid(); + AddToGrid(go, new_cell); + } + else + { + #ifdef TRINITY_DEBUG + TC_LOG_DEBUG(LOG_FILTER_MAPS, "GameObject (GUID: %u Entry: %u) moved in same grid[%u, %u]cell[%u, %u].", go->GetGUIDLow(), go->GetEntry(), old_cell.GridX(), old_cell.GridY(), old_cell.CellX(), old_cell.CellY()); + #endif + } + + return true; + } + + // in diff. grids but active GameObject + if (go->isActiveObject()) + { + EnsureGridLoadedForActiveObject(new_cell, go); + + #ifdef TRINITY_DEBUG + TC_LOG_DEBUG(LOG_FILTER_MAPS, "Active GameObject (GUID: %u Entry: %u) moved from grid[%u, %u]cell[%u, %u] to grid[%u, %u]cell[%u, %u].", go->GetGUIDLow(), go->GetEntry(), old_cell.GridX(), old_cell.GridY(), old_cell.CellX(), old_cell.CellY(), new_cell.GridX(), new_cell.GridY(), new_cell.CellX(), new_cell.CellY()); + #endif + + go->RemoveFromGrid(); + AddToGrid(go, new_cell); + + return true; + } + + // in diff. loaded grid normal GameObject + if (IsGridLoaded(GridCoord(new_cell.GridX(), new_cell.GridY()))) + { + #ifdef TRINITY_DEBUG + TC_LOG_DEBUG(LOG_FILTER_MAPS, "GameObject (GUID: %u Entry: %u) moved from grid[%u, %u]cell[%u, %u] to grid[%u, %u]cell[%u, %u].", go->GetGUIDLow(), go->GetEntry(), old_cell.GridX(), old_cell.GridY(), old_cell.CellX(), old_cell.CellY(), new_cell.GridX(), new_cell.GridY(), new_cell.CellX(), new_cell.CellY()); + #endif + + go->RemoveFromGrid(); + EnsureGridCreated(GridCoord(new_cell.GridX(), new_cell.GridY())); + AddToGrid(go, new_cell); + + return true; + } + + // fail to move: normal GameObject attempt move to unloaded grid + #ifdef TRINITY_DEBUG + TC_LOG_DEBUG(LOG_FILTER_MAPS, "GameObject (GUID: %u Entry: %u) attempted to move from grid[%u, %u]cell[%u, %u] to unloaded grid[%u, %u]cell[%u, %u].", go->GetGUIDLow(), go->GetEntry(), old_cell.GridX(), old_cell.GridY(), old_cell.CellX(), old_cell.CellY(), new_cell.GridX(), new_cell.GridY(), new_cell.CellX(), new_cell.CellY()); + #endif + return false; +} + bool Map::CreatureRespawnRelocation(Creature* c, bool diffGridOnly) { float resp_x, resp_y, resp_z, resp_o; @@ -949,6 +1234,31 @@ bool Map::CreatureRespawnRelocation(Creature* c, bool diffGridOnly) return false; } +bool Map::GameObjectRespawnRelocation(GameObject* go, bool diffGridOnly) +{ + float resp_x, resp_y, resp_z, resp_o; + go->GetRespawnPosition(resp_x, resp_y, resp_z, &resp_o); + Cell resp_cell(resp_x, resp_y); + + //GameObject will be unloaded with grid + if (diffGridOnly && !go->GetCurrentCell().DiffGrid(resp_cell)) + return true; + + #ifdef TRINITY_DEBUG + TC_LOG_DEBUG(LOG_FILTER_MAPS, "GameObject (GUID: %u Entry: %u) moved from grid[%u, %u]cell[%u, %u] to respawn grid[%u, %u]cell[%u, %u].", go->GetGUIDLow(), go->GetEntry(), go->GetCurrentCell().GridX(), go->GetCurrentCell().GridY(), go->GetCurrentCell().CellX(), go->GetCurrentCell().CellY(), resp_cell.GridX(), resp_cell.GridY(), resp_cell.CellX(), resp_cell.CellY()); + #endif + + // teleport it to respawn point (like normal respawn if player see) + if (GameObjectCellRelocation(go, resp_cell)) + { + go->Relocate(resp_x, resp_y, resp_z, resp_o); + go->UpdateObjectVisibility(false); + return true; + } + + return false; +} + bool Map::UnloadGrid(NGridType& ngrid, bool unloadAll) { const uint32 x = ngrid.getX(); @@ -972,6 +1282,7 @@ bool Map::UnloadGrid(NGridType& ngrid, bool unloadAll) // Finish creature moves, remove and delete all creatures with delayed remove before moving to respawn grids // Must know real mob position before move MoveAllCreaturesInMoveList(); + MoveAllGameObjectsInMoveList(); // move creatures to respawn grids if this is diff.grid or to remove list ObjectGridEvacuator worker; @@ -980,6 +1291,7 @@ bool Map::UnloadGrid(NGridType& ngrid, bool unloadAll) // Finish creature moves, remove and delete all creatures with delayed remove before unload MoveAllCreaturesInMoveList(); + MoveAllGameObjectsInMoveList(); } { @@ -1047,6 +1359,7 @@ void Map::UnloadAll() { // clear all delayed moves, useless anyway do this moves before map unload. _creaturesToMove.clear(); + _gameObjectsToMove.clear(); for (GridRefManager<NGridType>::iterator i = GridRefManager<NGridType>::begin(); i != GridRefManager<NGridType>::end();) { @@ -2014,7 +2327,7 @@ void Map::SendInitSelf(Player* player) // build other passengers at transport also (they always visible and marked as visible and will not send at visibility update at add to map if (Transport* transport = player->GetTransport()) { - for (Transport::PlayerSet::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr) + for (std::set<WorldObject*>::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr) { if (player != (*itr) && player->HaveAtClient(*itr)) { @@ -2031,24 +2344,10 @@ void Map::SendInitSelf(Player* player) void Map::SendInitTransports(Player* player) { // Hack to send out transports - MapManager::TransportMap& tmap = sMapMgr->m_TransportsByMap; - - // no transports at map - if (tmap.find(player->GetMapId()) == tmap.end()) - return; - UpdateData transData; - - MapManager::TransportSet& tset = tmap[player->GetMapId()]; - - for (MapManager::TransportSet::const_iterator i = tset.begin(); i != tset.end(); ++i) - { - // send data for current transport in other place - if ((*i) != player->GetTransport() && (*i)->GetMapId() == GetId()) - { + for (TransportsContainer::const_iterator i = _transports.begin(); i != _transports.end(); ++i) + if (*i != player->GetTransport()) (*i)->BuildCreateUpdateBlockForPlayer(&transData, player); - } - } WorldPacket packet; transData.BuildPacket(&packet); @@ -2058,19 +2357,9 @@ void Map::SendInitTransports(Player* player) void Map::SendRemoveTransports(Player* player) { // Hack to send out transports - MapManager::TransportMap& tmap = sMapMgr->m_TransportsByMap; - - // no transports at map - if (tmap.find(player->GetMapId()) == tmap.end()) - return; - UpdateData transData; - - MapManager::TransportSet& tset = tmap[player->GetMapId()]; - - // except used transport - for (MapManager::TransportSet::const_iterator i = tset.begin(); i != tset.end(); ++i) - if ((*i) != player->GetTransport() && (*i)->GetMapId() != GetId()) + for (TransportsContainer::const_iterator i = _transports.begin(); i != _transports.end(); ++i) + if (*i != player->GetTransport()) (*i)->BuildOutOfRangeUpdateBlock(&transData); WorldPacket packet; @@ -2122,7 +2411,7 @@ void Map::AddObjectToSwitchList(WorldObject* obj, bool on) ASSERT(obj->GetMapId() == GetId() && obj->GetInstanceId() == GetInstanceId()); // i_objectsToSwitch is iterated only in Map::RemoveAllObjectsInRemoveList() and it uses // the contained objects only if GetTypeId() == TYPEID_UNIT , so we can return in all other cases - if (obj->GetTypeId() != TYPEID_UNIT) + if (obj->GetTypeId() != TYPEID_UNIT && obj->GetTypeId() != TYPEID_GAMEOBJECT) return; std::map<WorldObject*, bool>::iterator itr = i_objectsToSwitch.find(obj); @@ -2143,8 +2432,8 @@ void Map::RemoveAllObjectsInRemoveList() bool on = itr->second; i_objectsToSwitch.erase(itr); - if (obj->GetTypeId() == TYPEID_UNIT && !obj->IsPermanentWorldObject()) - SwitchGridContainers(obj->ToCreature(), on); + if ((obj->GetTypeId() == TYPEID_UNIT || obj->GetTypeId() == TYPEID_GAMEOBJECT) && !obj->IsPermanentWorldObject()) + SwitchGridContainers(obj, on); } //TC_LOG_DEBUG(LOG_FILTER_MAPS, "Object remover 1 check."); @@ -2239,6 +2528,13 @@ bool Map::ActiveObjectsNearGrid(NGridType const& ngrid) const return false; } +template<class T> +void Map::AddToActive(T* obj) +{ + AddToActiveHelper(obj); +} + +template <> void Map::AddToActive(Creature* c) { AddToActiveHelper(c); @@ -2260,6 +2556,16 @@ void Map::AddToActive(Creature* c) } } +template<> +void Map::AddToActive(DynamicObject* d) +{ + AddToActiveHelper(d); +} + +template<class T> +void Map::RemoveFromActive(T* /*obj*/) { } + +template <> void Map::RemoveFromActive(Creature* c) { RemoveFromActiveHelper(c); @@ -2281,6 +2587,12 @@ void Map::RemoveFromActive(Creature* c) } } +template<> +void Map::RemoveFromActive(DynamicObject* obj) +{ + RemoveFromActiveHelper(obj); +} + template bool Map::AddToMap(Corpse*); template bool Map::AddToMap(Creature*); template bool Map::AddToMap(GameObject*); @@ -2778,6 +3090,15 @@ GameObject* Map::GetGameObject(uint64 guid) return ObjectAccessor::GetObjectInMap(guid, this, (GameObject*)NULL); } +Transport* Map::GetTransport(uint64 guid) +{ + if (GUID_HIPART(guid) != HIGHGUID_MO_TRANSPORT) + return NULL; + + GameObject* go = GetGameObject(guid); + return go ? go->ToTransport() : NULL; +} + DynamicObject* Map::GetDynamicObject(uint64 guid) { return ObjectAccessor::GetObjectInMap(guid, this, (DynamicObject*)NULL); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 3deeb4e04b1..932f3e213ae 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -52,6 +52,7 @@ struct Position; class Battleground; class MapInstanced; class InstanceMap; +class Transport; namespace Trinity { struct ObjectUpdater; } struct ScriptAction @@ -278,6 +279,7 @@ class Map : public GridRefManager<NGridType> void PlayerRelocation(Player*, float x, float y, float z, float orientation); void CreatureRelocation(Creature* creature, float x, float y, float z, float ang, bool respawnRelocationOnFail = true); + void GameObjectRelocation(GameObject* go, float x, float y, float z, float orientation, bool respawnRelocationOnFail = true); template<class T, class CONTAINER> void Visit(const Cell& cell, TypeContainerVisitor<T, CONTAINER> &visitor); @@ -350,11 +352,13 @@ class Map : public GridRefManager<NGridType> } void MoveAllCreaturesInMoveList(); + void MoveAllGameObjectsInMoveList(); void RemoveAllObjectsInRemoveList(); virtual void RemoveAllPlayers(); // used only in MoveAllCreaturesInMoveList and ObjectGridUnloader bool CreatureRespawnRelocation(Creature* c, bool diffGridOnly); + bool GameObjectRespawnRelocation(GameObject* go, bool diffGridOnly); // assert print helper bool CheckGridIntegrity(Creature* c, bool moved) const; @@ -415,17 +419,13 @@ class Map : public GridRefManager<NGridType> // must called with AddToWorld template<class T> - void AddToActive(T* obj) { AddToActiveHelper(obj); } - - void AddToActive(Creature* obj); + void AddToActive(T* obj); // must called with RemoveFromWorld template<class T> - void RemoveFromActive(T* obj) { RemoveFromActiveHelper(obj); } - - void RemoveFromActive(Creature* obj); + void RemoveFromActive(T* obj); - void SwitchGridContainers(Creature* creature, bool toWorldContainer); + template<class T> void SwitchGridContainers(T* obj, bool on); template<class NOTIFIER> void VisitAll(const float &x, const float &y, float radius, NOTIFIER ¬ifier); template<class NOTIFIER> void VisitFirstFound(const float &x, const float &y, float radius, NOTIFIER ¬ifier); template<class NOTIFIER> void VisitWorld(const float &x, const float &y, float radius, NOTIFIER ¬ifier); @@ -438,6 +438,7 @@ class Map : public GridRefManager<NGridType> void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = NULL); Creature* GetCreature(uint64 guid); GameObject* GetGameObject(uint64 guid); + Transport* GetTransport(uint64 guid); DynamicObject* GetDynamicObject(uint64 guid); MapInstanced* ToMapInstanced(){ if (Instanceable()) return reinterpret_cast<MapInstanced*>(this); else return NULL; } @@ -485,6 +486,9 @@ class Map : public GridRefManager<NGridType> static void DeleteRespawnTimesInDB(uint16 mapId, uint32 instanceId); + void SendInitTransports(Player* player); + void SendRemoveTransports(Player* player); + private: void LoadMapAndVMap(int gx, int gy); void LoadVMap(int gx, int gy); @@ -496,18 +500,21 @@ class Map : public GridRefManager<NGridType> void SendInitSelf(Player* player); - void SendInitTransports(Player* player); - void SendRemoveTransports(Player* player); - bool CreatureCellRelocation(Creature* creature, Cell new_cell); + bool GameObjectCellRelocation(GameObject* go, Cell new_cell); template<class T> void InitializeObject(T* obj); void AddCreatureToMoveList(Creature* c, float x, float y, float z, float ang); void RemoveCreatureFromMoveList(Creature* c); + void AddGameObjectToMoveList(GameObject* go, float x, float y, float z, float ang); + void RemoveGameObjectFromMoveList(GameObject* go); bool _creatureToMoveLock; std::vector<Creature*> _creaturesToMove; + bool _gameObjectsToMoveLock; + std::vector<GameObject*> _gameObjectsToMove; + bool IsGridLoaded(const GridCoord &) const; void EnsureGridCreated(const GridCoord &); void EnsureGridCreated_i(const GridCoord &); @@ -516,9 +523,6 @@ class Map : public GridRefManager<NGridType> void buildNGridLinkage(NGridType* pNGridType) { pNGridType->link(this); } - template<class T> void AddType(T *obj); - template<class T> void RemoveType(T *obj, bool); - NGridType* getNGrid(uint32 x, uint32 y) const { ASSERT(x < MAX_NUMBER_OF_GRIDS && y < MAX_NUMBER_OF_GRIDS); @@ -555,6 +559,11 @@ class Map : public GridRefManager<NGridType> ActiveNonPlayers m_activeNonPlayers; ActiveNonPlayers::iterator m_activeNonPlayersIter; + // Objects that must update even in inactive grids without activating them + typedef std::set<Transport*> TransportsContainer; + TransportsContainer _transports; + TransportsContainer::iterator _transportsUpdateIter; + private: Player* _GetScriptPlayerSourceOrTarget(Object* source, Object* target, const ScriptInfo* scriptInfo) const; Creature* _GetScriptCreatureSourceOrTarget(Object* source, Object* target, const ScriptInfo* scriptInfo, bool bReverse = false) const; @@ -589,19 +598,17 @@ class Map : public GridRefManager<NGridType> // Type specific code for add/remove to/from grid template<class T> - void AddToGrid(T* object, Cell const& cell); + void AddToGrid(T* object, Cell const& cell); template<class T> - void DeleteFromWorld(T*); + void DeleteFromWorld(T*); - template<class T> - void AddToActiveHelper(T* obj) + void AddToActiveHelper(WorldObject* obj) { m_activeNonPlayers.insert(obj); } - template<class T> - void RemoveFromActiveHelper(T* obj) + void RemoveFromActiveHelper(WorldObject* obj) { // Map::Update for active object in proccess if (m_activeNonPlayersIter != m_activeNonPlayers.end()) diff --git a/src/server/game/Maps/MapInstanced.h b/src/server/game/Maps/MapInstanced.h index 06a5f3e04a5..0955acc1432 100644 --- a/src/server/game/Maps/MapInstanced.h +++ b/src/server/game/Maps/MapInstanced.h @@ -30,7 +30,7 @@ class MapInstanced : public Map typedef UNORDERED_MAP< uint32, Map*> InstancedMaps; MapInstanced(uint32 id, time_t expiry); - ~MapInstanced() {} + ~MapInstanced() { } // functions overwrite Map versions void Update(const uint32); diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 60ebd3f8699..2d9366cba23 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -45,9 +45,7 @@ MapManager::MapManager() i_timer.SetInterval(sWorld->getIntConfig(CONFIG_INTERVAL_MAPUPDATE)); } -MapManager::~MapManager() -{ -} +MapManager::~MapManager() { } void MapManager::Initialize() { @@ -292,15 +290,11 @@ void MapManager::Update(uint32 diff) iter->second->DelayedUpdate(uint32(i_timer.GetCurrent())); sObjectAccessor->Update(uint32(i_timer.GetCurrent())); - for (TransportSet::iterator itr = m_Transports.begin(); itr != m_Transports.end(); ++itr) - (*itr)->Update(uint32(i_timer.GetCurrent())); i_timer.SetCurrent(0); } -void MapManager::DoDelayedMovesAndRemoves() -{ -} +void MapManager::DoDelayedMovesAndRemoves() { } bool MapManager::ExistMapAndVMap(uint32 mapid, float x, float y) { @@ -326,12 +320,6 @@ bool MapManager::IsValidMAP(uint32 mapid, bool startUp) void MapManager::UnloadAll() { - for (TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) - { - (*i)->RemoveFromWorld(); - delete *i; - } - for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();) { iter->second->UnloadAll(); diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index 8af609c61e2..230b4648f4a 100644 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -107,15 +107,6 @@ class MapManager void DoDelayedMovesAndRemoves(); - void LoadTransports(); - void LoadTransportNPCs(); - - typedef std::set<Transport*> TransportSet; - TransportSet m_Transports; - - typedef std::map<uint32, TransportSet> TransportMap; - TransportMap m_TransportsByMap; - bool CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck = false); void InitializeVisibilityDistanceInfo(); diff --git a/src/server/game/Maps/MapReference.h b/src/server/game/Maps/MapReference.h index f2f35e0955e..25c4b3870c5 100644 --- a/src/server/game/Maps/MapReference.h +++ b/src/server/game/Maps/MapReference.h @@ -42,7 +42,7 @@ class MapReference : public Reference<Map, Player> getTarget()->m_mapRefManager.decSize(); } public: - MapReference() : Reference<Map, Player>() {} + MapReference() : Reference<Map, Player>() { } ~MapReference() { unlink(); } MapReference* next() { return (MapReference*)Reference<Map, Player>::next(); } MapReference const* next() const { return (MapReference const*)Reference<Map, Player>::next(); } diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp index 5e5f520505c..f3a5a66bf66 100644 --- a/src/server/game/Maps/MapUpdater.cpp +++ b/src/server/game/Maps/MapUpdater.cpp @@ -58,9 +58,7 @@ class MapUpdateRequest : public ACE_Method_Request }; MapUpdater::MapUpdater(): -m_executor(), m_mutex(), m_condition(m_mutex), pending_requests(0) -{ -} +m_executor(), m_mutex(), m_condition(m_mutex), pending_requests(0) { } MapUpdater::~MapUpdater() { diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp new file mode 100644 index 00000000000..c0da12c5614 --- /dev/null +++ b/src/server/game/Maps/TransportMgr.cpp @@ -0,0 +1,471 @@ +/* + * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TransportMgr.h" +#include "Transport.h" +#include "InstanceScript.h" +#include "MoveSpline.h" +#include "MapManager.h" + +TransportTemplate::~TransportTemplate() +{ + // Collect shared pointers into a set to avoid deleting the same memory more than once + std::set<TransportSpline*> splines; + for (size_t i = 0; i < keyFrames.size(); ++i) + splines.insert(keyFrames[i].Spline); + + for (std::set<TransportSpline*>::iterator itr = splines.begin(); itr != splines.end(); ++itr) + delete *itr; +} + +TransportMgr::TransportMgr() { } + +TransportMgr::~TransportMgr() { } + +void TransportMgr::Unload() +{ + _transportTemplates.clear(); +} + +void TransportMgr::LoadTransportTemplates() +{ + uint32 oldMSTime = getMSTime(); + + QueryResult result = WorldDatabase.Query("SELECT entry FROM gameobject_template WHERE type = 15 ORDER BY entry ASC"); + + if (!result) + { + TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 transport templates. DB table `gameobject_template` has no transports!"); + return; + } + + uint32 count = 0; + + do + { + Field* fields = result->Fetch(); + uint32 entry = fields[0].GetUInt32(); + GameObjectTemplate const* goInfo = sObjectMgr->GetGameObjectTemplate(entry); + if (goInfo->moTransport.taxiPathId >= sTaxiPathNodesByPath.size()) + { + TC_LOG_ERROR(LOG_FILTER_SQL, "Transport %u (name: %s) has an invalid path specified in `gameobject_template`.`data0` (%u) field, skipped.", entry, goInfo->name.c_str(), goInfo->moTransport.taxiPathId); + continue; + } + + // paths are generated per template, saves us from generating it again in case of instanced transports + TransportTemplate& transport = _transportTemplates[entry]; + transport.entry = entry; + GeneratePath(goInfo, &transport); + + // transports in instance are only on one map + if (transport.inInstance) + _instanceTransports[*transport.mapsUsed.begin()].insert(entry); + + ++count; + } while (result->NextRow()); + + TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u transport templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +} + +void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTemplate* transport) +{ + uint32 pathId = goInfo->moTransport.taxiPathId; + TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathId]; + std::vector<KeyFrame>& keyFrames = transport->keyFrames; + Movement::PointsArray splinePath; + bool mapChange = false; + bool cyclic = true; + for (size_t i = 0; i < path.size(); ++i) + { + if (!mapChange) + { + TaxiPathNodeEntry const& node_i = path[i]; + if (i != path.size() - 1 && (node_i.actionFlag == 1 || node_i.mapid != path[i + 1].mapid)) + { + cyclic = false; + keyFrames.back().Teleport = true; + mapChange = true; + } + else + { + KeyFrame k(node_i); + keyFrames.push_back(k); + splinePath.push_back(G3D::Vector3(node_i.x, node_i.y, node_i.z)); + transport->mapsUsed.insert(k.Node->mapid); + } + } + else + mapChange = false; + } + + // Not sure if data8 means the transport can be stopped or that its path in dbc does not contain extra spline points + if (!goInfo->moTransport.canBeStopped && splinePath.size() >= 2) + { + // Remove special catmull-rom spline points + splinePath.erase(splinePath.begin()); + keyFrames.erase(keyFrames.begin()); + splinePath.pop_back(); + keyFrames.pop_back(); + // Cyclic spline has one more extra point + if (cyclic && !splinePath.empty()) + { + splinePath.pop_back(); + keyFrames.pop_back(); + } + } + + ASSERT(!keyFrames.empty()); + + if (transport->mapsUsed.size() > 1) + { + for (std::set<uint32>::const_iterator itr = transport->mapsUsed.begin(); itr != transport->mapsUsed.end(); ++itr) + ASSERT(!sMapStore.LookupEntry(*itr)->Instanceable()); + + transport->inInstance = false; + } + else + transport->inInstance = sMapStore.LookupEntry(*transport->mapsUsed.begin())->Instanceable(); + + // last to first is always "teleport", even for closed paths + keyFrames.back().Teleport = true; + + const float speed = float(goInfo->moTransport.moveSpeed); + const float accel = float(goInfo->moTransport.accelRate); + const float accel_dist = 0.5f * speed * speed / accel; + + transport->accelTime = speed / accel; + transport->accelDist = accel_dist; + + int32 firstStop = -1; + int32 lastStop = -1; + + // first cell is arrived at by teleportation :S + keyFrames[0].DistFromPrev = 0; + keyFrames[0].Index = 1; + if (keyFrames[0].IsStopFrame()) + { + firstStop = 0; + lastStop = 0; + } + + // find the rest of the distances between key points + // Every path segment has its own spline + if (cyclic) + { + TransportSpline* spline = new TransportSpline(); + spline->init_cyclic_spline(&splinePath[0], splinePath.size(), Movement::SplineBase::ModeCatmullrom, 0); + spline->initLengths(); + keyFrames[0].DistFromPrev = spline->length(spline->last() - 2, spline->last() - 1); + keyFrames[0].Spline = spline; + for (size_t i = 0; i < keyFrames.size(); ++i) + { + keyFrames[i].Index = i + 1; + keyFrames[i].DistFromPrev = spline->length(i, i + 1); + if (i > 0) + keyFrames[i - 1].NextDistFromPrev = keyFrames[i].DistFromPrev; + keyFrames[i].Spline = spline; + if (keyFrames[i].IsStopFrame()) + { + // remember first stop frame + if (firstStop == -1) + firstStop = i; + lastStop = i; + } + } + } + else + { + size_t start = 0; + for (size_t i = 1; i < keyFrames.size(); ++i) + { + if (keyFrames[i - 1].Teleport || i + 1 == keyFrames.size()) + { + size_t extra = !keyFrames[i - 1].Teleport ? 1 : 0; + TransportSpline* spline = new TransportSpline(); + spline->init_spline(&splinePath[start], i - start + extra, Movement::SplineBase::ModeCatmullrom); + spline->initLengths(); + for (size_t j = start; j < i + extra; ++j) + { + keyFrames[j].Index = j - start + 1; + keyFrames[j].DistFromPrev = spline->length(j - start, j + 1 - start); + if (j > 0) + keyFrames[j - 1].NextDistFromPrev = keyFrames[j].DistFromPrev; + keyFrames[j].Spline = spline; + } + + if (keyFrames[i - 1].Teleport) + { + keyFrames[i].Index = i - start + 1; + keyFrames[i].DistFromPrev = 0.0f; + keyFrames[i - 1].NextDistFromPrev = 0.0f; + keyFrames[i].Spline = spline; + } + + start = i; + } + + if (keyFrames[i].IsStopFrame()) + { + // remember first stop frame + if (firstStop == -1) + firstStop = i; + lastStop = i; + } + } + } + + keyFrames.back().NextDistFromPrev = keyFrames.front().DistFromPrev; + + if (firstStop == -1 || lastStop == -1) + firstStop = lastStop = 0; + + // at stopping keyframes, we define distSinceStop == 0, + // and distUntilStop is to the next stopping keyframe. + // this is required to properly handle cases of two stopping frames in a row (yes they do exist) + float tmpDist = 0.0f; + for (size_t i = 0; i < keyFrames.size(); ++i) + { + int32 j = (i + lastStop) % keyFrames.size(); + if (keyFrames[j].IsStopFrame() || j == lastStop) + tmpDist = 0.0f; + else + tmpDist += keyFrames[j].DistFromPrev; + keyFrames[j].DistSinceStop = tmpDist; + } + + tmpDist = 0.0f; + for (int32 i = int32(keyFrames.size()) - 1; i >= 0; i--) + { + int32 j = (i + firstStop) % keyFrames.size(); + tmpDist += keyFrames[(j + 1) % keyFrames.size()].DistFromPrev; + keyFrames[j].DistUntilStop = tmpDist; + if (keyFrames[j].IsStopFrame() || j == firstStop) + tmpDist = 0.0f; + } + + for (size_t i = 0; i < keyFrames.size(); ++i) + { + float total_dist = keyFrames[i].DistSinceStop + keyFrames[i].DistUntilStop; + if (total_dist < 2 * accel_dist) // won't reach full speed + { + if (keyFrames[i].DistSinceStop < keyFrames[i].DistUntilStop) // is still accelerating + { + // calculate accel+brake time for this short segment + float segment_time = 2.0f * sqrt((keyFrames[i].DistUntilStop + keyFrames[i].DistSinceStop) / accel); + // substract acceleration time + keyFrames[i].TimeTo = segment_time - sqrt(2 * keyFrames[i].DistSinceStop / accel); + } + else // slowing down + keyFrames[i].TimeTo = sqrt(2 * keyFrames[i].DistUntilStop / accel); + } + else if (keyFrames[i].DistSinceStop < accel_dist) // still accelerating (but will reach full speed) + { + // calculate accel + cruise + brake time for this long segment + float segment_time = (keyFrames[i].DistUntilStop + keyFrames[i].DistSinceStop) / speed + (speed / accel); + // substract acceleration time + keyFrames[i].TimeTo = segment_time - sqrt(2 * keyFrames[i].DistSinceStop / accel); + } + else if (keyFrames[i].DistUntilStop < accel_dist) // already slowing down (but reached full speed) + keyFrames[i].TimeTo = sqrt(2 * keyFrames[i].DistUntilStop / accel); + else // at full speed + keyFrames[i].TimeTo = (keyFrames[i].DistUntilStop / speed) + (0.5f * speed / accel); + } + + // calculate tFrom times from tTo times + float segmentTime = 0.0f; + for (size_t i = 0; i < keyFrames.size(); ++i) + { + int32 j = (i + lastStop) % keyFrames.size(); + if (keyFrames[j].IsStopFrame() || j == lastStop) + segmentTime = keyFrames[j].TimeTo; + keyFrames[j].TimeFrom = segmentTime - keyFrames[j].TimeTo; + } + + // calculate path times + keyFrames[0].ArriveTime = 0; + float curPathTime = 0.0f; + if (keyFrames[0].IsStopFrame()) + { + curPathTime = float(keyFrames[0].Node->delay); + keyFrames[0].DepartureTime = uint32(curPathTime * IN_MILLISECONDS); + } + + for (size_t i = 1; i < keyFrames.size(); ++i) + { + curPathTime += keyFrames[i - 1].TimeTo; + if (keyFrames[i].IsStopFrame()) + { + keyFrames[i].ArriveTime = uint32(curPathTime * IN_MILLISECONDS); + keyFrames[i - 1].NextArriveTime = keyFrames[i].ArriveTime; + curPathTime += float(keyFrames[i].Node->delay); + keyFrames[i].DepartureTime = uint32(curPathTime * IN_MILLISECONDS); + } + else + { + curPathTime -= keyFrames[i].TimeTo; + keyFrames[i].ArriveTime = uint32(curPathTime * IN_MILLISECONDS); + keyFrames[i - 1].NextArriveTime = keyFrames[i].ArriveTime; + keyFrames[i].DepartureTime = keyFrames[i].ArriveTime; + } + } + + keyFrames.back().NextArriveTime = keyFrames.back().DepartureTime; + + transport->pathTime = keyFrames.back().DepartureTime; +} + +void TransportMgr::AddPathNodeToTransport(uint32 transportEntry, uint32 timeSeg, TransportAnimationEntry const* node) +{ + TransportAnimation& animNode = _transportAnimations[transportEntry]; + if (animNode.TotalTime < timeSeg) + animNode.TotalTime = timeSeg; + + animNode.Path[timeSeg] = node; +} + +Transport* TransportMgr::CreateTransport(uint32 entry, uint32 guid /*= 0*/, Map* map /*= NULL*/) +{ + // instance case, execute GetGameObjectEntry hook + if (map) + { + // SetZoneScript() is called after adding to map, so fetch the script using map + if (map->IsDungeon()) + if (InstanceScript* instance = static_cast<InstanceMap*>(map)->GetInstanceScript()) + entry = instance->GetGameObjectEntry(0, entry); + + if (!entry) + return NULL; + } + + TransportTemplate const* tInfo = GetTransportTemplate(entry); + if (!tInfo) + { + TC_LOG_ERROR(LOG_FILTER_SQL, "Transport %u will not be loaded, `transport_template` missing", entry); + return NULL; + } + + // create transport... + Transport* trans = new Transport(); + + // ...at first waypoint + TaxiPathNodeEntry const* startNode = tInfo->keyFrames.begin()->Node; + uint32 mapId = startNode->mapid; + float x = startNode->x; + float y = startNode->y; + float z = startNode->z; + float o = 0.0f; + + // initialize the gameobject base + uint32 guidLow = guid ? guid : sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT); + if (!trans->Create(guidLow, entry, mapId, x, y, z, o, 255)) + { + delete trans; + return NULL; + } + + if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId)) + { + if (mapEntry->Instanceable() != tInfo->inInstance) + { + TC_LOG_ERROR(LOG_FILTER_TRANSPORTS, "Transport %u (name: %s) attempted creation in instance map (id: %u) but it is not an instanced transport!", entry, trans->GetName().c_str(), mapId); + delete trans; + return NULL; + } + } + + // use preset map for instances (need to know which instance) + trans->SetMap(map ? map : sMapMgr->CreateMap(mapId, NULL)); + if (map && map->IsDungeon()) + trans->m_zoneScript = map->ToInstanceMap()->GetInstanceScript(); + + // Passengers will be loaded once a player is near + + trans->GetMap()->AddToMap<Transport>(trans); + return trans; +} + +void TransportMgr::SpawnContinentTransports() +{ + if (_transportTemplates.empty()) + return; + + uint32 oldMSTime = getMSTime(); + + QueryResult result = WorldDatabase.Query("SELECT guid, entry FROM transports"); + + uint32 count = 0; + if (result) + { + do + { + Field* fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + uint32 entry = fields[1].GetUInt32(); + + if (TransportTemplate const* tInfo = GetTransportTemplate(entry)) + if (!tInfo->inInstance) + if (CreateTransport(entry, guid)) + ++count; + + } while (result->NextRow()); + } + + TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Spawned %u continent transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +} + +void TransportMgr::CreateInstanceTransports(Map* map) +{ + TransportInstanceMap::const_iterator mapTransports = _instanceTransports.find(map->GetId()); + + // no transports here + if (mapTransports == _instanceTransports.end() || mapTransports->second.empty()) + return; + + // create transports + for (std::set<uint32>::const_iterator itr = mapTransports->second.begin(); itr != mapTransports->second.end(); ++itr) + CreateTransport(*itr, 0, map); +} + +TransportAnimationEntry const* TransportAnimation::GetAnimNode(uint32 time) const +{ + if (Path.empty()) + return NULL; + + for (TransportPathContainer::const_reverse_iterator itr2 = Path.rbegin(); itr2 != Path.rend(); ++itr2) + if (time >= itr2->first) + return itr2->second; + + return Path.begin()->second; +} + +G3D::Quat TransportAnimation::GetAnimRotation(uint32 time) const +{ + if (Rotations.empty()) + return G3D::Quat(0.0f, 0.0f, 0.0f, 1.0f); + + TransportRotationEntry const* rot = Rotations.begin()->second; + for (TransportPathRotationContainer::const_reverse_iterator itr2 = Rotations.rbegin(); itr2 != Rotations.rend(); ++itr2) + { + if (time >= itr2->first) + { + rot = itr2->second; + break; + } + } + + return G3D::Quat(rot->X, rot->Y, rot->Z, rot->W); +} diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h new file mode 100644 index 00000000000..250a2c50bb1 --- /dev/null +++ b/src/server/game/Maps/TransportMgr.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TRANSPORTMGR_H +#define TRANSPORTMGR_H + +#include <ace/Singleton.h> +#include <G3D/Quat.h> +#include "Spline.h" +#include "DBCStores.h" + +struct KeyFrame; +struct GameObjectTemplate; +struct TransportTemplate; +class Transport; +class Map; + +typedef Movement::Spline<double> TransportSpline; +typedef std::vector<KeyFrame> KeyFrameVec; +typedef UNORDERED_MAP<uint32, TransportTemplate> TransportTemplates; +typedef std::set<Transport*> TransportSet; +typedef UNORDERED_MAP<uint32, TransportSet> TransportMap; +typedef UNORDERED_MAP<uint32, std::set<uint32> > TransportInstanceMap; + +struct KeyFrame +{ + explicit KeyFrame(TaxiPathNodeEntry const& _node) : Node(&_node), + DistSinceStop(-1.0f), DistUntilStop(-1.0f), DistFromPrev(-1.0f), TimeFrom(0.0f), TimeTo(0.0f), + Teleport(false), ArriveTime(0), DepartureTime(0), Spline(NULL), NextDistFromPrev(0.0f), NextArriveTime(0) + { + } + + uint32 Index; + TaxiPathNodeEntry const* Node; + float DistSinceStop; + float DistUntilStop; + float DistFromPrev; + float TimeFrom; + float TimeTo; + bool Teleport; + uint32 ArriveTime; + uint32 DepartureTime; + TransportSpline* Spline; + + // Data needed for next frame + float NextDistFromPrev; + uint32 NextArriveTime; + + bool IsTeleportFrame() const { return Teleport; } + bool IsStopFrame() const { return Node->actionFlag == 2; } +}; + +struct TransportTemplate +{ + TransportTemplate() : pathTime(0), accelTime(0.0f), accelDist(0.0f) { } + ~TransportTemplate(); + + std::set<uint32> mapsUsed; + bool inInstance; + uint32 pathTime; + KeyFrameVec keyFrames; + float accelTime; + float accelDist; + uint32 entry; +}; + +typedef std::map<uint32, TransportAnimationEntry const*> TransportPathContainer; +typedef std::map<uint32, TransportRotationEntry const*> TransportPathRotationContainer; + +struct TransportAnimation +{ + TransportPathContainer Path; + TransportPathRotationContainer Rotations; + uint32 TotalTime; + + TransportAnimationEntry const* GetAnimNode(uint32 time) const; + G3D::Quat GetAnimRotation(uint32 time) const; +}; + +typedef std::map<uint32, TransportAnimation> TransportAnimationContainer; + +class TransportMgr +{ + friend class ACE_Singleton<TransportMgr, ACE_Thread_Mutex>; + friend void LoadDBCStores(std::string const&); + + public: + void Unload(); + + void LoadTransportTemplates(); + + // Creates a transport using given GameObject template entry + Transport* CreateTransport(uint32 entry, uint32 guid = 0, Map* map = NULL); + + // Spawns all continent transports, used at core startup + void SpawnContinentTransports(); + + // creates all transports for instance + void CreateInstanceTransports(Map* map); + + TransportTemplate const* GetTransportTemplate(uint32 entry) const + { + TransportTemplates::const_iterator itr = _transportTemplates.find(entry); + if (itr != _transportTemplates.end()) + return &itr->second; + return NULL; + } + + TransportAnimation const* GetTransportAnimInfo(uint32 entry) const + { + TransportAnimationContainer::const_iterator itr = _transportAnimations.find(entry); + if (itr != _transportAnimations.end()) + return &itr->second; + + return NULL; + } + + private: + TransportMgr(); + ~TransportMgr(); + TransportMgr(TransportMgr const&); + TransportMgr& operator=(TransportMgr const&); + + // Generates and precaches a path for transport to avoid generation each time transport instance is created + void GeneratePath(GameObjectTemplate const* goInfo, TransportTemplate* transport); + + void AddPathNodeToTransport(uint32 transportEntry, uint32 timeSeg, TransportAnimationEntry const* node); + + void AddPathRotationToTransport(uint32 transportEntry, uint32 timeSeg, TransportRotationEntry const* node) + { + _transportAnimations[transportEntry].Rotations[timeSeg] = node; + } + + // Container storing transport templates + TransportTemplates _transportTemplates; + + // Container storing transport entries to create for instanced maps + TransportInstanceMap _instanceTransports; + + TransportAnimationContainer _transportAnimations; +}; + +#define sTransportMgr ACE_Singleton<TransportMgr, ACE_Thread_Mutex>::instance() + +#endif // TRANSPORTMGR_H diff --git a/src/server/game/Maps/ZoneScript.h b/src/server/game/Maps/ZoneScript.h index ce7168a4040..a745b94f466 100644 --- a/src/server/game/Maps/ZoneScript.h +++ b/src/server/game/Maps/ZoneScript.h @@ -26,8 +26,8 @@ class GameObject; class ZoneScript { public: - ZoneScript() {} - virtual ~ZoneScript() {} + ZoneScript() { } + virtual ~ZoneScript() { } virtual uint32 GetCreatureEntry(uint32 /*guidlow*/, CreatureData const* data) { return data->id; } virtual uint32 GetGameObjectEntry(uint32 /*guidlow*/, uint32 entry) { return entry; } @@ -42,13 +42,13 @@ class ZoneScript //All-purpose data storage 64 bit virtual uint64 GetData64(uint32 /*DataId*/) const { return 0; } - virtual void SetData64(uint32 /*DataId*/, uint64 /*Value*/) {} + virtual void SetData64(uint32 /*DataId*/, uint64 /*Value*/) { } //All-purpose data storage 32 bit virtual uint32 GetData(uint32 /*DataId*/) const { return 0; } - virtual void SetData(uint32 /*DataId*/, uint32 /*Value*/) {} + virtual void SetData(uint32 /*DataId*/, uint32 /*Value*/) { } - virtual void ProcessEvent(WorldObject* /*obj*/, uint32 /*eventId*/) {} + virtual void ProcessEvent(WorldObject* /*obj*/, uint32 /*eventId*/) { } }; #endif diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index c50db983845..327d7ed69fd 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -104,7 +104,7 @@ enum TrinityStrings LANG_RBAC_PERM_REVOKED = 78, LANG_RBAC_PERM_REVOKED_NOT_IN_LIST = 79, // Free 80 - 95 - + LANG_GUILD_RENAME_ALREADY_EXISTS = 96, LANG_GUILD_RENAME_DONE = 97, diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index c2daca325e4..81748f59b46 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1495,7 +1495,8 @@ enum GameObjectDynamicLowFlags GO_DYNFLAG_LO_ACTIVATE = 0x01, // enables interaction with GO GO_DYNFLAG_LO_ANIMATE = 0x02, // possibly more distinct animation of GO GO_DYNFLAG_LO_NO_INTERACT = 0x04, // appears to disable interaction (not fully verified) - GO_DYNFLAG_LO_SPARKLE = 0x08 // makes GO sparkle + GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle + GO_DYNFLAG_LO_STOPPED = 0x10 // Transport is stopped }; enum GameObjectDestructibleState @@ -3552,7 +3553,7 @@ struct MmapTileHeader bool usesLiquids : 1; MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION), - mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) {} + mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) { } }; enum NavTerrain diff --git a/src/server/game/Movement/MovementGenerator.cpp b/src/server/game/Movement/MovementGenerator.cpp index 408614833bb..b102f554c2f 100644 --- a/src/server/game/Movement/MovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerator.cpp @@ -18,6 +18,4 @@ #include "MovementGenerator.h" -MovementGenerator::~MovementGenerator() -{ -} +MovementGenerator::~MovementGenerator() { } diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h index 39394a75513..92195037e23 100755 --- a/src/server/game/Movement/MovementGenerator.h +++ b/src/server/game/Movement/MovementGenerator.h @@ -79,13 +79,13 @@ class MovementGeneratorMedium : public MovementGenerator struct SelectableMovement : public FactoryHolder<MovementGenerator, MovementGeneratorType> { - SelectableMovement(MovementGeneratorType mgt) : FactoryHolder<MovementGenerator, MovementGeneratorType>(mgt) {} + SelectableMovement(MovementGeneratorType mgt) : FactoryHolder<MovementGenerator, MovementGeneratorType>(mgt) { } }; template<class REAL_MOVEMENT> struct MovementGeneratorFactory : public SelectableMovement { - MovementGeneratorFactory(MovementGeneratorType mgt) : SelectableMovement(mgt) {} + MovementGeneratorFactory(MovementGeneratorType mgt) : SelectableMovement(mgt) { } MovementGenerator* Create(void *) const; }; diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h index da29b8aa12e..1fa9465d6e8 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h @@ -26,7 +26,7 @@ template<class T> class ConfusedMovementGenerator : public MovementGeneratorMedium< T, ConfusedMovementGenerator<T> > { public: - explicit ConfusedMovementGenerator() : i_nextMoveTime(0) {} + explicit ConfusedMovementGenerator() : i_nextMoveTime(0) { } void DoInitialize(T*); void DoFinalize(T*); diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h index 33a7c705564..b44bebdbfdf 100755 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h @@ -25,7 +25,7 @@ template<class T> class FleeingMovementGenerator : public MovementGeneratorMedium< T, FleeingMovementGenerator<T> > { public: - FleeingMovementGenerator(uint64 fright) : i_frightGUID(fright), i_nextCheckTime(0) {} + FleeingMovementGenerator(uint64 fright) : i_frightGUID(fright), i_nextCheckTime(0) { } void DoInitialize(T*); void DoFinalize(T*); @@ -47,7 +47,7 @@ class TimedFleeingMovementGenerator : public FleeingMovementGenerator<Creature> public: TimedFleeingMovementGenerator(uint64 fright, uint32 time) : FleeingMovementGenerator<Creature>(fright), - i_totalFleeTime(time) {} + i_totalFleeTime(time) { } MovementGeneratorType GetMovementGeneratorType() { return TIMED_FLEEING_MOTION_TYPE; } bool Update(Unit*, uint32); diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index a94ef5d4f87..2d9fe4dd27f 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -39,9 +39,7 @@ void HomeMovementGenerator<Creature>::DoFinalize(Creature* owner) } } -void HomeMovementGenerator<Creature>::DoReset(Creature*) -{ -} +void HomeMovementGenerator<Creature>::DoReset(Creature*) { } void HomeMovementGenerator<Creature>::_setTargetLocation(Creature* owner) { diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h index 3d6c6ab18c9..c5bf8879b7b 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h @@ -31,8 +31,8 @@ class HomeMovementGenerator<Creature> : public MovementGeneratorMedium< Creature { public: - HomeMovementGenerator() : arrived(false) {} - ~HomeMovementGenerator() {} + HomeMovementGenerator() : arrived(false) { } + ~HomeMovementGenerator() { } void DoInitialize(Creature*); void DoFinalize(Creature*); diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h index 0043891db2c..3c5b9c6d20f 100755 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h @@ -37,7 +37,7 @@ extern IdleMovementGenerator si_idleMovement; class RotateMovementGenerator : public MovementGenerator { public: - explicit RotateMovementGenerator(uint32 time, RotateDirection direction) : m_duration(time), m_maxDuration(time), m_direction(direction) {} + explicit RotateMovementGenerator(uint32 time, RotateDirection direction) : m_duration(time), m_maxDuration(time), m_direction(direction) { } void Initialize(Unit*); void Finalize(Unit*); @@ -53,7 +53,7 @@ class RotateMovementGenerator : public MovementGenerator class DistractMovementGenerator : public MovementGenerator { public: - explicit DistractMovementGenerator(uint32 timer) : m_timer(timer) {} + explicit DistractMovementGenerator(uint32 timer) : m_timer(timer) { } void Initialize(Unit*); void Finalize(Unit*); @@ -69,7 +69,7 @@ class AssistanceDistractMovementGenerator : public DistractMovementGenerator { public: AssistanceDistractMovementGenerator(uint32 timer) : - DistractMovementGenerator(timer) {} + DistractMovementGenerator(timer) { } MovementGeneratorType GetMovementGeneratorType() { return ASSISTANCE_DISTRACT_MOTION_TYPE; } void Finalize(Unit*); diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index 917872c5960..f4968b21bd8 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -102,9 +102,7 @@ void PointMovementGenerator<T>::DoReset(T* unit) } template<class T> -void PointMovementGenerator<T>::MovementInform(T* /*unit*/) -{ -} +void PointMovementGenerator<T>::MovementInform(T* /*unit*/) { } template <> void PointMovementGenerator<Creature>::MovementInform(Creature* unit) { diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h index 421736ca4ec..35e4afacb1a 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h @@ -27,7 +27,7 @@ class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementG { public: PointMovementGenerator(uint32 _id, float _x, float _y, float _z, bool _generatePath, float _speed = 0.0f) : id(_id), - i_x(_x), i_y(_y), i_z(_z), speed(_speed), m_generatePath(_generatePath), i_recalculateSpeed(false) {} + i_x(_x), i_y(_y), i_z(_z), speed(_speed), m_generatePath(_generatePath), i_recalculateSpeed(false) { } void DoInitialize(T*); void DoFinalize(T*); @@ -53,7 +53,7 @@ class AssistanceMovementGenerator : public PointMovementGenerator<Creature> { public: AssistanceMovementGenerator(float _x, float _y, float _z) : - PointMovementGenerator<Creature>(0, _x, _y, _z, true) {} + PointMovementGenerator<Creature>(0, _x, _y, _z, true) { } MovementGeneratorType GetMovementGeneratorType() { return ASSISTANCE_MOTION_TYPE; } void Finalize(Unit*); @@ -63,10 +63,10 @@ class AssistanceMovementGenerator : public PointMovementGenerator<Creature> class EffectMovementGenerator : public MovementGenerator { public: - explicit EffectMovementGenerator(uint32 Id) : m_Id(Id) {} - void Initialize(Unit*) {} + explicit EffectMovementGenerator(uint32 Id) : m_Id(Id) { } + void Initialize(Unit*) { } void Finalize(Unit*); - void Reset(Unit*) {} + void Reset(Unit*) { } bool Update(Unit*, uint32); MovementGeneratorType GetMovementGeneratorType() { return EFFECT_MOTION_TYPE; } private: diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index a6159e995fe..ef2807a5f48 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -25,7 +25,7 @@ template<class T> class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovementGenerator<T> > { public: - RandomMovementGenerator(float spawn_dist = 0.0f) : i_nextMoveTime(0), wander_distance(spawn_dist) {} + RandomMovementGenerator(float spawn_dist = 0.0f) : i_nextMoveTime(0), wander_distance(spawn_dist) { } void _setRandomLocation(T*); void DoInitialize(T*); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index f457443dc8c..f71eddd2f89 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -216,9 +216,7 @@ void ChaseMovementGenerator<T>::DoReset(T* owner) } template<class T> -void ChaseMovementGenerator<T>::MovementInform(T* /*unit*/) -{ -} +void ChaseMovementGenerator<T>::MovementInform(T* /*unit*/) { } template<> void ChaseMovementGenerator<Creature>::MovementInform(Creature* unit) @@ -290,9 +288,7 @@ void FollowMovementGenerator<T>::DoReset(T* owner) } template<class T> -void FollowMovementGenerator<T>::MovementInform(T* /*unit*/) -{ -} +void FollowMovementGenerator<T>::MovementInform(T* /*unit*/) { } template<> void FollowMovementGenerator<Creature>::MovementInform(Creature* unit) diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index 14d0ab0ec66..6358aa19cde 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -68,10 +68,10 @@ class ChaseMovementGenerator : public TargetedMovementGeneratorMedium<T, ChaseMo { public: ChaseMovementGenerator(Unit* target) - : TargetedMovementGeneratorMedium<T, ChaseMovementGenerator<T> >(target) {} + : TargetedMovementGeneratorMedium<T, ChaseMovementGenerator<T> >(target) { } ChaseMovementGenerator(Unit* target, float offset, float angle) - : TargetedMovementGeneratorMedium<T, ChaseMovementGenerator<T> >(target, offset, angle) {} - ~ChaseMovementGenerator() {} + : TargetedMovementGeneratorMedium<T, ChaseMovementGenerator<T> >(target, offset, angle) { } + ~ChaseMovementGenerator() { } MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; } @@ -92,10 +92,10 @@ class FollowMovementGenerator : public TargetedMovementGeneratorMedium<T, Follow { public: FollowMovementGenerator(Unit* target) - : TargetedMovementGeneratorMedium<T, FollowMovementGenerator<T> >(target){} + : TargetedMovementGeneratorMedium<T, FollowMovementGenerator<T> >(target){ } FollowMovementGenerator(Unit* target, float offset, float angle) - : TargetedMovementGeneratorMedium<T, FollowMovementGenerator<T> >(target, offset, angle) {} - ~FollowMovementGenerator() {} + : TargetedMovementGeneratorMedium<T, FollowMovementGenerator<T> >(target, offset, angle) { } + ~FollowMovementGenerator() { } MovementGeneratorType GetMovementGeneratorType() { return FOLLOW_MOTION_TYPE; } @@ -108,7 +108,7 @@ class FollowMovementGenerator : public TargetedMovementGeneratorMedium<T, Follow static void _addUnitStateMove(T* u) { u->AddUnitState(UNIT_STATE_FOLLOW_MOVE); } bool EnableWalking() const; bool _lostTarget(T*) const { return false; } - void _reachTarget(T*) {} + void _reachTarget(T*) { } private: void _updateSpeed(T* owner); }; diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 6311e629641..5506f74b221 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -20,6 +20,7 @@ //Extended headers #include "ObjectMgr.h" #include "World.h" +#include "Transport.h" //Flightmaster grid preloading #include "MapManager.h" //Creature-specific headers @@ -92,14 +93,37 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) { if (!i_path || i_path->empty()) return false; + if (Stopped()) return true; + bool transportPath = creature->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && creature->GetTransGUID(); + if (m_isArrivalDone) { if ((i_currentNode == i_path->size() - 1) && !repeating) // If that's our last waypoint { - creature->SetHomePosition(i_path->at(i_currentNode)->x, i_path->at(i_currentNode)->y, i_path->at(i_currentNode)->z, creature->GetOrientation()); + float x = i_path->at(i_currentNode)->x; + float y = i_path->at(i_currentNode)->y; + float z = i_path->at(i_currentNode)->z; + float o = creature->GetOrientation(); + + if (!transportPath) + creature->SetHomePosition(x, y, z, o); + else + { + if (Transport* trans = creature->GetTransport()) + { + o -= trans->GetOrientation(); + creature->SetTransportHomePosition(x, y, z, o); + trans->CalculatePassengerPosition(x, y, z, &o); + creature->SetHomePosition(x, y, z, o); + } + else + transportPath = false; + // else if (vehicle) - this should never happen, vehicle offsets are const + } + creature->GetMotionMaster()->Initialize(); return false; } @@ -113,7 +137,19 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) creature->AddUnitState(UNIT_STATE_ROAMING_MOVE); + Movement::Location formationDest(node->x, node->y, node->z, 0.0f); Movement::MoveSplineInit init(creature); + + //! If creature is on transport, we assume waypoints set in DB are already transport offsets + if (transportPath) + { + init.DisableTransportPathTransformations(); + if (TransportBase* trans = creature->GetDirectTransport()) + trans->CalculatePassengerPosition(formationDest.x, formationDest.y, formationDest.z, &formationDest.orientation); + } + + //! Do not use formationDest here, MoveTo requires transport offsets due to DisableTransportPathTransformations() call + //! but formationDest contains global coordinates init.MoveTo(node->x, node->y, node->z); //! Accepts angles such as 0.00001 and -0.00001, 0 must be ignored, default value in waypoint table @@ -125,7 +161,7 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) //Call for creature group update if (creature->GetFormation() && creature->GetFormation()->getLeader() == creature) - creature->GetFormation()->LeaderMoveTo(node->x, node->y, node->z); + creature->GetFormation()->LeaderMoveTo(formationDest.x, formationDest.y, formationDest.z); return true; } diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 72650570e12..c22b0c5296f 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -42,8 +42,8 @@ template<class T, class P> class PathMovementBase { public: - PathMovementBase() : i_path(NULL), i_currentNode(0) {} - virtual ~PathMovementBase() {}; + PathMovementBase() : i_path(NULL), i_currentNode(0) { } + virtual ~PathMovementBase() { }; // template pattern, not defined .. override required void LoadPath(T &); @@ -63,7 +63,7 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium< Crea { public: WaypointMovementGenerator(uint32 _path_id = 0, bool _repeating = true) - : i_nextMoveTime(0), m_isArrivalDone(false), path_id(_path_id), repeating(_repeating) {} + : i_nextMoveTime(0), m_isArrivalDone(false), path_id(_path_id), repeating(_repeating) { } ~WaypointMovementGenerator() { i_path = NULL; } void DoInitialize(Creature*); void DoFinalize(Creature*); diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index e786b78143a..ad7aa21a58c 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -92,7 +92,7 @@ inline uint32 computeDuration(float length, float velocity) struct FallInitializer { - FallInitializer(float _start_elevation) : start_elevation(_start_elevation) {} + FallInitializer(float _start_elevation) : start_elevation(_start_elevation) { } float start_elevation; inline int32 operator()(Spline<int32>& s, int32 i) { @@ -106,7 +106,7 @@ enum{ struct CommonInitializer { - CommonInitializer(float _velocity) : velocityInv(1000.f/_velocity), time(minimal_duration) {} + CommonInitializer(float _velocity) : velocityInv(1000.f/_velocity), time(minimal_duration) { } float velocityInv; int32 time; inline int32 operator()(Spline<int32>& s, int32 i) diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h index 75ea89bee81..209f978d658 100644 --- a/src/server/game/Movement/Spline/MoveSpline.h +++ b/src/server/game/Movement/Spline/MoveSpline.h @@ -26,10 +26,10 @@ namespace Movement { struct Location : public Vector3 { - Location() : orientation(0) {} - Location(float x, float y, float z, float o) : Vector3(x, y, z), orientation(o) {} - Location(const Vector3& v) : Vector3(v), orientation(0) {} - Location(const Vector3& v, float o) : Vector3(v), orientation(o) {} + Location() : orientation(0) { } + Location(float x, float y, float z, float o) : Vector3(x, y, z), orientation(o) { } + Location(const Vector3& v) : Vector3(v), orientation(0) { } + Location(const Vector3& v, float o) : Vector3(v), orientation(o) { } float orientation; }; diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h index 474541cbf15..12c22898b6d 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -36,9 +36,9 @@ namespace Movement uint64 target; float angle; - FacingInfo(float o) : angle(o) {} - FacingInfo(uint64 t) : target(t) {} - FacingInfo() {} + FacingInfo(float o) : angle(o) { } + FacingInfo(uint64 t) : target(t) { } + FacingInfo() { } }; struct MoveSplineInitArgs diff --git a/src/server/game/Movement/Spline/Spline.h b/src/server/game/Movement/Spline/Spline.h index d4b100ee46e..dab31e957f1 100644 --- a/src/server/game/Movement/Spline/Spline.h +++ b/src/server/game/Movement/Spline/Spline.h @@ -86,7 +86,7 @@ protected: public: - explicit SplineBase() : index_lo(0), index_hi(0), m_mode(UninitializedMode), cyclic(false) {} + explicit SplineBase() : index_lo(0), index_hi(0), m_mode(UninitializedMode), cyclic(false) { } /** Caclulates the position for given segment Idx, and percent of segment length t @param t - percent of segment length, assumes that t in range [0, 1] @@ -144,7 +144,7 @@ protected: index_type computeIndexInBounds(length_type length) const; public: - explicit Spline(){} + explicit Spline(){ } /** Calculates the position for given t @param t - percent of spline's length, assumes that t in range [0, 1]. */ diff --git a/src/server/game/Movement/Waypoints/WaypointManager.cpp b/src/server/game/Movement/Waypoints/WaypointManager.cpp index 27df7b8a47f..406ac95322a 100644 --- a/src/server/game/Movement/Waypoints/WaypointManager.cpp +++ b/src/server/game/Movement/Waypoints/WaypointManager.cpp @@ -22,9 +22,7 @@ #include "MapManager.h" #include "Log.h" -WaypointMgr::WaypointMgr() -{ -} +WaypointMgr::WaypointMgr() { } WaypointMgr::~WaypointMgr() { diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 73b5399fa89..4d68e03a1c6 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -231,9 +231,7 @@ void OutdoorPvP::DeleteSpawns() m_capturePoints.clear(); } -OutdoorPvP::OutdoorPvP() : m_sendUpdate(true) -{ -} +OutdoorPvP::OutdoorPvP() : m_sendUpdate(true) { } OutdoorPvP::~OutdoorPvP() { @@ -257,9 +255,7 @@ void OutdoorPvP::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/) TC_LOG_DEBUG(LOG_FILTER_OUTDOORPVP, "Player %s left an outdoorpvp zone", player->GetName().c_str()); } -void OutdoorPvP::HandlePlayerResurrects(Player* /*player*/, uint32 /*zone*/) -{ -} +void OutdoorPvP::HandlePlayerResurrects(Player* /*player*/, uint32 /*zone*/) { } bool OutdoorPvP::Update(uint32 diff) { diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.h b/src/server/game/OutdoorPvP/OutdoorPvP.h index 1e23f87a52e..30b9d5c58fc 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.h +++ b/src/server/game/OutdoorPvP/OutdoorPvP.h @@ -93,9 +93,9 @@ class OPvPCapturePoint OPvPCapturePoint(OutdoorPvP* pvp); - virtual ~OPvPCapturePoint() {} + virtual ~OPvPCapturePoint() { } - virtual void FillInitialWorldStates(WorldPacket & /*data*/) {} + virtual void FillInitialWorldStates(WorldPacket & /*data*/) { } // send world state update to all players present void SendUpdateWorldState(uint32 field, uint32 value); @@ -119,7 +119,7 @@ class OPvPCapturePoint virtual void ChangeState() = 0; - virtual void ChangeTeam(TeamId /*oldTeam*/) {} + virtual void ChangeTeam(TeamId /*oldTeam*/) { } virtual void SendChangePhase(); @@ -205,7 +205,7 @@ class OutdoorPvP : public ZoneScript typedef std::map<uint32/*lowguid*/, OPvPCapturePoint*> OPvPCapturePointMap; - virtual void FillInitialWorldStates(WorldPacket & /*data*/) {} + virtual void FillInitialWorldStates(WorldPacket & /*data*/) { } // called when a player triggers an areatrigger virtual bool HandleAreaTrigger(Player* player, uint32 trigger); @@ -221,7 +221,7 @@ class OutdoorPvP : public ZoneScript void OnGameObjectCreate(GameObject* go); void OnGameObjectRemove(GameObject* go); - void OnCreatureCreate(Creature*) {} + void OnCreatureCreate(Creature*) { } // send world state update to all players present void SendUpdateWorldState(uint32 field, uint32 value); @@ -231,13 +231,13 @@ class OutdoorPvP : public ZoneScript // handle npc/player kill virtual void HandleKill(Player* killer, Unit* killed); - virtual void HandleKillImpl(Player* /*killer*/, Unit* /*killed*/) {} + virtual void HandleKillImpl(Player* /*killer*/, Unit* /*killed*/) { } // checks if player is in range of a capture credit marker bool IsInsideObjective(Player* player) const; // awards rewards for player kill - virtual void AwardKillBonus(Player* /*player*/) {} + virtual void AwardKillBonus(Player* /*player*/) { } uint32 GetTypeId() {return m_TypeId;} @@ -261,7 +261,7 @@ class OutdoorPvP : public ZoneScript bool m_sendUpdate; // world state stuff - virtual void SendRemoveWorldStates(Player* /*player*/) {} + virtual void SendRemoveWorldStates(Player* /*player*/) { } void BroadcastPacket(WorldPacket & data) const; diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h index 8a93987c878..2d8acb56252 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h +++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h @@ -42,7 +42,7 @@ class OutdoorPvPMgr private: OutdoorPvPMgr(); - ~OutdoorPvPMgr() {}; + ~OutdoorPvPMgr() { }; public: // create outdoor pvp events diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 1ea2ff9894a..8cb0c8e6191 100644 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -525,22 +525,16 @@ void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* obj) // Nothing to do for a child Pool template <> -void PoolGroup<Pool>::ReSpawn1Object(PoolObject* /*obj*/) -{ -} +void PoolGroup<Pool>::ReSpawn1Object(PoolObject* /*obj*/) { } // Nothing to do for a quest template <> -void PoolGroup<Quest>::ReSpawn1Object(PoolObject* /*obj*/) -{ -} +void PoolGroup<Quest>::ReSpawn1Object(PoolObject* /*obj*/) { } //////////////////////////////////////////////////////////// // Methods of class PoolMgr -PoolMgr::PoolMgr() : max_pool_id(0) -{ -} +PoolMgr::PoolMgr() : max_pool_id(0) { } void PoolMgr::Initialize() { diff --git a/src/server/game/Pools/PoolMgr.h b/src/server/game/Pools/PoolMgr.h index 8a9b4a953dd..c5ded289215 100644 --- a/src/server/game/Pools/PoolMgr.h +++ b/src/server/game/Pools/PoolMgr.h @@ -34,7 +34,7 @@ struct PoolObject { uint32 guid; float chance; - PoolObject(uint32 _guid, float _chance): guid(_guid), chance(fabs(_chance)) {} + PoolObject(uint32 _guid, float _chance): guid(_guid), chance(fabs(_chance)) { } }; class Pool // for Pool of Pool case @@ -73,7 +73,7 @@ class PoolGroup public: explicit PoolGroup() : poolId(0) { } void SetPoolId(uint32 pool_id) { poolId = pool_id; } - ~PoolGroup() {}; + ~PoolGroup() { }; bool isEmpty() const { return ExplicitlyChanced.empty() && EqualChanced.empty(); } void AddEntry(PoolObject& poolitem, uint32 maxentries); bool CheckPool() const; @@ -108,7 +108,7 @@ class PoolMgr private: PoolMgr(); - ~PoolMgr() {}; + ~PoolMgr() { }; public: void LoadFromDB(); diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h index adc1df32f8a..e02cc5b62e0 100644 --- a/src/server/game/Reputation/ReputationMgr.h +++ b/src/server/game/Reputation/ReputationMgr.h @@ -65,8 +65,8 @@ class ReputationMgr { public: // constructors and global modifiers explicit ReputationMgr(Player* owner) : _player(owner), - _visibleFactionCount(0), _honoredFactionCount(0), _reveredFactionCount(0), _exaltedFactionCount(0), _sendFactionIncreased(false) {} - ~ReputationMgr() {} + _visibleFactionCount(0), _honoredFactionCount(0), _reveredFactionCount(0), _exaltedFactionCount(0), _sendFactionIncreased(false) { } + ~ReputationMgr() { } void SaveToDB(SQLTransaction& trans); void LoadFromDB(PreparedQueryResult result); diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index c37cdf80730..ff133272724 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -315,6 +315,7 @@ void Map::ScriptsProcess() case HIGHGUID_PLAYER: source = HashMapHolder<Player>::Find(step.sourceGUID); break; + case HIGHGUID_TRANSPORT: case HIGHGUID_GAMEOBJECT: source = HashMapHolder<GameObject>::Find(step.sourceGUID); break; @@ -322,15 +323,11 @@ void Map::ScriptsProcess() source = HashMapHolder<Corpse>::Find(step.sourceGUID); break; case HIGHGUID_MO_TRANSPORT: - for (MapManager::TransportSet::iterator itr2 = sMapMgr->m_Transports.begin(); itr2 != sMapMgr->m_Transports.end(); ++itr2) - { - if ((*itr2)->GetGUID() == step.sourceGUID) - { - source = *itr2; - break; - } - } + { + GameObject* go = HashMapHolder<GameObject>::Find(step.sourceGUID); + source = go ? go->ToTransport() : NULL; break; + } default: TC_LOG_ERROR(LOG_FILTER_TSCR, "%s source with unsupported high guid (GUID: " UI64FMTD ", high guid: %u).", step.script->GetDebugInfo().c_str(), step.sourceGUID, GUID_HIPART(step.sourceGUID)); @@ -353,12 +350,19 @@ void Map::ScriptsProcess() case HIGHGUID_PLAYER: // empty GUID case also target = HashMapHolder<Player>::Find(step.targetGUID); break; + case HIGHGUID_TRANSPORT: case HIGHGUID_GAMEOBJECT: target = HashMapHolder<GameObject>::Find(step.targetGUID); break; case HIGHGUID_CORPSE: target = HashMapHolder<Corpse>::Find(step.targetGUID); break; + case HIGHGUID_MO_TRANSPORT: + { + GameObject* go = HashMapHolder<GameObject>::Find(step.targetGUID); + target = go ? go->ToTransport() : NULL; + break; + } default: TC_LOG_ERROR(LOG_FILTER_TSCR, "%s target with unsupported high guid (GUID: " UI64FMTD ", high guid: %u).", step.script->GetDebugInfo().c_str(), step.targetGUID, GUID_HIPART(step.targetGUID)); diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index fb96c327b05..c74cf1735ff 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -176,13 +176,9 @@ struct TSpellSummary } *SpellSummary; ScriptMgr::ScriptMgr() - : _scriptCount(0), _scheduledScripts(0) -{ -} + : _scriptCount(0), _scheduledScripts(0) { } -ScriptMgr::~ScriptMgr() -{ -} +ScriptMgr::~ScriptMgr() { } void ScriptMgr::Initialize() { @@ -1363,12 +1359,12 @@ void ScriptMgr::OnGroupDisband(Group* group) } // Unit -void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32 gain) +void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain) { FOREACH_SCRIPT(UnitScript)->OnHeal(healer, reciever, gain); } -void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32 damage) +void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage) { FOREACH_SCRIPT(UnitScript)->OnDamage(attacker, victim, damage); } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index a3eff880bb9..37a95c77254 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -396,11 +396,11 @@ class UnitScript : public ScriptObject UnitScript(const char* name, bool addToScripts = true); public: - // Called when a unit deals damage to another unit - virtual void OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32 /*gain*/) { } + // Called when a unit deals healing to another unit + virtual void OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32& /*gain*/) { } // Called when a unit deals damage to another unit - virtual void OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32 /*damage*/) { } + virtual void OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32& /*damage*/) { } // Called when DoT's Tick Damage is being Dealt virtual void ModifyPeriodicDamageAurasTick(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) { } @@ -1060,8 +1060,8 @@ class ScriptMgr public: /* UnitScript */ - void OnHeal(Unit* healer, Unit* reciever, uint32 gain); - void OnDamage(Unit* attacker, Unit* victim, uint32 damage); + void OnHeal(Unit* healer, Unit* reciever, uint32& gain); + void OnDamage(Unit* attacker, Unit* victim, uint32& damage); void ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage); void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage); void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage); diff --git a/src/server/game/Scripting/ScriptSystem.h b/src/server/game/Scripting/ScriptSystem.h index 0641cebd18f..af2e50bae36 100644 --- a/src/server/game/Scripting/ScriptSystem.h +++ b/src/server/game/Scripting/ScriptSystem.h @@ -49,8 +49,8 @@ typedef std::vector<ScriptPointMove> ScriptPointVector; class SystemMgr { friend class ACE_Singleton<SystemMgr, ACE_Null_Mutex>; - SystemMgr() {} - ~SystemMgr() {} + SystemMgr() { } + ~SystemMgr() { } public: typedef UNORDERED_MAP<uint32, ScriptPointVector> PointMoveMap; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index c60b09438c1..c33c12ae5d4 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -272,6 +272,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) //! delayed packets that were re-enqueued due to improper timing. To prevent an infinite //! loop caused by re-enqueueing the same packets over and over again, we stop updating this session //! and continue updating others. The re-enqueued packets will be handled in the next Update call for this session. + uint32 processedPackets = 0; + while (m_Socket && !m_Socket->IsClosed() && !_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket && _recvQueue.next(packet, updater)) @@ -383,6 +385,14 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) delete packet; deletePacket = true; + +#define MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE 100 + processedPackets++; + + //process only a max amout of packets in 1 Update() call. + //Any leftover will be processed in next update + if (processedPackets > MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE) + break; } if (m_Socket && !m_Socket->IsClosed() && _warden) @@ -786,10 +796,6 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) if (mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT)) data >> mi->transport.time2; - - if (mi->pos.m_positionX != mi->transport.pos.m_positionX) - if (GetPlayer()->GetTransport()) - GetPlayer()->GetTransport()->UpdatePosition(mi); } if (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (mi->HasExtraMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))) diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 3842a4577de..099bfe8e2b2 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -86,7 +86,7 @@ enum AccountDataType struct AccountData { - AccountData() : Time(0), Data("") {} + AccountData() : Time(0), Data("") { } time_t Time; std::string Data; @@ -130,8 +130,8 @@ enum CharterTypes class PacketFilter { public: - explicit PacketFilter(WorldSession* pSession) : m_pSession(pSession) {} - virtual ~PacketFilter() {} + explicit PacketFilter(WorldSession* pSession) : m_pSession(pSession) { } + virtual ~PacketFilter() { } virtual bool Process(WorldPacket* /*packet*/) { return true; } virtual bool ProcessLogout() const { return true; } @@ -143,8 +143,8 @@ protected: class MapSessionFilter : public PacketFilter { public: - explicit MapSessionFilter(WorldSession* pSession) : PacketFilter(pSession) {} - ~MapSessionFilter() {} + explicit MapSessionFilter(WorldSession* pSession) : PacketFilter(pSession) { } + ~MapSessionFilter() { } virtual bool Process(WorldPacket* packet); //in Map::Update() we do not process player logout! @@ -156,8 +156,8 @@ public: class WorldSessionFilter : public PacketFilter { public: - explicit WorldSessionFilter(WorldSession* pSession) : PacketFilter(pSession) {} - ~WorldSessionFilter() {} + explicit WorldSessionFilter(WorldSession* pSession) : PacketFilter(pSession) { } + ~WorldSessionFilter() { } virtual bool Process(WorldPacket* packet); }; @@ -173,7 +173,7 @@ class CharacterCreateInfo CharacterCreateInfo(std::string const& name, uint8 race, uint8 cclass, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId, WorldPacket& data) : Name(name), Race(race), Class(cclass), Gender(gender), Skin(skin), Face(face), HairStyle(hairStyle), HairColor(hairColor), FacialHair(facialHair), OutfitId(outfitId), Data(data), CharCount(0) - {} + { } /// User specified variables std::string Name; @@ -923,7 +923,7 @@ class WorldSession { friend class World; public: - DosProtection(WorldSession* s) : Session(s), _policy((Policy)sWorld->getIntConfig(CONFIG_PACKET_SPOOF_POLICY)) {} + DosProtection(WorldSession* s) : Session(s), _policy((Policy)sWorld->getIntConfig(CONFIG_PACKET_SPOOF_POLICY)) { } bool EvaluateOpcode(WorldPacket& p) const; void AllowOpcode(uint16 opcode, bool allow) { _isOpcodeAllowed[opcode] = allow; } protected: diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp index 57a77773d52..12da93fb537 100644 --- a/src/server/game/Server/WorldSocketMgr.cpp +++ b/src/server/game/Server/WorldSocketMgr.cpp @@ -217,9 +217,7 @@ WorldSocketMgr::WorldSocketMgr() : m_SockOutKBuff(-1), m_SockOutUBuff(65536), m_UseNoDelay(true), - m_Acceptor (0) -{ -} + m_Acceptor (0) { } WorldSocketMgr::~WorldSocketMgr() { diff --git a/src/server/game/Skills/SkillDiscovery.cpp b/src/server/game/Skills/SkillDiscovery.cpp index 27e7f66fd1a..94fd0ac4428 100644 --- a/src/server/game/Skills/SkillDiscovery.cpp +++ b/src/server/game/Skills/SkillDiscovery.cpp @@ -33,10 +33,10 @@ struct SkillDiscoveryEntry float chance; // chance SkillDiscoveryEntry() - : spellId(0), reqSkillValue(0), chance(0) {} + : spellId(0), reqSkillValue(0), chance(0) { } SkillDiscoveryEntry(uint32 _spellId, uint32 req_skill_val, float _chance) - : spellId(_spellId), reqSkillValue(req_skill_val), chance(_chance) {} + : spellId(_spellId), reqSkillValue(req_skill_val), chance(_chance) { } }; typedef std::list<SkillDiscoveryEntry> SkillDiscoveryList; diff --git a/src/server/game/Skills/SkillExtraItems.cpp b/src/server/game/Skills/SkillExtraItems.cpp index 66ad6fc190a..ddd8d1908fa 100644 --- a/src/server/game/Skills/SkillExtraItems.cpp +++ b/src/server/game/Skills/SkillExtraItems.cpp @@ -37,10 +37,10 @@ struct SkillExtraItemEntry uint8 additionalMaxNum; SkillExtraItemEntry() - : requiredSpecialization(0), additionalCreateChance(0.0f), additionalMaxNum(0) {} + : requiredSpecialization(0), additionalCreateChance(0.0f), additionalMaxNum(0) { } SkillExtraItemEntry(uint32 rS, float aCC, uint8 aMN) - : requiredSpecialization(rS), additionalCreateChance(aCC), additionalMaxNum(aMN) {} + : requiredSpecialization(rS), additionalCreateChance(aCC), additionalMaxNum(aMN) { } }; // map to store the extra item creation info, the key is the spellId of the creation spell, the mapped value is the assigned SkillExtraItemEntry diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 4b73af1b681..3309a8c010e 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -350,7 +350,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleAuraModCritPct, //290 SPELL_AURA_MOD_CRIT_PCT &AuraEffect::HandleNoImmediateEffect, //291 SPELL_AURA_MOD_XP_QUEST_PCT implemented in Player::RewardQuest &AuraEffect::HandleAuraOpenStable, //292 SPELL_AURA_OPEN_STABLE - &AuraEffect::HandleAuraOverrideSpells, //293 auras which probably add set of abilities to their target based on it's miscvalue + &AuraEffect::HandleAuraOverrideSpells, //293 SPELL_AURA_OVERRIDE_SPELLS auras which probably add set of abilities to their target based on it's miscvalue &AuraEffect::HandleNoImmediateEffect, //294 SPELL_AURA_PREVENT_REGENERATE_POWER implemented in Player::Regenerate(Powers power) &AuraEffect::HandleUnused, //295 0 spells in 3.3.5 &AuraEffect::HandleAuraSetVehicle, //296 SPELL_AURA_SET_VEHICLE_ID sets vehicle on target @@ -2301,7 +2301,10 @@ void AuraEffect::HandleAuraModPacify(AuraApplication const* aurApp, uint8 mode, Unit* target = aurApp->GetTarget(); if (apply) + { target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + target->AttackStop(); + } else { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 7cfb1e04850..ddd6c1127e1 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -317,11 +317,11 @@ namespace Trinity // Wards if ((spellProtoA->SpellFamilyName == SPELLFAMILY_MAGE) || (spellProtoA->SpellFamilyName == SPELLFAMILY_WARLOCK)) - if (spellProtoA->Category == 56) + if (spellProtoA->GetCategory() == 56) return true; if ((spellProtoB->SpellFamilyName == SPELLFAMILY_MAGE) || (spellProtoB->SpellFamilyName == SPELLFAMILY_WARLOCK)) - if (spellProtoB->Category == 56) + if (spellProtoB->GetCategory() == 56) return false; // Sacred Shield @@ -343,9 +343,9 @@ namespace Trinity return false; // Ice Barrier - if (spellProtoA->Category == 471) + if (spellProtoA->GetCategory() == 471) return true; - if (spellProtoB->Category == 471) + if (spellProtoB->GetCategory() == 471) return false; // Sacrifice diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index d7b8003f19a..4b6423503c1 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -413,7 +413,7 @@ void Aura::_ApplyForTarget(Unit* target, Unit* caster, AuraApplication * auraApp // set infinity cooldown state for spells if (caster && caster->GetTypeId() == TYPEID_PLAYER) { - if (m_spellInfo->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + if (m_spellInfo->IsCooldownStartedOnEvent()) { Item* castItem = m_castItemGuid ? caster->ToPlayer()->GetItemByGuid(m_castItemGuid) : NULL; caster->ToPlayer()->AddSpellAndCategoryCooldowns(m_spellInfo, castItem ? castItem->GetEntry() : 0, NULL, true); @@ -446,7 +446,7 @@ void Aura::_UnapplyForTarget(Unit* target, Unit* caster, AuraApplication * auraA // reset cooldown state for spells if (caster && caster->GetTypeId() == TYPEID_PLAYER) { - if (GetSpellInfo()->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + if (GetSpellInfo()->IsCooldownStartedOnEvent()) // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases) caster->ToPlayer()->SendCooldownEvent(GetSpellInfo()); } @@ -1279,7 +1279,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b break; case SPELLFAMILY_ROGUE: // Sprint (skip non player casted spells by category) - if (GetSpellInfo()->SpellFamilyFlags[0] & 0x40 && GetSpellInfo()->Category == 44) + if (GetSpellInfo()->SpellFamilyFlags[0] & 0x40 && GetSpellInfo()->GetCategory() == 44) // in official maybe there is only one icon? if (target->HasAura(58039)) // Glyph of Blurred Speed target->CastSpell(target, 61922, true); // Sprint (waterwalk) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 5f0b0135f58..94c0c54e065 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -99,9 +99,7 @@ SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0), m_strTarget() m_targetMask = 0; } -SpellCastTargets::~SpellCastTargets() -{ -} +SpellCastTargets::~SpellCastTargets() { } void SpellCastTargets::Read(ByteBuffer& data, Unit* caster) { @@ -2680,7 +2678,9 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA m_diminishLevel = unit->GetDiminishing(m_diminishGroup); DiminishingReturnsType type = GetDiminishingReturnsGroupType(m_diminishGroup); // Increase Diminishing on unit, current informations for actually casts will use values above - if ((type == DRTYPE_PLAYER && unit->GetCharmerOrOwnerPlayerOrPlayerItself()) || type == DRTYPE_ALL) + if ((type == DRTYPE_PLAYER && + (unit->GetCharmerOrOwnerPlayerOrPlayerItself() || (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) || + type == DRTYPE_ALL) unit->IncrDiminishing(m_diminishGroup); } @@ -3550,7 +3550,7 @@ void Spell::SendSpellCooldown() return; // mana/health/etc potions, disabled by client (until combat out as declarate) - if (m_CastItem && m_CastItem->IsPotion()) + if (m_CastItem && (m_CastItem->IsPotion() || m_spellInfo->IsCooldownStartedOnEvent())) { // need in some way provided data for Spell::finish SendCooldownEvent _player->SetLastPotionId(m_CastItem->GetEntry()); @@ -3558,7 +3558,7 @@ void Spell::SendSpellCooldown() } // have infinity cooldown but set at aura apply // do not set cooldown for triggered spells (needed by reincarnation) - if (m_spellInfo->Attributes & (SPELL_ATTR0_DISABLED_WHILE_ACTIVE | SPELL_ATTR0_PASSIVE) || (_triggeredCastFlags & TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)) + if (m_spellInfo->IsCooldownStartedOnEvent() || m_spellInfo->IsPassive() || (_triggeredCastFlags & TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)) return; _player->AddSpellAndCategoryCooldowns(m_spellInfo, m_CastItem ? m_CastItem->GetEntry() : 0, this); @@ -7372,9 +7372,7 @@ bool WorldObjectSpellTargetCheck::operator()(WorldObject* target) WorldObjectSpellNearbyTargetCheck::WorldObjectSpellNearbyTargetCheck(float range, Unit* caster, SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionList* condList) - : WorldObjectSpellTargetCheck(caster, caster, spellInfo, selectionType, condList), _range(range), _position(caster) -{ -} + : WorldObjectSpellTargetCheck(caster, caster, spellInfo, selectionType, condList), _range(range), _position(caster) { } bool WorldObjectSpellNearbyTargetCheck::operator()(WorldObject* target) { @@ -7389,9 +7387,7 @@ bool WorldObjectSpellNearbyTargetCheck::operator()(WorldObject* target) WorldObjectSpellAreaTargetCheck::WorldObjectSpellAreaTargetCheck(float range, Position const* position, Unit* caster, Unit* referer, SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionList* condList) - : WorldObjectSpellTargetCheck(caster, referer, spellInfo, selectionType, condList), _range(range), _position(position) -{ -} + : WorldObjectSpellTargetCheck(caster, referer, spellInfo, selectionType, condList), _range(range), _position(position) { } bool WorldObjectSpellAreaTargetCheck::operator()(WorldObject* target) { @@ -7402,9 +7398,7 @@ bool WorldObjectSpellAreaTargetCheck::operator()(WorldObject* target) WorldObjectSpellConeTargetCheck::WorldObjectSpellConeTargetCheck(float coneAngle, float range, Unit* caster, SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionList* condList) - : WorldObjectSpellAreaTargetCheck(range, caster, caster, caster, spellInfo, selectionType, condList), _coneAngle(coneAngle) -{ -} + : WorldObjectSpellAreaTargetCheck(range, caster, caster, caster, spellInfo, selectionType, condList), _coneAngle(coneAngle) { } bool WorldObjectSpellConeTargetCheck::operator()(WorldObject* target) { @@ -7427,9 +7421,7 @@ bool WorldObjectSpellConeTargetCheck::operator()(WorldObject* target) } WorldObjectSpellTrajTargetCheck::WorldObjectSpellTrajTargetCheck(float range, Position const* position, Unit* caster, SpellInfo const* spellInfo) - : WorldObjectSpellAreaTargetCheck(range, position, caster, caster, spellInfo, TARGET_CHECK_DEFAULT, NULL) -{ -} + : WorldObjectSpellAreaTargetCheck(range, position, caster, caster, spellInfo, TARGET_CHECK_DEFAULT, NULL) { } bool WorldObjectSpellTrajTargetCheck::operator()(WorldObject* target) { diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 562d7fee518..e580a3d0f2d 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -369,7 +369,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) case SPELLFAMILY_WARRIOR: { // Shield Slam - if (m_spellInfo->SpellFamilyFlags[1] & 0x200 && m_spellInfo->Category == 1209) + if (m_spellInfo->SpellFamilyFlags[1] & 0x200 && m_spellInfo->GetCategory() == 1209) { uint8 level = m_caster->getLevel(); uint32 block_value = m_caster->GetShieldBlockValue(uint32(float(level) * 24.5f), uint32(float(level) * 34.5f)); @@ -943,7 +943,7 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex) // Remove spell cooldown (not category) if spell triggering spell with cooldown and same category if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->CategoryRecoveryTime && spellInfo->CategoryRecoveryTime - && m_spellInfo->Category == spellInfo->Category) + && m_spellInfo->GetCategory() == spellInfo->GetCategory()) m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id); // original caster guid only for GO cast @@ -996,7 +996,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) // Remove spell cooldown (not category) if spell triggering spell with cooldown and same category if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->CategoryRecoveryTime && spellInfo->CategoryRecoveryTime - && m_spellInfo->Category == spellInfo->Category) + && m_spellInfo->GetCategory() == spellInfo->GetCategory()) m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id); // original caster guid only for GO cast @@ -1150,10 +1150,15 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) orientation = m_targets.GetUnitTarget()->GetOrientation(); TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTeleportUnits - teleport unit to %u %f %f %f %f\n", mapid, x, y, z, orientation); - if (mapid == unitTarget->GetMapId()) - unitTarget->NearTeleportTo(x, y, z, orientation, unitTarget == m_caster); - else if (unitTarget->GetTypeId() == TYPEID_PLAYER) + if (unitTarget->GetTypeId() == TYPEID_PLAYER) unitTarget->ToPlayer()->TeleportTo(mapid, x, y, z, orientation, unitTarget == m_caster ? TELE_TO_SPELL : 0); + else if (mapid == unitTarget->GetMapId()) + unitTarget->NearTeleportTo(x, y, z, orientation, unitTarget == m_caster); + else + { + TC_LOG_ERROR(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTeleportUnits - spellId %u attempted to teleport creature to a different map.", m_spellInfo->Id); + return; + } // post effects for TARGET_DEST_DB switch (m_spellInfo->Id) @@ -2516,7 +2521,7 @@ void Spell::EffectDispel(SpellEffIndex effIndex) // On success dispel // Devour Magic - if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->Category == SPELLCATEGORY_DEVOUR_MAGIC) + if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->GetCategory() == SPELLCATEGORY_DEVOUR_MAGIC) { int32 heal_amount = m_spellInfo->Effects[EFFECT_1].CalcValue(); m_caster->CastCustomSpell(m_caster, 19658, &heal_amount, NULL, NULL, true); @@ -4101,7 +4106,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case SPELLFAMILY_PALADIN: { // Judgement (seal trigger) - if (m_spellInfo->Category == SPELLCATEGORY_JUDGEMENT) + if (m_spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT) { if (!unitTarget || !unitTarget->IsAlive()) return; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index a0e1ec065cc..0cab2cd4540 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -763,7 +763,7 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = SpellInfo::SpellInfo(SpellEntry const* spellEntry) { Id = spellEntry->Id; - Category = spellEntry->Category; + CategoryEntry = spellEntry->Category ? sSpellCategoryStore.LookupEntry(spellEntry->Category) : NULL; Dispel = spellEntry->Dispel; Mechanic = spellEntry->Mechanic; Attributes = spellEntry->Attributes; @@ -859,6 +859,11 @@ SpellInfo::~SpellInfo() _UnloadImplicitTargetConditionLists(); } +uint32 SpellInfo::GetCategory() const +{ + return CategoryEntry ? CategoryEntry->Id : 0; +} + bool SpellInfo::HasEffect(SpellEffects effect) const { for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) @@ -1103,6 +1108,11 @@ bool SpellInfo::IsStackableOnOneSlotWithDifferentCasters() const return StackAmount > 1 && !IsChanneled() && !(AttributesEx3 & SPELL_ATTR3_STACK_FOR_DIFF_CASTERS); } +bool SpellInfo::IsCooldownStartedOnEvent() const +{ + return Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE || (CategoryEntry && CategoryEntry->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT); +} + bool SpellInfo::IsDeathPersistent() const { return AttributesEx3 & SPELL_ATTR3_DEATH_PERSISTENT; @@ -1712,7 +1722,7 @@ SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const bool SpellInfo::CheckTargetCreatureType(Unit const* target) const { // Curse of Doom & Exorcism: not find another way to fix spell target check :/ - if (SpellFamilyName == SPELLFAMILY_WARLOCK && Category == 1179) + if (SpellFamilyName == SPELLFAMILY_WARLOCK && GetCategory() == 1179) { // not allow cast at player if (target->GetTypeId() == TYPEID_PLAYER) @@ -1816,7 +1826,7 @@ AuraStateType SpellInfo::GetAuraState() const return AURA_STATE_FAERIE_FIRE; // Sting (hunter's pet ability) - if (Category == 1133) + if (GetCategory() == 1133) return AURA_STATE_FAERIE_FIRE; // Victorious diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index c2ca938d26f..2b1dd6a147a 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -250,7 +250,7 @@ public: flag96 SpellClassMask; std::list<Condition*>* ImplicitTargetConditions; - SpellEffectInfo() {} + SpellEffectInfo() { } SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex); bool IsEffect() const; @@ -290,7 +290,7 @@ class SpellInfo { public: uint32 Id; - uint32 Category; + SpellCategoryEntry const* CategoryEntry; uint32 Dispel; uint32 Mechanic; uint32 Attributes; @@ -368,6 +368,7 @@ public: SpellInfo(SpellEntry const* spellEntry); ~SpellInfo(); + uint32 GetCategory() const; bool HasEffect(SpellEffects effect) const; bool HasAura(AuraType aura) const; bool HasAreaAuraEffect() const; @@ -393,6 +394,7 @@ public: bool IsPassiveStackableWithRanks() const; bool IsMultiSlotAura() const; bool IsStackableOnOneSlotWithDifferentCasters() const; + bool IsCooldownStartedOnEvent() const; bool IsDeathPersistent() const; bool IsRequiringDeadTarget() const; bool IsAllowingDeadTarget() const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 29a869cf458..6138cbef773 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -191,6 +191,13 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto, return DIMINISHING_FEAR; break; } + case SPELLFAMILY_SHAMAN: + { + // Storm, Earth and Fire - Earthgrab + if (spellproto->SpellFamilyFlags[2] & 0x4000) + return DIMINISHING_NONE; + break; + } case SPELLFAMILY_DEATHKNIGHT: { // Hungering Cold (no flags) @@ -340,9 +347,7 @@ bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group) } } -SpellMgr::SpellMgr() -{ -} +SpellMgr::SpellMgr() { } SpellMgr::~SpellMgr() { @@ -1855,7 +1860,7 @@ void SpellMgr::LoadSpellProcEvents() } if (!spellInfo->ProcFlags && !spellProcEvent.procFlags) - TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` probally not triggered spell", spellInfo->Id); + TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` probably not triggered spell", spellInfo->Id); mSpellProcEventMap[spellInfo->Id] = spellProcEvent; diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index bb9aab023af..172a9dbcc52 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -204,9 +204,7 @@ void SpellScript::HitHandler::Call(SpellScript* spellScript) } SpellScript::TargetHook::TargetHook(uint8 _effectIndex, uint16 _targetType, bool _area) - : _SpellScript::EffectHook(_effectIndex), targetType(_targetType), area(_area) -{ -} + : _SpellScript::EffectHook(_effectIndex), targetType(_targetType), area(_area) { } std::string SpellScript::TargetHook::ToString() { @@ -727,9 +725,7 @@ void AuraScript::AuraDispelHandler::Call(AuraScript* auraScript, DispelInfo* _di } AuraScript::EffectBase::EffectBase(uint8 _effIndex, uint16 _effName) - : _SpellScript::EffectAuraNameCheck(_effName), _SpellScript::EffectHook(_effIndex) -{ -} + : _SpellScript::EffectAuraNameCheck(_effName), _SpellScript::EffectHook(_effIndex) { } bool AuraScript::EffectBase::CheckEffect(SpellInfo const* spellEntry, uint8 effIndex) { diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index f7940b2b8da..fe5f102dbe9 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -60,8 +60,8 @@ class _SpellScript virtual bool _Validate(SpellInfo const* entry); public: - _SpellScript() : m_currentScriptState(SPELL_SCRIPT_STATE_NONE) {} - virtual ~_SpellScript() {} + _SpellScript() : m_currentScriptState(SPELL_SCRIPT_STATE_NONE) { } + virtual ~_SpellScript() { } virtual void _Register(); virtual void _Unload(); virtual void _Init(std::string const* scriptname, uint32 spellId); @@ -230,12 +230,12 @@ class SpellScript : public _SpellScript }; #define SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) \ - class CastHandlerFunction : public SpellScript::CastHandler { public: CastHandlerFunction(SpellCastFnType _pCastHandlerScript) : SpellScript::CastHandler((SpellScript::SpellCastFnType)_pCastHandlerScript) {} }; \ - class CheckCastHandlerFunction : public SpellScript::CheckCastHandler { public: CheckCastHandlerFunction(SpellCheckCastFnType _checkCastHandlerScript) : SpellScript::CheckCastHandler((SpellScript::SpellCheckCastFnType)_checkCastHandlerScript) {} }; \ - class EffectHandlerFunction : public SpellScript::EffectHandler { public: EffectHandlerFunction(SpellEffectFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : SpellScript::EffectHandler((SpellScript::SpellEffectFnType)_pEffectHandlerScript, _effIndex, _effName) {} }; \ - class HitHandlerFunction : public SpellScript::HitHandler { public: HitHandlerFunction(SpellHitFnType _pHitHandlerScript) : SpellScript::HitHandler((SpellScript::SpellHitFnType)_pHitHandlerScript) {} }; \ - class ObjectAreaTargetSelectHandlerFunction : public SpellScript::ObjectAreaTargetSelectHandler { public: ObjectAreaTargetSelectHandlerFunction(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectAreaTargetSelectHandler((SpellScript::SpellObjectAreaTargetSelectFnType)_pObjectAreaTargetSelectHandlerScript, _effIndex, _targetType) {} }; \ - class ObjectTargetSelectHandlerFunction : public SpellScript::ObjectTargetSelectHandler { public: ObjectTargetSelectHandlerFunction(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectTargetSelectHandler((SpellScript::SpellObjectTargetSelectFnType)_pObjectTargetSelectHandlerScript, _effIndex, _targetType) {} }; + class CastHandlerFunction : public SpellScript::CastHandler { public: CastHandlerFunction(SpellCastFnType _pCastHandlerScript) : SpellScript::CastHandler((SpellScript::SpellCastFnType)_pCastHandlerScript) { } }; \ + class CheckCastHandlerFunction : public SpellScript::CheckCastHandler { public: CheckCastHandlerFunction(SpellCheckCastFnType _checkCastHandlerScript) : SpellScript::CheckCastHandler((SpellScript::SpellCheckCastFnType)_checkCastHandlerScript) { } }; \ + class EffectHandlerFunction : public SpellScript::EffectHandler { public: EffectHandlerFunction(SpellEffectFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : SpellScript::EffectHandler((SpellScript::SpellEffectFnType)_pEffectHandlerScript, _effIndex, _effName) { } }; \ + class HitHandlerFunction : public SpellScript::HitHandler { public: HitHandlerFunction(SpellHitFnType _pHitHandlerScript) : SpellScript::HitHandler((SpellScript::SpellHitFnType)_pHitHandlerScript) { } }; \ + class ObjectAreaTargetSelectHandlerFunction : public SpellScript::ObjectAreaTargetSelectHandler { public: ObjectAreaTargetSelectHandlerFunction(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectAreaTargetSelectHandler((SpellScript::SpellObjectAreaTargetSelectFnType)_pObjectAreaTargetSelectHandlerScript, _effIndex, _targetType) { } }; \ + class ObjectTargetSelectHandlerFunction : public SpellScript::ObjectTargetSelectHandler { public: ObjectTargetSelectHandlerFunction(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectTargetSelectHandler((SpellScript::SpellObjectTargetSelectFnType)_pObjectTargetSelectHandlerScript, _effIndex, _targetType) { } }; #define PrepareSpellScript(CLASSNAME) SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) public: @@ -589,26 +589,26 @@ class AuraScript : public _SpellScript }; #define AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) \ - class CheckAreaTargetFunction : public AuraScript::CheckAreaTargetHandler { public: CheckAreaTargetFunction(AuraCheckAreaTargetFnType _pHandlerScript) : AuraScript::CheckAreaTargetHandler((AuraScript::AuraCheckAreaTargetFnType)_pHandlerScript) {} }; \ - class AuraDispelFunction : public AuraScript::AuraDispelHandler { public: AuraDispelFunction(AuraDispelFnType _pHandlerScript) : AuraScript::AuraDispelHandler((AuraScript::AuraDispelFnType)_pHandlerScript) {} }; \ - class EffectPeriodicHandlerFunction : public AuraScript::EffectPeriodicHandler { public: EffectPeriodicHandlerFunction(AuraEffectPeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectPeriodicHandler((AuraScript::AuraEffectPeriodicFnType)_pEffectHandlerScript, _effIndex, _effName) {} }; \ - class EffectUpdatePeriodicHandlerFunction : public AuraScript::EffectUpdatePeriodicHandler { public: EffectUpdatePeriodicHandlerFunction(AuraEffectUpdatePeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectUpdatePeriodicHandler((AuraScript::AuraEffectUpdatePeriodicFnType)_pEffectHandlerScript, _effIndex, _effName) {} }; \ - class EffectCalcAmountHandlerFunction : public AuraScript::EffectCalcAmountHandler { public: EffectCalcAmountHandlerFunction(AuraEffectCalcAmountFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectCalcAmountHandler((AuraScript::AuraEffectCalcAmountFnType)_pEffectHandlerScript, _effIndex, _effName) {} }; \ - class EffectCalcPeriodicHandlerFunction : public AuraScript::EffectCalcPeriodicHandler { public: EffectCalcPeriodicHandlerFunction(AuraEffectCalcPeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectCalcPeriodicHandler((AuraScript::AuraEffectCalcPeriodicFnType)_pEffectHandlerScript, _effIndex, _effName) {} }; \ - class EffectCalcSpellModHandlerFunction : public AuraScript::EffectCalcSpellModHandler { public: EffectCalcSpellModHandlerFunction(AuraEffectCalcSpellModFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectCalcSpellModHandler((AuraScript::AuraEffectCalcSpellModFnType)_pEffectHandlerScript, _effIndex, _effName) {} }; \ - class EffectApplyHandlerFunction : public AuraScript::EffectApplyHandler { public: EffectApplyHandlerFunction(AuraEffectApplicationModeFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName, AuraEffectHandleModes _mode) : AuraScript::EffectApplyHandler((AuraScript::AuraEffectApplicationModeFnType)_pEffectHandlerScript, _effIndex, _effName, _mode) {} }; \ - class EffectAbsorbFunction : public AuraScript::EffectAbsorbHandler { public: EffectAbsorbFunction(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectAbsorbHandler((AuraScript::AuraEffectAbsorbFnType)_pEffectHandlerScript, _effIndex) {} }; \ - class EffectManaShieldFunction : public AuraScript::EffectManaShieldHandler { public: EffectManaShieldFunction(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectManaShieldHandler((AuraScript::AuraEffectAbsorbFnType)_pEffectHandlerScript, _effIndex) {} }; \ - class EffectSplitFunction : public AuraScript::EffectSplitHandler { public: EffectSplitFunction(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectSplitHandler((AuraScript::AuraEffectSplitFnType)_pEffectHandlerScript, _effIndex) {} }; \ - class CheckProcHandlerFunction : public AuraScript::CheckProcHandler { public: CheckProcHandlerFunction(AuraCheckProcFnType handlerScript) : AuraScript::CheckProcHandler((AuraScript::AuraCheckProcFnType)handlerScript) {} }; \ - class AuraProcHandlerFunction : public AuraScript::AuraProcHandler { public: AuraProcHandlerFunction(AuraProcFnType handlerScript) : AuraScript::AuraProcHandler((AuraScript::AuraProcFnType)handlerScript) {} }; \ - class EffectProcHandlerFunction : public AuraScript::EffectProcHandler { public: EffectProcHandlerFunction(AuraEffectProcFnType effectHandlerScript, uint8 effIndex, uint16 effName) : AuraScript::EffectProcHandler((AuraScript::AuraEffectProcFnType)effectHandlerScript, effIndex, effName) {} }; \ + class CheckAreaTargetFunction : public AuraScript::CheckAreaTargetHandler { public: CheckAreaTargetFunction(AuraCheckAreaTargetFnType _pHandlerScript) : AuraScript::CheckAreaTargetHandler((AuraScript::AuraCheckAreaTargetFnType)_pHandlerScript) { } }; \ + class AuraDispelFunction : public AuraScript::AuraDispelHandler { public: AuraDispelFunction(AuraDispelFnType _pHandlerScript) : AuraScript::AuraDispelHandler((AuraScript::AuraDispelFnType)_pHandlerScript) { } }; \ + class EffectPeriodicHandlerFunction : public AuraScript::EffectPeriodicHandler { public: EffectPeriodicHandlerFunction(AuraEffectPeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectPeriodicHandler((AuraScript::AuraEffectPeriodicFnType)_pEffectHandlerScript, _effIndex, _effName) { } }; \ + class EffectUpdatePeriodicHandlerFunction : public AuraScript::EffectUpdatePeriodicHandler { public: EffectUpdatePeriodicHandlerFunction(AuraEffectUpdatePeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectUpdatePeriodicHandler((AuraScript::AuraEffectUpdatePeriodicFnType)_pEffectHandlerScript, _effIndex, _effName) { } }; \ + class EffectCalcAmountHandlerFunction : public AuraScript::EffectCalcAmountHandler { public: EffectCalcAmountHandlerFunction(AuraEffectCalcAmountFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectCalcAmountHandler((AuraScript::AuraEffectCalcAmountFnType)_pEffectHandlerScript, _effIndex, _effName) { } }; \ + class EffectCalcPeriodicHandlerFunction : public AuraScript::EffectCalcPeriodicHandler { public: EffectCalcPeriodicHandlerFunction(AuraEffectCalcPeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectCalcPeriodicHandler((AuraScript::AuraEffectCalcPeriodicFnType)_pEffectHandlerScript, _effIndex, _effName) { } }; \ + class EffectCalcSpellModHandlerFunction : public AuraScript::EffectCalcSpellModHandler { public: EffectCalcSpellModHandlerFunction(AuraEffectCalcSpellModFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : AuraScript::EffectCalcSpellModHandler((AuraScript::AuraEffectCalcSpellModFnType)_pEffectHandlerScript, _effIndex, _effName) { } }; \ + class EffectApplyHandlerFunction : public AuraScript::EffectApplyHandler { public: EffectApplyHandlerFunction(AuraEffectApplicationModeFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName, AuraEffectHandleModes _mode) : AuraScript::EffectApplyHandler((AuraScript::AuraEffectApplicationModeFnType)_pEffectHandlerScript, _effIndex, _effName, _mode) { } }; \ + class EffectAbsorbFunction : public AuraScript::EffectAbsorbHandler { public: EffectAbsorbFunction(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectAbsorbHandler((AuraScript::AuraEffectAbsorbFnType)_pEffectHandlerScript, _effIndex) { } }; \ + class EffectManaShieldFunction : public AuraScript::EffectManaShieldHandler { public: EffectManaShieldFunction(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectManaShieldHandler((AuraScript::AuraEffectAbsorbFnType)_pEffectHandlerScript, _effIndex) { } }; \ + class EffectSplitFunction : public AuraScript::EffectSplitHandler { public: EffectSplitFunction(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectSplitHandler((AuraScript::AuraEffectSplitFnType)_pEffectHandlerScript, _effIndex) { } }; \ + class CheckProcHandlerFunction : public AuraScript::CheckProcHandler { public: CheckProcHandlerFunction(AuraCheckProcFnType handlerScript) : AuraScript::CheckProcHandler((AuraScript::AuraCheckProcFnType)handlerScript) { } }; \ + class AuraProcHandlerFunction : public AuraScript::AuraProcHandler { public: AuraProcHandlerFunction(AuraProcFnType handlerScript) : AuraScript::AuraProcHandler((AuraScript::AuraProcFnType)handlerScript) { } }; \ + class EffectProcHandlerFunction : public AuraScript::EffectProcHandler { public: EffectProcHandlerFunction(AuraEffectProcFnType effectHandlerScript, uint8 effIndex, uint16 effName) : AuraScript::EffectProcHandler((AuraScript::AuraEffectProcFnType)effectHandlerScript, effIndex, effName) { } }; \ #define PrepareAuraScript(CLASSNAME) AURASCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) public: AuraScript() : _SpellScript(), m_aura(NULL), m_auraApplication(NULL), m_defaultActionPrevented(false) - {} + { } bool _Validate(SpellInfo const* entry); bool _Load(Aura* aura); void _PrepareScriptCall(AuraScriptHookType hookType, AuraApplication const* aurApp = NULL); @@ -627,7 +627,7 @@ class AuraScript : public _SpellScript bool _defaultActionPrevented; ScriptStateStore(uint8 currentScriptState, AuraApplication const* auraApplication, bool defaultActionPrevented) : _auraApplication(auraApplication), _currentScriptState(currentScriptState), _defaultActionPrevented(defaultActionPrevented) - {} + { } }; typedef std::stack<ScriptStateStore> ScriptStateStack; ScriptStateStack m_scriptStates; diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index c32e35e8770..198877bfe86 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -82,10 +82,10 @@ typedef UNORDERED_MAP<uint64, CreatureTextRepeatGroup> CreatureTextRepeatMap;//g class CreatureTextMgr { friend class ACE_Singleton<CreatureTextMgr, ACE_Null_Mutex>; - CreatureTextMgr() {}; + CreatureTextMgr() { }; public: - ~CreatureTextMgr() {}; + ~CreatureTextMgr() { }; void LoadCreatureTexts(); void LoadCreatureTextLocales(); CreatureTextMap const& GetTextMap() const { return mTextMap; } diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index ccfeb35e5b8..608f0a1ace5 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -240,9 +240,7 @@ void GmTicket::SetChatLog(std::list<uint32> time, std::string const& log) /////////////////////////////////////////////////////////////////////////////////////////////////// // Ticket manager TicketMgr::TicketMgr() : _status(true), _lastTicketId(0), _lastSurveyId(0), _openTicketCount(0), - _lastChange(time(NULL)) -{ -} + _lastChange(time(NULL)) { } TicketMgr::~TicketMgr() { @@ -257,9 +255,17 @@ void TicketMgr::Initialize() void TicketMgr::ResetTickets() { - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) + for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end();) + { if (itr->second->IsClosed()) - sTicketMgr->RemoveTicket(itr->second->GetId()); + { + uint32 ticketId = itr->second->GetId(); + ++itr; + sTicketMgr->RemoveTicket(ticketId); + } + else + ++itr; + } _lastTicketId = 0; diff --git a/src/server/game/Tools/PlayerDump.h b/src/server/game/Tools/PlayerDump.h index 895676eb5db..4fd411d02ac 100644 --- a/src/server/game/Tools/PlayerDump.h +++ b/src/server/game/Tools/PlayerDump.h @@ -64,13 +64,13 @@ enum DumpReturn class PlayerDump { protected: - PlayerDump() {} + PlayerDump() { } }; class PlayerDumpWriter : public PlayerDump { public: - PlayerDumpWriter() {} + PlayerDumpWriter() { } bool GetDump(uint32 guid, std::string& dump); DumpReturn WriteDump(std::string const& file, uint32 guid); @@ -89,7 +89,7 @@ class PlayerDumpWriter : public PlayerDump class PlayerDumpReader : public PlayerDump { public: - PlayerDumpReader() {} + PlayerDumpReader() { } DumpReturn LoadDump(std::string const& file, uint32 account, std::string name, uint32 guid); }; diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index f02cbf321b3..5e2cd82f6cc 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -30,9 +30,7 @@ #include "Warden.h" #include "AccountMgr.h" -Warden::Warden() : _inputCrypto(16), _outputCrypto(16), _checkTimer(10000/*10 sec*/), _clientResponseTimer(0), _dataSent(false), _initialized(false) -{ -} +Warden::Warden() : _inputCrypto(16), _outputCrypto(16), _checkTimer(10000/*10 sec*/), _clientResponseTimer(0), _dataSent(false), _initialized(false) { } Warden::~Warden() { diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp index a8bcd61db73..cdd2a2f6bac 100644 --- a/src/server/game/Warden/WardenCheckMgr.cpp +++ b/src/server/game/Warden/WardenCheckMgr.cpp @@ -25,9 +25,7 @@ #include "WardenCheckMgr.h" #include "Warden.h" -WardenCheckMgr::WardenCheckMgr() -{ -} +WardenCheckMgr::WardenCheckMgr() { } WardenCheckMgr::~WardenCheckMgr() { diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp index 27e859e741d..1cd4a4ea877 100644 --- a/src/server/game/Warden/WardenMac.cpp +++ b/src/server/game/Warden/WardenMac.cpp @@ -30,13 +30,9 @@ #include "WardenMac.h" #include "WardenModuleMac.h" -WardenMac::WardenMac() : Warden() -{ -} +WardenMac::WardenMac() : Warden() { } -WardenMac::~WardenMac() -{ -} +WardenMac::~WardenMac() { } void WardenMac::Init(WorldSession* pClient, BigNumber* K) { diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp index 60a1fecedc9..a9fcc041ff6 100644 --- a/src/server/game/Warden/WardenWin.cpp +++ b/src/server/game/Warden/WardenWin.cpp @@ -34,13 +34,9 @@ #include "WardenCheckMgr.h" #include "AccountMgr.h" -WardenWin::WardenWin() : Warden() -{ -} +WardenWin::WardenWin() : Warden() { } -WardenWin::~WardenWin() -{ -} +WardenWin::~WardenWin() { } void WardenWin::Init(WorldSession* session, BigNumber* k) { diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index d3258aa3401..1a18e26d049 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -80,6 +80,7 @@ #include "Warden.h" #include "CalendarMgr.h" #include "BattlefieldMgr.h" +#include "TransportMgr.h" ACE_Atomic_Op<ACE_Thread_Mutex, bool> World::m_stopEvent = false; uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE; @@ -1374,6 +1375,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Game Object Templates..."); // must be after LoadPageTexts sObjectMgr->LoadGameObjectTemplate(); + TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Transport templates..."); + sTransportMgr->LoadTransportTemplates(); + TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Spell Rank Data..."); sSpellMgr->LoadSpellRanks(); @@ -1784,10 +1788,7 @@ void World::SetInitialWorldSettings() sBattlefieldMgr->InitBattlefield(); TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Transports..."); - sMapMgr->LoadTransports(); - - TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Transport NPCs..."); - sMapMgr->LoadTransportNPCs(); + sTransportMgr->SpawnContinentTransports(); ///- Initialize Warden TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Warden Checks..."); @@ -2168,7 +2169,7 @@ namespace Trinity { public: typedef std::vector<WorldPacket*> WorldPacketList; - explicit WorldWorldTextBuilder(int32 textId, va_list* args = NULL) : i_textId(textId), i_args(args) {} + explicit WorldWorldTextBuilder(int32 textId, va_list* args = NULL) : i_textId(textId), i_args(args) { } void operator()(WorldPacketList& data_list, LocaleConstant loc_idx) { char const* text = sObjectMgr->GetTrinityString(i_textId, loc_idx); |
