mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 19:37:03 +00:00
[0048] Enable SMSG_MONSTER_MOVE, CMSG_SET_SELECTION and send normalized orientation in update and movement packets for client to react normally.
Signed-off-by: Yaki Khadafi <ElSolDolLo@gmail.com>
This commit is contained in:
parent
f592231863
commit
cfae212258
9 changed files with 32 additions and 30 deletions
|
|
@ -114,21 +114,6 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::
|
||||||
return IsValidMapCoord(loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation);
|
return IsValidMapCoord(loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z, loc.orientation);
|
||||||
}
|
}
|
||||||
|
|
||||||
// modulos a radian orientation to the range of 0..2PI
|
|
||||||
static float NormalizeOrientation(float o)
|
|
||||||
{
|
|
||||||
// fmod only supports positive numbers. Thus we have
|
|
||||||
// to emulate negative numbers
|
|
||||||
if (o < 0)
|
|
||||||
{
|
|
||||||
float mod = o * -1;
|
|
||||||
mod = fmod(mod, 2.0f * M_PI_F);
|
|
||||||
mod = -mod + 2.0f * M_PI_F;
|
|
||||||
return mod;
|
|
||||||
}
|
|
||||||
return fmod(o, 2.0f * M_PI_F);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoveAllObjectsInRemoveList();
|
void RemoveAllObjectsInRemoveList();
|
||||||
|
|
||||||
void LoadTransports();
|
void LoadTransports();
|
||||||
|
|
|
||||||
|
|
@ -448,7 +448,7 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
|
||||||
*data << float(unit->GetSpeed(MOVE_TURN_RATE));
|
*data << float(unit->GetSpeed(MOVE_TURN_RATE));
|
||||||
|
|
||||||
if (hasOrientation)
|
if (hasOrientation)
|
||||||
*data << float(unit->GetOrientation());
|
*data << float(NormalizeOrientation(unit->GetOrientation()));
|
||||||
|
|
||||||
*data << float(unit->GetSpeed(MOVE_RUN));
|
*data << float(unit->GetSpeed(MOVE_RUN));
|
||||||
|
|
||||||
|
|
@ -460,7 +460,7 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
|
||||||
|
|
||||||
if (updateFlags & UPDATEFLAG_VEHICLE)
|
if (updateFlags & UPDATEFLAG_VEHICLE)
|
||||||
{
|
{
|
||||||
*data << float(((WorldObject*)this)->GetOrientation());
|
*data << float(NormalizeOrientation(((WorldObject*)this)->GetOrientation()));
|
||||||
*data << uint32(((Unit*)this)->GetVehicleInfo()->GetEntry()->m_ID); // vehicle id
|
*data << uint32(((Unit*)this)->GetVehicleInfo()->GetEntry()->m_ID); // vehicle id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -513,7 +513,7 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
|
||||||
|
|
||||||
if (updateFlags & UPDATEFLAG_HAS_POSITION)
|
if (updateFlags & UPDATEFLAG_HAS_POSITION)
|
||||||
{
|
{
|
||||||
*data << float(((WorldObject*)this)->GetOrientation());
|
*data << float(NormalizeOrientation(((WorldObject*)this)->GetOrientation()));
|
||||||
*data << float(((WorldObject*)this)->GetPositionX());
|
*data << float(((WorldObject*)this)->GetPositionX());
|
||||||
*data << float(((WorldObject*)this)->GetPositionY());
|
*data << float(((WorldObject*)this)->GetPositionY());
|
||||||
*data << float(((WorldObject*)this)->GetPositionZ());
|
*data << float(((WorldObject*)this)->GetPositionZ());
|
||||||
|
|
@ -1364,13 +1364,13 @@ bool WorldObject::HasInArc(const float arcangle, const WorldObject* obj) const
|
||||||
float arc = arcangle;
|
float arc = arcangle;
|
||||||
|
|
||||||
// move arc to range 0.. 2*pi
|
// move arc to range 0.. 2*pi
|
||||||
arc = MapManager::NormalizeOrientation(arc);
|
arc = NormalizeOrientation(arc);
|
||||||
|
|
||||||
float angle = GetAngle(obj);
|
float angle = GetAngle(obj);
|
||||||
angle -= m_position.o;
|
angle -= m_position.o;
|
||||||
|
|
||||||
// move angle to range -pi ... +pi
|
// move angle to range -pi ... +pi
|
||||||
angle = MapManager::NormalizeOrientation(angle);
|
angle = NormalizeOrientation(angle);
|
||||||
if (angle > M_PI_F)
|
if (angle > M_PI_F)
|
||||||
angle -= 2.0f * M_PI_F;
|
angle -= 2.0f * M_PI_F;
|
||||||
|
|
||||||
|
|
@ -1736,7 +1736,7 @@ namespace MaNGOS
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NearUsedPosDo(WorldObject const& obj, WorldObject const* searcher, float absAngle, ObjectPosSelector& selector)
|
NearUsedPosDo(WorldObject const& obj, WorldObject const* searcher, float absAngle, ObjectPosSelector& selector)
|
||||||
: i_object(obj), i_searcher(searcher), i_absAngle(MapManager::NormalizeOrientation(absAngle)), i_selector(selector) {}
|
: i_object(obj), i_searcher(searcher), i_absAngle(NormalizeOrientation(absAngle)), i_selector(selector) {}
|
||||||
|
|
||||||
void operator()(Corpse*) const {}
|
void operator()(Corpse*) const {}
|
||||||
void operator()(DynamicObject*) const {}
|
void operator()(DynamicObject*) const {}
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,7 @@ void InitializeOpcodes()
|
||||||
OPCODE(CMSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
|
OPCODE(CMSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
|
||||||
OPCODE(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
|
OPCODE(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
|
||||||
//OPCODE(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode );
|
//OPCODE(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode );
|
||||||
//OPCODE(SMSG_MONSTER_MOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
OPCODE(SMSG_MONSTER_MOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||||
//OPCODE(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
//OPCODE(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||||
//OPCODE(SMSG_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
//OPCODE(SMSG_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||||
//OPCODE(CMSG_MOVE_CHARM_PORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
//OPCODE(CMSG_MOVE_CHARM_PORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||||
|
|
@ -389,7 +389,7 @@ void InitializeOpcodes()
|
||||||
//OPCODE(MSG_CHANNEL_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
//OPCODE(MSG_CHANNEL_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||||
//OPCODE(CMSG_CANCEL_CHANNELLING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelChanneling );
|
//OPCODE(CMSG_CANCEL_CHANNELLING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelChanneling );
|
||||||
//OPCODE(SMSG_AI_REACTION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
//OPCODE(SMSG_AI_REACTION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||||
//OPCODE(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode );
|
OPCODE(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode );
|
||||||
//OPCODE(CMSG_DELETEEQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDeleteOpcode );
|
//OPCODE(CMSG_DELETEEQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDeleteOpcode );
|
||||||
//OPCODE(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
//OPCODE(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||||
//OPCODE(CMSG_DEBUG_PASSIVE_AURA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
//OPCODE(CMSG_DEBUG_PASSIVE_AURA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||||
|
|
|
||||||
|
|
@ -374,7 +374,7 @@ enum Opcodes
|
||||||
MSG_CHANNEL_UPDATE = 0x113B,
|
MSG_CHANNEL_UPDATE = 0x113B,
|
||||||
CMSG_CANCEL_CHANNELLING = 0x113C,
|
CMSG_CANCEL_CHANNELLING = 0x113C,
|
||||||
SMSG_AI_REACTION = 0x113D,
|
SMSG_AI_REACTION = 0x113D,
|
||||||
CMSG_SET_SELECTION = 0x113E,
|
CMSG_SET_SELECTION = 0x0506, // 4.3.4 15595
|
||||||
CMSG_DELETEEQUIPMENT_SET = 0x113F,
|
CMSG_DELETEEQUIPMENT_SET = 0x113F,
|
||||||
CMSG_INSTANCE_LOCK_RESPONSE = 0x1140,
|
CMSG_INSTANCE_LOCK_RESPONSE = 0x1140,
|
||||||
CMSG_DEBUG_PASSIVE_AURA = 0x1141,
|
CMSG_DEBUG_PASSIVE_AURA = 0x1141,
|
||||||
|
|
|
||||||
|
|
@ -362,7 +362,7 @@ void MovementInfo::Write(ByteBuffer& data, uint16 opcode) const
|
||||||
break;
|
break;
|
||||||
case MSEPositionO:
|
case MSEPositionO:
|
||||||
if (si.hasOrientation)
|
if (si.hasOrientation)
|
||||||
data << float(pos.o);
|
data << float(NormalizeOrientation(pos.o));
|
||||||
break;
|
break;
|
||||||
case MSEPitch:
|
case MSEPitch:
|
||||||
if (si.hasPitch)
|
if (si.hasPitch)
|
||||||
|
|
@ -401,7 +401,7 @@ void MovementInfo::Write(ByteBuffer& data, uint16 opcode) const
|
||||||
break;
|
break;
|
||||||
case MSETransportPositionO:
|
case MSETransportPositionO:
|
||||||
if (hasTransportData)
|
if (hasTransportData)
|
||||||
data << float(t_pos.o);
|
data << float(NormalizeOrientation(t_pos.o));
|
||||||
break;
|
break;
|
||||||
case MSETransportPositionX:
|
case MSETransportPositionX:
|
||||||
if (hasTransportData)
|
if (hasTransportData)
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,10 @@
|
||||||
|
|
||||||
#include "packet_builder.h"
|
#include "packet_builder.h"
|
||||||
#include "MoveSpline.h"
|
#include "MoveSpline.h"
|
||||||
|
#include "Util.h"
|
||||||
#include "WorldPacket.h"
|
#include "WorldPacket.h"
|
||||||
#include "../Creature.h"
|
#include "../Creature.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Movement
|
namespace Movement
|
||||||
{
|
{
|
||||||
inline void operator << (ByteBuffer& b, const Vector3& v)
|
inline void operator << (ByteBuffer& b, const Vector3& v)
|
||||||
|
|
@ -69,7 +69,7 @@ namespace Movement
|
||||||
break;
|
break;
|
||||||
case MoveSplineFlag::Final_Angle:
|
case MoveSplineFlag::Final_Angle:
|
||||||
data << uint8(MonsterMoveFacingAngle);
|
data << uint8(MonsterMoveFacingAngle);
|
||||||
data << move_spline.facing.angle;
|
data << NormalizeOrientation(move_spline.facing.angle);
|
||||||
break;
|
break;
|
||||||
case MoveSplineFlag::Final_Point:
|
case MoveSplineFlag::Final_Point:
|
||||||
data << uint8(MonsterMoveFacingSpot);
|
data << uint8(MonsterMoveFacingSpot);
|
||||||
|
|
@ -201,7 +201,7 @@ namespace Movement
|
||||||
data << int32(move_spline.timePassed());
|
data << int32(move_spline.timePassed());
|
||||||
|
|
||||||
if (move_spline.splineflags & MoveSplineFlag::Final_Angle)
|
if (move_spline.splineflags & MoveSplineFlag::Final_Angle)
|
||||||
data << float(move_spline.facing.angle);
|
data << float(NormalizeOrientation(move_spline.facing.angle));
|
||||||
else if (move_spline.splineflags & MoveSplineFlag::Final_Target)
|
else if (move_spline.splineflags & MoveSplineFlag::Final_Target)
|
||||||
data.WriteGuidBytes<5, 3, 7, 1, 6, 4, 2, 0>(ObjectGuid(move_spline.facing.target));
|
data.WriteGuidBytes<5, 3, 7, 1, 6, 4, 2, 0>(ObjectGuid(move_spline.facing.target));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,21 @@ float GetFloatValueFromArray(Tokens const& data, uint16 index)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// modulos a radian orientation to the range of 0..2PI
|
||||||
|
float NormalizeOrientation(float o)
|
||||||
|
{
|
||||||
|
// fmod only supports positive numbers. Thus we have
|
||||||
|
// to emulate negative numbers
|
||||||
|
if (o < 0)
|
||||||
|
{
|
||||||
|
float mod = o * -1;
|
||||||
|
mod = fmod(mod, 2.0f * M_PI_F);
|
||||||
|
mod = -mod + 2.0f * M_PI_F;
|
||||||
|
return mod;
|
||||||
|
}
|
||||||
|
return fmod(o, 2.0f * M_PI_F);
|
||||||
|
}
|
||||||
|
|
||||||
void stripLineInvisibleChars(std::string& str)
|
void stripLineInvisibleChars(std::string& str)
|
||||||
{
|
{
|
||||||
static std::string invChars = " \t\7\n";
|
static std::string invChars = " \t\7\n";
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ Tokens StrSplit(const std::string& src, const std::string& sep);
|
||||||
uint32 GetUInt32ValueFromArray(Tokens const& data, uint16 index);
|
uint32 GetUInt32ValueFromArray(Tokens const& data, uint16 index);
|
||||||
float GetFloatValueFromArray(Tokens const& data, uint16 index);
|
float GetFloatValueFromArray(Tokens const& data, uint16 index);
|
||||||
|
|
||||||
|
float NormalizeOrientation(float o);
|
||||||
|
|
||||||
void stripLineInvisibleChars(std::string& src);
|
void stripLineInvisibleChars(std::string& src);
|
||||||
|
|
||||||
std::string secsToTimeString(time_t timeInSecs, bool shortText = false, bool hoursOnly = false);
|
std::string secsToTimeString(time_t timeInSecs, bool shortText = false, bool hoursOnly = false);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "0047"
|
#define REVISION_NR "0048"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue