本文整理汇总了C++中MovementInfo类的典型用法代码示例。如果您正苦于以下问题:C++ MovementInfo类的具体用法?C++ MovementInfo怎么用?C++ MovementInfo使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了MovementInfo类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DEBUG_LOG
void WorldSession::HandleFeatherFallAck(WorldPacket &recv_data)
{
DEBUG_LOG("WORLD: CMSG_MOVE_FEATHER_FALL_ACK size %u", recv_data.wpos());
ObjectGuid guid;
MovementInfo movementInfo;
recv_data >> guid; // guid
recv_data.read_skip<uint32>(); // counter
recv_data >> movementInfo;
movementInfo.UpdateTime(recv_data.GetPacketTime());
if (guid != _clientMoverGuid)
return;
if (!VerifyMovementInfo(movementInfo))
return;
if (!_player->GetCheatData()->HandleAnticheatTests(movementInfo, this, &recv_data))
return;
// Position change
HandleMoverRelocation(movementInfo);
_player->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode());
WorldPacket data(MSG_MOVE_FEATHER_FALL, recv_data.size());
data << guid.WriteAsPacked();
movementInfo.Write(data);
_player->SendMovementMessageToSet(std::move(data), true, _player);
}
示例2: DEBUG_LOG
void WorldSession::HandleMoveKnockBackAck(WorldPacket& recv_data)
{
DEBUG_LOG("CMSG_MOVE_KNOCK_BACK_ACK");
Unit* mover = _player->GetMover();
Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL;
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
if (plMover && plMover->IsBeingTeleported())
{
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return;
}
MovementInfo movementInfo;
recv_data >> movementInfo;
if (!VerifyMovementInfo(movementInfo, movementInfo.GetGuid()))
return;
HandleMoverRelocation(movementInfo);
WorldPacket data(SMSG_MOVE_UPDATE_KNOCK_BACK, recv_data.size() + 15);
data << movementInfo;
mover->SendMessageToSetExcept(&data, _player);
}
示例3: DEBUG_LOG
void WorldSession::HandleMoveKnockBackAck( WorldPacket & recv_data )
{
DEBUG_LOG("CMSG_MOVE_KNOCK_BACK_ACK");
Unit *mover = _player->GetMover();
Player *plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL;
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
if(plMover && plMover->IsBeingTeleported())
{
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return;
}
ObjectGuid guid;
MovementInfo movementInfo;
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // knockback packets counter
recv_data >> movementInfo;
if (!VerifyMovementInfo(movementInfo, guid))
return;
HandleMoverRelocation(movementInfo);
WorldPacket data(MSG_MOVE_KNOCK_BACK, recv_data.size() + 15);
data << mover->GetPackGUID();
data << movementInfo;
data << movementInfo.GetJumpInfo().sinAngle;
data << movementInfo.GetJumpInfo().cosAngle;
data << movementInfo.GetJumpInfo().xyspeed;
data << movementInfo.GetJumpInfo().velocity;
mover->SendMessageToSetExcept(&data, _player);
}
示例4: DEBUG_LOG
void WorldSession::HandleDismissControlledVehicle(WorldPacket& recv_data)
{
DEBUG_LOG("WORLD: Received CMSG_DISMISS_CONTROLLED_VEHICLE");
recv_data.hexlike();
MovementInfo movementInfo;
recv_data >> movementInfo;
if (!GetPlayer()->GetVehicle())
return;
bool dismiss = true;
Creature* vehicle = GetPlayer()->GetMap()->GetAnyTypeCreature(movementInfo.GetGuid());
if (!vehicle || !vehicle->IsVehicle() || !vehicle->GetVehicleKit() || !vehicle->GetEntry())
return;
if (vehicle->GetVehicleKit()->GetEntry()->m_flags & (VEHICLE_FLAG_NOT_DISMISS | VEHICLE_FLAG_ACCESSORY))
dismiss = false;
// Client freezes...
if (vehicle->GetEntry() == 34812 || vehicle->GetEntry() == 34819 || vehicle->GetEntry() == 34822 ||
vehicle->GetEntry() == 34823 || vehicle->GetEntry() == 34824)
dismiss = false;
GetPlayer()->m_movementInfo = movementInfo;
GetPlayer()->ExitVehicle();
if (dismiss)
vehicle->ForcedDespawn();
}
示例5: DEBUG_LOG
void WorldSession::HandleForceSpeedChangeAck(WorldPacket& recv_data)
{
DEBUG_LOG("WORLD: Recvd CMSG_SPEED_CHANGE_ACK");
/* extract packet */
ObjectGuid guid;
uint32 unk1;
MovementInfo movementInfo;
float newspeed;
recv_data >> guid;
recv_data >> unk1; // counter or moveEvent
recv_data >> movementInfo;
recv_data >> newspeed;
// now can skip not our packet
if (GetPlayer()->GetGUID() != guid.GetRawValue())
return;
/*----------------*/
// Save movement flags
GetPlayer()->SetUnitMovementFlags(movementInfo.GetMovementFlags());
// client ACK send one packet for mounted/run case and need skip all except last from its
// in other cases anti-cheat check can be fail in false case
UnitMoveType move_type;
UnitMoveType force_move_type;
//static char const* move_type_name[MAX_MOVE_TYPE] = {"Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack"};
uint16 opcode = recv_data.GetOpcode();
switch (opcode)
{
case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break;
case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break;
case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break;
case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break;
case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break;
case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break;
case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break;
case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break;
default:
sLog.outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode);
return;
}
// skip all forced speed changes except last and unexpected
// in run/mounted case used one ACK and it must be skipped.m_forced_speed_changes[MOVE_RUN] store both.
if (GetPlayer()->m_forced_speed_changes[force_move_type] > 0)
{
--GetPlayer()->m_forced_speed_changes[force_move_type];
if (GetPlayer()->m_forced_speed_changes[force_move_type] > 0)
return;
}
}
示例6: DEBUG_LOG
void WorldSession::HandleTaxiNextDestinationOpcode(WorldPacket& recv_data)
{
DEBUG_LOG("WORLD: Received CMSG_MOVE_SPLINE_DONE");
MovementInfo movementInfo; // used only for proper packet read
recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // unk
// in taxi flight packet received at the end of current path in far (multi-node) flight
uint32 curDest = GetPlayer()->m_taxi.GetTaxiDestination();
if (!curDest)
return;
uint32 destinationnode = GetPlayer()->m_taxi.NextTaxiDestination();
if (destinationnode > 0) // if more destinations to go
{
// current source node for next destination
uint32 sourcenode = GetPlayer()->m_taxi.GetTaxiSource();
// Add to taximask middle hubs in taxicheat mode (to prevent having player with disabled taxicheat and not having back flight path)
if (GetPlayer()->isTaxiCheater())
{
if (GetPlayer()->m_taxi.SetTaximaskNode(sourcenode))
{
WorldPacket data(SMSG_NEW_TAXI_PATH, 0);
_player->GetSession()->SendPacket(&data);
}
}
DEBUG_LOG("WORLD: Taxi has to go from %u to %u", sourcenode, destinationnode);
uint16 MountId = sObjectMgr.GetTaxiMount(sourcenode, GetPlayer()->GetTeam());
uint32 path, cost;
sObjectMgr.GetTaxiPath(sourcenode, destinationnode, path, cost);
if (path && MountId)
SendDoFlight(MountId, path, 1); // skip start fly node
else
GetPlayer()->m_taxi.ClearTaxiDestinations(); // clear problematic path and next
return;
}
else
{
GetPlayer()->m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
// has taxi flight just finished reset fall information to avoid receiving fall damage
GetPlayer()->SetFallInformation(0, movementInfo.GetPos()->GetPositionZ());
}
GetPlayer()->CleanupAfterTaxiFlight();
}
示例7: GetPlayer
void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket)
{
MovementInfo info;
info.ReadFromPacket(recvPacket);
//Stop Emote
if (GetPlayer()->GetUInt32Value(UNIT_NPC_EMOTESTATE))
GetPlayer()->HandleEmoteCommand(0);
HandleMovementInfo(info, recvPacket.GetOpcode(), recvPacket.size(), _player->m_mover);
}
示例8: HandleMovementInfo
void WorldSession::HandleMovementUnrootAck(WorldPacket& recvPacket)
{
MovementInfo info;
info.ReadFromPacket(recvPacket);
// skip old result
if (_player->m_movement_ack[ACK_UNROOT] != info.ackCount)
{
recvPacket.rfinish();
return;
}
HandleMovementInfo(info, recvPacket.GetOpcode(), recvPacket.size()-4, _player->m_mover);
}
示例9: VerifyMovementInfo
bool WorldSession::VerifyMovementInfo(MovementInfo const& movementInfo, ObjectGuid const& guid) const
{
// ignore wrong guid (player attempt cheating own session for not own guid possible...)
if (guid != _player->GetMover()->GetObjectGuid())
return false;
if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z, movementInfo.GetPos()->o))
return false;
if (movementInfo.GetTransportGuid())
{
// transports size limited
// (also received at zeppelin/lift leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
if (movementInfo.GetTransportPos()->x > 50 || movementInfo.GetTransportPos()->y > 50 || movementInfo.GetTransportPos()->z > 100)
return false;
if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x + movementInfo.GetTransportPos()->x, movementInfo.GetPos()->y + movementInfo.GetTransportPos()->y,
movementInfo.GetPos()->z + movementInfo.GetTransportPos()->z, movementInfo.GetPos()->o + movementInfo.GetTransportPos()->o))
{
return false;
}
}
return true;
}
示例10: DEBUG_LOG
void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{
uint32 opcode = recv_data.GetOpcode();
DEBUG_LOG("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode);
recv_data.hexlike();
Unit *mover = _player->GetMover();
Player *plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL;
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
if(plMover && plMover->IsBeingTeleported())
{
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return;
}
/* extract packet */
ObjectGuid guid;
MovementInfo movementInfo;
recv_data >> guid.ReadAsPacked();
recv_data >> movementInfo;
/*----------------*/
if (!VerifyMovementInfo(movementInfo, guid))
return;
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->IsTaxiFlying())
plMover->HandleFall(movementInfo);
/* process anticheat check */
GetPlayer()->GetAntiCheat()->DoAntiCheatCheck(CHECK_MOVEMENT,movementInfo, opcode);
/* process position-change */
HandleMoverRelocation(movementInfo);
if (plMover)
plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
// after move info set
if (opcode == MSG_MOVE_SET_WALK_MODE || opcode == MSG_MOVE_SET_RUN_MODE)
mover->UpdateWalkMode(mover, false);
WorldPacket data(opcode, recv_data.size());
data << mover->GetPackGUID(); // write guid
movementInfo.Write(data); // write data
mover->SendMessageToSetExcept(&data, _player);
}
示例11: DEBUG_LOG
void WorldSession::HandleMovementOpcodes(WorldPacket& recv_data)
{
Opcodes opcode = recv_data.GetOpcode();
if (!sLog.HasLogFilter(LOG_FILTER_PLAYER_MOVES))
{
DEBUG_LOG("WORLD: Received opcode %s (%u, 0x%X)", LookupOpcodeName(opcode), opcode, opcode);
recv_data.hexlike();
}
Unit* mover = _player->GetMover();
Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : nullptr;
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
if (plMover && plMover->IsBeingTeleported())
{
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return;
}
/* extract packet */
ObjectGuid guid;
MovementInfo movementInfo;
recv_data >> guid.ReadAsPacked();
recv_data >> movementInfo;
/*----------------*/
if (!VerifyMovementInfo(movementInfo, guid))
return;
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->IsTaxiFlying())
plMover->HandleFall(movementInfo);
// Remove auras that should be removed at landing on ground or water
if (opcode == MSG_MOVE_FALL_LAND || opcode == MSG_MOVE_START_SWIM)
mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_LANDING); // Parachutes
/* process position-change */
HandleMoverRelocation(movementInfo);
if (plMover)
plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
WorldPacket data(opcode, recv_data.size());
data << mover->GetPackGUID(); // write guid
movementInfo.Write(data); // write data
mover->SendMessageToSetExcept(data, _player);
}
示例12: TeleportPlaneHackDetection
void AnticheatMgr::TeleportPlaneHackDetection(Player* player, MovementInfo movementInfo)
{
if ((sWorld->getIntConfig(CONFIG_ANTICHEAT_DETECTIONS_ENABLED) & TELEPORT_PLANE_HACK_DETECTION) == 0)
return;
uint32 key = player->GetGUIDLow();
if (m_Players[key].GetLastMovementInfo().pos.GetPositionZ() != 0 ||
movementInfo.pos.GetPositionZ() != 0)
return;
if (movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))
return;
//DEAD_FALLING was deprecated
//if (player->getDeathState() == DEAD_FALLING)
// return;
float x, y, z;
player->GetPosition(x, y, z);
float ground_Z = player->GetMap()->GetHeight(x, y, z);
float z_diff = fabs(ground_Z - z);
// we are not really walking there
if (z_diff > 1.0f)
{
TC_LOG_DEBUG("entities.player.character", "AnticheatMgr:: Teleport To Plane - Hack detected player GUID (low) %u",player->GetGUIDLow());
BuildReport(player,TELEPORT_PLANE_HACK_REPORT);
}
}
示例13: DEBUG_LOG
void WorldSession::HandleMoveNotActiveMoverOpcode(WorldPacket &recv_data)
{
DEBUG_LOG("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER");
recv_data.hexlike();
MovementInfo mi;
recv_data >> mi;
if (_player->GetMover()->GetObjectGuid() == mi.GetGuid())
{
DEBUG_LOG("World: CMSG_MOVE_NOT_ACTIVE_MOVER %s received, but his now is active mover!", mi.GetGuid().GetString().c_str());
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
}
_player->m_movementInfo = mi;
}
示例14: TeleportPlaneHackDetection
void AnticheatMgr::TeleportPlaneHackDetection(Player* player, MovementInfo movementInfo)
{
uint32 key = player->GetGUIDLow();
if (m_Players[key].GetLastMovementInfo().pos.GetPositionZ() != 0 ||
movementInfo.pos.GetPositionZ() != 0)
return;
if (movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))
return;
//DEAD_FALLING was deprecated
//if (player->getDeathState() == DEAD_FALLING)
// return;
float x, y, z;
player->GetPosition(x, y, z);
float ground_Z = player->GetMap()->GetHeight(x, y, z);
float z_diff = fabs(ground_Z - z);
// we are not really walking there
if (z_diff > 9.0f)
{
Report(player, TELEPORTPLANE_HACK);
}
}
示例15: SynchronizeMovement
void WorldSession::SynchronizeMovement(MovementInfo &movementInfo)
{
// Get time based on server
uint32 currMsTime = WorldTimer::getMSTime();
// Invalidate syncs older than 750ms (and start new one)
if (lastMoveTimeServer < currMsTime - 750)
{
lastMoveTimeServer = currMsTime;
}
else
{
// The time that is between last clients time and current client time gets applie to last server time
uint32 clientMsDiff = movementInfo.time - lastMoveTimeClient;
if (clientMsDiff > 750)
lastMoveTimeServer = currMsTime;
else
{
uint32 serverDiffApplied = lastMoveTimeServer + clientMsDiff;
lastMoveTimeServer = serverDiffApplied;
}
if (lastMoveTimeServer > currMsTime)
lastMoveTimeServer = currMsTime;
}
lastMoveTimeClient = movementInfo.time;
movementInfo.UpdateTime(lastMoveTimeServer);
}