mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 19:37:02 +00:00
[7333] Refactoring DestinationHolder/Traveler/Unit::SendMonsterMoveWithSpeed code.
* Move common code in appropriate functions. * Correct select speed and 2D/3D distance for creature/player walk/fly
This commit is contained in:
parent
3c87af93e6
commit
1349d36270
6 changed files with 57 additions and 39 deletions
|
|
@ -79,25 +79,7 @@ DestinationHolder<TRAVELLER>::StartTravel(TRAVELLER &traveller, bool sendMove)
|
||||||
{
|
{
|
||||||
if(!i_destSet) return 0;
|
if(!i_destSet) return 0;
|
||||||
|
|
||||||
i_fromX = traveller.GetPositionX();
|
i_totalTravelTime = traveller.GetTotalTrevelTimeTo(i_destX,i_destY,i_destZ);
|
||||||
i_fromY = traveller.GetPositionY();
|
|
||||||
i_fromZ = traveller.GetPositionZ();
|
|
||||||
|
|
||||||
float dx = i_destX - i_fromX;
|
|
||||||
float dy = i_destY - i_fromY;
|
|
||||||
float dz = i_destZ - i_fromZ;
|
|
||||||
|
|
||||||
float dist;
|
|
||||||
//Should be for Creature Flying and Swimming.
|
|
||||||
if(traveller.GetTraveller().hasUnitState(UNIT_STAT_IN_FLIGHT))
|
|
||||||
dist = sqrt((dx*dx) + (dy*dy) + (dz*dz));
|
|
||||||
else //Walking on the ground
|
|
||||||
dist = sqrt((dx*dx) + (dy*dy));
|
|
||||||
float speed = traveller.Speed();
|
|
||||||
|
|
||||||
speed *= 0.001f; // speed is in seconds so convert from second to millisecond
|
|
||||||
i_totalTravelTime = static_cast<uint32>(dist/speed);
|
|
||||||
i_timeElapsed = 0;
|
|
||||||
if(sendMove)
|
if(sendMove)
|
||||||
traveller.MoveTo(i_destX, i_destY, i_destZ, i_totalTravelTime);
|
traveller.MoveTo(i_destX, i_destY, i_destZ, i_totalTravelTime);
|
||||||
return i_totalTravelTime;
|
return i_totalTravelTime;
|
||||||
|
|
|
||||||
|
|
@ -50,11 +50,24 @@ struct MANGOS_DLL_DECL Traveller
|
||||||
T& GetTraveller(void) { return i_traveller; }
|
T& GetTraveller(void) { return i_traveller; }
|
||||||
|
|
||||||
float Speed(void) { assert(false); return 0.0f; }
|
float Speed(void) { assert(false); return 0.0f; }
|
||||||
|
float GetMoveDestinationTo(float x, float y, float z);
|
||||||
|
uint32 GetTotalTrevelTimeTo(float x, float y, float z);
|
||||||
|
|
||||||
void Relocation(float x, float y, float z, float orientation) {}
|
void Relocation(float x, float y, float z, float orientation) {}
|
||||||
void Relocation(float x, float y, float z) { Relocation(x, y, z, i_traveller.GetOrientation()); }
|
void Relocation(float x, float y, float z) { Relocation(x, y, z, i_traveller.GetOrientation()); }
|
||||||
void MoveTo(float x, float y, float z, uint32 t) {}
|
void MoveTo(float x, float y, float z, uint32 t) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline uint32 Traveller<T>::GetTotalTrevelTimeTo(float x, float y, float z)
|
||||||
|
{
|
||||||
|
float dist = GetMoveDestinationTo(x,y,z);
|
||||||
|
float speed = Speed();
|
||||||
|
|
||||||
|
speed *= 0.001f; // speed is in seconds so convert from second to millisecond
|
||||||
|
return static_cast<uint32>(dist/speed);
|
||||||
|
}
|
||||||
|
|
||||||
// specialization for creatures
|
// specialization for creatures
|
||||||
template<>
|
template<>
|
||||||
inline float Traveller<Creature>::Speed()
|
inline float Traveller<Creature>::Speed()
|
||||||
|
|
@ -73,6 +86,20 @@ inline void Traveller<Creature>::Relocation(float x, float y, float z, float ori
|
||||||
i_traveller.GetMap()->CreatureRelocation(&i_traveller, x, y, z, orientation);
|
i_traveller.GetMap()->CreatureRelocation(&i_traveller, x, y, z, orientation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline float Traveller<Creature>::GetMoveDestinationTo(float x, float y, float z)
|
||||||
|
{
|
||||||
|
float dx = x - GetPositionX();
|
||||||
|
float dy = y - GetPositionY();
|
||||||
|
float dz = z - GetPositionZ();
|
||||||
|
|
||||||
|
if(i_traveller.hasUnitState(UNIT_STAT_IN_FLIGHT))
|
||||||
|
return sqrt((dx*dx) + (dy*dy) + (dz*dz));
|
||||||
|
else //Walking on the ground
|
||||||
|
return sqrt((dx*dx) + (dy*dy));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void Traveller<Creature>::MoveTo(float x, float y, float z, uint32 t)
|
inline void Traveller<Creature>::MoveTo(float x, float y, float z, uint32 t)
|
||||||
{
|
{
|
||||||
|
|
@ -89,6 +116,19 @@ inline float Traveller<Player>::Speed()
|
||||||
return i_traveller.GetSpeed(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
|
return i_traveller.GetSpeed(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline float Traveller<Player>::GetMoveDestinationTo(float x, float y, float z)
|
||||||
|
{
|
||||||
|
float dx = x - GetPositionX();
|
||||||
|
float dy = y - GetPositionY();
|
||||||
|
float dz = z - GetPositionZ();
|
||||||
|
|
||||||
|
if (i_traveller.isInFlight())
|
||||||
|
return sqrt((dx*dx) + (dy*dy) + (dz*dz));
|
||||||
|
else //Walking on the ground
|
||||||
|
return sqrt((dx*dx) + (dy*dy));
|
||||||
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void Traveller<Player>::Relocation(float x, float y, float z, float orientation)
|
inline void Traveller<Player>::Relocation(float x, float y, float z, float orientation)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@
|
||||||
#include "GridNotifiersImpl.h"
|
#include "GridNotifiersImpl.h"
|
||||||
#include "CellImpl.h"
|
#include "CellImpl.h"
|
||||||
#include "Path.h"
|
#include "Path.h"
|
||||||
|
#include "Traveller.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
|
@ -232,31 +233,26 @@ void Unit::SendMonsterMoveWithSpeedToCurrentDestination(Player* player)
|
||||||
{
|
{
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
if(GetMotionMaster()->GetDestination(x, y, z))
|
if(GetMotionMaster()->GetDestination(x, y, z))
|
||||||
SendMonsterMoveWithSpeed(x, y, z, GetUnitMovementFlags(), 0, player);
|
SendMonsterMoveWithSpeed(x, y, z, 0, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 MovementFlags, uint32 transitTime, Player* player)
|
void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime, Player* player)
|
||||||
{
|
{
|
||||||
if (!transitTime)
|
if (!transitTime)
|
||||||
{
|
{
|
||||||
float dx = x - GetPositionX();
|
if(GetTypeId()==TYPEID_PLAYER)
|
||||||
float dy = y - GetPositionY();
|
{
|
||||||
float dz = z - GetPositionZ();
|
Traveller<Player> traveller(*(Player*)this);
|
||||||
|
transitTime = traveller.GetTotalTrevelTimeTo(x,y,z);
|
||||||
float dist = ((dx*dx) + (dy*dy) + (dz*dz));
|
}
|
||||||
if(dist<0)
|
|
||||||
dist = 0;
|
|
||||||
else
|
else
|
||||||
dist = sqrt(dist);
|
{
|
||||||
|
Traveller<Creature> traveller(*(Creature*)this);
|
||||||
double speed = GetSpeed((MovementFlags & MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
|
transitTime = traveller.GetTotalTrevelTimeTo(x,y,z);
|
||||||
if(speed<=0)
|
}
|
||||||
speed = 2.5f;
|
|
||||||
speed *= 0.001f;
|
|
||||||
transitTime = static_cast<uint32>(dist / speed + 0.5);
|
|
||||||
}
|
}
|
||||||
//float orientation = (float)atan2((double)dy, (double)dx);
|
//float orientation = (float)atan2((double)dy, (double)dx);
|
||||||
SendMonsterMove(x, y, z, 0, MovementFlags, transitTime, player);
|
SendMonsterMove(x, y, z, 0, GetUnitMovementFlags(), transitTime, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player)
|
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player)
|
||||||
|
|
|
||||||
|
|
@ -1068,7 +1068,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
|
|
||||||
void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
|
void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
|
||||||
void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags);
|
void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags);
|
||||||
void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 MovementFlags, uint32 transitTime = 0, Player* player = NULL);
|
void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL);
|
||||||
void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL);
|
void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL);
|
||||||
|
|
||||||
virtual void MoveOutOfRange(Player &) { };
|
virtual void MoveOutOfRange(Player &) { };
|
||||||
|
|
|
||||||
|
|
@ -1799,7 +1799,7 @@ void World::ScriptsProcess()
|
||||||
sLog.outError("SCRIPT_COMMAND_MOVE_TO call for non-creature (TypeId: %u), skipping.",source->GetTypeId());
|
sLog.outError("SCRIPT_COMMAND_MOVE_TO call for non-creature (TypeId: %u), skipping.",source->GetTypeId());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
((Unit *)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, ((Unit *)source)->GetUnitMovementFlags(), step.script->datalong2 );
|
((Unit *)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, step.script->datalong2 );
|
||||||
((Unit *)source)->GetMap()->CreatureRelocation(((Creature *)source), step.script->x, step.script->y, step.script->z, 0);
|
((Unit *)source)->GetMap()->CreatureRelocation(((Creature *)source), step.script->x, step.script->y, step.script->z, 0);
|
||||||
break;
|
break;
|
||||||
case SCRIPT_COMMAND_FLAG_SET:
|
case SCRIPT_COMMAND_FLAG_SET:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7332"
|
#define REVISION_NR "7333"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue