aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2009-04-25 08:58:16 -0500
committermegamage <none@none>2009-04-25 08:58:16 -0500
commita72f23f56b1f2175d1062210dc2cb097bc412deb (patch)
treedf28c43d88e1b6a88b3f4b0b36e4f5339b55c285
parent031daf6003f2ad916baa5689824fd0d945c3e593 (diff)
*Some update of vehicle code.
--HG-- branch : trunk
-rw-r--r--src/game/Debugcmds.cpp8
-rw-r--r--src/game/MovementHandler.cpp42
-rw-r--r--src/game/Opcodes.cpp4
-rw-r--r--src/game/Transports.cpp14
-rw-r--r--src/game/Unit.cpp36
-rw-r--r--src/game/Unit.h3
-rw-r--r--src/game/Vehicle.cpp22
-rw-r--r--src/game/Vehicle.h8
8 files changed, 75 insertions, 62 deletions
diff --git a/src/game/Debugcmds.cpp b/src/game/Debugcmds.cpp
index b15d717bfe3..de72f60acb3 100644
--- a/src/game/Debugcmds.cpp
+++ b/src/game/Debugcmds.cpp
@@ -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;
}
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index d9c58967150..cbf345aead2 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -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)
diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp
index a18af88673d..536423345c6 100644
--- a/src/game/Opcodes.cpp
+++ b/src/game/Opcodes.cpp
@@ -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 },
diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp
index c8f89b337bc..1d412863c67 100644
--- a/src/game/Transports.cpp
+++ b/src/game/Transports.cpp
@@ -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;
}
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 72fdd6c3fd2..bd6e494c23a 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -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)
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 8fdf7133ec4..06ed28d9f0f 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -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; }
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
index 4ef4781add0..b4f93331cfb 100644
--- a/src/game/Vehicle.cpp
+++ b/src/game/Vehicle.cpp
@@ -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();
}
diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h
index 3e1118f4685..4ff7ec90c53 100644
--- a/src/game/Vehicle.h
+++ b/src/game/Vehicle.h
@@ -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);