aboutsummaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authormegamage <none@none>2009-04-22 17:50:26 -0500
committermegamage <none@none>2009-04-22 17:50:26 -0500
commit1cd8ea8c1abbb1b110a0af36b60ec9d17c608da3 (patch)
tree6c0f408e0d8e6e5d7a105cb2addc252c6b7a6c95 /src/game
parent06667c40dd0eb6858247b7fdfbd6156a46acd8b6 (diff)
*Fix some bugs about vehicle.
--HG-- branch : trunk
Diffstat (limited to 'src/game')
-rw-r--r--src/game/MovementHandler.cpp49
-rw-r--r--src/game/Object.cpp28
-rw-r--r--src/game/Object.h2
-rw-r--r--src/game/Opcodes.cpp2
-rw-r--r--src/game/SharedDefines.h4
-rw-r--r--src/game/SpellEffects.cpp1
-rw-r--r--src/game/Unit.cpp4
-rw-r--r--src/game/Unit.h4
-rw-r--r--src/game/Vehicle.cpp42
-rw-r--r--src/game/Vehicle.h2
-rw-r--r--src/game/WorldSession.cpp2
11 files changed, 63 insertions, 77 deletions
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index 9a2f119cb42..cf312ad3513 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -482,32 +482,33 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: Recvd CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE");
recv_data.hexlike();
- uint32 a;
- uint16 b;
- uint16 c;
- uint32 d,e,f,g,h,i,j,k;
- int8 seat;
- recv_data >> a >> b >> c;
- recv_data >> d >> e >> f >> g >> h >> i >> j >> k;
- recv_data >> seat;
- //sLog.outError("change seat %u %u %u %u %u %u %u %u %u %u %u %u", a, b,c,d,e,f,g,h,i,j,k,seat);
-
- if(seat == GetPlayer()->GetTransSeat())
+
+ if(!GetPlayer()->m_Vehicle)
return;
- if(GetPlayer()->m_Vehicle)
- {
- if(Vehicle *vehicle = GetPlayer()->m_Vehicle->HasEmptySeat(seat))
- {
- GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer());
- //If the player is going to a turret, the vehicle should be changed
- GetPlayer()->m_Vehicle = vehicle;
- if(!vehicle->AddPassenger(GetPlayer(), seat))
- {
- assert(false);
- }
- }
- }
+ if(recv_data.GetOpcode() == CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE)
+ ReadMovementInfo(recv_data, &GetPlayer()->m_Vehicle->m_movementInfo);
+
+ uint64 guid;
+ if(!recv_data.readPackGUID(guid))
+ return;
+
+ Vehicle *vehicle = ObjectAccessor::GetVehicle(guid);
+ if(!vehicle)
+ return;
+
+ int8 seatNum;
+ recv_data >> seatNum;
+ if(vehicle == GetPlayer()->m_Vehicle && seatNum == GetPlayer()->GetTransSeat())
+ return;
+
+ if(!vehicle->HasEmptySeat(seatNum))
+ return;
+
+ GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer());
+ GetPlayer()->m_Vehicle = vehicle;
+ if(!vehicle->AddPassenger(GetPlayer(), seatNum))
+ assert(false);
}
void WorldSession::HandleRequestVehicleExit(WorldPacket &recv_data)
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 4d650a86c46..0739f89db2c 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -133,7 +133,7 @@ void Object::BuildMovementUpdateBlock(UpdateData * data, uint32 flags ) const
buf << uint8( UPDATETYPE_MOVEMENT );
buf << GetGUID();
- _BuildMovementUpdate(&buf, flags, 0x00000000);
+ _BuildMovementUpdate(&buf, flags);
data->AddUpdateBlock(buf);
}
@@ -147,7 +147,6 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
uint8 updatetype = UPDATETYPE_CREATE_OBJECT;
uint8 flags = m_updateFlag;
- uint32 flags2 = 0;
/** lower flag1 **/
if(target == this) // building packet for oneself
@@ -195,7 +194,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
buf << (uint8)0xFF << GetGUID();
buf << (uint8)m_objectTypeId;
- _BuildMovementUpdate(&buf, flags, flags2);
+ _BuildMovementUpdate(&buf, flags);
UpdateMask updateMask;
updateMask.SetCount( m_valuesCount );
@@ -259,18 +258,18 @@ void Object::DestroyForPlayer(Player *target) const
target->GetSession()->SendPacket( &data );
}
-void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) const
+void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
{
*data << (uint8)flags; // update flags
// 0x20
if (flags & UPDATEFLAG_LIVING)
{
+ uint32 flags2 = ((Unit*)this)->GetUnitMovementFlags();
switch(GetTypeId())
{
case TYPEID_UNIT:
{
- flags2 = ((Unit*)this)->GetUnitMovementFlags();
if(((Unit*)this)->m_Vehicle)
flags2 |= MOVEMENTFLAG_ONTRANSPORT;
else
@@ -282,8 +281,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
break;
case TYPEID_PLAYER:
{
- flags2 = ((Player*)this)->GetUnitMovementFlags();
-
if(((Player*)this)->GetTransport() || ((Player*)this)->m_Vehicle)
flags2 |= MOVEMENTFLAG_ONTRANSPORT;
else
@@ -342,20 +339,8 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << ((Unit*)this)->GetSpeed( MOVE_PITCH_RATE );
// 0x08000000
- if(flags2 & MOVEMENTFLAG_SPLINE2)
+ if(GetTypeId() == TYPEID_PLAYER && ((Player*)this)->isInFlight())
{
- if(GetTypeId() != TYPEID_PLAYER)
- {
- sLog.outDebug("_BuildMovementUpdate: MOVEMENTFLAG_SPLINE2 for non-player");
- return;
- }
-
- if(!((Player*)this)->isInFlight())
- {
- sLog.outDebug("_BuildMovementUpdate: MOVEMENTFLAG_SPLINE2 but not in flight");
- return;
- }
-
WPAssert(((Player*)this)->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE);
FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top());
@@ -1635,7 +1620,8 @@ TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float a
else if(properties->Type == SUMMON_TYPE_TOTEM)
mask = SUMMON_MASK_TOTEM;
else if(properties->Category == SUMMON_CATEGORY_VEHICLE
- || properties->Type == SUMMON_TYPE_VEHICLE)
+ || properties->Type == SUMMON_TYPE_VEHICLE
+ || properties->Type == SUMMON_TYPE_VEHICLE2)
mask = SUMMON_MASK_VEHICLE;
}
diff --git a/src/game/Object.h b/src/game/Object.h
index eff964aba0f..82c61cce091 100644
--- a/src/game/Object.h
+++ b/src/game/Object.h
@@ -331,7 +331,7 @@ class TRINITY_DLL_SPEC Object
virtual void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
virtual void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
- void _BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2 ) const;
+ void _BuildMovementUpdate(ByteBuffer * data, uint8 flags) const;
void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask *updateMask, Player *target ) const;
uint16 m_objectType;
diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp
index 5daa369a743..a18af88673d 100644
--- a/src/game/Opcodes.cpp
+++ b/src/game/Opcodes.cpp
@@ -1173,7 +1173,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*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 },
- /*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*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 },
/*0x47C*/ { "SMSG_SET_PHASE_SHIFT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 78c61dd061c..b95b2b98ad1 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -2443,8 +2443,8 @@ enum SummonType
SUMMON_TYPE_GUARDIAN2 = 6,
SUMMON_TYPE_WILD2 = 7,
SUMMON_TYPE_WILD3 = 8,
- SUMMON_TYPE_WILD4 = 9,
- SUMMON_TYPE_VEHICLE = 10,
+ SUMMON_TYPE_VEHICLE = 9,
+ SUMMON_TYPE_VEHICLE2 = 10,
SUMMON_TYPE_OBJECT = 11,
SUMMON_TYPE_CRITTER = 41,
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 13cb0448088..74600181e6f 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -3269,6 +3269,7 @@ void Spell::EffectSummonType(uint32 i)
SummonGuardian(entry, properties);
break;
case SUMMON_TYPE_VEHICLE:
+ case SUMMON_TYPE_VEHICLE2:
SummonVehicle(entry, properties);
break;
case SUMMON_TYPE_TOTEM:
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index fbbfa3a2638..d13b552c053 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -13528,7 +13528,7 @@ void Unit::ExitVehicle()
}
BuildHeartBeatMsg(&data);
- SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? false : true);
+ SendMessageToSet(&data, false);
if(m_Vehicle->GetOwnerGUID() == GetGUID())
m_Vehicle->Dismiss();
@@ -13565,7 +13565,7 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const
// 0x00001000
if(GetUnitMovementFlags() & MOVEMENTFLAG_JUMPING)
{
- *data << (float)m_movementInfo.j_unk;
+ *data << (float)m_movementInfo.j_zspeed;
*data << (float)m_movementInfo.j_sinAngle;
*data << (float)m_movementInfo.j_cosAngle;
*data << (float)m_movementInfo.j_xyspeed;
diff --git a/src/game/Unit.h b/src/game/Unit.h
index fa02de0f5f8..26b2acb0220 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -668,7 +668,7 @@ struct MovementInfo
// last fall time
uint32 fallTime;
// jumping
- float j_unk, j_sinAngle, j_cosAngle, j_xyspeed;
+ float j_zspeed, j_sinAngle, j_cosAngle, j_xyspeed;
// spline
float u_unk1;
@@ -677,7 +677,7 @@ struct MovementInfo
flags = 0;
time = t_time = fallTime = 0;
unk1 = 0;
- x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
+ x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_zspeed = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0;
}
};
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
index 0a388fe7f04..a788bec1c48 100644
--- a/src/game/Vehicle.cpp
+++ b/src/game/Vehicle.cpp
@@ -43,6 +43,11 @@ void Vehicle::AddToWorld()
ObjectAccessor::Instance().AddObject(this);
Unit::AddToWorld();
AIM_Initialize();
+ switch(GetEntry())
+ {
+ case 28312:InstallAccessory(28319,7);break;
+ case 32627:InstallAccessory(32629,7);break;
+ }
}
}
@@ -142,24 +147,17 @@ void Vehicle::SetVehicleId(uint32 id)
assert(!m_Seats.empty());
}
-Vehicle* Vehicle::HasEmptySeat(int8 seatNum) const
+bool Vehicle::HasEmptySeat(int8 seatNum) const
{
SeatMap::const_iterator seat = m_Seats.find(seatNum);
- //No such seat
- if(seat == m_Seats.end()) return NULL;
- //Not occupied
- if(!seat->second.passenger) return (Vehicle*)this;
- //Check if turret is empty
- if(seat->second.passenger->GetTypeId() == TYPEID_UNIT
- && ((Creature*)seat->second.passenger)->isVehicle())
- return ((Vehicle*)seat->second.passenger)->HasEmptySeat(seatNum);
- //Occupied
- return NULL;
+ if(seat == m_Seats.end()) return false;
+ return !seat->second.passenger;
}
void Vehicle::InstallAccessory(uint32 entry, int8 seatNum)
{
- Creature *accessory = SummonCreature(entry, GetPositionX(), GetPositionY(), GetPositionZ());
+ //Creature *accessory = SummonCreature(entry, GetPositionX(), GetPositionY(), GetPositionZ());
+ Creature *accessory = SummonVehicle(entry, GetPositionX(), GetPositionY(), GetPositionZ());
if(!accessory)
return;
@@ -202,16 +200,16 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
VehicleSeatEntry const *veSeat = seat->second.seatInfo;
- unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX;
- unit->m_movementInfo.t_y = veSeat->m_attachmentOffsetY;
- unit->m_movementInfo.t_z = veSeat->m_attachmentOffsetZ;
+ unit->m_movementInfo.t_x = 0;//veSeat->m_attachmentOffsetX;
+ unit->m_movementInfo.t_y = 0;//veSeat->m_attachmentOffsetY;
+ unit->m_movementInfo.t_z = 0;//veSeat->m_attachmentOffsetZ;
unit->m_movementInfo.t_o = 0;
unit->m_movementInfo.t_time = 4;
unit->m_movementInfo.t_seat = seat->first;
- unit->Relocate(GetPositionX() + veSeat->m_attachmentOffsetX,
- GetPositionY() + veSeat->m_attachmentOffsetY,
- GetPositionZ() + veSeat->m_attachmentOffsetZ,
+ unit->Relocate(GetPositionX() + unit->m_movementInfo.t_x,
+ GetPositionY() + unit->m_movementInfo.t_y,
+ GetPositionZ() + unit->m_movementInfo.t_z,
GetOrientation());
WorldPacket data;
@@ -219,7 +217,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
{
//ChatHandler(player).PSendSysMessage("Enter seat %u %u", veSeat->m_ID, seat->first);
- if(seat == m_Seats.begin())
+ if(seat->first == 0)
{
((Player*)unit)->SetCharm(this, true);
((Player*)unit)->SetViewpoint(this, true);
@@ -231,8 +229,8 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
((Player*)unit)->GetSession()->SendPacket(&data);
}
- BuildHeartBeatMsg(&data);
- SendMessageToSet(&data, unit->GetTypeId() == TYPEID_PLAYER ? false : true);
+ unit->BuildHeartBeatMsg(&data);
+ unit->SendMessageToSet(&data, false);
return true;
}
@@ -258,7 +256,7 @@ void Vehicle::RemovePassenger(Unit *unit)
//SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- if(unit->GetTypeId() == TYPEID_PLAYER && seat == m_Seats.begin())
+ if(unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0)
{
((Player*)unit)->SetCharm(this, false);
((Player*)unit)->SetViewpoint(this, false);
diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h
index 0ca76687716..0b134348454 100644
--- a/src/game/Vehicle.h
+++ b/src/game/Vehicle.h
@@ -52,7 +52,7 @@ class Vehicle : public Creature
VehicleEntry const *GetVehicleInfo() { return m_vehicleInfo; }
void SetVehicleId(uint32 vehicleid);
- Vehicle* HasEmptySeat(int8 seatNum) const;
+ bool HasEmptySeat(int8 seatNum) const;
bool AddPassenger(Unit *passenger, int8 seatNum = -1);
void RemovePassenger(Unit *passenger);
void InstallAccessory(uint32 entry, int8 seatNum);
diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp
index da6837b1662..563f5f4a168 100644
--- a/src/game/WorldSession.cpp
+++ b/src/game/WorldSession.cpp
@@ -604,7 +604,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
if(mi->flags & MOVEMENTFLAG_JUMPING)
{
CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4);
- data >> mi->j_unk;
+ data >> mi->j_zspeed;
data >> mi->j_sinAngle;
data >> mi->j_cosAngle;
data >> mi->j_xyspeed;