aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-06-01 02:29:20 -0300
committerariel- <ariel-@users.noreply.github.com>2017-06-01 02:29:20 -0300
commitce3787f190d28c1e981598eef2cd24c622a2cbae (patch)
treef4ce0a59533e64e4892d0f0d074be9c7cb166da2 /src/server/game/Movement
parentaeaa8ecfabc2885aa24a86ce22034718cb4f62d8 (diff)
Core/AI: Factory functions cleanup
- Get rid of fugly void pointers - Streamlined AI selection code, using Permissible as it should've been instead of harcoded checks on the selector code - Moved IdleMovementGenerator singleton to factory code
Diffstat (limited to 'src/server/game/Movement')
-rw-r--r--src/server/game/Movement/MotionMaster.cpp19
-rw-r--r--src/server/game/Movement/MovementGenerator.cpp7
-rwxr-xr-xsrc/server/game/Movement/MovementGenerator.h24
-rw-r--r--src/server/game/Movement/MovementGeneratorImpl.h30
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/IdleMovementGenerator.h2
6 files changed, 31 insertions, 53 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index e917962f21a..6f4c198f44d 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -33,9 +33,14 @@
#include "MoveSpline.h"
#include "MoveSplineInit.h"
+inline MovementGenerator* GetIdleMovementGenerator()
+{
+ return sMovementGeneratorRegistry->GetRegistryItem(IDLE_MOTION_TYPE)->Create();
+}
+
inline bool IsStatic(MovementGenerator* movement)
{
- return (movement == &si_idleMovement);
+ return (movement == GetIdleMovementGenerator());
}
MotionMaster::~MotionMaster()
@@ -73,15 +78,7 @@ void MotionMaster::Initialize()
// set new default movement generator
void MotionMaster::InitDefault()
{
- if (_owner->GetTypeId() == TYPEID_UNIT)
- {
- MovementGenerator* movement = FactorySelector::selectMovementGenerator(_owner->ToCreature());
- Mutate(movement == nullptr ? &si_idleMovement : movement, MOTION_SLOT_IDLE);
- }
- else
- {
- Mutate(&si_idleMovement, MOTION_SLOT_IDLE);
- }
+ Mutate(FactorySelector::SelectMovementGenerator(_owner), MOTION_SLOT_IDLE);
}
void MotionMaster::UpdateMotion(uint32 diff)
@@ -196,7 +193,7 @@ void MotionMaster::MoveIdle()
{
//! Should be preceded by MovementExpired or Clear if there's an overlying movementgenerator active
if (empty() || !IsStatic(top()))
- Mutate(&si_idleMovement, MOTION_SLOT_IDLE);
+ Mutate(GetIdleMovementGenerator(), MOTION_SLOT_IDLE);
}
void MotionMaster::MoveTargetedHome()
diff --git a/src/server/game/Movement/MovementGenerator.cpp b/src/server/game/Movement/MovementGenerator.cpp
index 4d9180815e5..eb2c1312d04 100644
--- a/src/server/game/Movement/MovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerator.cpp
@@ -17,5 +17,12 @@
*/
#include "MovementGenerator.h"
+#include "IdleMovementGenerator.h"
MovementGenerator::~MovementGenerator() { }
+
+MovementGenerator* IdleMovementFactory::Create(Unit* /*object*/) const
+{
+ static IdleMovementGenerator instance;
+ return &instance;
+}
diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h
index 8119c2d2599..8f75e3a2361 100755
--- a/src/server/game/Movement/MovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerator.h
@@ -70,20 +70,28 @@ class MovementGeneratorMedium : public MovementGenerator
}
};
-struct SelectableMovement : public FactoryHolder<MovementGenerator, MovementGeneratorType>
+typedef FactoryHolder<MovementGenerator, Unit, MovementGeneratorType> MovementGeneratorCreator;
+
+template<class Movement>
+struct MovementGeneratorFactory : public MovementGeneratorCreator
{
- SelectableMovement(MovementGeneratorType movementGeneratorType) : FactoryHolder<MovementGenerator, MovementGeneratorType>(movementGeneratorType) { }
+ MovementGeneratorFactory(MovementGeneratorType movementGeneratorType) : MovementGeneratorCreator(movementGeneratorType) { }
+
+ MovementGenerator* Create(Unit* /*object*/) const override
+ {
+ return new Movement();
+ }
};
-template<class Movement>
-struct MovementGeneratorFactory : public SelectableMovement
+struct IdleMovementFactory : public MovementGeneratorCreator
{
- MovementGeneratorFactory(MovementGeneratorType movementGeneratorType) : SelectableMovement(movementGeneratorType) { }
+ IdleMovementFactory() : MovementGeneratorCreator(IDLE_MOTION_TYPE) { }
- MovementGenerator* Create(void *) const override;
+ MovementGenerator* Create(Unit* object) const override;
};
-typedef FactoryHolder<MovementGenerator, MovementGeneratorType> MovementGeneratorCreator;
-typedef FactoryHolder<MovementGenerator, MovementGeneratorType>::FactoryHolderRegistry MovementGeneratorRegistry;
+typedef MovementGeneratorCreator::FactoryHolderRegistry MovementGeneratorRegistry;
+
+#define sMovementGeneratorRegistry MovementGeneratorRegistry::instance()
#endif
diff --git a/src/server/game/Movement/MovementGeneratorImpl.h b/src/server/game/Movement/MovementGeneratorImpl.h
deleted file mode 100644
index 3488de8534a..00000000000
--- a/src/server/game/Movement/MovementGeneratorImpl.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 TRINITY_MOVEMENTGENERATOR_IMPL_H
-#define TRINITY_MOVEMENTGENERATOR_IMPL_H
-
-#include "MovementGenerator.h"
-
-template<class Movement>
-inline MovementGenerator* MovementGeneratorFactory<Movement>::Create(void * /*data*/) const
-{
- return (new Movement());
-}
-
-#endif
diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
index 97d526a47c5..4171ffa1929 100755
--- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
@@ -20,8 +20,6 @@
#include "CreatureAI.h"
#include "Creature.h"
-IdleMovementGenerator si_idleMovement;
-
// StopMoving is needed to make unit stop if its last movement generator expires
// But it should not be sent otherwise there are many redundent packets
void IdleMovementGenerator::Initialize(Unit* owner)
diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
index 68ad0d775e9..43e0f73b20a 100755
--- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
@@ -32,8 +32,6 @@ class IdleMovementGenerator : public MovementGenerator
MovementGeneratorType GetMovementGeneratorType() const override { return IDLE_MOTION_TYPE; }
};
-TC_GAME_API extern IdleMovementGenerator si_idleMovement;
-
class RotateMovementGenerator : public MovementGenerator
{
public: