/* * Copyright (C) 2012 Incognito * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include // Definitions #define STREAMER_TYPE_OBJECT (0) #define STREAMER_TYPE_PICKUP (1) #define STREAMER_TYPE_CP (2) #define STREAMER_TYPE_RACE_CP (3) #define STREAMER_TYPE_MAP_ICON (4) #define STREAMER_TYPE_3D_TEXT_LABEL (5) #define STREAMER_TYPE_AREA (6) #define STREAMER_AREA_TYPE_CIRCLE (0) #define STREAMER_AREA_TYPE_RECTANGLE (1) #define STREAMER_AREA_TYPE_SPHERE (2) #define STREAMER_AREA_TYPE_CUBE (3) #define STREAMER_AREA_TYPE_POLYGON (4) #define STREAMER_OBJECT_TYPE_GLOBAL (0) #define STREAMER_OBJECT_TYPE_PLAYER (1) #define STREAMER_OBJECT_TYPE_DYNAMIC (2) #if !defined FLOAT_INFINITY #define FLOAT_INFINITY (Float:0x7F800000) #endif // Include File Version public Streamer_IncludeFileVersion = 0x26105; #pragma unused Streamer_IncludeFileVersion // Enumerator enum { E_STREAMER_ATTACHED_OBJECT, E_STREAMER_ATTACHED_PLAYER, E_STREAMER_ATTACHED_VEHICLE, E_STREAMER_ATTACH_OFFSET_X, E_STREAMER_ATTACH_OFFSET_Y, E_STREAMER_ATTACH_OFFSET_Z, E_STREAMER_ATTACH_R_X, E_STREAMER_ATTACH_R_Y, E_STREAMER_ATTACH_R_Z, E_STREAMER_ATTACH_X, E_STREAMER_ATTACH_Y, E_STREAMER_ATTACH_Z, E_STREAMER_COLOR, E_STREAMER_DRAW_DISTANCE, E_STREAMER_EXTRA_ID, E_STREAMER_INTERIOR_ID, E_STREAMER_MAX_X, E_STREAMER_MAX_Y, E_STREAMER_MAX_Z, E_STREAMER_MIN_X, E_STREAMER_MIN_Y, E_STREAMER_MIN_Z, E_STREAMER_MODEL_ID, E_STREAMER_MOVE_R_X, E_STREAMER_MOVE_R_Y, E_STREAMER_MOVE_R_Z, E_STREAMER_MOVE_SPEED, E_STREAMER_MOVE_X, E_STREAMER_MOVE_Y, E_STREAMER_MOVE_Z, E_STREAMER_NEXT_X, E_STREAMER_NEXT_Y, E_STREAMER_NEXT_Z, E_STREAMER_PLAYER_ID, E_STREAMER_R_X, E_STREAMER_R_Y, E_STREAMER_R_Z, E_STREAMER_SIZE, E_STREAMER_STREAM_DISTANCE, E_STREAMER_STYLE, E_STREAMER_TEST_LOS, E_STREAMER_TYPE, E_STREAMER_WORLD_ID, E_STREAMER_X, E_STREAMER_Y, E_STREAMER_Z } // Natives (Settings) native Streamer_TickRate(rate); native Streamer_MaxItems(type, items); native Streamer_VisibleItems(type, items); native Streamer_CellDistance(Float:distance); native Streamer_CellSize(Float:size); // Natives (Updates) native Streamer_ProcessActiveItems(); native Streamer_ToggleIdleUpdate(playerid, toggle); native Streamer_ToggleItemUpdate(playerid, type, toggle); native Streamer_Update(playerid); native Streamer_UpdateEx(playerid, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1); // Natives (Data Manipulation) native Streamer_GetFloatData(type, {Text3D,_}:id, data, &Float:result); native Streamer_SetFloatData(type, {Text3D,_}:id, data, Float:value); native Streamer_GetIntData(type, {Text3D,_}:id, data); native Streamer_SetIntData(type, {Text3D,_}:id, data, value); native Streamer_GetArrayData(type, {Text3D,_}:id, data, dest[], maxlength = sizeof dest); native Streamer_SetArrayData(type, {Text3D,_}:id, data, const src[], maxlength = sizeof src); native Streamer_IsInArrayData(type, {Text3D,_}:id, data, value); native Streamer_AppendArrayData(type, {Text3D,_}:id, data, value); native Streamer_RemoveArrayData(type, {Text3D,_}:id, data, value); native Streamer_GetUpperBound(type); // Natives (Miscellaneous) native Streamer_GetDistanceToItem(Float:x, Float:y, Float:z, type, {Text3D,_}:id, &Float:distance); native Streamer_IsItemVisible(playerid, type, {Text3D,_}:id); native Streamer_DestroyAllVisibleItems(playerid, type); native Streamer_CountVisibleItems(playerid, type); // Natives (Objects) native CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 300.0); native DestroyDynamicObject(objectid); native IsValidDynamicObject(objectid); native SetDynamicObjectPos(objectid, Float:x, Float:y, Float:z); native GetDynamicObjectPos(objectid, &Float:x, &Float:y, &Float:z); native SetDynamicObjectRot(objectid, Float:rx, Float:ry, Float:rz); native GetDynamicObjectRot(objectid, &Float:rx, &Float:ry, &Float:rz); native MoveDynamicObject(objectid, Float:x, Float:y, Float:z, Float:speed, Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0); native StopDynamicObject(objectid); native IsDynamicObjectMoving(objectid); native AttachCameraToDynamicObject(playerid, objectid); native AttachDynamicObjectToVehicle(objectid, vehicleid, Float:offsetx, Float:offsety, Float:offsetz, Float:rx, Float:ry, Float:rz); native EditDynamicObject(playerid, objectid); native GetDynamicObjectMaterial(objectid, materialindex, &modelid, txdname[], texturename[], &materialcolor, maxtxdname = sizeof txdname, maxtexturename = sizeof texturename); native SetDynamicObjectMaterial(objectid, materialindex, modelid, const txdname[], const texturename[], materialcolor = 0); native GetDynamicObjectMaterialText(objectid, materialindex, text[], &materialsize, fontface[], &fontsize, &bold, &fontcolor, &backcolor, &textalignment, maxtext = sizeof text, maxfontface = sizeof fontface); native SetDynamicObjectMaterialText(objectid, materialindex, const text[], materialsize = OBJECT_MATERIAL_SIZE_256x128, const fontface[] = "Arial", fontsize = 24, bold = 1, fontcolor = 0xFFFFFFFF, backcolor = 0, textalignment = 0); native DestroyAllDynamicObjects(); native CountDynamicObjects(); // Natives (Pickups) native CreateDynamicPickup(modelid, type, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0); native DestroyDynamicPickup(pickupid); native IsValidDynamicPickup(pickupid); native DestroyAllDynamicPickups(); native CountDynamicPickups(); // Natives (Checkpoints) native CreateDynamicCP(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0); native DestroyDynamicCP(checkpointid); native IsValidDynamicCP(checkpointid); native TogglePlayerDynamicCP(playerid, checkpointid, toggle); native TogglePlayerAllDynamicCPs(playerid, toggle); native IsPlayerInDynamicCP(playerid, checkpointid); native GetPlayerVisibleDynamicCP(playerid); native DestroyAllDynamicCPs(); native CountDynamicCPs(); // Natives (Race Checkpoints) native CreateDynamicRaceCP(type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0); native DestroyDynamicRaceCP(checkpointid); native IsValidDynamicRaceCP(checkpointid); native TogglePlayerDynamicRaceCP(playerid, checkpointid, toggle); native TogglePlayerAllDynamicRaceCPs(playerid, toggle); native IsPlayerInDynamicRaceCP(playerid, checkpointid); native GetPlayerVisibleDynamicRaceCP(playerid); native DestroyAllDynamicRaceCPs(); native CountDynamicRaceCPs(); // Natives (Map Icons) native CreateDynamicMapIcon(Float:x, Float:y, Float:z, type, color, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0); native DestroyDynamicMapIcon(iconid); native IsValidDynamicMapIcon(iconid); native DestroyAllDynamicMapIcons(); native CountDynamicMapIcons(); // Natives (3D Text Labels) native Text3D:CreateDynamic3DTextLabel(const text[], color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0); native DestroyDynamic3DTextLabel(Text3D:id); native IsValidDynamic3DTextLabel(Text3D:id); native GetDynamic3DTextLabelText(Text3D:id, text[], maxlength = sizeof text); native UpdateDynamic3DTextLabelText(Text3D:id, color, const text[]); native DestroyAllDynamic3DTextLabels(); native CountDynamic3DTextLabels(); // Natives (Areas) native CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1); native CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1); native CreateDynamicSphere(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1); native CreateDynamicCube(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid = -1, interiorid = -1, playerid = -1); native CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1); native DestroyDynamicArea(areaid); native IsValidDynamicArea(areaid); native TogglePlayerDynamicArea(playerid, areaid, toggle); native TogglePlayerAllDynamicAreas(playerid, toggle); native IsPlayerInDynamicArea(playerid, areaid); native IsPlayerInAnyDynamicArea(playerid); native IsPointInDynamicArea(areaid, Float:x, Float:y, Float:z); native IsPointInAnyDynamicArea(Float:x, Float:y, Float:z); native AttachDynamicAreaToObject(areaid, objectid, type = STREAMER_OBJECT_TYPE_DYNAMIC, playerid = INVALID_PLAYER_ID); native AttachDynamicAreaToPlayer(areaid, playerid); native AttachDynamicAreaToVehicle(areaid, vehicleid); native DestroyAllDynamicAreas(); native CountDynamicAreas(); // Natives (Extended) native CreateDynamicObjectEx(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:drawdistance = 0.0, Float:streamdistance = 200.0, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicPickupEx(modelid, type, Float:x, Float:y, Float:z, Float:streamdistance = 100.0, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicCPEx(Float:x, Float:y, Float:z, Float:size, Float:streamdistance = 100.0, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicRaceCPEx(type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size, Float:streamdistance = 100.0, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicMapIconEx(Float:x, Float:y, Float:z, type, color, style = MAPICON_LOCAL, Float:streamdistance = 100.0, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native Text3D:CreateDynamic3DTextLabelEx(const text[], color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, Float:streamdistance = 100.0, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicCircleEx(Float:x, Float:y, Float:size, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicRectangleEx(Float:minx, Float:miny, Float:maxx, Float:maxy, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicSphereEx(Float:x, Float:y, Float:z, Float:size, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicCubeEx(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); native CreateDynamicPolygonEx(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worlds[] = { -1 }, interiors[] = { -1 }, players[] = { -1 }, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players); // Natives (Internal) native Streamer_CallbackHook(callback, {Float,_}:...); // Callbacks forward OnDynamicObjectMoved(objectid); forward OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz); forward OnPlayerSelectDynamicObject(playerid, objectid, modelid, Float:x, Float:y, Float:z); forward OnPlayerPickUpDynamicPickup(playerid, pickupid); forward OnPlayerEnterDynamicCP(playerid, checkpointid); forward OnPlayerLeaveDynamicCP(playerid, checkpointid); forward OnPlayerEnterDynamicRaceCP(playerid, checkpointid); forward OnPlayerLeaveDynamicRaceCP(playerid, checkpointid); forward OnPlayerEnterDynamicArea(playerid, areaid); forward OnPlayerLeaveDynamicArea(playerid, areaid); // Callback Hook Section #define STREAMER_OPC (0) #define STREAMER_OPDC (1) #define STREAMER_OPEO (2) #define STREAMER_OPSO (3) #define STREAMER_OPPP (4) #define STREAMER_OPEC (5) #define STREAMER_OPLC (6) #define STREAMER_OPERC (7) #define STREAMER_OPLRC (8) static bool:Streamer_g_OPC = false; static bool:Streamer_g_OPDC = false; static bool:Streamer_g_OPEO = false; static bool:Streamer_g_OPSO = false; static bool:Streamer_g_OPPP = false; static bool:Streamer_g_OPEC = false; static bool:Streamer_g_OPLC = false; static bool:Streamer_g_OPERC = false; static bool:Streamer_g_OPLRC = false; public OnFilterScriptInit() { Streamer_g_OPC = funcidx("Streamer_OnPlayerConnect") != -1; Streamer_g_OPDC = funcidx("Streamer_OnPlayerDisconnect") != -1; Streamer_g_OPEO = funcidx("Streamer_OnPlayerEditObject") != -1; Streamer_g_OPSO = funcidx("Streamer_OnPlayerSelectObject") != -1; Streamer_g_OPPP = funcidx("Streamer_OnPlayerPickUpPickup") != -1; Streamer_g_OPEC = funcidx("Streamer_OnPlayerEnterCP") != -1; Streamer_g_OPLC = funcidx("Streamer_OnPlayerLeaveCP") != -1; Streamer_g_OPERC = funcidx("Streamer_OnPlayerEnterRaceCP") != -1; Streamer_g_OPLRC = funcidx("Streamer_OnPlayerLeaveRaceCP") != -1; if (funcidx("Streamer_OnFilterScriptInit") != -1) { return CallLocalFunction("Streamer_OnFilterScriptInit", ""); } return 1; } #if defined _ALS_OnFilterScriptInit #undef OnFilterScriptInit #else #define _ALS_OnFilterScriptInit #endif #define OnFilterScriptInit Streamer_OnFilterScriptInit forward Streamer_OnFilterScriptInit(); public OnGameModeInit() { Streamer_g_OPC = funcidx("Streamer_OnPlayerConnect") != -1; Streamer_g_OPDC = funcidx("Streamer_OnPlayerDisconnect") != -1; Streamer_g_OPEO = funcidx("Streamer_OnPlayerEditObject") != -1; Streamer_g_OPSO = funcidx("Streamer_OnPlayerSelectObject") != -1; Streamer_g_OPPP = funcidx("Streamer_OnPlayerPickUpPickup") != -1; Streamer_g_OPEC = funcidx("Streamer_OnPlayerEnterCP") != -1; Streamer_g_OPLC = funcidx("Streamer_OnPlayerLeaveCP") != -1; Streamer_g_OPERC = funcidx("Streamer_OnPlayerEnterRaceCP") != -1; Streamer_g_OPLRC = funcidx("Streamer_OnPlayerLeaveRaceCP") != -1; if (funcidx("Streamer_OnGameModeInit") != -1) { return CallLocalFunction("Streamer_OnGameModeInit", ""); } return 1; } #if defined _ALS_OnGameModeInit #undef OnGameModeInit #else #define _ALS_OnGameModeInit #endif #define OnGameModeInit Streamer_OnGameModeInit forward Streamer_OnGameModeInit(); public OnPlayerConnect(playerid) { Streamer_CallbackHook(STREAMER_OPC, playerid); if (Streamer_g_OPC) { return CallLocalFunction("Streamer_OnPlayerConnect", "d", playerid); } return 1; } #if defined _ALS_OnPlayerConnect #undef OnPlayerConnect #else #define _ALS_OnPlayerConnect #endif #define OnPlayerConnect Streamer_OnPlayerConnect forward Streamer_OnPlayerConnect(playerid); public OnPlayerDisconnect(playerid, reason) { Streamer_CallbackHook(STREAMER_OPDC, playerid, reason); if (Streamer_g_OPDC) { return CallLocalFunction("Streamer_OnPlayerDisconnect", "dd", playerid, reason); } return 1; } #if defined _ALS_OnPlayerDisconnect #undef OnPlayerDisconnect #else #define _ALS_OnPlayerDisconnect #endif #define OnPlayerDisconnect Streamer_OnPlayerDisconnect forward Streamer_OnPlayerDisconnect(playerid, reason); public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ) { if (playerobject) { Streamer_CallbackHook(STREAMER_OPEO, playerid, playerobject, objectid, response, fX, fY, fZ, fRotX, fRotY, fRotZ); } if (Streamer_g_OPEO) { return CallLocalFunction("Streamer_OnPlayerEditObject", "ddddffffff", playerid, playerobject, objectid, response, fX, fY, fZ, fRotX, fRotY, fRotZ); } return 1; } #if defined _ALS_OnPlayerEditObject #undef OnPlayerEditObject #else #define _ALS_OnPlayerEditObject #endif #define OnPlayerEditObject Streamer_OnPlayerEditObject forward Streamer_OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ); public OnPlayerSelectObject(playerid, type, objectid, modelid, Float:fX, Float:fY, Float:fZ) { if (type == SELECT_OBJECT_PLAYER_OBJECT) { Streamer_CallbackHook(STREAMER_OPSO, playerid, type, objectid, modelid, fX, fY, fZ); } if (Streamer_g_OPSO) { return CallLocalFunction("Streamer_OnPlayerSelectObject", "ddddfff", playerid, type, objectid, modelid, fX, fY, fZ); } return 1; } #if defined _ALS_OnPlayerSelectObject #undef OnPlayerSelectObject #else #define _ALS_OnPlayerSelectObject #endif #define OnPlayerSelectObject Streamer_OnPlayerSelectObject forward Streamer_OnPlayerSelectObject(playerid, type, objectid, modelid, Float:fX, Float:fY, Float:fZ); public OnPlayerPickUpPickup(playerid, pickupid) { Streamer_CallbackHook(STREAMER_OPPP, playerid, pickupid); if (Streamer_g_OPPP) { return CallLocalFunction("Streamer_OnPlayerPickUpPickup", "dd", playerid, pickupid); } return 1; } #if defined _ALS_OnPlayerPickUpPickup #undef OnPlayerPickUpPickup #else #define _ALS_OnPlayerPickUpPickup #endif #define OnPlayerPickUpPickup Streamer_OnPlayerPickUpPickup forward Streamer_OnPlayerPickUpPickup(playerid, pickupid); public OnPlayerEnterCheckpoint(playerid) { Streamer_CallbackHook(STREAMER_OPEC, playerid); if (Streamer_g_OPEC) { return CallLocalFunction("Streamer_OnPlayerEnterCP", "d", playerid); } return 1; } #if defined _ALS_OnPlayerEnterCheckpoint #undef OnPlayerEnterCheckpoint #else #define _ALS_OnPlayerEnterCheckpoint #endif #define OnPlayerEnterCheckpoint Streamer_OnPlayerEnterCP forward Streamer_OnPlayerEnterCP(playerid); public OnPlayerLeaveCheckpoint(playerid) { Streamer_CallbackHook(STREAMER_OPLC, playerid); if (Streamer_g_OPLC) { return CallLocalFunction("Streamer_OnPlayerLeaveCP", "d", playerid); } return 1; } #if defined _ALS_OnPlayerLeaveCheckpoint #undef OnPlayerLeaveCheckpoint #else #define _ALS_OnPlayerLeaveCheckpoint #endif #define OnPlayerLeaveCheckpoint Streamer_OnPlayerLeaveCP forward Streamer_OnPlayerLeaveCP(playerid); public OnPlayerEnterRaceCheckpoint(playerid) { Streamer_CallbackHook(STREAMER_OPERC, playerid); if (Streamer_g_OPERC) { return CallLocalFunction("Streamer_OnPlayerEnterRaceCP", "d", playerid); } return 1; } #if defined _ALS_OnPlayerEnterRaceCP #undef OnPlayerEnterRaceCheckpoint #else #define _ALS_OnPlayerEnterRaceCP #endif #define OnPlayerEnterRaceCheckpoint Streamer_OnPlayerEnterRaceCP forward Streamer_OnPlayerEnterRaceCP(playerid); public OnPlayerLeaveRaceCheckpoint(playerid) { Streamer_CallbackHook(STREAMER_OPLRC, playerid); if (Streamer_g_OPLRC) { return CallLocalFunction("Streamer_OnPlayerLeaveRaceCP", "d", playerid); } return 1; } #if defined _ALS_OnPlayerLeaveRaceCP #undef OnPlayerLeaveRaceCheckpoint #else #define _ALS_OnPlayerLeaveRaceCP #endif #define OnPlayerLeaveRaceCheckpoint Streamer_OnPlayerLeaveRaceCP forward Streamer_OnPlayerLeaveRaceCP(playerid);