/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ #ifndef TRINITY_MOVEMENTGENERATOR_H #define TRINITY_MOVEMENTGENERATOR_H #include "Define.h" #include #include "ObjectRegistry.h" #include "FactoryHolder.h" #include "Common.h" #include "MotionMaster.h" class Unit; class MovementGenerator { public: virtual ~MovementGenerator(); virtual void Initialize(Unit*) = 0; virtual void Finalize(Unit*) = 0; virtual void Reset(Unit*) = 0; virtual bool Update(Unit*, uint32 time_diff) = 0; virtual MovementGeneratorType GetMovementGeneratorType() = 0; virtual uint32 GetSplineId() const { return 0; } // Xinef: Escort system virtual void unitSpeedChanged() { } // used by Evade code for select point to evade with expected restart default movement virtual bool GetResetPosition(float& /*x*/, float& /*y*/, float& /*z*/) { return false; } }; template class MovementGeneratorMedium : public MovementGenerator { public: void Initialize(Unit* u) { //u->AssertIsType(); (static_cast(this))->DoInitialize(static_cast(u)); } void Finalize(Unit* u) { //u->AssertIsType(); (static_cast(this))->DoFinalize(static_cast(u)); } void Reset(Unit* u) { //u->AssertIsType(); (static_cast(this))->DoReset(static_cast(u)); } bool Update(Unit* u, uint32 time_diff) { //u->AssertIsType(); return (static_cast(this))->DoUpdate(static_cast(u), time_diff); } }; struct SelectableMovement : public FactoryHolder { SelectableMovement(MovementGeneratorType mgt) : FactoryHolder(mgt) {} }; template struct MovementGeneratorFactory : public SelectableMovement { MovementGeneratorFactory(MovementGeneratorType mgt) : SelectableMovement(mgt) {} MovementGenerator* Create(void *) const; }; typedef FactoryHolder MovementGeneratorCreator; typedef FactoryHolder::FactoryHolderRegistry MovementGeneratorRegistry; typedef FactoryHolder::FactoryHolderRepository MovementGeneratorRepository; #endif