*Some work on vehicles.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-04-17 15:08:58 -05:00
parent af935468df
commit c7d78b5ff9
17 changed files with 392 additions and 190 deletions
+2
View File
@@ -150,6 +150,8 @@ ChatCommand * ChatHandler::getCommandTable()
{ "setitemflag", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSetItemFlagCommand, "", NULL }, { "setitemflag", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSetItemFlagCommand, "", NULL },
{ "setvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSetValue, "", NULL }, { "setvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSetValue, "", NULL },
{ "spawnvehicle", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSpawnVehicle, "", NULL }, { "spawnvehicle", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSpawnVehicle, "", NULL },
{ "setvid", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSetVehicleId, "", NULL },
{ "entervehicle", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugEnterVehicle, "", NULL },
{ "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugUpdateWorldStateCommand, "", NULL }, { "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugUpdateWorldStateCommand, "", NULL },
{ "update", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugUpdate, "", NULL }, { "update", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugUpdate, "", NULL },
{ NULL, 0, false, NULL, "", NULL } { NULL, 0, false, NULL, "", NULL }
+2
View File
@@ -131,7 +131,9 @@ class ChatHandler
bool HandleDebugMod32Value(const char* args); bool HandleDebugMod32Value(const char* args);
bool HandleDebugSetValue(const char* args); bool HandleDebugSetValue(const char* args);
bool HandleDebugSetItemFlagCommand(const char * args); bool HandleDebugSetItemFlagCommand(const char * args);
bool HandleDebugSetVehicleId(const char * args);
bool HandleDebugSpawnVehicle(const char * args); bool HandleDebugSpawnVehicle(const char * args);
bool HandleDebugEnterVehicle(const char * args);
bool HandleDebugUpdate(const char* args); bool HandleDebugUpdate(const char* args);
bool HandleDebugUpdateWorldStateCommand(const char* args); bool HandleDebugUpdateWorldStateCommand(const char* args);
+51
View File
@@ -32,6 +32,10 @@
#include "BattleGroundMgr.h" #include "BattleGroundMgr.h"
#include <fstream> #include <fstream>
#include "ObjectMgr.h" #include "ObjectMgr.h"
#include "Cell.h"
#include "CellImpl.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
bool ChatHandler::HandleDebugSendSpellFailCommand(const char* args) bool ChatHandler::HandleDebugSendSpellFailCommand(const char* args)
{ {
@@ -673,6 +677,53 @@ bool ChatHandler::HandleDebugHostilRefList(const char * /*args*/)
return true; return true;
} }
bool ChatHandler::HandleDebugSetVehicleId(const char *args)
{
Unit* target = getSelectedUnit();
if(!target || target->GetTypeId() != TYPEID_UNIT || !((Creature*)target)->isVehicle())
return false;
if(!args)
return false;
char* i = strtok((char*)args, " ");
if(!i)
return false;
uint32 id = (uint32)atoi(i);
((Vehicle*)target)->SetVehicleId(id);
target->SendUpdateObjectToAllExcept(NULL);
PSendSysMessage("Vehicle id set to %u", id);
return true;
}
bool ChatHandler::HandleDebugEnterVehicle(const char * args)
{
Unit* target = getSelectedUnit();
if(!target || target->GetTypeId() != TYPEID_UNIT || !((Creature*)target)->isVehicle())
return false;
if(!args)
return false;
char* i = strtok((char*)args, " ");
if(!i)
return false;
uint32 entry = (uint32)atoi(i);
Creature *passenger = NULL;
Trinity::AllCreaturesOfEntryInRange check(m_session->GetPlayer(), entry, 20.0f);
Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_session->GetPlayer(), passenger, check);
m_session->GetPlayer()->VisitNearbyObject(20.0f, searcher);
if(!passenger || passenger == target)
return false;
((Vehicle*)target)->AddPassenger(passenger);
PSendSysMessage("Creature entered vehicle");
return true;
}
bool ChatHandler::HandleDebugSpawnVehicle(const char* args) bool ChatHandler::HandleDebugSpawnVehicle(const char* args)
{ {
if(!args) if(!args)
+12
View File
@@ -35,6 +35,7 @@
#include "ScriptCalls.h" #include "ScriptCalls.h"
#include "Group.h" #include "Group.h"
#include "MapRefManager.h" #include "MapRefManager.h"
#include "Vehicle.h"
#include "MapInstanced.h" #include "MapInstanced.h"
#include "InstanceSaveMgr.h" #include "InstanceSaveMgr.h"
@@ -962,6 +963,17 @@ Map::CreatureRelocation(Creature *creature, float x, float y, float z, float ang
creature->Relocate(x, y, z, ang); creature->Relocate(x, y, z, ang);
AddUnitToNotify(creature); AddUnitToNotify(creature);
} }
if(creature->isVehicle())
{
for(SeatMap::iterator itr = ((Vehicle*)creature)->m_Seats.begin(); itr != ((Vehicle*)creature)->m_Seats.end(); ++itr)
if(itr->second.passenger)
if(itr->second.passenger->GetTypeId() == TYPEID_PLAYER)
PlayerRelocation((Player*)itr->second.passenger, x, y, z, ang);
else
CreatureRelocation((Creature*)itr->second.passenger, x, y, z, ang);
}
assert(CheckGridIntegrity(creature,true)); assert(CheckGridIntegrity(creature,true));
} }
+2 -1
View File
@@ -44,6 +44,7 @@
#include "Pet.h" #include "Pet.h"
#include "SocialMgr.h" #include "SocialMgr.h"
#include "CellImpl.h" #include "CellImpl.h"
#include "Vehicle.h"
void WorldSession::HandleRepopRequestOpcode( WorldPacket & /*recv_data*/ ) void WorldSession::HandleRepopRequestOpcode( WorldPacket & /*recv_data*/ )
{ {
@@ -1695,7 +1696,7 @@ void WorldSession::HandleSpellClick( WorldPacket & recv_data )
return; return;
} }
_player->EnterVehicle(vehicle); vehicle->AddPassenger(_player);
} }
void WorldSession::HandleInspectAchievements( WorldPacket & recv_data ) void WorldSession::HandleInspectAchievements( WorldPacket & recv_data )
+24 -4
View File
@@ -338,9 +338,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{ {
if(Map *map = mover->GetMap()) if(Map *map = mover->GetMap())
{ {
//if(GetPlayer()->m_seer != mover)
if(((Creature*)mover)->isVehicle())
map->PlayerRelocation(GetPlayer(), movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
} }
mover->SetUnitMovementFlags(movementInfo.flags); mover->SetUnitMovementFlags(movementInfo.flags);
@@ -482,10 +479,33 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data)
// using charm guid, because we don't have vehicle guid... // using charm guid, because we don't have vehicle guid...
if(Vehicle *vehicle = ObjectAccessor::GetVehicle(vehicleGUID)) if(Vehicle *vehicle = ObjectAccessor::GetVehicle(vehicleGUID))
{ {
_player->ExitVehicle(vehicle); vehicle->RemovePassenger(_player);
} }
} }
void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: Recvd CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE");
recv_data.hexlike();
uint32 a;
uint16 b;
uint16 c;
uint32 d,e,f,g,h,i,j,k;
int8 seat;
recv_data >> a >> b >> c;
recv_data >> d >> e >> f >> g >> h >> i >> j >> k;
recv_data >> seat;
//sLog.outError("change seat %u %u %u %u %u %u %u %u %u %u %u %u", a, b,c,d,e,f,g,h,i,j,k,seat);
}
void WorldSession::HandleRequestVehicleExit(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: Recvd CMSG_REQUEST_VEHICLE_EXIT");
recv_data.hexlike();
if(GetPlayer()->m_Vehicle)
GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer());
}
void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket& /*recvdata*/) void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket& /*recvdata*/)
{ {
//sLog.outDebug("WORLD: Recvd CMSG_MOUNTSPECIAL_ANIM"); //sLog.outDebug("WORLD: Recvd CMSG_MOUNTSPECIAL_ANIM");
+34 -33
View File
@@ -277,7 +277,10 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
case TYPEID_UNIT: case TYPEID_UNIT:
{ {
flags2 = ((Unit*)this)->GetUnitMovementFlags(); flags2 = ((Unit*)this)->GetUnitMovementFlags();
flags2 &= ~MOVEMENTFLAG_ONTRANSPORT; if(((Unit*)this)->m_Vehicle)
flags2 |= MOVEMENTFLAG_ONTRANSPORT;
else
flags2 &= ~MOVEMENTFLAG_ONTRANSPORT;
flags2 &= ~MOVEMENTFLAG_SPLINE2; flags2 &= ~MOVEMENTFLAG_SPLINE2;
} }
break; break;
@@ -285,7 +288,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
{ {
flags2 = ((Player*)this)->GetUnitMovementFlags(); flags2 = ((Player*)this)->GetUnitMovementFlags();
if(((Player*)this)->GetTransport() || ((Player*)this)->hasUnitState(UNIT_STAT_ONVEHICLE)) if(((Player*)this)->GetTransport() || ((Player*)this)->m_Vehicle)
flags2 |= MOVEMENTFLAG_ONTRANSPORT; flags2 |= MOVEMENTFLAG_ONTRANSPORT;
else else
flags2 &= ~MOVEMENTFLAG_ONTRANSPORT; flags2 &= ~MOVEMENTFLAG_ONTRANSPORT;
@@ -333,20 +336,16 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
// 0x00000200 // 0x00000200
if(flags2 & MOVEMENTFLAG_ONTRANSPORT) if(flags2 & MOVEMENTFLAG_ONTRANSPORT)
{ {
if(GetTypeId() == TYPEID_PLAYER) if(((Unit*)this)->m_Vehicle)
{ *data << (uint64)((Unit*)this)->m_Vehicle->GetGUID();
if(((Player*)this)->hasUnitState(UNIT_STAT_ONVEHICLE)) else
*data << (uint64)((Player*)this)->GetCharmGUID(); *data << (uint64)((Player*)this)->GetTransport()->GetGUID();
else *data << (float)((Unit*)this)->GetTransOffsetX();
*data << (uint64)((Player*)this)->GetTransport()->GetGUID(); *data << (float)((Unit*)this)->GetTransOffsetY();
*data << (float)((Player*)this)->GetTransOffsetX(); *data << (float)((Unit*)this)->GetTransOffsetZ();
*data << (float)((Player*)this)->GetTransOffsetY(); *data << (float)((Unit*)this)->GetTransOffsetO();
*data << (float)((Player*)this)->GetTransOffsetZ(); *data << (uint32)((Unit*)this)->GetTransTime();
*data << (float)((Player*)this)->GetTransOffsetO(); *data << (int8)((Unit*)this)->GetTransSeat();
*data << (uint32)((Player*)this)->GetTransTime();
*data << (int8)((Player*)this)->GetTransSeat();
}
//TrinIty currently not have support for other than player on transport
} }
// 0x02200000 // 0x02200000
@@ -559,7 +558,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
// 0x80 // 0x80
if(flags & UPDATEFLAG_VEHICLE) // unused for now if(flags & UPDATEFLAG_VEHICLE) // unused for now
{ {
*data << uint32(((Vehicle*)this)->GetVehicleId()); // vehicle id *data << uint32(((Vehicle*)this)->GetVehicleInfo()->m_ID); // vehicle id
*data << float(0); // facing adjustment *data << float(0); // facing adjustment
} }
} }
@@ -1612,15 +1611,16 @@ void WorldObject::BuildHeartBeatMsg(WorldPacket *data) const
*data << m_positionY; *data << m_positionY;
*data << m_positionZ; *data << m_positionZ;
*data << m_orientation; *data << m_orientation;
if(GetTypeId() == TYPEID_PLAYER && ((Unit*)this)->hasUnitState(UNIT_STAT_ONVEHICLE)) if(((Unit*)this)->m_Vehicle)
{ {
*data << uint64(((Unit*)this)->GetCharmGUID()); *data << uint64(((Unit*)this)->m_Vehicle->GetGUID());
*data << float(((Player*)this)->GetTransOffsetX()); *data << float (((Unit*)this)->GetTransOffsetX());
*data << float(((Player*)this)->GetTransOffsetY()); *data << float (((Unit*)this)->GetTransOffsetY());
*data << float(((Player*)this)->GetTransOffsetZ()); *data << float (((Unit*)this)->GetTransOffsetZ());
*data << float(((Player*)this)->GetTransOffsetO()); *data << float (((Unit*)this)->GetTransOffsetO());
*data << uint32(((Player*)this)->GetTransTime()); *data << uint32(((Unit*)this)->GetTransTime());
*data << uint8(((Player*)this)->GetTransSeat()); *data << uint8 (((Unit*)this)->GetTransSeat());
sLog.outError("heart seat is %u", ((Unit*)this)->GetTransTime());
} }
*data << uint32(0); //fall time *data << uint32(0); //fall time
} }
@@ -1641,15 +1641,16 @@ void WorldObject::BuildTeleportAckMsg(WorldPacket *data, float x, float y, float
*data << y; *data << y;
*data << z; *data << z;
*data << ang; *data << ang;
if(GetTypeId() == TYPEID_PLAYER && ((Unit*)this)->hasUnitState(UNIT_STAT_ONVEHICLE)) if(((Unit*)this)->m_Vehicle)
{ {
*data << uint64(((Unit*)this)->GetCharmGUID()); *data << uint64(((Unit*)this)->m_Vehicle->GetGUID());
*data << float(((Player*)this)->GetTransOffsetX()); *data << float (((Unit*)this)->GetTransOffsetX());
*data << float(((Player*)this)->GetTransOffsetY()); *data << float (((Unit*)this)->GetTransOffsetY());
*data << float(((Player*)this)->GetTransOffsetZ()); *data << float (((Unit*)this)->GetTransOffsetZ());
*data << float(((Player*)this)->GetTransOffsetO()); *data << float (((Unit*)this)->GetTransOffsetO());
*data << uint32(((Player*)this)->GetTransTime()); *data << uint32(((Unit*)this)->GetTransTime());
*data << uint8(((Player*)this)->GetTransSeat()); *data << uint8 (((Unit*)this)->GetTransSeat());
sLog.outError("seat is %u", ((Unit*)this)->GetTransTime());
} }
*data << uint32(0); *data << uint32(0);
} }
+8
View File
@@ -372,6 +372,14 @@ class TRINITY_DLL_SPEC WorldObject : public Object
void _Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid, uint32 phaseMask); void _Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid, uint32 phaseMask);
void Relocate(WorldObject *obj)
{
m_positionX = obj->GetPositionX();
m_positionY = obj->GetPositionY();
m_positionZ = obj->GetPositionZ();
m_orientation = obj->GetOrientation();
}
void Relocate(float x, float y, float z, float orientation) void Relocate(float x, float y, float z, float orientation)
{ {
m_positionX = x; m_positionX = x;
+2 -2
View File
@@ -1170,7 +1170,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x473*/ { "CMSG_CHAR_CUSTOMIZE", STATUS_AUTHED, &WorldSession::HandleCharCustomize }, /*0x473*/ { "CMSG_CHAR_CUSTOMIZE", STATUS_AUTHED, &WorldSession::HandleCharCustomize },
/*0x474*/ { "SMSG_CHAR_CUSTOMIZE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x474*/ { "SMSG_CHAR_CUSTOMIZE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x475*/ { "SMSG_PET_RENAMEABLE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x475*/ { "SMSG_PET_RENAMEABLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x476*/ { "CMSG_REQUEST_VEHICLE_EXIT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x476*/ { "CMSG_REQUEST_VEHICLE_EXIT", STATUS_LOGGEDIN, &WorldSession::HandleRequestVehicleExit },
/*0x477*/ { "CMSG_REQUEST_VEHICLE_PREV_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x477*/ { "CMSG_REQUEST_VEHICLE_PREV_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
@@ -1207,7 +1207,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x498*/ { "SMSG_SERVER_FIRST_ACHIEVEMENT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x498*/ { "SMSG_SERVER_FIRST_ACHIEVEMENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x499*/ { "SMSG_PET_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x499*/ { "SMSG_PET_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x49A*/ { "SMSG_PET_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x49A*/ { "SMSG_PET_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x49B*/ { "CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x49B*/ { "CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE", STATUS_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle},
/*0x49C*/ { "CMSG_HEARTH_AND_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x49C*/ { "CMSG_HEARTH_AND_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x49D*/ { "SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x49D*/ { "SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x49E*/ { "SMSG_CRITERIA_DELETED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x49E*/ { "SMSG_CRITERIA_DELETED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+12 -97
View File
@@ -16492,7 +16492,7 @@ void Player::StopCastingCharm()
if(((Creature*)charm)->isPet() && ((Pet*)charm)->getPetType() == POSSESSED_PET) if(((Creature*)charm)->isPet() && ((Pet*)charm)->getPetType() == POSSESSED_PET)
((Pet*)charm)->Remove(PET_SAVE_AS_DELETED); ((Pet*)charm)->Remove(PET_SAVE_AS_DELETED);
else if(((Creature*)charm)->isVehicle()) else if(((Creature*)charm)->isVehicle())
ExitVehicle((Vehicle*)charm); ((Vehicle*)charm)->RemovePassenger(this);
} }
if(GetCharmGUID()) if(GetCharmGUID())
{ {
@@ -16707,8 +16707,8 @@ void Player::PossessSpellInitialize()
void Player::VehicleSpellInitialize() void Player::VehicleSpellInitialize()
{ {
Unit* charm = GetCharm(); Unit* charm = m_Vehicle;
if(!charm || charm->GetTypeId() != TYPEID_UNIT) if(!charm)
return; return;
WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*10+1+1); WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*10+1+1);
@@ -16808,9 +16808,14 @@ void Player::CharmSpellInitialize()
uint8 count = 0; uint8 count = 0;
data << uint8(count); // cooldowns count data << uint8(count); // cooldowns count
data.hexlike(); GetSession()->SendPacket(&data);
}
void Player::SendRemoveControlBar()
{
WorldPacket data(SMSG_PET_SPELLS, 8+4);
data << uint64(0);
data << uint32(0);
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
} }
@@ -19559,7 +19564,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply)
return; return;
} }
if(target->isType(TYPEMASK_UNIT)) if(target->isType(TYPEMASK_UNIT) && !m_Vehicle)
((Unit*)target)->AddPlayerToVision(this); ((Unit*)target)->AddPlayerToVision(this);
} }
else else
@@ -19572,7 +19577,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply)
return; return;
} }
if(target->isType(TYPEMASK_UNIT)) if(target->isType(TYPEMASK_UNIT) && !m_Vehicle)
((Unit*)target)->RemovePlayerFromVision(this); ((Unit*)target)->RemovePlayerFromVision(this);
//must immediately set seer back otherwise may crash //must immediately set seer back otherwise may crash
@@ -19673,96 +19678,6 @@ void Player::InitGlyphsForLevel()
SetUInt32Value(PLAYER_GLYPHS_ENABLED, value); SetUInt32Value(PLAYER_GLYPHS_ENABLED, value);
} }
void Player::EnterVehicle(Vehicle *vehicle)
{
sLog.outDebug("Player %s enter vehicle entry %u id %u dbguid %u", GetName(), vehicle->GetEntry(), vehicle->GetVehicleId(), vehicle->GetDBTableGUIDLow());
if(vehicle->GetCharmerGUID())
return;
VehicleEntry const *ve = sVehicleStore.LookupEntry(vehicle->GetVehicleId());
if(!ve)
return;
VehicleSeatEntry const *veSeat = sVehicleSeatStore.LookupEntry(ve->m_seatID[0]);
if(!veSeat)
return;
vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
vehicle->setFaction(getFaction());
StopCastingCharm();
StopCastingBindSight();
SetCharm(vehicle, true);
SetViewpoint(vehicle, true);
SetMover(vehicle);
SetClientControl(vehicle, 1); // redirect controls to vehicle
addUnitState(UNIT_STAT_ONVEHICLE);
Relocate(vehicle->GetPositionX(), vehicle->GetPositionY(), vehicle->GetPositionZ(), vehicle->GetOrientation());
AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
m_movementInfo.t_x = veSeat->m_attachmentOffsetX;
m_movementInfo.t_y = veSeat->m_attachmentOffsetY;
m_movementInfo.t_z = veSeat->m_attachmentOffsetZ;
m_movementInfo.t_o = 0;
m_movementInfo.t_time = getMSTime();
m_movementInfo.t_seat = 0;
WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
GetSession()->SendPacket(&data);
BuildTeleportAckMsg(&data, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
GetSession()->SendPacket(&data);
BuildHeartBeatMsg(&data);
SendMessageToSet(&data, false);
VehicleSpellInitialize();
}
void Player::ExitVehicle(Vehicle *vehicle)
{
vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H);
SetCharm(vehicle, false);
SetViewpoint(vehicle, false);
SetMover(this);
SetClientControl(vehicle, 0);
clearUnitState(UNIT_STAT_ONVEHICLE);
Relocate(vehicle->GetPositionX(), vehicle->GetPositionY(), vehicle->GetPositionZ(), vehicle->GetOrientation());
RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
m_movementInfo.t_x = 0;
m_movementInfo.t_y = 0;
m_movementInfo.t_z = 0;
m_movementInfo.t_o = 0;
m_movementInfo.t_time = 0;
m_movementInfo.t_seat = 0;
WorldPacket data;
BuildTeleportAckMsg(&data, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
GetSession()->SendPacket(&data);
BuildHeartBeatMsg(&data);
SendMessageToSet(&data, false);
data.Initialize(SMSG_PET_SPELLS, 8+4);
data << uint64(0);
data << uint32(0);
GetSession()->SendPacket(&data);
// only for flyable vehicles?
//CastSpell(this, 45472, true); // Parachute
//if(!vehicle->GetDBTableGUIDLow())
if(vehicle->GetOwnerGUID() == GetGUID())
vehicle->Dismiss();
}
bool Player::isTotalImmune() bool Player::isTotalImmune()
{ {
AuraEffectList const& immune = GetAurasByType(SPELL_AURA_SCHOOL_IMMUNITY); AuraEffectList const& immune = GetAurasByType(SPELL_AURA_SCHOOL_IMMUNITY);
+1 -42
View File
@@ -654,37 +654,6 @@ enum InstanceResetWarningType
RAID_INSTANCE_WELCOME = 4 // Welcome to %s. This raid instance is scheduled to reset in %s. RAID_INSTANCE_WELCOME = 4 // Welcome to %s. This raid instance is scheduled to reset in %s.
}; };
struct MovementInfo
{
// common
uint32 flags;
uint16 unk1;
uint32 time;
float x, y, z, o;
// transport
uint64 t_guid;
float t_x, t_y, t_z, t_o;
uint32 t_time;
int8 t_seat;
// swimming and unknown
float s_pitch;
// last fall time
uint32 fallTime;
// jumping
float j_unk, j_sinAngle, j_cosAngle, j_xyspeed;
// spline
float u_unk1;
MovementInfo()
{
flags = 0;
time = t_time = fallTime = 0;
unk1 = 0;
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0;
}
};
// flags that use in movement check for example at spell casting // flags that use in movement check for example at spell casting
MovementFlags const movementFlagsMask = MovementFlags( MovementFlags const movementFlagsMask = MovementFlags(
MOVEMENTFLAG_FORWARD |MOVEMENTFLAG_BACKWARD |MOVEMENTFLAG_STRAFE_LEFT|MOVEMENTFLAG_STRAFE_RIGHT| MOVEMENTFLAG_FORWARD |MOVEMENTFLAG_BACKWARD |MOVEMENTFLAG_STRAFE_LEFT|MOVEMENTFLAG_STRAFE_RIGHT|
@@ -1360,6 +1329,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void CharmSpellInitialize(); void CharmSpellInitialize();
void PossessSpellInitialize(); void PossessSpellInitialize();
void VehicleSpellInitialize(); void VehicleSpellInitialize();
void SendRemoveControlBar();
bool HasSpell(uint32 spell) const; bool HasSpell(uint32 spell) const;
bool HasActiveSpell(uint32 spell) const; // show in spellbook bool HasActiveSpell(uint32 spell) const; // show in spellbook
TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const; TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const;
@@ -1912,7 +1882,6 @@ class TRINITY_DLL_SPEC Player : public Unit
/*********************************************************/ /*********************************************************/
/*** VARIOUS SYSTEMS ***/ /*** VARIOUS SYSTEMS ***/
/*********************************************************/ /*********************************************************/
MovementInfo m_movementInfo;
void UpdateFallInformationIfNeed(MovementInfo const& minfo,uint16 opcode); void UpdateFallInformationIfNeed(MovementInfo const& minfo,uint16 opcode);
Unit *m_mover; Unit *m_mover;
WorldObject *m_seer; WorldObject *m_seer;
@@ -1932,9 +1901,6 @@ class TRINITY_DLL_SPEC Player : public Unit
void SetClientControl(Unit* target, uint8 allowMove); void SetClientControl(Unit* target, uint8 allowMove);
void EnterVehicle(Vehicle *vehicle);
void ExitVehicle(Vehicle *vehicle);
void SetMover(Unit* target) { m_mover = target; } void SetMover(Unit* target) { m_mover = target; }
void SetSeer(WorldObject *target) { m_seer = target; } void SetSeer(WorldObject *target) { m_seer = target; }
void SetViewpoint(WorldObject *target, bool apply); void SetViewpoint(WorldObject *target, bool apply);
@@ -1946,13 +1912,6 @@ class TRINITY_DLL_SPEC Player : public Unit
Transport * GetTransport() const { return m_transport; } Transport * GetTransport() const { return m_transport; }
void SetTransport(Transport * t) { m_transport = t; } void SetTransport(Transport * t) { m_transport = t; }
float GetTransOffsetX() const { return m_movementInfo.t_x; }
float GetTransOffsetY() const { return m_movementInfo.t_y; }
float GetTransOffsetZ() const { return m_movementInfo.t_z; }
float GetTransOffsetO() const { return m_movementInfo.t_o; }
uint32 GetTransTime() const { return m_movementInfo.t_time; }
int8 GetTransSeat() const { return m_movementInfo.t_seat; }
uint32 GetSaveTimer() const { return m_nextSave; } uint32 GetSaveTimer() const { return m_nextSave; }
void SetSaveTimer(uint32 timer) { m_nextSave = timer; } void SetSaveTimer(uint32 timer) { m_nextSave = timer; }
+1 -2
View File
@@ -6525,8 +6525,7 @@ void Spell::SummonVehicle(uint32 entry, SummonPropertiesEntry const *properties)
if(damage) if(damage)
{ {
m_caster->CastSpell(vehicle, damage, true); m_caster->CastSpell(vehicle, damage, true);
if(m_caster->GetTypeId() == TYPEID_PLAYER) vehicle->AddPassenger(m_caster);
((Player*)m_caster)->EnterVehicle(vehicle);
} }
} }
+4 -1
View File
@@ -51,6 +51,7 @@
#include "NullCreatureAI.h" #include "NullCreatureAI.h"
#include "Traveller.h" #include "Traveller.h"
#include "TemporarySummon.h" #include "TemporarySummon.h"
#include "Vehicle.h"
#include <math.h> #include <math.h>
@@ -79,7 +80,7 @@ static bool procPrepared = InitTriggerAuraData();
Unit::Unit() Unit::Unit()
: WorldObject(), i_motionMaster(this), m_ThreatManager(this), m_HostilRefManager(this) : WorldObject(), i_motionMaster(this), m_ThreatManager(this), m_HostilRefManager(this)
, m_IsInNotifyList(false), m_Notified(false), IsAIEnabled(false), NeedChangeAI(false) , m_IsInNotifyList(false), m_Notified(false), IsAIEnabled(false), NeedChangeAI(false)
, i_AI(NULL), i_disabledAI(NULL), m_removedAurasCount(0) , i_AI(NULL), i_disabledAI(NULL), m_removedAurasCount(0), m_Vehicle(NULL)
{ {
m_objectType |= TYPEMASK_UNIT; m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT; m_objectTypeId = TYPEID_UNIT;
@@ -10145,6 +10146,7 @@ void Unit::setDeathState(DeathState s)
UnsummonAllTotems(); UnsummonAllTotems();
RemoveAllControlled(); RemoveAllControlled();
RemoveAllAurasOnDeath(); RemoveAllAurasOnDeath();
if(m_Vehicle) m_Vehicle->RemovePassenger(this);
//This is needed to clear visible auras after unit dies //This is needed to clear visible auras after unit dies
ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false); ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false);
@@ -11112,6 +11114,7 @@ void Unit::RemoveFromWorld()
RemoveCharmAuras(); RemoveCharmAuras();
RemoveBindSightAuras(); RemoveBindSightAuras();
RemoveNotOwnSingleTargetAuras(); RemoveNotOwnSingleTargetAuras();
if(m_Vehicle) m_Vehicle->RemovePassenger(this);
if(GetCharmerGUID()) if(GetCharmerGUID())
sLog.outCrash("Unit %u has charmer guid when removed from world", GetEntry()); sLog.outCrash("Unit %u has charmer guid when removed from world", GetEntry());
+39
View File
@@ -632,6 +632,37 @@ enum MovementFlags
MOVEMENTFLAG_UNK3 = 0x40000000 MOVEMENTFLAG_UNK3 = 0x40000000
}; };
struct MovementInfo
{
// common
uint32 flags;
uint16 unk1;
uint32 time;
float x, y, z, o;
// transport
uint64 t_guid;
float t_x, t_y, t_z, t_o;
uint32 t_time;
int8 t_seat;
// swimming and unknown
float s_pitch;
// last fall time
uint32 fallTime;
// jumping
float j_unk, j_sinAngle, j_cosAngle, j_xyspeed;
// spline
float u_unk1;
MovementInfo()
{
flags = 0;
time = t_time = fallTime = 0;
unk1 = 0;
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0;
}
};
enum DiminishingLevels enum DiminishingLevels
{ {
DIMINISHING_LEVEL_1 = 0, DIMINISHING_LEVEL_1 = 0,
@@ -1561,6 +1592,14 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
Unit *GetMisdirectionTarget() { return m_misdirectionTargetGUID ? GetUnit(*this, m_misdirectionTargetGUID) : NULL; } Unit *GetMisdirectionTarget() { return m_misdirectionTargetGUID ? GetUnit(*this, m_misdirectionTargetGUID) : NULL; }
bool IsAIEnabled, NeedChangeAI; bool IsAIEnabled, NeedChangeAI;
MovementInfo m_movementInfo;
Vehicle *m_Vehicle;
float GetTransOffsetX() const { return m_movementInfo.t_x; }
float GetTransOffsetY() const { return m_movementInfo.t_y; }
float GetTransOffsetZ() const { return m_movementInfo.t_z; }
float GetTransOffsetO() const { return m_movementInfo.t_o; }
uint32 GetTransTime() const { return m_movementInfo.t_time; }
int8 GetTransSeat() const { return m_movementInfo.t_seat; }
protected: protected:
explicit Unit (); explicit Unit ();
+177 -4
View File
@@ -22,8 +22,11 @@
#include "Vehicle.h" #include "Vehicle.h"
#include "Unit.h" #include "Unit.h"
#include "Util.h" #include "Util.h"
#include "WorldPacket.h"
Vehicle::Vehicle() : Creature(), m_vehicleId(0) #include "Chat.h"
Vehicle::Vehicle() : Creature(), m_vehicleInfo(NULL)
{ {
m_summonMask |= SUMMON_MASK_VEHICLE; m_summonMask |= SUMMON_MASK_VEHICLE;
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE); m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE);
@@ -55,9 +58,9 @@ void Vehicle::RemoveFromWorld()
void Vehicle::setDeathState(DeathState s) // overwrite virtual Creature::setDeathState and Unit::setDeathState void Vehicle::setDeathState(DeathState s) // overwrite virtual Creature::setDeathState and Unit::setDeathState
{ {
if(Unit *charmer = GetCharmer()) for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
if(charmer->GetTypeId() == TYPEID_PLAYER) if(itr->second.passenger)
((Player*)charmer)->ExitVehicle(this); RemovePassenger(itr->second.passenger);
Creature::setDeathState(s); Creature::setDeathState(s);
} }
@@ -68,6 +71,7 @@ void Vehicle::Update(uint32 diff)
bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team) bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team)
{ {
//sLog.outError("create vehicle begin");
SetMapId(map->GetId()); SetMapId(map->GetId());
SetInstanceId(map->GetInstanceId()); SetInstanceId(map->GetInstanceId());
@@ -89,9 +93,178 @@ bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, u
SelectLevel(ci); SelectLevel(ci);
SetHealth(GetMaxHealth()); SetHealth(GetMaxHealth());
//sLog.outError("create vehicle end");
return true; return true;
} }
void Vehicle::SetVehicleId(uint32 id)
{
if(m_vehicleInfo && id == m_vehicleInfo->m_ID)
return;
VehicleEntry const *ve = sVehicleStore.LookupEntry(id);
if(!ve)
return;
m_vehicleInfo = ve;
for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr)
if(itr->second.passenger)
RemovePassenger(itr->second.passenger);
m_Seats.clear();
for(uint32 i = 0; i < 8; ++i)
{
uint32 seatId = m_vehicleInfo->m_seatID[i];
if(seatId)
if(VehicleSeatEntry const *veSeat = sVehicleSeatStore.LookupEntry(seatId))
m_Seats.insert(std::make_pair(i, VehicleSeat(veSeat)));
}
}
void Vehicle::AddPassenger(Unit *unit)
{
sLog.outDebug("Unit %s enter vehicle entry %u id %u dbguid %u", unit->GetName(), GetEntry(), m_vehicleInfo->m_ID, GetDBTableGUIDLow());
if(unit->m_Vehicle)
unit->m_Vehicle->RemovePassenger(unit);
unit->m_Vehicle = this;
Player *player = NULL;
if(unit->GetTypeId() == TYPEID_PLAYER)
player = (Player*)unit;
SeatMap::iterator seat = m_Seats.begin();
uint32 seatnum = 0;
if(seat->second.passenger)
{
if(m_Seats.size() <= 1)
return;
seatnum = rand()%(m_Seats.size()-1) + 1;
advance(seat, seatnum);
if(seat->second.passenger)
return;
//RemovePassenger(seat->second.passenger);
}
seat->second.passenger = unit;
bool driver = (seat == m_Seats.begin());
//RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
setFaction(unit->getFaction());
if(player)
{
player->StopCastingCharm();
player->StopCastingBindSight();
if(driver)
{
player->SetCharm(this, true);
player->SetViewpoint(this, true);
player->SetMover(this);
player->VehicleSpellInitialize();
}
player->SetClientControl(this, 1);
}
unit->addUnitState(UNIT_STAT_ONVEHICLE);
unit->Relocate(this);
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
VehicleSeatEntry const *veSeat = seat->second.seatInfo;
unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX;
unit->m_movementInfo.t_y = veSeat->m_attachmentOffsetY;
unit->m_movementInfo.t_z = veSeat->m_attachmentOffsetZ;
unit->m_movementInfo.t_o = 0;
unit->m_movementInfo.t_time = 4;
unit->m_movementInfo.t_seat = seat->first;
WorldPacket data;
if(player)
{
//ChatHandler(player).PSendSysMessage("Enter seat %u %u", veSeat->m_ID, seat->first);
data.Initialize(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
player->GetSession()->SendPacket(&data);
player->BuildTeleportAckMsg(&data, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation());
player->GetSession()->SendPacket(&data);
}
unit->BuildHeartBeatMsg(&data);
unit->SendMessageToSet(&data, player ? false : true);
}
void Vehicle::RemovePassenger(Unit *unit)
{
SeatMap::iterator seat;
for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
{
if(seat->second.passenger == unit)
{
seat->second.passenger = NULL;
break;
}
}
if(seat == m_Seats.end())
return;
sLog.outDebug("Unit %s exit vehicle entry %u id %u dbguid %u", unit->GetName(), GetEntry(), m_vehicleInfo->m_ID, GetDBTableGUIDLow());
bool driver = (seat == m_Seats.begin());
Player *player = NULL;
if(unit->GetTypeId() == TYPEID_PLAYER)
player = (Player*)unit;
//SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
//setFaction((GetTeam() == ALLIANCE) ? GetCreatureInfo()->faction_A : GetCreatureInfo()->faction_H);
if(player)
{
if(driver)
{
player->SetCharm(this, false);
player->SetViewpoint(this, false);
player->SetMover(player);
player->SendRemoveControlBar();
}
player->SetClientControl(player, 1);
}
unit->clearUnitState(UNIT_STAT_ONVEHICLE);
unit->Relocate(this);
unit->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
unit->m_movementInfo.t_x = 0;
unit->m_movementInfo.t_y = 0;
unit->m_movementInfo.t_z = 0;
unit->m_movementInfo.t_o = 0;
unit->m_movementInfo.t_time = 0;
unit->m_movementInfo.t_seat = 0;
unit->m_Vehicle = NULL;
WorldPacket data;
if(player)
{
player->BuildTeleportAckMsg(&data, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation());
player->GetSession()->SendPacket(&data);
}
unit->BuildHeartBeatMsg(&data);
unit->SendMessageToSet(&data, player ? false : true);
// only for flyable vehicles?
//CastSpell(this, 45472, true); // Parachute
//if(!vehicle->GetDBTableGUIDLow())
if(GetOwnerGUID() == unit->GetGUID())
Dismiss();
}
void Vehicle::Dismiss() void Vehicle::Dismiss()
{ {
SendObjectDeSpawnAnim(GetGUID()); SendObjectDeSpawnAnim(GetGUID());
+19 -3
View File
@@ -23,6 +23,18 @@
#include "Creature.h" #include "Creature.h"
#include "Unit.h" #include "Unit.h"
struct VehicleEntry;
struct VehicleSeatEntry;
struct VehicleSeat
{
explicit VehicleSeat(VehicleSeatEntry const *_seatInfo) : seatInfo(_seatInfo), passenger(NULL) {}
VehicleSeatEntry const *seatInfo;
Unit* passenger;
};
typedef std::map<uint32, VehicleSeat> SeatMap;
class Vehicle : public Creature class Vehicle : public Creature
{ {
public: public:
@@ -37,14 +49,18 @@ class Vehicle : public Creature
void setDeathState(DeathState s); // overwrite virtual Creature::setDeathState and Unit::setDeathState void setDeathState(DeathState s); // overwrite virtual Creature::setDeathState and Unit::setDeathState
void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update
uint32 GetVehicleId() { return m_vehicleId; } VehicleEntry const *GetVehicleInfo() { return m_vehicleInfo; }
void SetVehicleId(uint32 vehicleid) { m_vehicleId = vehicleid; } void SetVehicleId(uint32 vehicleid);
void AddPassenger(Unit *passenger);
void RemovePassenger(Unit *passenger);
void Dismiss(); void Dismiss();
bool LoadFromDB(uint32 guid, Map *map); bool LoadFromDB(uint32 guid, Map *map);
SeatMap m_Seats;
protected: protected:
uint32 m_vehicleId; VehicleEntry const *m_vehicleInfo;
private: private:
void SaveToDB(uint32, uint8) // overwrited of Creature::SaveToDB - don't must be called void SaveToDB(uint32, uint8) // overwrited of Creature::SaveToDB - don't must be called
+2 -1
View File
@@ -361,10 +361,11 @@ class TRINITY_DLL_SPEC WorldSession
void HandleMoveWorldportAckOpcode(); // for server-side calls void HandleMoveWorldportAckOpcode(); // for server-side calls
void HandleMovementOpcodes(WorldPacket& recvPacket); void HandleMovementOpcodes(WorldPacket& recvPacket);
//void HandlePossessedMovement(WorldPacket& recv_data, MovementInfo& movementInfo, uint32& MovementFlags);
void HandleSetActiveMoverOpcode(WorldPacket &recv_data); void HandleSetActiveMoverOpcode(WorldPacket &recv_data);
void HandleMoveNotActiveMover(WorldPacket &recv_data); void HandleMoveNotActiveMover(WorldPacket &recv_data);
void HandleDismissControlledVehicle(WorldPacket &recv_data); void HandleDismissControlledVehicle(WorldPacket &recv_data);
void HandleRequestVehicleExit(WorldPacket &recv_data);
void HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data);
void HandleMoveTimeSkippedOpcode(WorldPacket &recv_data); void HandleMoveTimeSkippedOpcode(WorldPacket &recv_data);
void HandleRequestRaidInfoOpcode( WorldPacket & recv_data ); void HandleRequestRaidInfoOpcode( WorldPacket & recv_data );