diff --git a/SDK b/SDK index 65bfbda62..bea039215 160000 --- a/SDK +++ b/SDK @@ -1 +1 @@ -Subproject commit 65bfbda62bd8d3e7e817de8ccd3b9bbc5d084fde +Subproject commit bea039215233df2eda0e0ae361437e861b18862a diff --git a/Server/Components/Pawn/Scripting/Vehicle/Events.hpp b/Server/Components/Pawn/Scripting/Vehicle/Events.hpp index 0f898e70e..e1bbff8f7 100644 --- a/Server/Components/Pawn/Scripting/Vehicle/Events.hpp +++ b/Server/Components/Pawn/Scripting/Vehicle/Events.hpp @@ -121,4 +121,24 @@ struct VehicleEvents : public VehicleEventHandler, public SingletonCallInSides("OnTrailerAttach", DefaultReturnValue_False, player.getID(), vehicle.getID(), trailer.getID()); + if (!ret) + { + ret = PawnManager::Get()->CallInEntry("OnTrailerAttach", DefaultReturnValue_True, player.getID(), vehicle.getID(), trailer.getID()); + } + return !!ret; + } + + bool onTrailerDetach(IPlayer& player, IVehicle& vehicle, IVehicle& trailer) override + { + cell ret = PawnManager::Get()->CallInSides("OnTrailerDetach", DefaultReturnValue_False, player.getID(), vehicle.getID(), trailer.getID()); + if (!ret) + { + ret = PawnManager::Get()->CallInEntry("OnTrailerDetach", DefaultReturnValue_True, player.getID(), vehicle.getID(), trailer.getID()); + } + return !!ret; + } }; diff --git a/Server/Components/TestComponent/dllmain.cpp b/Server/Components/TestComponent/dllmain.cpp index 70c4d129c..8640ebe48 100644 --- a/Server/Components/TestComponent/dllmain.cpp +++ b/Server/Components/TestComponent/dllmain.cpp @@ -149,6 +149,16 @@ struct TestComponent : public IComponent, public PlayerDamageEventHandler, publi player.sendClientMessage(Colour::White(), "onVehicleSirenStateChange(" + std::to_string(player.getID()) + ", " + std::to_string(vehicle.getID()) + ", " + std::to_string((int)sirenState) + ")"); return true; } + bool onTrailerAttach(IPlayer& player, IVehicle& vehicle, IVehicle& trailer) override + { + player.sendClientMessage(Colour::White(), "onTrailerAttach(" + std::to_string(player.getID()) + ", " + std::to_string(vehicle.getID()) + ", " + std::to_string(vehicle.getTrailer()->getID()) + ")"); + return true; + } + bool onTrailerDetach(IPlayer& player, IVehicle& vehicle, IVehicle& trailer) override + { + player.sendClientMessage(Colour::White(), "onTrailerDetach(" + std::to_string(player.getID()) + ", " + std::to_string(vehicle.getID()) + ", " + std::to_string(vehicle.getTrailer()->getID()) + ")"); + return true; + } } vehicleEventWatcher; void onPlayerConnect(IPlayer& player) override @@ -1098,8 +1108,8 @@ struct TestComponent : public IComponent, public PlayerDamageEventHandler, publi { vehicle = vehicles->create(false, 411, Vector3(0.0f, 5.0f, 3.5f)); // Create infernus vehicles->create(false, 488, Vector3(-12.0209f, 1.4806f, 3.1172f)); // Create news maverick - tower = vehicles->create(false, 583, Vector3(15.0209f, 1.4806f, 3.1172f)); - trailer = vehicles->create(false, 606, Vector3(12.0209f, 5.4806f, 3.1172f)); + tower = vehicles->create(false, 403, Vector3(15.0209f, 1.4806f, 3.1172f)); + trailer = vehicles->create(false, 435, Vector3(0.0209f, 5.4806f, 3.1172f)); tower->attachTrailer(*trailer); train = vehicles->create(false, 537, Vector3(-1943.2583f, 163.6151f, 25.8754f)); vehicles->getEventDispatcher().addEventHandler(&vehicleEventWatcher); diff --git a/Server/Components/Vehicles/vehicle.cpp b/Server/Components/Vehicles/vehicle.cpp index c269ebea4..c3837a827 100644 --- a/Server/Components/Vehicles/vehicle.cpp +++ b/Server/Components/Vehicles/vehicle.cpp @@ -241,6 +241,11 @@ bool Vehicle::updateFromDriverSync(const VehicleDriverSyncPacket& vehicleSync, I else { trailer->cab = this; + + static_cast&>(pool->getEventDispatcher()).stopAtFalse([&player, this](VehicleEventHandler* handler) + { + return handler->onTrailerAttach(player, *this, *trailer); + }); } } } @@ -253,6 +258,11 @@ bool Vehicle::updateFromDriverSync(const VehicleDriverSyncPacket& vehicleSync, I // Client is reporting no trailer (probably lost it) but server thinks there's still one. Detaching it server side. if (trailer && Time::now() - trailer->trailerUpdateTime > Seconds(0)) { + static_cast&>(pool->getEventDispatcher()).stopAtFalse([&player, this](VehicleEventHandler* handler) + { + return handler->onTrailerDetach(player, *this, *trailer); + }); + trailer->cab = nullptr; trailer = nullptr; }