More work on vehicles

This commit is contained in:
tomrus88 2008-11-12 23:20:59 +03:00
parent ca33f8a1ab
commit 14d312ad22
7 changed files with 51 additions and 13 deletions

View file

@ -1696,7 +1696,7 @@ void Creature::CallAssistence()
void Creature::SaveRespawnTime() void Creature::SaveRespawnTime()
{ {
if(isPet() || isVehicle() || !m_DBTableGuid) if(isPet() || !m_DBTableGuid)
return; return;
if(m_respawnTime > time(NULL)) // dead (no corpse) if(m_respawnTime > time(NULL)) // dead (no corpse)

View file

@ -1666,13 +1666,23 @@ void WorldSession::HandleSpellClick( WorldPacket & recv_data )
if(!vehicle) if(!vehicle)
return; return;
//_player->SetClientControl(vehicle, 1);
//_player->CastSpell(_player, 43768, true);
//_player->SetUInt64Value(UNIT_FIELD_CHARM, guid);
//_player->SetUInt64Value(PLAYER_FARSIGHT, guid);
_player->EnterVehicle(vehicle); _player->EnterVehicle(vehicle);
} }
void WorldSession::HandleDismissControlledVehicle( WorldPacket & recv_data )
{
//CHECK_PACKET_SIZE(recv_data, 8);
recv_data.hexlike(); // standard movement packet
// using charm guid, because we don't have vehicle guid...
Vehicle *vehicle = ObjectAccessor::GetVehicle(_player->GetCharmGUID());
if(!vehicle)
return;
_player->ExitVehicle(vehicle);
}
void WorldSession::HandleInspectAchievements( WorldPacket & recv_data ) void WorldSession::HandleInspectAchievements( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data, 1); CHECK_PACKET_SIZE(recv_data, 1);
@ -1686,4 +1696,3 @@ void WorldSession::HandleInspectAchievements( WorldPacket & recv_data )
player->GetAchievementMgr().SendRespondInspectAchievements(_player); player->GetAchievementMgr().SendRespondInspectAchievements(_player);
} }

View file

@ -1159,7 +1159,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x46A*/ { "SMSG_CRITERIA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x46A*/ { "SMSG_CRITERIA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x46B*/ { "CMSG_QUERY_INSPECT_ACHIEVEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleInspectAchievements }, /*0x46B*/ { "CMSG_QUERY_INSPECT_ACHIEVEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleInspectAchievements },
/*0x46C*/ { "SMSG_RESPOND_INSPECT_ACHIEVEMENTS",STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x46C*/ { "SMSG_RESPOND_INSPECT_ACHIEVEMENTS",STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x46D*/ { "CMSG_DISMISS_CONTROLLED_VEHICLE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x46D*/ { "CMSG_DISMISS_CONTROLLED_VEHICLE", STATUS_LOGGEDIN, &WorldSession::HandleDismissControlledVehicle },
/*0x46E*/ { "CMSG_COMPLETE_ACHIEVEMENT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x46E*/ { "CMSG_COMPLETE_ACHIEVEMENT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x46F*/ { "SMSG_QUESTUPDATE_ADD_PVP_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x46F*/ { "SMSG_QUESTUPDATE_ADD_PVP_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x470*/ { "CMSG_SET_CRITERIA_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x470*/ { "CMSG_SET_CRITERIA_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },

View file

@ -18601,9 +18601,13 @@ void Player::EnterVehicle(Vehicle *vehicle)
{ {
vehicle->SetCharmerGUID(GetGUID()); vehicle->SetCharmerGUID(GetGUID());
vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); //vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5); vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
vehicle->setFaction(getFaction()); vehicle->setFaction(getFaction());
//vehicle->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
//vehicle->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 2147483647);
//vehicle->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
//vehicle->SetUInt32Value(UNIT_FIELD_BYTES_1, 0x02000000);
SetCharm(vehicle); SetCharm(vehicle);
SetUInt64Value(PLAYER_FARSIGHT, vehicle->GetGUID()); SetUInt64Value(PLAYER_FARSIGHT, vehicle->GetGUID());
@ -18634,15 +18638,29 @@ void Player::EnterVehicle(Vehicle *vehicle)
// end of transport part // end of transport part
data << uint32(0); // fall time data << uint32(0); // fall time
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
data.Initialize(SMSG_PET_SPELLS, 8+4+4+4+4*10+1+1);
data << uint64(vehicle->GetGUID());
data << uint32(0x00000000);
data << uint32(0x00000000);
data << uint32(0x00000101);
for(uint32 i = 0; i < 10; ++i)
data << uint16(0) << uint8(0) << uint8(i+8);
data << uint8(0);
data << uint8(0);
GetSession()->SendPacket(&data);
} }
void Player::ExitVehicle(Vehicle *vehicle) void Player::ExitVehicle(Vehicle *vehicle)
{ {
vehicle->SetCharmerGUID(0); vehicle->SetCharmerGUID(0);
vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); //vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5); vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H); vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H);
//vehicle->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
SetCharm(NULL); SetCharm(NULL);
SetUInt64Value(PLAYER_FARSIGHT, 0); SetUInt64Value(PLAYER_FARSIGHT, 0);
@ -18662,6 +18680,11 @@ void Player::ExitVehicle(Vehicle *vehicle)
data << uint32(0); // fall time data << uint32(0); // fall time
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
data.Initialize(SMSG_PET_SPELLS, 8+4);
data << uint64(0);
data << uint32(0);
GetSession()->SendPacket(&data);
// only for flyable vehicles? // only for flyable vehicles?
CastSpell(this, 45472, true); // Parachute CastSpell(this, 45472, true); // Parachute
} }

View file

@ -492,7 +492,8 @@ enum UnitFlags2
{ {
UNIT_FLAG2_FEIGN_DEATH = 0x00000001, UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
UNIT_FLAG2_COMPREHEND_LANG = 0x00000008, UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
UNIT_FLAG2_FORCE_MOVE = 0x00000040 UNIT_FLAG2_FORCE_MOVE = 0x00000040,
UNIT_FLAG2_UNKNOWN1 = 0x00000800
}; };
/// Non Player Character flags /// Non Player Character flags

View file

@ -82,6 +82,10 @@ bool Vehicle::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, u
SetVehicleId(vehicleId); SetVehicleId(vehicleId);
SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
SetUInt32Value(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_UNKNOWN1);
SetUInt32Value(UNIT_FIELD_BYTES_1, 0x02000001);
SetUInt32Value(UNIT_FIELD_BYTES_2, 0x00000001);
SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 3.0f);
CreatureInfo const *ci = GetCreatureInfo(); CreatureInfo const *ci = GetCreatureInfo();
setFaction(team == ALLIANCE ? ci->faction_A : ci->faction_H); setFaction(team == ALLIANCE ? ci->faction_A : ci->faction_H);

View file

@ -551,7 +551,8 @@ class MANGOS_DLL_SPEC WorldSession
void HandlePetUnlearnOpcode( WorldPacket& recvPacket ); void HandlePetUnlearnOpcode( WorldPacket& recvPacket );
void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket ); void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket );
void HandlePetCastSpellOpcode( WorldPacket& recvPacket ); void HandlePetCastSpellOpcode( WorldPacket& recvPacket );
void HandlePetLearnTalent( WorldPacket& recvPacket );; void HandlePetLearnTalent( WorldPacket& recvPacket );
void HandleDismissControlledVehicle( WorldPacket& recvPacket );
void HandleSetActionBar(WorldPacket& recv_data); void HandleSetActionBar(WorldPacket& recv_data);