Skip to content

Commit

Permalink
Merge pull request #1037 from openmultiplayer/amir/death-and-state-fix
Browse files Browse the repository at this point in the history
revert state change, dont handle in vehicle's event, use death event …
  • Loading branch information
Hual authored Jan 9, 2025
2 parents faf2e7e + 784b7c7 commit 33a24a5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 15 deletions.
22 changes: 20 additions & 2 deletions Server/Components/Vehicles/vehicles_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

using namespace Impl;

class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandler, public PlayerConnectEventHandler, public PlayerChangeEventHandler, public PlayerUpdateEventHandler, public PoolEventHandler<IPlayer>
class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandler, public PlayerConnectEventHandler, public PlayerChangeEventHandler, public PlayerUpdateEventHandler, public PlayerDamageEventHandler, public PoolEventHandler<IPlayer>
{
private:
ICore* core = nullptr;
Expand Down Expand Up @@ -335,6 +335,7 @@ class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandl
core->getPlayers().getPlayerConnectDispatcher().removeEventHandler(this);
core->getPlayers().getPlayerChangeDispatcher().removeEventHandler(this);
core->getPlayers().getPoolEventDispatcher().removeEventHandler(this);
core->getPlayers().getPlayerDamageDispatcher().removeEventHandler(this);
NetCode::RPC::OnPlayerEnterVehicle::removeEventHandler(*core, &playerEnterVehicleHandler);
NetCode::RPC::OnPlayerExitVehicle::removeEventHandler(*core, &playerExitVehicleHandler);
NetCode::RPC::SetVehicleDamageStatus::removeEventHandler(*core, &vehicleDamageStatusHandler);
Expand All @@ -351,6 +352,7 @@ class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandl
core->getPlayers().getPlayerConnectDispatcher().addEventHandler(this);
core->getPlayers().getPlayerChangeDispatcher().addEventHandler(this);
core->getPlayers().getPoolEventDispatcher().addEventHandler(this);
core->getPlayers().getPlayerDamageDispatcher().addEventHandler(this, EventPriority_Lowest);
NetCode::RPC::OnPlayerEnterVehicle::addEventHandler(*core, &playerEnterVehicleHandler);
NetCode::RPC::OnPlayerExitVehicle::addEventHandler(*core, &playerExitVehicleHandler);
NetCode::RPC::SetVehicleDamageStatus::addEventHandler(*core, &vehicleDamageStatusHandler);
Expand Down Expand Up @@ -539,9 +541,25 @@ class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandl
storage.clear();
}

void onPlayerDeath(IPlayer& player, IPlayer* killer, int reason) override
{
PlayerVehicleData* data = queryExtension<PlayerVehicleData>(player);
if (!data)
{
return;
}

auto vehicle = static_cast<Vehicle*>(data->getVehicle());
if (vehicle)
{
vehicle->unoccupy(player);
}
data->setVehicle(nullptr, SEAT_NONE);
}

void onPlayerStateChange(IPlayer& player, PlayerState newState, PlayerState oldState) override
{
if (newState != PlayerState_Driver && newState != PlayerState_Passenger)
if (newState != PlayerState_Driver && newState != PlayerState_Passenger && newState != PlayerState_Wasted)
{
PlayerVehicleData* data = queryExtension<PlayerVehicleData>(player);
if (!data)
Expand Down
14 changes: 1 addition & 13 deletions Server/Source/player_pool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -376,11 +376,7 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public

Player& player = static_cast<Player&>(peer);

// Keep a record of current state before changing it to wasted, and do not dispatch state change event
// We're doing this so state change event listeners don't reset player data (like removing the link between player and the vehicle they're in when dead)
// Then dispatch the event manually later, after onPlayerDeath event dispatch.
PlayerState oldState = player.getState();
player.setState(PlayerState_Wasted, /* dispatchEvents = */ false);
player.setState(PlayerState_Wasted, /* dispatchEvents = */ true);

IPlayer* killer = self.storage.get(onPlayerDeathRPC.KillerID);
uint8_t reason = onPlayerDeathRPC.Reason;
Expand Down Expand Up @@ -412,14 +408,6 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
killer,
reason);

// Dispatch state change event manually after onPlayerDeath, so reset player data after listeners already handled death event.
// Use stored state from above as old state and newly stored state in player data as new one.
self.playerChangeDispatcher.dispatch(
&PlayerChangeEventHandler::onPlayerStateChange,
peer,
peer.getState(),
oldState);

NetCode::RPC::PlayerDeath playerDeathRPC;
playerDeathRPC.PlayerID = player.poolID;
PacketHelper::broadcast(playerDeathRPC, self, &peer);
Expand Down

0 comments on commit 33a24a5

Please sign in to comment.