diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 1caca9270..d03b1d416 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1696,7 +1696,7 @@ void Creature::CallAssistence() void Creature::SaveRespawnTime() { - if(isPet() || isVehicle() || !m_DBTableGuid) + if(isPet() || !m_DBTableGuid) return; if(m_respawnTime > time(NULL)) // dead (no corpse) diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index eb0ed5c2f..e585de1ee 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -1666,13 +1666,23 @@ void WorldSession::HandleSpellClick( WorldPacket & recv_data ) if(!vehicle) return; - //_player->SetClientControl(vehicle, 1); - //_player->CastSpell(_player, 43768, true); - //_player->SetUInt64Value(UNIT_FIELD_CHARM, guid); - //_player->SetUInt64Value(PLAYER_FARSIGHT, guid); _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 ) { CHECK_PACKET_SIZE(recv_data, 1); @@ -1686,4 +1696,3 @@ void WorldSession::HandleInspectAchievements( WorldPacket & recv_data ) player->GetAchievementMgr().SendRespondInspectAchievements(_player); } - diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index 7a2f65cff..644c4ecdc 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -1159,7 +1159,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x46A*/ { "SMSG_CRITERIA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x46B*/ { "CMSG_QUERY_INSPECT_ACHIEVEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleInspectAchievements }, /*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 }, /*0x46F*/ { "SMSG_QUESTUPDATE_ADD_PVP_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x470*/ { "CMSG_SET_CRITERIA_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 61db3b8b2..76dd63e83 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -18601,9 +18601,13 @@ void Player::EnterVehicle(Vehicle *vehicle) { vehicle->SetCharmerGUID(GetGUID()); 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->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); SetUInt64Value(PLAYER_FARSIGHT, vehicle->GetGUID()); @@ -18634,15 +18638,29 @@ void Player::EnterVehicle(Vehicle *vehicle) // end of transport part data << uint32(0); // fall time 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) { vehicle->SetCharmerGUID(0); 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->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H); + //vehicle->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); SetCharm(NULL); SetUInt64Value(PLAYER_FARSIGHT, 0); @@ -18662,6 +18680,11 @@ void Player::ExitVehicle(Vehicle *vehicle) data << uint32(0); // fall time GetSession()->SendPacket(&data); + data.Initialize(SMSG_PET_SPELLS, 8+4); + data << uint64(0); + data << uint32(0); + GetSession()->SendPacket(&data); + // only for flyable vehicles? CastSpell(this, 45472, true); // Parachute } diff --git a/src/game/Unit.h b/src/game/Unit.h index c766bea1e..5dd7c8e96 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -490,9 +490,10 @@ enum UnitFlags // Value masks for UNIT_FIELD_FLAGS_2 enum UnitFlags2 { - UNIT_FLAG2_FEIGN_DEATH = 0x00000001, - UNIT_FLAG2_COMPREHEND_LANG= 0x00000008, - UNIT_FLAG2_FORCE_MOVE = 0x00000040 + UNIT_FLAG2_FEIGN_DEATH = 0x00000001, + UNIT_FLAG2_COMPREHEND_LANG = 0x00000008, + UNIT_FLAG2_FORCE_MOVE = 0x00000040, + UNIT_FLAG2_UNKNOWN1 = 0x00000800 }; /// Non Player Character flags diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index f61e14cbb..0955d80c3 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -82,6 +82,10 @@ bool Vehicle::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, u SetVehicleId(vehicleId); 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(); setFaction(team == ALLIANCE ? ci->faction_A : ci->faction_H); diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 1b2269e2b..df306a616 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -551,7 +551,8 @@ class MANGOS_DLL_SPEC WorldSession void HandlePetUnlearnOpcode( WorldPacket& recvPacket ); void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket ); void HandlePetCastSpellOpcode( WorldPacket& recvPacket ); - void HandlePetLearnTalent( WorldPacket& recvPacket );; + void HandlePetLearnTalent( WorldPacket& recvPacket ); + void HandleDismissControlledVehicle( WorldPacket& recvPacket ); void HandleSetActionBar(WorldPacket& recv_data);