1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-23 23:04:36 +01:00

Add hook for vehicle crashes to plugin api (#15084)

* Add initial implementation of "vehicle.crash" hook for the scripting api

The hook will fire whenever a vehicle crashes, i.e. an individual car
explodes and it's status becomes "Crashed!"

* Update contributors.md

Add name to contributors list under the "Additional implementation (OpenRCT2)" section.

- If the added line needs to be changed or removed entirely let me know

- I added this based off of the Github wiki: "If it's the first time you're contributing with the project, make sure to update the contributors.md file by appending your name at the end of the respective list."

* Move hook code into function

* Rename hook function

Renamed function, "FireVehicleCrashHook" to "InvokeVehicleCrashHook"

* Wrap InvokeVehicleCrashHook in #ifdef

Move the #ifdef from inside the function body to the outside

* Update changelog and api version

- Added entry to changelog
- Increment API version

* Fix whitespace

Replace tab character with four spaces

* Update src/openrct2/scripting/HookEngine.cpp

Co-authored-by: Tulio Leao <tupaschoal@gmail.com>
This commit is contained in:
andrewpratt64
2021-07-30 08:03:15 -04:00
committed by GitHub
parent 2eb1ee631b
commit 62d66ca9d0
7 changed files with 53 additions and 2 deletions

View File

@@ -24,6 +24,8 @@
#include "../platform/platform.h"
#include "../rct12/RCT12.h"
#include "../scenario/Scenario.h"
#include "../scripting/HookEngine.h"
#include "../scripting/ScriptEngine.h"
#include "../util/Util.h"
#include "../windows/Intent.h"
#include "../world/Map.h"
@@ -738,6 +740,31 @@ template<> bool SpriteBase::Is<Vehicle>() const
return Type == EntityType::Vehicle;
}
#ifdef ENABLE_SCRIPTING
/**
* Fires the "vehicle.crash" api hook
* @param vehicleId Entity id of the vehicle that just crashed
* @param crashId What the vehicle crashed into. Should be either "another_vehicle", "land", or "water"
*/
static void InvokeVehicleCrashHook(const uint16_t vehicleId, const std::string_view crashId)
{
auto& hookEngine = OpenRCT2::GetContext()->GetScriptEngine().GetHookEngine();
if (hookEngine.HasSubscriptions(OpenRCT2::Scripting::HOOK_TYPE::VEHICLE_CRASH))
{
auto ctx = OpenRCT2::GetContext()->GetScriptEngine().GetContext();
// Create event args object
auto obj = OpenRCT2::Scripting::DukObject(ctx);
obj.Set("id", vehicleId);
obj.Set("crashIntoType", crashId);
// Call the subscriptions
auto e = obj.Take();
hookEngine.Call(OpenRCT2::Scripting::HOOK_TYPE::VEHICLE_CRASH, e, true);
}
}
#endif
static bool vehicle_move_info_valid(
VehicleTrackSubposition trackSubposition, track_type_t type, uint8_t direction, int32_t offset)
{
@@ -3598,6 +3625,10 @@ void Vehicle::UpdateCollisionSetup()
train->sub_state = 2;
#ifdef ENABLE_SCRIPTING
InvokeVehicleCrashHook(train->sprite_index, "another_vehicle");
#endif
OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Crash, { train->x, train->y, train->z });
ExplosionCloud::Create({ train->x, train->y, train->z });
@@ -5334,6 +5365,10 @@ void Vehicle::CrashOnLand()
}
SetState(Vehicle::Status::Crashed, sub_state);
#ifdef ENABLE_SCRIPTING
InvokeVehicleCrashHook(sprite_index, "land");
#endif
if (!(curRide->lifecycle_flags & RIDE_LIFECYCLE_CRASHED))
{
auto frontVehicle = GetHead();
@@ -5396,6 +5431,10 @@ void Vehicle::CrashOnWater()
}
SetState(Vehicle::Status::Crashed, sub_state);
#ifdef ENABLE_SCRIPTING
InvokeVehicleCrashHook(sprite_index, "water");
#endif
if (!(curRide->lifecycle_flags & RIDE_LIFECYCLE_CRASHED))
{
auto frontVehicle = GetHead();

View File

@@ -30,6 +30,7 @@ static const EnumMap<HOOK_TYPE> HooksLookupTable({
{ "ride.ratings.calculate", HOOK_TYPE::RIDE_RATINGS_CALCULATE },
{ "action.location", HOOK_TYPE::ACTION_LOCATION },
{ "guest.generation", HOOK_TYPE::GUEST_GENERATION },
{ "vehicle.crash", HOOK_TYPE::VEHICLE_CRASH },
});
HOOK_TYPE OpenRCT2::Scripting::GetHookType(const std::string& name)

View File

@@ -39,6 +39,7 @@ namespace OpenRCT2::Scripting
RIDE_RATINGS_CALCULATE,
ACTION_LOCATION,
GUEST_GENERATION,
VEHICLE_CRASH,
COUNT,
UNDEFINED = -1,
};

View File

@@ -46,7 +46,7 @@ namespace OpenRCT2
namespace OpenRCT2::Scripting
{
static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 31;
static constexpr int32_t OPENRCT2_PLUGIN_API_VERSION = 32;
# ifndef DISABLE_NETWORK
class ScSocketBase;