mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Conflicts: dep/libmpq/CMakeLists.txt src/server/game/Battlefield/BattlefieldMgr.cpp src/server/game/Battlefield/BattlefieldMgr.h src/server/game/DataStores/DBCStores.cpp src/server/game/Entities/Creature/Creature.cpp src/server/game/Entities/Creature/Creature.h src/server/game/Entities/Object/Object.cpp src/server/game/Entities/Player/Player.h src/server/game/Entities/Unit/StatSystem.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Entities/Vehicle/Vehicle.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Handlers/BattlefieldHandler.cpp src/server/game/Handlers/GuildHandler.cpp src/server/game/Movement/Spline/MoveSplineInit.cpp src/server/game/Server/Protocol/Opcodes.cpp src/server/game/Server/WorldSession.h src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.h src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h src/server/scripts/EasternKingdoms/boss_kruul.cpp src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp src/server/scripts/Kalimdor/zone_azshara.cpp src/server/scripts/Kalimdor/zone_moonglade.cpp src/server/scripts/Kalimdor/zone_orgrimmar.cpp src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp src/server/scripts/OutdoorPvP/OutdoorPvPEP.h src/server/scripts/Spells/spell_dk.cpp src/tools/map_extractor/mpq_libmpq.cpp src/tools/map_extractor/mpq_libmpq04.h src/tools/vmap4_extractor/loadlib/loadlib.h src/tools/vmap4_extractor/mpq_libmpq.cpp src/tools/vmap4_extractor/mpq_libmpq04.h
240 lines
8.1 KiB
C++
240 lines
8.1 KiB
C++
/*
|
|
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "WorldPacket.h"
|
|
#include "WorldSession.h"
|
|
#include "Opcodes.h"
|
|
#include "Vehicle.h"
|
|
#include "Player.h"
|
|
#include "Log.h"
|
|
#include "ObjectAccessor.h"
|
|
#include "MovementStructures.h"
|
|
|
|
void WorldSession::HandleDismissControlledVehicle(WorldPacket &recvData)
|
|
{
|
|
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE");
|
|
|
|
uint64 vehicleGUID = _player->GetCharmGUID();
|
|
|
|
if (!vehicleGUID) // something wrong here...
|
|
{
|
|
recvData.rfinish(); // prevent warnings spam
|
|
return;
|
|
}
|
|
|
|
MovementInfo mi;
|
|
_player->ReadMovementInfo(recvData, &mi);
|
|
|
|
_player->m_movementInfo = mi;
|
|
|
|
_player->ExitVehicle();
|
|
}
|
|
|
|
void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket& recvData)
|
|
{
|
|
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE");
|
|
|
|
Unit* vehicle_base = GetPlayer()->GetVehicleBase();
|
|
if (!vehicle_base)
|
|
{
|
|
recvData.rfinish(); // prevent warnings spam
|
|
return;
|
|
}
|
|
|
|
VehicleSeatEntry const* seat = GetPlayer()->GetVehicle()->GetSeatForPassenger(GetPlayer());
|
|
if (!seat->CanSwitchFromSeat())
|
|
{
|
|
recvData.rfinish(); // prevent warnings spam
|
|
TC_LOG_ERROR("network", "HandleChangeSeatsOnControlledVehicle, Opcode: %u, Player %u tried to switch seats but current seatflags %u don't permit that.",
|
|
recvData.GetOpcode(), GetPlayer()->GetGUIDLow(), seat->m_flags);
|
|
return;
|
|
}
|
|
|
|
switch (recvData.GetOpcode())
|
|
{
|
|
case CMSG_REQUEST_VEHICLE_PREV_SEAT:
|
|
GetPlayer()->ChangeSeat(-1, false);
|
|
break;
|
|
case CMSG_REQUEST_VEHICLE_NEXT_SEAT:
|
|
GetPlayer()->ChangeSeat(-1, true);
|
|
break;
|
|
case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE:
|
|
{
|
|
static MovementStatusElements const accessoryGuid[] =
|
|
{
|
|
MSEExtraInt8,
|
|
MSEHasGuidByte2,
|
|
MSEHasGuidByte4,
|
|
MSEHasGuidByte7,
|
|
MSEHasGuidByte6,
|
|
MSEHasGuidByte5,
|
|
MSEHasGuidByte0,
|
|
MSEHasGuidByte1,
|
|
MSEHasGuidByte3,
|
|
MSEGuidByte6,
|
|
MSEGuidByte1,
|
|
MSEGuidByte2,
|
|
MSEGuidByte5,
|
|
MSEGuidByte3,
|
|
MSEGuidByte0,
|
|
MSEGuidByte4,
|
|
MSEGuidByte7,
|
|
};
|
|
|
|
Movement::ExtraMovementStatusElement extra(accessoryGuid);
|
|
MovementInfo movementInfo;
|
|
GetPlayer()->ReadMovementInfo(recvData, &movementInfo, &extra);
|
|
vehicle_base->m_movementInfo = movementInfo;
|
|
|
|
uint64 accessory = extra.Data.guid;
|
|
int8 seatId = extra.Data.byteData;
|
|
|
|
if (vehicle_base->GetGUID() != movementInfo.guid)
|
|
return;
|
|
|
|
if (!accessory)
|
|
GetPlayer()->ChangeSeat(-1, seatId > 0); // prev/next
|
|
else if (Unit* vehUnit = Unit::GetUnit(*GetPlayer(), accessory))
|
|
{
|
|
if (Vehicle* vehicle = vehUnit->GetVehicleKit())
|
|
if (vehicle->HasEmptySeat(seatId))
|
|
vehUnit->HandleSpellClick(GetPlayer(), seatId);
|
|
}
|
|
break;
|
|
}
|
|
case CMSG_REQUEST_VEHICLE_SWITCH_SEAT:
|
|
{
|
|
uint64 guid; // current vehicle guid
|
|
recvData.readPackGUID(guid);
|
|
|
|
int8 seatId;
|
|
recvData >> seatId;
|
|
|
|
if (vehicle_base->GetGUID() == guid)
|
|
GetPlayer()->ChangeSeat(seatId);
|
|
else if (Unit* vehUnit = Unit::GetUnit(*GetPlayer(), guid))
|
|
if (Vehicle* vehicle = vehUnit->GetVehicleKit())
|
|
if (vehicle->HasEmptySeat(seatId))
|
|
vehUnit->HandleSpellClick(GetPlayer(), seatId);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void WorldSession::HandleEnterPlayerVehicle(WorldPacket& data)
|
|
{
|
|
// Read guid
|
|
uint64 guid;
|
|
data >> guid;
|
|
|
|
if (Player* player = ObjectAccessor::FindPlayer(guid))
|
|
{
|
|
if (!player->GetVehicleKit())
|
|
return;
|
|
if (!player->IsInRaidWith(_player))
|
|
return;
|
|
if (!player->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
|
|
return;
|
|
|
|
_player->EnterVehicle(player);
|
|
}
|
|
}
|
|
|
|
void WorldSession::HandleEjectPassenger(WorldPacket& data)
|
|
{
|
|
Vehicle* vehicle = _player->GetVehicleKit();
|
|
if (!vehicle)
|
|
{
|
|
data.rfinish(); // prevent warnings spam
|
|
TC_LOG_ERROR("network", "HandleEjectPassenger: Player %u is not in a vehicle!", GetPlayer()->GetGUIDLow());
|
|
return;
|
|
}
|
|
|
|
uint64 guid;
|
|
data >> guid;
|
|
|
|
if (IS_PLAYER_GUID(guid))
|
|
{
|
|
Player* player = ObjectAccessor::FindPlayer(guid);
|
|
if (!player)
|
|
{
|
|
TC_LOG_ERROR("network", "Player %u tried to eject player %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
|
|
return;
|
|
}
|
|
|
|
if (!player->IsOnVehicle(vehicle->GetBase()))
|
|
{
|
|
TC_LOG_ERROR("network", "Player %u tried to eject player %u, but they are not in the same vehicle", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
|
|
return;
|
|
}
|
|
|
|
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(player);
|
|
ASSERT(seat);
|
|
if (seat->IsEjectable())
|
|
player->ExitVehicle();
|
|
else
|
|
TC_LOG_ERROR("network", "Player %u attempted to eject player %u from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
|
|
}
|
|
|
|
else if (IS_CREATURE_GUID(guid))
|
|
{
|
|
Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
|
|
if (!unit) // creatures can be ejected too from player mounts
|
|
{
|
|
TC_LOG_ERROR("network", "Player %u tried to eject creature guid %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
|
|
return;
|
|
}
|
|
|
|
if (!unit->IsOnVehicle(vehicle->GetBase()))
|
|
{
|
|
TC_LOG_ERROR("network", "Player %u tried to eject unit %u, but they are not in the same vehicle", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
|
|
return;
|
|
}
|
|
|
|
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(unit);
|
|
ASSERT(seat);
|
|
if (seat->IsEjectable())
|
|
{
|
|
ASSERT(GetPlayer() == vehicle->GetBase());
|
|
unit->ExitVehicle();
|
|
}
|
|
else
|
|
TC_LOG_ERROR("network", "Player %u attempted to eject creature GUID %u from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
|
|
}
|
|
else
|
|
TC_LOG_ERROR("network", "HandleEjectPassenger: Player %u tried to eject invalid GUID " UI64FMTD, GetPlayer()->GetGUIDLow(), guid);
|
|
}
|
|
|
|
void WorldSession::HandleRequestVehicleExit(WorldPacket& /*recvData*/)
|
|
{
|
|
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_REQUEST_VEHICLE_EXIT");
|
|
|
|
if (Vehicle* vehicle = GetPlayer()->GetVehicle())
|
|
{
|
|
if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(GetPlayer()))
|
|
{
|
|
if (seat->CanEnterOrExit())
|
|
GetPlayer()->ExitVehicle();
|
|
else
|
|
TC_LOG_ERROR("network", "Player %u tried to exit vehicle, but seatflags %u (ID: %u) don't permit that.",
|
|
GetPlayer()->GetGUIDLow(), seat->m_ID, seat->m_flags);
|
|
}
|
|
}
|
|
}
|