*Some update of vehicle code.
--HG-- branch : trunk
This commit is contained in:
@@ -710,7 +710,11 @@ bool ChatHandler::HandleDebugEnterVehicle(const char * args)
|
||||
if(!i)
|
||||
return false;
|
||||
|
||||
char* j = strtok(NULL, " ");
|
||||
|
||||
uint32 entry = (uint32)atoi(i);
|
||||
int8 seatId = j ? (int8)atoi(j) : -1;
|
||||
|
||||
Creature *passenger = NULL;
|
||||
Trinity::AllCreaturesOfEntryInRange check(m_session->GetPlayer(), entry, 20.0f);
|
||||
Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_session->GetPlayer(), passenger, check);
|
||||
@@ -718,9 +722,9 @@ bool ChatHandler::HandleDebugEnterVehicle(const char * args)
|
||||
if(!passenger || passenger == target)
|
||||
return false;
|
||||
|
||||
passenger->EnterVehicle((Vehicle*)target);
|
||||
passenger->EnterVehicle((Vehicle*)target, seatId);
|
||||
|
||||
PSendSysMessage("Creature entered vehicle");
|
||||
PSendSysMessage("Creature entered vehicle %d", (uint32)seatId);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -493,38 +493,32 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data)
|
||||
if(!GetPlayer()->m_Vehicle)
|
||||
return;
|
||||
|
||||
if(recv_data.GetOpcode() == CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE)
|
||||
if(recv_data.GetOpcode() == CMSG_REQUEST_VEHICLE_PREV_SEAT)
|
||||
{
|
||||
GetPlayer()->ChangeSeat(-1, false);
|
||||
return;
|
||||
}
|
||||
else if(recv_data.GetOpcode() == CMSG_REQUEST_VEHICLE_NEXT_SEAT)
|
||||
{
|
||||
GetPlayer()->ChangeSeat(-1, true);
|
||||
return;
|
||||
}
|
||||
else if(recv_data.GetOpcode() == CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE)
|
||||
ReadMovementInfo(recv_data, &GetPlayer()->m_Vehicle->m_movementInfo);
|
||||
|
||||
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1);
|
||||
uint64 guid;
|
||||
if(!recv_data.readPackGUID(guid))
|
||||
return;
|
||||
|
||||
Vehicle *vehicle = guid ? ObjectAccessor::GetVehicle(guid) : GetPlayer()->m_Vehicle;
|
||||
if(!vehicle)
|
||||
return;
|
||||
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1);
|
||||
int8 seatId;
|
||||
recv_data >> seatId;
|
||||
|
||||
int8 seatNum;
|
||||
recv_data >> seatNum;
|
||||
if(!guid)
|
||||
{
|
||||
seatNum = vehicle->GetNextEmptySeat(GetPlayer()->GetTransSeat(), seatNum > 0);
|
||||
if(seatNum < 0)
|
||||
return;
|
||||
}
|
||||
else if(!vehicle->HasEmptySeat(seatNum))
|
||||
return;
|
||||
|
||||
GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer());
|
||||
if(GetPlayer()->m_Vehicle != vehicle)
|
||||
{
|
||||
GetPlayer()->m_Vehicle = vehicle;
|
||||
GetPlayer()->SetClientControl(vehicle, 1);
|
||||
WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
|
||||
GetPlayer()->GetSession()->SendPacket(&data);
|
||||
}
|
||||
else if(!vehicle->AddPassenger(GetPlayer(), seatNum))
|
||||
assert(false);
|
||||
GetPlayer()->ChangeSeat(-1, seatId > 0);
|
||||
else if(Vehicle *vehicle = ObjectAccessor::GetVehicle(guid))
|
||||
GetPlayer()->EnterVehicle(vehicle, seatId);
|
||||
}
|
||||
|
||||
void WorldSession::HandleRequestVehicleExit(WorldPacket &recv_data)
|
||||
|
||||
@@ -1171,8 +1171,8 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||
/*0x474*/ { "SMSG_CHAR_CUSTOMIZE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||
/*0x475*/ { "SMSG_PET_RENAMEABLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||
/*0x476*/ { "CMSG_REQUEST_VEHICLE_EXIT", STATUS_LOGGEDIN, &WorldSession::HandleRequestVehicleExit },
|
||||
/*0x477*/ { "CMSG_REQUEST_VEHICLE_PREV_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||
/*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||
/*0x477*/ { "CMSG_REQUEST_VEHICLE_PREV_SEAT", STATUS_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle},
|
||||
/*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle},
|
||||
/*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle},
|
||||
/*0x47A*/ { "CMSG_PET_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandlePetLearnTalent },
|
||||
/*0x47B*/ { "CMSG_PET_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||
|
||||
+2
-12
@@ -445,16 +445,9 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
|
||||
|
||||
for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();)
|
||||
{
|
||||
PlayerSet::iterator it2 = itr;
|
||||
Player *plr = *itr;
|
||||
++itr;
|
||||
|
||||
Player *plr = *it2;
|
||||
if(!plr)
|
||||
{
|
||||
m_passengers.erase(it2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (plr->isDead() && !plr->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
|
||||
{
|
||||
plr->ResurrectPlayer(1.0);
|
||||
@@ -477,11 +470,8 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
|
||||
|
||||
bool Transport::AddPassenger(Player* passenger)
|
||||
{
|
||||
if (m_passengers.find(passenger) == m_passengers.end())
|
||||
{
|
||||
if(m_passengers.insert(passenger).second)
|
||||
sLog.outDetail("Player %s boarded transport %s.", passenger->GetName(), GetName());
|
||||
m_passengers.insert(passenger);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+31
-5
@@ -13042,7 +13042,6 @@ void Unit::SetCharmedOrPossessedBy(Unit* charmer, bool possess)
|
||||
addUnitState(UNIT_STAT_POSSESSED);
|
||||
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
|
||||
((Player*)charmer)->SetClientControl(this, 1);
|
||||
((Player*)charmer)->SetMover(this);
|
||||
((Player*)charmer)->SetViewpoint(this, true);
|
||||
charmer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
}
|
||||
@@ -13125,7 +13124,6 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer)
|
||||
if(possess)
|
||||
{
|
||||
((Player*)charmer)->SetClientControl(charmer, 1);
|
||||
((Player*)charmer)->SetMover(charmer);
|
||||
((Player*)charmer)->SetViewpoint(this, false);
|
||||
charmer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
}
|
||||
@@ -13500,10 +13498,19 @@ void Unit::JumpTo(WorldObject *obj, float speedZ)
|
||||
GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
|
||||
}
|
||||
|
||||
void Unit::EnterVehicle(Vehicle *vehicle)
|
||||
void Unit::EnterVehicle(Vehicle *vehicle, int8 seatId)
|
||||
{
|
||||
if(m_Vehicle)
|
||||
ExitVehicle();
|
||||
{
|
||||
if(m_Vehicle == vehicle)
|
||||
{
|
||||
if(seatId >= 0)
|
||||
ChangeSeat(seatId);
|
||||
return;
|
||||
}
|
||||
else
|
||||
ExitVehicle();
|
||||
}
|
||||
|
||||
if(GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
@@ -13513,7 +13520,7 @@ void Unit::EnterVehicle(Vehicle *vehicle)
|
||||
|
||||
assert(!m_Vehicle);
|
||||
m_Vehicle = vehicle;
|
||||
if(!m_Vehicle->AddPassenger(this))
|
||||
if(!m_Vehicle->AddPassenger(this, seatId))
|
||||
{
|
||||
m_Vehicle = NULL;
|
||||
return;
|
||||
@@ -13534,6 +13541,25 @@ void Unit::EnterVehicle(Vehicle *vehicle)
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::ChangeSeat(int8 seatId, bool next)
|
||||
{
|
||||
if(!m_Vehicle)
|
||||
return;
|
||||
|
||||
if(seatId < 0)
|
||||
{
|
||||
seatId = m_Vehicle->GetNextEmptySeat(GetTransSeat(), next);
|
||||
if(seatId < 0)
|
||||
return;
|
||||
}
|
||||
else if(seatId == GetTransSeat() || !m_Vehicle->HasEmptySeat(seatId))
|
||||
return;
|
||||
|
||||
m_Vehicle->RemovePassenger(this);
|
||||
if(!m_Vehicle->AddPassenger(this, seatId))
|
||||
assert(false);
|
||||
}
|
||||
|
||||
void Unit::ExitVehicle()
|
||||
{
|
||||
if(!m_Vehicle)
|
||||
|
||||
+2
-1
@@ -1629,8 +1629,9 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
|
||||
bool m_ControlledByPlayer;
|
||||
|
||||
void EnterVehicle(Vehicle *vehicle);
|
||||
void EnterVehicle(Vehicle *vehicle, int8 seatId = -1);
|
||||
void ExitVehicle();
|
||||
void ChangeSeat(int8 seatId, bool next = true);
|
||||
|
||||
// Transports
|
||||
Transport * GetTransport() const { return m_transport; }
|
||||
|
||||
+10
-12
@@ -148,16 +148,16 @@ void Vehicle::SetVehicleId(uint32 id)
|
||||
assert(!m_Seats.empty());
|
||||
}
|
||||
|
||||
bool Vehicle::HasEmptySeat(int8 seatNum) const
|
||||
bool Vehicle::HasEmptySeat(int8 seatId) const
|
||||
{
|
||||
SeatMap::const_iterator seat = m_Seats.find(seatNum);
|
||||
SeatMap::const_iterator seat = m_Seats.find(seatId);
|
||||
if(seat == m_Seats.end()) return false;
|
||||
return !seat->second.passenger;
|
||||
}
|
||||
|
||||
int8 Vehicle::GetNextEmptySeat(int8 seatNum, bool next) const
|
||||
int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
|
||||
{
|
||||
SeatMap::const_iterator seat = m_Seats.find(seatNum);
|
||||
SeatMap::const_iterator seat = m_Seats.find(seatId);
|
||||
if(seat == m_Seats.end()) return -1;
|
||||
while(seat->second.passenger)
|
||||
{
|
||||
@@ -173,13 +173,13 @@ int8 Vehicle::GetNextEmptySeat(int8 seatNum, bool next) const
|
||||
seat = m_Seats.end();
|
||||
--seat;
|
||||
}
|
||||
if(seat->first == seatNum)
|
||||
if(seat->first == seatId)
|
||||
return -1;
|
||||
}
|
||||
return seat->first;
|
||||
}
|
||||
|
||||
void Vehicle::InstallAccessory(uint32 entry, int8 seatNum)
|
||||
void Vehicle::InstallAccessory(uint32 entry, int8 seatId)
|
||||
{
|
||||
//Creature *accessory = SummonCreature(entry, GetPositionX(), GetPositionY(), GetPositionZ());
|
||||
Creature *accessory = SummonVehicle(entry, GetPositionX(), GetPositionY(), GetPositionZ());
|
||||
@@ -187,16 +187,16 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatNum)
|
||||
return;
|
||||
|
||||
accessory->m_Vehicle = this;
|
||||
AddPassenger(accessory, seatNum);
|
||||
AddPassenger(accessory, seatId);
|
||||
}
|
||||
|
||||
bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
|
||||
bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
|
||||
{
|
||||
if(unit->m_Vehicle != this)
|
||||
return false;
|
||||
|
||||
SeatMap::iterator seat;
|
||||
if(seatNum < 0) // no specific seat requirement
|
||||
if(seatId < 0) // no specific seat requirement
|
||||
{
|
||||
for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
|
||||
if(!seat->second.passenger)
|
||||
@@ -207,7 +207,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
|
||||
}
|
||||
else
|
||||
{
|
||||
seat = m_Seats.find(seatNum);
|
||||
seat = m_Seats.find(seatId);
|
||||
if(seat == m_Seats.end())
|
||||
return false;
|
||||
|
||||
@@ -247,7 +247,6 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
|
||||
{
|
||||
((Player*)unit)->SetCharm(this, true);
|
||||
((Player*)unit)->SetViewpoint(this, true);
|
||||
//((Player*)unit)->SetMover(this);
|
||||
((Player*)unit)->VehicleSpellInitialize();
|
||||
}
|
||||
|
||||
@@ -286,7 +285,6 @@ void Vehicle::RemovePassenger(Unit *unit)
|
||||
{
|
||||
((Player*)unit)->SetCharm(this, false);
|
||||
((Player*)unit)->SetViewpoint(this, false);
|
||||
//((Player*)unit)->SetMover(unit);
|
||||
((Player*)unit)->SendRemoveControlBar();
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -52,11 +52,11 @@ class Vehicle : public Creature
|
||||
VehicleEntry const *GetVehicleInfo() { return m_vehicleInfo; }
|
||||
void SetVehicleId(uint32 vehicleid);
|
||||
|
||||
bool HasEmptySeat(int8 seatNum) const;
|
||||
int8 GetNextEmptySeat(int8 seatNum, bool next) const;
|
||||
bool AddPassenger(Unit *passenger, int8 seatNum = -1);
|
||||
bool HasEmptySeat(int8 seatId) const;
|
||||
int8 GetNextEmptySeat(int8 seatId, bool next) const;
|
||||
bool AddPassenger(Unit *passenger, int8 seatId = -1);
|
||||
void RemovePassenger(Unit *passenger);
|
||||
void InstallAccessory(uint32 entry, int8 seatNum);
|
||||
void InstallAccessory(uint32 entry, int8 seatId);
|
||||
void Dismiss();
|
||||
|
||||
bool LoadFromDB(uint32 guid, Map *map);
|
||||
|
||||
Reference in New Issue
Block a user