diff options
author | megamage <none@none> | 2009-04-25 08:58:16 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-04-25 08:58:16 -0500 |
commit | a72f23f56b1f2175d1062210dc2cb097bc412deb (patch) | |
tree | df28c43d88e1b6a88b3f4b0b36e4f5339b55c285 /src | |
parent | 031daf6003f2ad916baa5689824fd0d945c3e593 (diff) |
*Some update of vehicle code.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Debugcmds.cpp | 8 | ||||
-rw-r--r-- | src/game/MovementHandler.cpp | 42 | ||||
-rw-r--r-- | src/game/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/game/Transports.cpp | 14 | ||||
-rw-r--r-- | src/game/Unit.cpp | 36 | ||||
-rw-r--r-- | src/game/Unit.h | 3 | ||||
-rw-r--r-- | src/game/Vehicle.cpp | 22 | ||||
-rw-r--r-- | src/game/Vehicle.h | 8 |
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); |