// ----------------------------------------------------------------------------- // Example Filterscript for the LS Prison Walls and Gate Objects // ------------------------------------------------------------- // By Matite in February 2015 // // // This script creates the new LS Prison Walls object, removes the existing // GTASA object and creates 2 sets of opening gates. // // Warning... // This script uses a total of: // * 5 objects = 1 for the replacement walls and 4 for the replacement gates // * 2 3D Text Labels = 1 on each set of gates // * Enables the /lsp command to teleport the player to the eastern prison gates // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Includes // -------- // SA-MP include #include // For PlaySoundForPlayersInRange() #include "../include/gl_common.inc" // ----------------------------------------------------------------------------- // Defines // ------- // Used for the eastern and southern prison gates status flags #define GATES_CLOSED 0 #define GATES_CLOSING 1 #define GATES_OPEN 2 #define GATES_OPENING 3 // Used for messages sent to the player #define COLOR_MESSAGE_YELLOW 0xFFDD00AA // ----------------------------------------------------------------------------- // Constants // --------- // Gate names for the 3D text labels static GateNames[2][] = { "Eastern Gates", "Southern Gates" }; // ----------------------------------------------------------------------------- // Variables // --------- // Stores the created object number of the replacement prison walls so it can // be destroyed when the filterscript is unloaded new LSPrisonWallsObject; // Stores the created object numbers of the prison walls gates so they can be // opened or closed and destroyed when the filterscript is unloaded new LSPrisonGatesObject[4]; // Stores a reference to the 3D text labels used on each set of gates so they // can be destroyed when the filterscript is unloaded new Text3D:LabelGates[2]; // Stores the current status of the eastern prison gates new EasternGatesStatus = GATES_CLOSED; // Stores the current status of the southern prison gates new SouthernGatesStatus = GATES_CLOSED; // ----------------------------------------------------------------------------- // Callbacks // --------- public OnPlayerCommandText(playerid, cmdtext[]) { // Check command text if (strcmp("/lsp", cmdtext, true, 4) == 0) { // Set the interior SetPlayerInterior(playerid, 0); // Set player position and facing angle SetPlayerPos(playerid, 1830.66 + random(2), -1538.46, 14.5); SetPlayerFacingAngle(playerid, 85); // Fix camera position after teleporting SetCameraBehindPlayer(playerid); // Send a gametext message to the player GameTextForPlayer(playerid, "~b~~h~LS Prison!", 3000, 3); // Exit here return 1; } // Exit here (return 0 as the command was not handled in this filterscript) return 0; } public OnFilterScriptInit() { // Display information in the Server Console print("\n"); print(" |---------------------------------------------------"); print(" |--- LS Prison Walls Filterscript"); print(" |-- Script v1.01"); print(" |-- 13th February 2015"); print(" |---------------------------------------------------"); // Create the LS Prison Walls object LSPrisonWallsObject = CreateObject(19794, 1787.13, -1565.68, 11.9688, 0, 0, 0); // Display information in the Server Console print(" |-- LS Prison Walls object created"); // Create the LS Prison Walls Eastern Gates objects LSPrisonGatesObject[0] = CreateObject(19795, 1824.318481, -1534.731201, 14.296878 - 0.01, 0, 0, 343.0); LSPrisonGatesObject[1] = CreateObject(19795, 1822.407592, -1540.949951, 14.296878 - 0.01, 0, 0, 163.0); // Create the LS Prison Walls Southern Gates objects LSPrisonGatesObject[2] = CreateObject(19796, 1752.004150, -1591.186523, 14.267195 - 0.01, 0, 0, 77.0); LSPrisonGatesObject[3] = CreateObject(19796, 1756.914062, -1592.316284, 14.267195 - 0.01, 0, 0, 257.0); // Display information in the Server Console print(" |-- LS Prison Walls Gates objects created"); // Create variable new string[192]; // Create 3D Text Label at the prisons eastern gates format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to open or close the gates", GateNames[0]); LabelGates[0] = Create3DTextLabel(string, 0xCCCCCCAA, 1823.78, -1537.98, 13.54, 10.5, 0, 1); // Create 3D Text Label at the prisons eastern gates format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to open or close the gates", GateNames[1]); LabelGates[1] = Create3DTextLabel(string, 0xCCCCCCAA, 1754.27, -1592.18, 13.54, 10.5, 0, 1); // Display information in the Server Console print(" |-- LS Prison Wall Gates 3D Text Labels created"); print(" |---------------------------------------------------"); // Loop for (new i = 0; i < MAX_PLAYERS; i++) { // Check if the player is connected and not a NPC if (IsPlayerConnected(i) && !IsPlayerNPC(i)) { // Remove default GTASA LS Prison Walls and LOD map objects for the player // (so any player currently ingame does not have to rejoin for them // to be removed when this filterscript is loaded) RemoveBuildingForPlayer(i, 4000, 1787.13, -1565.68, 11.9688, 250.0); // Walls RemoveBuildingForPlayer(i, 4080, 1787.13, -1565.68, 11.9688, 250.0); // LOD } } // Exit here return 1; } public OnFilterScriptExit() { // Check for valid object if (IsValidObject(LSPrisonWallsObject)) { // Destroy the LS Prison Walls object DestroyObject(LSPrisonWallsObject); // Display information in the Server Console print(" |---------------------------------------------------"); print(" |-- LS Prison Walls object destroyed"); } // Check for valid object if (IsValidObject(LSPrisonGatesObject[0])) { // Destroy the LS Prison Walls Eastern Gates object 1 DestroyObject(LSPrisonGatesObject[0]); // Display information in the Server Console print(" |-- LS Prison Walls Eastern Gates object 1 destroyed"); } // Check for valid object if (IsValidObject(LSPrisonGatesObject[1])) { // Destroy the LS Prison Walls Eastern Gates object 2 DestroyObject(LSPrisonGatesObject[1]); // Display information in the Server Console print(" |-- LS Prison Walls Eastern Gates object 2 destroyed"); } // Check for valid object if (IsValidObject(LSPrisonGatesObject[2])) { // Destroy the LS Prison Walls Southern Gates object 1 DestroyObject(LSPrisonGatesObject[2]); // Display information in the Server Console print(" |-- LS Prison Walls Southern Gates object 1 destroyed"); } // Check for valid object if (IsValidObject(LSPrisonGatesObject[3])) { // Destroy the LS Prison Walls Southern Gates object 2 DestroyObject(LSPrisonGatesObject[3]); // Display information in the Server Console print(" |-- LS Prison Walls Southern Gates object 2 destroyed"); } // Destroy 3D Text Labels on the eastern and southern gates Delete3DTextLabel(LabelGates[0]); Delete3DTextLabel(LabelGates[1]); // Display information in the Server Console print(" |-- Deleted the 3D Text Labels on the Prison Gates"); // Display information in the Server Console print(" |---------------------------------------------------"); print(" |-- LS Prison Walls Filterscript Unloaded"); print(" |---------------------------------------------------"); // Exit here return 1; } public OnPlayerConnect(playerid) { // Remove default GTASA LS Prison Walls and LOD map objects for the player RemoveBuildingForPlayer(playerid, 4000, 1787.13, -1565.68, 11.9688, 250.0); // Walls RemoveBuildingForPlayer(playerid, 4080, 1787.13, -1565.68, 11.9688, 250.0); // LOD // Exit here (return 1 so this callback is handled in other scripts too) return 1; } public OnObjectMoved(objectid) { // Check if the object that moved was one of the eastern gates if (objectid == LSPrisonGatesObject[0]) { // Check if the eastern gates were closing if (EasternGatesStatus == GATES_CLOSING) { // Set status flag for eastern gates EasternGatesStatus = GATES_CLOSED; } else { // Set status flag for eastern gates EasternGatesStatus = GATES_OPEN; } } // Check if the object that moved was one of the southern gates else if (objectid == LSPrisonGatesObject[2]) { // Check if the southern gates were closing if (SouthernGatesStatus == GATES_CLOSING) { // Set status flag for southern gates SouthernGatesStatus = GATES_CLOSED; } else { // Set status flag for southern gates SouthernGatesStatus = GATES_OPEN; } } // Exit here return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { // Check if the player pressed the conversation yes key (normally the Y key) if (newkeys & KEY_YES) { // Check if the player is outside the eastern prison gates if (IsPlayerInRangeOfPoint(playerid, 10.0, 1823.78, -1537.98, 13.54)) { // Debug //printf("-->Player ID %d within 10m of the Eastern Prison Gates", playerid); // Check if the eastern gates are not currently opening (ie moving) if (EasternGatesStatus == GATES_OPENING) { // Send chat text message and exit here SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the eastern gates to fully open first."); return 1; } // Check if the eastern gates are not currently closing (ie moving) else if (EasternGatesStatus == GATES_CLOSING) { // Send chat text message and exit here SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the eastern gates to fully close first."); return 1; } // Play gate opening sound PlaySoundForPlayersInRange(1035, 50.0, 1823.78, -1537.98, 13.54); // Check if the eastern gates are currently open or closed if (EasternGatesStatus == GATES_CLOSED) { // Send a gametext message to the player GameTextForPlayer(playerid, "~b~~h~Eastern Prison~n~~b~~h~Gates Opening!", 3000, 3); // Animate the eastern gates opening (the small Z offset is required) MoveObject(LSPrisonGatesObject[0], 1824.318481, -1534.731201, 14.296878 + 0.01, 0.002, 0, 0, 258); // Animate the eastern gates opening (the small Z offset is required) MoveObject(LSPrisonGatesObject[1], 1822.407592, -1540.949951, 14.296878 + 0.01, 0.002, 0, 0, 253); // Set status flag for eastern gates EasternGatesStatus = GATES_OPENING; } else { // Send a gametext message to the player GameTextForPlayer(playerid, "~b~~h~Eastern Prison~n~~b~~h~Gates Closing!", 3000, 3); // Animate the eastern gates closing (the small Z offset is required) MoveObject(LSPrisonGatesObject[0], 1824.318481, -1534.731201, 14.296878 - 0.01, 0.002, 0, 0, 343); // Animate the eastern gates closing (the small Z offset is required) MoveObject(LSPrisonGatesObject[1], 1822.407592, -1540.949951, 14.296878 - 0.01, 0.002, 0, 0, 163); // Set status flag for eastern gates EasternGatesStatus = GATES_CLOSING; } } // Check if the player is outside the southern prison gates else if (IsPlayerInRangeOfPoint(playerid, 10.0, 1754.27, -1592.18, 13.54)) { // Debug //printf("-->Player ID %d within 10m of the Southern Prison Gates", playerid); // Check if the southern gates are not currently opening (ie moving) if (SouthernGatesStatus == GATES_OPENING) { // Send chat text message and exit here SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the southern gates to fully open first."); return 1; } // Check if the southern gates are not currently closing (ie moving) else if (SouthernGatesStatus == GATES_CLOSING) { // Send chat text message and exit here SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the southern gates to fully close first."); return 1; } // Play gate opening sound PlaySoundForPlayersInRange(1035, 50.0, 1754.27, -1592.18, 13.54); // Check if the southern gates are currently open or closed if (SouthernGatesStatus == GATES_CLOSED) { // Send a gametext message to the player GameTextForPlayer(playerid, "~b~~h~Southern Prison~n~~b~~h~Gates Opening!", 3000, 3); // Animate the southern gates opening (the small Z offset is required) MoveObject(LSPrisonGatesObject[2], 1752.004150, -1591.186523, 14.267195 + 0.01, 0.002, 0, 0, 172); // Animate the southern gates opening (the small Z offset is required) MoveObject(LSPrisonGatesObject[3], 1756.914062, -1592.316284, 14.267195 + 0.01, 0.002, 0, 0, 187); // Set status flag for southern gates SouthernGatesStatus = GATES_OPENING; } else { // Send a gametext message to the player GameTextForPlayer(playerid, "~b~~h~Southern Prison~n~~b~~h~Gates Closing!", 3000, 3); // Animate the southern gates closing (the small Z offset is required) MoveObject(LSPrisonGatesObject[2], 1752.004150, -1591.186523, 14.267195 - 0.01, 0.002, 0, 0, 77); // Animate the southern gates closing (the small Z offset is required) MoveObject(LSPrisonGatesObject[3], 1756.914062, -1592.316284, 14.267195 - 0.01, 0.002, 0, 0, 257); // Set status flag for southern gates SouthernGatesStatus = GATES_CLOSING; } } } // Exit here (return 1 so this callback is handled in other scripts too) return 1; }