aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.cpp28
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.h9
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.cpp4
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.h24
-rw-r--r--src/server/game/AI/CoreAI/GuardAI.cpp4
-rw-r--r--src/server/game/AI/CoreAI/PassiveAI.h22
-rw-r--r--src/server/game/AI/CoreAI/PetAI.h6
-rw-r--r--src/server/game/AI/CoreAI/ReactorAI.h4
-rw-r--r--src/server/game/AI/CoreAI/TotemAI.cpp4
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h40
-rw-r--r--src/server/game/AI/CreatureAI.h42
-rw-r--r--src/server/game/AI/CreatureAIFactory.h8
-rw-r--r--src/server/game/AI/CreatureAIImpl.h4
-rw-r--r--src/server/game/AI/EventAI/CreatureEventAI.h4
-rw-r--r--src/server/game/AI/EventAI/CreatureEventAIMgr.h4
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp8
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h30
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.h4
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h2
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp14
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h6
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp125
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h13
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp6
-rw-r--r--src/server/game/Accounts/RBAC.cpp4
-rw-r--r--src/server/game/Accounts/RBAC.h2
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp6
-rw-r--r--src/server/game/Achievements/AchievementMgr.h6
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp4
-rw-r--r--src/server/game/Battlefield/Battlefield.h8
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.cpp2
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.h3
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp6
-rw-r--r--src/server/game/Battlegrounds/Battleground.h24
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.h6
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h6
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp94
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.h2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp16
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp4
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp4
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.h4
-rw-r--r--src/server/game/Chat/Chat.h8
-rw-r--r--src/server/game/Chat/ChatLink.cpp4
-rw-r--r--src/server/game/Combat/ThreatManager.cpp4
-rw-r--r--src/server/game/Combat/ThreatManager.h2
-rw-r--r--src/server/game/Combat/UnitEvents.h4
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp4
-rw-r--r--src/server/game/DataStores/DBCEnums.h6
-rw-r--r--src/server/game/DataStores/DBCStores.cpp28
-rw-r--r--src/server/game/DataStores/DBCStores.h3
-rw-r--r--src/server/game/DataStores/DBCStructure.h44
-rw-r--r--src/server/game/DataStores/DBCfmt.h3
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h4
-rw-r--r--src/server/game/DungeonFinding/LFGPlayerData.cpp6
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.h2
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.cpp8
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp4
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp34
-rw-r--r--src/server/game/Entities/Creature/Creature.h44
-rw-r--r--src/server/game/Entities/Creature/CreatureGroups.h4
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.h4
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp98
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h27
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.cpp4
-rw-r--r--src/server/game/Entities/Object/Object.cpp37
-rw-r--r--src/server/game/Entities/Object/Object.h58
-rw-r--r--src/server/game/Entities/Object/ObjectPosSelector.h2
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.cpp4
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp114
-rw-r--r--src/server/game/Entities/Player/Player.h24
-rw-r--r--src/server/game/Entities/Player/SocialMgr.cpp8
-rw-r--r--src/server/game/Entities/Totem/Totem.h14
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp931
-rw-r--r--src/server/game/Entities/Transport/Transport.h114
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp39
-rw-r--r--src/server/game/Entities/Unit/Unit.h26
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h2
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h2
-rw-r--r--src/server/game/Events/GameEventMgr.cpp4
-rw-r--r--src/server/game/Events/GameEventMgr.h4
-rw-r--r--src/server/game/Globals/ObjectAccessor.cpp17
-rw-r--r--src/server/game/Globals/ObjectAccessor.h4
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp31
-rw-r--r--src/server/game/Globals/ObjectMgr.h18
-rw-r--r--src/server/game/Grids/Cells/Cell.h4
-rw-r--r--src/server/game/Grids/Grid.h2
-rw-r--r--src/server/game/Grids/GridDefines.h4
-rw-r--r--src/server/game/Grids/GridReference.h2
-rw-r--r--src/server/game/Grids/GridStates.h2
-rw-r--r--src/server/game/Grids/NGrid.h4
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.cpp29
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h182
-rw-r--r--src/server/game/Grids/ObjectGridLoader.cpp36
-rw-r--r--src/server/game/Grids/ObjectGridLoader.h11
-rw-r--r--src/server/game/Groups/Group.cpp8
-rw-r--r--src/server/game/Groups/Group.h2
-rw-r--r--src/server/game/Groups/GroupReference.h2
-rw-r--r--src/server/game/Guilds/Guild.cpp2
-rw-r--r--src/server/game/Handlers/AddonHandler.cpp8
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp2
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp2
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp25
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp4
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp4
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.h6
-rw-r--r--src/server/game/Instances/InstanceScript.h18
-rw-r--r--src/server/game/Loot/LootMgr.h20
-rw-r--r--src/server/game/Mails/Mail.cpp8
-rw-r--r--src/server/game/Mails/Mail.h6
-rw-r--r--src/server/game/Maps/Map.cpp411
-rw-r--r--src/server/game/Maps/Map.h45
-rw-r--r--src/server/game/Maps/MapInstanced.h2
-rw-r--r--src/server/game/Maps/MapManager.cpp16
-rw-r--r--src/server/game/Maps/MapManager.h9
-rw-r--r--src/server/game/Maps/MapReference.h2
-rw-r--r--src/server/game/Maps/MapUpdater.cpp4
-rw-r--r--src/server/game/Maps/TransportMgr.cpp471
-rw-r--r--src/server/game/Maps/TransportMgr.h159
-rw-r--r--src/server/game/Maps/ZoneScript.h10
-rw-r--r--src/server/game/Miscellaneous/Language.h2
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h5
-rw-r--r--src/server/game/Movement/MovementGenerator.cpp4
-rwxr-xr-xsrc/server/game/Movement/MovementGenerator.h4
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h4
-rw-r--r--src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp4
-rw-r--r--src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h4
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/IdleMovementGenerator.h6
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp4
-rw-r--r--src/server/game/Movement/MovementGenerators/PointMovementGenerator.h10
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h2
-rw-r--r--src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp8
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h14
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp40
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h6
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp4
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.h8
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInitArgs.h6
-rw-r--r--src/server/game/Movement/Spline/Spline.h4
-rw-r--r--src/server/game/Movement/Waypoints/WaypointManager.cpp4
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.cpp8
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.h16
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.h2
-rw-r--r--src/server/game/Pools/PoolMgr.cpp12
-rw-r--r--src/server/game/Pools/PoolMgr.h6
-rw-r--r--src/server/game/Reputation/ReputationMgr.h4
-rw-r--r--src/server/game/Scripting/MapScripts.cpp20
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp12
-rw-r--r--src/server/game/Scripting/ScriptMgr.h10
-rw-r--r--src/server/game/Scripting/ScriptSystem.h4
-rw-r--r--src/server/game/Server/WorldSession.cpp14
-rw-r--r--src/server/game/Server/WorldSession.h18
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp4
-rw-r--r--src/server/game/Skills/SkillDiscovery.cpp4
-rw-r--r--src/server/game/Skills/SkillExtraItems.cpp4
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp5
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h8
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp6
-rw-r--r--src/server/game/Spells/Spell.cpp28
-rw-r--r--src/server/game/Spells/SpellEffects.cpp21
-rw-r--r--src/server/game/Spells/SpellInfo.cpp16
-rw-r--r--src/server/game/Spells/SpellInfo.h6
-rw-r--r--src/server/game/Spells/SpellMgr.cpp13
-rw-r--r--src/server/game/Spells/SpellScript.cpp8
-rw-r--r--src/server/game/Spells/SpellScript.h48
-rw-r--r--src/server/game/Texts/CreatureTextMgr.h4
-rw-r--r--src/server/game/Tickets/TicketMgr.cpp16
-rw-r--r--src/server/game/Tools/PlayerDump.h6
-rw-r--r--src/server/game/Warden/Warden.cpp4
-rw-r--r--src/server/game/Warden/WardenCheckMgr.cpp4
-rw-r--r--src/server/game/Warden/WardenMac.cpp8
-rw-r--r--src/server/game/Warden/WardenWin.cpp8
-rw-r--r--src/server/game/World/World.cpp11
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 &notifier);
template<class NOTIFIER> void VisitFirstFound(const float &x, const float &y, float radius, NOTIFIER &notifier);
template<class NOTIFIER> void VisitWorld(const float &x, const float &y, float radius, NOTIFIER &notifier);
@@ -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);