Skip to content

Commit 784b7c7

Browse files
committed
revert state change, dont handle in vehicle's event, use death event instead
1 parent 6191a2d commit 784b7c7

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

Server/Components/Vehicles/vehicles_impl.hpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
using namespace Impl;
1818

19-
class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandler, public PlayerConnectEventHandler, public PlayerChangeEventHandler, public PlayerUpdateEventHandler, public PoolEventHandler<IPlayer>
19+
class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandler, public PlayerConnectEventHandler, public PlayerChangeEventHandler, public PlayerUpdateEventHandler, public PlayerDamageEventHandler, public PoolEventHandler<IPlayer>
2020
{
2121
private:
2222
ICore* core = nullptr;
@@ -335,6 +335,7 @@ class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandl
335335
core->getPlayers().getPlayerConnectDispatcher().removeEventHandler(this);
336336
core->getPlayers().getPlayerChangeDispatcher().removeEventHandler(this);
337337
core->getPlayers().getPoolEventDispatcher().removeEventHandler(this);
338+
core->getPlayers().getPlayerDamageDispatcher().removeEventHandler(this);
338339
NetCode::RPC::OnPlayerEnterVehicle::removeEventHandler(*core, &playerEnterVehicleHandler);
339340
NetCode::RPC::OnPlayerExitVehicle::removeEventHandler(*core, &playerExitVehicleHandler);
340341
NetCode::RPC::SetVehicleDamageStatus::removeEventHandler(*core, &vehicleDamageStatusHandler);
@@ -351,6 +352,7 @@ class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandl
351352
core->getPlayers().getPlayerConnectDispatcher().addEventHandler(this);
352353
core->getPlayers().getPlayerChangeDispatcher().addEventHandler(this);
353354
core->getPlayers().getPoolEventDispatcher().addEventHandler(this);
355+
core->getPlayers().getPlayerDamageDispatcher().addEventHandler(this, EventPriority_Lowest);
354356
NetCode::RPC::OnPlayerEnterVehicle::addEventHandler(*core, &playerEnterVehicleHandler);
355357
NetCode::RPC::OnPlayerExitVehicle::addEventHandler(*core, &playerExitVehicleHandler);
356358
NetCode::RPC::SetVehicleDamageStatus::addEventHandler(*core, &vehicleDamageStatusHandler);
@@ -539,9 +541,25 @@ class VehiclesComponent final : public IVehiclesComponent, public CoreEventHandl
539541
storage.clear();
540542
}
541543

544+
void onPlayerDeath(IPlayer& player, IPlayer* killer, int reason) override
545+
{
546+
PlayerVehicleData* data = queryExtension<PlayerVehicleData>(player);
547+
if (!data)
548+
{
549+
return;
550+
}
551+
552+
auto vehicle = static_cast<Vehicle*>(data->getVehicle());
553+
if (vehicle)
554+
{
555+
vehicle->unoccupy(player);
556+
}
557+
data->setVehicle(nullptr, SEAT_NONE);
558+
}
559+
542560
void onPlayerStateChange(IPlayer& player, PlayerState newState, PlayerState oldState) override
543561
{
544-
if (newState != PlayerState_Driver && newState != PlayerState_Passenger)
562+
if (newState != PlayerState_Driver && newState != PlayerState_Passenger && newState != PlayerState_Wasted)
545563
{
546564
PlayerVehicleData* data = queryExtension<PlayerVehicleData>(player);
547565
if (!data)

Server/Source/player_pool.hpp

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -376,11 +376,7 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
376376

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

379-
// Keep a record of current state before changing it to wasted, and do not dispatch state change event
380-
// 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)
381-
// Then dispatch the event manually later, after onPlayerDeath event dispatch.
382-
PlayerState oldState = player.getState();
383-
player.setState(PlayerState_Wasted, /* dispatchEvents = */ false);
379+
player.setState(PlayerState_Wasted, /* dispatchEvents = */ true);
384380

385381
IPlayer* killer = self.storage.get(onPlayerDeathRPC.KillerID);
386382
uint8_t reason = onPlayerDeathRPC.Reason;
@@ -412,14 +408,6 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
412408
killer,
413409
reason);
414410

415-
// Dispatch state change event manually after onPlayerDeath, so reset player data after listeners already handled death event.
416-
// Use stored state from above as old state and newly stored state in player data as new one.
417-
self.playerChangeDispatcher.dispatch(
418-
&PlayerChangeEventHandler::onPlayerStateChange,
419-
peer,
420-
peer.getState(),
421-
oldState);
422-
423411
NetCode::RPC::PlayerDeath playerDeathRPC;
424412
playerDeathRPC.PlayerID = player.poolID;
425413
PacketHelper::broadcast(playerDeathRPC, self, &peer);

0 commit comments

Comments
 (0)