*Some work on vehicles.
--HG-- branch : trunk
This commit is contained in:
@@ -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 }
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 )
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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; }
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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());
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
Reference in New Issue
Block a user