*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) if(!i)
return false; return false;
char* j = strtok(NULL, " ");
uint32 entry = (uint32)atoi(i); uint32 entry = (uint32)atoi(i);
int8 seatId = j ? (int8)atoi(j) : -1;
Creature *passenger = NULL; Creature *passenger = NULL;
Trinity::AllCreaturesOfEntryInRange check(m_session->GetPlayer(), entry, 20.0f); Trinity::AllCreaturesOfEntryInRange check(m_session->GetPlayer(), entry, 20.0f);
Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_session->GetPlayer(), passenger, check); Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_session->GetPlayer(), passenger, check);
@@ -718,9 +722,9 @@ bool ChatHandler::HandleDebugEnterVehicle(const char * args)
if(!passenger || passenger == target) if(!passenger || passenger == target)
return false; return false;
passenger->EnterVehicle((Vehicle*)target); passenger->EnterVehicle((Vehicle*)target, seatId);
PSendSysMessage("Creature entered vehicle"); PSendSysMessage("Creature entered vehicle %d", (uint32)seatId);
return true; return true;
} }
+18 -24
View File
@@ -493,38 +493,32 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data)
if(!GetPlayer()->m_Vehicle) if(!GetPlayer()->m_Vehicle)
return; 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); ReadMovementInfo(recv_data, &GetPlayer()->m_Vehicle->m_movementInfo);
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1);
uint64 guid; uint64 guid;
if(!recv_data.readPackGUID(guid)) if(!recv_data.readPackGUID(guid))
return; return;
Vehicle *vehicle = guid ? ObjectAccessor::GetVehicle(guid) : GetPlayer()->m_Vehicle; CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1);
if(!vehicle) int8 seatId;
return; recv_data >> seatId;
int8 seatNum;
recv_data >> seatNum;
if(!guid) if(!guid)
{ GetPlayer()->ChangeSeat(-1, seatId > 0);
seatNum = vehicle->GetNextEmptySeat(GetPlayer()->GetTransSeat(), seatNum > 0); else if(Vehicle *vehicle = ObjectAccessor::GetVehicle(guid))
if(seatNum < 0) GetPlayer()->EnterVehicle(vehicle, seatId);
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);
} }
void WorldSession::HandleRequestVehicleExit(WorldPacket &recv_data) 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 }, /*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_LOGGEDIN, &WorldSession::HandleRequestVehicleExit }, /*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_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle},
/*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle},
/*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle}, /*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_LOGGEDIN, &WorldSession::HandleChangeSeatsOnControlledVehicle},
/*0x47A*/ { "CMSG_PET_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandlePetLearnTalent }, /*0x47A*/ { "CMSG_PET_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandlePetLearnTalent },
/*0x47B*/ { "CMSG_PET_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL }, /*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();) for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();)
{ {
PlayerSet::iterator it2 = itr; Player *plr = *itr;
++itr; ++itr;
Player *plr = *it2;
if(!plr)
{
m_passengers.erase(it2);
continue;
}
if (plr->isDead() && !plr->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) if (plr->isDead() && !plr->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
{ {
plr->ResurrectPlayer(1.0); plr->ResurrectPlayer(1.0);
@@ -477,11 +470,8 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
bool Transport::AddPassenger(Player* passenger) 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()); sLog.outDetail("Player %s boarded transport %s.", passenger->GetName(), GetName());
m_passengers.insert(passenger);
}
return true; return true;
} }
+30 -4
View File
@@ -13042,7 +13042,6 @@ void Unit::SetCharmedOrPossessedBy(Unit* charmer, bool possess)
addUnitState(UNIT_STAT_POSSESSED); addUnitState(UNIT_STAT_POSSESSED);
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
((Player*)charmer)->SetClientControl(this, 1); ((Player*)charmer)->SetClientControl(this, 1);
((Player*)charmer)->SetMover(this);
((Player*)charmer)->SetViewpoint(this, true); ((Player*)charmer)->SetViewpoint(this, true);
charmer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); charmer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
} }
@@ -13125,7 +13124,6 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer)
if(possess) if(possess)
{ {
((Player*)charmer)->SetClientControl(charmer, 1); ((Player*)charmer)->SetClientControl(charmer, 1);
((Player*)charmer)->SetMover(charmer);
((Player*)charmer)->SetViewpoint(this, false); ((Player*)charmer)->SetViewpoint(this, false);
charmer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); 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); 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)
{
if(m_Vehicle == vehicle)
{
if(seatId >= 0)
ChangeSeat(seatId);
return;
}
else
ExitVehicle(); ExitVehicle();
}
if(GetTypeId() == TYPEID_PLAYER) if(GetTypeId() == TYPEID_PLAYER)
{ {
@@ -13513,7 +13520,7 @@ void Unit::EnterVehicle(Vehicle *vehicle)
assert(!m_Vehicle); assert(!m_Vehicle);
m_Vehicle = vehicle; m_Vehicle = vehicle;
if(!m_Vehicle->AddPassenger(this)) if(!m_Vehicle->AddPassenger(this, seatId))
{ {
m_Vehicle = NULL; m_Vehicle = NULL;
return; 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() void Unit::ExitVehicle()
{ {
if(!m_Vehicle) if(!m_Vehicle)
+2 -1
View File
@@ -1629,8 +1629,9 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool m_ControlledByPlayer; bool m_ControlledByPlayer;
void EnterVehicle(Vehicle *vehicle); void EnterVehicle(Vehicle *vehicle, int8 seatId = -1);
void ExitVehicle(); void ExitVehicle();
void ChangeSeat(int8 seatId, bool next = true);
// Transports // Transports
Transport * GetTransport() const { return m_transport; } Transport * GetTransport() const { return m_transport; }
+10 -12
View File
@@ -148,16 +148,16 @@ void Vehicle::SetVehicleId(uint32 id)
assert(!m_Seats.empty()); 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; if(seat == m_Seats.end()) return false;
return !seat->second.passenger; 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; if(seat == m_Seats.end()) return -1;
while(seat->second.passenger) while(seat->second.passenger)
{ {
@@ -173,13 +173,13 @@ int8 Vehicle::GetNextEmptySeat(int8 seatNum, bool next) const
seat = m_Seats.end(); seat = m_Seats.end();
--seat; --seat;
} }
if(seat->first == seatNum) if(seat->first == seatId)
return -1; return -1;
} }
return seat->first; 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 = SummonCreature(entry, GetPositionX(), GetPositionY(), GetPositionZ());
Creature *accessory = SummonVehicle(entry, GetPositionX(), GetPositionY(), GetPositionZ()); Creature *accessory = SummonVehicle(entry, GetPositionX(), GetPositionY(), GetPositionZ());
@@ -187,16 +187,16 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatNum)
return; return;
accessory->m_Vehicle = this; 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) if(unit->m_Vehicle != this)
return false; return false;
SeatMap::iterator seat; 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) for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat)
if(!seat->second.passenger) if(!seat->second.passenger)
@@ -207,7 +207,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
} }
else else
{ {
seat = m_Seats.find(seatNum); seat = m_Seats.find(seatId);
if(seat == m_Seats.end()) if(seat == m_Seats.end())
return false; return false;
@@ -247,7 +247,6 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
{ {
((Player*)unit)->SetCharm(this, true); ((Player*)unit)->SetCharm(this, true);
((Player*)unit)->SetViewpoint(this, true); ((Player*)unit)->SetViewpoint(this, true);
//((Player*)unit)->SetMover(this);
((Player*)unit)->VehicleSpellInitialize(); ((Player*)unit)->VehicleSpellInitialize();
} }
@@ -286,7 +285,6 @@ void Vehicle::RemovePassenger(Unit *unit)
{ {
((Player*)unit)->SetCharm(this, false); ((Player*)unit)->SetCharm(this, false);
((Player*)unit)->SetViewpoint(this, false); ((Player*)unit)->SetViewpoint(this, false);
//((Player*)unit)->SetMover(unit);
((Player*)unit)->SendRemoveControlBar(); ((Player*)unit)->SendRemoveControlBar();
} }
+4 -4
View File
@@ -52,11 +52,11 @@ class Vehicle : public Creature
VehicleEntry const *GetVehicleInfo() { return m_vehicleInfo; } VehicleEntry const *GetVehicleInfo() { return m_vehicleInfo; }
void SetVehicleId(uint32 vehicleid); void SetVehicleId(uint32 vehicleid);
bool HasEmptySeat(int8 seatNum) const; bool HasEmptySeat(int8 seatId) const;
int8 GetNextEmptySeat(int8 seatNum, bool next) const; int8 GetNextEmptySeat(int8 seatId, bool next) const;
bool AddPassenger(Unit *passenger, int8 seatNum = -1); bool AddPassenger(Unit *passenger, int8 seatId = -1);
void RemovePassenger(Unit *passenger); void RemovePassenger(Unit *passenger);
void InstallAccessory(uint32 entry, int8 seatNum); void InstallAccessory(uint32 entry, int8 seatId);
void Dismiss(); void Dismiss();
bool LoadFromDB(uint32 guid, Map *map); bool LoadFromDB(uint32 guid, Map *map);