*Update WorldSession::HandleMovementOpcodes with some new information on how vehicles behave, and do a little bit of cleanup.

--HG--
branch : trunk
This commit is contained in:
maximius
2009-11-03 22:28:04 -08:00
parent 1eaf0396b2
commit 1d7f2fc243
3 changed files with 27 additions and 29 deletions
+6 -6
View File
@@ -419,7 +419,7 @@ void GameObject::Update(uint32 /*p_time*/)
{ {
std::set<uint32>::const_iterator it = m_unique_users.begin(); std::set<uint32>::const_iterator it = m_unique_users.begin();
std::set<uint32>::const_iterator end = m_unique_users.end(); std::set<uint32>::const_iterator end = m_unique_users.end();
for (; it != end; it++) for (; it != end; ++it)
{ {
Unit* owner = Unit::GetUnit(*this, uint64(*it)); Unit* owner = Unit::GetUnit(*this, uint64(*it));
// For now we do not support go cast // For now we do not support go cast
@@ -986,12 +986,12 @@ void GameObject::Use(Unit* user)
if(user->GetTypeId() != TYPEID_PLAYER) if(user->GetTypeId() != TYPEID_PLAYER)
return; return;
if (!ChairListSlots.size()) //this is called once at first chair use to make list of available slots if (!ChairListSlots.size()) // this is called once at first chair use to make list of available slots
if (info->chair.slots > 0) //sometimes chairs in DB have error in fields and we dont know number of slots if (info->chair.slots > 0) // sometimes chairs in DB have error in fields and we dont know number of slots
for (uint32 i=0; i<info->chair.slots; i++) for (uint32 i = 0; i < info->chair.slots; ++i)
ChairListSlots[i] = 0; //Last user of current slot set to 0 (none sit here yet) ChairListSlots[i] = 0; // Last user of current slot set to 0 (none sit here yet)
else else
ChairListSlots[0] = 0; //error in DB, make one default slot ChairListSlots[0] = 0; // error in DB, make one default slot
Player* player = (Player*)user; Player* player = (Player*)user;
+20 -21
View File
@@ -225,14 +225,19 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data)
void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{ {
uint32 opcode = recv_data.GetOpcode(); uint16 opcode = recv_data.GetOpcode();
//sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); //sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode);
Unit *mover = _player->m_mover; Unit *mover = _player->m_mover;
// vehicles become the mover, so mover->GetVehicle() should never be true
// also, if the mover is a vehicle, it should never be on a transport
assert(mover && !mover->GetVehicle() && (!mover->IsVehicle() || !mover->GetTransport()));
Player *plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL; Player *plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL;
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
if(plMover && plMover->IsBeingTeleported()) if (plMover && plMover->IsBeingTeleported())
{ {
recv_data.rpos(recv_data.wpos()); // prevent warnings spam recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; return;
@@ -243,7 +248,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
ReadMovementInfo(recv_data, &movementInfo); ReadMovementInfo(recv_data, &movementInfo);
/*----------------*/ /*----------------*/
if(recv_data.size() != recv_data.rpos()) if (recv_data.size() != recv_data.rpos())
{ {
sLog.outError("MovementHandler: player %s (guid %d, account %u) sent a packet (opcode %u) that is " SIZEFMTD " bytes larger than it should be. Kicked as cheater.", _player->GetName(), _player->GetGUIDLow(), _player->GetSession()->GetAccountId(), recv_data.GetOpcode(), recv_data.size() - recv_data.rpos()); sLog.outError("MovementHandler: player %s (guid %d, account %u) sent a packet (opcode %u) that is " SIZEFMTD " bytes larger than it should be. Kicked as cheater.", _player->GetName(), _player->GetGUIDLow(), _player->GetSession()->GetAccountId(), recv_data.GetOpcode(), recv_data.size() - recv_data.rpos());
KickPlayer(); KickPlayer();
@@ -251,7 +256,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
return; return;
} }
if (!MaNGOS::IsValidMapCoord(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o)) if (!Trinity::IsValidMapCoord(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o))
{ {
recv_data.rpos(recv_data.wpos()); // prevent warnings spam recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; return;
@@ -262,21 +267,21 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{ {
// transports size limited // transports size limited
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) // (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
if( movementInfo.t_x > 50 || movementInfo.t_y > 50 || movementInfo.t_z > 50 ) if (movementInfo.t_x > 50 || movementInfo.t_y > 50 || movementInfo.t_z > 50)
{ {
recv_data.rpos(recv_data.wpos()); // prevent warnings spam recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; return;
} }
if( !MaNGOS::IsValidMapCoord(movementInfo.x+movementInfo.t_x, movementInfo.y + movementInfo.t_y, if (!Trinity::IsValidMapCoord(movementInfo.x+movementInfo.t_x, movementInfo.y + movementInfo.t_y,
movementInfo.z + movementInfo.t_z, movementInfo.o + movementInfo.t_o) ) movementInfo.z + movementInfo.t_z, movementInfo.o + movementInfo.t_o))
{ {
recv_data.rpos(recv_data.wpos()); // prevent warnings spam recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; return;
} }
// if we boarded a transport, add us to it // if we boarded a transport, add us to it
if (plMover && !plMover->m_transport) if (plMover && !plMover->GetTransport() && !mover->IsVehicle())
{ {
// elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just unmount if the guid can be found in the transport list // elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just unmount if the guid can be found in the transport list
for (MapManager::TransportSet::const_iterator iter = MapManager::Instance().m_Transports.begin(); iter != MapManager::Instance().m_Transports.end(); ++iter) for (MapManager::TransportSet::const_iterator iter = MapManager::Instance().m_Transports.begin(); iter != MapManager::Instance().m_Transports.end(); ++iter)
@@ -290,7 +295,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
} }
} }
if(!mover->GetTransport() && !mover->GetVehicle()) if (!mover->GetTransport() && !mover->IsVehicle())
movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT; movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
} }
else if (plMover && plMover->m_transport) // if we were on a transport, leave else if (plMover && plMover->m_transport) // if we were on a transport, leave
@@ -312,7 +317,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
if (plMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plMover->IsInWater()) if (plMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plMover->IsInWater())
{ {
// now client not include swimming flag in case jumping under water // now client not include swimming flag in case jumping under water
plMover->SetInWater( !plMover->IsInWater() || plMover->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) ); plMover->SetInWater(!plMover->IsInWater() || plMover->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z));
} }
/*----------------------*/ /*----------------------*/
@@ -326,20 +331,14 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
mover->m_movementInfo = movementInfo; mover->m_movementInfo = movementInfo;
if(mover->GetVehicle()) if (plMover) // nothing is charmed, or player charmed
{
mover->SetOrientation(movementInfo.o);
return;
}
if(plMover) // nothing is charmed, or player charmed
{ {
plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
plMover->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode()); plMover->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode());
if(movementInfo.z < -500.0f) if (movementInfo.z < -500.0f)
{ {
if(plMover->InBattleGround() if (plMover->InBattleGround()
&& plMover->GetBattleGround() && plMover->GetBattleGround()
&& plMover->GetBattleGround()->HandlePlayerUnderMap(_player)) && plMover->GetBattleGround()->HandlePlayerUnderMap(_player))
{ {
@@ -350,11 +349,11 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
// NOTE: this is actually called many times while falling // NOTE: this is actually called many times while falling
// even after the player has been teleported away // even after the player has been teleported away
// TODO: discard movement packets after the player is rooted // TODO: discard movement packets after the player is rooted
if(plMover->isAlive()) if (plMover->isAlive())
{ {
plMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth()); plMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth());
// pl can be alive if GM/etc // pl can be alive if GM/etc
if(!plMover->isAlive()) if (!plMover->isAlive())
{ {
// change the death state to CORPSE to prevent the death timer from // change the death state to CORPSE to prevent the death timer from
// starting in the next player update // starting in the next player update
-1
View File
@@ -15169,7 +15169,6 @@ void Unit::OutDebugInfo() const
sLog.outString("On vehicle %u.", GetVehicleBase()->GetEntry()); sLog.outString("On vehicle %u.", GetVehicleBase()->GetEntry());
} }
// MrSmite 09-05-2009 PetAI_v1.0
void CharmInfo::SetIsCommandAttack(bool val) void CharmInfo::SetIsCommandAttack(bool val)
{ {
m_isCommandAttack = val; m_isCommandAttack = val;