*Some update of vehicle code.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-04-25 08:58:16 -05:00
parent 031daf6003
commit a72f23f56b
8 changed files with 75 additions and 62 deletions
+6 -2
View File
@@ -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;
}
+18 -24
View File
@@ -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)
+2 -2
View File
@@ -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
View File
@@ -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;
}
+30 -4
View File
@@ -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)
{
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
View File
@@ -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
View File
@@ -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
View File
@@ -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);