* output & log platform+compiler+version on startup * added early version of a movement mgr, its is not used yet and does NOT work yet!
172 lines
4.6 KiB
C++
172 lines
4.6 KiB
C++
#include "PseuWoW.h"
|
|
#include "WorldSession.h"
|
|
#include "World.h"
|
|
#include "MovementMgr.h"
|
|
#include "Player.h"
|
|
|
|
MovementMgr::MovementMgr()
|
|
{
|
|
_moveFlags = 0;
|
|
_instance = NULL;
|
|
_optime = 0;
|
|
_updatetime = 0;
|
|
}
|
|
|
|
MovementMgr::~MovementMgr()
|
|
{
|
|
}
|
|
|
|
void MovementMgr::SetInstance(PseuInstance *inst)
|
|
{
|
|
_movemode = MOVEMODE_MANUAL;
|
|
_instance = inst;
|
|
_mychar = inst->GetWSession()->GetMyChar();
|
|
}
|
|
|
|
void MovementMgr::_BuildPacket(uint16 opcode)
|
|
{
|
|
WorldPacket wp(opcode,4+1+4+12); // it can be larger, if we are juming, on transport or swimming
|
|
wp << _moveFlags;
|
|
wp << (uint8)0; // unk
|
|
wp << getMSTime();
|
|
wp << _mychar->GetPosition();
|
|
// TODO: transport not yet handled/done
|
|
if(_moveFlags & MOVEMENTFLAG_ONTRANSPORT)
|
|
{
|
|
wp << (uint64)0; // transport guid
|
|
wp << WorldPosition(); // transport position
|
|
wp << getMSTime(); // transport time (??)
|
|
}
|
|
// TODO: swimming not yet done
|
|
if(_moveFlags & MOVEMENTFLAG_SWIMMING)
|
|
{
|
|
wp << (float)0; // angle; 1.55=looking up, -1.55=looking down, 0=looking forward
|
|
}
|
|
wp << (uint32)0; // last fall time (also used when jumping)
|
|
// TODO: jumping not yet done
|
|
// TODO: spline not yet done
|
|
|
|
|
|
_optime = getMSTime();
|
|
|
|
}
|
|
|
|
void MovementMgr::Update(bool calcpos)
|
|
{
|
|
uint32 curtime = getMSTime();
|
|
uint32 timediff = curtime - _updatetime;
|
|
_updatetime = curtime;
|
|
|
|
if(_movemode == MOVEMODE_AUTO)
|
|
{
|
|
WorldPosition& pos = _mychar->GetPosition();
|
|
float turnspeed = _mychar->GetSpeed(MOVE_TURN) / 1000.0f * timediff;
|
|
float runspeed = _mychar->GetSpeed(MOVE_RUN) / 1000.0f * timediff;
|
|
float movespeed = runspeed; // or use walkspeed, depending on setting. for now use only runspeed
|
|
// TODO: calc other speeds as soon as implemented
|
|
|
|
/*
|
|
if(_moveFlags & MOVEMENTFLAG_FORWARD)
|
|
{
|
|
pos.x += movespeed * sin(pos.o);
|
|
pos.y += movespeed * cos(pos.o);
|
|
}
|
|
// ...
|
|
if(_moveFlags & MOVEMENTFLAG_LEFT)
|
|
{
|
|
pos.o -= turnspeed;
|
|
}
|
|
if(_moveFlags & MOVEMENTFLAG_RIGHT)
|
|
{
|
|
pos.o += turnspeed;
|
|
}
|
|
if(pos.o < 0)
|
|
pos.o += 2 * M_PI;
|
|
else if(pos.o > 2 * M_PI)
|
|
pos.o -= 2 * M_PI;
|
|
|
|
pos.z = _instance->GetWSession()->GetWorld()->GetPosZ(pos.x,pos.y);
|
|
*/
|
|
// ^ It should look like this later on, but its not finished, and formulas are not tested.
|
|
// see it as some future plans that need a lot of finetuning ;)
|
|
}
|
|
|
|
// if we are moving, and 500ms have passed, send an heartbeat packet
|
|
if( (_moveFlags & MOVEMENTFLAG_ANY_MOVE) && _optime + MOVE_HEARTBEAT_DELAY < getMSTime())
|
|
{
|
|
_BuildPacket(MSG_MOVE_HEARTBEAT);
|
|
}
|
|
|
|
// TODO: apply gravity, handle falling, swimming, etc.
|
|
}
|
|
|
|
void MovementMgr::MoveStop(void)
|
|
{
|
|
_moveFlags &= ~(MOVEMENTFLAG_ANY_MOVE);
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_STOP);
|
|
}
|
|
|
|
void MovementMgr::MoveStartForward(void)
|
|
{
|
|
_moveFlags |= MOVEMENTFLAG_FORWARD;
|
|
_moveFlags &= ~MOVEMENTFLAG_BACKWARD;
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_START_FORWARD);
|
|
}
|
|
|
|
void MovementMgr::MoveStartBackward(void)
|
|
{
|
|
_moveFlags |= MOVEMENTFLAG_BACKWARD;
|
|
_moveFlags &= ~MOVEMENTFLAG_FORWARD;
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_START_BACKWARD);
|
|
}
|
|
|
|
void MovementMgr::MoveStartStrafeLeft(void)
|
|
{
|
|
_moveFlags |= MOVEMENTFLAG_STRAFE_LEFT;
|
|
_moveFlags &= ~MOVEMENTFLAG_STRAFE_RIGHT;
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_START_STRAFE_LEFT);
|
|
}
|
|
|
|
void MovementMgr::MoveStartStrafeRight(void)
|
|
{
|
|
_moveFlags |= MOVEMENTFLAG_STRAFE_RIGHT;
|
|
_moveFlags &= ~MOVEMENTFLAG_STRAFE_LEFT;
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_START_STRAFE_RIGHT);
|
|
}
|
|
|
|
void MovementMgr::MoveStartTurnLeft(void)
|
|
{
|
|
_moveFlags |= MOVEMENTFLAG_LEFT;
|
|
_moveFlags &= ~MOVEMENTFLAG_RIGHT;
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_START_TURN_LEFT);
|
|
}
|
|
|
|
void MovementMgr::MoveStartTurnRight(void)
|
|
{
|
|
_moveFlags |= MOVEMENTFLAG_RIGHT;
|
|
_moveFlags &= ~MOVEMENTFLAG_LEFT;
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_START_TURN_RIGHT);
|
|
}
|
|
|
|
void MovementMgr::MoveStopTurn(void)
|
|
{
|
|
_moveFlags &= ~(MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT);
|
|
Update(false);
|
|
_BuildPacket(MSG_MOVE_STOP_TURN);
|
|
}
|
|
|
|
void MovementMgr::MoveSetFacing(float o)
|
|
{
|
|
_mychar->SetPosition(_mychar->GetX(), _mychar->GetY(), _mychar->GetZ(), o);
|
|
Update(true);
|
|
_BuildPacket(MSG_MOVE_SET_FACING);
|
|
}
|
|
|