Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * SA-MP Spike Strips
- *
- * Copyright (c) 2013, Stylock
- * This file is provided as is with no warranties of any kind.
- */
- /*
- * Changelog
- *
- * 13/8/2013
- * ~ shortened the prefix from "SpikeStrip" to "Stinger"
- * ~ added a config option to enable/disable the OnSpikeStripPopTire callback
- * ~ added a config option to enable/disable the Streamer plugin support
- *
- * 5/7/2013:
- * ~ changed parameter order in OnSpikeStripPopTire callback
- * ~ fixed a bug where OnSpikeStripPopTire callback wasn't getting called
- * ~ fixed incorrect arguments being passed to SetTimer function
- * ~ added a function named SpikeStrip_DeleteAll that deletes all spike strips
- *
- * 4/7/2013:
- * ~ removed the auto-adjustment of the Z coordinate when creating a spike strip
- * ~ added a callback named OnSpikeStripPopTire that is called when a tire is popped
- * ~ added a function named SpikeStrip_IsValid that checks the validity of a spike strip
- * ~ added a function named SpikeStrip_SetGhost that toggles a player's ghost mode
- * ~ added a function named SpikeStrip_IsGhost that checks a player's ghost mode
- *
- * 3/7/2013:
- * ~ initial release
- */
- #include <a_samp>
- // Alternatively use foreach
- #include <YSI\y_iterate>
- #define MAX_SPIKE_STRIPS (100)
- #define SS_TIME_INTERVAL (250)
- #define SS_LINE_SEGMENTS (2) // 1, 2 or 4
- #define SS_USE_CALLBACK (true) // OnSpikeStripPopTire
- #define SS_USE_STREAMER (false) // Streamer plugin support
- // Spike strip models
- #define SPIKE_STRIP_LONG (2892)
- #define SPIKE_STRIP_SHORT (2899)
- static stock
- g_SpikeStrip[MAX_SPIKE_STRIPS],
- Iterator:g_Spike<MAX_SPIKE_STRIPS>,
- Float:g_Spike_x1[MAX_SPIKE_STRIPS],
- Float:g_Spike_y1[MAX_SPIKE_STRIPS],
- Float:g_Spike_x2[MAX_SPIKE_STRIPS],
- Float:g_Spike_y2[MAX_SPIKE_STRIPS],
- Float:g_Spike_x3[MAX_SPIKE_STRIPS],
- Float:g_Spike_y3[MAX_SPIKE_STRIPS],
- Float:g_Spike_x4[MAX_SPIKE_STRIPS],
- Float:g_Spike_y4[MAX_SPIKE_STRIPS],
- Float:g_Spike_zA[MAX_SPIKE_STRIPS],
- Float:g_Tire1_x1[MAX_PLAYERS],
- Float:g_Tire1_y1[MAX_PLAYERS],
- Float:g_Tire1_z1[MAX_PLAYERS],
- Float:g_Tire1_x2[MAX_PLAYERS],
- Float:g_Tire1_y2[MAX_PLAYERS],
- Float:g_Tire1_z2[MAX_PLAYERS],
- Float:g_Tire1_x3[MAX_PLAYERS],
- Float:g_Tire1_y3[MAX_PLAYERS],
- Float:g_Tire1_z3[MAX_PLAYERS],
- Float:g_Tire1_x4[MAX_PLAYERS],
- Float:g_Tire1_y4[MAX_PLAYERS],
- Float:g_Tire1_z4[MAX_PLAYERS],
- Float:g_Tire2_x1[MAX_PLAYERS],
- Float:g_Tire2_y1[MAX_PLAYERS],
- Float:g_Tire2_x2[MAX_PLAYERS],
- Float:g_Tire2_z1[MAX_PLAYERS],
- Float:g_Tire2_y2[MAX_PLAYERS],
- Float:g_Tire2_z2[MAX_PLAYERS],
- g_GetGhostMode[MAX_PLAYERS char],
- g_GetTireState[MAX_PLAYERS char],
- g_GetTireCount[MAX_PLAYERS char],
- g_GetVehicleID[MAX_PLAYERS],
- g_GetTickCount[MAX_PLAYERS],
- g_GetServerTC;
- enum (<<= 1)
- {
- e_TIRE_RR = 0b0001,
- e_TIRE_FR,
- e_TIRE_RL,
- e_TIRE_FL,
- }
- // Forwards
- forward SS_GetTickCount();
- forward OnSpikeStripPopTire(spikeid, vehicleid, playerid, tire);
- public SS_GetTickCount()
- {
- // Store the tick count for fast access. Better than
- // calling the function 20 times per second per player.
- g_GetServerTC = GetTickCount();
- return 1;
- }
- public OnGameModeInit()
- {
- SetTimer("SS_GetTickCount", 50, 1);
- #if defined SS_OnGameModeInit
- return SS_OnGameModeInit();
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnGameModeInit
- #undef OnGameModeInit
- #else
- #define _ALS_OnGameModeInit
- #endif
- #define OnGameModeInit SS_OnGameModeInit
- #if defined SS_OnGameModeInit
- forward SS_OnGameModeInit();
- #endif
- public OnPlayerUpdate(playerid)
- {
- static
- Float:matrix3x3[9],
- Float:x1, Float:y1, Float:z1,
- Float:x2, Float:y2, Float:z2,
- Float:x3, Float:y3, Float:z3,
- Float:x4, Float:y4, Float:z4;
- if (g_GetTickCount[playerid] < g_GetServerTC)
- {
- if (GetPlayerState(playerid) == 2) // Driver
- {
- if (IsPlayerNPC(playerid))
- {
- return 1;
- }
- if (!g_GetGhostMode{playerid})
- {
- new
- vid = GetPlayerVehicleID(playerid);
- if (vid != g_GetVehicleID[playerid])
- {
- new
- mid = GetVehicleModel(vid);
- g_GetTireCount{playerid} = SS_GetTireCount(mid);
- g_GetTireState{playerid} = SS_GetTireState(vid);
- GetVehicleModelInfo(mid, 6, x1, y1, z1);
- SS_GetTireSize(mid, e_TIRE_RR, z2);
- // Save rear wheel offsets
- g_Tire2_x1[playerid] = x1,
- g_Tire2_y1[playerid] = y1,
- g_Tire2_z1[playerid] = z1 - z2 / 2;
- GetVehicleModelInfo(mid, 5, x1, y1, z1);
- SS_GetTireSize(mid, e_TIRE_FR, z2);
- // Save front wheel offsets
- g_Tire2_x2[playerid] = x1,
- g_Tire2_y2[playerid] = y1,
- g_Tire2_z2[playerid] = z1 - z2 / 2;
- }
- if (g_GetTireCount{playerid}) // Check if the player's vehicle has any tires
- {
- if (g_GetTireState{playerid} < 0b1111) // Check if at least one tire is not flat (0b1111 = all tires are flat)
- {
- SS_GetVehicleRotationMatrix(vid, matrix3x3);
- // If the tire is not flat, then get its position
- !(g_GetTireState{playerid} & e_TIRE_RR) && SS_GetTirePos(vid, x1, y1, z1, g_Tire2_x1[playerid], g_Tire2_y1[playerid], g_Tire2_z1[playerid], matrix3x3), // RR
- !(g_GetTireState{playerid} & e_TIRE_FR) && SS_GetTirePos(vid, x2, y2, z2, g_Tire2_x2[playerid], g_Tire2_y2[playerid], g_Tire2_z2[playerid], matrix3x3); // FR
- if (g_GetTireCount{playerid} > 2)
- {
- !(g_GetTireState{playerid} & e_TIRE_RL) && SS_GetTirePos(vid, x3, y3, z3, -g_Tire2_x1[playerid], g_Tire2_y1[playerid], g_Tire2_z1[playerid], matrix3x3), // RL
- !(g_GetTireState{playerid} & e_TIRE_FL) && SS_GetTirePos(vid, x4, y4, z4, -g_Tire2_x2[playerid], g_Tire2_y2[playerid], g_Tire2_z2[playerid], matrix3x3); // FL
- }
- foreach (new i : g_Spike)
- {
- if (IsPlayerInRangeOfPoint(playerid, 60.0, g_Spike_x1[i], g_Spike_y1[i], g_Spike_zA[i]))
- {
- // If the tire is not flat, then monitor it
- !(g_GetTireState{playerid} & e_TIRE_RR) && SS_MonitorTire(vid, e_TIRE_RR, i, playerid, x1, y1, z1, g_Tire1_x1[playerid], g_Tire1_y1[playerid], g_Tire1_z1[playerid]), // RR
- !(g_GetTireState{playerid} & e_TIRE_FR) && SS_MonitorTire(vid, e_TIRE_FR, i, playerid, x2, y2, z2, g_Tire1_x2[playerid], g_Tire1_y2[playerid], g_Tire1_z2[playerid]); // FR
- if (g_GetTireCount{playerid} > 2)
- {
- !(g_GetTireState{playerid} & e_TIRE_RL) && SS_MonitorTire(vid, e_TIRE_RL, i, playerid, x3, y3, z3, g_Tire1_x3[playerid], g_Tire1_y3[playerid], g_Tire1_z3[playerid]), // RL
- !(g_GetTireState{playerid} & e_TIRE_FL) && SS_MonitorTire(vid, e_TIRE_FL, i, playerid, x4, y4, z4, g_Tire1_x4[playerid], g_Tire1_y4[playerid], g_Tire1_z4[playerid]); // FL
- }
- }
- }
- // If the tire is not flat, then save its position
- !(g_GetTireState{playerid} & e_TIRE_RR) && (g_Tire1_x1[playerid] = x1, g_Tire1_y1[playerid] = y1, g_Tire1_z1[playerid] = z1),
- !(g_GetTireState{playerid} & e_TIRE_FR) && (g_Tire1_x2[playerid] = x2, g_Tire1_y2[playerid] = y2, g_Tire1_z2[playerid] = z2);
- if (g_GetTireCount{playerid} > 2)
- {
- !(g_GetTireState{playerid} & e_TIRE_RL) && (g_Tire1_x3[playerid] = x3, g_Tire1_y3[playerid] = y3, g_Tire1_z3[playerid] = z3),
- !(g_GetTireState{playerid} & e_TIRE_FL) && (g_Tire1_x4[playerid] = x4, g_Tire1_y4[playerid] = y4, g_Tire1_z4[playerid] = z4);
- }
- }
- }
- g_GetVehicleID[playerid] = vid;
- }
- }
- g_GetTickCount[playerid] = g_GetServerTC + SS_TIME_INTERVAL;
- }
- #if defined SS_OnPlayerUpdate
- return SS_OnPlayerUpdate(playerid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerUpdate
- #undef OnPlayerUpdate
- #else
- #define _ALS_OnPlayerUpdate
- #endif
- #define OnPlayerUpdate SS_OnPlayerUpdate
- #if defined SS_OnPlayerUpdate
- forward SS_OnPlayerUpdate(playerid);
- #endif
- public OnVehicleDamageStatusUpdate(vehicleid, playerid)
- {
- new
- tire_state = SS_GetTireState(vehicleid);
- if (tire_state != g_GetTireState{playerid})
- {
- if (g_GetTireState{playerid} > tire_state) // Check if at least one tire is fixed
- {
- new
- Float:matrix3x3[9];
- SS_GetVehicleRotationMatrix(vehicleid, matrix3x3);
- if (e_TIRE_RR & (g_GetTireState{playerid} & ~tire_state)) // If a flat tire is fixed
- {
- SS_GetTirePos(vehicleid, g_Tire1_x1[playerid], g_Tire1_y1[playerid], g_Tire1_z1[playerid], g_Tire2_x1[playerid], g_Tire2_y1[playerid], g_Tire2_z1[playerid], matrix3x3);
- }
- if (e_TIRE_FR & (g_GetTireState{playerid} & ~tire_state)) // If a flat tire is fixed
- {
- SS_GetTirePos(vehicleid, g_Tire1_x2[playerid], g_Tire1_y2[playerid], g_Tire1_z2[playerid], g_Tire2_x2[playerid], g_Tire2_y2[playerid], g_Tire2_z2[playerid], matrix3x3);
- }
- if (e_TIRE_RL & (g_GetTireState{playerid} & ~tire_state)) // If a flat tire is fixed
- {
- SS_GetTirePos(vehicleid, g_Tire1_x3[playerid], g_Tire1_y3[playerid], g_Tire1_z3[playerid], -g_Tire2_x1[playerid], g_Tire2_y1[playerid], g_Tire2_z1[playerid], matrix3x3);
- }
- if (e_TIRE_FL & (g_GetTireState{playerid} & ~tire_state)) // If a flat tire is fixed
- {
- SS_GetTirePos(vehicleid, g_Tire1_x4[playerid], g_Tire1_y4[playerid], g_Tire1_z4[playerid], -g_Tire2_x2[playerid], g_Tire2_y2[playerid], g_Tire2_z2[playerid], matrix3x3);
- }
- }
- g_GetTireState{playerid} = tire_state;
- }
- #if defined SS_OnVehicleDamageStatusUpdate
- return SS_OnVehicleDamageStatusUpdate(vehicleid, playerid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnVehicleDamageStatusUpd
- #undef OnVehicleDamageStatusUpdate
- #else
- #define _ALS_OnVehicleDamageStatusUpd
- #endif
- #define OnVehicleDamageStatusUpdate SS_OnVehicleDamageStatusUpdate
- #if defined SS_OnVehicleDamageStatusUpdate
- forward SS_OnVehicleDamageStatusUpdate(vehicleid, playerid);
- #endif
- stock SS_MonitorTire(vid, tire, sid, pid, Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
- {
- new
- Float:distance = 1.0;
- if (SS_SegmentsIntersect_2D(g_Spike_x1[sid], g_Spike_y1[sid], g_Spike_x2[sid], g_Spike_y2[sid], x1, y1, x2, y2))
- {
- SS_DistanceLineToLine_3D(g_Spike_x1[sid], g_Spike_y1[sid], g_Spike_zA[sid], g_Spike_x2[sid], g_Spike_y2[sid], g_Spike_zA[sid], x1, y1, z1, x2, y2, z2, distance);
- }
- #if SS_LINE_SEGMENTS >= 2
- else if (SS_SegmentsIntersect_2D(g_Spike_x3[sid], g_Spike_y3[sid], g_Spike_x4[sid], g_Spike_y4[sid], x1, y1, x2, y2))
- {
- SS_DistanceLineToLine_3D(g_Spike_x3[sid], g_Spike_y3[sid], g_Spike_zA[sid], g_Spike_x4[sid], g_Spike_y4[sid], g_Spike_zA[sid], x1, y1, z1, x2, y2, z2, distance);
- }
- #endif
- #if SS_LINE_SEGMENTS == 4
- else if (SS_SegmentsIntersect_2D(g_Spike_x1[sid], g_Spike_y1[sid], g_Spike_x3[sid], g_Spike_y3[sid], x1, y1, x2, y2))
- {
- SS_DistanceLineToLine_3D(g_Spike_x1[sid], g_Spike_y1[sid], g_Spike_zA[sid], g_Spike_x3[sid], g_Spike_y3[sid], g_Spike_zA[sid], x1, y1, z1, x2, y2, z2, distance);
- }
- else if (SS_SegmentsIntersect_2D(g_Spike_x2[sid], g_Spike_y2[sid], g_Spike_x4[sid], g_Spike_y4[sid], x1, y1, x2, y2))
- {
- SS_DistanceLineToLine_3D(g_Spike_x2[sid], g_Spike_y2[sid], g_Spike_zA[sid], g_Spike_x4[sid], g_Spike_y4[sid], g_Spike_zA[sid], x1, y1, z1, x2, y2, z2, distance);
- }
- #endif
- if (distance < 0.24)
- {
- if (vid == g_GetVehicleID[pid]) // Make sure surprise tire pops don't occur
- {
- new
- data1,
- data2,
- data3,
- data4;
- GetVehicleDamageStatus(vid, data1, data2, data3, data4);
- UpdateVehicleDamageStatus(vid, data1, data2, data3, (data4 | tire)); // Pop
- #if SS_USE_CALLBACK
- CallRemoteFunction("OnSpikeStripPopTire", "iiii", sid, vid, pid, tire);
- #endif
- }
- }
- return 1;
- }
- stock SS_GetTireState(vid)
- {
- new
- data;
- GetVehicleDamageStatus(vid, data, data, data, data);
- return data;
- }
- stock SS_GetTireCount(mid)
- {
- static const
- tire_data[] =
- {
- 4, 4, 4, 6, 4, 4, 4, 4, 6, 4,
- 4, 4, 4, 4, 4, 4, 4, 0, 4, 4,
- 4, 4, 4, 4, 4, 0, 4, 4, 4, 4,
- 0, 6, 4, 6, 4, 4, 4, 6, 4, 4,
- 4, 0, 4, 6, 4, 4, 0, 0, 2, 0,
- 4, 4, 0, 0, 0, 6, 4, 4, 4, 4,
- 0, 2, 2, 2, 0, 0, 4, 4, 2, 0,
- 4, 4, 0, 0, 4, 4, 0, 4, 4, 4,
- 4, 0, 4, 4, 0, 4, 4, 0, 0, 4,
- 4, 4, 4, 0, 4, 4, 4, 0, 4, 4,
- 4, 0, 4, 4, 4, 4, 4, 4, 4, 0,
- 0, 0, 0, 0, 6, 6, 4, 4, 4, 0,
- 0, 2, 2, 2, 6, 4, 4, 4, 4, 4,
- 4, 4, 6, 4, 4, 4, 4, 0, 0, 0,
- 4, 4, 4, 4, 4, 4, 4, 4, 0, 4,
- 4, 4, 4, 0, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 0, 0, 4, 4, 4, 4, 0,
- 0, 4, 4, 4, 4, 4, 4, 0, 6, 4,
- 4, 2, 4, 4, 4, 4, 2, 4, 4, 4,
- 0, 4, 0, 0, 0, 0, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4
- };
- // Aircraft, boats, bicycles, trains
- // and RC vehicles return zero tires
- return tire_data[mid - 400];
- }
- stock SS_GetTireSize(mid, tire, &Float:size)
- {
- static const
- Float:tire_size_R[] =
- {
- // Rear wheel size (from vehicles.ide)
- 0.7680, 0.7749, 0.6999, 1.1000, 0.6600, 0.6999, 2.2799, 1.0000, 1.0599, 0.7500,
- 0.8000, 0.6999, 0.6999, 0.7200, 0.7599, 0.6800, 0.8640, 0.0000, 0.6999, 0.6399,
- 0.7879, 0.6499, 0.6999, 0.6999, 0.9200, 0.0000, 0.6999, 0.9359, 0.9139, 0.6999,
- 0.0000, 1.0000, 1.2999, 1.2000, 0.8000, 1.1000, 0.6999, 1.0000, 0.6999, 0.6999,
- 0.6999, 0.0000, 0.6800, 1.0820, 1.5000, 0.6800, 0.0000, 0.0000, 0.4639, 0.0000,
- 1.1000, 0.7500, 0.0000, 0.0000, 0.0000, 1.2000, 0.8399, 0.5000, 0.7200, 0.6999,
- 0.0000, 0.6700, 0.4639, 0.5600, 0.0000, 0.0000, 0.6999, 0.6999, 0.6200, 0.0000,
- 0.8939, 0.6000, 0.0000, 0.0000, 0.6999, 0.6999, 0.0000, 0.7599, 0.6999, 0.6999,
- 0.6999, 0.0000, 0.6999, 0.6600, 0.0000, 0.6000, 1.5000, 0.0000, 0.0000, 0.8999,
- 0.9200, 0.6499, 0.6999, 0.0000, 0.8199, 0.9720, 0.6999, 0.0000, 0.7599, 0.8000,
- 0.8000, 0.0000, 0.8199, 0.8199, 0.6999, 0.8999, 0.7730, 0.6999, 0.8000, 0.0000,
- 0.0000, 0.0000, 0.0000, 0.0000, 1.1059, 1.1799, 0.7500, 0.7500, 0.6600, 0.0000,
- 0.0000, 0.6800, 0.6800, 0.6700, 1.0000, 0.9200, 0.6999, 0.6999, 0.8500, 0.6999,
- 0.4499, 1.2999, 1.0000, 0.6999, 0.6999, 0.7400, 0.6999, 0.0000, 0.0000, 0.0000,
- 0.6999, 1.0000, 0.7400, 0.6999, 1.0000, 0.6999, 0.6999, 0.6999, 0.0000, 0.6840,
- 0.7599, 0.7500, 0.8399, 0.0000, 0.8399, 0.6999, 1.5000, 1.5000, 0.7879, 0.6999,
- 0.8700, 0.6999, 0.6800, 0.0000, 0.0000, 0.6399, 0.6999, 0.6999, 0.6999, 0.0000,
- 0.0000, 0.2599, 0.5600, 1.1399, 0.5000, 0.6999, 0.6999, 0.0000, 1.0000, 0.8999,
- 0.7799, 0.6800, 0.7699, 0.7500, 1.1200, 0.7400, 0.6539, 0.6999, 0.8600, 0.7400,
- 0.0000, 1.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6999, 0.6999, 0.6999, 0.9499,
- 0.6999, 1.3660, 0.6999, 0.6999, 0.6999, 0.6999, 0.6000, 0.6000, 0.6000, 0.7599,
- 0.3199, 0.6800
- };
- if (tire & (e_TIRE_RR | e_TIRE_RL))
- {
- size = tire_size_R[mid - 400];
- return 1;
- }
- static const
- Float:tire_size_F[] =
- {
- // Front wheel size (from vehicles.ide)
- 0.7680, 0.7749, 0.6999, 1.1000, 0.6600, 0.6999, 2.2799, 1.0000, 1.0599, 0.7500,
- 0.8000, 0.6999, 0.6999, 0.7200, 0.7599, 0.6800, 0.8640, 0.0000, 0.6999, 0.6399,
- 0.7879, 0.6499, 0.6999, 0.6999, 0.8399, 0.0000, 0.6999, 0.9359, 0.9139, 0.6999,
- 0.0000, 1.0000, 1.2999, 1.2000, 0.7200, 1.1000, 0.6999, 1.0000, 0.6999, 0.6999,
- 0.6999, 0.0000, 0.6800, 1.0820, 1.5000, 0.6800, 0.0000, 0.0000, 0.4639, 0.0000,
- 1.1000, 0.6999, 0.0000, 0.0000, 0.0000, 1.2000, 0.8399, 0.5000, 0.7200, 0.6999,
- 0.0000, 0.6700, 0.4639, 0.7799, 0.0000, 0.0000, 0.6999, 0.6999, 0.6800, 0.0000,
- 0.8939, 0.6000, 0.0000, 0.0000, 0.6999, 0.6999, 0.0000, 0.7599, 0.6999, 0.6999,
- 0.6999, 0.0000, 0.6999, 0.6600, 0.0000, 0.6000, 1.5000, 0.0000, 0.0000, 0.8999,
- 0.9200, 0.6499, 0.6999, 0.0000, 0.8199, 0.9720, 0.6999, 0.0000, 0.7599, 0.8000,
- 0.8000, 0.0000, 0.8199, 0.8199, 0.6999, 0.8999, 0.7730, 0.6999, 0.8000, 0.0000,
- 0.0000, 0.0000, 0.0000, 0.0000, 1.1059, 1.1799, 0.7500, 0.7500, 0.6600, 0.0000,
- 0.0000, 0.6800, 0.6800, 0.6700, 1.1200, 0.9200, 0.6999, 0.6999, 0.8500, 0.6999,
- 0.4499, 0.6800, 0.5879, 0.6999, 0.6999, 0.7400, 0.6999, 0.0000, 0.0000, 0.0000,
- 0.6999, 1.0000, 0.7400, 0.6999, 1.0000, 0.6999, 0.6999, 0.6999, 0.0000, 0.6840,
- 0.7599, 0.7500, 0.8399, 0.0000, 0.8399, 0.6999, 1.5000, 1.5000, 0.7879, 0.6999,
- 0.8700, 0.6999, 0.6800, 0.0000, 0.0000, 0.6399, 0.6999, 0.6999, 0.5500, 0.0000,
- 0.0000, 0.2599, 0.4799, 1.1399, 0.5000, 0.6999, 0.6999, 0.0000, 1.0000, 0.8999,
- 0.7799, 0.6800, 0.7699, 0.6600, 1.1200, 0.7400, 0.6539, 0.6999, 0.8600, 0.7400,
- 0.0000, 1.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6999, 0.6999, 0.6999, 0.9499,
- 0.6999, 1.3660, 0.6999, 0.6999, 0.6999, 0.6999, 0.6000, 0.6000, 0.6000, 0.7599,
- 0.3199, 0.6800
- };
- if (tire & (e_TIRE_FR | e_TIRE_FL))
- {
- size = tire_size_F[mid - 400];
- return 1;
- }
- return 0;
- }
- stock SS_GetTirePos(vid, &Float:px, &Float:py, &Float:pz, Float:ox, Float:oy, Float:oz, Float:matrix3x3[])
- {
- GetVehiclePos(vid, px, py, pz);
- px = px + ox * (1 - 2 * (matrix3x3[4] + matrix3x3[7])) + oy * (2 * (matrix3x3[1] + matrix3x3[8])) + oz * (2 * (matrix3x3[2] - matrix3x3[6])),
- py = py + ox * (2 * (matrix3x3[1] - matrix3x3[8])) + oy * (1 - 2 * (matrix3x3[0] + matrix3x3[7])) + oz * (2 * (matrix3x3[5] + matrix3x3[3])),
- pz = pz + ox * (2 * (matrix3x3[2] + matrix3x3[6])) + oy * (2 * (matrix3x3[5] - matrix3x3[3])) + oz * (1 - 2 * (matrix3x3[0] + matrix3x3[4]));
- return 1;
- }
- stock SS_GetVehicleRotationMatrix(vid, Float:matrix3x3[])
- {
- new
- Float:qw,
- Float:qx,
- Float:qy,
- Float:qz;
- GetVehicleRotationQuat(vid, qw, qx, qy, qz);
- matrix3x3[0] = qx * qx, matrix3x3[1] = qx * qy, matrix3x3[2] = qx * qz,
- matrix3x3[3] = qx * qw, matrix3x3[4] = qy * qy, matrix3x3[5] = qy * qz,
- matrix3x3[6] = qy * qw, matrix3x3[7] = qz * qz, matrix3x3[8] = qz * qw;
- return 1;
- }
- /*
- This function checks if two line segments intersect (2D space)
- */
- stock SS_SegmentsIntersect_2D(Float:x1, Float:y1, Float:x2, Float:y2, Float:x3, Float:y3, Float:x4, Float:y4)
- {
- new
- Float:xA = x2 - x1,
- Float:yA = y2 - y1,
- Float:xB = x4 - x3,
- Float:yB = y4 - y3,
- Float:d = xA * yB - yA * xB;
- if (!d)
- {
- // Lines are parallel, or one or
- // both segments are zero-length
- return 0;
- }
- new
- Float:xC = x3 - x1,
- Float:yC = y3 - y1,
- Float:pA = (xC * yB - yC * xB) / d,
- Float:pB = (xC * yA - yC * xA) / d;
- if (pA < 0 || pA > 1 || pB < 0 || pB > 1)
- {
- return 0;
- }
- // Compute the intersection point
- // xi = x1 + pA * xA
- // yi = y1 + pA * yA
- return 1;
- }
- /*
- This function computes the shortest distance between two lines (3D space)
- */
- stock SS_DistanceLineToLine_3D(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, Float:x3, Float:y3, Float:z3, Float:x4, Float:y4, Float:z4, &Float:distance)
- {
- new
- Float:ux = x2 - x1,
- Float:uy = y2 - y1,
- Float:uz = z2 - z1,
- Float:vx = x4 - x3,
- Float:vy = y4 - y3,
- Float:vz = z4 - z3,
- Float:wx = x1 - x3,
- Float:wy = y1 - y3,
- Float:wz = z1 - z3,
- Float:uu = ux * ux + uy * uy + uz * uz,
- Float:uv = ux * vx + uy * vy + uz * vz,
- Float:uw = ux * wx + uy * wy + uz * wz,
- Float:vv = vx * vx + vy * vy + vz * vz,
- Float:vw = vx * wx + vy * wy + vz * wz,
- Float:d = uu * vv - uv * uv,
- Float:pA = (uv * vw - vv * uw) / d,
- Float:pB = (uu * vw - uv * uw) / d,
- // The difference of the two closest points
- Float:dx = wx + pA * ux - pB * vx,
- Float:dy = wy + pA * uy - pB * vy,
- Float:dz = wz + pA * uz - pB * vz;
- distance = floatsqroot(dx * dx + dy * dy + dz * dz);
- return 1;
- }
- #if !SS_USE_STREAMER
- #define SS_CreateObject(%0) \
- CreateObject(%0, 200.0)
- #define SS_DestroyObject \
- DestroyObject
- #else
- #include <streamer>
- #define SS_CreateObject \
- CreateDynamicObject
- #define SS_DestroyObject \
- DestroyDynamicObject
- #endif
- /*
- native Stinger_Create(mid, Float:x, Float:y, Float:z, Float:a);
- */
- stock Stinger_Create(mid, Float:x, Float:y, Float:z, Float:a)
- {
- new
- idx = Iter_Free(g_Spike);
- if (idx != -1)
- {
- new
- Float:adjust,
- Float:length;
- switch (mid)
- {
- case 2892:
- {
- length = 5.0;
- }
- case 2899:
- {
- length = 2.5;
- adjust = 0.118;
- }
- default:
- {
- return INVALID_OBJECT_ID;
- }
- }
- new
- id = SS_CreateObject(mid, x, y, z + adjust, 0.0, 0.0, a - 90.0);
- if (id != INVALID_OBJECT_ID)
- {
- a = -a;
- Iter_Add(g_Spike, idx);
- g_SpikeStrip[idx] = id;
- #if SS_LINE_SEGMENTS == 1
- g_Spike_x1[idx] = x + length * floatsin(a - 90.0, degrees);
- g_Spike_y1[idx] = y + length * floatcos(a - 90.0, degrees);
- g_Spike_x2[idx] = x - length * floatsin(a - 90.0, degrees);
- g_Spike_y2[idx] = y - length * floatcos(a - 90.0, degrees);
- #endif
- #if SS_LINE_SEGMENTS >= 2
- new
- value;
- mid != 2892 && (value = 10) || (value = 5);
- g_Spike_x1[idx] = x + length * floatsin(a - (90.0 + value), degrees);
- g_Spike_y1[idx] = y + length * floatcos(a - (90.0 + value), degrees);
- g_Spike_x3[idx] = x + length * floatsin(a - (90.0 - value), degrees);
- g_Spike_y3[idx] = y + length * floatcos(a - (90.0 - value), degrees);
- #if SS_LINE_SEGMENTS == 2
- g_Spike_x2[idx] = x - length * floatsin(a - (90.0 + value), degrees);
- g_Spike_y2[idx] = y - length * floatcos(a - (90.0 + value), degrees);
- g_Spike_x4[idx] = x - length * floatsin(a - (90.0 - value), degrees);
- g_Spike_y4[idx] = y - length * floatcos(a - (90.0 - value), degrees);
- #endif
- #if SS_LINE_SEGMENTS == 4
- g_Spike_x2[idx] = x - length * floatsin(a - (90.0 - value), degrees);
- g_Spike_y2[idx] = y - length * floatcos(a - (90.0 - value), degrees);
- g_Spike_x4[idx] = x - length * floatsin(a - (90.0 + value), degrees);
- g_Spike_y4[idx] = y - length * floatcos(a - (90.0 + value), degrees);
- #endif
- #endif
- g_Spike_zA[idx] = z;
- return idx;
- }
- }
- return INVALID_OBJECT_ID;
- }
- #define SpikeStrip_Create Stinger_Create
- /*
- native Stinger_Delete(sid);
- */
- stock Stinger_Delete(sid)
- {
- if (Iter_Contains(g_Spike, sid))
- {
- SS_DestroyObject(g_SpikeStrip[sid]);
- Iter_Remove(g_Spike, sid);
- }
- return 1;
- }
- #define SpikeStrip_Delete Stinger_Delete
- /*
- native Stinger_DeleteAll();
- */
- stock Stinger_DeleteAll()
- {
- foreach (new i : g_Spike)
- {
- SS_DestroyObject(g_SpikeStrip[i]);
- Iter_SafeRemove(g_Spike, i, i);
- }
- return 1;
- }
- #define SpikeStrip_DeleteAll Stinger_DeleteAll
- /*
- native Stinger_IsValid(sid);
- */
- stock Stinger_IsValid(sid)
- {
- return Iter_Contains(g_Spike, sid);
- }
- #define SpikeStrip_IsValid Stinger_IsValid
- /*
- native Stinger_SetGhost(pid, bool:toggle);
- */
- stock Stinger_SetGhost(pid, bool:toggle)
- {
- g_GetVehicleID[pid] = 0;
- g_GetGhostMode{pid} = toggle;
- return 1;
- }
- #define SpikeStrip_SetGhost Stinger_SetGhost
- /*
- native Stinger_IsGhost(pid);
- */
- stock Stinger_IsGhost(pid)
- {
- return g_GetGhostMode{pid};
- }
- #define SpikeStrip_IsGhost Stinger_IsGhost
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement