@ -0,0 +1,3 @@ | |||
*.exe | |||
samp-license.txt | |||
server-readme.txt |
@ -0,0 +1,422 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the Area 51 (69) Base Objects | |||
// ------------------------------------------------------ | |||
// By Matite in March 2015 | |||
// | |||
// | |||
// This script removes the existing GTASA Area 51 (69) land section, fence and | |||
// buildings. It then replaces the land section and buildings with the new | |||
// enterable versions. It also replaces the perimeter fence and adds two | |||
// gates that can be opened or closed. | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 11 objects = 1 for the replacement land object, 7 for the replacement | |||
// building objects, 1 for the outer fence and 2 for the gates | |||
// * Enables the /a51 command to teleport the player to the Area 51 (69) Base | |||
// * 2 3D Text Labels = 1 on each gate | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// For PlaySoundForPlayersInRange() | |||
#include "../include/gl_common.inc" | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Used for messages sent to the player | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// Used for the northern and eastern A51 (69) gates status flags | |||
#define GATES_CLOSED 0 | |||
#define GATES_CLOSING 1 | |||
#define GATES_OPEN 2 | |||
#define GATES_OPENING 3 | |||
// ----------------------------------------------------------------------------- | |||
// Constants | |||
// --------- | |||
// Gate names for the 3D text labels | |||
static GateNames[2][] = | |||
{ | |||
"Northern Gate", | |||
"Eastern Gate" | |||
}; | |||
// ----------------------------------------------------------------------------- | |||
// Variables | |||
// --------- | |||
// Stores the created object numbers of the replacement Area 51 (69) land object, | |||
// buildings and fence so they can be destroyed when the filterscript is unloaded | |||
new A51LandObject; // Land object | |||
new A51Buildings[7]; // Building object | |||
new A51Fence; // Fence | |||
new A51NorthernGate; // Northern Gate | |||
new A51EasternGate; // Eastern Gate | |||
// 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 northern gate | |||
new NorthernGateStatus = GATES_CLOSED; | |||
// Stores the current status of the eastern gate | |||
new EasternGateStatus = GATES_CLOSED; | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/a51", cmdtext, true, 4) == 0) | |||
{ | |||
// Set the interior (outside) | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle (outside the northern gate) | |||
SetPlayerPos(playerid, 135.20, 1948.51, 19.74); | |||
SetPlayerFacingAngle(playerid, 180); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Area 51 (69) Base!", 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(" |--- Area 51 (69) Building Objects Filterscript"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 28th March 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create the A51 Land object | |||
A51LandObject = CreateObject(11692, 199.344, 1943.79, 18.2031, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) Land object created"); | |||
// Create the A51 Fence object | |||
A51Fence = CreateObject(19312, 191.141, 1870.04, 21.4766, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) Fence object created"); | |||
// Create the A51 Building objects | |||
A51Buildings[0] = CreateObject(19905, 206.798950, 1931.643432, 16.450595, 0, 0, 0); | |||
A51Buildings[1] = CreateObject(19905, 188.208908, 1835.033569, 16.450595, 0, 0, 0); | |||
A51Buildings[2] = CreateObject(19905, 230.378875, 1835.033569, 16.450595, 0, 0, 0); | |||
A51Buildings[3] = CreateObject(19907, 142.013977, 1902.538085, 17.633581, 0, 0, 270.0); | |||
A51Buildings[4] = CreateObject(19907, 146.854003, 1846.008056, 16.533580, 0, 0, 0); | |||
A51Buildings[5] = CreateObject(19909, 137.900390, 1875.024291, 16.836734, 0, 0, 270.0); | |||
A51Buildings[6] = CreateObject(19909, 118.170387, 1875.184326, 16.846735, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) Building objects created"); | |||
// Create the Northern gate object | |||
A51NorthernGate = CreateObject(19313, 134.545074, 1941.527709, 21.691408, 0, 0, 180.0); | |||
// Create the Eastern gate object | |||
A51EasternGate = CreateObject(19313, 286.008666, 1822.744628, 20.010623, 0, 0, 90.0); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) Gate 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 gate", GateNames[0]); | |||
LabelGates[0] = Create3DTextLabel(string, 0xCCCCCCAA, 135.09, 1942.37, 19.82, 10.5, 0, 0); | |||
// 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 gate", GateNames[1]); | |||
LabelGates[1] = Create3DTextLabel(string, 0xCCCCCCAA, 287.12, 1821.51, 18.14, 10.5, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) 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 Area 51 (69) land and buildings 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, 16203, 199.344, 1943.79, 18.2031, 250.0); // Land | |||
RemoveBuildingForPlayer(i, 16590, 199.344, 1943.79, 18.2031, 250.0); // Land LOD | |||
RemoveBuildingForPlayer(i, 16323, 199.336, 1943.88, 18.2031, 250.0); // Buildings | |||
RemoveBuildingForPlayer(i, 16619, 199.336, 1943.88, 18.2031, 250.0); // Buildings LOD | |||
RemoveBuildingForPlayer(i, 1697, 228.797, 1835.34, 23.2344, 250.0); // Solar Panels (they poke through the roof inside) | |||
RemoveBuildingForPlayer(i, 16094, 191.141, 1870.04, 21.4766, 250.0); // Outer Fence | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(A51LandObject)) | |||
{ | |||
// Destroy the A51 land object | |||
DestroyObject(A51LandObject); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Area 51 (69) Land object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(A51Fence)) | |||
{ | |||
// Destroy the A51 fence object | |||
DestroyObject(A51Fence); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) Fence object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(A51NorthernGate)) | |||
{ | |||
// Destroy the A51 northern gate object | |||
DestroyObject(A51NorthernGate); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) Northern Gate object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(A51EasternGate)) | |||
{ | |||
// Destroy the A51 eastern gate object | |||
DestroyObject(A51EasternGate); | |||
// Display information in the Server Console | |||
print(" |-- Area 51 (69) Eastern Gate object destroyed"); | |||
} | |||
// Loop | |||
for (new i = 0; i < sizeof(A51Buildings); i++) | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(A51Buildings[i])) | |||
{ | |||
// Destroy the A51 building object | |||
DestroyObject(A51Buildings[i]); | |||
// Display information in the Server Console | |||
printf(" |-- Area 51 (69) Building object %d destroyed", i + 1); | |||
} | |||
} | |||
// Destroy 3D Text Labels on the northern and eastern gates | |||
Delete3DTextLabel(LabelGates[0]); | |||
Delete3DTextLabel(LabelGates[1]); | |||
// Display information in the Server Console | |||
print(" |-- Deleted the 3D Text Labels on the Area 51 (69) Gates"); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Area 51 (69) Base Objects Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA Area 51 (69) land and buildings for the player | |||
RemoveBuildingForPlayer(playerid, 16203, 199.344, 1943.79, 18.2031, 250.0); // Land | |||
RemoveBuildingForPlayer(playerid, 16590, 199.344, 1943.79, 18.2031, 250.0); // Land LOD | |||
RemoveBuildingForPlayer(playerid, 16323, 199.336, 1943.88, 18.2031, 250.0); // Buildings | |||
RemoveBuildingForPlayer(playerid, 16619, 199.336, 1943.88, 18.2031, 250.0); // Buildings LOD | |||
RemoveBuildingForPlayer(playerid, 1697, 228.797, 1835.34, 23.2344, 250.0); // Solar Panels (they poke through the roof inside) | |||
RemoveBuildingForPlayer(playerid, 16094, 191.141, 1870.04, 21.4766, 250.0); // Outer Fence | |||
// 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 the northern gate | |||
if (objectid == A51NorthernGate) | |||
{ | |||
// Check if the northern gate was closing | |||
if (NorthernGateStatus == GATES_CLOSING) | |||
{ | |||
// Set status flag for northern gates | |||
NorthernGateStatus = GATES_CLOSED; | |||
} | |||
else | |||
{ | |||
// Set status flag for northern gates | |||
NorthernGateStatus = GATES_OPEN; | |||
} | |||
} | |||
// Check if the object that moved was the eastern gate | |||
else if (objectid == A51EasternGate) | |||
{ | |||
// Check if the eastern gate was closing | |||
if (EasternGateStatus == GATES_CLOSING) | |||
{ | |||
// Set status flag for eastern gate | |||
EasternGateStatus = GATES_CLOSED; | |||
} | |||
else | |||
{ | |||
// Set status flag for eastern gate | |||
EasternGateStatus = 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 near the eastern A51 gate | |||
if (IsPlayerInRangeOfPoint(playerid, 10.0, 287.12, 1821.51, 18.14)) | |||
{ | |||
// Debug | |||
//printf("-->Player ID %d within 10m of the Eastern A51 Gate", playerid); | |||
// Check if the eastern gate is currently opening (ie moving) | |||
if (EasternGateStatus == GATES_OPENING) | |||
{ | |||
// Send chat text message and exit here | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the eastern gate to fully open first."); | |||
return 1; | |||
} | |||
// Check if the eastern gate is currently closing (ie moving) | |||
else if (EasternGateStatus == GATES_CLOSING) | |||
{ | |||
// Send chat text message and exit here | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the eastern gate to fully close first."); | |||
return 1; | |||
} | |||
// Play gate opening sound | |||
PlaySoundForPlayersInRange(1035, 50.0, 287.12, 1821.51, 18.14); | |||
// Check if the eastern gate is currently closed | |||
if (EasternGateStatus == GATES_CLOSED) | |||
{ | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Eastern Gate Opening!", 3000, 3); | |||
// Animate the eastern gate opening | |||
MoveObject(A51EasternGate, 286.008666, 1833.744628, 20.010623, 1.1, 0, 0, 90); | |||
// Set status flag for eastern gate | |||
EasternGateStatus = GATES_OPENING; | |||
} | |||
else | |||
{ | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Eastern Gate Closing!", 3000, 3); | |||
// Animate the eastern gates closing | |||
MoveObject(A51EasternGate, 286.008666, 1822.744628, 20.010623, 1.1, 0, 0, 90); | |||
// Set status flag for eastern gate | |||
EasternGateStatus = GATES_CLOSING; | |||
} | |||
} | |||
// Check if the player is near the northern A51 gate | |||
else if (IsPlayerInRangeOfPoint(playerid, 10.0, 135.09, 1942.37, 19.82)) | |||
{ | |||
// Debug | |||
//printf("-->Player ID %d within 10m of the Northern A51 Gate", playerid); | |||
// Check if the northern gate is currently opening (ie moving) | |||
if (NorthernGateStatus == GATES_OPENING) | |||
{ | |||
// Send chat text message and exit here | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the northern gate to fully open first."); | |||
return 1; | |||
} | |||
// Check if the northern gates is currently closing (ie moving) | |||
else if (NorthernGateStatus == GATES_CLOSING) | |||
{ | |||
// Send chat text message and exit here | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the northern gate to fully close first."); | |||
return 1; | |||
} | |||
// Play gate opening sound | |||
PlaySoundForPlayersInRange(1035, 50.0, 135.09, 1942.37, 19.82); | |||
// Check if the northern gate is currently closed | |||
if (NorthernGateStatus == GATES_CLOSED) | |||
{ | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Northern Gate Opening!", 3000, 3); | |||
// Animate the northern gates opening | |||
MoveObject(A51NorthernGate, 121.545074, 1941.527709, 21.691408, 1.3, 0, 0, 180); | |||
// Set status flag for northern gates | |||
NorthernGateStatus = GATES_OPENING; | |||
} | |||
else | |||
{ | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Northern Gate Closing!", 3000, 3); | |||
// Animate the northern gates closing | |||
MoveObject(A51NorthernGate, 134.545074, 1941.527709, 21.691408, 1.3, 0, 0, 180); | |||
// Set status flag for northern gates | |||
NorthernGateStatus = GATES_CLOSING; | |||
} | |||
} | |||
} | |||
// Exit here (return 1 so this callback is handled in other scripts too) | |||
return 1; | |||
} | |||
@ -0,0 +1,121 @@ | |||
// | |||
// ADMIN SPECTATE FILTER SCRIPT | |||
// kye 2007 | |||
// | |||
#pragma tabsize 0 | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
#include "../include/gl_common.inc" | |||
#define COLOR_GREY 0xAFAFAFAA | |||
#define COLOR_GREEN 0x33AA33AA | |||
#define COLOR_RED 0xAA3333AA | |||
#define COLOR_YELLOW 0xFFFF00AA | |||
#define COLOR_WHITE 0xFFFFFFFF | |||
//------------------------------------------------------------------------------------------------------ | |||
#define ADMIN_SPEC_TYPE_NONE 0 | |||
#define ADMIN_SPEC_TYPE_PLAYER 1 | |||
#define ADMIN_SPEC_TYPE_VEHICLE 2 | |||
new gSpectateID[MAX_PLAYERS]; | |||
new gSpectateType[MAX_PLAYERS]; | |||
//------------------------------------------------------------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
} | |||
//------------------------------------------------------------------------------------------------------ | |||
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) | |||
{ | |||
// IF ANYONE IS SPECTATING THIS PLAYER, WE'LL ALSO HAVE | |||
// TO CHANGE THEIR INTERIOR ID TO MATCH | |||
new x = 0; | |||
while(x!=MAX_PLAYERS) { | |||
if( IsPlayerConnected(x) && GetPlayerState(x) == PLAYER_STATE_SPECTATING && | |||
gSpectateID[x] == playerid && gSpectateType[x] == ADMIN_SPEC_TYPE_PLAYER ) | |||
{ | |||
SetPlayerInterior(x,newinteriorid); | |||
} | |||
x++; | |||
} | |||
} | |||
//------------------------------------------------------------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256]; | |||
new specplayerid, specvehicleid, idx; | |||
// WE ONLY DEAL WITH COMMANDS FROM ADMINS IN THIS FILTERSCRIPT | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
cmd = strtok(cmdtext, idx); | |||
// SPECTATE A PLAYER | |||
if(strcmp(cmd, "/specplayer", true) == 0) { | |||
new tmp[256]; | |||
tmp = strtok(cmdtext, idx); | |||
if(!strlen(tmp)) { | |||
SendClientMessage(playerid, COLOR_WHITE, "USAGE: /specplayer [playerid]"); | |||
return 1; | |||
} | |||
specplayerid = strval(tmp); | |||
if(!IsPlayerConnected(specplayerid)) { | |||
SendClientMessage(playerid, COLOR_RED, "specplayer: that player isn't active."); | |||
return 1; | |||
} | |||
TogglePlayerSpectating(playerid, 1); | |||
PlayerSpectatePlayer(playerid, specplayerid); | |||
SetPlayerInterior(playerid,GetPlayerInterior(specplayerid)); | |||
gSpectateID[playerid] = specplayerid; | |||
gSpectateType[playerid] = ADMIN_SPEC_TYPE_PLAYER; | |||
return 1; | |||
} | |||
// SPECTATE A VEHICLE | |||
if(strcmp(cmd, "/specvehicle", true) == 0) { | |||
new tmp[256]; | |||
tmp = strtok(cmdtext, idx); | |||
if(!strlen(tmp)) { | |||
SendClientMessage(playerid, COLOR_WHITE, "USAGE: /specvehicle [vehicleid]"); | |||
return 1; | |||
} | |||
specvehicleid = strval(tmp); | |||
if(specvehicleid < MAX_VEHICLES) { | |||
TogglePlayerSpectating(playerid, 1); | |||
PlayerSpectateVehicle(playerid, specvehicleid); | |||
gSpectateID[playerid] = specvehicleid; | |||
gSpectateType[playerid] = ADMIN_SPEC_TYPE_VEHICLE; | |||
} | |||
return 1; | |||
} | |||
// STOP SPECTATING | |||
if(strcmp(cmd, "/specoff", true) == 0) { | |||
TogglePlayerSpectating(playerid, 0); | |||
gSpectateID[playerid] = INVALID_PLAYER_ID; | |||
gSpectateType[playerid] = ADMIN_SPEC_TYPE_NONE; | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------------------------------------------------------------ | |||
@ -0,0 +1,383 @@ | |||
//------------------------------------------------- | |||
// | |||
// This is an example of using the EditAttachedObject functions | |||
// to allow the player to customize their character. | |||
// | |||
// h02 2012 | |||
// | |||
// SA-MP 0.3e and above | |||
// | |||
//------------------------------------------------- | |||
#include <a_samp> | |||
#define DIALOG_ATTACH_INDEX 13500 | |||
#define DIALOG_ATTACH_INDEX_SELECTION DIALOG_ATTACH_INDEX+1 | |||
#define DIALOG_ATTACH_EDITREPLACE DIALOG_ATTACH_INDEX+2 | |||
#define DIALOG_ATTACH_MODEL_SELECTION DIALOG_ATTACH_INDEX+3 | |||
#define DIALOG_ATTACH_BONE_SELECTION DIALOG_ATTACH_INDEX+4 | |||
enum AttachmentEnum | |||
{ | |||
attachmodel, | |||
attachname[24] | |||
} | |||
new AttachmentObjects[][AttachmentEnum] = { | |||
{18632, "FishingRod"}, | |||
{18633, "GTASAWrench1"}, | |||
{18634, "GTASACrowbar1"}, | |||
{18635, "GTASAHammer1"}, | |||
{18636, "PoliceCap1"}, | |||
{18637, "PoliceShield1"}, | |||
{18638, "HardHat1"}, | |||
{18639, "BlackHat1"}, | |||
{18640, "Hair1"}, | |||
{18975, "Hair2"}, | |||
{19136, "Hair4"}, | |||
{19274, "Hair5"}, | |||
{18641, "Flashlight1"}, | |||
{18642, "Taser1"}, | |||
{18643, "LaserPointer1"}, | |||
{19080, "LaserPointer2"}, | |||
{19081, "LaserPointer3"}, | |||
{19082, "LaserPointer4"}, | |||
{19083, "LaserPointer5"}, | |||
{19084, "LaserPointer6"}, | |||
{18644, "Screwdriver1"}, | |||
{18645, "MotorcycleHelmet1"}, | |||
{18865, "MobilePhone1"}, | |||
{18866, "MobilePhone2"}, | |||
{18867, "MobilePhone3"}, | |||
{18868, "MobilePhone4"}, | |||
{18869, "MobilePhone5"}, | |||
{18870, "MobilePhone6"}, | |||
{18871, "MobilePhone7"}, | |||
{18872, "MobilePhone8"}, | |||
{18873, "MobilePhone9"}, | |||
{18874, "MobilePhone10"}, | |||
{18875, "Pager1"}, | |||
{18890, "Rake1"}, | |||
{18891, "Bandana1"}, | |||
{18892, "Bandana2"}, | |||
{18893, "Bandana3"}, | |||
{18894, "Bandana4"}, | |||
{18895, "Bandana5"}, | |||
{18896, "Bandana6"}, | |||
{18897, "Bandana7"}, | |||
{18898, "Bandana8"}, | |||
{18899, "Bandana9"}, | |||
{18900, "Bandana10"}, | |||
{18901, "Bandana11"}, | |||
{18902, "Bandana12"}, | |||
{18903, "Bandana13"}, | |||
{18904, "Bandana14"}, | |||
{18905, "Bandana15"}, | |||
{18906, "Bandana16"}, | |||
{18907, "Bandana17"}, | |||
{18908, "Bandana18"}, | |||
{18909, "Bandana19"}, | |||
{18910, "Bandana20"}, | |||
{18911, "Mask1"}, | |||
{18912, "Mask2"}, | |||
{18913, "Mask3"}, | |||
{18914, "Mask4"}, | |||
{18915, "Mask5"}, | |||
{18916, "Mask6"}, | |||
{18917, "Mask7"}, | |||
{18918, "Mask8"}, | |||
{18919, "Mask9"}, | |||
{18920, "Mask10"}, | |||
{18921, "Beret1"}, | |||
{18922, "Beret2"}, | |||
{18923, "Beret3"}, | |||
{18924, "Beret4"}, | |||
{18925, "Beret5"}, | |||
{18926, "Hat1"}, | |||
{18927, "Hat2"}, | |||
{18928, "Hat3"}, | |||
{18929, "Hat4"}, | |||
{18930, "Hat5"}, | |||
{18931, "Hat6"}, | |||
{18932, "Hat7"}, | |||
{18933, "Hat8"}, | |||
{18934, "Hat9"}, | |||
{18935, "Hat10"}, | |||
{18936, "Helmet1"}, | |||
{18937, "Helmet2"}, | |||
{18938, "Helmet3"}, | |||
{18939, "CapBack1"}, | |||
{18940, "CapBack2"}, | |||
{18941, "CapBack3"}, | |||
{18942, "CapBack4"}, | |||
{18943, "CapBack5"}, | |||
{18944, "HatBoater1"}, | |||
{18945, "HatBoater2"}, | |||
{18946, "HatBoater3"}, | |||
{18947, "HatBowler1"}, | |||
{18948, "HatBowler2"}, | |||
{18949, "HatBowler3"}, | |||
{18950, "HatBowler4"}, | |||
{18951, "HatBowler5"}, | |||
{18952, "BoxingHelmet1"}, | |||
{18953, "CapKnit1"}, | |||
{18954, "CapKnit2"}, | |||
{18955, "CapOverEye1"}, | |||
{18956, "CapOverEye2"}, | |||
{18957, "CapOverEye3"}, | |||
{18958, "CapOverEye4"}, | |||
{18959, "CapOverEye5"}, | |||
{18960, "CapRimUp1"}, | |||
{18961, "CapTrucker1"}, | |||
{18962, "CowboyHat2"}, | |||
{18963, "CJElvisHead"}, | |||
{18964, "SkullyCap1"}, | |||
{18965, "SkullyCap2"}, | |||
{18966, "SkullyCap3"}, | |||
{18967, "HatMan1"}, | |||
{18968, "HatMan2"}, | |||
{18969, "HatMan3"}, | |||
{18970, "HatTiger1"}, | |||
{18971, "HatCool1"}, | |||
{18972, "HatCool2"}, | |||
{18973, "HatCool3"}, | |||
{18974, "MaskZorro1"}, | |||
{18976, "MotorcycleHelmet2"}, | |||
{18977, "MotorcycleHelmet3"}, | |||
{18978, "MotorcycleHelmet4"}, | |||
{18979, "MotorcycleHelmet5"}, | |||
{19006, "GlassesType1"}, | |||
{19007, "GlassesType2"}, | |||
{19008, "GlassesType3"}, | |||
{19009, "GlassesType4"}, | |||
{19010, "GlassesType5"}, | |||
{19011, "GlassesType6"}, | |||
{19012, "GlassesType7"}, | |||
{19013, "GlassesType8"}, | |||
{19014, "GlassesType9"}, | |||
{19015, "GlassesType10"}, | |||
{19016, "GlassesType11"}, | |||
{19017, "GlassesType12"}, | |||
{19018, "GlassesType13"}, | |||
{19019, "GlassesType14"}, | |||
{19020, "GlassesType15"}, | |||
{19021, "GlassesType16"}, | |||
{19022, "GlassesType17"}, | |||
{19023, "GlassesType18"}, | |||
{19024, "GlassesType19"}, | |||
{19025, "GlassesType20"}, | |||
{19026, "GlassesType21"}, | |||
{19027, "GlassesType22"}, | |||
{19028, "GlassesType23"}, | |||
{19029, "GlassesType24"}, | |||
{19030, "GlassesType25"}, | |||
{19031, "GlassesType26"}, | |||
{19032, "GlassesType27"}, | |||
{19033, "GlassesType28"}, | |||
{19034, "GlassesType29"}, | |||
{19035, "GlassesType30"}, | |||
{19036, "HockeyMask1"}, | |||
{19037, "HockeyMask2"}, | |||
{19038, "HockeyMask3"}, | |||
{19039, "WatchType1"}, | |||
{19040, "WatchType2"}, | |||
{19041, "WatchType3"}, | |||
{19042, "WatchType4"}, | |||
{19043, "WatchType5"}, | |||
{19044, "WatchType6"}, | |||
{19045, "WatchType7"}, | |||
{19046, "WatchType8"}, | |||
{19047, "WatchType9"}, | |||
{19048, "WatchType10"}, | |||
{19049, "WatchType11"}, | |||
{19050, "WatchType12"}, | |||
{19051, "WatchType13"}, | |||
{19052, "WatchType14"}, | |||
{19053, "WatchType15"}, | |||
{19085, "EyePatch1"}, | |||
{19086, "ChainsawDildo1"}, | |||
{19090, "PomPomBlue"}, | |||
{19091, "PomPomRed"}, | |||
{19092, "PomPomGreen"}, | |||
{19093, "HardHat2"}, | |||
{19094, "BurgerShotHat1"}, | |||
{19095, "CowboyHat1"}, | |||
{19096, "CowboyHat3"}, | |||
{19097, "CowboyHat4"}, | |||
{19098, "CowboyHat5"}, | |||
{19099, "PoliceCap2"}, | |||
{19100, "PoliceCap3"}, | |||
{19101, "ArmyHelmet1"}, | |||
{19102, "ArmyHelmet2"}, | |||
{19103, "ArmyHelmet3"}, | |||
{19104, "ArmyHelmet4"}, | |||
{19105, "ArmyHelmet5"}, | |||
{19106, "ArmyHelmet6"}, | |||
{19107, "ArmyHelmet7"}, | |||
{19108, "ArmyHelmet8"}, | |||
{19109, "ArmyHelmet9"}, | |||
{19110, "ArmyHelmet10"}, | |||
{19111, "ArmyHelmet11"}, | |||
{19112, "ArmyHelmet12"}, | |||
{19113, "SillyHelmet1"}, | |||
{19114, "SillyHelmet2"}, | |||
{19115, "SillyHelmet3"}, | |||
{19116, "PlainHelmet1"}, | |||
{19117, "PlainHelmet2"}, | |||
{19118, "PlainHelmet3"}, | |||
{19119, "PlainHelmet4"}, | |||
{19120, "PlainHelmet5"}, | |||
{19137, "CluckinBellHat1"}, | |||
{19138, "PoliceGlasses1"}, | |||
{19139, "PoliceGlasses2"}, | |||
{19140, "PoliceGlasses3"}, | |||
{19141, "SWATHelmet1"}, | |||
{19142, "SWATArmour1"}, | |||
{19160, "HardHat3"}, | |||
{19161, "PoliceHat1"}, | |||
{19162, "PoliceHat2"}, | |||
{19163, "GimpMask1"}, | |||
{19317, "bassguitar01"}, | |||
{19318, "flyingv01"}, | |||
{19319, "warlock01"}, | |||
{19330, "fire_hat01"}, | |||
{19331, "fire_hat02"}, | |||
{19346, "hotdog01"}, | |||
{19347, "badge01"}, | |||
{19348, "cane01"}, | |||
{19349, "monocle01"}, | |||
{19350, "moustache01"}, | |||
{19351, "moustache02"}, | |||
{19352, "tophat01"}, | |||
{19487, "tophat02"}, | |||
{19488, "HatBowler6"}, | |||
{19513, "whitephone"}, | |||
{19578, "Banana"}, | |||
{19418, "HandCuff"} | |||
}; | |||
new AttachmentBones[][24] = { | |||
{"Spine"}, | |||
{"Head"}, | |||
{"Left upper arm"}, | |||
{"Right upper arm"}, | |||
{"Left hand"}, | |||
{"Right hand"}, | |||
{"Left thigh"}, | |||
{"Right thigh"}, | |||
{"Left foot"}, | |||
{"Right foot"}, | |||
{"Right calf"}, | |||
{"Left calf"}, | |||
{"Left forearm"}, | |||
{"Right forearm"}, | |||
{"Left clavicle"}, | |||
{"Right clavicle"}, | |||
{"Neck"}, | |||
{"Jaw"} | |||
}; | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
if(!strcmp(cmdtext, "/attachments", true)) | |||
{ | |||
new string[128]; | |||
for(new x;x<MAX_PLAYER_ATTACHED_OBJECTS;x++) | |||
{ | |||
if(IsPlayerAttachedObjectSlotUsed(playerid, x)) format(string, sizeof(string), "%s%d (Used)\n", string, x); | |||
else format(string, sizeof(string), "%s%d\n", string, x); | |||
} | |||
ShowPlayerDialog(playerid, DIALOG_ATTACH_INDEX_SELECTION, DIALOG_STYLE_LIST, \ | |||
"{FF0000}Attachment Modification - Index Selection", string, "Select", "Cancel"); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
switch(dialogid) | |||
{ | |||
case DIALOG_ATTACH_INDEX_SELECTION: | |||
{ | |||
if(response) | |||
{ | |||
if(IsPlayerAttachedObjectSlotUsed(playerid, listitem)) | |||
{ | |||
ShowPlayerDialog(playerid, DIALOG_ATTACH_EDITREPLACE, DIALOG_STYLE_MSGBOX, \ | |||
"{FF0000}Attachment Modification", "Do you wish to edit the attachment in that slot, or delete it?", "Edit", "Delete"); | |||
} | |||
else | |||
{ | |||
new string[4000+1]; | |||
for(new x;x<sizeof(AttachmentObjects);x++) | |||
{ | |||
format(string, sizeof(string), "%s%s\n", string, AttachmentObjects[x][attachname]); | |||
} | |||
ShowPlayerDialog(playerid, DIALOG_ATTACH_MODEL_SELECTION, DIALOG_STYLE_LIST, \ | |||
"{FF0000}Attachment Modification - Model Selection", string, "Select", "Cancel"); | |||
} | |||
SetPVarInt(playerid, "AttachmentIndexSel", listitem); | |||
} | |||
return 1; | |||
} | |||
case DIALOG_ATTACH_EDITREPLACE: | |||
{ | |||
if(response) EditAttachedObject(playerid, GetPVarInt(playerid, "AttachmentIndexSel")); | |||
else RemovePlayerAttachedObject(playerid, GetPVarInt(playerid, "AttachmentIndexSel")); | |||
DeletePVar(playerid, "AttachmentIndexSel"); | |||
return 1; | |||
} | |||
case DIALOG_ATTACH_MODEL_SELECTION: | |||
{ | |||
if(response) | |||
{ | |||
if(GetPVarInt(playerid, "AttachmentUsed") == 1) EditAttachedObject(playerid, listitem); | |||
else | |||
{ | |||
SetPVarInt(playerid, "AttachmentModelSel", AttachmentObjects[listitem][attachmodel]); | |||
new string[256+1]; | |||
for(new x;x<sizeof(AttachmentBones);x++) | |||
{ | |||
format(string, sizeof(string), "%s%s\n", string, AttachmentBones[x]); | |||
} | |||
ShowPlayerDialog(playerid, DIALOG_ATTACH_BONE_SELECTION, DIALOG_STYLE_LIST, \ | |||
"{FF0000}Attachment Modification - Bone Selection", string, "Select", "Cancel"); | |||
} | |||
} | |||
else DeletePVar(playerid, "AttachmentIndexSel"); | |||
return 1; | |||
} | |||
case DIALOG_ATTACH_BONE_SELECTION: | |||
{ | |||
if(response) | |||
{ | |||
SetPlayerAttachedObject(playerid, GetPVarInt(playerid, "AttachmentIndexSel"), GetPVarInt(playerid, "AttachmentModelSel"), listitem+1); | |||
EditAttachedObject(playerid, GetPVarInt(playerid, "AttachmentIndexSel")); | |||
SendClientMessage(playerid, 0xFFFFFFFF, "Hint: Use {FFFF00}~k~~PED_SPRINT~{FFFFFF} to look around."); | |||
} | |||
DeletePVar(playerid, "AttachmentIndexSel"); | |||
DeletePVar(playerid, "AttachmentModelSel"); | |||
return 1; | |||
} | |||
} | |||
return 0; | |||
} | |||
public OnPlayerEditAttachedObject( playerid, response, index, modelid, boneid, | |||
Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, | |||
Float:fRotX, Float:fRotY, Float:fRotZ, | |||
Float:fScaleX, Float:fScaleY, Float:fScaleZ ) | |||
{ | |||
new debug_string[256+1]; | |||
format(debug_string,256,"SetPlayerAttachedObject(playerid,%d,%d,%d,%f,%f,%f,%f,%f,%f,%f,%f,%f)", | |||
index,modelid,boneid,fOffsetX,fOffsetY,fOffsetZ,fRotX,fRotY,fRotZ,fScaleX,fScaleY,fScaleZ); | |||
print(debug_string); | |||
SendClientMessage(playerid, 0xFFFFFFFF, debug_string); | |||
SetPlayerAttachedObject(playerid,index,modelid,boneid,fOffsetX,fOffsetY,fOffsetZ,fRotX,fRotY,fRotZ,fScaleX,fScaleY,fScaleZ); | |||
SendClientMessage(playerid, 0xFFFFFFFF, "You finished editing an attached object"); | |||
return 1; | |||
} |
@ -0,0 +1,151 @@ | |||
// | |||
// Base FS | |||
// Contains /pm /kick /ban commands. | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define ADMINFS_MESSAGE_COLOR 0xFF444499 | |||
#define PM_INCOMING_COLOR 0xFFFF22AA | |||
#define PM_OUTGOING_COLOR 0xFFCC2299 | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Base FS loaded.\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256]; | |||
new tmp[256]; | |||
new Message[256]; | |||
new gMessage[256]; | |||
new pName[MAX_PLAYER_NAME+1]; | |||
new iName[MAX_PLAYER_NAME+1]; | |||
new idx; | |||
cmd = strtok(cmdtext, idx); | |||
// PM Command | |||
if(strcmp("/pm", cmd, true) == 0) | |||
{ | |||
tmp = strtok(cmdtext,idx); | |||
if(!strlen(tmp) || strlen(tmp) > 5) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); | |||
return 1; | |||
} | |||
new id = strval(tmp); | |||
gMessage = strrest(cmdtext,idx); | |||
if(!strlen(gMessage)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); | |||
return 1; | |||
} | |||
if(!IsPlayerConnected(id)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/pm : Bad player ID"); | |||
return 1; | |||
} | |||
if(playerid != id) { | |||
GetPlayerName(id,iName,sizeof(iName)); | |||
GetPlayerName(playerid,pName,sizeof(pName)); | |||
format(Message,sizeof(Message),">> %s(%d): %s",iName,id,gMessage); | |||
SendClientMessage(playerid,PM_OUTGOING_COLOR,Message); | |||
format(Message,sizeof(Message),"** %s(%d): %s",pName,playerid,gMessage); | |||
SendClientMessage(id,PM_INCOMING_COLOR,Message); | |||
PlayerPlaySound(id,1085,0.0,0.0,0.0); | |||
printf("PM: %s",Message); | |||
} | |||
else { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"You cannot PM yourself"); | |||
} | |||
return 1; | |||
} | |||
//Kick Command | |||
if(strcmp("/kick", cmd, true) == 0) | |||
{ | |||
if(IsPlayerAdmin(playerid)) { | |||
tmp = strtok(cmdtext,idx); | |||
if(!strlen(tmp) || strlen(tmp) > 5) { | |||
return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /kick (id) [reason]"); | |||
} | |||
new id = strval(tmp); | |||
if(!IsPlayerConnected(id)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : Bad player ID"); | |||
return 1; | |||
} | |||
gMessage = strrest(cmdtext,idx); | |||
GetPlayerName(id,iName,sizeof(iName)); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been kicked from the server."); | |||
if(strlen(gMessage) > 0) { | |||
format(Message,sizeof(Message),"Reason: %s",gMessage); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); | |||
} | |||
format(Message,sizeof(Message),">> %s(%d) has been kicked.",iName,id); | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); | |||
Kick(id); | |||
return 1; | |||
} else { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : You are not an admin"); | |||
return 1; | |||
} | |||
} | |||
//Ban Command | |||
if(strcmp("/ban", cmd, true) == 0) | |||
{ | |||
if(IsPlayerAdmin(playerid)) { | |||
tmp = strtok(cmdtext,idx); | |||
if(!strlen(tmp) || strlen(tmp) > 5) { | |||
return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /ban (id) [reason]"); | |||
} | |||
new id = strval(tmp); | |||
if(!IsPlayerConnected(id)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : Bad player ID"); | |||
return 1; | |||
} | |||
gMessage = strrest(cmdtext,idx); | |||
GetPlayerName(id,iName,sizeof(iName)); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been banned from the server."); | |||
if(strlen(gMessage) > 0) { | |||
format(Message,sizeof(Message),"Reason: %s",gMessage); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); | |||
} | |||
format(Message,sizeof(Message),">> %s(%d) has been banned.",iName,id); | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); | |||
Ban(id); | |||
return 1; | |||
} else { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : You are not an admin"); | |||
return 1; | |||
} | |||
} | |||
return 0; | |||
} |
@ -0,0 +1,234 @@ | |||
// | |||
// Base FS for Sanandreas Multiplayer 0.3 | |||
// Contains /pm /kick /ban commands - it also features | |||
// a basic anti flood system, and admin chatting for rcon admins | |||
// using # <message> | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define ADMINFS_MESSAGE_COLOR 0xFF444499 | |||
#define PM_INCOMING_COLOR 0xFFFF22AA | |||
#define PM_OUTGOING_COLOR 0xFFCC2299 | |||
static iPlayerChatTime[MAX_PLAYERS]; | |||
static szPlayerChatMsg[MAX_PLAYERS][128]; | |||
//------------------------------------------------ | |||
stock IsPlayerFlooding(playerid) | |||
{ | |||
if(GetTickCount() - iPlayerChatTime[playerid] < 2000) | |||
return 1; | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Base FS loaded.\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerText(playerid, text[]) | |||
{ | |||
// Is the player flooding? | |||
if(IsPlayerFlooding(playerid) && !IsPlayerAdmin(playerid)) | |||
{ | |||
SendClientMessage(playerid, 0xFF0000FF, "* You can only send a message once every two seconds."); | |||
return 0; | |||
} | |||
// Now we handle the admin chat, will be #<message>. | |||
if( (text[0] == '#' || text[0] == '@') && strlen(text) > 1) | |||
{ | |||
new str[128]; | |||
new szPlayerName[MAX_PLAYER_NAME]; | |||
GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME); | |||
if(IsPlayerAdmin(playerid)) | |||
{ | |||
format(str, 128, "Admin %s: %s", szPlayerName, text[1]); | |||
for(new iPlayerID; iPlayerID < MAX_PLAYERS; iPlayerID++) | |||
{ | |||
if(!IsPlayerConnected(iPlayerID)) continue; | |||
if(!IsPlayerAdmin(iPlayerID)) continue; | |||
SendClientMessage(iPlayerID, PM_INCOMING_COLOR, str); | |||
} | |||
} | |||
return 0; | |||
} | |||
// Okay, now it's time for anti repeating. | |||
if(!IsPlayerAdmin(playerid)) | |||
{ | |||
if(strlen(text) == strlen(szPlayerChatMsg[playerid]) && !strcmp(szPlayerChatMsg[playerid], text, false)) | |||
{ | |||
SendClientMessage(playerid, 0xFF0000FF, "* Please do not repeat yourself."); | |||
format(szPlayerChatMsg[playerid], 128, "%s", text); | |||
return 0; | |||
} | |||
} | |||
format(szPlayerChatMsg[playerid], 128, "%s", text); | |||
iPlayerChatTime[playerid] = GetTickCount(); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerDisconnect(playerid, reason) | |||
{ | |||
#pragma unused reason | |||
iPlayerChatTime[playerid] = 0; | |||
szPlayerChatMsg[playerid] = ""; | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
if(IsPlayerFlooding(playerid) && !IsPlayerAdmin(playerid)) | |||
{ | |||
SendClientMessage(playerid, 0xFF0000FF, "* You can only use commands once every two seconds."); | |||
return 1; | |||
} | |||
iPlayerChatTime[playerid] = GetTickCount(); | |||
new cmd[256]; | |||
new tmp[256]; | |||
new Message[256]; | |||
new gMessage[256]; | |||
new pName[MAX_PLAYER_NAME+1]; | |||
new iName[MAX_PLAYER_NAME+1]; | |||
new idx; | |||
cmd = strtok(cmdtext, idx); | |||
// PM Command | |||
if(strcmp("/pm", cmd, true) == 0) | |||
{ | |||
tmp = strtok(cmdtext,idx); | |||
if(!strlen(tmp) || strlen(tmp) > 5) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); | |||
return 1; | |||
} | |||
new id = strval(tmp); | |||
gMessage = strrest(cmdtext,idx); | |||
if(!strlen(gMessage)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); | |||
return 1; | |||
} | |||
if(!IsPlayerConnected(id)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/pm : Bad player ID"); | |||
} | |||
if(playerid != id) { | |||
GetPlayerName(id,iName,sizeof(iName)); | |||
GetPlayerName(playerid,pName,sizeof(pName)); | |||
format(Message,sizeof(Message),">> %s(%d): %s",iName,id,gMessage); | |||
SendClientMessage(playerid,PM_OUTGOING_COLOR,Message); | |||
format(Message,sizeof(Message),"** %s(%d): %s",pName,playerid,gMessage); | |||
SendClientMessage(id,PM_INCOMING_COLOR,Message); | |||
PlayerPlaySound(id,1085,0.0,0.0,0.0); | |||
printf("PM: %s",Message); | |||
} | |||
else { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"You cannot PM yourself"); | |||
} | |||
return 1; | |||
} | |||
//Kick Command | |||
if(strcmp("/kick", cmd, true) == 0) | |||
{ | |||
if(IsPlayerAdmin(playerid)) { | |||
tmp = strtok(cmdtext,idx); | |||
if(!strlen(tmp) || strlen(tmp) > 5) { | |||
return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /kick (id) [reason]"); | |||
} | |||
new id = strval(tmp); | |||
if(!IsPlayerConnected(id)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : Bad player ID"); | |||
return 1; | |||
} | |||
gMessage = strrest(cmdtext,idx); | |||
GetPlayerName(id,iName,sizeof(iName)); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been kicked from the server."); | |||
if(strlen(gMessage) > 0) { | |||
format(Message,sizeof(Message),"Reason: %s",gMessage); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); | |||
} | |||
format(Message,sizeof(Message),">> %s(%d) has been kicked.",iName,id); | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); | |||
Kick(id); | |||
return 1; | |||
} else { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : You are not an admin"); | |||
return 1; | |||
} | |||
} | |||
//Ban Command | |||
if(strcmp("/ban", cmd, true) == 0) | |||
{ | |||
if(IsPlayerAdmin(playerid)) { | |||
tmp = strtok(cmdtext,idx); | |||
if(!strlen(tmp) || strlen(tmp) > 5) { | |||
return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /ban (id) [reason]"); | |||
} | |||
new id = strval(tmp); | |||
if(!IsPlayerConnected(id)) { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : Bad player ID"); | |||
return 1; | |||
} | |||
gMessage = strrest(cmdtext,idx); | |||
GetPlayerName(id,iName,sizeof(iName)); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been banned from the server."); | |||
if(strlen(gMessage) > 0) { | |||
format(Message,sizeof(Message),"Reason: %s",gMessage); | |||
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); | |||
} | |||
format(Message,sizeof(Message),">> %s(%d) has been banned.",iName,id); | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); | |||
Ban(id); | |||
return 1; | |||
} else { | |||
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : You are not an admin"); | |||
return 1; | |||
} | |||
} | |||
return 0; | |||
} | |||
//----------------------------------------------- |
@ -0,0 +1,216 @@ | |||
// | |||
// Used for testing interpolated rotations with MoveObject | |||
// Also used to test AttachObjectToObject | |||
// A cargo ship goes around and visits some route points | |||
// | |||
// SA-MP 0.3d and above | |||
// | |||
// - Kye 2011 | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" // for PlaySoundForPlayersInRange() | |||
#define NUM_SHIP_ROUTE_POINTS 25 | |||
#define SHIP_HULL_ID 9585 // massive cargo ship's hull. This is used as the main object | |||
#define SHIP_MOVE_SPEED 10.0 | |||
#define SHIP_DRAW_DISTANCE 300.0 | |||
#define NUM_SHIP_ATTACHMENTS 10 | |||
new Float:gShipHullOrigin[3] = | |||
{ -2409.8438, 1544.9453, 7.0000 }; // so we can convert world space to model space for attachment positions | |||
new gShipAttachmentModelIds[NUM_SHIP_ATTACHMENTS] = { | |||
9586, // Ship main platform | |||
9761, // Ship rails | |||
9584, // Bridge exterior | |||
9698, // Bridge interior | |||
9821, // Bridge interior doors | |||
9818, // Bridge radio desk | |||
9819, // Captain's desk | |||
9822, // Captain's seat | |||
9820, // Bridge ducts and lights | |||
9590 // Cargo bay area | |||
}; | |||
new Float:gShipAttachmentPos[NUM_SHIP_ATTACHMENTS][3] = { | |||
// these are world space positions used on the original cargo ship in the game | |||
// they will be converted to model space before attaching | |||
{-2412.1250, 1544.9453, 17.0469}, | |||
{-2411.3906, 1544.9453, 27.0781}, | |||
{-2485.0781, 1544.9453, 26.1953}, | |||
{-2473.5859, 1543.7734, 29.0781}, | |||
{-2474.3594, 1547.2422, 24.7500}, | |||
{-2470.2656, 1544.9609, 33.8672}, | |||
{-2470.4531, 1551.1172, 33.1406}, | |||
{-2470.9375, 1550.7500, 32.9063}, | |||
{-2474.6250, 1545.0859, 33.0625}, | |||
{-2403.5078, 1544.9453, 8.7188} | |||
}; | |||
// Pirate ship route points (position/rotation) | |||
new Float:gShipRoutePoints[NUM_SHIP_ROUTE_POINTS][6] = { | |||
{-1982.57, 2052.56, 0.00, 0.00, 0.00, 144.84}, | |||
{-2178.63, 2103.67, 0.00, 0.00, 0.00, 189.24}, | |||
{-2366.64, 2020.28, 0.00, 0.00, 0.00, 215.22}, | |||
{-2539.06, 1892.52, 0.00, 0.00, 0.00, 215.22}, | |||
{-2722.79, 1787.85, 0.00, 0.00, 0.00, 205.62}, | |||
{-2918.51, 1729.60, 0.00, 0.00, 0.00, 190.50}, | |||
{-3124.70, 1758.03, 0.00, 0.00, 0.00, 156.36}, | |||
{-3316.51, 1850.08, 0.00, 0.00, 0.00, 153.36}, | |||
{-3541.12, 1977.99, 0.00, 0.00, 0.00, 145.74}, | |||
{-3772.54, 2140.70, 0.00, 0.00, 0.00, 144.96}, | |||
{-4078.78, 2272.93, 0.00, 0.00, 0.00, 167.52}, | |||
{-4382.22, 2222.52, 0.00, 0.36, 0.06, 206.70}, | |||
{-4578.11, 2013.70, 0.00, 0.36, 0.54, 244.80}, | |||
{-4603.54, 1718.89, 0.00, 1.92, -0.36, 283.26}, | |||
{-4463.49, 1504.50, 0.00, 0.92, -0.36, 316.32}, | |||
{-4228.00, 1380.52, 0.00, 0.92, -0.36, 342.54}, | |||
{-3950.14, 1346.96, 0.00, 0.02, -0.06, 359.64}, | |||
{-3646.69, 1344.57, 0.00, 0.02, -0.06, 359.64}, | |||
{-3350.01, 1410.39, 0.00, 0.02, -0.06, 384.48}, | |||
{-2854.63, 1651.56, 0.00, 0.02, -0.06, 378.54}, | |||
{-2590.84, 1667.61, 0.00, 0.02, -0.06, 356.28}, | |||
{-2345.84, 1633.19, 0.00, 0.02, -0.06, 350.28}, | |||
{-2106.14, 1639.23, 0.00, 0.02, -0.06, 378.36}, | |||
{-1943.63, 1743.98, 0.00, 0.02, -0.06, 411.42}, | |||
{-1891.39, 1907.57, 0.00, 0.02, -0.06, 457.14} | |||
}; | |||
new gShipCurrentPoint = 1; // current route point the ship is at. We start at route 1 | |||
// SA-MP objects | |||
new gMainShipObjectId; | |||
new gShipsAttachments[NUM_SHIP_ROUTE_POINTS]; | |||
forward StartMovingTimer(); | |||
//------------------------------------------------- | |||
public StartMovingTimer() | |||
{ | |||
MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2], | |||
SHIP_MOVE_SPEED / 2.0, // slower for the first route | |||
gShipRoutePoints[gShipCurrentPoint][3], | |||
gShipRoutePoints[gShipCurrentPoint][4], | |||
gShipRoutePoints[gShipCurrentPoint][5]); | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
gMainShipObjectId = CreateObject(SHIP_HULL_ID, gShipRoutePoints[0][0], gShipRoutePoints[0][1], gShipRoutePoints[0][2], | |||
gShipRoutePoints[0][3], gShipRoutePoints[0][4], gShipRoutePoints[0][5], SHIP_DRAW_DISTANCE); | |||
new x=0; | |||
while(x != NUM_SHIP_ATTACHMENTS) { | |||
gShipsAttachments[x] = CreateObject(gShipAttachmentModelIds[x], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); | |||
AttachObjectToObject(gShipsAttachments[x], gMainShipObjectId, | |||
gShipAttachmentPos[x][0] - gShipHullOrigin[0], | |||
gShipAttachmentPos[x][1] - gShipHullOrigin[1], | |||
gShipAttachmentPos[x][2] - gShipHullOrigin[2], | |||
0.0, 0.0, 0.0); | |||
x++; | |||
} | |||
SetTimer("StartMovingTimer",30*1000,0); // pause at route 0 for 30 seconds | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptExit() | |||
{ | |||
DestroyObject(gMainShipObjectId); | |||
new x=0; | |||
while(x != NUM_SHIP_ATTACHMENTS) { | |||
DestroyObject(gShipsAttachments[x]); | |||
x++; | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnObjectMoved(objectid) | |||
{ | |||
if(objectid != gMainShipObjectId) return 0; | |||
if(gShipCurrentPoint > 0 && !(gShipCurrentPoint % 5)) { | |||
// play some seagulls audio every 5 points | |||
PlaySoundForPlayersInRange(6200, 200.0, gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2]); | |||
} | |||
gShipCurrentPoint++; | |||
if(gShipCurrentPoint == NUM_SHIP_ROUTE_POINTS) { | |||
gShipCurrentPoint = 0; | |||
MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2], | |||
SHIP_MOVE_SPEED / 2.0, // slower for the last route | |||
gShipRoutePoints[gShipCurrentPoint][3], | |||
gShipRoutePoints[gShipCurrentPoint][4], | |||
gShipRoutePoints[gShipCurrentPoint][5]); | |||
return 1; | |||
} | |||
if(gShipCurrentPoint == 1) { | |||
// Before heading to the first route we should wait a bit | |||
SetTimer("StartMovingTimer",30*1000,0); // pause at route 0 for 30 seconds | |||
return 1; | |||
} | |||
/* | |||
new tempdebug[256+1]; | |||
format(tempdebug,256,"The ship is at route: %d", gShipCurrentPoint); | |||
SendClientMessageToAll(0xFFFFFFFF,tempdebug);*/ | |||
MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2], | |||
SHIP_MOVE_SPEED, | |||
gShipRoutePoints[gShipCurrentPoint][3], | |||
gShipRoutePoints[gShipCurrentPoint][4], | |||
gShipRoutePoints[gShipCurrentPoint][5]); | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256]; | |||
new idx; | |||
cmd = strtok(cmdtext, idx); | |||
if(strcmp(cmd, "/boardship", true) == 0) { | |||
if(gShipCurrentPoint != 1) { | |||
SendClientMessage(playerid, 0xFFFF0000, "The ship can't be boarded right now"); | |||
return 1; | |||
} | |||
SetPlayerPos(playerid,-1937.7816,2017.7969,16.6640); | |||
return 1; | |||
} | |||
if(strcmp(cmd, "/stopship", true) == 0) { | |||
StopObject(gMainShipObjectId); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------- | |||
@ -0,0 +1,161 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the Dillimore Gas Station Objects | |||
// ---------------------------------------------------------- | |||
// By Matite in March 2015 | |||
// | |||
// | |||
// This script creates the edited Dillimore Gas Station Building objects and | |||
// removes the existing GTASA building objects. | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 2 objects = 1 for the replacement building exterior object and 1 for the | |||
// the replacement building interior object | |||
// * Enables the /dgs command to teleport the player to the Dillimore Gas Station | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Used for messages sent to the player | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// ----------------------------------------------------------------------------- | |||
// Variables | |||
// --------- | |||
// Stores the created object numbers of the replacement building objects so | |||
// they can be destroyed when the filterscript is unloaded | |||
new DillimoreGasObject1; // Building exterior object | |||
new DillimoreGasObject2; // Building interior object | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/dgs", cmdtext, true, 4) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, 658.37, -573.90, 16.8); | |||
SetPlayerFacingAngle(playerid, 280); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Dillimore Gas Station!", 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(" |--- Dillimore Gas Station Filterscript"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 3rd March 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create the Dillimore Gas Station exterior object | |||
DillimoreGasObject1 = CreateObject(19876, 666.711, -565.133, 17.3359, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Dillimore Gas Station exterior object created"); | |||
// Create the Dillimore Gas Station interior object | |||
DillimoreGasObject2 = CreateObject(19877, 666.492, -571.18, 17.3125, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Dillimore Gas Station interior object 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 Dillimore Gas Station Building exterior, interior | |||
// 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, 12853, 666.711, -565.133, 17.3359, 250.0); // Building exterior | |||
RemoveBuildingForPlayer(i, 12854, 666.492, -571.18, 17.3125, 250.0); // Building interior | |||
RemoveBuildingForPlayer(i, 13245, 666.711, -565.133, 17.3359, 250.0); // LOD | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(DillimoreGasObject1)) | |||
{ | |||
// Destroy the Dillimore Gas Station exterior object | |||
DestroyObject(DillimoreGasObject1); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Dillimore Gas Station exterior object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(DillimoreGasObject2)) | |||
{ | |||
// Destroy the Dillimore Gas Station interior object | |||
DestroyObject(DillimoreGasObject2); | |||
// Display information in the Server Console | |||
print(" |-- Dillimore Gas Station interior object destroyed"); | |||
} | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Dillimore Gas Station Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA Dillimore Gas Station Building exterior, interior | |||
// and LOD map objects for the player | |||
RemoveBuildingForPlayer(playerid, 12853, 666.711, -565.133, 17.3359, 250.0); // Building exterior | |||
RemoveBuildingForPlayer(playerid, 12854, 666.492, -571.18, 17.3125, 250.0); // Building interior | |||
RemoveBuildingForPlayer(playerid, 13245, 666.711, -565.133, 17.3359, 250.0); // LOD | |||
// Exit here (return 1 so this callback is handled in other scripts too) | |||
return 1; | |||
} | |||
@ -0,0 +1,135 @@ | |||
// | |||
// Used for testing interpolated rotations with MoveObject | |||
// Also used to test AttachObjectToObject | |||
// The other ferris wheel (that actually spins!) | |||
// Located on the opposite peer at LS | |||
// | |||
// SA-MP 0.3d and above | |||
// | |||
// - Kye 2011 | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" // for PlaySoundForPlayersInRange() | |||
#define NUM_FERRIS_CAGES 10 | |||
#define FERRIS_WHEEL_ID 18877 | |||
#define FERRIS_CAGE_ID 18879 | |||
#define FERRIS_BASE_ID 18878 | |||
#define FERRIS_DRAW_DISTANCE 300.0 | |||
#define FERRIS_WHEEL_SPEED 0.01 | |||
#define FERRIS_WHEEL_Z_ANGLE -90.0 // This is the heading the entire ferris wheel is at (beware of gimbal lock) | |||
new Float:gFerrisOrigin[3] = {832.8393, -2046.1990, 27.0900}; | |||
// Cage offsets for attaching to the main wheel | |||
new Float:gFerrisCageOffsets[NUM_FERRIS_CAGES][3] = { | |||
{0.0699, 0.0600, -11.7500}, | |||
{-6.9100, -0.0899, -9.5000}, | |||
{11.1600, 0.0000, -3.6300}, | |||
{-11.1600, -0.0399, 3.6499}, | |||
{-6.9100, -0.0899, 9.4799}, | |||
{0.0699, 0.0600, 11.7500}, | |||
{6.9599, 0.0100, -9.5000}, | |||
{-11.1600, -0.0399, -3.6300}, | |||
{11.1600, 0.0000, 3.6499}, | |||
{7.0399, -0.0200, 9.3600} | |||
}; | |||
// SA-MP objects | |||
new gFerrisWheel; | |||
new gFerrisBase; | |||
new gFerrisCages[NUM_FERRIS_CAGES]; | |||
forward RotateWheel(); | |||
//------------------------------------------------- | |||
new Float:gCurrentTargetYAngle = 0.0; // Angle of the Y axis of the wheel to rotate to. | |||
new gWheelTransAlternate = 0; // Since MoveObject requires some translation target to intepolate | |||
// rotation, the world pos target is alternated by a small amount. | |||
UpdateWheelTarget() | |||
{ | |||
gCurrentTargetYAngle += 36.0; // There are 10 carts, so 360 / 10 | |||
if(gCurrentTargetYAngle >= 360.0) { | |||
gCurrentTargetYAngle = 0.0; | |||
} | |||
if(gWheelTransAlternate) gWheelTransAlternate = 0; | |||
else gWheelTransAlternate = 1; | |||
} | |||
//------------------------------------------------- | |||
public RotateWheel() | |||
{ | |||
UpdateWheelTarget(); | |||
new Float:fModifyWheelZPos = 0.0; | |||
if(gWheelTransAlternate) fModifyWheelZPos = 0.05; | |||
MoveObject( gFerrisWheel, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2]+fModifyWheelZPos, | |||
FERRIS_WHEEL_SPEED, 0.0, gCurrentTargetYAngle, FERRIS_WHEEL_Z_ANGLE ); | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
gFerrisWheel = CreateObject( FERRIS_WHEEL_ID, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2], | |||
0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, FERRIS_DRAW_DISTANCE ); | |||
gFerrisBase = CreateObject( FERRIS_BASE_ID, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2], | |||
0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, FERRIS_DRAW_DISTANCE ); | |||
new x=0; | |||
while(x != NUM_FERRIS_CAGES) { | |||
gFerrisCages[x] = CreateObject( FERRIS_CAGE_ID, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2], | |||
0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, FERRIS_DRAW_DISTANCE ); | |||
AttachObjectToObject( gFerrisCages[x], gFerrisWheel, | |||
gFerrisCageOffsets[x][0], | |||
gFerrisCageOffsets[x][1], | |||
gFerrisCageOffsets[x][2], | |||
0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, 0 ); | |||
x++; | |||
} | |||
SetTimer("RotateWheel",3*1000,0); | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptExit() | |||
{ | |||
new x=0; | |||
DestroyObject(gFerrisWheel); | |||
DestroyObject(gFerrisBase); | |||
x=0; | |||
while(x != NUM_FERRIS_CAGES) { | |||
DestroyObject(gFerrisCages[x]); | |||
x++; | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnObjectMoved(objectid) | |||
{ | |||
if(objectid != gFerrisWheel) return 0; | |||
SetTimer("RotateWheel",3*1000,0); | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
@ -0,0 +1,265 @@ | |||
//------------------------------------------------- | |||
// | |||
// This is an example of using the AttachCameraToObject function | |||
// to create a no-clip flying camera. | |||
// | |||
// h02 2012 | |||
// | |||
// SA-MP 0.3e and above | |||
// | |||
//------------------------------------------------- | |||
#include <a_samp> | |||
// Players Move Speed | |||
#define MOVE_SPEED 100.0 | |||
#define ACCEL_RATE 0.03 | |||
// Players Mode | |||
#define CAMERA_MODE_NONE 0 | |||
#define CAMERA_MODE_FLY 1 | |||
// Key state definitions | |||
#define MOVE_FORWARD 1 | |||
#define MOVE_BACK 2 | |||
#define MOVE_LEFT 3 | |||
#define MOVE_RIGHT 4 | |||
#define MOVE_FORWARD_LEFT 5 | |||
#define MOVE_FORWARD_RIGHT 6 | |||
#define MOVE_BACK_LEFT 7 | |||
#define MOVE_BACK_RIGHT 8 | |||
// Enumeration for storing data about the player | |||
enum noclipenum | |||
{ | |||
cameramode, | |||
flyobject, | |||
mode, | |||
lrold, | |||
udold, | |||
lastmove, | |||
Float:accelmul | |||
} | |||
new noclipdata[MAX_PLAYERS][noclipenum]; | |||
//-------------------------------------------------- | |||
public OnFilterScriptExit() | |||
{ | |||
// If any players are still in edit mode, boot them out before the filterscript unloads | |||
for(new x; x<MAX_PLAYERS; x++) | |||
{ | |||
if(noclipdata[x][cameramode] == CAMERA_MODE_FLY) CancelFlyMode(x); | |||
} | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Reset the data belonging to this player slot | |||
noclipdata[playerid][cameramode] = CAMERA_MODE_NONE; | |||
noclipdata[playerid][lrold] = 0; | |||
noclipdata[playerid][udold] = 0; | |||
noclipdata[playerid][mode] = 0; | |||
noclipdata[playerid][lastmove] = 0; | |||
noclipdata[playerid][accelmul] = 0.0; | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
if(!strcmp(cmdtext, "/flymode", true)) | |||
{ | |||
// Place the player in and out of edit mode | |||
if(GetPVarType(playerid, "FlyMode")) CancelFlyMode(playerid); | |||
else FlyMode(playerid); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//-------------------------------------------------- | |||
public OnPlayerUpdate(playerid) | |||
{ | |||
if(noclipdata[playerid][cameramode] == CAMERA_MODE_FLY) | |||
{ | |||
new keys,ud,lr; | |||
GetPlayerKeys(playerid,keys,ud,lr); | |||
if(noclipdata[playerid][mode] && (GetTickCount() - noclipdata[playerid][lastmove] > 100)) | |||
{ | |||
// If the last move was > 100ms ago, process moving the object the players camera is attached to | |||
MoveCamera(playerid); | |||
} | |||
// Is the players current key state different than their last keystate? | |||
if(noclipdata[playerid][udold] != ud || noclipdata[playerid][lrold] != lr) | |||
{ | |||
if((noclipdata[playerid][udold] != 0 || noclipdata[playerid][lrold] != 0) && ud == 0 && lr == 0) | |||
{ // All keys have been released, stop the object the camera is attached to and reset the acceleration multiplier | |||
StopPlayerObject(playerid, noclipdata[playerid][flyobject]); | |||
noclipdata[playerid][mode] = 0; | |||
noclipdata[playerid][accelmul] = 0.0; | |||
} | |||
else | |||
{ // Indicates a new key has been pressed | |||
// Get the direction the player wants to move as indicated by the keys | |||
noclipdata[playerid][mode] = GetMoveDirectionFromKeys(ud, lr); | |||
// Process moving the object the players camera is attached to | |||
MoveCamera(playerid); | |||
} | |||
} | |||
noclipdata[playerid][udold] = ud; noclipdata[playerid][lrold] = lr; // Store current keys pressed for comparison next update | |||
return 0; | |||
} | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
stock GetMoveDirectionFromKeys(ud, lr) | |||
{ | |||
new direction = 0; | |||
if(lr < 0) | |||
{ | |||
if(ud < 0) direction = MOVE_FORWARD_LEFT; // Up & Left key pressed | |||
else if(ud > 0) direction = MOVE_BACK_LEFT; // Back & Left key pressed | |||
else direction = MOVE_LEFT; // Left key pressed | |||
} | |||
else if(lr > 0) // Right pressed | |||
{ | |||
if(ud < 0) direction = MOVE_FORWARD_RIGHT; // Up & Right key pressed | |||
else if(ud > 0) direction = MOVE_BACK_RIGHT; // Back & Right key pressed | |||
else direction = MOVE_RIGHT; // Right key pressed | |||
} | |||
else if(ud < 0) direction = MOVE_FORWARD; // Up key pressed | |||
else if(ud > 0) direction = MOVE_BACK; // Down key pressed | |||
return direction; | |||
} | |||
//-------------------------------------------------- | |||
stock MoveCamera(playerid) | |||
{ | |||
new Float:FV[3], Float:CP[3]; | |||
GetPlayerCameraPos(playerid, CP[0], CP[1], CP[2]); // Cameras position in space | |||
GetPlayerCameraFrontVector(playerid, FV[0], FV[1], FV[2]); // Where the camera is looking at | |||
// Increases the acceleration multiplier the longer the key is held | |||
if(noclipdata[playerid][accelmul] <= 1) noclipdata[playerid][accelmul] += ACCEL_RATE; | |||
// Determine the speed to move the camera based on the acceleration multiplier | |||
new Float:speed = MOVE_SPEED * noclipdata[playerid][accelmul]; | |||
// Calculate the cameras next position based on their current position and the direction their camera is facing | |||
new Float:X, Float:Y, Float:Z; | |||
GetNextCameraPosition(noclipdata[playerid][mode], CP, FV, X, Y, Z); | |||
MovePlayerObject(playerid, noclipdata[playerid][flyobject], X, Y, Z, speed); | |||
// Store the last time the camera was moved as now | |||
noclipdata[playerid][lastmove] = GetTickCount(); | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
stock GetNextCameraPosition(move_mode, Float:CP[3], Float:FV[3], &Float:X, &Float:Y, &Float:Z) | |||
{ | |||
// Calculate the cameras next position based on their current position and the direction their camera is facing | |||
#define OFFSET_X (FV[0]*6000.0) | |||
#define OFFSET_Y (FV[1]*6000.0) | |||
#define OFFSET_Z (FV[2]*6000.0) | |||
switch(move_mode) | |||
{ | |||
case MOVE_FORWARD: | |||
{ | |||
X = CP[0]+OFFSET_X; | |||
Y = CP[1]+OFFSET_Y; | |||
Z = CP[2]+OFFSET_Z; | |||
} | |||
case MOVE_BACK: | |||
{ | |||
X = CP[0]-OFFSET_X; | |||
Y = CP[1]-OFFSET_Y; | |||
Z = CP[2]-OFFSET_Z; | |||
} | |||
case MOVE_LEFT: | |||
{ | |||
X = CP[0]-OFFSET_Y; | |||
Y = CP[1]+OFFSET_X; | |||
Z = CP[2]; | |||
} | |||
case MOVE_RIGHT: | |||
{ | |||
X = CP[0]+OFFSET_Y; | |||
Y = CP[1]-OFFSET_X; | |||
Z = CP[2]; | |||
} | |||
case MOVE_BACK_LEFT: | |||
{ | |||
X = CP[0]+(-OFFSET_X - OFFSET_Y); | |||
Y = CP[1]+(-OFFSET_Y + OFFSET_X); | |||
Z = CP[2]-OFFSET_Z; | |||
} | |||
case MOVE_BACK_RIGHT: | |||
{ | |||
X = CP[0]+(-OFFSET_X + OFFSET_Y); | |||
Y = CP[1]+(-OFFSET_Y - OFFSET_X); | |||
Z = CP[2]-OFFSET_Z; | |||
} | |||
case MOVE_FORWARD_LEFT: | |||
{ | |||
X = CP[0]+(OFFSET_X - OFFSET_Y); | |||
Y = CP[1]+(OFFSET_Y + OFFSET_X); | |||
Z = CP[2]+OFFSET_Z; | |||
} | |||
case MOVE_FORWARD_RIGHT: | |||
{ | |||
X = CP[0]+(OFFSET_X + OFFSET_Y); | |||
Y = CP[1]+(OFFSET_Y - OFFSET_X); | |||
Z = CP[2]+OFFSET_Z; | |||
} | |||
} | |||
} | |||
//-------------------------------------------------- | |||
stock CancelFlyMode(playerid) | |||
{ | |||
DeletePVar(playerid, "FlyMode"); | |||
CancelEdit(playerid); | |||
TogglePlayerSpectating(playerid, false); | |||
DestroyPlayerObject(playerid, noclipdata[playerid][flyobject]); | |||
noclipdata[playerid][cameramode] = CAMERA_MODE_NONE; | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
stock FlyMode(playerid) | |||
{ | |||
// Create an invisible object for the players camera to be attached to | |||
new Float:X, Float:Y, Float:Z; | |||
GetPlayerPos(playerid, X, Y, Z); | |||
noclipdata[playerid][flyobject] = CreatePlayerObject(playerid, 19300, X, Y, Z, 0.0, 0.0, 0.0); | |||
// Place the player in spectating mode so objects will be streamed based on camera location | |||
TogglePlayerSpectating(playerid, true); | |||
// Attach the players camera to the created object | |||
AttachCameraToPlayerObject(playerid, noclipdata[playerid][flyobject]); | |||
SetPVarInt(playerid, "FlyMode", 1); | |||
noclipdata[playerid][cameramode] = CAMERA_MODE_FLY; | |||
return 1; | |||
} | |||
//-------------------------------------------------- |
@ -0,0 +1,371 @@ | |||
//------------------------------------------------- | |||
// | |||
// Generic Special Actions And Anims | |||
// kyeman 2007 | |||
// | |||
//------------------------------------------------- | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
#pragma tabsize 0 | |||
#include "../include/gl_common.inc" | |||
new gPlayerUsingLoopingAnim[MAX_PLAYERS]; | |||
new gPlayerAnimLibsPreloaded[MAX_PLAYERS]; | |||
new Text:txtAnimHelper; | |||
//------------------------------------------------- | |||
OnePlayAnim(playerid,animlib[],animname[], Float:Speed, looping, lockx, locky, lockz, lp) | |||
{ | |||
ApplyAnimation(playerid, animlib, animname, Speed, looping, lockx, locky, lockz, lp); | |||
} | |||
//------------------------------------------------- | |||
LoopingAnim(playerid,animlib[],animname[], Float:Speed, looping, lockx, locky, lockz, lp) | |||
{ | |||
gPlayerUsingLoopingAnim[playerid] = 1; | |||
ApplyAnimation(playerid, animlib, animname, Speed, looping, lockx, locky, lockz, lp); | |||
TextDrawShowForPlayer(playerid,txtAnimHelper); | |||
} | |||
//------------------------------------------------- | |||
StopLoopingAnim(playerid) | |||
{ | |||
gPlayerUsingLoopingAnim[playerid] = 0; | |||
ApplyAnimation(playerid, "CARRY", "crry_prtial", 4.0, 0, 0, 0, 0, 0); | |||
} | |||
//------------------------------------------------- | |||
PreloadAnimLib(playerid, animlib[]) | |||
{ | |||
ApplyAnimation(playerid,animlib,"null",0.0,0,0,0,0,0); | |||
} | |||
//------------------------------------------------- | |||
// ********** CALLBACKS ********** | |||
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) | |||
{ | |||
if(!gPlayerUsingLoopingAnim[playerid]) return; | |||
if(IsKeyJustDown(KEY_SPRINT,newkeys,oldkeys)) { | |||
StopLoopingAnim(playerid); | |||
TextDrawHideForPlayer(playerid,txtAnimHelper); | |||
} | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerDeath(playerid, killerid, reason) | |||
{ | |||
// if they die whilst performing a looping anim, we should reset the state | |||
if(gPlayerUsingLoopingAnim[playerid]) { | |||
gPlayerUsingLoopingAnim[playerid] = 0; | |||
TextDrawHideForPlayer(playerid,txtAnimHelper); | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerSpawn(playerid) | |||
{ | |||
if(!gPlayerAnimLibsPreloaded[playerid]) { | |||
PreloadAnimLib(playerid,"BOMBER"); | |||
PreloadAnimLib(playerid,"RAPPING"); | |||
PreloadAnimLib(playerid,"SHOP"); | |||
PreloadAnimLib(playerid,"BEACH"); | |||
PreloadAnimLib(playerid,"SMOKING"); | |||
PreloadAnimLib(playerid,"FOOD"); | |||
PreloadAnimLib(playerid,"ON_LOOKERS"); | |||
PreloadAnimLib(playerid,"DEALER"); | |||
PreloadAnimLib(playerid,"CRACK"); | |||
PreloadAnimLib(playerid,"CARRY"); | |||
PreloadAnimLib(playerid,"COP_AMBIENT"); | |||
PreloadAnimLib(playerid,"PARK"); | |||
PreloadAnimLib(playerid,"INT_HOUSE"); | |||
PreloadAnimLib(playerid,"FOOD"); | |||
gPlayerAnimLibsPreloaded[playerid] = 1; | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerConnect(playerid) | |||
{ | |||
gPlayerUsingLoopingAnim[playerid] = 0; | |||
gPlayerAnimLibsPreloaded[playerid] = 0; | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
// Init our text display | |||
txtAnimHelper = TextDrawCreate(610.0, 400.0, | |||
"~r~~k~~PED_SPRINT~ ~w~to stop the animation"); | |||
TextDrawUseBox(txtAnimHelper, 0); | |||
TextDrawFont(txtAnimHelper, 2); | |||
TextDrawSetShadow(txtAnimHelper,0); // no shadow | |||
TextDrawSetOutline(txtAnimHelper,1); // thickness 1 | |||
TextDrawBackgroundColor(txtAnimHelper,0x000000FF); | |||
TextDrawColor(txtAnimHelper,0xFFFFFFFF); | |||
TextDrawAlignment(txtAnimHelper,3); // align right | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256]; | |||
new idx; | |||
new dancestyle; | |||
cmd = strtok(cmdtext, idx); | |||
if(strcmp(cmd,"/animlist",true)==0) | |||
{ | |||
SendClientMessage(playerid,0xAFAFAFAA,"Available Animations:"); | |||
SendClientMessage(playerid,0xAFAFAFAA,"/handsup /drunk /bomb /getarrested /laugh /lookout /robman"); | |||
SendClientMessage(playerid,0xAFAFAFAA,"/crossarms /lay /hide /vomit /eat /wave /taichi"); | |||
SendClientMessage(playerid,0xAFAFAFAA,"/deal /crack /smokem /smokef /groundsit /chat /dance /f**ku"); | |||
} | |||
if(strcmp(cmd, "/amcuffed", true) == 0) { | |||
// note: the cuffs have not been scaled for all player models | |||
SetPlayerAttachedObject(playerid,8,19418,6,-0.031999,0.024000,-0.024000,-7.900000,-32.000011,-72.299987,1.115998,1.322000,1.406000); | |||
SetPlayerSpecialAction(playerid, SPECIAL_ACTION_CUFFED); | |||
return 1; | |||
} | |||
if(strcmp(cmd, "/uncuffme", true) == 0) { | |||
if(IsPlayerAttachedObjectSlotUsed(playerid, 8)) { | |||
RemovePlayerAttachedObject(playerid, 8); | |||
} | |||
SetPlayerSpecialAction(playerid, SPECIAL_ACTION_NONE); | |||
return 1; | |||
} | |||
// We don't handle anything else after this that can be used in vehicles | |||
if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT) { | |||
return 0; | |||
} | |||
// HANDSUP | |||
if(strcmp(cmd, "/handsup", true) == 0) { | |||
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_HANDSUP); | |||
return 1; | |||
} | |||
// CELLPHONE IN | |||
if(strcmp(cmd, "/cellin", true) == 0) { | |||
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_USECELLPHONE); | |||
return 1; | |||
} | |||
// CELLPHONE OUT | |||
if(strcmp(cmd, "/cellout", true) == 0) { | |||
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_STOPUSECELLPHONE); | |||
return 1; | |||
} | |||
// Drunk | |||
if(strcmp(cmd, "/drunk", true) == 0) { | |||
LoopingAnim(playerid,"PED","WALK_DRUNK",4.0,1,1,1,1,0); | |||
return 1; | |||
} | |||
// Place a Bomb | |||
if (strcmp("/bomb", cmdtext, true) == 0) { | |||
ClearAnimations(playerid); | |||
OnePlayAnim(playerid, "BOMBER", "BOM_Plant", 4.0, 0, 0, 0, 0, 0); // Place Bomb | |||
return 1; | |||
} | |||
// Police Arrest | |||
if (strcmp("/getarrested", cmdtext, true, 7) == 0) { | |||
LoopingAnim(playerid,"ped", "ARRESTgun", 4.0, 0, 1, 1, 1, -1); // Gun Arrest | |||
return 1; | |||
} | |||
// Laugh | |||
if (strcmp("/laugh", cmdtext, true) == 0) { | |||
OnePlayAnim(playerid, "RAPPING", "Laugh_01", 4.0, 0, 0, 0, 0, 0); // Laugh | |||
return 1; | |||
} | |||
// Rob Lookout | |||
if (strcmp("/lookout", cmdtext, true) == 0) { | |||
OnePlayAnim(playerid, "SHOP", "ROB_Shifty", 4.0, 0, 0, 0, 0, 0); // Rob Lookout | |||
return 1; | |||
} | |||
// Rob Threat | |||
if (strcmp("/robman", cmdtext, true) == 0) { | |||
LoopingAnim(playerid, "SHOP", "ROB_Loop_Threat", 4.0, 1, 0, 0, 0, 0); // Rob | |||
return 1; | |||
} | |||
// Arms crossed | |||
if (strcmp("/crossarms", cmdtext, true) == 0) { | |||
LoopingAnim(playerid, "COP_AMBIENT", "Coplook_loop", 4.0, 0, 1, 1, 1, -1); // Arms crossed | |||
return 1; | |||
} | |||
// Lay Down | |||
if (strcmp("/lay", cmdtext, true, 6) == 0) { | |||
LoopingAnim(playerid,"BEACH", "bather", 4.0, 1, 0, 0, 0, 0); // Lay down | |||
return 1; | |||
} | |||
// Take Cover | |||
if (strcmp("/hide", cmdtext, true, 3) == 0) { | |||
LoopingAnim(playerid, "ped", "cower", 3.0, 1, 0, 0, 0, 0); // Taking Cover | |||
return 1; | |||
} | |||
// Vomit | |||
if (strcmp("/vomit", cmdtext, true) == 0) { | |||
OnePlayAnim(playerid, "FOOD", "EAT_Vomit_P", 3.0, 0, 0, 0, 0, 0); // Vomit BAH! | |||
return 1; | |||
} | |||
// Eat Burger | |||
if (strcmp("/eat", cmdtext, true) == 0) { | |||
OnePlayAnim(playerid, "FOOD", "EAT_Burger", 3.0, 0, 0, 0, 0, 0); // Eat Burger | |||
return 1; | |||
} | |||
// Wave | |||
if (strcmp("/wave", cmdtext, true) == 0) { | |||
LoopingAnim(playerid, "ON_LOOKERS", "wave_loop", 4.0, 1, 0, 0, 0, 0); // Wave | |||
return 1; | |||
} | |||
// Slap Ass | |||
if (strcmp("/slapass", cmdtext, true) == 0) { | |||
OnePlayAnim(playerid, "SWEET", "sweet_ass_slap", 4.0, 0, 0, 0, 0, 0); // Ass Slapping | |||
return 1; | |||
} | |||
// Dealer | |||
if (strcmp("/deal", cmdtext, true) == 0) { | |||
OnePlayAnim(playerid, "DEALER", "DEALER_DEAL", 4.0, 0, 0, 0, 0, 0); // Deal Drugs | |||
return 1; | |||
} | |||
// Crack Dieing | |||
if (strcmp("/crack", cmdtext, true, 6) == 0) { | |||
LoopingAnim(playerid, "CRACK", "crckdeth2", 4.0, 1, 0, 0, 0, 0); // Dieing of Crack | |||
return 1; | |||
} | |||
// Male Smoking | |||
if (strcmp("/smokem", cmdtext, true, 4) == 0) { | |||
LoopingAnim(playerid,"SMOKING", "M_smklean_loop", 4.0, 1, 0, 0, 0, 0); // Smoke | |||
return 1; | |||
} | |||
// Female Smoking | |||
if (strcmp("/smokef", cmdtext, true) == 0) { | |||
LoopingAnim(playerid, "SMOKING", "F_smklean_loop", 4.0, 1, 0, 0, 0, 0); // Female Smoking | |||
return 1; | |||
} | |||
// Sit | |||
if (strcmp("/groundsit", cmdtext, true, 4) == 0) { | |||
LoopingAnim(playerid,"BEACH", "ParkSit_M_loop", 4.0, 1, 0, 0, 0, 0); // Sit | |||
return 1; | |||
} | |||
// Idle Chat | |||
if(strcmp(cmd, "/chat", true) == 0) { | |||
OnePlayAnim(playerid,"PED","IDLE_CHAT",4.0,0,0,0,0,0); | |||
return 1; | |||
} | |||
// Fucku | |||
if(strcmp(cmd, "/fucku", true) == 0) { | |||
OnePlayAnim(playerid,"PED","fucku",4.0,0,0,0,0,0); | |||
return 1; | |||
} | |||
// TaiChi | |||
if(strcmp(cmd, "/taichi", true) == 0) { | |||
LoopingAnim(playerid,"PARK","Tai_Chi_Loop",4.0,1,0,0,0,0); | |||
return 1; | |||
} | |||
// ChairSit | |||
if(strcmp(cmd, "/chairsit", true) == 0) { | |||
LoopingAnim(playerid,"BAR","dnk_stndF_loop",4.0,1,0,0,0,0); | |||
return 1; | |||
} | |||
// Collapse | |||
if(strcmp(cmd, "/collapse", true) == 0) { | |||
LoopingAnim(playerid,"PED","FALL_COLLAPSE",4.0,1,0,0,0,0); | |||
return 1; | |||
} | |||
// fall | |||
if(strcmp(cmd, "/fallover", true) == 0) { | |||
LoopingAnim(playerid,"PED","FALL_FALL",4.0,1,0,0,0,0); | |||
return 1; | |||
} | |||
// ko | |||
if(strcmp(cmd, "/ko1", true) == 0) { | |||
LoopingAnim(playerid,"PED","KO_SHOT_STOM",200.0, 0, 1, 1, 1, -1); | |||
return 1; | |||
} | |||
// ko | |||
if(strcmp(cmd, "/ko2", true) == 0) { | |||
LoopingAnim(playerid,"PED","KO_SHOT_FACE",4.0, 0, 1, 1, 1, -1); | |||
return 1; | |||
} | |||
if(strcmp(cmd, "/floorhit", true) == 0) { | |||
ApplyAnimation(playerid,"PED", "FLOOR_hit_f", 4.1, 0, 0, 0, 1, 0); | |||
return 1; | |||
} | |||
/* Would allow people to troll... but would be cool as a script | |||
controlled function | |||
// Bed Sleep R | |||
if(strcmp(cmd, "/inbedright", true) == 0) { | |||
LoopingAnim(playerid,"INT_HOUSE","BED_Loop_R",4.0,1,0,0,0,0); | |||
return 1; | |||
} | |||
// Bed Sleep L | |||
if(strcmp(cmd, "/inbedleft", true) == 0) { | |||
LoopingAnim(playerid,"INT_HOUSE","BED_Loop_L",4.0,1,0,0,0,0); | |||
return 1; | |||
}*/ | |||
// START DANCING | |||
if(strcmp(cmd, "/dance", true) == 0) { | |||
new tmp[256]; | |||
// Get the dance style param | |||
tmp = strtok(cmdtext, idx); | |||
if(!strlen(tmp) || strlen(tmp) > 2) { | |||
SendClientMessage(playerid,0xFF0000FF,"USAGE: /dance [style 1-4]"); | |||
return 1; | |||
} | |||
dancestyle = strval(tmp); | |||
if(dancestyle < 1 || dancestyle > 4) { | |||
SendClientMessage(playerid,0xFF0000FF,"USAGE: /dance [style 1-4]"); | |||
return 1; | |||
} | |||
if(dancestyle == 1) { | |||
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1); | |||
} else if(dancestyle == 2) { | |||
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2); | |||
} else if(dancestyle == 3) { | |||
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3); | |||
} else if(dancestyle == 4) { | |||
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE4); | |||
} | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------- | |||
// EOF |
@ -0,0 +1,293 @@ | |||
// | |||
// | |||
// SA-MP Roleplay style chat module for Grand Larceny | |||
// (c) 2012 SA-MP Team | |||
// All rights reserved | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#include "../include/gl_messages.inc" // <- contains all the main text/messaging functions | |||
//--------------------------------------------- | |||
stock ProcessChatText(playerid, text[]) | |||
{ | |||
new useindex=1; | |||
// Handle shouting prefix (!) | |||
if(text[0] == '!' && strlen(text) > 1) { | |||
if(text[1] == ' ') useindex++; | |||
TalkMessage(SHOUT_DISTANCE, playerid, "*shouts*", text[useindex]); | |||
return; | |||
} | |||
// Handle quiet prefix (#) | |||
if(text[0] == '#' && strlen(text) > 1) { | |||
if(text[1] == ' ') useindex++; | |||
TalkMessage(LOW_DISTANCE, playerid, "*quietly*", text[useindex]); | |||
return; | |||
} | |||
// Send to other players in range and fade | |||
TalkMessage(TALK_DISTANCE, playerid, "", text); | |||
} | |||
//--------------------------------------------- | |||
stock ProcessActionText(playerid, message[], actiontype) | |||
{ | |||
new ActionText[256+1]; | |||
new ActionBubble[MAX_CHATBUBBLE_LENGTH+1]; | |||
new PlayerName[MAX_PLAYER_NAME+1]; | |||
GetPlayerName(playerid, PlayerName, sizeof(PlayerName)); | |||
if(actiontype == ACTION_DO) { | |||
format(ActionText, 256, "* %s ((%s))", message, PlayerName); | |||
format(ActionBubble, MAX_CHATBUBBLE_LENGTH, "* (( %s ))", message); | |||
} else { | |||
format(ActionText, 256, "* %s %s", PlayerName, message); | |||
format(ActionBubble, MAX_CHATBUBBLE_LENGTH, "* %s", message); | |||
} | |||
LocalMessage(ACTION_DISTANCE, playerid, ACTION_COLOR, ActionText); | |||
SetPlayerChatBubble(playerid, ActionBubble, ACTION_COLOR, ACTION_DISTANCE, CHAT_BUBBLE_TIME); | |||
} | |||
//--------------------------------------------- | |||
new gOOCDisabled = false; | |||
stock GlobalOOCMessage(playerid, message[]) | |||
{ | |||
new msg[256+1]; | |||
new PlayerName[MAX_PLAYER_NAME+1]; | |||
if(gOOCDisabled) { | |||
CmdErrorMessage(playerid, "The OOC channel is not enabled right now"); | |||
return; | |||
} | |||
GetPlayerName(playerid, PlayerName, sizeof(PlayerName)); | |||
format(msg, 256, "(( %s: %s ))", PlayerName, message); | |||
for(new i = 0; i < MAX_PLAYERS; i++) { // for every player | |||
if(IsPlayerConnected(i)) { // Todo: check if player accepts occ | |||
PlayerMessage(i, OOC_COLOR, msg); | |||
} | |||
} | |||
} | |||
//--------------------------------------------- | |||
stock ToggleOOC(playerid) | |||
{ | |||
if(IsPlayerAdmin(playerid)) { | |||
// toggle it | |||
if(gOOCDisabled) gOOCDisabled = false; | |||
else gOOCDisabled = true; | |||
if(!gOOCDisabled) { | |||
GlobalMessage(GENERAL_COLOR, "{D0D0D0}[ooc] channel is {80CC80}enabled"); | |||
} else { | |||
GlobalMessage(GENERAL_COLOR, "{D0D0D0}[ooc] channel is {CC8080}disabled"); | |||
} | |||
} else { | |||
CmdErrorMessage(playerid, "Your admin level isn't high enough to change this"); | |||
} | |||
} | |||
//--------------------------------------------- | |||
stock ProcessLocalOOC(playerid, message[]) | |||
{ | |||
new new_message[256+1]; | |||
new PlayerName[MAX_PLAYER_NAME+1]; | |||
GetPlayerName(playerid, PlayerName, sizeof(PlayerName)); | |||
format(new_message, 256, "%s (( %s ))", PlayerName, message); | |||
LocalMessage(TALK_DISTANCE, playerid, LOCAL_TALK_COLOR, new_message); | |||
} | |||
//--------------------------------------------- | |||
stock ProcessMegaphone(playerid, message[]) | |||
{ | |||
// Todo: add permissions on megaphone usage | |||
new new_message[256+1]; | |||
new PlayerName[MAX_PLAYER_NAME+1]; | |||
GetPlayerName(playerid, PlayerName, sizeof(PlayerName)); | |||
format(new_message, 256, "(megaphone) %s >> %s", PlayerName, message); | |||
LocalMessage(MEGAPHONE_DISTANCE, playerid, MEGAPHONE_COLOR, new_message, 1); | |||
} | |||
//--------------------------------------------- | |||
stock ProcessWhisper(playerid, toplayerid, message[]) | |||
{ | |||
new PlayerName[MAX_PLAYER_NAME+1]; | |||
new ToPlayerName[MAX_PLAYER_NAME+1]; | |||
new PmMessage[256+1]; | |||
GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); | |||
GetPlayerName(toplayerid,ToPlayerName,sizeof(ToPlayerName)); | |||
format(PmMessage, sizeof(PmMessage), ">> %s(%d): %s", ToPlayerName, toplayerid, message); | |||
PlayerMessage(playerid, WHISPER_COLOR, PmMessage); | |||
format(PmMessage, sizeof(PmMessage), "** %s(%d): %s", PlayerName, playerid, message); | |||
PlayerMessage(toplayerid, WHISPER_COLOR, PmMessage); | |||
PlayerPlaySound(toplayerid, 1085, 0.0, 0.0, 0.0); | |||
} | |||
//--------------------------------------------- | |||
stock ProcessChatCommands(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new message[256+1]; | |||
new tmp[256+1]; | |||
new idx; | |||
cmd = strtok(cmdtext, idx); | |||
// Action commands | |||
if(!strcmp("/me", cmd, true)) | |||
{ | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "/me [action]"); | |||
return 1; | |||
} | |||
ProcessActionText(playerid, message, ACTION_ME); | |||
return 1; | |||
} | |||
if(!strcmp("/do", cmd, true)) | |||
{ | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "/do [action]"); | |||
return 1; | |||
} | |||
ProcessActionText(playerid, message, ACTION_DO); | |||
return 1; | |||
} | |||
// Talk commands | |||
// /low | |||
if(!strcmp("/l", cmd, true) || !strcmp("/low", cmd, true)) | |||
{ | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "(/l)ow [text]"); | |||
return 1; | |||
} | |||
TalkMessage(LOW_DISTANCE, playerid, "*quietly*", message); | |||
return 1; | |||
} | |||
// /shout | |||
if(!strcmp("/s", cmd, true) || !strcmp("/shout", cmd, true)) | |||
{ | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "(/s)hout [text]"); | |||
return 1; | |||
} | |||
TalkMessage(SHOUT_DISTANCE, playerid, "*shouts*", message); | |||
return 1; | |||
} | |||
// /b (local ooc) | |||
if(!strcmp("/b", cmd, true)) | |||
{ | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "/b [text]"); | |||
return 1; | |||
} | |||
ProcessLocalOOC(playerid, message); | |||
return 1; | |||
} | |||
// /megaphone | |||
if(!strcmp("/m", cmd, true) || !strcmp("/megaphone", cmd, true)) | |||
{ | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "(/m)egaphone [text]"); | |||
return 1; | |||
} | |||
ProcessMegaphone(playerid, message); | |||
return 1; | |||
} | |||
// Global OOC /o and /ooc | |||
if(!strcmp("/o", cmd, true) || !strcmp("/ooc", cmd, true)) | |||
{ | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "(/o)oc [text]"); | |||
return 1; | |||
} | |||
GlobalOOCMessage(playerid, message); | |||
return 1; | |||
} | |||
// Toggle the OOC channel /togooc | |||
if(!strcmp("/togooc", cmd, true)) | |||
{ | |||
ToggleOOC(playerid); | |||
return 1; | |||
} | |||
// /whisper /pm | |||
if(!strcmp("/w", cmd, true) || !strcmp("/wisper", cmd, true) || !strcmp("/pm", cmd, true)) | |||
{ | |||
tmp = strtok(cmdtext,idx); | |||
if(!strlen(tmp)) { | |||
CmdUsageMessage(playerid, "(/w)isper [playerid/PartOfName] [whisper text]"); | |||
return 1; | |||
} | |||
new toplayerid = ReturnUser(tmp); | |||
if(toplayerid == RETURN_USER_MULTIPLE) { | |||
CmdErrorMessage(playerid, "Multiple matches found for [name]. Please narrow the search."); | |||
return 1; | |||
} | |||
if(toplayerid == RETURN_USER_FAILURE || !IsPlayerConnected(toplayerid)) { | |||
CmdErrorMessage(playerid, "That player isn't connected right now."); | |||
return 1; | |||
} | |||
message = strrest(cmdtext,idx); | |||
if(!strlen(message)) { | |||
CmdUsageMessage(playerid, "(/w)isper [playerid/PartOfName] [whisper text]"); | |||
return 1; | |||
} | |||
if(IsPlayerConnected(toplayerid)) { | |||
ProcessWhisper(playerid, toplayerid, message); | |||
} | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//--------------------------------------------- | |||
public OnPlayerText(playerid, text[]) | |||
{ | |||
ProcessChatText(playerid, text); | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
if(ProcessChatCommands(playerid,cmdtext)) { | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//--------------------------------------------- | |||
@ -0,0 +1,63 @@ | |||
// | |||
// Example use of chat above player's head | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define MESSAGE_COLOR 0xEEEEEEFF | |||
#define ECHO_COLOR 0xEEEEEEFF | |||
#define ACTION_COLOR 0xEE66EEFF | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Speech bubble example loaded.\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerText(playerid, text[]) | |||
{ | |||
if(strlen(text) > 128) return 0; | |||
new to_others[MAX_CHATBUBBLE_LENGTH+1]; | |||
new to_me[MAX_CHATBUBBLE_LENGTH+1]; | |||
format(to_others,MAX_CHATBUBBLE_LENGTH,"Says: %s",text); | |||
format(to_me,MAX_CHATBUBBLE_LENGTH,">> %s",text); | |||
SetPlayerChatBubble(playerid,to_others,MESSAGE_COLOR,35.0,10000); | |||
SendClientMessage(playerid,ECHO_COLOR,to_me); | |||
return 0; // can't do normal chat with this loaded | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256]; | |||
new Message[256]; | |||
new idx; | |||
new actiontext[MAX_CHATBUBBLE_LENGTH+1]; | |||
cmd = strtok(cmdtext, idx); | |||
// Action command | |||
if(strcmp("/me", cmd, true) == 0) | |||
{ | |||
Message = strrest(cmdtext,idx); | |||
format(actiontext,MAX_CHATBUBBLE_LENGTH,"* %s",Message); | |||
SetPlayerChatBubble(playerid,actiontext,ACTION_COLOR,30.0,10000); | |||
SendClientMessage(playerid,ACTION_COLOR,actiontext); | |||
return 1; | |||
} | |||
return 0; // not handled by this script | |||
} | |||
//------------------------------------------------ | |||
@ -0,0 +1,70 @@ | |||
//------------------------------------------------- | |||
// | |||
// These are the default map icons from San Andreas | |||
// Cluckin Bell, Ammu, Burgershot etc | |||
// | |||
// Kye 2010 | |||
// | |||
//------------------------------------------------- | |||
#pragma tabsize 0 | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
public OnPlayerConnect(playerid) | |||
{ | |||
SetPlayerMapIcon(playerid,49,822.6,-1590.3,13.5,7,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,50,-2570.1,245.4,10.3,7,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,51,2726.6,-2026.4,17.5,7,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,52,2080.3,2119.0,10.8,7,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,53,675.7,-496.6,16.8,7,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,54,-1805.7,943.2,24.8,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,55,2750.9,2470.9,11.0,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,56,2351.8,2529.0,10.8,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,57,2635.5,1847.4,11.0,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,58,2083.4,2221.0,11.0,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,59,-1719.1,1359.4,8.6,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,60,2330.2,75.2,31.0,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,61,203.2,-200.4,6.5,29,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,62,812.9,-1616.1,13.6,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,63,1199.1,-924.0,43.3,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,64,2362.2,2069.9,10.8,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,65,2469.5,2033.8,10.8,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,66,2172.9,2795.7,10.8,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,67,1875.3,2072.0,10.8,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,68,1161.5,2072.0,10.8,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,69,-2356.0,1009.0,49.0,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,70,-1913.3,826.2,36.9,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,71,-2335.6,-165.6,39.5,10,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,72,2397.8,-1895.6,13.7,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,73,2421.6,-1509.6,24.1,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,74,-2671.6,257.4,4.6,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,75,2392.4,2046.5,10.8,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,76,2844.5,2401.1,11.0,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,77,2635.5,1674.3,11.0,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,78,2105.7,2228.7,11.0,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,79,-2154.0,-2461.2,30.8,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,80,-1816.2,620.8,37.5,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,81,-1216.0,1831.4,45.3,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,82,172.73,1176.76,13.7,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,83,932.0,-1353.0,14.0,14,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,84,1971.7,-2036.6,13.5,39,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,85,2071.6,-1779.9,13.5,39,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,86,2094.6,2119.0,10.8,39,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,87,-2490.5,-40.1,39.3,39,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,88,1372.9,-1278.8,12.5,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,89,2400.5,-1978.4,13.5,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,90,-2626.6,209.4,4.9,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,91,2535.9,2083.5,10.8,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,92,2156.5,943.2,10.8,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,93,779.7,1874.3,4.9,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,94,-2092.7,-2463.8,30.6,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,95,240.0,-178.2,2.0,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,96,-1509.4,2611.8,58.5,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,97,-315.67,829.87,13.43,6,0,MAPICON_LOCAL); | |||
SetPlayerMapIcon(playerid,98,2332.9,63.6,31.0,6,0,MAPICON_LOCAL); | |||
return 1; | |||
} |
@ -0,0 +1,161 @@ | |||
//------------------------------------------------- | |||
// | |||
// NPC initialisation for Grand Larceny | |||
// | |||
//------------------------------------------------- | |||
#pragma tabsize 0 | |||
#include <a_samp> | |||
//------------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
ConnectNPC("TrainDriverLV","train_lv"); | |||
ConnectNPC("TrainDriverLS","train_ls"); | |||
ConnectNPC("TrainDriverSF","train_sf"); | |||
ConnectNPC("PilotLV","at400_lv"); | |||
ConnectNPC("PilotSF","at400_sf"); | |||
ConnectNPC("PilotLS","at400_ls"); | |||
// Testing | |||
//ConnectNPC("OnfootTest","onfoot_test"); | |||
//ConnectNPC("DriverTest","mat_test2"); | |||
//ConnectNPC("DriverTest2","driver_test2"); | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
// IMPORTANT: This restricts NPCs connecting from | |||
// an IP address outside this server. If you need | |||
// to connect NPCs externally you will need to modify | |||
// the code in this callback. | |||
public OnPlayerConnect(playerid) | |||
{ | |||
if(IsPlayerNPC(playerid)) { | |||
new ip_addr_npc[64+1]; | |||
new ip_addr_server[64+1]; | |||
GetServerVarAsString("bind",ip_addr_server,64); | |||
GetPlayerIp(playerid,ip_addr_npc,64); | |||
if(!strlen(ip_addr_server)) { | |||
ip_addr_server = "127.0.0.1"; | |||
} | |||
if(strcmp(ip_addr_npc,ip_addr_server,true) != 0) { | |||
// this bot is remote connecting | |||
printf("NPC: Got a remote NPC connecting from %s and I'm kicking it.",ip_addr_npc); | |||
Kick(playerid); | |||
return 0; | |||
} | |||
printf("NPC: Connection from %s is allowed.",ip_addr_npc); | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerRequestClass(playerid, classid) | |||
{ | |||
if(!IsPlayerNPC(playerid)) return 0; // We only deal with NPC players in this script | |||
new playername[64]; | |||
GetPlayerName(playerid,playername,64); | |||
if(!strcmp(playername,"TrainDriverLV",true)) { | |||
SetSpawnInfo(playerid,69,255,1462.0745,2630.8787,10.8203,0.0,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"TrainDriverSF",true)) { | |||
SetSpawnInfo(playerid,69,255,-1942.7950,168.4164,27.0006,0.0,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"TrainDriverLS",true)) { | |||
SetSpawnInfo(playerid,69,255,1700.7551,-1953.6531,14.8756,0.0,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"PilotLV",true)) { | |||
SetSpawnInfo(playerid,69,61,0.0,0.0,0.0,0.0,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"PilotSF",true)) { | |||
SetSpawnInfo(playerid,69,61,0.0,0.0,0.0,0.0,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"PilotLS",true)) { | |||
SetSpawnInfo(playerid,69,61,0.0,0.0,0.0,0.0,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"OnfootTest",true)) { | |||
SetSpawnInfo(playerid,69,61,2388.1003,-1279.8933,25.1291,94.3321,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"DriverTest",true)) { | |||
SetSpawnInfo(playerid,69,61,2388.1003,-1279.8933,25.1291,94.3321,-1,-1,-1,-1,-1,-1); | |||
} | |||
else if(!strcmp(playername,"DriverTest2",true)) { | |||
SetSpawnInfo(playerid,69,61,2388.1003,-1279.8933,25.1291,94.3321,-1,-1,-1,-1,-1,-1); | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------- | |||
stock SetVehicleTireStatus(vehicleid, tirestatus) | |||
{ | |||
new panels, doors, lights, tires; | |||
GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires); | |||
UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, tirestatus); | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerSpawn(playerid) | |||
{ | |||
if(!IsPlayerNPC(playerid)) return 1; // We only deal with NPC players in this script | |||
new playername[64]; | |||
GetPlayerName(playerid,playername,64); | |||
if(!strcmp(playername,"TrainDriverLV",true)) { | |||
PutPlayerInVehicle(playerid,1,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"TrainDriverSF",true)) { | |||
PutPlayerInVehicle(playerid,5,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"TrainDriverLS",true)) { | |||
PutPlayerInVehicle(playerid,9,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"PilotLV",true)) { | |||
PutPlayerInVehicle(playerid,13,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"PilotSF",true)) { | |||
PutPlayerInVehicle(playerid,14,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"PilotLS",true)) { | |||
PutPlayerInVehicle(playerid,15,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"OnfootTest",true)) { | |||
//PutPlayerInVehicle(playerid,876,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"DriverTest",true)) { | |||
PutPlayerInVehicle(playerid,376,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
else if(!strcmp(playername,"DriverTest2",true)) { | |||
//SetVehicleTireStatus(876,0xFF); | |||
PutPlayerInVehicle(playerid,875,0); | |||
SetPlayerColor(playerid,0xFFFFFFFF); | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
// EOF | |||
@ -0,0 +1,835 @@ | |||
//------------------------------------------------------- | |||
// | |||
// GRAND LARCENY Property creation and management script | |||
// | |||
// by damospiderman 2008 | |||
// | |||
//------------------------------------------------------- | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define FILTERSCRIPT | |||
//#define USE_SQLITE | |||
#define PROP_VW (10000) | |||
#define MAX_INTERIORS (146) | |||
#define MAX_PROPERTIES (1000) | |||
#define PROPERTY_FOLDER "properties" // Location of properties file | |||
#define PROPERTY_UNIQID_FILE "properties/uniqId.txt" // Location of Uniq Interior Info | |||
#define DB_PROPERTIES "properties/dbProperties.db" // Location of the properties Database | |||
#define MAX_TYPES (5) | |||
#define TYPE_EMPTY (0) | |||
#define TYPE_HOUSE (1) | |||
#define TYPE_BUSINESS (2) | |||
#define TYPE_BANK (3) | |||
#define TYPE_COP (4) | |||
enum // Property Type Enum | |||
E_P_TYPES { | |||
tIcon, | |||
tName[32] | |||
} | |||
enum // Uniq Interiors Enum | |||
E_INTERIORS { | |||
inIntID, | |||
Float:inExitX, | |||
Float:inExitY, | |||
Float:inExitZ, | |||
Float:inExitA, | |||
inName[64] | |||
}; | |||
enum // Properties Enum | |||
E_PROPERTIES { | |||
eInterior, | |||
eType, | |||
Float:eEntX, | |||
Float:eEntY, | |||
Float:eEntZ, | |||
Float:eEntA, | |||
eUniqIntId, | |||
eOwner, | |||
ePrice, | |||
ePname[64] | |||
}; | |||
// [ uniq property id ] | |||
new unid; | |||
// [ Array of all the property interior info ] | |||
new interiorInfo[MAX_INTERIORS][E_INTERIORS]; | |||
// [ Pickup array with property id assigned via array slot ( pickupid ) ] | |||
new propPickups[MAX_PROPERTIES] = {-1}; | |||
// [ Handles for 3D text displayed at property entrances ] | |||
new Text3D:propTextInfo[MAX_PROPERTIES]; | |||
// [ Mass array of all the properties and info about them ] | |||
new properties[MAX_PROPERTIES][E_PROPERTIES]; | |||
// [ The last pickup the player went through so they can do /enter command ] | |||
new lastPickup[MAX_PLAYERS] = {-1}; | |||
// [ Current property Unique Interior the player is in.. defaults to -1 when not in any property ] | |||
new currentInt[MAX_PLAYERS] = {-1}; | |||
// [ Player Position array to store the last place the player was before /view command so they can be teleported back ] | |||
new Float:plPos[MAX_PLAYERS][3]; | |||
// [ Players actual interior id used for /view /return command ] | |||
new plInt[MAX_PLAYERS]; | |||
// [ Array of property type iconid's and strings for property type ] | |||
new propIcons[MAX_TYPES][E_P_TYPES] = { | |||
{ 0, "" }, // TYPE_EMPTY ( not used ) | |||
{ 1273, "House" }, // TYPE_HOUSE green house icon | |||
{ 1272, "Business" }, // TYPE_BUSINESS blue house icon | |||
{ 1274, "Bank" }, // TYPE_BANK dollar sign icon | |||
{ 1247, "Police Station" } // TYPE_COP Bribe Star 1247 | |||
}; | |||
new propFile[MAX_TYPES][64] = { | |||
{ "blank" }, | |||
{ "properties/houses.txt" }, | |||
{ "properties/businesses.txt" }, | |||
{ "properties/banks.txt" }, | |||
{ "properties/police.txt" } | |||
}; | |||
// Keep track of what properties we've sent an /enter notification for | |||
new gLastPropertyEnterNotification[MAX_PLAYERS]; | |||
/******************************** | |||
* Interior Info Functions * | |||
********************************/ | |||
stock Float:GetInteriorExit( id, &Float:x, &Float:y, &Float:z ){ | |||
if( id > MAX_INTERIORS ) return 0.0; | |||
else { | |||
x = interiorInfo[id][inExitX]; | |||
y = interiorInfo[id][inExitY]; | |||
z = interiorInfo[id][inExitZ]; | |||
return interiorInfo[id][inExitA]; | |||
} | |||
} | |||
// Gets interior exit info from uniq Interior Id. Returns InteriorId or -1 if interior doesn't exist | |||
stock GetInteriorExitInfo( uniqIntId, &Float:exitX, &Float:exitY, &Float:exitZ, &Float:exitA ){ | |||
if( uniqIntId < MAX_INTERIORS ){ | |||
exitX = interiorInfo[uniqIntId][inExitX]; | |||
exitY = interiorInfo[uniqIntId][inExitY]; | |||
exitZ = interiorInfo[uniqIntId][inExitZ]; | |||
exitA = interiorInfo[uniqIntId][inExitA]; | |||
return interiorInfo[uniqIntId][inIntID]; | |||
} | |||
return -1; | |||
} | |||
stock GetInteriorIntID( id ){ // Gets the interior id of a uniq Interior Id :S | |||
if( id > MAX_INTERIORS ) return -1; | |||
else return interiorInfo[id][inIntID]; | |||
} | |||
stock GetInteriorName( id ) | |||
{ | |||
new tmp[64]; | |||
if( id > MAX_PROPERTIES ) return tmp; | |||
else { | |||
format( tmp, 64, "%s", interiorInfo[id][inName] ); | |||
return tmp; | |||
} | |||
} | |||
/******************************************************** | |||
********************************************************/ | |||
/******************************** | |||
* Property Functions * | |||
********************************/ | |||
stock Float:GetPropertyEntrance( id, &Float:x, &Float:y, &Float:z ){ | |||
if( id > MAX_PROPERTIES ) return 0.0; | |||
x = properties[id][eEntX]; | |||
y = properties[id][eEntY]; | |||
z = properties[id][eEntZ]; | |||
return properties[id][eEntA]; | |||
} | |||
stock Float:GetPropertyExit( id, &Float:x, &Float:y, &Float:z ){ | |||
if( id > MAX_PROPERTIES ) return 0.0; | |||
return GetInteriorExit( properties[id][eUniqIntId], x, y, z ); | |||
} | |||
stock GetPropertyInteriorFileId( id ){ | |||
if( id > MAX_PROPERTIES ) return 0; | |||
else return properties[id][eUniqIntId]; | |||
} | |||
stock GetPropertyInteriorId( id ){ | |||
if( id > MAX_PROPERTIES ) return 0; | |||
else return GetInteriorIntID( properties[id][eUniqIntId] ); | |||
} | |||
stock GetPropertyType( id ){ | |||
if( id > MAX_PROPERTIES ) return 0; | |||
else return properties[id][eType]; | |||
} | |||
stock GetPropertyOwner( id ){ | |||
if( id > MAX_PROPERTIES ) return -1; | |||
else return properties[id][eOwner]; | |||
} | |||
stock GetPropertyPrice( id ){ | |||
if( id > MAX_PROPERTIES ) return -1; | |||
else return properties[id][ePrice]; | |||
} | |||
stock GetPropertyName( id ){ | |||
new tmp[64]; | |||
if( id > MAX_PROPERTIES ) return tmp; | |||
else { | |||
format( tmp, 64, "%s", properties[id][ePname] ); | |||
return tmp; | |||
} | |||
} | |||
/******************************************************** | |||
********************************************************/ | |||
/******************************** | |||
* Database Functions * | |||
********************************/ | |||
stock Float:dbGetPropertyEntrance( database[], uniqId, &Float:x, &Float:y, &Float:z ){ | |||
new | |||
DB:prop, | |||
DBResult:query_result, | |||
query[128], | |||
num; | |||
prop = db_open( database ); | |||
format( query, 128,"SELECT entX, entY, enZ, entA FROM properties WHERE id = %d LIMIT 1", uniqId ); | |||
query_result = db_query( prop, query ); | |||
num = db_num_rows(query_result); | |||
if(!num) return -1.0; | |||
else { | |||
db_get_field_assoc( query_result, "entX", query, 128 ); | |||
x = floatstr( query ); | |||
db_get_field_assoc( query_result, "entY", query, 128 ); | |||
y = floatstr( query ); | |||
db_get_field_assoc( query_result, "entZ", query, 128 ); | |||
z = floatstr( query ); | |||
db_get_field_assoc( query_result, "entA", query, 128 ); | |||
return floatstr( query ); | |||
} | |||
} | |||
stock dbSetPropertyOwner( database[], uniqId, ownerId ){ | |||
} | |||
stock dbSetPropertyPrice( database[], uniqId, price ){ | |||
} | |||
stock dbDeleteProperty( database[], uniqId ){ | |||
} | |||
stock dbCreateProperty( database[], uniqId, Float:entX, Float:entY, Float:entZ, Float:entA ){ // remember to add rest of params | |||
} | |||
stock dbLoadProperties( database[] ) | |||
{ | |||
new | |||
DB:prop, | |||
DBResult:query_result, | |||
query[128], | |||
num, | |||
i; | |||
prop = db_open( database ); | |||
format( query, 128,"SELECT * FROM properties", uniqId ); | |||
query_result = db_query( prop, query ); | |||
num = db_num_rows(query_result); | |||
if(!num) return 0; | |||
else { | |||
while( i < num ){ | |||
db_get_field_assoc( query_result, "entX", query, 128 ); | |||
x = floatstr( query ); | |||
db_get_field_assoc( query_result, "entX", query, 128 ); | |||
x = floatstr( query ); | |||
db_get_field_assoc( query_result, "entY", query, 128 ); | |||
y = floatstr( query ); | |||
db_get_field_assoc( query_result, "entZ", query, 128 ); | |||
z = floatstr( query ); | |||
db_get_field_assoc( query_result, "entA", query, 128 ); | |||
i++; | |||
} | |||
} | |||
} | |||
/******************************************************** | |||
********************************************************/ | |||
/********************************* | |||
* Property System Functions * | |||
*********************************/ | |||
ReadInteriorInfo( fileName[] ) | |||
{ | |||
new | |||
File:file_ptr, | |||
buf[256], | |||
tmp[64], | |||
idx, | |||
uniqId; | |||
file_ptr = fopen( fileName, io_read ); | |||
if( file_ptr ){ | |||
while( fread( file_ptr, buf, 256 ) > 0){ | |||
idx = 0; | |||
idx = token_by_delim( buf, tmp, ' ', idx ); | |||
if(idx == (-1)) continue; | |||
uniqId = strval( tmp ); | |||
if( uniqId >= MAX_INTERIORS ) return 0; | |||
idx = token_by_delim( buf, tmp, ' ', idx+1 ); | |||
if(idx == (-1)) continue; | |||
interiorInfo[uniqId][inIntID] = strval( tmp ); | |||
idx = token_by_delim( buf, tmp, ' ', idx+1 ); | |||
if(idx == (-1)) continue; | |||
interiorInfo[uniqId][inExitX] = floatstr( tmp ); | |||
idx = token_by_delim( buf, tmp, ' ', idx+1 ); | |||
if(idx == (-1)) continue; | |||
interiorInfo[uniqId][inExitY] = floatstr( tmp ); | |||
idx = token_by_delim( buf, tmp, ' ', idx+1); | |||
if(idx == (-1)) continue; | |||
interiorInfo[uniqId][inExitZ] = floatstr( tmp ); | |||
idx = token_by_delim( buf, tmp, ' ', idx+1 ); | |||
if(idx == (-1)) continue; | |||
interiorInfo[uniqId][inExitA] = floatstr( tmp ); | |||
idx = token_by_delim( buf, interiorInfo[uniqId][inName], ';', idx+1 ); | |||
if(idx == (-1)) continue; | |||
/* | |||
printf( "ReadInteriorInfo(%d, %d, %f, %f, %f, %f ( %s ))", | |||
uniqId, | |||
interiorInfo[uniqId][inIntID], | |||
interiorInfo[uniqId][inExitX], | |||
interiorInfo[uniqId][inExitY], | |||
interiorInfo[uniqId][inExitZ], | |||
interiorInfo[uniqId][inExitA], | |||
interiorInfo[uniqId][inName] );*/ | |||
} | |||
//printf( "Interiors File read successfully" ); | |||
fclose( file_ptr ); | |||
return 1; | |||
} | |||
printf( "Could Not Read Interiors file ( %s )", fileName ); | |||
return 0; | |||
} | |||
ReadPropertyFile( fileName[] ) | |||
{ | |||
new File:file_ptr, | |||
tmp[128], | |||
buf[256], | |||
idx, | |||
Float:enX, | |||
Float:enY, | |||
Float:enZ, | |||
Float:enA, | |||
uniqIntId, | |||
p_type, | |||
pIcon; | |||
printf("Reading File: %s",fileName); | |||
file_ptr = fopen( fileName, io_read ); | |||
if(!file_ptr )return 0; | |||
while( fread( file_ptr, buf, 256 ) > 0){ | |||
idx = 0; | |||
idx = token_by_delim( buf, tmp, ',', idx ); | |||
if(idx == (-1)) continue; | |||
pIcon = strval( tmp ); | |||
idx = token_by_delim( buf, tmp, ',', idx+1 ); | |||
if(idx == (-1)) continue; | |||
enX = floatstr( tmp ); | |||
idx = token_by_delim( buf, tmp, ',', idx+1 ); | |||
if(idx == (-1)) continue; | |||
enY = floatstr( tmp ); | |||
idx = token_by_delim( buf, tmp, ',', idx+1 ); | |||
if(idx == (-1)) continue; | |||
enZ = floatstr( tmp ); | |||
idx = token_by_delim( buf, tmp, ',', idx+1 ); | |||
if(idx == (-1)) continue; | |||
enA = floatstr( tmp ); | |||
idx = token_by_delim( buf, tmp, ',', idx+1 ); | |||
if(idx == (-1)) continue; | |||
uniqIntId = strval( tmp ); | |||
idx = token_by_delim( buf, tmp, ';', idx+1 ); | |||
if(idx == (-1)) continue; | |||
p_type = strval( tmp ); | |||
CreateProperty( uniqIntId, pIcon, enX, enY, enZ, enA, p_type ); | |||
} | |||
fclose( file_ptr ); | |||
return 1; | |||
} | |||
PutPlayerInProperty( playerid, propId, propVW = 0 ) | |||
{ | |||
new Float:x, Float:y, Float:z, Float:a; | |||
new intFileId; | |||
a = GetPropertyExit( propId, x, y, z ); | |||
SetPlayerPos( playerid, x, y, z ); | |||
SetPlayerFacingAngle( playerid, a ); | |||
SetPlayerInterior( playerid, GetPropertyInteriorId( propId )); | |||
SetPlayerVirtualWorld( playerid, (propVW==0)? propId+PROP_VW:propVW ); | |||
intFileId = GetPropertyInteriorFileId(propId); | |||
currentInt[playerid] = propId; | |||
//new dbgstring[128]; | |||
//format(dbgstring,sizeof(dbgstring),"PutPlayerInProperty(%d): FileInt=%d",propId,intFileId); | |||
//SendClientMessage(playerid,0xFFFFFFFF,dbgstring); | |||
// the following will make the client shop scripts run if we tell it | |||
// the name of the shop. | |||
if(intFileId == 22) { | |||
SetPlayerShopName(playerid,"FDPIZA"); | |||
} | |||
else if(intFileId == 47) { | |||
SetPlayerShopName(playerid,"FDBURG"); | |||
} | |||
else if(intFileId == 130) { | |||
SetPlayerShopName(playerid,"FDCHICK"); | |||
} | |||
else if(intFileId == 32) { | |||
SetPlayerShopName(playerid,"AMMUN1"); | |||
} | |||
else if(intFileId == 96) { | |||
SetPlayerShopName(playerid,"AMMUN2"); | |||
} | |||
else if(intFileId == 122) { | |||
SetPlayerShopName(playerid,"AMMUN3"); | |||
} | |||
else if(intFileId == 123) { | |||
SetPlayerShopName(playerid,"AMMUN5"); | |||
} | |||
} | |||
// Adds new property to property file | |||
AddProperty( uniqIntId, Float:entX, Float:entY, Float:entZ, Float:entA, p_type, comment[]="" ) | |||
{ | |||
new | |||
Float:exitX, | |||
Float:exitY, | |||
Float:exitZ, | |||
Float:exitA, | |||
interiorId, | |||
File:file_ptr, | |||
tmp[128]; | |||
interiorId = GetInteriorExitInfo( uniqIntId, exitX, exitY, exitZ, exitA ); | |||
if( interiorId != -1 ){ | |||
file_ptr = fopen( propFile[p_type], io_append ); | |||
if(file_ptr){ | |||
format( tmp, 128, "%d, %f, %f, %f, %f, %d, %d ; //%s\r\n", propIcons[p_type][tIcon],entX, entY, entZ, entA, uniqIntId, p_type, comment ); | |||
fwrite( file_ptr, tmp ); | |||
fclose( file_ptr ); | |||
printf( "PropDB - %s", tmp ); | |||
return CreateProperty( uniqIntId, propIcons[p_type][tIcon], entX, entY, entZ, entA, p_type ); | |||
} | |||
} | |||
return -1; | |||
} | |||
CreateProperty( uniqIntId, iconId, Float:entX, Float:entY, Float:entZ, Float:entA, p_type, name[64]="", owner=-1, price=0 ) | |||
{ | |||
if( (unid+1) < MAX_PROPERTIES ){ | |||
new Id = CreatePickup( iconId ,23, entX, entY, entZ, 0 ); | |||
//printf( "CreateProperty(%d, %d, %f, %f, %f, %f, %d)", uniqIntId, iconId, entX, entY, entZ, entA, p_type ); | |||
propPickups[Id] = unid; | |||
properties[unid][eEntX] = entX; | |||
properties[unid][eEntY] = entY; | |||
properties[unid][eEntZ] = entZ; | |||
properties[unid][eEntA] = entA; | |||
properties[unid][eUniqIntId] = uniqIntId; | |||
properties[unid][eOwner] = owner; | |||
properties[unid][ePrice] = price; | |||
properties[unid][eType] = p_type; | |||
format( properties[unid][ePname], 64, "%s", name ); | |||
new text_info[256]; | |||
propTextInfo[unid] = Text3D:INVALID_3DTEXT_ID; | |||
if(p_type == TYPE_HOUSE) { | |||
format(text_info,256,"{FFFFFF}[{88EE88}House{FFFFFF}]"); | |||
propTextInfo[unid] = Create3DTextLabel(text_info,0x88EE88FF,entX,entY,entZ+0.75,20.0,0,1); | |||
} | |||
else if(p_type == TYPE_BUSINESS) { | |||
format(text_info,256,"{FFFFFF}[{AAAAFF}Business{FFFFFF}]"); | |||
propTextInfo[unid] = Create3DTextLabel(text_info,0xAAAAFFFF,entX,entY,entZ+0.75,20.0,0,1); | |||
} | |||
else if(p_type == TYPE_BANK) { | |||
format(text_info,256,"{FFFFFF}[{EEEE88}Bank{FFFFFF}]"); | |||
propTextInfo[unid] = Create3DTextLabel(text_info,0xEEEE88FF,entX,entY,entZ+0.75,20.0,0,1); | |||
} | |||
else if(p_type == TYPE_COP) { | |||
format(text_info,256,"{FFFFFF}[{EEEE88}Police Station{FFFFFF}]"); | |||
propTextInfo[unid] = Create3DTextLabel(text_info,0xEEEE88FF,entX,entY,entZ+0.75,20.0,0,1); | |||
} | |||
return unid++; | |||
} | |||
else print( "Property Limit Reached" ); | |||
return -1; | |||
} | |||
PropertyCommand( playerid, cmd[],cmdtext[],idx, p_type ) | |||
{ | |||
new | |||
Float:x, | |||
Float:y, | |||
Float:z, | |||
Float:a, | |||
tmp[256], | |||
string[128], | |||
uniqId, | |||
id; | |||
if( GetPlayerInterior(playerid) != 0 || GetPlayerVirtualWorld(playerid)!= 0 ){ | |||
SendClientMessage(playerid, 0x550000FF, "You can only create properties in Interior 0 and VW 0" ); | |||
return 1; | |||
} | |||
GetPlayerPos( playerid, x, y, z ); | |||
GetPlayerFacingAngle( playerid, a ); | |||
tmp = strtok( cmdtext, idx ); | |||
if(!strlen(tmp)){ | |||
format( string, 128, "Usage: %s [uniqInteriorId] [optional-comment]", cmd ); | |||
SendClientMessage( playerid, 0xFF00CC, string ); | |||
return 1; | |||
} | |||
if(!isNumeric(tmp)){ | |||
SendClientMessage(playerid, 0x550000, "Uniq Interior Id must be a number" ); | |||
return 1; | |||
} | |||
uniqId = strval( tmp ); | |||
if( uniqId > MAX_INTERIORS || uniqId < 0 ){ | |||
SendClientMessage( playerid, 0xFFFFCC, "Invalid Uniq Interior Id" ); | |||
return 1; | |||
} | |||
idx = token_by_delim( cmdtext, tmp, '\0', idx ); | |||
if(idx){ | |||
id = AddProperty( uniqId, x, y, z, a, p_type, tmp ); | |||
} | |||
else { | |||
id = AddProperty( uniqId, x, y, z, a, p_type ); | |||
} | |||
if( id != -1 ){ | |||
format( tmp, 256, "Property Type ( %d ) Added Successfully: UniqId: %d Interior: %d IntName: %s",p_type, id, interiorInfo[uniqId][inIntID], interiorInfo[uniqId][inName] ); | |||
SendClientMessage( playerid, 0xCC7700, tmp ); | |||
}else{ | |||
SendClientMessage( playerid, 0x00FF55, "Error: Something went wrong/Property Limit Reached" ); | |||
} | |||
return 1; | |||
} | |||
LoadProperties() | |||
{ | |||
if( properties[0][eType] != TYPE_EMPTY ){ | |||
UnloadProperties(); | |||
} | |||
unid = 0; | |||
for( new i = 0; i < MAX_PROPERTIES; i++ ){ | |||
properties[i][eType] = TYPE_EMPTY; | |||
} | |||
ReadInteriorInfo( "properties/interiors.txt" ); | |||
for( new i = 0; i < MAX_TYPES; i++ ){ | |||
ReadPropertyFile( propFile[i] ); | |||
} | |||
return 1; | |||
} | |||
UnloadProperties() | |||
{ | |||
new | |||
p; | |||
for( new i = 0; i < MAX_PROPERTIES; i++ ){ | |||
if( propPickups[i] != -1 ){ | |||
DestroyPickup( i ); | |||
p = propPickups[i]; | |||
propPickups[i] = -1; | |||
properties[p][eInterior] = -1; | |||
properties[p][eType] = TYPE_EMPTY; | |||
properties[p][eOwner] = -1; | |||
properties[p][ePrice] = 0; | |||
properties[p][ePname][0] = '\0'; | |||
} | |||
} | |||
} | |||
/******************************************************** | |||
********************************************************/ | |||
/************************************ | |||
* Callbacks * | |||
************************************/ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n-----------------------------------"); | |||
print("Grand Larceny Property Filterscript "); | |||
print("-----------------------------------\n"); | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
UnloadProperties(); | |||
return 1; | |||
} | |||
public OnGameModeInit() | |||
{ | |||
LoadProperties(); | |||
return 1; | |||
} | |||
public OnGameModeExit() | |||
{ | |||
UnloadProperties(); | |||
return 1; | |||
} | |||
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) | |||
{ | |||
if( newinteriorid == 0 ){ | |||
currentInt[playerid] = -1; | |||
SetPlayerVirtualWorld( playerid, 0 ); | |||
} | |||
return 1; | |||
} | |||
public OnPlayerSpawn( playerid ) | |||
{ | |||
gLastPropertyEnterNotification[playerid] = -1; | |||
return 1; | |||
} | |||
public OnPlayerPickUpPickup(playerid, pickupid) | |||
{ | |||
//printf( "DEBUG: Player %d pickedup Pickup %d Prop Id %d", playerid, pickupid ); | |||
lastPickup[playerid] = pickupid; | |||
new id = propPickups[pickupid]; | |||
new pmsg[256]; | |||
if( properties[id][eType] > 0 ){ | |||
if(gLastPropertyEnterNotification[playerid] != id){ | |||
gLastPropertyEnterNotification[playerid] = id; | |||
switch( properties[id][eType] ){ | |||
case TYPE_HOUSE:{ | |||
format(pmsg,256,"* House: type /enter to enter"); | |||
SendClientMessage( playerid, 0xFF55BBFF, pmsg ); | |||
return 1; | |||
} | |||
case TYPE_BUSINESS:{ | |||
format(pmsg,256,"* Business: type /enter to enter"); | |||
SendClientMessage( playerid, 0xFF55BBFF, pmsg ); | |||
return 1; | |||
} | |||
case TYPE_BANK:{ | |||
format(pmsg,256,"* Bank: type /enter to enter"); | |||
SendClientMessage( playerid, 0xFF55BBFF, pmsg ); | |||
return 1; | |||
} | |||
case TYPE_COP:{ | |||
format(pmsg,256,"* Police Station: type /enter to enter"); | |||
SendClientMessage( playerid, 0xFF55BBFF, pmsg ); | |||
return 1; | |||
} | |||
} | |||
} | |||
} | |||
else SendClientMessage( playerid, 0xFF9900FF, "This property doesn't exist :S" ); | |||
return 1; | |||
} | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new idx; | |||
new cmd[256]; | |||
cmd = strtok(cmdtext, idx); | |||
// Public commands. | |||
if(strcmp("/enter", cmd, true) == 0) // enter property | |||
{ | |||
if( lastPickup[playerid] != -1 || properties[lastPickup[playerid]][eType] > 0 ){ | |||
new | |||
id = propPickups[lastPickup[playerid]], | |||
Float:x, | |||
Float:y, | |||
Float:z; | |||
GetPropertyEntrance( id, x, y, z ); | |||
if( IsPlayerInRangeOfPoint( playerid, 3.0, x, y, z )){ | |||
PutPlayerInProperty( playerid, id ); | |||
SendClientMessage( playerid, 0x55AADDFF, "* You have entered a property.. type /exit to leave" ); | |||
return 1; | |||
} | |||
} | |||
return 1; | |||
} | |||
else if(strcmp("/exit", cmd, true) == 0) // exit property | |||
{ | |||
if( currentInt[playerid] > -1 && GetPlayerInterior(playerid) == GetPropertyInteriorId( currentInt[playerid] )){ | |||
new id = currentInt[playerid]; | |||
new Float:x; | |||
new Float:y; | |||
new Float:z; | |||
new Float:a; | |||
// make sure they're near the exit before allowing them to exit. | |||
GetPropertyExit( id, x, y, z ); | |||
if(!IsPlayerInRangeOfPoint(playerid,4.5,x,y,z)) { | |||
SendClientMessage(playerid,0xDDAA55FF,"* You must be near the property exit to /exit"); | |||
return 1; | |||
} | |||
a = GetPropertyEntrance( id, x, y, z ); | |||
SetPlayerPos( playerid, x, y, z ); | |||
SetPlayerFacingAngle( playerid, a ); | |||
SetPlayerInterior( playerid, 0 ); | |||
SetPlayerVirtualWorld( playerid, 0 ); | |||
} | |||
currentInt[playerid] = -1; | |||
return 1; | |||
} | |||
// The rest of the commands here are for | |||
// property creation which is admin only. | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
if(strcmp("/chouse", cmd, true) == 0) // creates a house type property | |||
{ | |||
PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_HOUSE ); | |||
return 1; | |||
} | |||
else if(strcmp("/cbus", cmd, true) == 0) // creates a business type property | |||
{ | |||
PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_BUSINESS ); | |||
return 1; | |||
} | |||
else if(strcmp("/ccop", cmd, true) == 0) // creates a police station property | |||
{ | |||
PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_COP ); | |||
return 1; | |||
} | |||
else if(strcmp("/cbank", cmd, true) == 0) // creates a bank type property | |||
{ | |||
PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_BANK ); | |||
return 1; | |||
} | |||
else if(strcmp("/view", cmd, true) == 0) //Basically lets you view an interior from the interiors.txt file by id | |||
{ | |||
new | |||
tmp[256], | |||
string[128], | |||
uniqId, | |||
Float:x, | |||
Float:y, | |||
Float:z, | |||
Float:a; | |||
tmp = strtok( cmdtext, idx ); | |||
if(!strlen(tmp)){ | |||
format( string, 128, "Usage: %s [uniqInteriorId]", cmd ); | |||
SendClientMessage( playerid, 0xFF00CC, string ); | |||
return 1; | |||
} | |||
if(!isNumeric(tmp)){ | |||
SendClientMessage(playerid, 0x550000, "Uniq Interior Id must be a number" ); | |||
return 1; | |||
} | |||
uniqId = strval( tmp ); | |||
if( uniqId > MAX_INTERIORS || uniqId < 0 ){ | |||
SendClientMessage( playerid, 0xFFFFCC, "Invalid Uniq Interior Id" ); | |||
return 1; | |||
} | |||
if( GetPlayerInterior( playerid ) == 0 ){ | |||
GetPlayerPos( playerid, plPos[playerid][0], plPos[playerid][1], plPos[playerid][2] ); | |||
plInt[playerid] = GetPlayerInterior( playerid ); | |||
} | |||
a = GetInteriorExit( uniqId, x, y, z ); | |||
SetPlayerInterior( playerid, GetInteriorIntID( uniqId ) ); | |||
SetPlayerPos( playerid, x, y, z ); | |||
SetPlayerFacingAngle( playerid, a ); | |||
format( string, 128, "UniqId: %d InteriorId: %d Name: %s | Use /return to go to last position", uniqId,GetInteriorIntID( uniqId ), GetInteriorName( uniqId )); | |||
SendClientMessage( playerid, 0x556600FF, string ); | |||
return 1; | |||
} | |||
else if( strcmp( "/return", cmd, true ) == 0 ) // return from /view command to last position | |||
{ | |||
SetPlayerPos( playerid, plPos[playerid][0], plPos[playerid][1], plPos[playerid][2] ); | |||
SetPlayerInterior( playerid, plInt[playerid] ); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
/*********************************************************************** | |||
***********************************************************************/ |
@ -0,0 +1,162 @@ | |||
// | |||
// Keeps the in game time synced to the server's time and | |||
// draws the current time on the player's hud using a textdraw/ | |||
// (1 minute = 1 minute real world time) | |||
// | |||
// (c) 2009-2014 SA-MP Team | |||
#include <a_samp> | |||
#pragma tabsize 0 | |||
#include "../include/gl_common.inc" | |||
//-------------------------------------------------- | |||
// Used to override the time in this script | |||
new worldtime_override = 0; | |||
new worldtime_overridehour = 0; | |||
new worldtime_overridemin = 0; | |||
new Text:txtTimeDisp; | |||
new hour, minute; | |||
new timestr[32]; | |||
forward UpdateTimeAndWeather(); | |||
//-------------------------------------------------- | |||
new fine_weather_ids[] = {1,2,3,4,5,6,7,12,13,14,15,17,18,24,25,26,27,28,29,30,40}; | |||
new foggy_weather_ids[] = {9,19,20,31,32}; | |||
new wet_weather_ids[] = {8}; | |||
stock UpdateWorldWeather() | |||
{ | |||
new next_weather_prob = random(100); | |||
if(next_weather_prob < 70) SetWeather(fine_weather_ids[random(sizeof(fine_weather_ids))]); | |||
else if(next_weather_prob < 95) SetWeather(foggy_weather_ids[random(sizeof(foggy_weather_ids))]); | |||
else SetWeather(wet_weather_ids[random(sizeof(wet_weather_ids))]); | |||
} | |||
//-------------------------------------------------- | |||
//new last_weather_update=0; | |||
public UpdateTimeAndWeather() | |||
{ | |||
// Update time | |||
if(!worldtime_override) { | |||
gettime(hour, minute); | |||
} else { | |||
hour = worldtime_overridehour; | |||
minute = worldtime_overridemin; | |||
} | |||
format(timestr,32,"%02d:%02d",hour,minute); | |||
TextDrawSetString(txtTimeDisp,timestr); | |||
SetWorldTime(hour); | |||
new x=0; | |||
while(x!=MAX_PLAYERS) { | |||
if(IsPlayerConnected(x) && GetPlayerState(x) != PLAYER_STATE_NONE) { | |||
SetPlayerTime(x,hour,minute); | |||
} | |||
x++; | |||
} | |||
/* Update weather every hour | |||
if(last_weather_update == 0) { | |||
UpdateWorldWeather(); | |||
} | |||
last_weather_update++; | |||
if(last_weather_update == 60) { | |||
last_weather_update = 0; | |||
}*/ | |||
} | |||
//-------------------------------------------------- | |||
public OnGameModeInit() | |||
{ | |||
// Init our text display | |||
txtTimeDisp = TextDrawCreate(605.0,25.0,"00:00"); | |||
TextDrawUseBox(txtTimeDisp, 0); | |||
TextDrawFont(txtTimeDisp, 3); | |||
TextDrawSetShadow(txtTimeDisp,0); // no shadow | |||
TextDrawSetOutline(txtTimeDisp,2); // thickness 1 | |||
TextDrawBackgroundColor(txtTimeDisp,0x000000FF); | |||
TextDrawColor(txtTimeDisp,0xFFFFFFFF); | |||
TextDrawAlignment(txtTimeDisp,3); | |||
TextDrawLetterSize(txtTimeDisp,0.5,1.5); | |||
UpdateTimeAndWeather(); | |||
SetTimer("UpdateTimeAndWeather",1000 * 60,1); | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
public OnPlayerSpawn(playerid) | |||
{ | |||
TextDrawShowForPlayer(playerid,txtTimeDisp); | |||
// Update time | |||
if(!worldtime_override) { | |||
gettime(hour, minute); | |||
} else { | |||
hour = worldtime_overridehour; | |||
minute = worldtime_overridemin; | |||
} | |||
SetPlayerTime(playerid,hour,minute); | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
public OnPlayerDeath(playerid, killerid, reason) | |||
{ | |||
TextDrawHideForPlayer(playerid,txtTimeDisp); | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
public OnPlayerConnect(playerid) | |||
{ | |||
gettime(hour, minute); | |||
SetPlayerTime(playerid,hour,minute); | |||
return 1; | |||
} | |||
//-------------------------------------------------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new idx; | |||
cmd = strtok(cmdtext, idx); | |||
if(!IsPlayerAdmin(playerid)) return 0; // this is an admin only script | |||
if(strcmp(cmd, "/sethour", true) == 0) { | |||
new tmp[256+1]; | |||
tmp = strtok(cmdtext,idx); | |||
worldtime_override = 1; | |||
worldtime_overridehour = strval(tmp); | |||
UpdateTimeAndWeather(); | |||
return 1; | |||
} | |||
if(strcmp(cmd, "/setminute", true) == 0) { | |||
new tmp[256+1]; | |||
tmp = strtok(cmdtext,idx); | |||
worldtime_override = 1; | |||
worldtime_overridemin = strval(tmp); | |||
UpdateTimeAndWeather(); | |||
return 1; | |||
} | |||
return 0; | |||
} |
@ -0,0 +1,39 @@ | |||
//------------------------------------------------ | |||
#include <a_samp> | |||
#include <a_http> | |||
forward MyHttpResponse(index, response_code, data[]); | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--HTTP Test Loaded.\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public MyHttpResponse(index, response_code, data[]) | |||
{ | |||
new showdata[256+1]; | |||
format(showdata, 256, "Index: %d ResponseCode: %d Data: %s", index, response_code, data); | |||
SendClientMessage(index, 0xFFFFFFFF, showdata); | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
if(strcmp("/httptest", cmd, true) == 0) | |||
{ | |||
HTTP(playerid, HTTP_GET, "sa-mp.com/return.txt", "", "MyHttpResponse"); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,59 @@ | |||
//------------------------------------------------- | |||
// Internet radio example | |||
// (c) 2011 SA-MP Team | |||
//------------------------------------------------- | |||
#pragma tabsize 0 | |||
#include <a_samp> | |||
//------------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerStateChange(playerid, newstate, oldstate) | |||
{ | |||
// play an internet radio stream when they are in a vehicle | |||
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER) | |||
{ | |||
PlayAudioStreamForPlayer(playerid, "http://somafm.com/tags.pls"); | |||
} | |||
// stop the internet stream | |||
else if(oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) | |||
{ | |||
StopAudioStreamForPlayer(playerid); | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerUpdate(playerid) | |||
{ | |||
if(!IsPlayerConnected(playerid)) return 0; | |||
if(IsPlayerNPC(playerid)) return 1; | |||
// Handle playing SomaFM at the alhambra | |||
if(GetPlayerInterior(playerid) == 17) { | |||
if(IsPlayerInRangeOfPoint(playerid,70.0,489.5824,-14.7563,1000.6797)) { // alhambra middle | |||
if(!GetPVarInt(playerid,"alhambra")) { | |||
SetPVarInt(playerid,"alhambra",1); | |||
PlayAudioStreamForPlayer(playerid, "http://somafm.com/tags.pls",480.9575,-3.5402,1002.0781,40.0,true); | |||
} | |||
} | |||
} | |||
else { | |||
if(GetPVarInt(playerid,"alhambra")) { | |||
DeletePVar(playerid,"alhambra"); | |||
StopAudioStreamForPlayer(playerid); | |||
} | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------- |
@ -0,0 +1,138 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for Kylie's Barn Object | |||
// -------------------------------------------- | |||
// By Matite in March 2015 | |||
// | |||
// | |||
// This script creates the repaired Kylie's Barn Building object and removes | |||
// the existing GTASA barn object (normally this object has some collision | |||
// bugs that prevent the player from moving about inside it). | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 1 object = 1 for the replacement barn object | |||
// * Enables the /kb command to teleport the player to Kylie's Barn | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Used for messages sent to the player | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// ----------------------------------------------------------------------------- | |||
// Variables | |||
// --------- | |||
// Stores the created object number of the replacement barn object so | |||
// it can be destroyed when the filterscript is unloaded | |||
new KyliesBarnObject1; // Barn object | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/kb", cmdtext, true, 3) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 3); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, 292.03, 309.82, 999.55); | |||
SetPlayerFacingAngle(playerid, 88); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Kylie's Barn!", 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(" |--- Kylie's Barn Filterscript"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 6th March 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create Kylie's Barn repaired object | |||
KyliesBarnObject1 = CreateObject(19881, 286.188, 307.609, 1002.01, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Kylie's Barn object 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 Kylie's Barn object 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, 14871, 286.188, 307.609, 1002.01, 250.0); // Barn | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(KyliesBarnObject1)) | |||
{ | |||
// Destroy the Kylie's Barn object | |||
DestroyObject(KyliesBarnObject1); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Kylie's Barn object destroyed"); | |||
} | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Kylie's Barn Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA Kylie's Barn object for the player | |||
RemoveBuildingForPlayer(playerid, 14871, 286.188, 307.609, 1002.01, 250.0); // Barn | |||
// Exit here (return 1 so this callback is handled in other scripts too) | |||
return 1; | |||
} | |||
@ -0,0 +1,770 @@ | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new LS Apartments 1 Building with Elevator | |||
// ----------------------------------------------------------------------- | |||
// Original elevator code by Zamaroht in 2010 | |||
// | |||
// Updated by Kye in 2011 | |||
// * Added a sound effect for the elevator starting/stopping | |||
// | |||
// Edited by Matite in January 2015 | |||
// * Added code to remove the existing building, add the new building and | |||
// edited the elevator code so it works in this new building | |||
// | |||
// Updated to v1.02 by Matite in February 2015 | |||
// * Added code for the new car park object and edited the elevator to | |||
// include the car park | |||
// | |||
// This script creates the new LS Apartments 1 building object, removes the | |||
// existing GTASA building object, adds the new car park object and creates | |||
// an elevator that can be used to travel between all levels. | |||
// | |||
// You can un-comment the OnPlayerCommandText callback below to enable a simple | |||
// teleport command (/lsa) that teleports you to the LS Apartments 1 building. | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 27 objects = 1 for the elevator, 2 for the elevator doors, 22 for the | |||
// elevator floor doors, 1 for the replacement LS Apartments 1 building | |||
// and 1 for the car park | |||
// * 12 3D Text Labels = 11 on the floors and 1 in the elevator | |||
// * 1 dialog (for the elevator - dialog ID 876) | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// For PlaySoundForPlayersInRange() | |||
#include "../include/gl_common.inc" | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Movement speed of the elevator | |||
#define ELEVATOR_SPEED (5.0) | |||
// Movement speed of the doors | |||
#define DOORS_SPEED (5.0) | |||
// Time in ms that the elevator will wait in each floor before continuing with the queue... | |||
// be sure to give enough time for doors to open | |||
#define ELEVATOR_WAIT_TIME (5000) | |||
// Dialog ID for the LS Apartments building elevator dialog | |||
#define DIALOG_ID (876) | |||
// Position defines | |||
#define Y_DOOR_CLOSED (-1180.535917) | |||
#define Y_DOOR_R_OPENED Y_DOOR_CLOSED - 1.6 | |||
#define Y_DOOR_L_OPENED Y_DOOR_CLOSED + 1.6 | |||
#define GROUND_Z_COORD (20.879316) | |||
#define ELEVATOR_OFFSET (0.059523) | |||
#define X_ELEVATOR_POS (1181.622924) | |||
#define Y_ELEVATOR_POS (-1180.554687) | |||
// Elevator state defines | |||
#define ELEVATOR_STATE_IDLE (0) | |||
#define ELEVATOR_STATE_WAITING (1) | |||
#define ELEVATOR_STATE_MOVING (2) | |||
// Invalid floor define | |||
#define INVALID_FLOOR (-1) | |||
// Used for chat text messages | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// ----------------------------------------------------------------------------- | |||
// Constants | |||
// --------- | |||
// Elevator floor names for the 3D text labels | |||
static FloorNames[11][] = | |||
{ | |||
"Car Park", | |||
"Ground Floor", | |||
"First Floor", | |||
"Second Floor", | |||
"Third Floor", | |||
"Fourth Floor", | |||
"Fifth Floor", | |||
"Sixth Floor", | |||
"Seventh Floor", | |||
"Eighth Floor", | |||
"Ninth Floor" | |||
}; | |||
// Elevator floor Z heights | |||
static Float:FloorZOffsets[11] = | |||
{ | |||
0.0, // Car Park | |||
13.604544, // Ground Floor | |||
18.808519, // First Floor = 13.604544 + 5.203975 | |||
24.012494, // Second Floor = 18.808519 + 5.203975 | |||
29.216469, // Third Floor = 24.012494 + 5.203975 | |||
34.420444, // Fourth Floor = 29.216469 + 5.203975 | |||
39.624419, // Fifth Floor = 34.420444 + 5.203975 | |||
44.828394, // Sixth Floor = 39.624419 + 5.203975 | |||
50.032369, // Seventh Floor = 44.828394 + 5.203975 | |||
55.236344, // Eighth Floor = 50.032369 + 5.203975 | |||
60.440319 // Ninth Floor = 55.236344 + 5.203975 | |||
}; | |||
// ------------------------------------------------------------------------------ | |||
// Variables | |||
// --------- | |||
// Stores the created object number of the replacement building so it can be | |||
// destroyed when the filterscript is unloaded | |||
new LSApartments1Object; | |||
// Stores the created object number of the new cark park so it can be | |||
// destroyed when the filterscript is unloaded | |||
new LSApartments1CPObject; | |||
// Stores the created object numbers of the elevator, the elevator doors and | |||
// the elevator floor doors so they can be destroyed when the filterscript | |||
// is unloaded | |||
new Obj_Elevator, Obj_ElevatorDoors[2], Obj_FloorDoors[11][2]; | |||
// Stores a reference to the 3D text labels used on each floor and inside the | |||
// elevator itself so they can be detroyed when the filterscript is unloaded | |||
new Text3D:Label_Elevator, Text3D:Label_Floors[11]; | |||
// Stores the current state of the elevator (ie ELEVATOR_STATE_IDLE, | |||
// ELEVATOR_STATE_WAITING or ELEVATOR_STATE_MOVING) | |||
new ElevatorState; | |||
// Stores the current floor the elevator is on or heading to... if the value is | |||
// ELEVATOR_STATE_IDLE or ELEVATOR_STATE_WAITING this is the current floor. If | |||
// the value is ELEVATOR_STATE_MOVING then it is the floor it's moving to | |||
new ElevatorFloor; | |||
// Stores the elevator queue for each floor | |||
new ElevatorQueue[11]; | |||
// Stores who requested the floor for the elevator queue... | |||
// FloorRequestedBy[floor_id] = playerid; (stores who requested which floor) | |||
new FloorRequestedBy[11]; | |||
// Used for a timer that makes the elevator move faster after players start | |||
// surfing the object | |||
new ElevatorBoostTimer; | |||
// ------------------------------------------------------------------------------ | |||
// Function Forwards | |||
// ----------------- | |||
// Public: | |||
forward CallElevator(playerid, floorid); // You can use INVALID_PLAYER_ID too. | |||
forward ShowElevatorDialog(playerid); | |||
// Private: | |||
forward Elevator_Initialize(); | |||
forward Elevator_Destroy(); | |||
forward Elevator_OpenDoors(); | |||
forward Elevator_CloseDoors(); | |||
forward Floor_OpenDoors(floorid); | |||
forward Floor_CloseDoors(floorid); | |||
forward Elevator_MoveToFloor(floorid); | |||
forward Elevator_Boost(floorid); // Increases the elevator speed until it reaches 'floorid'. | |||
forward Elevator_TurnToIdle(); | |||
forward ReadNextFloorInQueue(); | |||
forward RemoveFirstQueueFloor(); | |||
forward AddFloorToQueue(floorid); | |||
forward IsFloorInQueue(floorid); | |||
forward ResetElevatorQueue(); | |||
forward DidPlayerRequestElevator(playerid); | |||
forward Float:GetElevatorZCoordForFloor(floorid); | |||
forward Float:GetDoorsZCoordForFloor(floorid); | |||
// ------------------------------------------------------------------------------ | |||
// Callbacks | |||
// --------- | |||
// Uncomment the OnPlayerCommandText callback below (remove the "/*" and the "*/") | |||
// to enable a simple teleport command (/lsa) which teleports the player to | |||
// outside the LS Apartments 1 building. | |||
/* | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/lsa", cmdtext, true, 4) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, 1131.07 + random(3), -1180.72 + random(2), 33.32); | |||
SetPlayerFacingAngle(playerid, 270); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~LS Apartments 1!", 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 Apartments 1 Filterscript"); | |||
print(" |-- Script v1.02"); | |||
print(" |-- 5th February 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create the LS Apartments 1 Building object | |||
LSApartments1Object = CreateObject(19595, 1160.96, -1180.58, 70.4141, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- LS Apartments 1 Building object created"); | |||
// Create the LS Apartments 1 Car Park object | |||
LSApartments1CPObject = CreateObject(19798, 1160.96, -1180.58, 20.4141, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- LS Apartments 1 Car Park object created"); | |||
// Reset the elevator queue | |||
ResetElevatorQueue(); | |||
// Create the elevator object, the elevator doors and the floor doors | |||
Elevator_Initialize(); | |||
// Display information in the Server Console | |||
print(" |-- LS Apartments 1 Elevator 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 building map object, LOD and awning shadows | |||
// (so any player currently ingame does not have to rejoin for them | |||
// to be removed when this filterscript is loaded) | |||
RemoveBuildingForPlayer(i, 5766, 1160.96, -1180.58, 70.4141, 250.0); // Awning shadows | |||
RemoveBuildingForPlayer(i, 5767, 1160.96, -1180.58, 70.4141, 250.0); // Building | |||
RemoveBuildingForPlayer(i, 5964, 1160.96, -1180.58, 70.4141, 250.0); // LOD | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(LSApartments1Object)) | |||
{ | |||
// Destroy the LS Apartments 1 Building object | |||
DestroyObject(LSApartments1Object); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- LS Apartments 1 Building object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(LSApartments1CPObject)) | |||
{ | |||
// Destroy the LS Apartments 1 Car Park object | |||
DestroyObject(LSApartments1CPObject); | |||
// Display information in the Server Console | |||
print(" |-- LS Apartments 1 Car Park object destroyed"); | |||
} | |||
// Destroy the elevator, the elevator doors and the elevator floor doors | |||
Elevator_Destroy(); | |||
// Display information in the Server Console | |||
print(" |-- LS Apartments 1 Elevator destroyed"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA building map object, LOD and awning shadows | |||
RemoveBuildingForPlayer(playerid, 5766, 1160.96, -1180.58, 70.4141, 250.0); // Awning shadows | |||
RemoveBuildingForPlayer(playerid, 5767, 1160.96, -1180.58, 70.4141, 250.0); // Building | |||
RemoveBuildingForPlayer(playerid, 5964, 1160.96, -1180.58, 70.4141, 250.0); // LOD | |||
// Exit here | |||
return 1; | |||
} | |||
public OnObjectMoved(objectid) | |||
{ | |||
// Create variables | |||
new Float:x, Float:y, Float:z; | |||
// Loop | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
// Check if the object that moved was one of the elevator floor doors | |||
if(objectid == Obj_FloorDoors[i][0]) | |||
{ | |||
GetObjectPos(Obj_FloorDoors[i][0], x, y, z); | |||
// Some floor doors have shut, move the elevator to next floor in queue: | |||
if (y < Y_DOOR_L_OPENED - 0.5) | |||
{ | |||
Elevator_MoveToFloor(ElevatorQueue[0]); | |||
RemoveFirstQueueFloor(); | |||
} | |||
} | |||
} | |||
if(objectid == Obj_Elevator) // The elevator reached the specified floor. | |||
{ | |||
KillTimer(ElevatorBoostTimer); // Kills the timer, in case the elevator reached the floor before boost. | |||
FloorRequestedBy[ElevatorFloor] = INVALID_PLAYER_ID; | |||
Elevator_OpenDoors(); | |||
Floor_OpenDoors(ElevatorFloor); | |||
GetObjectPos(Obj_Elevator, x, y, z); | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, X_ELEVATOR_POS - 1.7, Y_ELEVATOR_POS - 1.75, z - 0.4, 4.0, 0, 1); | |||
ElevatorState = ELEVATOR_STATE_WAITING; | |||
SetTimer("Elevator_TurnToIdle", ELEVATOR_WAIT_TIME, 0); | |||
} | |||
return 1; | |||
} | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
if(dialogid == DIALOG_ID) | |||
{ | |||
if(!response) | |||
return 0; | |||
if(FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem)) | |||
GameTextForPlayer(playerid, "~r~The floor is already in the queue", 3500, 4); | |||
else if(DidPlayerRequestElevator(playerid)) | |||
GameTextForPlayer(playerid, "~r~You already requested the elevator", 3500, 4); | |||
else | |||
CallElevator(playerid, listitem); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) | |||
{ | |||
// Check if the player is not in a vehicle and pressed the conversation yes key (Y by default) | |||
if (!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_YES)) | |||
{ | |||
// Create variables and get the players current position | |||
new Float:pos[3]; | |||
GetPlayerPos(playerid, pos[0], pos[1], pos[2]); | |||
// For debug | |||
//printf("X = %0.2f | Y = %0.2f | Z = %0.2f", pos[0], pos[1], pos[2]); | |||
// Check if the player is using the button inside the elevator | |||
if (pos[1] > (Y_ELEVATOR_POS - 1.8) && pos[1] < (Y_ELEVATOR_POS + 1.8) && pos[0] < (X_ELEVATOR_POS + 1.8) && pos[0] > (X_ELEVATOR_POS - 1.8)) | |||
{ | |||
// The player is using the button inside the elevator | |||
// -------------------------------------------------- | |||
// Show the elevator dialog to the player | |||
ShowElevatorDialog(playerid); | |||
} | |||
else | |||
{ | |||
// Check if the player is using the button on one of the floors | |||
if(pos[1] < (Y_ELEVATOR_POS - 1.81) && pos[1] > (Y_ELEVATOR_POS - 3.8) && pos[0] > (X_ELEVATOR_POS - 3.8) && pos[0] < (X_ELEVATOR_POS - 1.81)) | |||
{ | |||
// The player is most likely using an elevator floor button... check which floor | |||
// ----------------------------------------------------------------------------- | |||
// Create variable with the number of floors to check (total floors minus 1) | |||
new i = 10; | |||
// Loop | |||
while(pos[2] < GetDoorsZCoordForFloor(i) + 3.5 && i > 0) | |||
i --; | |||
if(i == 0 && pos[2] < GetDoorsZCoordForFloor(0) + 2.0) | |||
i = -1; | |||
if (i <= 9) | |||
{ | |||
// Check if the elevator is not moving (idle or waiting) | |||
if (ElevatorState != ELEVATOR_STATE_MOVING) | |||
{ | |||
// Check if the elevator is already on the floor it was called from | |||
if (ElevatorFloor == i + 1) | |||
{ | |||
// Display gametext message to the player | |||
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~y~~h~LS Apartments 1 Elevator Is~n~~y~~h~Already On This Floor...~n~~w~Walk Inside It~n~~w~And Press '~k~~CONVERSATION_YES~'", 3500, 3); | |||
// Display chat text message to the player | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* The LS Apartments 1 elevator is already on this floor... walk inside it and press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}'"); | |||
// Exit here (return 1 so this callback is processed in other scripts) | |||
return 1; | |||
} | |||
} | |||
// Call function to call the elevator to the floor | |||
CallElevator(playerid, i + 1); | |||
// Display gametext message to the player | |||
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~n~~g~~h~LS Apartments 1 Elevator~n~~g~~h~Has Been Called...~n~~w~Please Wait", 3000, 3); | |||
// Create variable for formatted message | |||
new strTempString[100]; | |||
// Check if the elevator is moving | |||
if (ElevatorState == ELEVATOR_STATE_MOVING) | |||
{ | |||
// Format chat text message | |||
format(strTempString, sizeof(strTempString), "* The LS Apartments 1 elevator has been called... it is currently moving towards the %s.", FloorNames[ElevatorFloor]); | |||
} | |||
else | |||
{ | |||
// Check if the floor is the car park | |||
if (ElevatorFloor == 0) | |||
{ | |||
// Format chat text message | |||
format(strTempString, sizeof(strTempString), "* The LS Apartments 1 elevator has been called... it is currently at the %s.", FloorNames[ElevatorFloor]); | |||
} | |||
else | |||
{ | |||
// Format chat text message | |||
format(strTempString, sizeof(strTempString), "* The LS Apartments 1 elevator has been called... it is currently on the %s.", FloorNames[ElevatorFloor]); | |||
} | |||
} | |||
// Display formatted chat text message to the player | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, strTempString); | |||
// Exit here (return 1 so this callback is processed in other scripts) | |||
return 1; | |||
} | |||
} | |||
} | |||
} | |||
// Exit here (return 1 so this callback is processed in other scripts) | |||
return 1; | |||
} | |||
// ------------------------ Functions ------------------------ | |||
stock Elevator_Initialize() | |||
{ | |||
// Create the elevator and elevator door objects | |||
Obj_Elevator = CreateObject(18755, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD + ELEVATOR_OFFSET, 0.000000, 0.000000, 0.000000); | |||
Obj_ElevatorDoors[0] = CreateObject(18757, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD + ELEVATOR_OFFSET, 0.000000, 0.000000, 0.000000); | |||
Obj_ElevatorDoors[1] = CreateObject(18756, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD + ELEVATOR_OFFSET, 0.000000, 0.000000, 0.000000); | |||
// Create the 3D text label for inside the elevator | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, X_ELEVATOR_POS - 1.7, Y_ELEVATOR_POS - 1.75, GROUND_Z_COORD - 0.4, 4.0, 0, 1); | |||
// Create variables | |||
new string[128], Float:z; | |||
// Loop | |||
for (new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
// Create elevator floor door objects | |||
Obj_FloorDoors[i][0] = CreateObject(18757, X_ELEVATOR_POS - 0.245, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 0.000000); | |||
Obj_FloorDoors[i][1] = CreateObject(18756, X_ELEVATOR_POS - 0.245, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 0.000000); | |||
// Format string for the floor 3D text label | |||
format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to call", FloorNames[i]); | |||
// Get label Z position | |||
z = GetDoorsZCoordForFloor(i); | |||
// Create floor label | |||
Label_Floors[i] = Create3DTextLabel(string, 0xCCCCCCAA, X_ELEVATOR_POS - 2.5, Y_ELEVATOR_POS - 2.5, z - 0.2, 10.5, 0, 1); | |||
} | |||
// Open the car park floor doors and the elevator doors | |||
Floor_OpenDoors(0); | |||
Elevator_OpenDoors(); | |||
// Exit here | |||
return 1; | |||
} | |||
stock Elevator_Destroy() | |||
{ | |||
// Destroys the elevator. | |||
DestroyObject(Obj_Elevator); | |||
DestroyObject(Obj_ElevatorDoors[0]); | |||
DestroyObject(Obj_ElevatorDoors[1]); | |||
Delete3DTextLabel(Label_Elevator); | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
DestroyObject(Obj_FloorDoors[i][0]); | |||
DestroyObject(Obj_FloorDoors[i][1]); | |||
Delete3DTextLabel(Label_Floors[i]); | |||
} | |||
return 1; | |||
} | |||
stock Elevator_OpenDoors() | |||
{ | |||
// Opens the elevator's doors. | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], x, Y_DOOR_L_OPENED, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], x, Y_DOOR_R_OPENED, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Elevator_CloseDoors() | |||
{ | |||
// Closes the elevator's doors. | |||
if(ElevatorState == ELEVATOR_STATE_MOVING) | |||
return 0; | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], x, Y_DOOR_CLOSED, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], x, Y_DOOR_CLOSED, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Floor_OpenDoors(floorid) | |||
{ | |||
// Opens the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_ELEVATOR_POS - 0.245, Y_DOOR_L_OPENED, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_ELEVATOR_POS - 0.245, Y_DOOR_R_OPENED, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Floor_CloseDoors(floorid) | |||
{ | |||
// Closes the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_ELEVATOR_POS - 0.245, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_ELEVATOR_POS - 0.245, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Elevator_MoveToFloor(floorid) | |||
{ | |||
// Moves the elevator to specified floor (doors are meant to be already closed). | |||
ElevatorState = ELEVATOR_STATE_MOVING; | |||
ElevatorFloor = floorid; | |||
// Move the elevator slowly, to give time to clients to sync the object surfing. Then, boost it up: | |||
MoveObject(Obj_Elevator, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), 0.25); | |||
Delete3DTextLabel(Label_Elevator); | |||
ElevatorBoostTimer = SetTimerEx("Elevator_Boost", 2000, 0, "i", floorid); | |||
return 1; | |||
} | |||
public Elevator_Boost(floorid) | |||
{ | |||
// Increases the elevator's speed until it reaches 'floorid' | |||
StopObject(Obj_Elevator); | |||
StopObject(Obj_ElevatorDoors[0]); | |||
StopObject(Obj_ElevatorDoors[1]); | |||
MoveObject(Obj_Elevator, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
return 1; | |||
} | |||
public Elevator_TurnToIdle() | |||
{ | |||
ElevatorState = ELEVATOR_STATE_IDLE; | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
stock RemoveFirstQueueFloor() | |||
{ | |||
// Removes the data in ElevatorQueue[0], and reorders the queue accordingly. | |||
for(new i; i < sizeof(ElevatorQueue) - 1; i ++) | |||
ElevatorQueue[i] = ElevatorQueue[i + 1]; | |||
ElevatorQueue[sizeof(ElevatorQueue) - 1] = INVALID_FLOOR; | |||
return 1; | |||
} | |||
stock AddFloorToQueue(floorid) | |||
{ | |||
// Adds 'floorid' at the end of the queue. | |||
// Scan for the first empty space: | |||
new slot = -1; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(ElevatorQueue[i] == INVALID_FLOOR) | |||
{ | |||
slot = i; | |||
break; | |||
} | |||
} | |||
if(slot != -1) | |||
{ | |||
ElevatorQueue[slot] = floorid; | |||
// If needed, move the elevator. | |||
if(ElevatorState == ELEVATOR_STATE_IDLE) | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
stock ResetElevatorQueue() | |||
{ | |||
// Resets the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
ElevatorQueue[i] = INVALID_FLOOR; | |||
FloorRequestedBy[i] = INVALID_PLAYER_ID; | |||
} | |||
return 1; | |||
} | |||
stock IsFloorInQueue(floorid) | |||
{ | |||
// Checks if the specified floor is currently part of the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
if(ElevatorQueue[i] == floorid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ReadNextFloorInQueue() | |||
{ | |||
// Reads the next floor in the queue, closes doors, and goes to it. | |||
if(ElevatorState != ELEVATOR_STATE_IDLE || ElevatorQueue[0] == INVALID_FLOOR) | |||
return 0; | |||
Elevator_CloseDoors(); | |||
Floor_CloseDoors(ElevatorFloor); | |||
return 1; | |||
} | |||
stock DidPlayerRequestElevator(playerid) | |||
{ | |||
for(new i; i < sizeof(FloorRequestedBy); i ++) | |||
if(FloorRequestedBy[i] == playerid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ShowElevatorDialog(playerid) | |||
{ | |||
new string[512]; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(FloorRequestedBy[i] != INVALID_PLAYER_ID) | |||
strcat(string, "{FF0000}"); | |||
strcat(string, FloorNames[i]); | |||
strcat(string, "\n"); | |||
} | |||
ShowPlayerDialog(playerid, DIALOG_ID, DIALOG_STYLE_LIST, "LS Apartments 1 Elevator...", string, "Accept", "Cancel"); | |||
return 1; | |||
} | |||
stock CallElevator(playerid, floorid) | |||
{ | |||
// Calls the elevator (also used with the elevator dialog). | |||
if(FloorRequestedBy[floorid] != INVALID_PLAYER_ID || IsFloorInQueue(floorid)) | |||
return 0; | |||
FloorRequestedBy[floorid] = playerid; | |||
AddFloorToQueue(floorid); | |||
return 1; | |||
} | |||
stock Float:GetElevatorZCoordForFloor(floorid) | |||
{ | |||
// Return Z height value plus a small offset | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid] + ELEVATOR_OFFSET); | |||
} | |||
stock Float:GetDoorsZCoordForFloor(floorid) | |||
{ | |||
// Return Z height value plus a small offset | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid] + ELEVATOR_OFFSET); | |||
} | |||
@ -0,0 +1,743 @@ | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new LS BeachSide Building with Elevator | |||
// -------------------------------------------------------------------- | |||
// Original elevator code by Zamaroht in 2010 | |||
// | |||
// Updated by Kye in 2011 | |||
// * Added a sound effect for the elevator starting/stopping | |||
// | |||
// Edited by Matite in January 2015 | |||
// * Adapted the elevator code so it works in this new building and removed the | |||
// light pole at the underground car park entrance | |||
// | |||
// Updated to v1.03 by Matite in April 2015 | |||
// * Removed the code that removes the existing building map object and the lines | |||
// that create the new objects as the original building is now replaced with | |||
// the new one by SAMP instead (same as the LS Office building) | |||
// | |||
// Updated to v1.02 by Matite in February 2015 | |||
// * Added code for the new car park object and edited the elevator to | |||
// include the car park | |||
// | |||
// This script creates the new LS BeachSide building object, removes the | |||
// existing GTASA building object, adds the new car park object and creates | |||
// an elevator that can be used to travel between all levels. | |||
// | |||
// You can un-comment the OnPlayerCommandText callback below to enable a simple | |||
// teleport command (/lsb) that teleports you to the LS BeachSide building. | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 31 objects = 1 for the elevator, 2 for the elevator doors and 28 for the | |||
// elevator floor doors | |||
// * 15 3D Text Labels = 14 on the floors and 1 in the elevator | |||
// * 1 dialog (for the elevator - dialog ID 877) | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// For PlaySoundForPlayersInRange() | |||
#include "../include/gl_common.inc" | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Movement speed of the elevator | |||
#define ELEVATOR_SPEED (5.0) | |||
// Movement speed of the doors | |||
#define DOORS_SPEED (5.0) | |||
// Time in ms that the elevator will wait in each floor before continuing with the queue... | |||
// be sure to give enough time for doors to open | |||
#define ELEVATOR_WAIT_TIME (5000) | |||
// Dialog ID for the LS BeachSide elevator dialog | |||
#define DIALOG_ID (877) | |||
// Position defines | |||
#define X_DOOR_R_OPENED (289.542419) | |||
#define X_DOOR_L_OPENED (286.342407) | |||
#define Y_DOOR_R_OPENED (-1609.640991) | |||
#define Y_DOOR_L_OPENED (-1609.076049) | |||
#define X_FDOOR_R_OPENED (289.492431) | |||
#define X_FDOOR_L_OPENED (286.292419) | |||
#define Y_FDOOR_R_OPENED (-1609.870971) | |||
#define Y_FDOOR_L_OPENED (-1609.306030) | |||
#define GROUND_Z_COORD (18.755348) // (33.825077) | |||
#define X_ELEVATOR_POS (287.942413) | |||
#define Y_ELEVATOR_POS (-1609.341064) | |||
// Elevator state defines | |||
#define ELEVATOR_STATE_IDLE (0) | |||
#define ELEVATOR_STATE_WAITING (1) | |||
#define ELEVATOR_STATE_MOVING (2) | |||
// Invalid floor define | |||
#define INVALID_FLOOR (-1) | |||
// Used for chat text messages | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// ----------------------------------------------------------------------------- | |||
// Constants | |||
// --------- | |||
// Elevator floor names for the 3D text labels | |||
static FloorNames[14][] = | |||
{ | |||
"Car Park", | |||
"Ground Floor", | |||
"First Floor", | |||
"Second Floor", | |||
"Third Floor", | |||
"Fourth Floor", | |||
"Fifth Floor", | |||
"Sixth Floor", | |||
"Seventh Floor", | |||
"Eighth Floor", | |||
"Ninth Floor", | |||
"Tenth Floor", | |||
"Eleventh Floor", | |||
"Twelfth Floor" | |||
}; | |||
// Elevator floor Z heights | |||
static Float:FloorZOffsets[14] = | |||
{ | |||
0.0, // Car Park | |||
15.069729, // Ground Floor | |||
29.130733, // First Floor | |||
33.630733, // Second Floor = 29.130733 + 4.5 | |||
38.130733, // Third Floor = 33.630733 + 4.5 | |||
42.630733, // Fourth Floor = 38.130733 + 4.5 | |||
47.130733, // Fifth Floor = 42.630733 + 4.5 | |||
51.630733, // Sixth Floor = 47.130733 + 4.5 | |||
56.130733, // Seventh Floor = 51.630733 + 4.5 | |||
60.630733, // Eighth Floor = 56.130733 + 4.5 | |||
65.130733, // Ninth Floor = 60.630733 + 4.5 | |||
69.630733, // Tenth Floor = 65.130733 + 4.5 | |||
74.130733, // Eleventh Floor = 69.630733 + 4.5 | |||
78.630733, // Twelfth Floor = 74.130733 + 4.5 | |||
}; | |||
// ----------------------------------------------------------------------------- | |||
// Variables | |||
// --------- | |||
// Stores the created object numbers of the elevator, the elevator doors and | |||
// the elevator floor doors so they can be destroyed when the filterscript | |||
// is unloaded | |||
new Obj_Elevator, Obj_ElevatorDoors[2], Obj_FloorDoors[14][2]; | |||
// Stores a reference to the 3D text labels used on each floor and inside the | |||
// elevator itself so they can be detroyed when the filterscript is unloaded | |||
new Text3D:Label_Elevator, Text3D:Label_Floors[14]; | |||
// Stores the current state of the elevator (ie ELEVATOR_STATE_IDLE, | |||
// ELEVATOR_STATE_WAITING or ELEVATOR_STATE_MOVING) | |||
new ElevatorState; | |||
// Stores the current floor the elevator is on or heading to... if the value is | |||
// ELEVATOR_STATE_IDLE or ELEVATOR_STATE_WAITING this is the current floor. If | |||
// the value is ELEVATOR_STATE_MOVING then it is the floor it's moving to | |||
new ElevatorFloor; | |||
// Stores the elevator queue for each floor | |||
new ElevatorQueue[14]; | |||
// Stores who requested the floor for the elevator queue... | |||
// FloorRequestedBy[floor_id] = playerid; (stores who requested which floor) | |||
new FloorRequestedBy[14]; | |||
// Used for a timer that makes the elevator move faster after players start | |||
// surfing the object | |||
new ElevatorBoostTimer; | |||
// ----------------------------------------------------------------------------- | |||
// Function Forwards | |||
// ----------------- | |||
// Public: | |||
forward CallElevator(playerid, floorid); // You can use INVALID_PLAYER_ID too. | |||
forward ShowElevatorDialog(playerid); | |||
// Private: | |||
forward Elevator_Initialize(); | |||
forward Elevator_Destroy(); | |||
forward Elevator_OpenDoors(); | |||
forward Elevator_CloseDoors(); | |||
forward Floor_OpenDoors(floorid); | |||
forward Floor_CloseDoors(floorid); | |||
forward Elevator_MoveToFloor(floorid); | |||
forward Elevator_Boost(floorid); // Increases the elevator speed until it reaches 'floorid'. | |||
forward Elevator_TurnToIdle(); | |||
forward ReadNextFloorInQueue(); | |||
forward RemoveFirstQueueFloor(); | |||
forward AddFloorToQueue(floorid); | |||
forward IsFloorInQueue(floorid); | |||
forward ResetElevatorQueue(); | |||
forward DidPlayerRequestElevator(playerid); | |||
forward Float:GetElevatorZCoordForFloor(floorid); | |||
forward Float:GetDoorsZCoordForFloor(floorid); | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
// Un-comment the OnPlayerCommandText callback below (remove the "/*" and the "*/") | |||
// to enable a simple teleport command (/lsb) which teleports the player to | |||
// outside the LS BeachSide building. | |||
/* | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/lsb", cmdtext, true, 4) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, 289.81 + random(2), -1630.65 + random(2), 34.32); | |||
SetPlayerFacingAngle(playerid, 10); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~LS BeachSide!", 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 BeachSide Filterscript"); | |||
print(" |-- Script v1.03"); | |||
print(" |-- 19th April 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Reset the elevator queue | |||
ResetElevatorQueue(); | |||
// Create the elevator object, the elevator doors and the floor doors | |||
Elevator_Initialize(); | |||
// Display information in the Server Console | |||
print(" |-- LS BeachSide Building Elevator 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 the lamp post at the underground car park entrance | |||
RemoveBuildingForPlayer(i, 1226, 265.481, -1581.1, 32.9311, 5.0); | |||
// Remove the night lights object (must be removed to also remove any | |||
// occulsion zones inside the building) | |||
RemoveBuildingForPlayer(i, 6518, 280.297, -1606.2, 72.3984, 250.0); | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Destroy the elevator, the elevator doors and the elevator floor doors | |||
Elevator_Destroy(); | |||
// Display information in the Server Console | |||
print(" |-- LS BeachSide Building Elevator destroyed"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove the lamp post at the underground car park entrance | |||
RemoveBuildingForPlayer(playerid, 1226, 265.481, -1581.1, 32.9311, 5.0); | |||
// Remove the night lights object (must be removed to also remove any | |||
// occulsion zones inside the building) | |||
RemoveBuildingForPlayer(playerid, 6518, 280.297, -1606.2, 72.3984, 250.0); | |||
// Exit here (return 1 so this callback is processed in other scripts) | |||
return 1; | |||
} | |||
public OnObjectMoved(objectid) | |||
{ | |||
// Create variables | |||
new Float:x, Float:y, Float:z; | |||
// Loop | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
// Check if the object that moved was one of the elevator floor doors | |||
if(objectid == Obj_FloorDoors[i][0]) | |||
{ | |||
GetObjectPos(Obj_FloorDoors[i][0], x, y, z); | |||
// Some floor doors have shut, move the elevator to next floor in queue: | |||
if (y < Y_DOOR_L_OPENED - 0.5) | |||
{ | |||
Elevator_MoveToFloor(ElevatorQueue[0]); | |||
RemoveFirstQueueFloor(); | |||
} | |||
} | |||
} | |||
if(objectid == Obj_Elevator) // The elevator reached the specified floor. | |||
{ | |||
KillTimer(ElevatorBoostTimer); // Kills the timer, in case the elevator reached the floor before boost. | |||
FloorRequestedBy[ElevatorFloor] = INVALID_PLAYER_ID; | |||
Elevator_OpenDoors(); | |||
Floor_OpenDoors(ElevatorFloor); | |||
GetObjectPos(Obj_Elevator, x, y, z); | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, X_ELEVATOR_POS + 1.6, Y_ELEVATOR_POS - 1.85, z - 0.4, 4.0, 0, 1); | |||
ElevatorState = ELEVATOR_STATE_WAITING; | |||
SetTimer("Elevator_TurnToIdle", ELEVATOR_WAIT_TIME, 0); | |||
} | |||
return 1; | |||
} | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
if(dialogid == DIALOG_ID) | |||
{ | |||
if(!response) | |||
return 0; | |||
if(FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem)) | |||
GameTextForPlayer(playerid, "~r~The floor is already in the queue", 3500, 4); | |||
else if(DidPlayerRequestElevator(playerid)) | |||
GameTextForPlayer(playerid, "~r~You already requested the elevator", 3500, 4); | |||
else | |||
CallElevator(playerid, listitem); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) | |||
{ | |||
// Check if the player is not in a vehicle and pressed the conversation yes key (Y by default) | |||
if (!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_YES)) | |||
{ | |||
// Create variables and get the players current position | |||
new Float:pos[3]; | |||
GetPlayerPos(playerid, pos[0], pos[1], pos[2]); | |||
// For debug | |||
//printf("X = %0.2f | Y = %0.2f | Z = %0.2f", pos[0], pos[1], pos[2]); | |||
// Check if the player is using the button inside the elevator | |||
if (pos[1] > (Y_ELEVATOR_POS - 1.8) && pos[1] < (Y_ELEVATOR_POS + 1.8) && pos[0] < (X_ELEVATOR_POS + 1.8) && pos[0] > (X_ELEVATOR_POS - 1.8)) | |||
{ | |||
// The player is using the button inside the elevator | |||
// -------------------------------------------------- | |||
// Show the elevator dialog to the player | |||
ShowElevatorDialog(playerid); | |||
} | |||
else | |||
{ | |||
// Check if the player is using the button on one of the floors | |||
if(pos[1] < (Y_ELEVATOR_POS - 1.81) && pos[1] > (Y_ELEVATOR_POS - 3.8) && pos[0] > (X_ELEVATOR_POS + 1.21) && pos[0] < (X_ELEVATOR_POS + 3.8)) | |||
{ | |||
// The player is most likely using an elevator floor button... check which floor | |||
// ----------------------------------------------------------------------------- | |||
// Create variable with the number of floors to check (total floors minus 1) | |||
new i = 13; | |||
// Loop | |||
while(pos[2] < GetDoorsZCoordForFloor(i) + 3.5 && i > 0) | |||
i --; | |||
if(i == 0 && pos[2] < GetDoorsZCoordForFloor(0) + 2.0) | |||
i = -1; | |||
if (i <= 12) | |||
{ | |||
// Check if the elevator is not moving (idle or waiting) | |||
if (ElevatorState != ELEVATOR_STATE_MOVING) | |||
{ | |||
// Check if the elevator is already on the floor it was called from | |||
if (ElevatorFloor == i + 1) | |||
{ | |||
// Display gametext message to the player | |||
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~y~~h~LS BeachSide Elevator Is~n~~y~~h~Already On This Floor...~n~~w~Walk Inside It~n~~w~And Press '~k~~CONVERSATION_YES~'", 3500, 3); | |||
// Display chat text message to the player | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* The LS BeachSide elevator is already on this floor... walk inside it and press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}'"); | |||
// Exit here (return 1 so this callback is processed in other scripts) | |||
return 1; | |||
} | |||
} | |||
// Call function to call the elevator to the floor | |||
CallElevator(playerid, i + 1); | |||
// Display gametext message to the player | |||
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~n~~g~~h~LS BeachSide Elevator~n~~g~~h~Has Been Called...~n~~w~Please Wait", 3000, 3); | |||
// Create variable for formatted message | |||
new strTempString[100]; | |||
// Check if the elevator is moving | |||
if (ElevatorState == ELEVATOR_STATE_MOVING) | |||
{ | |||
// Format chat text message | |||
format(strTempString, sizeof(strTempString), "* The LS BeachSide elevator has been called... it is currently moving towards the %s.", FloorNames[ElevatorFloor]); | |||
} | |||
else | |||
{ | |||
// Check if the floor is the car park | |||
if (ElevatorFloor == 0) | |||
{ | |||
// Format chat text message | |||
format(strTempString, sizeof(strTempString), "* The LS BeachSide elevator has been called... it is currently at the %s.", FloorNames[ElevatorFloor]); | |||
} | |||
else | |||
{ | |||
// Format chat text message | |||
format(strTempString, sizeof(strTempString), "* The LS BeachSide elevator has been called... it is currently on the %s.", FloorNames[ElevatorFloor]); | |||
} | |||
} | |||
// Display formatted chat text message to the player | |||
SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, strTempString); | |||
// Exit here (return 1 so this callback is processed in other scripts) | |||
return 1; | |||
} | |||
} | |||
} | |||
} | |||
// Exit here (return 1 so this callback is processed in other scripts) | |||
return 1; | |||
} | |||
// ------------------------ Functions ------------------------ | |||
stock Elevator_Initialize() | |||
{ | |||
// Create the elevator and elevator door objects | |||
Obj_Elevator = CreateObject(18755, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000); | |||
Obj_ElevatorDoors[0] = CreateObject(18757, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000); | |||
Obj_ElevatorDoors[1] = CreateObject(18756, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 80.000000); | |||
// Create the 3D text label for inside the elevator | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, X_ELEVATOR_POS + 1.6, Y_ELEVATOR_POS - 1.85, GROUND_Z_COORD - 0.4, 4.0, 0, 1); | |||
// Create variables | |||
new string[128], Float:z; | |||
// Loop | |||
for (new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
// Create elevator floor door objects | |||
Obj_FloorDoors[i][0] = CreateObject(18757, X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(i) + 0.05, 0.000000, 0.000000, 80.000000); | |||
Obj_FloorDoors[i][1] = CreateObject(18756, X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(i) + 0.05, 0.000000, 0.000000, 80.000000); | |||
// Format string for the floor 3D text label | |||
format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to call", FloorNames[i]); | |||
// Get label Z position | |||
z = GetDoorsZCoordForFloor(i); | |||
// Create floor label | |||
Label_Floors[i] = Create3DTextLabel(string, 0xCCCCCCAA, X_ELEVATOR_POS + 2, Y_ELEVATOR_POS -3, z - 0.2, 10.5, 0, 1); | |||
} | |||
// Open the car park floor doors and the elevator doors | |||
Floor_OpenDoors(0); | |||
Elevator_OpenDoors(); | |||
// Exit here | |||
return 1; | |||
} | |||
stock Elevator_Destroy() | |||
{ | |||
// Destroys the elevator. | |||
DestroyObject(Obj_Elevator); | |||
DestroyObject(Obj_ElevatorDoors[0]); | |||
DestroyObject(Obj_ElevatorDoors[1]); | |||
Delete3DTextLabel(Label_Elevator); | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
DestroyObject(Obj_FloorDoors[i][0]); | |||
DestroyObject(Obj_FloorDoors[i][1]); | |||
Delete3DTextLabel(Label_Floors[i]); | |||
} | |||
return 1; | |||
} | |||
stock Elevator_OpenDoors() | |||
{ | |||
// Opens the elevator's doors. | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], X_DOOR_L_OPENED, Y_DOOR_L_OPENED, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENED, Y_DOOR_R_OPENED, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Elevator_CloseDoors() | |||
{ | |||
// Closes the elevator's doors. | |||
if(ElevatorState == ELEVATOR_STATE_MOVING) | |||
return 0; | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Floor_OpenDoors(floorid) | |||
{ | |||
// Opens the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_FDOOR_L_OPENED, Y_FDOOR_L_OPENED, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_FDOOR_R_OPENED, Y_FDOOR_R_OPENED, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Floor_CloseDoors(floorid) | |||
{ | |||
// Closes the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_ELEVATOR_POS, Y_ELEVATOR_POS - 0.245, GetDoorsZCoordForFloor(floorid) + 0.05, DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Elevator_MoveToFloor(floorid) | |||
{ | |||
// Moves the elevator to specified floor (doors are meant to be already closed). | |||
ElevatorState = ELEVATOR_STATE_MOVING; | |||
ElevatorFloor = floorid; | |||
// Move the elevator slowly, to give time to clients to sync the object surfing. Then, boost it up: | |||
MoveObject(Obj_Elevator, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), 0.25); | |||
Delete3DTextLabel(Label_Elevator); | |||
ElevatorBoostTimer = SetTimerEx("Elevator_Boost", 2000, 0, "i", floorid); | |||
return 1; | |||
} | |||
public Elevator_Boost(floorid) | |||
{ | |||
// Increases the elevator's speed until it reaches 'floorid' | |||
StopObject(Obj_Elevator); | |||
StopObject(Obj_ElevatorDoors[0]); | |||
StopObject(Obj_ElevatorDoors[1]); | |||
MoveObject(Obj_Elevator, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
return 1; | |||
} | |||
public Elevator_TurnToIdle() | |||
{ | |||
ElevatorState = ELEVATOR_STATE_IDLE; | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
stock RemoveFirstQueueFloor() | |||
{ | |||
// Removes the data in ElevatorQueue[0], and reorders the queue accordingly. | |||
for(new i; i < sizeof(ElevatorQueue) - 1; i ++) | |||
ElevatorQueue[i] = ElevatorQueue[i + 1]; | |||
ElevatorQueue[sizeof(ElevatorQueue) - 1] = INVALID_FLOOR; | |||
return 1; | |||
} | |||
stock AddFloorToQueue(floorid) | |||
{ | |||
// Adds 'floorid' at the end of the queue. | |||
// Scan for the first empty space: | |||
new slot = -1; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(ElevatorQueue[i] == INVALID_FLOOR) | |||
{ | |||
slot = i; | |||
break; | |||
} | |||
} | |||
if(slot != -1) | |||
{ | |||
ElevatorQueue[slot] = floorid; | |||
// If needed, move the elevator. | |||
if(ElevatorState == ELEVATOR_STATE_IDLE) | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
stock ResetElevatorQueue() | |||
{ | |||
// Resets the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
ElevatorQueue[i] = INVALID_FLOOR; | |||
FloorRequestedBy[i] = INVALID_PLAYER_ID; | |||
} | |||
return 1; | |||
} | |||
stock IsFloorInQueue(floorid) | |||
{ | |||
// Checks if the specified floor is currently part of the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
if(ElevatorQueue[i] == floorid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ReadNextFloorInQueue() | |||
{ | |||
// Reads the next floor in the queue, closes doors, and goes to it. | |||
if(ElevatorState != ELEVATOR_STATE_IDLE || ElevatorQueue[0] == INVALID_FLOOR) | |||
return 0; | |||
Elevator_CloseDoors(); | |||
Floor_CloseDoors(ElevatorFloor); | |||
return 1; | |||
} | |||
stock DidPlayerRequestElevator(playerid) | |||
{ | |||
for(new i; i < sizeof(FloorRequestedBy); i ++) | |||
if(FloorRequestedBy[i] == playerid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ShowElevatorDialog(playerid) | |||
{ | |||
new string[512]; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(FloorRequestedBy[i] != INVALID_PLAYER_ID) | |||
strcat(string, "{FF0000}"); | |||
strcat(string, FloorNames[i]); | |||
strcat(string, "\n"); | |||
} | |||
ShowPlayerDialog(playerid, DIALOG_ID, DIALOG_STYLE_LIST, "LS BeachSide Elevator...", string, "Accept", "Cancel"); | |||
return 1; | |||
} | |||
stock CallElevator(playerid, floorid) | |||
{ | |||
// Calls the elevator (also used with the elevator dialog). | |||
if(FloorRequestedBy[floorid] != INVALID_PLAYER_ID || IsFloorInQueue(floorid)) | |||
return 0; | |||
FloorRequestedBy[floorid] = playerid; | |||
AddFloorToQueue(floorid); | |||
return 1; | |||
} | |||
stock Float:GetElevatorZCoordForFloor(floorid) | |||
{ | |||
// Return Z height value | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid]); | |||
} | |||
stock Float:GetDoorsZCoordForFloor(floorid) | |||
{ | |||
// Return Z height value | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid]); | |||
} | |||
@ -0,0 +1,509 @@ | |||
/* | |||
* Example elevator system for the new LS building. | |||
* | |||
* Zamaroht 2010 | |||
* | |||
* 26/08/2011: Kye: added a sound effect for the elevator starting/stopping. | |||
*/ | |||
// Warning: This script uses a total of 45 objects, 22 3D Text Labels and 1 dialog. | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" // for PlaySoundForPlayersInRange() | |||
#define ELEVATOR_SPEED (5.0) // Movement speed of the elevator. | |||
#define DOORS_SPEED (5.0) // Movement speed of the doors. | |||
#define ELEVATOR_WAIT_TIME (5000) // Time in ms that the elevator will wait in each floor before continuing with the queue. | |||
// Be sure to give enough time for doors to open. | |||
#define DIALOG_ID (874) | |||
// Private: | |||
#define X_DOOR_CLOSED (1786.627685) | |||
#define X_DOOR_R_OPENED (1785.027685) | |||
#define X_DOOR_L_OPENED (1788.227685) | |||
#define GROUND_Z_COORD (14.511476) | |||
#define ELEVATOR_OFFSET (0.059523) | |||
/* ------------------ | |||
// Constants: | |||
-------------------*/ | |||
static FloorNames[21][] = | |||
{ | |||
"Ground Floor", | |||
"First Floor", | |||
"Second Floor", | |||
"Third Floor", | |||
"Fourth Floor", | |||
"Fifth Floor", | |||
"Sixth Floor", | |||
"Seventh Floor", | |||
"Eighth Floor", | |||
"Ninth Floor", | |||
"Tenth Floor", | |||
"Eleventh Floor", | |||
"Twelfth Floor", | |||
"Thirteenth Floor", | |||
"Fourteenth Floor", | |||
"Fifteenth Floor", | |||
"Sixteenth Floor", | |||
"Seventeenth Floor", | |||
"Eighteenth Floor", | |||
"Nineteenth Floor", | |||
"Penthouse" | |||
}; | |||
static Float:FloorZOffsets[21] = | |||
{ | |||
0.0, // 0.0, | |||
8.5479, // 8.5479, | |||
13.99945, // 8.5479 + (5.45155 * 1.0), | |||
19.45100, // 8.5479 + (5.45155 * 2.0), | |||
24.90255, // 8.5479 + (5.45155 * 3.0), | |||
30.35410, // 8.5479 + (5.45155 * 4.0), | |||
35.80565, // 8.5479 + (5.45155 * 5.0), | |||
41.25720, // 8.5479 + (5.45155 * 6.0), | |||
46.70875, // 8.5479 + (5.45155 * 7.0), | |||
52.16030, // 8.5479 + (5.45155 * 8.0), | |||
57.61185, // 8.5479 + (5.45155 * 9.0), | |||
63.06340, // 8.5479 + (5.45155 * 10.0), | |||
68.51495, // 8.5479 + (5.45155 * 11.0), | |||
73.96650, // 8.5479 + (5.45155 * 12.0), | |||
79.41805, // 8.5479 + (5.45155 * 13.0), | |||
84.86960, // 8.5479 + (5.45155 * 14.0), | |||
90.32115, // 8.5479 + (5.45155 * 15.0), | |||
95.77270, // 8.5479 + (5.45155 * 16.0), | |||
101.22425, // 8.5479 + (5.45155 * 17.0), | |||
106.67580, // 8.5479 + (5.45155 * 18.0), | |||
112.12735 // 8.5479 + (5.45155 * 19.0) | |||
}; | |||
/* ------------------ | |||
// Variables: | |||
-------------------*/ | |||
new Obj_Elevator, Obj_ElevatorDoors[2], | |||
Obj_FloorDoors[21][2]; | |||
new Text3D:Label_Elevator, Text3D:Label_Floors[21]; | |||
#define ELEVATOR_STATE_IDLE (0) | |||
#define ELEVATOR_STATE_WAITING (1) | |||
#define ELEVATOR_STATE_MOVING (2) | |||
new ElevatorState, | |||
ElevatorFloor; // If Idle or Waiting, this is the current floor. If Moving, the floor it's moving to. | |||
#define INVALID_FLOOR (-1) | |||
new ElevatorQueue[21], // Floors in queue. | |||
FloorRequestedBy[21]; // FloorRequestedBy[floor_id] = playerid; - Points out who requested which floor. | |||
new ElevatorBoostTimer; // Timer that makes the elevator move faster after players start surfing the object. | |||
/* ------------------ | |||
* Function forwards: | |||
-------------------*/ | |||
// Public: | |||
forward CallElevator(playerid, floorid); // You can use INVALID_PLAYER_ID too. | |||
forward ShowElevatorDialog(playerid); | |||
// Private: | |||
forward Elevator_Initialize(); | |||
forward Elevator_Destroy(); | |||
forward Elevator_OpenDoors(); | |||
forward Elevator_CloseDoors(); | |||
forward Floor_OpenDoors(floorid); | |||
forward Floor_CloseDoors(floorid); | |||
forward Elevator_MoveToFloor(floorid); | |||
forward Elevator_Boost(floorid); // Increases the elevator speed until it reaches 'floorid'. | |||
forward Elevator_TurnToIdle(); | |||
forward ReadNextFloorInQueue(); | |||
forward RemoveFirstQueueFloor(); | |||
forward AddFloorToQueue(floorid); | |||
forward IsFloorInQueue(floorid); | |||
forward ResetElevatorQueue(); | |||
forward DidPlayerRequestElevator(playerid); | |||
forward Float:GetElevatorZCoordForFloor(floorid); | |||
forward Float:GetDoorsZCoordForFloor(floorid); | |||
// ------------------------ Callbacks ------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
ResetElevatorQueue(); | |||
Elevator_Initialize(); | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
Elevator_Destroy(); | |||
return 1; | |||
} | |||
public OnObjectMoved(objectid) | |||
{ | |||
new Float:x, Float:y, Float:z; | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
if(objectid == Obj_FloorDoors[i][0]) | |||
{ | |||
GetObjectPos(Obj_FloorDoors[i][0], x, y, z); | |||
if(x < X_DOOR_L_OPENED - 0.5) // Some floor doors have shut, move the elevator to next floor in queue: | |||
{ | |||
Elevator_MoveToFloor(ElevatorQueue[0]); | |||
RemoveFirstQueueFloor(); | |||
} | |||
} | |||
} | |||
if(objectid == Obj_Elevator) // The elevator reached the specified floor. | |||
{ | |||
KillTimer(ElevatorBoostTimer); // Kills the timer, in case the elevator reached the floor before boost. | |||
FloorRequestedBy[ElevatorFloor] = INVALID_PLAYER_ID; | |||
Elevator_OpenDoors(); | |||
Floor_OpenDoors(ElevatorFloor); | |||
GetObjectPos(Obj_Elevator, x, y, z); | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, 1784.9822, -1302.0426, z - 0.9, 4.0, 0, 1); | |||
ElevatorState = ELEVATOR_STATE_WAITING; | |||
SetTimer("Elevator_TurnToIdle", ELEVATOR_WAIT_TIME, 0); | |||
} | |||
return 1; | |||
} | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
if(dialogid == DIALOG_ID) | |||
{ | |||
if(!response) | |||
return 0; | |||
if(FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem)) | |||
GameTextForPlayer(playerid, "~r~The floor is already in the queue", 3500, 4); | |||
else if(DidPlayerRequestElevator(playerid)) | |||
GameTextForPlayer(playerid, "~r~You already requested the elevator", 3500, 4); | |||
else | |||
CallElevator(playerid, listitem); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) | |||
{ | |||
if(!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_YES)) | |||
{ | |||
new Float:pos[3]; | |||
GetPlayerPos(playerid, pos[0], pos[1], pos[2]); | |||
if(pos[1] < -1301.4 && pos[1] > -1303.2417 && pos[0] < 1786.2131 && pos[0] > 1784.1555) // He is using the elevator button | |||
ShowElevatorDialog(playerid); | |||
else // Is he in a floor button? | |||
{ | |||
if(pos[1] > -1301.4 && pos[1] < -1299.1447 && pos[0] < 1785.6147 && pos[0] > 1781.9902) | |||
{ | |||
// He is most likely using it, check floor: | |||
new i=20; | |||
while(pos[2] < GetDoorsZCoordForFloor(i) + 3.5 && i > 0) | |||
i --; | |||
if(i == 0 && pos[2] < GetDoorsZCoordForFloor(0) + 2.0) | |||
i = -1; | |||
if(i <= 19) | |||
{ | |||
CallElevator(playerid, i + 1); | |||
GameTextForPlayer(playerid, "~r~Elevator called", 3500, 4); | |||
} | |||
} | |||
} | |||
} | |||
return 1; | |||
} | |||
// ------------------------ Functions ------------------------ | |||
stock Elevator_Initialize() | |||
{ | |||
// Initializes the elevator. | |||
Obj_Elevator = CreateObject(18755, 1786.678100, -1303.459472, GROUND_Z_COORD + ELEVATOR_OFFSET, 0.000000, 0.000000, 270.000000); | |||
Obj_ElevatorDoors[0] = CreateObject(18757, X_DOOR_CLOSED, -1303.459472, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000); | |||
Obj_ElevatorDoors[1] = CreateObject(18756, X_DOOR_CLOSED, -1303.459472, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000); | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, 1784.9822, -1302.0426, 13.6491, 4.0, 0, 1); | |||
new string[128], | |||
Float:z; | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
Obj_FloorDoors[i][0] = CreateObject(18757, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000); | |||
Obj_FloorDoors[i][1] = CreateObject(18756, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000); | |||
format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to call", FloorNames[i]); | |||
if(i == 0) | |||
z = 13.4713; | |||
else | |||
z = 13.4713 + 8.7396 + ((i-1) * 5.45155); | |||
Label_Floors[i] = Create3DTextLabel(string, 0xCCCCCCAA, 1783.9799, -1300.7660, z, 10.5, 0, 1); | |||
// Label_Elevator, Text3D:Label_Floors[21]; | |||
} | |||
// Open ground floor doors: | |||
Floor_OpenDoors(0); | |||
Elevator_OpenDoors(); | |||
return 1; | |||
} | |||
stock Elevator_Destroy() | |||
{ | |||
// Destroys the elevator. | |||
DestroyObject(Obj_Elevator); | |||
DestroyObject(Obj_ElevatorDoors[0]); | |||
DestroyObject(Obj_ElevatorDoors[1]); | |||
Delete3DTextLabel(Label_Elevator); | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
DestroyObject(Obj_FloorDoors[i][0]); | |||
DestroyObject(Obj_FloorDoors[i][1]); | |||
Delete3DTextLabel(Label_Floors[i]); | |||
} | |||
return 1; | |||
} | |||
stock Elevator_OpenDoors() | |||
{ | |||
// Opens the elevator's doors. | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], X_DOOR_L_OPENED, y, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENED, y, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Elevator_CloseDoors() | |||
{ | |||
// Closes the elevator's doors. | |||
if(ElevatorState == ELEVATOR_STATE_MOVING) | |||
return 0; | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, y, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, y, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Floor_OpenDoors(floorid) | |||
{ | |||
// Opens the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_L_OPENED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_R_OPENED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Floor_CloseDoors(floorid) | |||
{ | |||
// Closes the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_DOOR_CLOSED, -1303.171142, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Elevator_MoveToFloor(floorid) | |||
{ | |||
// Moves the elevator to specified floor (doors are meant to be already closed). | |||
ElevatorState = ELEVATOR_STATE_MOVING; | |||
ElevatorFloor = floorid; | |||
// Move the elevator slowly, to give time to clients to sync the object surfing. Then, boost it up: | |||
MoveObject(Obj_Elevator, 1786.678100, -1303.459472, GetElevatorZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), 0.25); | |||
Delete3DTextLabel(Label_Elevator); | |||
ElevatorBoostTimer = SetTimerEx("Elevator_Boost", 2000, 0, "i", floorid); | |||
return 1; | |||
} | |||
public Elevator_Boost(floorid) | |||
{ | |||
// Increases the elevator's speed until it reaches 'floorid' | |||
StopObject(Obj_Elevator); | |||
StopObject(Obj_ElevatorDoors[0]); | |||
StopObject(Obj_ElevatorDoors[1]); | |||
MoveObject(Obj_Elevator, 1786.678100, -1303.459472, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, -1303.459472, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
return 1; | |||
} | |||
public Elevator_TurnToIdle() | |||
{ | |||
ElevatorState = ELEVATOR_STATE_IDLE; | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
stock RemoveFirstQueueFloor() | |||
{ | |||
// Removes the data in ElevatorQueue[0], and reorders the queue accordingly. | |||
for(new i; i < sizeof(ElevatorQueue) - 1; i ++) | |||
ElevatorQueue[i] = ElevatorQueue[i + 1]; | |||
ElevatorQueue[sizeof(ElevatorQueue) - 1] = INVALID_FLOOR; | |||
return 1; | |||
} | |||
stock AddFloorToQueue(floorid) | |||
{ | |||
// Adds 'floorid' at the end of the queue. | |||
// Scan for the first empty space: | |||
new slot = -1; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(ElevatorQueue[i] == INVALID_FLOOR) | |||
{ | |||
slot = i; | |||
break; | |||
} | |||
} | |||
if(slot != -1) | |||
{ | |||
ElevatorQueue[slot] = floorid; | |||
// If needed, move the elevator. | |||
if(ElevatorState == ELEVATOR_STATE_IDLE) | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
stock ResetElevatorQueue() | |||
{ | |||
// Resets the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
ElevatorQueue[i] = INVALID_FLOOR; | |||
FloorRequestedBy[i] = INVALID_PLAYER_ID; | |||
} | |||
return 1; | |||
} | |||
stock IsFloorInQueue(floorid) | |||
{ | |||
// Checks if the specified floor is currently part of the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
if(ElevatorQueue[i] == floorid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ReadNextFloorInQueue() | |||
{ | |||
// Reads the next floor in the queue, closes doors, and goes to it. | |||
if(ElevatorState != ELEVATOR_STATE_IDLE || ElevatorQueue[0] == INVALID_FLOOR) | |||
return 0; | |||
Elevator_CloseDoors(); | |||
Floor_CloseDoors(ElevatorFloor); | |||
return 1; | |||
} | |||
stock DidPlayerRequestElevator(playerid) | |||
{ | |||
for(new i; i < sizeof(FloorRequestedBy); i ++) | |||
if(FloorRequestedBy[i] == playerid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ShowElevatorDialog(playerid) | |||
{ | |||
new string[512]; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(FloorRequestedBy[i] != INVALID_PLAYER_ID) | |||
strcat(string, "{FF0000}"); | |||
strcat(string, FloorNames[i]); | |||
strcat(string, "\n"); | |||
} | |||
ShowPlayerDialog(playerid, DIALOG_ID, DIALOG_STYLE_LIST, "Elevator", string, "Accept", "Cancel"); | |||
return 1; | |||
} | |||
stock CallElevator(playerid, floorid) | |||
{ | |||
// Calls the elevator (also used with the elevator dialog). | |||
if(FloorRequestedBy[floorid] != INVALID_PLAYER_ID || IsFloorInQueue(floorid)) | |||
return 0; | |||
FloorRequestedBy[floorid] = playerid; | |||
AddFloorToQueue(floorid); | |||
return 1; | |||
} | |||
stock Float:GetElevatorZCoordForFloor(floorid) | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid] + ELEVATOR_OFFSET); // A small offset for the elevator object itself. | |||
stock Float:GetDoorsZCoordForFloor(floorid) | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid]); |
@ -0,0 +1,220 @@ | |||
//------------------------------------------------- | |||
// | |||
// This is an example of using cessil's LS mall replacement | |||
// mesh, which contains enterable shop interiors which | |||
// you can decorate yourself. | |||
// | |||
// It's recommended you use Jernej's map editor, found on the | |||
// SA-MP forum, and import this script (Import .pwn) if you | |||
// want to place new objects in the shops. | |||
// | |||
// SA-MP 0.3d and above | |||
// | |||
//------------------------------------------------- | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define MALL_OBJECT_DRAW_DIST 30.0 // Even with a streamer, keep the draw distance on the objects inside the shops low. | |||
//------------------------------------------------- | |||
RemoveBuildingsForMall(playerid) | |||
{ | |||
// Remove the original mall mesh | |||
RemoveBuildingForPlayer(playerid, 6130, 1117.5859, -1490.0078, 32.7188, 10.0); | |||
// This is the mall mesh LOD | |||
RemoveBuildingForPlayer(playerid, 6255, 1117.5859, -1490.0078, 32.7188, 10.0); | |||
// There are some trees on the outside of the mall which poke through one of the interiors | |||
RemoveBuildingForPlayer(playerid, 762, 1175.3594, -1420.1875, 19.8828, 0.25); | |||
RemoveBuildingForPlayer(playerid, 615, 1166.3516, -1417.6953, 13.9531, 0.25); | |||
} | |||
//------------------------------------------------- | |||
public OnPlayerConnect(playerid) | |||
{ | |||
RemoveBuildingsForMall(playerid); | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
// Main mall mesh, interior areas | |||
CreateObject(19322, 1117.580, -1490.01, 32.72, 0.00, 0.00, 0.00, 200.0); | |||
CreateObject(19323, 1117.580, -1490.01, 32.72, 0.00, 0.00, 0.00, 200.0); | |||
// Mall windows | |||
CreateObject(19325, 1155.40, -1434.89, 16.49, 0.00, 0.00, 0.30, 100.0); | |||
CreateObject(19325, 1155.37, -1445.41, 16.31, 0.00, 0.00, 0.00, 100.0); | |||
CreateObject(19325, 1155.29, -1452.38, 16.31, 0.00, 0.00, 0.00, 100.0); | |||
CreateObject(19325, 1157.36, -1468.35, 16.31, 0.00, 0.00, 18.66, 100.0); | |||
CreateObject(19325, 1160.64, -1478.37, 16.31, 0.00, 0.00, 17.76, 100.0); | |||
CreateObject(19325, 1159.84, -1502.06, 16.31, 0.00, 0.00, -19.92, 100.0); | |||
CreateObject(19325, 1139.28, -1523.71, 16.31, 0.00, 0.00, -69.36, 100.0); | |||
CreateObject(19325, 1117.06, -1523.43, 16.51, 0.00, 0.00, -109.44, 100.0); | |||
CreateObject(19325, 1097.18, -1502.43, 16.51, 0.00, 0.00, -158.58, 100.0); | |||
CreateObject(19325, 1096.47, -1478.29, 16.51, 0.00, 0.00, -197.94, 100.0); | |||
CreateObject(19325, 1099.70, -1468.27, 16.51, 0.00, 0.00, -197.94, 100.0); | |||
CreateObject(19325, 1101.81, -1445.45, 16.22, 0.00, 0.00, -180.24, 100.0); | |||
CreateObject(19325, 1101.76, -1452.47, 16.22, 0.00, 0.00, -181.62, 100.0); | |||
CreateObject(19325, 1101.77, -1434.88, 16.22, 0.00, 0.00, -180.24, 100.0); | |||
CreateObject(19325, 1094.31, -1444.92, 23.47, 0.00, 0.00, -180.24, 100.0); | |||
CreateObject(19325, 1094.37, -1458.37, 23.47, 0.00, 0.00, -179.46, 100.0); | |||
CreateObject(19325, 1093.01, -1517.44, 23.44, 0.00, 0.00, -138.72, 100.0); | |||
CreateObject(19325, 1101.08, -1526.64, 23.42, 0.00, 0.00, -137.34, 100.0); | |||
CreateObject(19325, 1155.12, -1526.38, 23.46, 0.00, 0.00, -42.12, 100.0); | |||
CreateObject(19325, 1163.09, -1517.25, 23.46, 0.00, 0.00, -40.74, 100.0); | |||
CreateObject(19325, 1163.04, -1442.06, 23.40, 0.00, 0.00, -0.12, 100.0); | |||
CreateObject(19325, 1163.09, -1428.47, 23.50, 0.00, 0.00, 0.54, 100.0); | |||
// This is an example 24/7. Normally you'd want to stream these | |||
// interior objects in your streamer. | |||
// signs | |||
CreateObject(19326, 1155.34, -1446.73, 16.38, 0.00, 0.00, -89.82, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(19326, 1155.25, -1443.85, 16.36, 0.00, 0.00, -89.82, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(19326, 1155.37, -1436.32, 16.36, 0.00, 0.00, -89.82, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(19326, 1155.35, -1433.51, 16.36, 0.00, 0.00, -89.70, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(19329, 1155.18, -1440.22, 18.70, 0.00, 0.00, 89.04, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(19329, 1161.59, -1431.50, 17.93, 0.00, 0.00, 0.00, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(19329, 1160.40, -1448.79, 17.96, 0.00, 0.00, 0.00, MALL_OBJECT_DRAW_DIST); | |||
// 24/7 food aisles | |||
CreateObject(2543, 1168.18, -1436.39, 14.79, 0.00, 0.00, 0.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2535, 1182.74, -1448.30, 14.70, 0.00, 0.00, -90.96, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1167.10, -1436.40, 14.79, 0.00, 0.00, 0.31, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2538, 1172.31, -1435.32, 14.79, 0.00, 0.00, 180.34, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1171.38, -1435.31, 14.79, 0.00, 0.00, 180.19, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2540, 1169.56, -1435.36, 14.79, 0.00, 0.00, 180.17, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1984, 1157.37, -1442.59, 14.79, 0.00, 0.00, -450.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1163.25, -1448.31, 14.75, 0.00, 0.00, -179.16, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1169.29, -1431.92, 14.75, 0.00, 0.00, 359.80, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1987, 1163.13, -1436.34, 14.79, 0.00, 0.00, 361.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1988, 1164.13, -1436.33, 14.79, 0.00, 0.00, 360.80, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1164.79, -1443.96, 14.79, 0.00, 0.00, 177.73, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1164.70, -1444.98, 14.79, 0.00, 0.00, 358.07, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2942, 1155.52, -1464.68, 15.43, 0.00, 0.00, -71.22, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1987, 1164.12, -1435.32, 14.77, 0.00, 0.00, 180.96, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1171.13, -1443.79, 14.79, 0.00, 0.00, -182.16, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1991, 1173.75, -1439.56, 14.79, 0.00, 0.00, 179.47, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1996, 1169.82, -1439.50, 14.79, 0.00, 0.00, 179.10, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1996, 1174.24, -1435.38, 14.79, 0.00, 0.00, 179.24, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1991, 1175.23, -1435.39, 14.79, 0.00, 0.00, 179.57, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1995, 1182.65, -1435.10, 14.79, 0.00, 0.00, 90.00, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1994, 1182.66, -1438.07, 14.79, 0.00, 0.00, 90.00, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1993, 1182.66, -1437.08, 14.79, 0.00, 0.00, 90.00, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2542, 1163.78, -1443.92, 14.76, 0.00, 0.00, 178.77, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2536, 1166.88, -1445.07, 14.70, 0.00, 0.00, -0.42, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2542, 1163.70, -1444.93, 14.78, 0.00, 0.00, -1.74, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1984, 1157.34, -1435.71, 14.79, 0.00, 0.00, -450.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1166.31, -1448.28, 14.75, 0.00, 0.00, -180.12, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1172.14, -1443.83, 14.79, 0.00, 0.00, -181.38, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1173.14, -1443.85, 14.79, 0.00, 0.00, -180.96, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1174.13, -1443.88, 14.79, 0.00, 0.00, -181.50, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1981, 1170.76, -1439.52, 14.79, 0.00, 0.00, -181.74, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1981, 1171.76, -1439.54, 14.79, 0.00, 0.00, -180.80, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1981, 1172.75, -1439.55, 14.79, 0.00, 0.00, -180.84, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2535, 1182.75, -1447.28, 14.70, 0.00, 0.00, -90.78, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2535, 1182.74, -1446.28, 14.70, 0.00, 0.00, -90.78, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2535, 1182.74, -1445.26, 14.70, 0.00, 0.00, -90.00, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2541, 1182.75, -1444.22, 14.79, 0.00, 0.00, -90.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2541, 1182.75, -1443.20, 14.79, 0.00, 0.00, -90.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2541, 1182.74, -1442.16, 14.79, 0.00, 0.00, -90.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1182.76, -1441.18, 14.79, 0.00, 0.00, -90.84, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2541, 1182.79, -1440.17, 14.79, 0.00, 0.00, -90.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1182.72, -1439.15, 14.79, 0.00, 0.00, -90.84, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1182.66, -1431.67, 14.79, 0.00, 0.00, 3.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1181.63, -1431.73, 14.79, 0.00, 0.00, 3.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1180.61, -1431.81, 14.79, 0.00, 0.00, 3.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1179.61, -1431.83, 14.79, 0.00, 0.00, 3.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1178.61, -1431.89, 14.79, 0.00, 0.00, 3.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1177.59, -1431.86, 14.79, 0.00, 0.00, 3.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1993, 1182.66, -1436.09, 14.79, 0.00, 0.00, 90.00, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1175.50, -1431.82, 14.75, 0.00, 0.00, 361.17, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1172.42, -1431.87, 14.75, 0.00, 0.00, 359.93, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1160.10, -1448.35, 14.75, 0.00, 0.00, -179.94, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1170.45, -1435.33, 14.79, 0.00, 0.00, 181.26, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2545, 1161.82, -1431.84, 14.91, 0.00, 0.00, -90.54, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2545, 1160.82, -1431.83, 14.91, 0.00, 0.00, -90.54, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2545, 1159.81, -1431.86, 14.91, 0.00, 0.00, -90.54, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2545, 1162.82, -1431.87, 14.91, 0.00, 0.00, -90.54, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1988, 1163.13, -1435.34, 14.79, 0.00, 0.00, 541.46, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1988, 1166.07, -1436.32, 14.79, 0.00, 0.00, 360.80, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1987, 1165.07, -1436.33, 14.79, 0.00, 0.00, 361.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1987, 1166.11, -1435.30, 14.77, 0.00, 0.00, 180.96, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1988, 1165.07, -1435.31, 14.79, 0.00, 0.00, 540.44, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2536, 1165.79, -1445.07, 14.70, 0.00, 0.00, -1.20, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2536, 1167.83, -1445.07, 14.70, 0.00, 0.00, -0.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1165.79, -1444.00, 14.79, 0.00, 0.00, 178.27, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1166.81, -1444.03, 14.79, 0.00, 0.00, 179.35, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1167.79, -1444.04, 14.79, 0.00, 0.00, 179.89, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1168.13, -1435.36, 14.79, 0.00, 0.00, 180.05, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1167.10, -1435.37, 14.79, 0.00, 0.00, 180.35, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1170.63, -1440.67, 14.75, 0.00, 0.00, 359.50, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1173.77, -1440.72, 14.75, 0.00, 0.00, 359.82, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1177.30, -1445.31, 14.75, 0.00, 0.00, 359.93, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1996, 1173.36, -1448.30, 14.79, 0.00, 0.00, 179.10, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1981, 1174.33, -1448.32, 14.79, 0.00, 0.00, -181.74, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1981, 1175.32, -1448.35, 14.79, 0.00, 0.00, -180.84, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1981, 1176.30, -1448.37, 14.79, 0.00, 0.00, -180.84, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1991, 1177.28, -1448.37, 14.79, 0.00, 0.00, 179.47, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1996, 1178.33, -1448.36, 14.79, 0.00, 0.00, 179.24, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1991, 1179.33, -1448.37, 14.79, 0.00, 0.00, 179.57, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1994, 1176.82, -1444.16, 14.79, 0.00, 0.00, -0.84, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1995, 1178.81, -1444.20, 14.79, 0.00, 0.00, -1.26, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1168.89, -1444.06, 14.79, 0.00, 0.00, 178.97, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1169.91, -1444.07, 14.79, 0.00, 0.00, 179.69, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1169.87, -1445.12, 14.79, 0.00, 0.00, -0.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1168.86, -1445.11, 14.79, 0.00, 0.00, 0.31, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2538, 1167.02, -1431.87, 14.79, 0.00, 0.00, 0.42, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1166.03, -1431.89, 14.79, 0.00, 0.00, 0.70, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2540, 1164.04, -1431.91, 14.79, 0.00, 0.00, 0.60, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1165.03, -1431.91, 14.79, 0.00, 0.00, 1.02, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2538, 1176.17, -1436.38, 14.79, 0.00, 0.00, 0.24, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1174.22, -1436.37, 14.79, 0.00, 0.00, -0.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2540, 1173.22, -1436.36, 14.79, 0.00, 0.00, 0.18, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1175.20, -1436.38, 14.79, 0.00, 0.00, -2.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2540, 1173.26, -1435.31, 14.79, 0.00, 0.00, 180.17, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1991, 1175.74, -1439.58, 14.79, 0.00, 0.00, 179.57, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1996, 1174.74, -1439.57, 14.79, 0.00, 0.00, 179.24, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1996, 1176.17, -1435.37, 14.79, 0.00, 0.00, 179.24, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1991, 1177.16, -1435.38, 14.79, 0.00, 0.00, 179.57, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2540, 1169.44, -1436.35, 14.79, 0.00, 0.00, 0.18, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1170.43, -1436.35, 14.79, 0.00, 0.00, 0.90, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2539, 1171.34, -1436.33, 14.79, 0.00, 0.00, 0.58, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2538, 1172.22, -1436.32, 14.79, 0.00, 0.00, 0.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1163.40, -1440.68, 14.79, 0.00, 0.00, 360.41, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2536, 1164.49, -1440.73, 14.70, 0.00, 0.00, -1.20, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2536, 1165.49, -1440.75, 14.70, 0.00, 0.00, -0.42, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2536, 1166.50, -1440.75, 14.70, 0.00, 0.00, -0.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1167.61, -1440.64, 14.79, 0.00, 0.00, 0.31, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1168.62, -1440.64, 14.79, 0.00, 0.00, 0.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1168.64, -1439.60, 14.79, 0.00, 0.00, 180.05, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2543, 1167.67, -1439.61, 14.79, 0.00, 0.00, 180.35, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1163.65, -1439.67, 14.79, 0.00, 0.00, 180.61, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1164.68, -1439.67, 14.79, 0.00, 0.00, 179.77, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1165.68, -1439.68, 14.79, 0.00, 0.00, 180.61, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2871, 1166.68, -1439.66, 14.79, 0.00, 0.00, 180.61, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1175.09, -1444.97, 14.79, 0.00, 0.00, -2.46, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1181.63, -1431.73, 14.79, 0.00, 0.00, 3.30, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1174.07, -1444.94, 14.79, 0.00, 0.00, 0.48, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1173.09, -1444.94, 14.79, 0.00, 0.00, -1.20, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1172.11, -1444.92, 14.79, 0.00, 0.00, -1.14, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1990, 1171.12, -1444.91, 14.79, 0.00, 0.00, -0.72, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1168.54, -1448.31, 14.79, 0.00, 0.00, -178.98, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1169.60, -1448.29, 14.79, 0.00, 0.00, -178.98, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1170.67, -1448.30, 14.79, 0.00, 0.00, -178.98, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1171.72, -1448.32, 14.79, 0.00, 0.00, -181.50, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2530, 1175.13, -1443.91, 14.79, 0.00, 0.00, -181.50, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(2012, 1176.82, -1440.75, 14.75, 0.00, 0.00, 359.93, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1995, 1177.71, -1439.63, 14.79, 0.00, 0.00, 0.00, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1994, 1176.73, -1439.63, 14.79, 0.00, 0.00, 0.06, MALL_OBJECT_DRAW_DIST); | |||
CreateObject(1993, 1177.83, -1444.15, 14.79, 0.00, 0.00, 179.46, MALL_OBJECT_DRAW_DIST); | |||
return 1; | |||
} |
@ -0,0 +1,404 @@ | |||
// ----------------------------------------------------------------------------- | |||
// 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 <a_samp> | |||
// 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; | |||
} | |||
@ -0,0 +1,139 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the LS Wells Fargo Building Object | |||
// ----------------------------------------------------------- | |||
// By Matite in March 2015 | |||
// | |||
// | |||
// This script creates the edited LS Wells Fargo Building object and | |||
// removes the existing GTASA building object. | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 1 object = 1 for the replacement building object | |||
// * Enables the /lswf command to teleport the player to the LS Wells Fargo Building | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Used for messages sent to the player | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// ----------------------------------------------------------------------------- | |||
// Variables | |||
// --------- | |||
// Stores the created object number of the replacement building object so | |||
// it can be destroyed when the filterscript is unloaded | |||
new LSWellsFargoObject1; // Building object | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/lswf", cmdtext, true, 5) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, 1448.43, -1468.28, 13.82); | |||
SetPlayerFacingAngle(playerid, 92); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~LS Wells Fargo!", 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 Wells Fargo Building Filterscript"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 6th March 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create the LS Wells Fargo Building object | |||
LSWellsFargoObject1 = CreateObject(19879, 1421.38, -1477.6, 42.2031, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- LS Wells Fargo Building object 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 Wells Fargo Building 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, 4007, 1421.38, -1477.6, 42.2031, 250.0); // Building | |||
RemoveBuildingForPlayer(i, 4009, 1421.38, -1477.6, 42.2031, 250.0); // LOD | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(LSWellsFargoObject1)) | |||
{ | |||
// Destroy the Wells Fargo Building object | |||
DestroyObject(LSWellsFargoObject1); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- LS Wells Fargo Building object destroyed"); | |||
} | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- LS Wells Fargo Building Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA Wells Fargo Building and LOD map objects for the player | |||
RemoveBuildingForPlayer(playerid, 4007, 1421.38, -1477.6, 42.2031, 250.0); // Building | |||
RemoveBuildingForPlayer(playerid, 4009, 1421.38, -1477.6, 42.2031, 250.0); // LOD | |||
// Exit here (return 1 so this callback is handled in other scripts too) | |||
return 1; | |||
} | |||
@ -0,0 +1,52 @@ | |||
// maxips FS limits the number of players connecting from a | |||
// single IP address. | |||
#include <a_samp> | |||
#define MAX_CONNECTIONS_FROM_IP 3 | |||
//--------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
printf("\n*** Player IP limiting FS (maxips) Loaded. Max connections from 1 IP = %d\n",MAX_CONNECTIONS_FROM_IP); | |||
} | |||
//--------------------------------------------- | |||
// GetNumberOfPlayersOnThisIP | |||
// Returns the number of players connecting from the | |||
// provided IP address | |||
stock GetNumberOfPlayersOnThisIP(test_ip[]) | |||
{ | |||
new against_ip[32+1]; | |||
new x = 0; | |||
new ip_count = 0; | |||
for(x=0; x<MAX_PLAYERS; x++) { | |||
if(IsPlayerConnected(x)) { | |||
GetPlayerIp(x,against_ip,32); | |||
if(!strcmp(against_ip,test_ip)) ip_count++; | |||
} | |||
} | |||
return ip_count; | |||
} | |||
//--------------------------------------------- | |||
public OnPlayerConnect(playerid) | |||
{ | |||
new connecting_ip[32+1]; | |||
GetPlayerIp(playerid,connecting_ip,32); | |||
new num_players_on_ip = GetNumberOfPlayersOnThisIP(connecting_ip); | |||
if(num_players_on_ip > MAX_CONNECTIONS_FROM_IP) { | |||
printf("MAXIPs: Connecting player(%d) exceeded %d IP connections from %s.", playerid, MAX_CONNECTIONS_FROM_IP, connecting_ip); | |||
Kick(playerid); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//--------------------------------------------- | |||
@ -0,0 +1,53 @@ | |||
// Test menu functionality filterscipt | |||
#include <a_samp> | |||
#define TEST_MENU_ITEMS 6 | |||
new Menu:TestMenu; | |||
new TestMenuStrings[6][16] = {"Test1", "Test2", "Test3", "Test4", "Test5", "Test6"}; | |||
HandleTestMenuSelection(playerid, row) | |||
{ | |||
new s[256]; | |||
if(row < TEST_MENU_ITEMS) { | |||
format(s,256,"You selected item %s",TestMenuStrings[row]); | |||
SendClientMessage(playerid,0xFFFFFFFF,s); | |||
} | |||
} | |||
InitTestMenu() | |||
{ | |||
TestMenu = CreateMenu("Test Menu", 1, 200.0, 150.0, 200.0, 200.0); | |||
for(new x=0; x < TEST_MENU_ITEMS; x++) { | |||
AddMenuItem(TestMenu, 0, TestMenuStrings[x]); | |||
} | |||
} | |||
public OnFilterScriptInit() | |||
{ | |||
InitTestMenu(); | |||
} | |||
public OnPlayerSelectedMenuRow(playerid, row) | |||
{ | |||
new Menu:PlayerMenu = GetPlayerMenu(playerid); | |||
if(PlayerMenu == TestMenu) { | |||
HandleTestMenuSelection(playerid, row); | |||
} | |||
} | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
if(!strcmp(cmdtext, "/menutest", true)) { | |||
ShowMenuForPlayer(TestMenu, playerid); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
@ -0,0 +1,363 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new Modular House Objects | |||
// ------------------------------------------------------ | |||
// By Matite in February 2015 | |||
// | |||
// This script creates a Modular Island with Modular Houses just off the coast | |||
// in SF (near Jizzy's Nightclub). | |||
// | |||
// Warning... | |||
// This script uses a total of 205 player objects and enables the /mh teleport | |||
// command by default. | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP Include | |||
#include <a_samp> | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Used for chat text messages | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/mh", cmdtext, true, 3) == 0) | |||
{ | |||
// Set the player interior | |||
SetPlayerInterior(playerid, 0); | |||
// Check if the player is in any vehicle | |||
if (IsPlayerInAnyVehicle(playerid)) | |||
{ | |||
// In a Vehicle | |||
// ------------ | |||
// Set vehicle position and facing angle | |||
SetVehiclePos(GetPlayerVehicleID(playerid), -3305.72 + random(2), 1602.27 + random(2), 6.2); | |||
SetVehicleZAngle(GetPlayerVehicleID(playerid), 233); | |||
// Link vehicle to interior | |||
LinkVehicleToInterior(GetPlayerVehicleID(playerid), 0); | |||
} | |||
else | |||
{ | |||
// On Foot | |||
// ------- | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, -3305.72 + random(2), 1602.27 + random(2), 6.2); | |||
SetPlayerFacingAngle(playerid, 233); | |||
} | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Modular Houses!", 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(" |--- Modular Houses Filterscript by Matite"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 28th February 2015"); | |||
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)) | |||
{ | |||
// Create modular houses and island objects for the player | |||
// (so any player currently ingame does not have to rejoin for them | |||
// to appear when this filterscript is loaded) | |||
CreateMHObjects(i); | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Modular Houses Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Create modular houses and island objects for the player | |||
CreateMHObjects(playerid); | |||
// Exit here | |||
return 1; | |||
} | |||
CreateMHObjects(playerid) | |||
{ | |||
// Create variable | |||
new TempObjectNumber; | |||
// Create modular houses and island player objects (with draw distance of 999m) | |||
CreatePlayerObject(playerid,19867,-3233.1538,1472.8060,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19849,-3250.0000,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19539,-3343.1260,1608.7500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19855,-3250.0000,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19854,-3250.0000,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19856,-3250.0000,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19851,-3218.7495,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19850,-3281.2505,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19532,-3234.3757,1461.2500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19852,-3187.4990,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19853,-3187.4993,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19850,-3218.7498,1562.5000,4.0000,0.0000,0.0000,180.0000,999.0); | |||
CreatePlayerObject(playerid,19850,-3250.0002,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19532,-3304.3760,1531.2500,4.0000,-0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19532,-3164.3757,1531.2500,4.0000,-0.0000,0.0000,0.0000,999.0); | |||
// Create exterior building object and change roof tile texture | |||
TempObjectNumber = CreatePlayerObject(playerid,19854,-3218.7500,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
SetPlayerObjectMaterial(playerid, TempObjectNumber, 0, 5520, "BDupsHouse_LAe", "shingles3", 0); | |||
CreatePlayerObject(playerid,19855,-3218.7500,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19856,-3218.7500,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19856,-3187.5000,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19855,-3187.5000,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
// Create exterior building object and change roof tile texture | |||
TempObjectNumber = CreatePlayerObject(playerid,19854,-3187.5000,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
SetPlayerObjectMaterial(playerid, TempObjectNumber, 0, 5986, "chateau_lawn", "chatshade02_law", 0); | |||
CreatePlayerObject(playerid,19856,-3281.2500,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19855,-3281.2500,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
// Create exterior building object and change roof tile texture | |||
TempObjectNumber = CreatePlayerObject(playerid,19854,-3281.2500,1500.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
SetPlayerObjectMaterial(playerid, TempObjectNumber, 0, 6284, "bev_law2", "shinglegrey_la", 0); | |||
CreatePlayerObject(playerid,19849,-3281.2507,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
// Create exterior building object and change roof tile texture | |||
TempObjectNumber = CreatePlayerObject(playerid,19854,-3281.2507,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
SetPlayerObjectMaterial(playerid, TempObjectNumber, 0, 6283, "pierb_law2", "rooftiles2", 0); | |||
CreatePlayerObject(playerid,19855,-3281.2507,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19856,-3281.2507,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19532,-3234.3757,1601.2500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
// Create exterior building object and change roof tile texture | |||
TempObjectNumber = CreatePlayerObject(playerid,19854,-3250.0007,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
SetPlayerObjectMaterial(playerid, TempObjectNumber, 0, 13721, "mulhousclahills", "sjmlahus26", 0); | |||
CreatePlayerObject(playerid,19855,-3250.0007,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19856,-3250.0007,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19856,-3218.7507,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
// Create exterior building object and change roof tile texture | |||
TempObjectNumber = CreatePlayerObject(playerid,19854,-3218.7507,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
SetPlayerObjectMaterial(playerid, TempObjectNumber, 0, 3484, "vegashse5", "shingles1", 0); | |||
CreatePlayerObject(playerid,19855,-3218.7507,1562.5000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19542,-3031.8757,1531.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19529,-3094.3757,1531.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19536,-3343.1260,1531.2500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19542,-3374.3760,1531.2500,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19532,-3094.3757,1461.2500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19788,-3304.3760,1461.2500,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19532,-3094.3757,1601.2500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19535,-3164.3757,1601.2500,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19788,-3304.3760,1601.2500,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3031.8757,1461.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3031.8757,1601.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3374.3760,1601.2500,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3374.3760,1461.2500,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19543,-3343.1260,1461.2500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19543,-3343.1260,1601.2500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19542,-3094.3757,1608.7500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19542,-3234.3757,1608.7500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3304.3760,1608.7500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3164.3757,1608.7500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19540,-3031.8757,1608.7500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19540,-3374.3760,1608.7500,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19529,-3094.3757,1391.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19534,-3164.3757,1461.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19532,-3164.3757,1391.2500,4.0000,-0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19529,-3234.3757,1391.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19543,-3304.3757,1422.5000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19543,-3304.3757,1360.0000,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19542,-3234.3757,1328.7500,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19542,-3094.3757,1328.7500,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19542,-3031.8757,1391.2500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19540,-3031.8757,1328.7500,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3164.3757,1328.7500,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19541,-3304.3757,1328.7500,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19546,-3311.8757,1453.7500,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19539,-3311.8757,1360.0000,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19540,-3311.8757,1328.7500,4.0000,0.0000,0.0000,180.0000,999.0); | |||
CreatePlayerObject(playerid,19540,-3374.3760,1453.7500,4.0000,0.0000,0.0000,180.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1471.3014,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1476.3118,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1481.3260,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1486.3364,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1506.3838,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1501.3734,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1491.3488,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1496.3591,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1511.3954,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1516.4058,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1521.4200,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1526.4304,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1531.4427,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1536.4531,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1541.4674,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1546.4778,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1551.4934,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1556.5038,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1561.5181,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1566.5284,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1571.5409,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1576.5511,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1581.5654,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8906,1586.5758,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19865,-3171.8921,1591.2007,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19866,-3265.6252,1479.1422,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19866,-3265.6252,1474.1422,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19866,-3234.3748,1474.1422,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19866,-3234.3748,1479.1422,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19867,-3295.6548,1472.8060,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19867,-3264.4043,1472.8060,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,877,-3217.8623,1518.8107,5.6301,0.0000,0.0000,-46.0000,999.0); | |||
CreatePlayerObject(playerid,19867,-3201.9033,1472.8060,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19867,-3204.3455,1589.6940,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19867,-3235.5959,1589.6940,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19867,-3266.8464,1589.6940,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19857,-3282.5649,1489.4465,5.9775,0.0000,0.0000,85.0000,999.0); | |||
CreatePlayerObject(playerid,19858,-3251.3149,1489.4470,5.9780,0.0000,0.0000,85.0000,999.0); | |||
CreatePlayerObject(playerid,19859,-3220.0649,1489.4470,5.9780,0.0000,0.0000,85.0000,999.0); | |||
CreatePlayerObject(playerid,19860,-3188.8149,1489.4470,5.9780,0.0000,0.0000,85.0000,999.0); | |||
CreatePlayerObject(playerid,19857,-3217.4358,1573.0535,5.9775,0.0000,0.0000,-95.0000,999.0); | |||
CreatePlayerObject(playerid,19859,-3248.6858,1573.0535,5.9780,0.0000,0.0000,-95.0000,999.0); | |||
CreatePlayerObject(playerid,19860,-3279.9358,1573.0535,5.9780,0.0000,0.0000,-95.0000,999.0); | |||
CreatePlayerObject(playerid,19861,-3272.7583,1481.9060,6.4885,-85.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19862,-3241.5083,1483.8816,6.4880,-90.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19863,-3210.2583,1483.8196,6.4880,-90.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19864,-3179.0083,1483.8199,6.4880,-90.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19861,-3227.2424,1580.5940,6.4885,-85.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19862,-3258.4924,1578.5750,6.4635,-90.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19863,-3289.7424,1578.5652,6.4880,-90.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3315.4624,1593.7500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3312.8430,1591.1295,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3312.8430,1585.8579,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3312.8430,1580.5906,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3312.8430,1564.7810,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3312.8430,1570.0482,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3312.8430,1575.3198,4.0000,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3326.0046,1593.7500,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3315.4624,1562.1616,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3326.0046,1562.1616,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3328.6240,1564.7810,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3328.6240,1570.0482,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3328.6240,1575.3198,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3328.6240,1580.5906,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3328.6240,1585.8579,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3328.6240,1591.1295,4.0000,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,19868,-3320.7344,1562.1616,4.0000,0.0000,0.0000,-180.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3296.4019,1467.9758,7.8744,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3265.6252,1467.9758,7.8744,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3234.3757,1467.9758,7.8744,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3203.1243,1467.9758,7.8744,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3172.1250,1467.9758,7.8744,0.0000,0.0000,90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3204.2439,1594.5591,7.8744,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3234.3757,1594.5591,7.8744,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3265.6255,1594.5591,7.8744,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3296.7024,1594.5591,7.8744,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3172.4277,1594.5591,7.8744,0.0000,0.0000,-90.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3314.0095,1563.0968,7.8744,0.0000,0.0000,-45.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3327.6401,1563.3578,7.8744,0.0000,0.0000,-135.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3327.4702,1592.8082,7.8744,0.0000,0.0000,135.0000,999.0); | |||
CreatePlayerObject(playerid,1226,-3313.7534,1592.6093,7.8744,0.0000,0.0000,45.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3321.2837,1460.1271,8.1565,0.0000,0.0000,-136.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3321.2837,1478.6985,8.1565,0.0000,0.0000,-178.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3321.2837,1497.2699,8.1565,0.0000,0.0000,166.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3321.2837,1515.8413,8.1565,0.0000,0.0000,128.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3321.2837,1534.4127,8.1565,0.0000,0.0000,82.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3321.2837,1552.9843,8.1565,0.0000,0.0000,37.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3141.8879,1484.2739,8.1565,0.0000,0.0000,-136.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3141.8879,1502.8453,8.1565,0.0000,0.0000,-178.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3141.8879,1521.4167,8.1565,0.0000,0.0000,166.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3141.8879,1539.9882,8.1565,0.0000,0.0000,128.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3141.8879,1558.5596,8.1565,0.0000,0.0000,82.0000,999.0); | |||
CreatePlayerObject(playerid,762,-3141.8879,1577.1311,8.1565,0.0000,0.0000,37.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3174.4050,1591.4492,4.0000,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3202.9797,1478.9318,4.0000,0.0000,0.0000,82.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3293.6179,1528.0867,4.0000,0.0000,0.0000,-142.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3268.6069,1528.0867,4.0000,0.0000,0.0000,-81.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3280.7466,1528.0867,4.0000,0.0000,0.0000,-38.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3287.2175,1528.0867,4.0000,0.0000,0.0000,11.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3274.6274,1528.0867,4.0000,0.0000,0.0000,63.0000,999.0); | |||
CreatePlayerObject(playerid,808,-3234.3008,1584.7771,5.5884,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,808,-3206.2786,1528.3306,5.5884,0.0000,0.0000,-122.0000,999.0); | |||
CreatePlayerObject(playerid,808,-3231.6143,1528.3306,5.5884,0.0000,0.0000,-32.0000,999.0); | |||
CreatePlayerObject(playerid,885,-3231.0566,1534.4080,3.9827,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,885,-3206.9106,1534.4080,3.9827,0.0000,0.0000,69.0000,999.0); | |||
CreatePlayerObject(playerid,885,-3218.6855,1534.4080,3.9827,0.0000,0.0000,125.0000,999.0); | |||
CreatePlayerObject(playerid,628,-3248.2051,1487.5242,5.9592,0.0000,0.0000,-131.0000,999.0); | |||
CreatePlayerObject(playerid,628,-3226.1389,1523.6616,5.2747,0.0000,0.0000,-120.0000,999.0); | |||
CreatePlayerObject(playerid,628,-3223.3250,1525.0994,5.2747,0.0000,0.0000,-74.0000,999.0); | |||
CreatePlayerObject(playerid,628,-3223.4836,1522.1924,5.2747,0.0000,0.0000,-38.0000,999.0); | |||
CreatePlayerObject(playerid,628,-3220.8762,1574.8800,5.9524,0.0000,0.0000,28.0000,999.0); | |||
CreatePlayerObject(playerid,759,-3211.6606,1513.9496,4.0000,0.0000,0.0000,107.0000,999.0); | |||
CreatePlayerObject(playerid,624,-3264.0588,1529.2220,3.2300,0.0000,0.0000,15.0000,999.0); | |||
CreatePlayerObject(playerid,624,-3236.3870,1529.2220,3.2300,0.0000,0.0000,53.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3263.4792,1533.7153,4.4050,0.0000,0.0000,0.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3260.5073,1533.7153,4.4050,0.0000,0.0000,30.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3257.5352,1533.7153,4.4050,0.0000,0.0000,54.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3254.5632,1533.7153,4.4050,0.0000,0.0000,72.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3251.5913,1533.7153,4.4050,0.0000,0.0000,39.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3248.6191,1533.7153,4.4050,0.0000,0.0000,39.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3239.8359,1533.7153,4.4050,0.0000,0.0000,105.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3236.8638,1533.7153,4.4050,0.0000,0.0000,47.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3242.8079,1533.7153,4.4050,0.0000,0.0000,68.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3245.7319,1533.7153,4.4050,0.0000,0.0000,28.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3238.2627,1553.1128,4.4050,0.0000,0.0000,82.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3241.5566,1553.1128,4.4050,0.0000,0.0000,125.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3244.4338,1553.1128,4.4050,0.0000,0.0000,153.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3246.8398,1553.1128,4.4050,0.0000,0.0000,-179.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3249.6064,1553.1128,4.4050,0.0000,0.0000,-145.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3252.4700,1553.1128,4.4050,0.0000,0.0000,-96.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3255.2151,1553.1128,4.4050,0.0000,0.0000,-79.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3257.8047,1553.1128,4.4050,0.0000,0.0000,-32.0000,999.0); | |||
CreatePlayerObject(playerid,817,-3265.5815,1582.6428,4.4050,0.0000,0.0000,-14.0000,999.0); | |||
// Exit here | |||
return 1; | |||
} | |||
@ -0,0 +1,194 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new Modular Island Objects | |||
// ------------------------------------------------------- | |||
// By Matite in January 2015 | |||
// | |||
// This script creates a Modular Island just off the coast in SF (next to the | |||
// docks near the hospital). | |||
// | |||
// Warning... | |||
// This script uses a total of 87 player objects | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP Include | |||
#include <a_samp> | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
// Un-comment the OnPlayerCommandText callback below (remove the "/*" and the "*/") | |||
// to enable a simple teleport command (/mi) which teleports the player to | |||
// the modular island in SF. | |||
/* | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/mi", cmdtext, true, 3) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, -3343.57 + random(2), 194.34 + random(2), 6.2); | |||
SetPlayerFacingAngle(playerid, 315); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Modular Island!", 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(" |--- Modular Island Filterscript by Matite"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 12th January 2015"); | |||
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)) | |||
{ | |||
// Create modular island objects for the player | |||
// (so any player currently ingame does not have to rejoin for them | |||
// to appear when this filterscript is loaded) | |||
CreateMIObjects(i); | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Modular Island Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Create modular island objects for the player | |||
CreateMIObjects(playerid); | |||
// Exit here | |||
return 1; | |||
} | |||
CreateMIObjects(playerid) | |||
{ | |||
// Create modular island player objects (with draw distance of 599m) | |||
CreatePlayerObject(playerid,19529,-3130.000000,0.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19530,-3130.000000,140.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19531,-3130.000000,280.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3130.000000,70.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3130.000000,210.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19533,-3238.750000,210.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19534,-3200.000000,210.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3200.000000,280.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19534,-3200.000000,70.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3200.000000,140.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19534,-3200.000000,70.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3200.000000,0.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19535,-3277.500000,210.000000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3277.500000,140.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3277.500000,280.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3277.500000,0.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19535,-3277.500000,70.000000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19533,-3238.750000,70.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19536,-3238.750000,0.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19537,-3238.750000,140.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19538,-3238.750000,280.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3052.500000,0.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3052.500000,70.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19535,-3060.000000,70.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3060.000000,0.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3060.000000,140.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19535,-3060.000000,210.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3060.000000,280.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3052.500000,140.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3052.500000,210.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3052.500000,280.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3052.500000,-62.500000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3060.000000,-62.500000,4.000000,0.000000,0.000000,-90.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3130.000000,-62.500000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3200.000000,-62.500000,4.000000,0.000000,0.000000,-90.000000, 599.0); | |||
CreatePlayerObject(playerid,19539,-3238.750000,-62.500000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3277.500000,-62.500000,4.000000,0.000000,0.000000,-90.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3285.000000,-62.500000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3410.000488,0.000000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3285.000000,70.000000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3316.250000,210.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19546,-3285.000000,202.500000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3472.500000,342.500000,4.000000,0.000000,0.000000,450.000000, 599.0); | |||
CreatePlayerObject(playerid,19546,-3285.000000,0.000000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19546,-3285.000000,0.000000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3410.000000,0.000000,4.000000,0.000000,0.000000,450.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3472.500000,0.000000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3472.500000,0.000000,4.000000,0.000000,0.000000,450.000000, 599.0); | |||
CreatePlayerObject(playerid,19547,-3347.500000,280.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19539,-3285.000000,108.750000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3410.000000,202.500000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3378.750000,210.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3441.250000,210.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19536,-3441.250000,280.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3472.500000,202.500000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3472.500000,265.000000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3472.500000,335.000000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3410.000000,342.500000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19535,-3277.500000,350.000000,4.000000,0.000000,0.000000,270.000000, 599.0); | |||
CreatePlayerObject(playerid,19535,-3200.000000,350.000000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19535,-3060.000000,350.000000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19532,-3130.000000,350.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19533,-3238.750000,350.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19546,-3285.000000,342.500000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3285.000000,482.500000,4.000000,0.000000,0.000000,450.000000, 599.0); | |||
CreatePlayerObject(playerid,19542,-3222.500000,482.500000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19536,-3238.750000,420.000000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3285.000000,412.500000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3052.500000,350.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19540,-3052.500000,482.500000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19539,-3052.500000,388.750000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19539,-3083.750000,482.500000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3122.500000,482.500000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3137.500000,482.500000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19541,-3152.500000,482.500000,4.000000,0.000000,0.000000,90.000000, 599.0); | |||
CreatePlayerObject(playerid,19529,-3130.000000,420.000000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3277.500000,388.750000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3277.500000,451.250000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3200.000000,388.750000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3200.000000,451.250000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3060.000000,388.750000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19543,-3060.000000,451.250000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
CreatePlayerObject(playerid,19539,-3285.000000,451.250000,4.000000,0.000000,0.000000,180.000000, 599.0); | |||
CreatePlayerObject(playerid,19539,-3052.500000,451.250000,4.000000,0.000000,0.000000,0.000000, 599.0); | |||
// Exit here | |||
return 1; | |||
} | |||
@ -0,0 +1,70 @@ | |||
// | |||
// Admin netstats display | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define ADMINFS_MESSAGE_COLOR 0xFF444499 | |||
#define ADMIN_NETSTATS_DIALOGID 12898 | |||
new gNetStatsPlayerId = INVALID_PLAYER_ID; | |||
new gNetStatsTimerId = 0; | |||
forward NetStatsDisplay(); | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Admin Netstats FS loaded.\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public NetStatsDisplay() | |||
{ | |||
new netstats_str[2048+1]; | |||
GetNetworkStats(netstats_str, 2048); | |||
ShowPlayerDialog(gNetStatsPlayerId, ADMIN_NETSTATS_DIALOGID, DIALOG_STYLE_MSGBOX, "Server NetStats", netstats_str, "Ok", ""); | |||
} | |||
//------------------------------------------------ | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
if(!IsPlayerAdmin(playerid)) return 0; // this is an admin only script | |||
if(dialogid == ADMIN_NETSTATS_DIALOGID) { | |||
KillTimer(gNetStatsTimerId); | |||
gNetStatsPlayerId = INVALID_PLAYER_ID; | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new idx; | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
cmd = strtok(cmdtext, idx); | |||
// netstats command | |||
if(strcmp("/netstats", cmd, true) == 0) | |||
{ | |||
gNetStatsPlayerId = playerid; | |||
NetStatsDisplay(); | |||
gNetStatsTimerId = SetTimer("NetStatsDisplay", 3000, true); // this will refresh the display every 3 seconds | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,75 @@ | |||
//------------------------------------------------- | |||
// | |||
// Recording player data for NPC playback | |||
// Kye 2009 | |||
// | |||
//------------------------------------------------- | |||
#pragma tabsize 0 | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
#include "../include/gl_common.inc" | |||
//------------------------------------------------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256]; | |||
new idx; | |||
cmd = strtok(cmdtext, idx); | |||
if(!IsPlayerAdmin(playerid)) return 0; // this is an admin only script | |||
// Start recording vehicle data (/vrecord recording_name[]) | |||
// Find the recording_name[] file in /scriptfiles/ | |||
if(strcmp(cmd, "/vrecord", true) == 0) { | |||
new tmp[512]; | |||
tmp = strtok(cmdtext, idx); | |||
if(!strlen(tmp)) { | |||
SendClientMessage(playerid,0xFF0000FF,"Usage: /vrecord {name}"); | |||
return 1; | |||
} | |||
if(!IsPlayerInAnyVehicle(playerid)) { | |||
SendClientMessage(playerid,0xFF0000FF,"Recording: Get in a vehicle."); | |||
return 1; | |||
} | |||
StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,tmp); | |||
SendClientMessage(playerid,0xFF0000FF,"Recording: started."); | |||
return 1; | |||
} | |||
// Start recording onfoot data (/ofrecord recording_name[]) | |||
// Find the recording_name[] file in /scriptfiles/ | |||
if(strcmp(cmd, "/ofrecord", true) == 0) { | |||
new tmp[512]; | |||
tmp = strtok(cmdtext, idx); | |||
if(!strlen(tmp)) { | |||
SendClientMessage(playerid,0xFF0000FF,"Usage: /ofrecord {name}"); | |||
return 1; | |||
} | |||
if(IsPlayerInAnyVehicle(playerid)) { | |||
SendClientMessage(playerid,0xFF0000FF,"Recording: Leave the vehicle and reuse the command."); | |||
return 1; | |||
} | |||
StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,tmp); | |||
SendClientMessage(playerid,0xFF0000FF,"Recording: started."); | |||
return 1; | |||
} | |||
// Stop recording any data | |||
if(strcmp(cmd, "/stoprecord", true) == 0) { | |||
StopRecordingPlayerData(playerid); | |||
SendClientMessage(playerid,0xFF0000FF,"Recording: stopped."); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------- | |||
// EOF | |||
@ -0,0 +1,416 @@ | |||
// | |||
// Admin spawner using previews. For SA-MP 0.3x and above. | |||
// - Kye 2012 | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define TOTAL_ITEMS 20000 | |||
#define SELECTION_ITEMS 21 | |||
#define ITEMS_PER_LINE 7 | |||
#define HEADER_TEXT "Objects" | |||
#define NEXT_TEXT "Next" | |||
#define PREV_TEXT "Prev" | |||
#define DIALOG_BASE_X 75.0 | |||
#define DIALOG_BASE_Y 130.0 | |||
#define DIALOG_WIDTH 550.0 | |||
#define DIALOG_HEIGHT 180.0 | |||
#define SPRITE_DIM_X 60.0 | |||
#define SPRITE_DIM_Y 70.0 | |||
new gTotalItems = TOTAL_ITEMS; | |||
new PlayerText:gBackgroundTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gNextButtonTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gPrevButtonTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gSelectionItems[MAX_PLAYERS][SELECTION_ITEMS]; | |||
new PlayerText:gCurrentPageTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gHeaderTextDrawId[MAX_PLAYERS]; | |||
new gSelectionItemsTag[MAX_PLAYERS][SELECTION_ITEMS]; | |||
new gItemAt[MAX_PLAYERS]; | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Admin Vehicle Spawner Loaded\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
GetNumberOfPages() | |||
{ | |||
if((gTotalItems >= SELECTION_ITEMS) && (gTotalItems % SELECTION_ITEMS) == 0) | |||
{ | |||
return (gTotalItems / SELECTION_ITEMS); | |||
} | |||
else return (gTotalItems / SELECTION_ITEMS) + 1; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreateCurrentPageTextDraw(playerid, Float:Xpos, Float:Ypos) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, "0/0"); | |||
PlayerTextDrawUseBox(playerid, txtInit, 0); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1); | |||
PlayerTextDrawFont(playerid, txtInit, 1); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); | |||
PlayerTextDrawSetOutline(playerid, txtInit, 1); | |||
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF); | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
// Creates a button textdraw and returns the textdraw ID. | |||
PlayerText:CreatePlayerDialogButton(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height, button_text[]) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, button_text); | |||
PlayerTextDrawUseBox(playerid, txtInit, 1); | |||
PlayerTextDrawBoxColor(playerid, txtInit, 0x000000FF); | |||
PlayerTextDrawBackgroundColor(playerid, txtInit, 0x000000FF); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1); | |||
PlayerTextDrawFont(playerid, txtInit, 1); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); // no shadow | |||
PlayerTextDrawSetOutline(playerid, txtInit, 0); | |||
PlayerTextDrawColor(playerid, txtInit, 0x4A5A6BFF); | |||
PlayerTextDrawSetSelectable(playerid, txtInit, 1); | |||
PlayerTextDrawAlignment(playerid, txtInit, 2); | |||
PlayerTextDrawTextSize(playerid, txtInit, Height, Width); // The width and height are reversed for centering.. something the game does <g> | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreatePlayerHeaderTextDraw(playerid, Float:Xpos, Float:Ypos, header_text[]) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, header_text); | |||
PlayerTextDrawUseBox(playerid, txtInit, 0); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 1.25, 3.0); | |||
PlayerTextDrawFont(playerid, txtInit, 0); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); | |||
PlayerTextDrawSetOutline(playerid, txtInit, 1); | |||
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF); | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreatePlayerBackgroundTextDraw(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height) | |||
{ | |||
new PlayerText:txtBackground = CreatePlayerTextDraw(playerid, Xpos, Ypos, | |||
" ~n~"); // enough space for everyone | |||
PlayerTextDrawUseBox(playerid, txtBackground, 1); | |||
PlayerTextDrawBoxColor(playerid, txtBackground, 0x4A5A6BBB); | |||
PlayerTextDrawLetterSize(playerid, txtBackground, 5.0, 5.0); | |||
PlayerTextDrawFont(playerid, txtBackground, 0); | |||
PlayerTextDrawSetShadow(playerid, txtBackground, 0); | |||
PlayerTextDrawSetOutline(playerid, txtBackground, 0); | |||
PlayerTextDrawColor(playerid, txtBackground,0xFFFFFFFF); | |||
PlayerTextDrawTextSize(playerid, txtBackground, Width, Height); | |||
PlayerTextDrawBackgroundColor(playerid, txtBackground, 0x4A5A6BBB); | |||
PlayerTextDrawShow(playerid, txtBackground); | |||
return txtBackground; | |||
} | |||
//------------------------------------------------ | |||
// Creates a model preview sprite | |||
PlayerText:CreateModelPreviewTextDraw(playerid, modelindex, Float:Xpos, Float:Ypos, Float:width, Float:height) | |||
{ | |||
new PlayerText:txtPlayerSprite = CreatePlayerTextDraw(playerid, Xpos, Ypos, ""); // it has to be set with SetText later | |||
PlayerTextDrawFont(playerid, txtPlayerSprite, TEXT_DRAW_FONT_MODEL_PREVIEW); | |||
PlayerTextDrawColor(playerid, txtPlayerSprite, 0xFFFFFFFF); | |||
PlayerTextDrawBackgroundColor(playerid, txtPlayerSprite, 0x88888899); | |||
PlayerTextDrawTextSize(playerid, txtPlayerSprite, width, height); // Text size is the Width:Height | |||
PlayerTextDrawSetPreviewModel(playerid, txtPlayerSprite, modelindex); | |||
if(modelindex > 319) { | |||
PlayerTextDrawSetPreviewRot(playerid,txtPlayerSprite, -15.0, 0.0, 0.0); | |||
} | |||
PlayerTextDrawSetSelectable(playerid, txtPlayerSprite, 1); | |||
PlayerTextDrawShow(playerid,txtPlayerSprite); | |||
return txtPlayerSprite; | |||
} | |||
//------------------------------------------------ | |||
DestroyPlayerModelPreviews(playerid) | |||
{ | |||
new x=0; | |||
while(x != SELECTION_ITEMS) { | |||
if(gSelectionItems[playerid][x] != PlayerText:INVALID_TEXT_DRAW) { | |||
PlayerTextDrawDestroy(playerid, gSelectionItems[playerid][x]); | |||
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
x++; | |||
} | |||
} | |||
//------------------------------------------------ | |||
ShowPlayerModelPreviews(playerid) | |||
{ | |||
new x=0; | |||
new Float:BaseX = DIALOG_BASE_X; | |||
new Float:BaseY = DIALOG_BASE_Y - (SPRITE_DIM_Y * 0.33); // down a bit | |||
new linetracker = 0; | |||
new itemat = GetPVarInt(playerid, "ospawner_page") * SELECTION_ITEMS; | |||
// Destroy any previous ones created | |||
DestroyPlayerModelPreviews(playerid); | |||
while(x != SELECTION_ITEMS && itemat < gTotalItems) { | |||
if(linetracker == 0) { | |||
BaseX = DIALOG_BASE_X + 25.0; // in a bit from the box | |||
BaseY += SPRITE_DIM_Y + 1.0; // move on the Y for the next line | |||
} | |||
gSelectionItems[playerid][x] = CreateModelPreviewTextDraw(playerid, itemat, BaseX, BaseY, SPRITE_DIM_X, SPRITE_DIM_Y); | |||
gSelectionItemsTag[playerid][x] = itemat; | |||
BaseX += SPRITE_DIM_X + 1.0; // move on the X for the next sprite | |||
linetracker++; | |||
if(linetracker == ITEMS_PER_LINE) linetracker = 0; | |||
itemat++; | |||
x++; | |||
} | |||
} | |||
//------------------------------------------------ | |||
UpdatePageTextDraw(playerid) | |||
{ | |||
new PageText[64+1]; | |||
format(PageText, 64, "%d/%d", GetPVarInt(playerid,"ospawner_page") + 1, GetNumberOfPages()); | |||
PlayerTextDrawSetString(playerid, gCurrentPageTextDrawId[playerid], PageText); | |||
} | |||
//------------------------------------------------ | |||
CreateSelectionMenu(playerid) | |||
{ | |||
gBackgroundTextDrawId[playerid] = CreatePlayerBackgroundTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y + 20.0, DIALOG_WIDTH, DIALOG_HEIGHT); | |||
gHeaderTextDrawId[playerid] = CreatePlayerHeaderTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y, HEADER_TEXT); | |||
gCurrentPageTextDrawId[playerid] = CreateCurrentPageTextDraw(playerid, DIALOG_WIDTH - 50.0, DIALOG_BASE_Y + 15.0); | |||
gNextButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, NEXT_TEXT); | |||
gPrevButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 90.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, PREV_TEXT); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
} | |||
//------------------------------------------------ | |||
DestroySelectionMenu(playerid) | |||
{ | |||
DestroyPlayerModelPreviews(playerid); | |||
PlayerTextDrawDestroy(playerid, gHeaderTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gBackgroundTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gCurrentPageTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gNextButtonTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gPrevButtonTextDrawId[playerid]); | |||
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
//------------------------------------------------ | |||
SpawnVehicle_InfrontOfPlayer(playerid, vehiclemodel, color1, color2) | |||
{ | |||
new Float:x,Float:y,Float:z; | |||
new Float:facing; | |||
new Float:distance; | |||
GetPlayerPos(playerid, x, y, z); | |||
GetPlayerFacingAngle(playerid, facing); | |||
new Float:size_x,Float:size_y,Float:size_z; | |||
GetVehicleModelInfo(vehiclemodel, VEHICLE_MODEL_INFO_SIZE, size_x, size_y, size_z); | |||
distance = size_x + 0.5; | |||
x += (distance * floatsin(-facing, degrees)); | |||
y += (distance * floatcos(-facing, degrees)); | |||
facing += 90.0; | |||
if(facing > 360.0) facing -= 360.0; | |||
return CreateVehicle(vehiclemodel, x, y, z + (size_z * 0.25), facing, color1, color2, -1); | |||
} | |||
//------------------------------------------------ | |||
SpawnObject_InfrontOfPlayer(playerid, model) | |||
{ | |||
new Float:x,Float:y,Float:z; | |||
new Float:facing; | |||
new Float:distance; | |||
GetPlayerPos(playerid, x, y, z); | |||
GetPlayerFacingAngle(playerid, facing); | |||
distance = 5.0; | |||
x += (distance * floatsin(-facing, degrees)); | |||
y += (distance * floatcos(-facing, degrees)); | |||
facing += 90.0; | |||
if(facing > 360.0) facing -= 360.0; | |||
return CreateObject(model, x, y, z, 0.0, 0.0, 0.0, 300.0); | |||
} | |||
//------------------------------------------------ | |||
HandlePlayerItemSelection(playerid, selecteditem) | |||
{ | |||
if(gSelectionItemsTag[playerid][selecteditem] >= 0 && gSelectionItemsTag[playerid][selecteditem] < 319) { | |||
SetPlayerSkin(playerid, gSelectionItemsTag[playerid][selecteditem]); | |||
return; | |||
} | |||
if(gSelectionItemsTag[playerid][selecteditem] >= 400 && gSelectionItemsTag[playerid][selecteditem] < 612) { | |||
// In this case we're spawning a vehicle for them | |||
SpawnVehicle_InfrontOfPlayer(playerid, gSelectionItemsTag[playerid][selecteditem], -1, -1); | |||
return; | |||
} | |||
if(gSelectionItemsTag[playerid][selecteditem] > 615) { | |||
new objectid = SpawnObject_InfrontOfPlayer(playerid, gSelectionItemsTag[playerid][selecteditem]); | |||
EditObject(playerid, objectid); | |||
return; | |||
} | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Init all of the textdraw related globals | |||
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
new x=0; | |||
while(x != SELECTION_ITEMS) { | |||
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW; | |||
x++; | |||
} | |||
gItemAt[playerid] = 0; | |||
return 1; // Allow other scripts to keep processing OnPlayerConnect | |||
} | |||
//------------------------------------------- | |||
// Even though only Player* textdraws are used in this script, | |||
// OnPlayerClickTextDraw is still required to handle ESC | |||
public OnPlayerClickTextDraw(playerid, Text:clickedid) | |||
{ | |||
if(GetPVarInt(playerid, "ospawner_active") == 0) return 0; | |||
// Handle: They cancelled (with ESC) | |||
if(clickedid == Text:INVALID_TEXT_DRAW) { | |||
DestroySelectionMenu(playerid); | |||
SetPVarInt(playerid, "ospawner_active", 0); | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid) | |||
{ | |||
if(GetPVarInt(playerid, "ospawner_active") == 0) return 0; | |||
new curpage = GetPVarInt(playerid, "ospawner_page"); | |||
// Handle: next button | |||
if(playertextid == gNextButtonTextDrawId[playerid]) { | |||
if(curpage < (GetNumberOfPages() - 1)) { | |||
SetPVarInt(playerid, "ospawner_page", curpage + 1); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0); | |||
} else { | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
} | |||
return 1; | |||
} | |||
// Handle: previous button | |||
if(playertextid == gPrevButtonTextDrawId[playerid]) { | |||
if(curpage > 0) { | |||
SetPVarInt(playerid, "ospawner_page", curpage - 1); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0); | |||
} else { | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
} | |||
return 1; | |||
} | |||
// Search in the array of textdraws used for the items | |||
new x=0; | |||
while(x != SELECTION_ITEMS) { | |||
if(playertextid == gSelectionItems[playerid][x]) { | |||
DestroySelectionMenu(playerid); | |||
CancelSelectTextDraw(playerid); | |||
HandlePlayerItemSelection(playerid, x); | |||
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0); | |||
SetPVarInt(playerid, "ospawner_active", 0); | |||
return 1; | |||
} | |||
x++; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new idx; | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
cmd = strtok(cmdtext, idx); | |||
if(strcmp("/ospawner", cmd, true) == 0) | |||
{ | |||
// If there was a previously created selection menu, destroy it | |||
DestroySelectionMenu(playerid); | |||
SetPVarInt(playerid, "ospawner_active", 1); | |||
SetPVarInt(playerid, "ospawner_page", 1); | |||
CreateSelectionMenu(playerid); | |||
SelectTextDraw(playerid, 0xACCBF1FF); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,177 @@ | |||
// | |||
// Used for testing interpolated rotations with MoveObject | |||
// Also used to test AttachObjectToObject | |||
// A pirate ship goes around and visits some route points | |||
// | |||
// SA-MP 0.3d and above | |||
// | |||
// - Kye 2011 | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" // for PlaySoundForPlayersInRange() | |||
#define NUM_SHIP_ROUTE_POINTS 25 | |||
#define SHIP_OBJECT_ID 8493 // pirate ship | |||
#define SHIP_SKULL_ATTACH 3524 | |||
#define SHIP_RAILS_ATTACH 9159 | |||
#define SHIP_LINES_ATTACH 8981 | |||
#define SHIP_MOVE_SPEED 10.0 | |||
#define SHIP_DRAW_DISTANCE 800.0 | |||
// Pirate ship route points (position/rotation) | |||
new Float:gShipRoutePoints[NUM_SHIP_ROUTE_POINTS][6] = { | |||
{-2389.81, 1434.84, 13.51, 0.00, 0.0, -87.36}, | |||
{-2319.54, 1450.75, 13.91, 1.0, 0.0, -71.70}, | |||
{-2245.87, 1479.80, 14.21, 5.00, 0.0, -63.84}, | |||
{-2168.53, 1535.31, 15.73, 1.00, 0.0, -50.76}, | |||
{-2096.43, 1634.13, 15.73, 0.00, 0.0, -36.60}, | |||
{-2036.11, 1734.57, 15.27, -1.00, 0.0, -20.22}, | |||
{-2018.20, 1841.61, 15.27, -5.00, 0.00, -4.86}, | |||
{-2043.70, 1936.95, 15.27, -1.00, 0.00, 25.32}, | |||
{-2104.07, 2023.54, 12.78, 0.00, 0.00, 49.14}, | |||
{-2206.40, 2065.64, 16.76, 1.00, 0.00, 73.32}, | |||
{-2298.24, 2070.62, 14.59, 5.00, 0.00, 91.62}, | |||
{-2412.24, 2067.55, 14.59, 1.00, 0.00, 91.62}, | |||
{-2528.28, 2057.22, 12.30, 0.00, 0.00, 99.78}, | |||
{-2626.64, 2032.14, 17.04, -1.00, 0.00, 106.98}, | |||
{-2727.60, 1996.95, 15.36, -5.00, 0.00, 106.98}, | |||
{-2808.88, 1953.08, 15.36, -1.00, 0.00, 121.62}, | |||
{-2886.19, 1876.19, 16.68, 0.00, 0.00, 143.16}, | |||
{-2911.09, 1782.21, 16.68, -1.00, 0.00, 173.34}, | |||
{-2898.36, 1678.83, 14.88, 0.00, 0.00, 194.58}, | |||
{-2851.29, 1601.46, 16.13, 1.00, 0.00, 228.42}, | |||
{-2760.72, 1557.18, 16.13, 0.00, 0.00, 257.52}, | |||
{-2665.41, 1535.22, 16.13, -1.00, 0.00, 257.52}, | |||
{-2589.06, 1509.08, 16.13, 0.00, 0.00, 239.88}, | |||
{-2517.74, 1463.39, 14.59, 1.00, 0.00, 243.78}, | |||
{-2456.12, 1441.11, 14.59, 0.00, 0.00, 254.76} | |||
}; | |||
new gShipCurrentPoint = 1; // current route point the ship is at | |||
// SA-MP objects | |||
new gMainShipObjectId; | |||
new gShipSkullAttachment[4]; | |||
new gShipRailsAttachment; | |||
new gShipLinesAttachment; | |||
forward StartMovingTimer(); | |||
//------------------------------------------------- | |||
public StartMovingTimer() | |||
{ | |||
MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2], | |||
SHIP_MOVE_SPEED / 4.0, // bit slower for the first point | |||
gShipRoutePoints[gShipCurrentPoint][3], | |||
gShipRoutePoints[gShipCurrentPoint][4], | |||
gShipRoutePoints[gShipCurrentPoint][5]); | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptInit() | |||
{ | |||
gMainShipObjectId = CreateObject(SHIP_OBJECT_ID, gShipRoutePoints[0][0], gShipRoutePoints[0][1], gShipRoutePoints[0][2], | |||
gShipRoutePoints[0][3], gShipRoutePoints[0][4], gShipRoutePoints[0][5], SHIP_DRAW_DISTANCE); | |||
gShipSkullAttachment[0] = CreateObject(SHIP_SKULL_ATTACH, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); | |||
AttachObjectToObject(gShipSkullAttachment[0], gMainShipObjectId, 4.11, -5.53, -9.78, 0.0, 0.0, 90.0); | |||
gShipSkullAttachment[1] = CreateObject(SHIP_SKULL_ATTACH, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); | |||
AttachObjectToObject(gShipSkullAttachment[1], gMainShipObjectId, -4.11, -5.53, -9.78, 0.0, 0.0, -90.0); | |||
gShipSkullAttachment[2] = CreateObject(SHIP_SKULL_ATTACH, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); | |||
AttachObjectToObject(gShipSkullAttachment[2], gMainShipObjectId, -4.3378, -15.2887, -9.7863, 0.0, 0.0, -90.0); | |||
gShipSkullAttachment[3] = CreateObject(SHIP_SKULL_ATTACH, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); | |||
AttachObjectToObject(gShipSkullAttachment[3], gMainShipObjectId, 4.3378, -15.2887, -9.7863, 0.0, 0.0, 90.0); | |||
gShipRailsAttachment = CreateObject(SHIP_RAILS_ATTACH, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); | |||
AttachObjectToObject(gShipRailsAttachment, gMainShipObjectId, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); | |||
gShipLinesAttachment = CreateObject(SHIP_LINES_ATTACH, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); | |||
AttachObjectToObject(gShipLinesAttachment, gMainShipObjectId, -0.5468, -6.1875, -0.4375, 0.0, 0.0, 0.0); | |||
SetTimer("StartMovingTimer",30*1000,0); // pause at route 0 for 30 seconds | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnFilterScriptExit() | |||
{ | |||
new x=0; | |||
DestroyObject(gMainShipObjectId); | |||
x=0; | |||
while(x != 4) { | |||
DestroyObject(gShipSkullAttachment[x]); | |||
x++; | |||
} | |||
DestroyObject(gShipRailsAttachment); | |||
DestroyObject(gShipLinesAttachment); | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
public OnObjectMoved(objectid) | |||
{ | |||
if(objectid != gMainShipObjectId) return 0; | |||
if(gShipCurrentPoint > 0 && !(gShipCurrentPoint % 3)) { | |||
// play some seagulls audio every 3 points | |||
PlaySoundForPlayersInRange(6200, 100.0, gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2]); | |||
} | |||
gShipCurrentPoint++; | |||
if(gShipCurrentPoint == NUM_SHIP_ROUTE_POINTS) { | |||
gShipCurrentPoint = 0; | |||
MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2], | |||
SHIP_MOVE_SPEED / 4.0, // slower for the last route | |||
gShipRoutePoints[gShipCurrentPoint][3], | |||
gShipRoutePoints[gShipCurrentPoint][4], | |||
gShipRoutePoints[gShipCurrentPoint][5]); | |||
return 1; | |||
} | |||
if(gShipCurrentPoint == 1) { | |||
// Before heading to the first route we should wait a bit | |||
SetTimer("StartMovingTimer",30*1000,0); // pause at route 0 for 30 seconds | |||
return 1; | |||
} | |||
/* | |||
new tempdebug[256+1]; | |||
format(tempdebug,256,"The ship is at route: %d", gShipCurrentPoint); | |||
SendClientMessageToAll(0xFFFFFFFF,tempdebug);*/ | |||
MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], | |||
gShipRoutePoints[gShipCurrentPoint][1], | |||
gShipRoutePoints[gShipCurrentPoint][2], | |||
SHIP_MOVE_SPEED, | |||
gShipRoutePoints[gShipCurrentPoint][3], | |||
gShipRoutePoints[gShipCurrentPoint][4], | |||
gShipRoutePoints[gShipCurrentPoint][5]); | |||
return 1; | |||
} | |||
//------------------------------------------------- | |||
@ -0,0 +1,78 @@ | |||
// | |||
// Admin player netstats display | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define ADMINFS_MESSAGE_COLOR 0xFF444499 | |||
#define ADMIN_NETSTATS_DIALOGID 12898 | |||
new gNetStatsPlayerId = INVALID_PLAYER_ID; | |||
new gNetStatsDisplayId = INVALID_PLAYER_ID; | |||
new gNetStatsTimerId = 0; | |||
forward NetStatsDisplay(); | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Admin Netstats FS loaded.\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public NetStatsDisplay() | |||
{ | |||
new netstats_str[2048+1]; | |||
GetPlayerNetworkStats(gNetStatsDisplayId, netstats_str, 2048); | |||
ShowPlayerDialog(gNetStatsPlayerId, ADMIN_NETSTATS_DIALOGID, DIALOG_STYLE_MSGBOX, "Player NetStats", netstats_str, "Ok", ""); | |||
} | |||
//------------------------------------------------ | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
if(!IsPlayerAdmin(playerid)) return 0; // this is an admin only script | |||
if(dialogid == ADMIN_NETSTATS_DIALOGID) { | |||
KillTimer(gNetStatsTimerId); | |||
gNetStatsPlayerId = INVALID_PLAYER_ID; | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new idx; | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
cmd = strtok(cmdtext, idx); | |||
// netstats command | |||
if(strcmp("/pnetstats", cmd, true) == 0) | |||
{ | |||
new tmp[128]; | |||
tmp = strtok(cmdtext, idx); | |||
if(!strlen(tmp)) { return 1; } | |||
gNetStatsPlayerId = playerid; | |||
gNetStatsDisplayId = strval(tmp); | |||
NetStatsDisplay(); | |||
gNetStatsTimerId = SetTimer("NetStatsDisplay", 3000, true); // this will refresh the display every 3 seconds | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,99 @@ | |||
// | |||
// Admin player netstats display | |||
// Using NetStats_* functions. | |||
// | |||
// -Rcon login admin then: | |||
// /pnetstats2 (playerid) | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define ADMINFS_MESSAGE_COLOR 0xFF444499 | |||
#define ADMIN_NETSTATS_DIALOGID 12899 | |||
new gNetStatsPlayerId = INVALID_PLAYER_ID; | |||
new gNetStatsDisplayId = INVALID_PLAYER_ID; | |||
new gNetStatsTimerId = 0; | |||
forward NetStatsDisplay(); | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Admin Netstats FS loaded.\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
BuildPlayerNetstatString(playerid, ret_str[], ret_str_len) | |||
{ | |||
new szPlayerIpPort[64+1]; | |||
NetStats_GetIpPort(playerid, szPlayerIpPort, 64); | |||
format(ret_str, ret_str_len, "IP_Port: %s\nConnected Time (ms): %d\nConnection Status: %d\nPacket Loss: %.2f\nMessages Recv: %d\nMessages Sent: %d\nMessages/sec: %d", | |||
szPlayerIpPort, | |||
NetStats_GetConnectedTime(playerid), | |||
NetStats_ConnectionStatus(playerid), | |||
NetStats_PacketLossPercent(playerid), | |||
NetStats_MessagesReceived(playerid), | |||
NetStats_MessagesSent(playerid), | |||
NetStats_MessagesRecvPerSecond(playerid)); | |||
} | |||
//------------------------------------------------ | |||
public NetStatsDisplay() | |||
{ | |||
new netstats_str[1024+1]; | |||
BuildPlayerNetstatString(gNetStatsDisplayId, netstats_str, 1024); | |||
ShowPlayerDialog(gNetStatsPlayerId, ADMIN_NETSTATS_DIALOGID, DIALOG_STYLE_MSGBOX, "Player NetStats", netstats_str, "Ok", ""); | |||
} | |||
//------------------------------------------------ | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
if(!IsPlayerAdmin(playerid)) return 0; // this is an admin only script | |||
if(dialogid == ADMIN_NETSTATS_DIALOGID) { | |||
KillTimer(gNetStatsTimerId); | |||
gNetStatsPlayerId = INVALID_PLAYER_ID; | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new idx; | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
cmd = strtok(cmdtext, idx); | |||
// netstats command | |||
if(strcmp("/pnetstats2", cmd, true) == 0) | |||
{ | |||
new tmp[128]; | |||
tmp = strtok(cmdtext, idx); | |||
if(!strlen(tmp)) { return 1; } | |||
gNetStatsPlayerId = playerid; | |||
gNetStatsDisplayId = strval(tmp); | |||
NetStatsDisplay(); | |||
gNetStatsTimerId = SetTimer("NetStatsDisplay", 3000, true); // this will refresh the display every 3 seconds | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,212 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new Safe with Door | |||
// ----------------------------------------------- | |||
// By Matite in January 2015 | |||
// | |||
// v1.0.1 | |||
// * Inital release in RC1 | |||
// | |||
// v1.0.2 | |||
// * Changed the Z offset in the MoveObject parameters to fix an issue with | |||
// movement caused by rounding on some PCs | |||
// | |||
// This script removes the existing safe in Madd Dogg's Mansion then creates the | |||
// new safe and door object in its place. You can then use commands to open and | |||
// close the safe door. | |||
// | |||
// You can use the following commands: | |||
// * /safe = Teleports the player to the safe in Madd Dogg's Mansion | |||
// * /openopen = Makes the safe door open | |||
// * /closesafe = Makes the safe door close | |||
// | |||
// Warning... | |||
// This script uses a total of 2 objects | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// ------------------------------------------------------------------------------ | |||
// Defines | |||
// ------- | |||
// Safe door status | |||
#define SAFE_DOOR_OPEN (1) | |||
#define SAFE_DOOR_CLOSED (0) | |||
// ------------------------------------------------------------------------------ | |||
// Variables | |||
// --------- | |||
// Stores the created object number of the safe | |||
new SafeObject; | |||
// Stores the created object number of the safe door | |||
new SafeDoorObject; | |||
// Tracks the status of the safe door (ie whether it is open or closed) | |||
new SafeDoorStatus = SAFE_DOOR_CLOSED; | |||
// ------------------------------------------------------------------------------ | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/safe", cmdtext, true, 5) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 5); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, 1230.61, -808.15, 1084.1); | |||
SetPlayerFacingAngle(playerid, 0); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Safe And Door!", 3000, 3); | |||
// Exit here | |||
return 1; | |||
} | |||
else if (strcmp("/opensafe", cmdtext, true, 9) == 0) | |||
{ | |||
// Check if the safe door is already open | |||
if (SafeDoorStatus == SAFE_DOOR_OPEN) | |||
{ | |||
// Send a gametext message to the player and exit here | |||
GameTextForPlayer(playerid, "~r~~h~Safe Door~n~~r~~h~Already Open!", 3000, 3); | |||
return 1; | |||
} | |||
// Animate the safe door opening (the small Z offset is required) | |||
MoveObject(SafeDoorObject, 1230.225708, -806.648803, 1083.5 + 0.01, 0.005, 0, 0, 280); | |||
// Set the safe door status | |||
SafeDoorStatus = SAFE_DOOR_OPEN; | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Safe Door Opened!", 3000, 3); | |||
// Exit here | |||
return 1; | |||
} | |||
else if (strcmp("/closesafe", cmdtext, true, 10) == 0) | |||
{ | |||
// Check if the safe door is already open | |||
if (SafeDoorStatus == SAFE_DOOR_CLOSED) | |||
{ | |||
// Send a gametext message to the player and exit here | |||
GameTextForPlayer(playerid, "~r~~h~Safe Door~n~~r~~h~Already Closed!", 3000, 3); | |||
return 1; | |||
} | |||
// Animate the safe door closing (the small Z offset is required) | |||
MoveObject(SafeDoorObject, 1230.225708, -806.648803, 1083.5 - 0.01, 0.005, 0, 0, 0); | |||
// Set the safe door status | |||
SafeDoorStatus = SAFE_DOOR_CLOSED; | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Safe Door Closed!", 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(" |--- Safe and Door Filterscript by Matite"); | |||
print(" |-- Script v1.02"); | |||
print(" |-- 13th February 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create the safe object | |||
SafeObject = CreateObject(19618, 1230.646118, -806.418823, 1083.5, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Safe object created"); | |||
// Create the safe door object | |||
SafeDoorObject = CreateObject(19619, 1230.225708, -806.648803, 1083.5 - 0.01, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- Safe door object created"); | |||
print(" |---------------------------------------------------"); | |||
// Loop | |||
for (new i = 0; i < MAX_PLAYERS; i++) | |||
{ | |||
// Check if the player is connected and is not a NPC | |||
if (IsPlayerConnected(i) && !IsPlayerNPC(i)) | |||
{ | |||
// Remove default GTASA safe object in Madd Dogg's Mansion office | |||
// (we do this now incase the filterscipt was loaded after the player joined) | |||
RemoveBuildingForPlayer(i, 2332, 1230.646118, -806.418823, 1083.5, 10.0); | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(SafeObject)) | |||
{ | |||
// Destroy the safe object | |||
DestroyObject(SafeObject); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Safe object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(SafeDoorObject)) | |||
{ | |||
// Destroy the safe door object | |||
DestroyObject(SafeDoorObject); | |||
// Display information in the Server Console | |||
print(" |-- Safe door object destroyed"); | |||
} | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- Safe and Door Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA safe object in Madd Dogg's Mansion office | |||
RemoveBuildingForPlayer(playerid, 2332, 1230.646118, -806.418823, 1083.5, 10.0); | |||
// Exit here | |||
return 1; | |||
} | |||
@ -0,0 +1,65 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new SA-MP Animations | |||
// ------------------------------------------------- | |||
// By Matite in January 2015 | |||
// | |||
// This script tests the new SA-MP animation/pose inside the SAMP.ifp file. | |||
// | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// ------------------------------------------------------------------------------ | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/fish", cmdtext, true, 5) == 0) | |||
{ | |||
// Apply animation | |||
ApplyAnimation(playerid, "SAMP", "FishingIdle", 4.1, 0, 1, 1, 1, 1); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~Fishing Animation Pose!", 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(" |--- SA-MP Animations Filterscript by Matite"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 12th January 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- SA-MP Animations Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
@ -0,0 +1,176 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new SF Building 1 | |||
// ---------------------------------------------- | |||
// By Matite in February 2015 | |||
// | |||
// | |||
// This script creates the new SF Building 1 object and removes the existing | |||
// GTASA building object. | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 3 objects = 1 for the replacement land object, 1 for the outside object | |||
// and 1 for the inside object | |||
// * Enables the /sfb command to teleport the player to the SF Building 1 | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Used for messages sent to the player | |||
#define COLOR_MESSAGE_YELLOW 0xFFDD00AA | |||
// ----------------------------------------------------------------------------- | |||
// Variables | |||
// --------- | |||
// Stores the created object numbers of the replacement building objects so | |||
// they can be destroyed when the filterscript is unloaded | |||
new SFBuilding1Object1; // Land object | |||
new SFBuilding1Object2; // Outside object | |||
new SFBuilding1Object3; // Inside object | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/sfb", cmdtext, true, 4) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, -2706.56, 870.91 + random(2), 71.86); | |||
SetPlayerFacingAngle(playerid, 180); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~SF Building!", 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(" |--- SF Building 1 Filterscript"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 10th February 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create the SF Building 1 Land object | |||
SFBuilding1Object1 = CreateObject(19600, -2719.02, 861.211, 72.1562, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- SF Building 1 Land object created"); | |||
// Create the SF Building 1 Outside object | |||
SFBuilding1Object2 = CreateObject(19598, -2719.02, 861.211, 72.1562, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- SF Building 1 Outside object created"); | |||
// Create the SF Building 1 Inside object | |||
SFBuilding1Object3 = CreateObject(19599, -2719.02, 861.211, 72.1562, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- SF Building 1 Inside object 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 SF Building 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, 9510, -2719.02, 861.211, 72.1562, 250.0); // Building | |||
RemoveBuildingForPlayer(i, 9671, -2719.02, 861.211, 72.1562, 250.0); // LOD | |||
RemoveBuildingForPlayer(i, 715, -2693.24, 852.60, 71.74, 8.0); // Tree (casts a shadow inside) | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(SFBuilding1Object1)) | |||
{ | |||
// Destroy the SF Building 1 Land object | |||
DestroyObject(SFBuilding1Object1); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- SF Building 1 Land object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(SFBuilding1Object2)) | |||
{ | |||
// Destroy the SF Building 1 Outside object | |||
DestroyObject(SFBuilding1Object2); | |||
// Display information in the Server Console | |||
print(" |-- SF Building 1 Outside object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(SFBuilding1Object3)) | |||
{ | |||
// Destroy the SF Building 1 Inside object | |||
DestroyObject(SFBuilding1Object3); | |||
// Display information in the Server Console | |||
print(" |-- SF Building 1 Inside object destroyed"); | |||
} | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- SF Building 1 Filterscript Unloaded"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA SF Building and LOD map objects for the player | |||
RemoveBuildingForPlayer(playerid, 9510, -2719.02, 861.211, 72.1562, 250.0); // Building | |||
RemoveBuildingForPlayer(playerid, 9671, -2719.02, 861.211, 72.1562, 250.0); // LOD | |||
RemoveBuildingForPlayer(playerid, 715, -2693.24, 852.60, 71.74, 8.0); // Tree (casts a shadow inside) | |||
// Exit here (return 1 so this callback is handled in other scripts too) | |||
return 1; | |||
} | |||
@ -0,0 +1,664 @@ | |||
// ----------------------------------------------------------------------------- | |||
// Example Filterscript for the new SF ZomboTech Building and Lab with Elevator | |||
// ---------------------------------------------------------------------------- | |||
// Original elevator code by Zamaroht in 2010 | |||
// | |||
// Updated by Kye in 2011 | |||
// * Added a sound effect for the elevator starting/stopping | |||
// | |||
// Edited by Matite in January 2015 | |||
// * Added code to remove the existing building, add the new buildings and | |||
// adapted the elevator code so it works in this new building | |||
// | |||
// | |||
// This script creates the new SF ZomboTech building and the lab objects, removes | |||
// the existing GTASA building object and creates an elevator that can be used to | |||
// travel between the building foyer and the lab. | |||
// | |||
// You can un-comment the OnPlayerCommandText callback below to enable a simple | |||
// teleport command (/zl) that teleports you to the ZomboTech Lab elevator. | |||
// | |||
// Warning... | |||
// This script uses a total of: | |||
// * 9 objects = 1 for the elevator, 2 for the elevator doors, 4 for the elevator | |||
// floor doors and 2 for the buildings (replacement ZomboTech building and lab) | |||
// * 3 3D Text Labels = 2 on the floors and 1 in the elevator | |||
// * 1 dialog (for the elevator) | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------------- | |||
// Includes | |||
// -------- | |||
// SA-MP include | |||
#include <a_samp> | |||
// For PlaySoundForPlayersInRange() | |||
#include "../include/gl_common.inc" | |||
// ----------------------------------------------------------------------------- | |||
// Defines | |||
// ------- | |||
// Movement speed of the elevator | |||
#define ELEVATOR_SPEED (5.0) | |||
// Movement speed of the doors | |||
#define DOORS_SPEED (5.0) | |||
// Time in ms that the elevator will wait in each floor before continuing with the queue... | |||
// be sure to give enough time for doors to open | |||
#define ELEVATOR_WAIT_TIME (5000) | |||
// Dialog ID for the ZomboTech building elevator dialog | |||
#define DIALOG_ID (875) | |||
// Position defines | |||
#define X_DOOR_CLOSED (-1951.603027) | |||
#define X_DOOR_L_OPENED X_DOOR_CLOSED + 1.6 | |||
#define X_DOOR_R_OPENED X_DOOR_CLOSED - 1.6 | |||
#define GROUND_Z_COORD (47.451492) | |||
#define X_ELEVATOR_POS (-1951.603027) | |||
#define Y_ELEVATOR_POS (636.418334) | |||
// Elevator state defines | |||
#define ELEVATOR_STATE_IDLE (0) | |||
#define ELEVATOR_STATE_WAITING (1) | |||
#define ELEVATOR_STATE_MOVING (2) | |||
// Invalid floor define | |||
#define INVALID_FLOOR (-1) | |||
// ----------------------------------------------------------------------------- | |||
// Constants | |||
// --------- | |||
// Elevator floor names for the 3D text labels | |||
static FloorNames[2][] = | |||
{ | |||
"Ground Floor", | |||
"ZomboTech Lab" | |||
}; | |||
// Elevator floor Z heights | |||
static Float:FloorZOffsets[2] = | |||
{ | |||
0.0, // Ground Floor | |||
-21.628007 // ZomboTech Lab -21.598007 | |||
}; | |||
// ----------------------------------------------------------------------------- | |||
// Variables | |||
// --------- | |||
// Stores the created object numbers of the replacement building and the lab so | |||
// they can be destroyed when the filterscript is unloaded | |||
new SFZomboTechBuildingObject; | |||
new SFZomboTechLabObject; | |||
// Stores the created object numbers of the elevator, the elevator doors and | |||
// the elevator floor doors so they can be destroyed when the filterscript | |||
// is unloaded | |||
new Obj_Elevator, Obj_ElevatorDoors[2], Obj_FloorDoors[2][2]; | |||
// Stores a reference to the 3D text labels used on each floor and inside the | |||
// elevator itself so they can be detroyed when the filterscript is unloaded | |||
new Text3D:Label_Elevator, Text3D:Label_Floors[2]; | |||
// Stores the current state of the elevator (ie ELEVATOR_STATE_IDLE, | |||
// ELEVATOR_STATE_WAITING or ELEVATOR_STATE_MOVING) | |||
new ElevatorState; | |||
// Stores the current floor the elevator is on or heading to... if the value is | |||
// ELEVATOR_STATE_IDLE or ELEVATOR_STATE_WAITING this is the current floor. If | |||
// the value is ELEVATOR_STATE_MOVING then it is the floor it's moving to | |||
new ElevatorFloor; | |||
// Stores the elevator queue for each floor | |||
new ElevatorQueue[2]; | |||
// Stores who requested the floor for the elevator queue... | |||
// FloorRequestedBy[floor_id] = playerid; (stores who requested which floor) | |||
new FloorRequestedBy[2]; | |||
// Used for a timer that makes the elevator move faster after players start | |||
// surfing the object | |||
new ElevatorBoostTimer; | |||
// ----------------------------------------------------------------------------- | |||
// Function Forwards | |||
// ----------------- | |||
// Public: | |||
forward CallElevator(playerid, floorid); // You can use INVALID_PLAYER_ID too. | |||
forward ShowElevatorDialog(playerid); | |||
// Private: | |||
forward Elevator_Initialize(); | |||
forward Elevator_Destroy(); | |||
forward Elevator_OpenDoors(); | |||
forward Elevator_CloseDoors(); | |||
forward Floor_OpenDoors(floorid); | |||
forward Floor_CloseDoors(floorid); | |||
forward Elevator_MoveToFloor(floorid); | |||
forward Elevator_Boost(floorid); // Increases the elevator speed until it reaches 'floorid'. | |||
forward Elevator_TurnToIdle(); | |||
forward ReadNextFloorInQueue(); | |||
forward RemoveFirstQueueFloor(); | |||
forward AddFloorToQueue(floorid); | |||
forward IsFloorInQueue(floorid); | |||
forward ResetElevatorQueue(); | |||
forward DidPlayerRequestElevator(playerid); | |||
forward Float:GetElevatorZCoordForFloor(floorid); | |||
forward Float:GetDoorsZCoordForFloor(floorid); | |||
// ----------------------------------------------------------------------------- | |||
// Callbacks | |||
// --------- | |||
// Un-comment the OnPlayerCommandText callback below (remove the "/*" and the "*/") | |||
// to enable a simple teleport command (/zl) which teleports the player to | |||
// the Zombotech Lab elevator. | |||
/* | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
// Check command text | |||
if (strcmp("/zl", cmdtext, true, 3) == 0) | |||
{ | |||
// Set the interior | |||
SetPlayerInterior(playerid, 0); | |||
// Set player position and facing angle | |||
SetPlayerPos(playerid, -1957.11 + random(2), 644.36 + random(2), 47.6); | |||
SetPlayerFacingAngle(playerid, 215); | |||
// Fix camera position after teleporting | |||
SetCameraBehindPlayer(playerid); | |||
// Send a gametext message to the player | |||
GameTextForPlayer(playerid, "~b~~h~ZomboTech Lab!", 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(" |--- SF ZomboTech Filterscript"); | |||
print(" |-- Script v1.01"); | |||
print(" |-- 12th January 2015"); | |||
print(" |---------------------------------------------------"); | |||
// Create the SF ZomboTech Building object | |||
SFZomboTechBuildingObject = CreateObject(19593, -1951.687500, 660.023986, 89.507797, 0, 0, 0); | |||
// Create the SF ZomboTech Lab object | |||
SFZomboTechLabObject = CreateObject(19594, -1951.687500, 660.023986, 29.507797, 0, 0, 0); | |||
// Display information in the Server Console | |||
print(" |-- SF ZomboTech Building and Lab objects created"); | |||
// Reset the elevator queue | |||
ResetElevatorQueue(); | |||
// Create the elevator object, the elevator doors and the floor doors | |||
Elevator_Initialize(); | |||
// Display information in the Server Console | |||
print(" |-- SF ZomboTech Building Elevator 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 SF ZomboTech map object and LOD 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, 10027, -1951.687500, 660.023986, 89.507797, 250.0); // Building | |||
RemoveBuildingForPlayer(i, 9939, -1951.687500, 660.023986, 89.507797, 250.0); // LOD | |||
} | |||
} | |||
// Exit here | |||
return 1; | |||
} | |||
public OnFilterScriptExit() | |||
{ | |||
// Check for valid object | |||
if (IsValidObject(SFZomboTechBuildingObject)) | |||
{ | |||
// Destroy the SF ZombotTech Building object | |||
DestroyObject(SFZomboTechBuildingObject); | |||
// Display information in the Server Console | |||
print(" |---------------------------------------------------"); | |||
print(" |-- SF ZomboTech Building object destroyed"); | |||
} | |||
// Check for valid object | |||
if (IsValidObject(SFZomboTechLabObject)) | |||
{ | |||
// Destroy the SF ZomboTech Lab object | |||
DestroyObject(SFZomboTechLabObject); | |||
// Display information in the Server Console | |||
print(" |-- SF ZomboTech Lab object destroyed"); | |||
} | |||
// Destroy the elevator, the elevator doors and the elevator floor doors | |||
Elevator_Destroy(); | |||
// Display information in the Server Console | |||
print(" |-- SF ZomboTech Building Elevator destroyed"); | |||
print(" |---------------------------------------------------"); | |||
// Exit here | |||
return 1; | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Remove default GTASA SF ZomboTech map object and LOD for the player | |||
RemoveBuildingForPlayer(playerid, 10027, -1951.687500, 660.023986, 89.507797, 250.0); // Building | |||
RemoveBuildingForPlayer(playerid, 9939, -1951.687500, 660.023986, 89.507797, 250.0); // LOD | |||
// Exit here | |||
return 1; | |||
} | |||
public OnObjectMoved(objectid) | |||
{ | |||
new Float:x, Float:y, Float:z; | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
if(objectid == Obj_FloorDoors[i][0]) | |||
{ | |||
GetObjectPos(Obj_FloorDoors[i][0], x, y, z); | |||
// A floor door has shut so move the elevator to the next floor in the queue | |||
if (x == X_DOOR_CLOSED) | |||
{ | |||
Elevator_MoveToFloor(ElevatorQueue[0]); | |||
RemoveFirstQueueFloor(); | |||
} | |||
} | |||
} | |||
if(objectid == Obj_Elevator) // The elevator reached the specified floor. | |||
{ | |||
KillTimer(ElevatorBoostTimer); // Kills the timer, in case the elevator reached the floor before boost. | |||
FloorRequestedBy[ElevatorFloor] = INVALID_PLAYER_ID; | |||
Elevator_OpenDoors(); | |||
Floor_OpenDoors(ElevatorFloor); | |||
GetObjectPos(Obj_Elevator, x, y, z); | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, X_ELEVATOR_POS - 1.8, Y_ELEVATOR_POS + 1.6, z - 0.6, 4.0, 0, 1); | |||
ElevatorState = ELEVATOR_STATE_WAITING; | |||
SetTimer("Elevator_TurnToIdle", ELEVATOR_WAIT_TIME, 0); | |||
} | |||
return 1; | |||
} | |||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) | |||
{ | |||
if(dialogid == DIALOG_ID) | |||
{ | |||
if(!response) | |||
return 0; | |||
if(FloorRequestedBy[listitem] != INVALID_PLAYER_ID || IsFloorInQueue(listitem)) | |||
GameTextForPlayer(playerid, "~r~The floor is already in the queue", 3500, 4); | |||
else if(DidPlayerRequestElevator(playerid)) | |||
GameTextForPlayer(playerid, "~r~You already requested the elevator", 3500, 4); | |||
else | |||
CallElevator(playerid, listitem); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) | |||
{ | |||
if(!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_YES)) | |||
{ | |||
new Float:pos[3]; | |||
GetPlayerPos(playerid, pos[0], pos[1], pos[2]); | |||
//printf("X = %0.2f | Y = %0.2f | Z = %0.2f", pos[0], pos[1], pos[2]); | |||
if(pos[1] < (Y_ELEVATOR_POS + 1.8) && pos[1] > (Y_ELEVATOR_POS - 1.8) && pos[0] < (X_ELEVATOR_POS + 1.8) && pos[0] > (X_ELEVATOR_POS - 1.8)) // He is using the elevator button | |||
ShowElevatorDialog(playerid); | |||
else // Is the player using a floor button? | |||
{ | |||
if(pos[1] > (Y_ELEVATOR_POS + 1.81) && pos[1] < (Y_ELEVATOR_POS + 3.8) && pos[0] < (X_ELEVATOR_POS - 1.81) && pos[0] > (X_ELEVATOR_POS - 3.8)) | |||
{ | |||
// Create variable | |||
new i = 0; | |||
// Check for ground floor | |||
if (pos[2] > (GROUND_Z_COORD - 2) && pos[2] < (GROUND_Z_COORD + 2)) | |||
{ | |||
i = 0; | |||
} | |||
else i = 1; | |||
//printf("Floor = %d | State = %d | i = %d", ElevatorFloor, ElevatorState, i); | |||
// Check if the elevator is not moving and already on the requested floor | |||
if (ElevatorState != ELEVATOR_STATE_MOVING && ElevatorFloor == i) | |||
{ | |||
// Display a gametext message and exit here | |||
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~r~ZomboTech Elevator~n~~r~Is Already On~n~~r~This Floor!", 3000, 5); | |||
return 1; | |||
} | |||
//printf("Call Elevator to Floor %i", i); | |||
CallElevator(playerid, i); | |||
GameTextForPlayer(playerid, "~r~Elevator called", 3500, 4); | |||
} | |||
} | |||
} | |||
return 1; | |||
} | |||
// ------------------------ Functions ------------------------ | |||
stock Elevator_Initialize() | |||
{ | |||
// Initializes the elevator. | |||
Obj_Elevator = CreateObject(18755, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000); | |||
Obj_ElevatorDoors[0] = CreateObject(18757, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000); | |||
Obj_ElevatorDoors[1] = CreateObject(18756, X_ELEVATOR_POS, Y_ELEVATOR_POS, GROUND_Z_COORD, 0.000000, 0.000000, 270.000000); | |||
Label_Elevator = Create3DTextLabel("{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to use elevator", 0xCCCCCCAA, X_ELEVATOR_POS - 1.8, Y_ELEVATOR_POS + 1.6, GROUND_Z_COORD - 0.6, 4.0, 0, 1); | |||
new string[128], | |||
Float:z; | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
Obj_FloorDoors[i][0] = CreateObject(18757, X_ELEVATOR_POS, Y_ELEVATOR_POS + 0.245, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000); | |||
Obj_FloorDoors[i][1] = CreateObject(18756, X_ELEVATOR_POS, Y_ELEVATOR_POS + 0.245, GetDoorsZCoordForFloor(i), 0.000000, 0.000000, 270.000000); | |||
format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to call", FloorNames[i]); | |||
if(i == 0) | |||
z = 47.460277; | |||
else | |||
z = 25.820274; | |||
Label_Floors[i] = Create3DTextLabel(string, 0xCCCCCCAA, X_ELEVATOR_POS - 2.5, Y_ELEVATOR_POS + 2.5, z - 0.2, 10.5, 0, 1); | |||
} | |||
// Open ground floor doors: | |||
Floor_OpenDoors(0); | |||
Elevator_OpenDoors(); | |||
return 1; | |||
} | |||
stock Elevator_Destroy() | |||
{ | |||
// Destroys the elevator and the elevator doors | |||
DestroyObject(Obj_Elevator); | |||
DestroyObject(Obj_ElevatorDoors[0]); | |||
DestroyObject(Obj_ElevatorDoors[1]); | |||
// Destroy the 3D text label inside the elevator | |||
Delete3DTextLabel(Label_Elevator); | |||
// Loop | |||
for(new i; i < sizeof(Obj_FloorDoors); i ++) | |||
{ | |||
// Destroy the elevator floor doors and the floor 3D text labels | |||
DestroyObject(Obj_FloorDoors[i][0]); | |||
DestroyObject(Obj_FloorDoors[i][1]); | |||
Delete3DTextLabel(Label_Floors[i]); | |||
} | |||
return 1; | |||
} | |||
stock Elevator_OpenDoors() | |||
{ | |||
// Opens the elevator's doors. | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], X_DOOR_L_OPENED, y, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_DOOR_R_OPENED, y, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Elevator_CloseDoors() | |||
{ | |||
// Closes the elevator's doors. | |||
if(ElevatorState == ELEVATOR_STATE_MOVING) | |||
return 0; | |||
new Float:x, Float:y, Float:z; | |||
GetObjectPos(Obj_ElevatorDoors[0], x, y, z); | |||
MoveObject(Obj_ElevatorDoors[0], X_DOOR_CLOSED, y, z, DOORS_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_DOOR_CLOSED, y, z, DOORS_SPEED); | |||
return 1; | |||
} | |||
stock Floor_OpenDoors(floorid) | |||
{ | |||
// Opens the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_DOOR_L_OPENED, Y_ELEVATOR_POS + 0.245, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_DOOR_R_OPENED, Y_ELEVATOR_POS + 0.245, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Floor_CloseDoors(floorid) | |||
{ | |||
// Closes the doors at the specified floor. | |||
MoveObject(Obj_FloorDoors[floorid][0], X_ELEVATOR_POS, Y_ELEVATOR_POS + 0.245, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
MoveObject(Obj_FloorDoors[floorid][1], X_ELEVATOR_POS, Y_ELEVATOR_POS + 0.245, GetDoorsZCoordForFloor(floorid), DOORS_SPEED); | |||
PlaySoundForPlayersInRange(6401, 50.0, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid) + 5.0); | |||
return 1; | |||
} | |||
stock Elevator_MoveToFloor(floorid) | |||
{ | |||
// Moves the elevator to specified floor (doors are meant to be already closed). | |||
ElevatorState = ELEVATOR_STATE_MOVING; | |||
ElevatorFloor = floorid; | |||
// Move the elevator slowly, to give time to clients to sync the object surfing. Then, boost it up: | |||
MoveObject(Obj_Elevator, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), 0.25); | |||
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), 0.25); | |||
Delete3DTextLabel(Label_Elevator); | |||
ElevatorBoostTimer = SetTimerEx("Elevator_Boost", 2000, 0, "i", floorid); | |||
return 1; | |||
} | |||
public Elevator_Boost(floorid) | |||
{ | |||
// Increases the elevator's speed until it reaches 'floorid' | |||
StopObject(Obj_Elevator); | |||
StopObject(Obj_ElevatorDoors[0]); | |||
StopObject(Obj_ElevatorDoors[1]); | |||
MoveObject(Obj_Elevator, X_ELEVATOR_POS, Y_ELEVATOR_POS, GetElevatorZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[0], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
MoveObject(Obj_ElevatorDoors[1], X_ELEVATOR_POS, Y_ELEVATOR_POS, GetDoorsZCoordForFloor(floorid), ELEVATOR_SPEED); | |||
return 1; | |||
} | |||
public Elevator_TurnToIdle() | |||
{ | |||
ElevatorState = ELEVATOR_STATE_IDLE; | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
stock RemoveFirstQueueFloor() | |||
{ | |||
// Removes the data in ElevatorQueue[0], and reorders the queue accordingly. | |||
for(new i; i < sizeof(ElevatorQueue) - 1; i ++) | |||
ElevatorQueue[i] = ElevatorQueue[i + 1]; | |||
ElevatorQueue[sizeof(ElevatorQueue) - 1] = INVALID_FLOOR; | |||
return 1; | |||
} | |||
stock AddFloorToQueue(floorid) | |||
{ | |||
// Adds 'floorid' at the end of the queue. | |||
// Scan for the first empty space: | |||
new slot = -1; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(ElevatorQueue[i] == INVALID_FLOOR) | |||
{ | |||
slot = i; | |||
break; | |||
} | |||
} | |||
if(slot != -1) | |||
{ | |||
ElevatorQueue[slot] = floorid; | |||
// If needed, move the elevator. | |||
if(ElevatorState == ELEVATOR_STATE_IDLE) | |||
ReadNextFloorInQueue(); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
stock ResetElevatorQueue() | |||
{ | |||
// Resets the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
ElevatorQueue[i] = INVALID_FLOOR; | |||
FloorRequestedBy[i] = INVALID_PLAYER_ID; | |||
} | |||
return 1; | |||
} | |||
stock IsFloorInQueue(floorid) | |||
{ | |||
// Checks if the specified floor is currently part of the queue. | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
if(ElevatorQueue[i] == floorid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ReadNextFloorInQueue() | |||
{ | |||
// Reads the next floor in the queue, closes doors, and goes to it. | |||
if(ElevatorState != ELEVATOR_STATE_IDLE || ElevatorQueue[0] == INVALID_FLOOR) | |||
return 0; | |||
Elevator_CloseDoors(); | |||
Floor_CloseDoors(ElevatorFloor); | |||
return 1; | |||
} | |||
stock DidPlayerRequestElevator(playerid) | |||
{ | |||
for(new i; i < sizeof(FloorRequestedBy); i ++) | |||
if(FloorRequestedBy[i] == playerid) | |||
return 1; | |||
return 0; | |||
} | |||
stock ShowElevatorDialog(playerid) | |||
{ | |||
new string[512]; | |||
for(new i; i < sizeof(ElevatorQueue); i ++) | |||
{ | |||
if(FloorRequestedBy[i] != INVALID_PLAYER_ID) | |||
strcat(string, "{FF0000}"); | |||
strcat(string, FloorNames[i]); | |||
strcat(string, "\n"); | |||
} | |||
ShowPlayerDialog(playerid, DIALOG_ID, DIALOG_STYLE_LIST, "ZomboTech Elevator...", string, "Accept", "Cancel"); | |||
return 1; | |||
} | |||
stock CallElevator(playerid, floorid) | |||
{ | |||
// Calls the elevator (also used with the elevator dialog). | |||
if(FloorRequestedBy[floorid] != INVALID_PLAYER_ID || IsFloorInQueue(floorid)) | |||
return 0; | |||
FloorRequestedBy[floorid] = playerid; | |||
AddFloorToQueue(floorid); | |||
return 1; | |||
} | |||
stock Float:GetElevatorZCoordForFloor(floorid) | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid]); | |||
stock Float:GetDoorsZCoordForFloor(floorid) | |||
return (GROUND_Z_COORD + FloorZOffsets[floorid]); |
@ -0,0 +1,366 @@ | |||
// | |||
// Admin player skin changer using previews. For SA-MP 0.3x and above. | |||
// - Kye 2012 | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define TOTAL_ITEMS 312 | |||
#define SELECTION_ITEMS 21 | |||
#define ITEMS_PER_LINE 7 | |||
#define HEADER_TEXT "Skins" | |||
#define NEXT_TEXT "Next" | |||
#define PREV_TEXT "Prev" | |||
#define DIALOG_BASE_X 75.0 | |||
#define DIALOG_BASE_Y 130.0 | |||
#define DIALOG_WIDTH 550.0 | |||
#define DIALOG_HEIGHT 180.0 | |||
#define SPRITE_DIM_X 60.0 | |||
#define SPRITE_DIM_Y 70.0 | |||
new gTotalItems = TOTAL_ITEMS; | |||
new PlayerText:gCurrentPageTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gHeaderTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gBackgroundTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gNextButtonTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gPrevButtonTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gSelectionItems[MAX_PLAYERS][SELECTION_ITEMS]; | |||
new gSelectionItemsTag[MAX_PLAYERS][SELECTION_ITEMS]; | |||
new gItemAt[MAX_PLAYERS]; | |||
new gItemList[TOTAL_ITEMS] = { | |||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, | |||
50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96, | |||
97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131, | |||
132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166, | |||
167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201, | |||
202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236, | |||
237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271, | |||
272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299, | |||
300,301,302,303,304,305,306,307,308,309,310,311 | |||
}; | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Admin Player Skin Changer Loaded\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
GetNumberOfPages() | |||
{ | |||
if((gTotalItems >= SELECTION_ITEMS) && (gTotalItems % SELECTION_ITEMS) == 0) | |||
{ | |||
return (gTotalItems / SELECTION_ITEMS); | |||
} | |||
else return (gTotalItems / SELECTION_ITEMS) + 1; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreateCurrentPageTextDraw(playerid, Float:Xpos, Float:Ypos) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, "0/0"); | |||
PlayerTextDrawUseBox(playerid, txtInit, 0); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1); | |||
PlayerTextDrawFont(playerid, txtInit, 1); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); | |||
PlayerTextDrawSetOutline(playerid, txtInit, 1); | |||
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF); | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
// Creates a button textdraw and returns the textdraw ID. | |||
PlayerText:CreatePlayerDialogButton(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height, button_text[]) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, button_text); | |||
PlayerTextDrawUseBox(playerid, txtInit, 1); | |||
PlayerTextDrawBoxColor(playerid, txtInit, 0x000000FF); | |||
PlayerTextDrawBackgroundColor(playerid, txtInit, 0x000000FF); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1); | |||
PlayerTextDrawFont(playerid, txtInit, 1); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); // no shadow | |||
PlayerTextDrawSetOutline(playerid, txtInit, 0); | |||
PlayerTextDrawColor(playerid, txtInit, 0x4A5A6BFF); | |||
PlayerTextDrawSetSelectable(playerid, txtInit, 1); | |||
PlayerTextDrawAlignment(playerid, txtInit, 2); | |||
PlayerTextDrawTextSize(playerid, txtInit, Height, Width); // The width and height are reversed for centering.. something the game does <g> | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreatePlayerHeaderTextDraw(playerid, Float:Xpos, Float:Ypos, header_text[]) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, header_text); | |||
PlayerTextDrawUseBox(playerid, txtInit, 0); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 1.25, 3.0); | |||
PlayerTextDrawFont(playerid, txtInit, 0); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); | |||
PlayerTextDrawSetOutline(playerid, txtInit, 1); | |||
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF); | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreatePlayerBackgroundTextDraw(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height) | |||
{ | |||
new PlayerText:txtBackground = CreatePlayerTextDraw(playerid, Xpos, Ypos, | |||
" ~n~"); // enough space for everyone | |||
PlayerTextDrawUseBox(playerid, txtBackground, 1); | |||
PlayerTextDrawBoxColor(playerid, txtBackground, 0x4A5A6BBB); | |||
PlayerTextDrawLetterSize(playerid, txtBackground, 5.0, 5.0); | |||
PlayerTextDrawFont(playerid, txtBackground, 0); | |||
PlayerTextDrawSetShadow(playerid, txtBackground, 0); | |||
PlayerTextDrawSetOutline(playerid, txtBackground, 0); | |||
PlayerTextDrawColor(playerid, txtBackground,0x000000FF); | |||
PlayerTextDrawTextSize(playerid, txtBackground, Width, Height); | |||
PlayerTextDrawBackgroundColor(playerid, txtBackground, 0x4A5A6BBB); | |||
PlayerTextDrawShow(playerid, txtBackground); | |||
return txtBackground; | |||
} | |||
//------------------------------------------------ | |||
// Creates a model preview sprite | |||
PlayerText:CreateModelPreviewTextDraw(playerid, modelindex, Float:Xpos, Float:Ypos, Float:width, Float:height) | |||
{ | |||
new PlayerText:txtPlayerSprite = CreatePlayerTextDraw(playerid, Xpos, Ypos, ""); // it has to be set with SetText later | |||
PlayerTextDrawFont(playerid, txtPlayerSprite, TEXT_DRAW_FONT_MODEL_PREVIEW); | |||
PlayerTextDrawColor(playerid, txtPlayerSprite, 0xFFFFFFFF); | |||
PlayerTextDrawBackgroundColor(playerid, txtPlayerSprite, 0x88888899); | |||
PlayerTextDrawTextSize(playerid, txtPlayerSprite, width, height); // Text size is the Width:Height | |||
PlayerTextDrawSetPreviewModel(playerid, txtPlayerSprite, modelindex); | |||
PlayerTextDrawSetSelectable(playerid, txtPlayerSprite, 1); | |||
PlayerTextDrawShow(playerid,txtPlayerSprite); | |||
return txtPlayerSprite; | |||
} | |||
//------------------------------------------------ | |||
DestroyPlayerModelPreviews(playerid) | |||
{ | |||
new x=0; | |||
while(x != SELECTION_ITEMS) { | |||
if(gSelectionItems[playerid][x] != PlayerText:INVALID_TEXT_DRAW) { | |||
PlayerTextDrawDestroy(playerid, gSelectionItems[playerid][x]); | |||
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
x++; | |||
} | |||
} | |||
//------------------------------------------------ | |||
ShowPlayerModelPreviews(playerid) | |||
{ | |||
new x=0; | |||
new Float:BaseX = DIALOG_BASE_X; | |||
new Float:BaseY = DIALOG_BASE_Y - (SPRITE_DIM_Y * 0.33); // down a bit | |||
new linetracker = 0; | |||
new itemat = GetPVarInt(playerid, "skinc_page") * SELECTION_ITEMS; | |||
// Destroy any previous ones created | |||
DestroyPlayerModelPreviews(playerid); | |||
while(x != SELECTION_ITEMS && itemat < gTotalItems) { | |||
if(linetracker == 0) { | |||
BaseX = DIALOG_BASE_X + 25.0; // in a bit from the box | |||
BaseY += SPRITE_DIM_Y + 1.0; // move on the Y for the next line | |||
} | |||
gSelectionItems[playerid][x] = CreateModelPreviewTextDraw(playerid, gItemList[itemat], BaseX, BaseY, SPRITE_DIM_X, SPRITE_DIM_Y); | |||
gSelectionItemsTag[playerid][x] = gItemList[itemat]; | |||
BaseX += SPRITE_DIM_X + 1.0; // move on the X for the next sprite | |||
linetracker++; | |||
if(linetracker == ITEMS_PER_LINE) linetracker = 0; | |||
itemat++; | |||
x++; | |||
} | |||
} | |||
//------------------------------------------------ | |||
UpdatePageTextDraw(playerid) | |||
{ | |||
new PageText[64+1]; | |||
format(PageText, 64, "%d/%d", GetPVarInt(playerid,"skinc_page") + 1, GetNumberOfPages()); | |||
PlayerTextDrawSetString(playerid, gCurrentPageTextDrawId[playerid], PageText); | |||
} | |||
//------------------------------------------------ | |||
CreateSelectionMenu(playerid) | |||
{ | |||
gBackgroundTextDrawId[playerid] = CreatePlayerBackgroundTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y + 20.0, DIALOG_WIDTH, DIALOG_HEIGHT); | |||
gHeaderTextDrawId[playerid] = CreatePlayerHeaderTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y, HEADER_TEXT); | |||
gCurrentPageTextDrawId[playerid] = CreateCurrentPageTextDraw(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y + 15.0); | |||
gNextButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, NEXT_TEXT); | |||
gPrevButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 90.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, PREV_TEXT); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
} | |||
//------------------------------------------------ | |||
DestroySelectionMenu(playerid) | |||
{ | |||
DestroyPlayerModelPreviews(playerid); | |||
PlayerTextDrawDestroy(playerid, gHeaderTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gBackgroundTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gCurrentPageTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gNextButtonTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gPrevButtonTextDrawId[playerid]); | |||
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
//------------------------------------------------ | |||
HandlePlayerItemSelection(playerid, selecteditem) | |||
{ | |||
// In this case we change the player's skin | |||
if(gSelectionItemsTag[playerid][selecteditem] >= 0 && gSelectionItemsTag[playerid][selecteditem] < 319) { | |||
SetPlayerSkin(playerid, gSelectionItemsTag[playerid][selecteditem]); | |||
return; | |||
} | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Init all of the textdraw related globals | |||
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
for(new x=0; x < SELECTION_ITEMS; x++) { | |||
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
gItemAt[playerid] = 0; | |||
return 1; // Allow other scripts to keep processing OnPlayerConnect | |||
} | |||
//------------------------------------------- | |||
// Even though only Player* textdraws are used in this script, | |||
// OnPlayerClickTextDraw is still required to handle ESC | |||
public OnPlayerClickTextDraw(playerid, Text:clickedid) | |||
{ | |||
if(GetPVarInt(playerid, "skinc_active") == 0) return 0; | |||
// Handle: They cancelled (with ESC) | |||
if(clickedid == Text:INVALID_TEXT_DRAW) { | |||
DestroySelectionMenu(playerid); | |||
SetPVarInt(playerid, "skinc_active", 0); | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid) | |||
{ | |||
if(GetPVarInt(playerid, "skinc_active") == 0) return 0; | |||
new curpage = GetPVarInt(playerid, "skinc_page"); | |||
// Handle: next button | |||
if(playertextid == gNextButtonTextDrawId[playerid]) { | |||
if(curpage < (GetNumberOfPages() - 1)) { | |||
SetPVarInt(playerid, "skinc_page", curpage + 1); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0); | |||
} else { | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
} | |||
return 1; | |||
} | |||
// Handle: previous button | |||
if(playertextid == gPrevButtonTextDrawId[playerid]) { | |||
if(curpage > 0) { | |||
SetPVarInt(playerid, "skinc_page", curpage - 1); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0); | |||
} else { | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
} | |||
return 1; | |||
} | |||
// Search in the array of textdraws used for the items | |||
new x=0; | |||
while(x != SELECTION_ITEMS) { | |||
if(playertextid == gSelectionItems[playerid][x]) { | |||
HandlePlayerItemSelection(playerid, x); | |||
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0); | |||
DestroySelectionMenu(playerid); | |||
CancelSelectTextDraw(playerid); | |||
SetPVarInt(playerid, "skinc_active", 0); | |||
return 1; | |||
} | |||
x++; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new idx; | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
cmd = strtok(cmdtext, idx); | |||
if(strcmp("/skinchange", cmd, true) == 0) | |||
{ | |||
// If there was a previously created selection menu, destroy it | |||
DestroySelectionMenu(playerid); | |||
SetPVarInt(playerid, "skinc_active", 1); | |||
//SetPVarInt(playerid, "skinc_page", 0); // will reset the page back to the first | |||
CreateSelectionMenu(playerid); | |||
SelectTextDraw(playerid, 0xACCBF1FF); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,387 @@ | |||
// | |||
// Admin vehicle spawner using previews. For SA-MP 0.3x and above. | |||
// - Kye 2012 | |||
// | |||
#include <a_samp> | |||
#include "../include/gl_common.inc" | |||
#define TOTAL_ITEMS 207 | |||
#define SELECTION_ITEMS 21 | |||
#define ITEMS_PER_LINE 7 | |||
#define HEADER_TEXT "Vehicles" | |||
#define NEXT_TEXT "Next" | |||
#define PREV_TEXT "Prev" | |||
#define DIALOG_BASE_X 75.0 | |||
#define DIALOG_BASE_Y 130.0 | |||
#define DIALOG_WIDTH 550.0 | |||
#define DIALOG_HEIGHT 180.0 | |||
#define SPRITE_DIM_X 60.0 | |||
#define SPRITE_DIM_Y 70.0 | |||
new gTotalItems = TOTAL_ITEMS; | |||
new PlayerText:gCurrentPageTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gHeaderTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gBackgroundTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gNextButtonTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gPrevButtonTextDrawId[MAX_PLAYERS]; | |||
new PlayerText:gSelectionItems[MAX_PLAYERS][SELECTION_ITEMS]; | |||
new gSelectionItemsTag[MAX_PLAYERS][SELECTION_ITEMS]; | |||
new gItemAt[MAX_PLAYERS]; | |||
new gItemList[TOTAL_ITEMS] = { | |||
400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430, | |||
431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,450,451,452,453,454,455,456,457,458,459,460,461, | |||
462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492, | |||
493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523, | |||
524,525,526,527,528,529,530,531,532,533,534,535,536,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554, | |||
555,556,557,558,559,560,561,562,563,564,565,566,567,568,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585, | |||
586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611 | |||
}; | |||
//------------------------------------------------ | |||
public OnFilterScriptInit() | |||
{ | |||
print("\n--Admin Vehicle Spawner Loaded\n"); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
GetNumberOfPages() | |||
{ | |||
if((gTotalItems >= SELECTION_ITEMS) && (gTotalItems % SELECTION_ITEMS) == 0) | |||
{ | |||
return (gTotalItems / SELECTION_ITEMS); | |||
} | |||
else return (gTotalItems / SELECTION_ITEMS) + 1; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreateCurrentPageTextDraw(playerid, Float:Xpos, Float:Ypos) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, "0/0"); | |||
PlayerTextDrawUseBox(playerid, txtInit, 0); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1); | |||
PlayerTextDrawFont(playerid, txtInit, 1); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); | |||
PlayerTextDrawSetOutline(playerid, txtInit, 1); | |||
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF); | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
// Creates a button textdraw and returns the textdraw ID. | |||
PlayerText:CreatePlayerDialogButton(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height, button_text[]) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, button_text); | |||
PlayerTextDrawUseBox(playerid, txtInit, 1); | |||
PlayerTextDrawBoxColor(playerid, txtInit, 0x000000FF); | |||
PlayerTextDrawBackgroundColor(playerid, txtInit, 0x000000FF); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1); | |||
PlayerTextDrawFont(playerid, txtInit, 1); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); // no shadow | |||
PlayerTextDrawSetOutline(playerid, txtInit, 0); | |||
PlayerTextDrawColor(playerid, txtInit, 0x4A5A6BFF); | |||
PlayerTextDrawSetSelectable(playerid, txtInit, 1); | |||
PlayerTextDrawAlignment(playerid, txtInit, 2); | |||
PlayerTextDrawTextSize(playerid, txtInit, Height, Width); // The width and height are reversed for centering.. something the game does <g> | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreatePlayerHeaderTextDraw(playerid, Float:Xpos, Float:Ypos, header_text[]) | |||
{ | |||
new PlayerText:txtInit; | |||
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, header_text); | |||
PlayerTextDrawUseBox(playerid, txtInit, 0); | |||
PlayerTextDrawLetterSize(playerid, txtInit, 1.25, 3.0); | |||
PlayerTextDrawFont(playerid, txtInit, 0); | |||
PlayerTextDrawSetShadow(playerid, txtInit, 0); | |||
PlayerTextDrawSetOutline(playerid, txtInit, 1); | |||
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF); | |||
PlayerTextDrawShow(playerid, txtInit); | |||
return txtInit; | |||
} | |||
//------------------------------------------------ | |||
PlayerText:CreatePlayerBackgroundTextDraw(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height) | |||
{ | |||
new PlayerText:txtBackground = CreatePlayerTextDraw(playerid, Xpos, Ypos, | |||
" ~n~"); // enough space for everyone | |||
PlayerTextDrawUseBox(playerid, txtBackground, 1); | |||
PlayerTextDrawBoxColor(playerid, txtBackground, 0x00000099); | |||
PlayerTextDrawLetterSize(playerid, txtBackground, 5.0, 5.0); | |||
PlayerTextDrawFont(playerid, txtBackground, 0); | |||
PlayerTextDrawSetShadow(playerid, txtBackground, 0); | |||
PlayerTextDrawSetOutline(playerid, txtBackground, 0); | |||
PlayerTextDrawColor(playerid, txtBackground,0x000000FF); | |||
PlayerTextDrawTextSize(playerid, txtBackground, Width, Height); | |||
PlayerTextDrawBackgroundColor(playerid, txtBackground, 0x00000099); | |||
PlayerTextDrawShow(playerid, txtBackground); | |||
return txtBackground; | |||
} | |||
//------------------------------------------------ | |||
// Creates a model preview sprite | |||
PlayerText:CreateModelPreviewTextDraw(playerid, modelindex, Float:Xpos, Float:Ypos, Float:width, Float:height) | |||
{ | |||
new PlayerText:txtPlayerSprite = CreatePlayerTextDraw(playerid, Xpos, Ypos, ""); // it has to be set with SetText later | |||
PlayerTextDrawFont(playerid, txtPlayerSprite, TEXT_DRAW_FONT_MODEL_PREVIEW); | |||
PlayerTextDrawColor(playerid, txtPlayerSprite, 0xFFFFFFFF); | |||
PlayerTextDrawBackgroundColor(playerid, txtPlayerSprite, 0x000000EE); | |||
PlayerTextDrawTextSize(playerid, txtPlayerSprite, width, height); // Text size is the Width:Height | |||
PlayerTextDrawSetPreviewModel(playerid, txtPlayerSprite, modelindex); | |||
PlayerTextDrawSetPreviewRot(playerid,txtPlayerSprite, -16.0, 0.0, -55.0); | |||
PlayerTextDrawSetSelectable(playerid, txtPlayerSprite, 1); | |||
PlayerTextDrawShow(playerid,txtPlayerSprite); | |||
return txtPlayerSprite; | |||
} | |||
//------------------------------------------------ | |||
DestroyPlayerModelPreviews(playerid) | |||
{ | |||
new x=0; | |||
while(x != SELECTION_ITEMS) { | |||
if(gSelectionItems[playerid][x] != PlayerText:INVALID_TEXT_DRAW) { | |||
PlayerTextDrawDestroy(playerid, gSelectionItems[playerid][x]); | |||
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
x++; | |||
} | |||
} | |||
//------------------------------------------------ | |||
ShowPlayerModelPreviews(playerid) | |||
{ | |||
new x=0; | |||
new Float:BaseX = DIALOG_BASE_X; | |||
new Float:BaseY = DIALOG_BASE_Y - (SPRITE_DIM_Y * 0.33); // down a bit | |||
new linetracker = 0; | |||
new itemat = GetPVarInt(playerid, "vspawner_page") * SELECTION_ITEMS; | |||
// Destroy any previous ones created | |||
DestroyPlayerModelPreviews(playerid); | |||
while(x != SELECTION_ITEMS && itemat < gTotalItems) { | |||
if(linetracker == 0) { | |||
BaseX = DIALOG_BASE_X + 25.0; // in a bit from the box | |||
BaseY += SPRITE_DIM_Y + 1.0; // move on the Y for the next line | |||
} | |||
gSelectionItems[playerid][x] = CreateModelPreviewTextDraw(playerid, gItemList[itemat], BaseX, BaseY, SPRITE_DIM_X, SPRITE_DIM_Y); | |||
gSelectionItemsTag[playerid][x] = gItemList[itemat]; | |||
BaseX += SPRITE_DIM_X + 1.0; // move on the X for the next sprite | |||
linetracker++; | |||
if(linetracker == ITEMS_PER_LINE) linetracker = 0; | |||
itemat++; | |||
x++; | |||
} | |||
} | |||
//------------------------------------------------ | |||
UpdatePageTextDraw(playerid) | |||
{ | |||
new PageText[64+1]; | |||
format(PageText, 64, "%d/%d", GetPVarInt(playerid,"vspawner_page") + 1, GetNumberOfPages()); | |||
PlayerTextDrawSetString(playerid, gCurrentPageTextDrawId[playerid], PageText); | |||
} | |||
//------------------------------------------------ | |||
CreateSelectionMenu(playerid) | |||
{ | |||
gBackgroundTextDrawId[playerid] = CreatePlayerBackgroundTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y + 20.0, DIALOG_WIDTH, DIALOG_HEIGHT); | |||
gHeaderTextDrawId[playerid] = CreatePlayerHeaderTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y, HEADER_TEXT); | |||
gCurrentPageTextDrawId[playerid] = CreateCurrentPageTextDraw(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y + 15.0); | |||
gNextButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, NEXT_TEXT); | |||
gPrevButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 90.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, PREV_TEXT); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
} | |||
//------------------------------------------------ | |||
DestroySelectionMenu(playerid) | |||
{ | |||
DestroyPlayerModelPreviews(playerid); | |||
PlayerTextDrawDestroy(playerid, gHeaderTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gBackgroundTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gCurrentPageTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gNextButtonTextDrawId[playerid]); | |||
PlayerTextDrawDestroy(playerid, gPrevButtonTextDrawId[playerid]); | |||
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
//------------------------------------------------ | |||
SpawnVehicle_InfrontOfPlayer(playerid, vehiclemodel, color1, color2) | |||
{ | |||
new Float:x,Float:y,Float:z; | |||
new Float:facing; | |||
new Float:distance; | |||
GetPlayerPos(playerid, x, y, z); | |||
GetPlayerFacingAngle(playerid, facing); | |||
new Float:size_x,Float:size_y,Float:size_z; | |||
GetVehicleModelInfo(vehiclemodel, VEHICLE_MODEL_INFO_SIZE, size_x, size_y, size_z); | |||
distance = size_x + 0.5; | |||
x += (distance * floatsin(-facing, degrees)); | |||
y += (distance * floatcos(-facing, degrees)); | |||
facing += 90.0; | |||
if(facing > 360.0) facing -= 360.0; | |||
return CreateVehicle(vehiclemodel, x, y, z + (size_z * 0.25), facing, color1, color2, -1); | |||
} | |||
//------------------------------------------------ | |||
HandlePlayerItemSelection(playerid, selecteditem) | |||
{ | |||
// In this case we're spawning a vehicle for them | |||
SpawnVehicle_InfrontOfPlayer(playerid, gSelectionItemsTag[playerid][selecteditem], -1, -1); | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerConnect(playerid) | |||
{ | |||
// Init all of the textdraw related globals | |||
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW; | |||
for(new x=0; x < SELECTION_ITEMS; x++) { | |||
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW; | |||
} | |||
gItemAt[playerid] = 0; | |||
return 1; // Allow other scripts to keep processing OnPlayerConnect | |||
} | |||
//------------------------------------------- | |||
// Even though only Player* textdraws are used in this script, | |||
// OnPlayerClickTextDraw is still required to handle ESC | |||
public OnPlayerClickTextDraw(playerid, Text:clickedid) | |||
{ | |||
if(GetPVarInt(playerid, "vspawner_active") == 0) return 0; | |||
// Handle: They cancelled (with ESC) | |||
if(clickedid == Text:INVALID_TEXT_DRAW) { | |||
DestroySelectionMenu(playerid); | |||
SetPVarInt(playerid, "vspawner_active", 0); | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid) | |||
{ | |||
if(GetPVarInt(playerid, "vspawner_active") == 0) return 0; | |||
new curpage = GetPVarInt(playerid, "vspawner_page"); | |||
// Handle: next button | |||
if(playertextid == gNextButtonTextDrawId[playerid]) { | |||
if(curpage < (GetNumberOfPages() - 1)) { | |||
SetPVarInt(playerid, "vspawner_page", curpage + 1); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0); | |||
} else { | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
} | |||
return 1; | |||
} | |||
// Handle: previous button | |||
if(playertextid == gPrevButtonTextDrawId[playerid]) { | |||
if(curpage > 0) { | |||
SetPVarInt(playerid, "vspawner_page", curpage - 1); | |||
ShowPlayerModelPreviews(playerid); | |||
UpdatePageTextDraw(playerid); | |||
PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0); | |||
} else { | |||
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0); | |||
} | |||
return 1; | |||
} | |||
// Search in the array of textdraws used for the items | |||
new x=0; | |||
while(x != SELECTION_ITEMS) { | |||
if(playertextid == gSelectionItems[playerid][x]) { | |||
HandlePlayerItemSelection(playerid, x); | |||
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0); | |||
DestroySelectionMenu(playerid); | |||
CancelSelectTextDraw(playerid); | |||
SetPVarInt(playerid, "vspawner_active", 0); | |||
return 1; | |||
} | |||
x++; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new cmd[256+1]; | |||
new idx; | |||
if(!IsPlayerAdmin(playerid)) return 0; | |||
cmd = strtok(cmdtext, idx); | |||
if(strcmp("/vspawner", cmd, true) == 0) | |||
{ | |||
// If there was a previously created selection menu, destroy it | |||
DestroySelectionMenu(playerid); | |||
SetPVarInt(playerid, "vspawner_active", 1); | |||
//SetPVarInt(playerid, "vspawner_page", 0); // will reset the page back to the first | |||
CreateSelectionMenu(playerid); | |||
SelectTextDraw(playerid, 0xACCBF1FF); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,90 @@ | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
#pragma tabsize 0 | |||
main() | |||
{ | |||
print("\n----------------------------------"); | |||
print(" Bare Script\n"); | |||
print("----------------------------------\n"); | |||
} | |||
public OnPlayerConnect(playerid) | |||
{ | |||
GameTextForPlayer(playerid,"~w~SA-MP: ~r~Bare Script",5000,5); | |||
return 1; | |||
} | |||
public OnPlayerCommandText(playerid, cmdtext[]) | |||
{ | |||
new idx; | |||
new cmd[256]; | |||
cmd = strtok(cmdtext, idx); | |||
if(strcmp(cmd, "/yadayada", true) == 0) { | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
public OnPlayerSpawn(playerid) | |||
{ | |||
SetPlayerInterior(playerid,0); | |||
TogglePlayerClock(playerid,0); | |||
return 1; | |||
} | |||
public OnPlayerDeath(playerid, killerid, reason) | |||
{ | |||
return 1; | |||
} | |||
SetupPlayerForClassSelection(playerid) | |||
{ | |||
SetPlayerInterior(playerid,14); | |||
SetPlayerPos(playerid,258.4893,-41.4008,1002.0234); | |||
SetPlayerFacingAngle(playerid, 270.0); | |||
SetPlayerCameraPos(playerid,256.0815,-43.0475,1004.0234); | |||
SetPlayerCameraLookAt(playerid,258.4893,-41.4008,1002.0234); | |||
} | |||
public OnPlayerRequestClass(playerid, classid) | |||
{ | |||
SetupPlayerForClassSelection(playerid); | |||
return 1; | |||
} | |||
public OnGameModeInit() | |||
{ | |||
SetGameModeText("Bare Script"); | |||
ShowPlayerMarkers(1); | |||
ShowNameTags(1); | |||
AllowAdminTeleport(1); | |||
AddPlayerClass(265,1958.3783,1343.1572,15.3746,270.1425,0,0,0,0,-1,-1); | |||
return 1; | |||
} | |||
strtok(const string[], &index) | |||
{ | |||
new length = strlen(string); | |||
while ((index < length) && (string[index] <= ' ')) | |||
{ | |||
index++; | |||
} | |||
new offset = index; | |||
new result[20]; | |||
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) | |||
{ | |||
result[index - offset] = string[index]; | |||
index++; | |||
} | |||
result[index - offset] = EOS; | |||
return result; | |||
} |
@ -0,0 +1,264 @@ | |||
// | |||
// RC BARNSTORM - A demonstration vehicle vs vehicle script for SA-MP 0.2 | |||
// -- by kyeman (SA-MP team) 2007 | |||
// | |||
// This script demonstrates the following :- | |||
// - An automatic vehicle observer mode switchable via a key press. | |||
// - Text drawing and the use of GTA ~k~ key constants. | |||
// - Use of RC vehicles | |||
// - Dynamic creation and destruction of vehicles | |||
// - The OnPlayerKeyStateChange event/callback and determining | |||
// if a key has just been pressed. | |||
// - Bypassing SA-MP's class selection with SetSpawnInfo | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
new gPlayerVehicles[MAX_PLAYERS]; // the vehicleid for the active playerid | |||
new gPlayerObserving[MAX_PLAYERS]; // player observing which active player | |||
new Text:txtObsHelper; | |||
new Float:gSpawnPositions[26][4] = { // positions where players in vehicles spawn | |||
{-205.7703,-119.6655,2.4094,342.0546}, | |||
{-202.1386,-54.1213,2.4111,95.6799}, | |||
{-197.2334,7.5293,2.4034,16.0852}, | |||
{-135.7348,61.7265,2.4112,354.3534}, | |||
{-73.7883,73.4238,2.4082,260.5399}, | |||
{-6.9850,27.9988,2.4112,201.7691}, | |||
{0.6782,-16.0898,2.4076,161.7720}, | |||
{-46.3365,-88.3937,2.4092,180.7382}, | |||
{-72.4389,-127.2939,2.4107,113.5616}, | |||
{-128.1940,-144.1725,2.4094,78.9676}, | |||
{-266.0189,-50.6718,2.4125,223.8079}, | |||
{-244.2617,-1.0468,2.1038,257.3333}, | |||
{-93.3146,-32.4889,2.4085,186.0631}, | |||
{-130.7054,-93.4983,2.4124,73.8375}, | |||
{-117.4049,4.2989,2.4112,337.1284}, | |||
{-26.1622,135.8739,2.4094,248.1580}, | |||
{45.5705,86.7586,2.0753,147.3342}, | |||
{54.9881,2.2997,1.1132,95.7173}, | |||
{-248.9905,-119.3982,2.4083,303.7859}, | |||
{-60.1321,55.5239,2.4038,325.2209}, | |||
{-60.9184,47.9302,5.7706,342.8299}, | |||
{-70.0303,-22.0071,2.4113,165.2789}, | |||
{-138.3093,-83.2640,2.4152,4.0455}, | |||
{-25.5989,94.6100,2.4041,150.8322}, | |||
{-161.0327,-70.5945,2.4042,142.9221}, | |||
{-54.8308,-139.6148,2.4119,258.7639} | |||
}; | |||
//------------------------------------------------------------------------------------------------------ | |||
main() | |||
{ | |||
print("Running: RC BARNSTORM by kyeman 2007"); | |||
} | |||
//------------------------------------------------ | |||
// ObserverSwitchToNextVehicle | |||
// Will increment the current observed player | |||
// until it finds a new player with an active vehicle. | |||
ObserverSwitchToNextVehicle(playerid) | |||
{ | |||
new x=0; | |||
while(x!=MAX_PLAYERS) { // MAX_PLAYERS iterations | |||
gPlayerObserving[playerid]++; | |||
if(gPlayerObserving[playerid] == MAX_PLAYERS) { | |||
// we need to cycle back to the start | |||
gPlayerObserving[playerid] = 0; | |||
} | |||
// see if the target player has a vehicle, | |||
// if so assign this player to observe it | |||
if(gPlayerVehicles[gPlayerObserving[playerid]] != 0) { | |||
PlayerSpectateVehicle(playerid,gPlayerVehicles[gPlayerObserving[playerid]]); | |||
return; | |||
} | |||
x++; | |||
} | |||
// didn't find any vehicles to observe. we'll have to default to last | |||
PlayerSpectateVehicle(playerid,gPlayerVehicles[gPlayerObserving[playerid]]); | |||
} | |||
//------------------------------------------------ | |||
// IsKeyJustDown. Returns 1 if the key | |||
// has just been pressed, 0 otherwise. | |||
IsKeyJustDown(key, newkeys, oldkeys) | |||
{ | |||
if((newkeys & key) && !(oldkeys & key)) return 1; | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) | |||
{ | |||
if(gPlayerObserving[playerid] >= 0 && IsKeyJustDown(KEY_SPRINT,newkeys,oldkeys)) { | |||
// They're requesting to spawn, so take them out of observer mode | |||
// this will cause them to spawn automatically, using the SpawnInfo | |||
// we previously forced upon them during OnPlayerRequestClass | |||
TogglePlayerSpectating(playerid,0); | |||
gPlayerObserving[playerid] = (-1); | |||
SendClientMessage(playerid,0xFFFFFFFF,"Leaving spectate"); | |||
return; | |||
} | |||
if(gPlayerObserving[playerid] >= 0 && IsKeyJustDown(KEY_FIRE,newkeys,oldkeys)) { | |||
// They're requesting to change observer to another vehicle. | |||
ObserverSwitchToNextVehicle(playerid); | |||
} | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerConnect(playerid) | |||
{ | |||
GameTextForPlayer(playerid,"~w~SA-MP: ~r~RC Barnstorm",5000,5); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerDisconnect(playerid) | |||
{ | |||
if(gPlayerVehicles[playerid]) { | |||
// Make sure their vehicle is destroyed when they leave. | |||
DestroyVehicle(gPlayerVehicles[playerid]); | |||
gPlayerVehicles[playerid] = 0; | |||
} | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
//rcbarron = 464 | |||
public OnPlayerSpawn(playerid) | |||
{ | |||
// Create their own vehicle and put them in | |||
gPlayerVehicles[playerid] = CreateVehicle(464, | |||
gSpawnPositions[playerid][0], | |||
gSpawnPositions[playerid][1], | |||
gSpawnPositions[playerid][2], | |||
gSpawnPositions[playerid][3], | |||
-1,-1,10); | |||
PutPlayerInVehicle(playerid,gPlayerVehicles[playerid],0); | |||
//ForceClassSelection(playerid); // for next time they respawn | |||
TextDrawHideForPlayer(playerid, txtObsHelper); | |||
SetPlayerWorldBounds(playerid,200.0,-300.0,200.0,-200.0); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerDeath(playerid, killerid, reason) | |||
{ | |||
// We need to cleanup their vehicle | |||
RemovePlayerFromVehicle(gPlayerVehicles[playerid]); | |||
DestroyVehicle(gPlayerVehicles[playerid]); | |||
gPlayerVehicles[playerid] = 0; | |||
// Send the death information to all clients | |||
SendDeathMessage(killerid,playerid,reason); | |||
// If anyone was observing them, they'll have to switch to the next | |||
new x=0; | |||
while(x!=MAX_PLAYERS) { | |||
if(x != playerid && gPlayerObserving[x] == playerid) { | |||
ObserverSwitchToNextVehicle(x); | |||
} | |||
x++; | |||
} | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerRequestClass(playerid, classid) | |||
{ | |||
// put them straight into observer mode, effectively | |||
// bypassing class selection. | |||
TogglePlayerSpectating(playerid,1); | |||
ObserverSwitchToNextVehicle(playerid); | |||
TextDrawShowForPlayer(playerid, txtObsHelper); | |||
// also force this dud spawn info upon them so that they | |||
// have spawn information set. | |||
SetSpawnInfo(playerid,0,0, | |||
gSpawnPositions[playerid][0], | |||
gSpawnPositions[playerid][1], | |||
gSpawnPositions[playerid][2], | |||
gSpawnPositions[playerid][3], | |||
-1,-1,-1,-1,-1,-1); | |||
return 0; | |||
} | |||
//------------------------------------------------ | |||
public OnGameModeInit() | |||
{ | |||
SetGameModeText("RC Barnstorm"); | |||
// General settings for the gamemode | |||
ShowPlayerMarkers(0); | |||
ShowNameTags(1); | |||
SetWorldTime(7); | |||
SetWeather(5); | |||
// Add a dud player class | |||
AddPlayerClass(0,0.0,0.0,4.0,0.0,-1,-1,-1,-1,-1,-1); | |||
// Init our globals | |||
new x=0; | |||
while(x!=MAX_PLAYERS) { | |||
gPlayerVehicles[x] = 0; | |||
gPlayerObserving[x] = (-1); | |||
x++; | |||
} | |||
// Init our observer helper text display | |||
txtObsHelper = TextDrawCreate(20.0, 400.0, | |||
"Press ~b~~k~~PED_SPRINT~ ~w~to spawn~n~Press ~b~~k~~PED_FIREWEAPON~ ~w~to switch players"); | |||
TextDrawUseBox(txtObsHelper, 0); | |||
TextDrawFont(txtObsHelper, 2); | |||
TextDrawSetShadow(txtObsHelper,0); | |||
TextDrawSetOutline(txtObsHelper,1); | |||
TextDrawBackgroundColor(txtObsHelper,0x000000FF); | |||
TextDrawColor(txtObsHelper,0xFFFFFFFF); | |||
return 1; | |||
} | |||
//------------------------------------------------ | |||
public OnPlayerUpdate(playerid) | |||
{ | |||
/* | |||
new Keys,ud,lr; | |||
if(GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) { | |||
GetPlayerKeys(playerid,Keys,ud,lr); | |||
if(ud > 0) { | |||
SendClientMessage(playerid, 0xFFFFFFFF, "DOWN"); | |||
} | |||
else if(ud < 0) { | |||
SendClientMessage(playerid, 0xFFFFFFFF, "UP"); | |||
} | |||
if(lr > 0) { | |||
SendClientMessage(playerid, 0xFFFFFFFF, "RIGHT"); | |||
} | |||
else if(lr < 0) { | |||
SendClientMessage(playerid, 0xFFFFFFFF, "LEFT"); | |||
} | |||
}*/ | |||
return 1; | |||
} | |||
//------------------------------------------------ |
@ -0,0 +1,529 @@ | |||
//---------------------------------------------------------- | |||
// | |||
// GRAND LARCENY 1.0 | |||
// A freeroam gamemode for SA-MP 0.3 | |||
// | |||
//---------------------------------------------------------- | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
#include "../include/gl_common.inc" | |||
#include "../include/gl_spawns.inc" | |||
#pragma tabsize 0 | |||
//---------------------------------------------------------- | |||
#define COLOR_WHITE 0xFFFFFFFF | |||
#define COLOR_NORMAL_PLAYER 0xFFBB7777 | |||
#define CITY_LOS_SANTOS 0 | |||
#define CITY_SAN_FIERRO 1 | |||
#define CITY_LAS_VENTURAS 2 | |||
new total_vehicles_from_files=0; | |||
// Class selection globals | |||
new gPlayerCitySelection[MAX_PLAYERS]; | |||
new gPlayerHasCitySelected[MAX_PLAYERS]; | |||
new gPlayerLastCitySelectionTick[MAX_PLAYERS]; | |||
new Text:txtClassSelHelper; | |||
new Text:txtLosSantos; | |||
new Text:txtSanFierro; | |||
new Text:txtLasVenturas; | |||
//new thisanimid=0; | |||
//new lastanimid=0; | |||
//---------------------------------------------------------- | |||
main() | |||
{ | |||
print("\n---------------------------------------"); | |||
print("Running Grand Larceny - by the SA-MP team\n"); | |||
print("---------------------------------------\n"); | |||
} | |||
//---------------------------------------------------------- | |||
public OnPlayerConnect(playerid) | |||
{ | |||
GameTextForPlayer(playerid,"~w~Grand Larceny",3000,4); | |||
SendClientMessage(playerid,COLOR_WHITE,"Welcome to {88AA88}G{FFFFFF}rand {88AA88}L{FFFFFF}arceny"); | |||
// class selection init vars | |||
gPlayerCitySelection[playerid] = -1; | |||
gPlayerHasCitySelected[playerid] = 0; | |||
gPlayerLastCitySelectionTick[playerid] = GetTickCount(); | |||
//SetPlayerColor(playerid,COLOR_NORMAL_PLAYER); | |||
/* | |||
Removes vending machines | |||
RemoveBuildingForPlayer(playerid, 1302, 0.0, 0.0, 0.0, 6000.0); | |||
RemoveBuildingForPlayer(playerid, 1209, 0.0, 0.0, 0.0, 6000.0); | |||
RemoveBuildingForPlayer(playerid, 955, 0.0, 0.0, 0.0, 6000.0); | |||
RemoveBuildingForPlayer(playerid, 1775, 0.0, 0.0, 0.0, 6000.0); | |||
RemoveBuildingForPlayer(playerid, 1776, 0.0, 0.0, 0.0, 6000.0); | |||
*/ | |||
/* | |||
new ClientVersion[32]; | |||
GetPlayerVersion(playerid, ClientVersion, 32); | |||
printf("Player %d reports client version: %s", playerid, ClientVersion);*/ | |||
return 1; | |||
} | |||
//---------------------------------------------------------- | |||
public OnPlayerSpawn(playerid) | |||
{ | |||
if(IsPlayerNPC(playerid)) return 1; | |||
new randSpawn = 0; | |||
SetPlayerInterior(playerid,0); | |||
TogglePlayerClock(playerid,0); | |||
ResetPlayerMoney(playerid); | |||
GivePlayerMoney(playerid, 30000); | |||
if(CITY_LOS_SANTOS == gPlayerCitySelection[playerid]) { | |||
randSpawn = random(sizeof(gRandomSpawns_LosSantos)); | |||
SetPlayerPos(playerid, | |||
gRandomSpawns_LosSantos[randSpawn][0], | |||
gRandomSpawns_LosSantos[randSpawn][1], | |||
gRandomSpawns_LosSantos[randSpawn][2]); | |||
SetPlayerFacingAngle(playerid,gRandomSpawns_LosSantos[randSpawn][3]); | |||
} | |||
else if(CITY_SAN_FIERRO == gPlayerCitySelection[playerid]) { | |||
randSpawn = random(sizeof(gRandomSpawns_SanFierro)); | |||
SetPlayerPos(playerid, | |||
gRandomSpawns_SanFierro[randSpawn][0], | |||
gRandomSpawns_SanFierro[randSpawn][1], | |||
gRandomSpawns_SanFierro[randSpawn][2]); | |||
SetPlayerFacingAngle(playerid,gRandomSpawns_SanFierro[randSpawn][3]); | |||
} | |||
else if(CITY_LAS_VENTURAS == gPlayerCitySelection[playerid]) { | |||
randSpawn = random(sizeof(gRandomSpawns_LasVenturas)); | |||
SetPlayerPos(playerid, | |||
gRandomSpawns_LasVenturas[randSpawn][0], | |||
gRandomSpawns_LasVenturas[randSpawn][1], | |||
gRandomSpawns_LasVenturas[randSpawn][2]); | |||
SetPlayerFacingAngle(playerid,gRandomSpawns_LasVenturas[randSpawn][3]); | |||
} | |||
//SetPlayerColor(playerid,COLOR_NORMAL_PLAYER); | |||
/* | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL_SILENCED,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_DESERT_EAGLE,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_SHOTGUN,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_SAWNOFF_SHOTGUN,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_SPAS12_SHOTGUN,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_MICRO_UZI,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_MP5,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_AK47,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_M4,200); | |||
SetPlayerSkillLevel(playerid,WEAPONSKILL_SNIPERRIFLE,200);*/ | |||
GivePlayerWeapon(playerid,WEAPON_COLT45,100); | |||
//GivePlayerWeapon(playerid,WEAPON_MP5,100); | |||
TogglePlayerClock(playerid, 0); | |||
return 1; | |||
} | |||
//---------------------------------------------------------- | |||
public OnPlayerDeath(playerid, killerid, reason) | |||
{ | |||
new playercash; | |||
// if they ever return to class selection make them city | |||
// select again first | |||
gPlayerHasCitySelected[playerid] = 0; | |||
if(killerid == INVALID_PLAYER_ID) { | |||
ResetPlayerMoney(playerid); | |||
} else { | |||
playercash = GetPlayerMoney(playerid); | |||
if(playercash > 0) { | |||
GivePlayerMoney(killerid, playercash); | |||
ResetPlayerMoney(playerid); | |||
} | |||
} | |||
return 1; | |||
} | |||
//---------------------------------------------------------- | |||
ClassSel_SetupCharSelection(playerid) | |||
{ | |||
if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) { | |||
SetPlayerInterior(playerid,11); | |||
SetPlayerPos(playerid,508.7362,-87.4335,998.9609); | |||
SetPlayerFacingAngle(playerid,0.0); | |||
SetPlayerCameraPos(playerid,508.7362,-83.4335,998.9609); | |||
SetPlayerCameraLookAt(playerid,508.7362,-87.4335,998.9609); | |||
} | |||
else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) { | |||
SetPlayerInterior(playerid,3); | |||
SetPlayerPos(playerid,-2673.8381,1399.7424,918.3516); | |||
SetPlayerFacingAngle(playerid,181.0); | |||
SetPlayerCameraPos(playerid,-2673.2776,1394.3859,918.3516); | |||
SetPlayerCameraLookAt(playerid,-2673.8381,1399.7424,918.3516); | |||
} | |||
else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) { | |||
SetPlayerInterior(playerid,3); | |||
SetPlayerPos(playerid,349.0453,193.2271,1014.1797); | |||
SetPlayerFacingAngle(playerid,286.25); | |||
SetPlayerCameraPos(playerid,352.9164,194.5702,1014.1875); | |||
SetPlayerCameraLookAt(playerid,349.0453,193.2271,1014.1797); | |||
} | |||
} | |||
//---------------------------------------------------------- | |||
// Used to init textdraws of city names | |||
ClassSel_InitCityNameText(Text:txtInit) | |||
{ | |||
TextDrawUseBox(txtInit, 0); | |||
TextDrawLetterSize(txtInit,1.25,3.0); | |||
TextDrawFont(txtInit, 0); | |||
TextDrawSetShadow(txtInit,0); | |||
TextDrawSetOutline(txtInit,1); | |||
TextDrawColor(txtInit,0xEEEEEEFF); | |||
TextDrawBackgroundColor(txtClassSelHelper,0x000000FF); | |||
} | |||
//---------------------------------------------------------- | |||
ClassSel_InitTextDraws() | |||
{ | |||
// Init our observer helper text display | |||
txtLosSantos = TextDrawCreate(10.0, 380.0, "Los Santos"); | |||
ClassSel_InitCityNameText(txtLosSantos); | |||
txtSanFierro = TextDrawCreate(10.0, 380.0, "San Fierro"); | |||
ClassSel_InitCityNameText(txtSanFierro); | |||
txtLasVenturas = TextDrawCreate(10.0, 380.0, "Las Venturas"); | |||
ClassSel_InitCityNameText(txtLasVenturas); | |||
// Init our observer helper text display | |||
txtClassSelHelper = TextDrawCreate(10.0, 415.0, | |||
" Press ~b~~k~~GO_LEFT~ ~w~or ~b~~k~~GO_RIGHT~ ~w~to switch cities.~n~ Press ~r~~k~~PED_FIREWEAPON~ ~w~to select."); | |||
TextDrawUseBox(txtClassSelHelper, 1); | |||
TextDrawBoxColor(txtClassSelHelper,0x222222BB); | |||
TextDrawLetterSize(txtClassSelHelper,0.3,1.0); | |||
TextDrawTextSize(txtClassSelHelper,400.0,40.0); | |||
TextDrawFont(txtClassSelHelper, 2); | |||
TextDrawSetShadow(txtClassSelHelper,0); | |||
TextDrawSetOutline(txtClassSelHelper,1); | |||
TextDrawBackgroundColor(txtClassSelHelper,0x000000FF); | |||
TextDrawColor(txtClassSelHelper,0xFFFFFFFF); | |||
} | |||
//---------------------------------------------------------- | |||
ClassSel_SetupSelectedCity(playerid) | |||
{ | |||
if(gPlayerCitySelection[playerid] == -1) { | |||
gPlayerCitySelection[playerid] = CITY_LOS_SANTOS; | |||
} | |||
if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) { | |||
SetPlayerInterior(playerid,0); | |||
SetPlayerCameraPos(playerid,1630.6136,-2286.0298,110.0); | |||
SetPlayerCameraLookAt(playerid,1887.6034,-1682.1442,47.6167); | |||
TextDrawShowForPlayer(playerid,txtLosSantos); | |||
TextDrawHideForPlayer(playerid,txtSanFierro); | |||
TextDrawHideForPlayer(playerid,txtLasVenturas); | |||
} | |||
else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) { | |||
SetPlayerInterior(playerid,0); | |||
SetPlayerCameraPos(playerid,-1300.8754,68.0546,129.4823); | |||
SetPlayerCameraLookAt(playerid,-1817.9412,769.3878,132.6589); | |||
TextDrawHideForPlayer(playerid,txtLosSantos); | |||
TextDrawShowForPlayer(playerid,txtSanFierro); | |||
TextDrawHideForPlayer(playerid,txtLasVenturas); | |||
} | |||
else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) { | |||
SetPlayerInterior(playerid,0); | |||
SetPlayerCameraPos(playerid,1310.6155,1675.9182,110.7390); | |||
SetPlayerCameraLookAt(playerid,2285.2944,1919.3756,68.2275); | |||
TextDrawHideForPlayer(playerid,txtLosSantos); | |||
TextDrawHideForPlayer(playerid,txtSanFierro); | |||
TextDrawShowForPlayer(playerid,txtLasVenturas); | |||
} | |||
} | |||
//---------------------------------------------------------- | |||
ClassSel_SwitchToNextCity(playerid) | |||
{ | |||
gPlayerCitySelection[playerid]++; | |||
if(gPlayerCitySelection[playerid] > CITY_LAS_VENTURAS) { | |||
gPlayerCitySelection[playerid] = CITY_LOS_SANTOS; | |||
} | |||
PlayerPlaySound(playerid,1052,0.0,0.0,0.0); | |||
gPlayerLastCitySelectionTick[playerid] = GetTickCount(); | |||
ClassSel_SetupSelectedCity(playerid); | |||
} | |||
//---------------------------------------------------------- | |||
ClassSel_SwitchToPreviousCity(playerid) | |||
{ | |||
gPlayerCitySelection[playerid]--; | |||
if(gPlayerCitySelection[playerid] < CITY_LOS_SANTOS) { | |||
gPlayerCitySelection[playerid] = CITY_LAS_VENTURAS; | |||
} | |||
PlayerPlaySound(playerid,1053,0.0,0.0,0.0); | |||
gPlayerLastCitySelectionTick[playerid] = GetTickCount(); | |||
ClassSel_SetupSelectedCity(playerid); | |||
} | |||
//---------------------------------------------------------- | |||
ClassSel_HandleCitySelection(playerid) | |||
{ | |||
new Keys,ud,lr; | |||
GetPlayerKeys(playerid,Keys,ud,lr); | |||
if(gPlayerCitySelection[playerid] == -1) { | |||
ClassSel_SwitchToNextCity(playerid); | |||
return; | |||
} | |||
// only allow new selection every ~500 ms | |||
if( (GetTickCount() - gPlayerLastCitySelectionTick[playerid]) < 500 ) return; | |||
if(Keys & KEY_FIRE) { | |||
gPlayerHasCitySelected[playerid] = 1; | |||
TextDrawHideForPlayer(playerid,txtClassSelHelper); | |||
TextDrawHideForPlayer(playerid,txtLosSantos); | |||
TextDrawHideForPlayer(playerid,txtSanFierro); | |||
TextDrawHideForPlayer(playerid,txtLasVenturas); | |||
TogglePlayerSpectating(playerid,0); | |||
return; | |||
} | |||
if(lr > 0) { | |||
ClassSel_SwitchToNextCity(playerid); | |||
} | |||
else if(lr < 0) { | |||
ClassSel_SwitchToPreviousCity(playerid); | |||
} | |||
} | |||
//---------------------------------------------------------- | |||
public OnPlayerRequestClass(playerid, classid) | |||
{ | |||
if(IsPlayerNPC(playerid)) return 1; | |||
if(gPlayerHasCitySelected[playerid]) { | |||
ClassSel_SetupCharSelection(playerid); | |||
return 1; | |||
} else { | |||
if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING) { | |||
TogglePlayerSpectating(playerid,1); | |||
TextDrawShowForPlayer(playerid, txtClassSelHelper); | |||
gPlayerCitySelection[playerid] = -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
//---------------------------------------------------------- | |||
public OnGameModeInit() | |||
{ | |||
SetGameModeText("Grand Larceny"); | |||
ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL); | |||
ShowNameTags(1); | |||
SetNameTagDrawDistance(40.0); | |||
EnableStuntBonusForAll(0); | |||
DisableInteriorEnterExits(); | |||
SetWeather(2); | |||
SetWorldTime(11); | |||
//SetObjectsDefaultCameraCol(true); | |||
//UsePlayerPedAnims(); | |||
//ManualVehicleEngineAndLights(); | |||
//LimitGlobalChatRadius(300.0); | |||
ClassSel_InitTextDraws(); | |||
// Player Class | |||
AddPlayerClass(298,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(299,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(300,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(301,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(302,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(303,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(304,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(305,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(280,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(281,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(282,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(283,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(284,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(285,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(286,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(287,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(288,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(265,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(266,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(267,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(268,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(269,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(270,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(1,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(2,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(3,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(4,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(5,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(6,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(8,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(42,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(65,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
//AddPlayerClass(74,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(86,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(119,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(149,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(208,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(273,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(47,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(48,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(49,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(50,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(51,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(52,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(53,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(54,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(55,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(56,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(57,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(58,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(68,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(69,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(70,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(71,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(72,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(73,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(75,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(76,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(78,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(79,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(80,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(81,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(82,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(83,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(84,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(85,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(87,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(88,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(89,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(91,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(92,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(93,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(95,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(96,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(97,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(98,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
AddPlayerClass(99,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); | |||
// SPECIAL | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/trains.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/pilots.txt"); | |||
// LAS VENTURAS | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_law.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_airport.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_gen.txt"); | |||
// SAN FIERRO | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_law.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_airport.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_gen.txt"); | |||
// LOS SANTOS | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_law.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_airport.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_inner.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_outer.txt"); | |||
// OTHER AREAS | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/whetstone.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/bone.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/flint.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/tierra.txt"); | |||
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/red_county.txt"); | |||
printf("Total vehicles from files: %d",total_vehicles_from_files); | |||
return 1; | |||
} | |||
//---------------------------------------------------------- | |||
public OnPlayerUpdate(playerid) | |||
{ | |||
if(!IsPlayerConnected(playerid)) return 0; | |||
if(IsPlayerNPC(playerid)) return 1; | |||
// changing cities by inputs | |||
if( !gPlayerHasCitySelected[playerid] && | |||
GetPlayerState(playerid) == PLAYER_STATE_SPECTATING ) { | |||
ClassSel_HandleCitySelection(playerid); | |||
return 1; | |||
} | |||
// No weapons in interiors | |||
//if(GetPlayerInterior(playerid) != 0 && GetPlayerWeapon(playerid) != 0) { | |||
//SetPlayerArmedWeapon(playerid,0); // fists | |||
//return 0; // no syncing until they change their weapon | |||
//} | |||
// Don't allow minigun | |||
if(GetPlayerWeapon(playerid) == WEAPON_MINIGUN) { | |||
Kick(playerid); | |||
return 0; | |||
} | |||
/* No jetpacks allowed | |||
if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK) { | |||
Kick(playerid); | |||
return 0; | |||
}*/ | |||
/* For testing animations | |||
new msg[128+1]; | |||
new animlib[32+1]; | |||
new animname[32+1]; | |||
thisanimid = GetPlayerAnimationIndex(playerid); | |||
if(lastanimid != thisanimid) | |||
{ | |||
GetAnimationName(thisanimid,animlib,32,animname,32); | |||
format(msg, 128, "anim(%d,%d): %s %s", lastanimid, thisanimid, animlib, animname); | |||
lastanimid = thisanimid; | |||
SendClientMessage(playerid, 0xFFFFFFFF, msg); | |||
}*/ | |||
return 1; | |||
} | |||
//---------------------------------------------------------- |
@ -0,0 +1,630 @@ | |||
//--------------------------------------------------------- | |||
// | |||
// Rivershell v2 by Kye - 2006-2013 | |||
// | |||
//--------------------------------------------------------- | |||
#include <a_samp> | |||
#include <core> | |||
#include <float> | |||
// Global stuff and defines for our gamemode. | |||
static gTeam[MAX_PLAYERS]; // Tracks the team assignment for each player | |||
#define OBJECTIVE_VEHICLE_GREEN 2 | |||
#define OBJECTIVE_VEHICLE_BLUE 1 | |||
#define TEAM_GREEN 1 | |||
#define TEAM_BLUE 2 | |||
#define OBJECTIVE_COLOR 0xE2C063FF | |||
#define TEAM_GREEN_COLOR 0x77CC77FF | |||
#define TEAM_BLUE_COLOR 0x7777DDFF | |||
#define CAPS_TO_WIN 5 | |||
#define ALLOW_RESPAWN_AFTER_N_SECONDS 20 | |||
#define SPECTATE_STATE_NONE 0 | |||
#define SPECTATE_STATE_PLAYER 1 | |||
#define SPECTATE_STATE_FIXED 2 | |||
#define SPECTATE_MODE_NONE 0 | |||
#define SPECTATE_MODE_PLAYER 1 | |||
#define SPECTATE_MODE_VEHICLE 2 | |||
new gObjectiveReached = 0; // Stops the winner logic reentering itself. | |||
new gObjectiveGreenPlayer=(-1); // Tracks which green player has the vehicle. | |||
new gObjectiveBluePlayer=(-1); // Tracks which blue player has the vehicle. | |||
// number of times the vehicle has been captured by each team | |||
new gGreenTimesCapped=0; | |||
new gBlueTimesCapped=0; | |||
// forward declarations for the PAWN compiler (not really needed, but there for the sake of clarity) | |||
forward SetPlayerToTeamColor(playerid); | |||
forward SetupPlayerForClassSelection(playerid); | |||
forward SetPlayerTeamFromClass(playerid,classid); | |||
forward ExitTheGameMode(); | |||
//--------------------------------------------------------- | |||
main() | |||
{ | |||
print("\n----------------------------------"); | |||
print(" Rivershell by Kye 2006-2013\n"); | |||
print("----------------------------------\n"); | |||
} | |||
//--------------------------------------------------------- | |||
public SetPlayerToTeamColor(playerid) | |||
{ | |||
if(gTeam[playerid] == TEAM_GREEN) { | |||
SetPlayerColor(playerid, TEAM_GREEN_COLOR); // green | |||
} else if(gTeam[playerid] == TEAM_BLUE) { | |||
SetPlayerColor(playerid, TEAM_BLUE_COLOR); // blue | |||
} | |||
} | |||
//--------------------------------------------------------- | |||
public SetupPlayerForClassSelection(playerid) | |||
{ | |||
// Set the player's orientation when they're selecting a class. | |||
SetPlayerPos(playerid,1984.4445,157.9501,55.9384); | |||
SetPlayerCameraPos(playerid,1984.4445,160.9501,55.9384); | |||
SetPlayerCameraLookAt(playerid,1984.4445,157.9501,55.9384); | |||
SetPlayerFacingAngle(playerid,0.0); | |||
} | |||
//--------------------------------------------------------- | |||
public SetPlayerTeamFromClass(playerid,classid) | |||
{ | |||
// Set their team number based on the class they selected. | |||
if(classid == 0 || classid == 1) { | |||
SetPlayerTeam(playerid, TEAM_GREEN); | |||
gTeam[playerid] = TEAM_GREEN; | |||
} | |||
else if(classid == 2 || classid == 3) { | |||
SetPlayerTeam(playerid, TEAM_BLUE); | |||
gTeam[playerid] = TEAM_BLUE; | |||
} | |||
} | |||
//--------------------------------------------------------- | |||
public ExitTheGameMode() | |||
{ | |||
PlaySoundForAll(1186, 0.0, 0.0, 0.0); // Stops the music | |||
//printf("Exiting Game Mode"); | |||
GameModeExit(); | |||
} | |||
//--------------------------------------------------------- | |||
public OnPlayerStateChange(playerid, newstate, oldstate) | |||
{ | |||
new vehicleid; | |||
if(newstate == PLAYER_STATE_DRIVER) | |||
{ | |||
vehicleid = GetPlayerVehicleID(playerid); | |||
if(gTeam[playerid] == TEAM_GREEN && vehicleid == OBJECTIVE_VEHICLE_GREEN) | |||
{ // It's the objective vehicle | |||
SetPlayerColor(playerid,OBJECTIVE_COLOR); | |||
GameTextForPlayer(playerid,"~w~Take the ~y~boat ~w~back to the ~r~spawn!",3000,5); | |||
SetPlayerCheckpoint(playerid, 2135.7368, -179.8811, -0.5323, 10.0); | |||
gObjectiveGreenPlayer = playerid; | |||
} | |||
if(gTeam[playerid] == TEAM_BLUE && vehicleid == OBJECTIVE_VEHICLE_BLUE) | |||
{ // It's the objective vehicle | |||
SetPlayerColor(playerid,OBJECTIVE_COLOR); | |||
GameTextForPlayer(playerid,"~w~Take the ~y~boat ~w~back to the ~r~spawn!",3000,5); | |||
SetPlayerCheckpoint(playerid, 2329.4226, 532.7426, 0.5862, 10.0); | |||
gObjectiveBluePlayer = playerid; | |||
} | |||
} | |||
else if(newstate == PLAYER_STATE_ONFOOT) | |||
{ | |||
if(playerid == gObjectiveGreenPlayer) { | |||
gObjectiveGreenPlayer = (-1); | |||
SetPlayerToTeamColor(playerid); | |||
DisablePlayerCheckpoint(playerid); | |||
} | |||
if(playerid == gObjectiveBluePlayer) { | |||
gObjectiveBluePlayer = (-1); | |||
SetPlayerToTeamColor(playerid); | |||
DisablePlayerCheckpoint(playerid); | |||
} | |||
} | |||
return 1; | |||
} | |||
//--------------------------------------------------------- | |||
public OnGameModeInit() | |||
{ | |||
SetGameModeText("Rivershell"); | |||
ShowPlayerMarkers(0); | |||
ShowNameTags(1); | |||
SetWorldTime(17); | |||
SetWeather(11); | |||
UsePlayerPedAnims(); | |||
EnableVehicleFriendlyFire(); | |||
SetNameTagDrawDistance(110.0); | |||
DisableInteriorEnterExits(); | |||
// Green classes | |||
AddPlayerClass(162,2117.0129,-224.4389,8.15,0.0,31,100,29,200,34,10); | |||
AddPlayerClass(157,2148.6606,-224.3336,8.15,347.1396,31,100,29,200,34,10); | |||
// Blue classes | |||
AddPlayerClass(154,2352.9873,580.3051,7.7813,178.1424,31,100,29,200,34,10); | |||
AddPlayerClass(138,2281.1504,567.6248,7.7813,163.7289,31,100,29,200,34,10); | |||
// Objective vehicles | |||
CreateVehicle(453, 2184.7156, -188.5401, -0.0239, 0.0000, 114, 1, 100); // gr reefer | |||
CreateVehicle(453, 2380.0542, 535.2582, -0.0272, 178.4999, 79, 7, 100); // bl reefer | |||
// Green Dhingys | |||
CreateVehicle(473, 2096.0833, -168.7771, 0.3528, 4.5000, 114, 1, 100); | |||
CreateVehicle(473, 2103.2510, -168.7598, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2099.4966, -168.8216, 0.3528, 2.8200, 114, 1, 100); | |||
CreateVehicle(473, 2107.1143, -168.7798, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2111.0674, -168.7609, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2114.8933, -168.7898, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2167.2217, -169.0570, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2170.4294, -168.9724, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2173.7952, -168.9217, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2177.0386, -168.9767, 0.3528, 3.1800, 114, 1, 100); | |||
CreateVehicle(473, 2161.5786, -191.9538, 0.3528, 89.1000, 114, 1, 100); | |||
CreateVehicle(473, 2161.6394, -187.2925, 0.3528, 89.1000, 114, 1, 100); | |||
CreateVehicle(473, 2161.7610, -183.0225, 0.3528, 89.1000, 114, 1, 100); | |||
CreateVehicle(473, 2162.0283, -178.5106, 0.3528, 89.1000, 114, 1, 100); | |||
// Green Mavericks | |||
CreateVehicle(487, 2088.7905, -227.9593, 8.3662, 0.0000, 114, 1, 100); | |||
CreateVehicle(487, 2204.5991, -225.3703, 8.2400, 0.0000, 114, 1, 100); | |||
// Blue Dhingys | |||
CreateVehicle(473, 2370.3198, 518.3151, 0.1240, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2362.6484, 518.3978, 0.0598, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2358.6550, 518.2167, 0.2730, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2366.5544, 518.2680, 0.1080, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2354.6321, 518.1960, 0.3597, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2350.7449, 518.1929, 0.3597, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2298.8977, 518.4470, 0.3597, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2295.6118, 518.3963, 0.3597, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2292.3237, 518.4249, 0.3597, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2289.0901, 518.4363, 0.3597, 180.3600, 79, 7, 100); | |||
CreateVehicle(473, 2304.8232, 539.7859, 0.3597, 270.5998, 79, 7, 100); | |||
CreateVehicle(473, 2304.6936, 535.0454, 0.3597, 270.5998, 79, 7, 100); | |||
CreateVehicle(473, 2304.8245, 530.3308, 0.3597, 270.5998, 79, 7, 100); | |||
CreateVehicle(473, 2304.8142, 525.7471, 0.3597, 270.5998, 79, 7, 100); | |||
// Blue Mavericks | |||
CreateVehicle(487, 2260.2637, 578.5220, 8.1223, 182.3401, 79, 7, 100); | |||
CreateVehicle(487, 2379.9792, 580.0323, 8.0178, 177.9601, 79, 7, 100); | |||
// Green Base Section | |||
CreateMapObject(9090, 2148.64, -222.88, -20.60, 0.00, 0.00, 179.70); | |||
// Green resupply hut | |||
CreateMapObject(12991, 2140.83, -235.13, 7.13, 0.00, 0.00, -89.94); | |||
// Blue Base Section | |||
CreateMapObject(9090, 2317.09, 572.27, -20.97, 0.00, 0.00, 0.00); | |||
// Blue resupply hut | |||
CreateMapObject(12991, 2318.73, 590.96, 6.75, 0.00, 0.00, 89.88); | |||
// General mapping | |||
CreateMapObject(12991, 2140.83, -235.13, 7.13, 0.00, 0.00, -89.94); | |||
CreateMapObject(19300, 2137.33, -237.17, 46.61, 0.00, 0.00, 180.00); | |||
CreateMapObject(12991, 2318.73, 590.96, 6.75, 0.00, 0.00, 89.88); | |||
CreateMapObject(19300, 2325.41, 587.93, 47.37, 0.00, 0.00, 180.00); | |||
CreateMapObject(12991, 2140.83, -235.13, 7.13, 0.00, 0.00, -89.94); | |||
CreateMapObject(12991, 2318.73, 590.96, 6.75, 0.00, 0.00, 89.88); | |||
CreateMapObject(12991, 2140.83, -235.13, 7.13, 0.00, 0.00, -89.94); | |||
CreateMapObject(12991, 2318.73, 590.96, 6.75, 0.00, 0.00, 89.88); | |||
CreateMapObject(18228, 1887.93, -59.78, -2.14, 0.00, 0.00, 20.34); | |||
CreateMapObject(17031, 1990.19, 541.37, -22.32, 0.00, 0.00, 0.00); | |||
CreateMapObject(18227, 2000.82, 494.15, -7.53, 11.70, -25.74, 154.38); | |||
CreateMapObject(17031, 1992.35, 539.80, -2.97, 9.12, 30.66, 0.00); | |||
CreateMapObject(17031, 1991.88, 483.77, -0.66, -2.94, -5.22, 12.78); | |||
CreateMapObject(17029, 2070.57, -235.87, -6.05, -7.20, 4.08, 114.30); | |||
CreateMapObject(17029, 2056.50, -228.77, -19.67, 14.16, 19.68, 106.56); | |||
CreateMapObject(17029, 2074.00, -205.33, -18.60, 16.02, 60.60, 118.86); | |||
CreateMapObject(17029, 2230.39, -242.59, -11.41, 5.94, 7.56, 471.24); | |||
CreateMapObject(17029, 2252.53, -213.17, -20.81, 18.90, -6.30, -202.38); | |||
CreateMapObject(17029, 2233.04, -234.08, -19.00, 21.84, -8.88, -252.06); | |||
CreateMapObject(17027, 2235.05, -201.49, -11.90, -11.94, -4.08, 136.32); | |||
CreateMapObject(17029, 2226.11, -237.07, -2.45, 8.46, 2.10, 471.24); | |||
CreateMapObject(4368, 2433.79, 446.26, 4.67, -8.04, -9.30, 61.02); | |||
CreateMapObject(4368, 2031.23, 489.92, -13.20, -8.04, -9.30, -108.18); | |||
CreateMapObject(17031, 2458.36, 551.10, -6.95, 0.00, 0.00, 0.00); | |||
CreateMapObject(17031, 2465.37, 511.35, -7.70, 0.00, 0.00, 0.00); | |||
CreateMapObject(17031, 2474.80, 457.71, -5.17, 0.00, 0.00, 172.74); | |||
CreateMapObject(17031, 2466.03, 426.28, -5.17, 0.00, 0.00, 0.00); | |||
CreateMapObject(791, 2310.45, -229.38, 7.41, 0.00, 0.00, 0.00); | |||
CreateMapObject(791, 2294.00, -180.15, 7.41, 0.00, 0.00, 60.90); | |||
CreateMapObject(791, 2017.50, -305.30, 7.29, 0.00, 0.00, 60.90); | |||
CreateMapObject(791, 2106.45, -279.86, 20.05, 0.00, 0.00, 60.90); | |||
CreateMapObject(706, 2159.13, -263.71, 19.22, 356.86, 0.00, -17.18); | |||
CreateMapObject(706, 2055.75, -291.53, 13.98, 356.86, 0.00, -66.50); | |||
CreateMapObject(791, 1932.65, -315.88, 6.77, 0.00, 0.00, -35.76); | |||
CreateMapObject(790, 2429.40, 575.79, 10.42, 0.00, 0.00, 3.14); | |||
CreateMapObject(790, 2403.40, 581.56, 10.42, 0.00, 0.00, 29.48); | |||
CreateMapObject(791, 2083.44, 365.48, 13.19, 356.86, 0.00, -1.95); | |||
CreateMapObject(791, 2040.15, 406.02, 13.33, 356.86, 0.00, -1.95); | |||
CreateMapObject(791, 1995.36, 588.10, 7.50, 356.86, 0.00, -1.95); | |||
CreateMapObject(791, 2126.11, 595.15, 5.99, 0.00, 0.00, -35.82); | |||
CreateMapObject(791, 2188.35, 588.90, 6.04, 0.00, 0.00, 0.00); | |||
CreateMapObject(791, 2068.56, 595.58, 5.99, 0.00, 0.00, 52.62); | |||
CreateMapObject(698, 2385.32, 606.16, 9.79, 0.00, 0.00, 34.62); | |||
CreateMapObject(698, 2309.29, 606.92, 9.79, 0.00, 0.00, -54.54); | |||
CreateMapObject(790, 2347.14, 619.77, 9.94, 0.00, 0.00, 3.14); | |||
CreateMapObject(698, 2255.28, 606.94, 9.79, 0.00, 0.00, -92.76); | |||
CreateMapObject(4298, 2121.37, 544.12, -5.74, -10.86, 6.66, 3.90); | |||
CreateMapObject(4368, 2273.18, 475.02, -15.30, 4.80, 8.10, 266.34); | |||
CreateMapObject(18227, 2232.38, 451.61, -30.71, -18.54, -6.06, 154.38); | |||
CreateMapObject(17031, 2228.15, 518.87, -16.51, 13.14, -1.32, -20.10); | |||
CreateMapObject(17031, 2230.42, 558.52, -18.38, -2.94, -5.22, 12.78); | |||
CreateMapObject(17031, 2228.97, 573.62, 5.17, 17.94, -15.60, -4.08); | |||
CreateMapObject(17029, 2116.67, -87.71, -2.31, 5.94, 7.56, 215.22); | |||
CreateMapObject(17029, 2078.66, -83.87, -27.30, 13.02, -53.94, -0.30); | |||
CreateMapObject(17029, 2044.80, -36.91, -9.26, -13.74, 27.90, 293.76); | |||
CreateMapObject(17029, 2242.41, 426.16, -15.43, -21.54, 22.26, 154.80); | |||
CreateMapObject(17029, 2220.06, 450.07, -34.78, -1.32, 10.20, -45.84); | |||
CreateMapObject(17029, 2252.49, 439.08, -19.47, -41.40, 20.16, 331.86); | |||
CreateMapObject(17031, 2241.41, 431.93, -5.62, -2.22, -4.80, 53.64); | |||
CreateMapObject(17029, 2141.10, -81.30, -2.41, 5.94, 7.56, 39.54); | |||
CreateMapObject(17031, 2277.07, 399.31, -1.65, -2.22, -4.80, -121.74); | |||
CreateMapObject(17026, 2072.75, -224.40, -5.25, 0.00, 0.00, -41.22); | |||
// Ramps | |||
CreateMapObject(1632, 2131.97, 110.24, 0.00, 0.00, 0.00, 153.72); | |||
CreateMapObject(1632, 2124.59, 113.69, 0.00, 0.00, 0.00, 157.56); | |||
CreateMapObject(1632, 2116.31, 116.44, 0.00, 0.00, 0.00, 160.08); | |||
CreateMapObject(1632, 2113.22, 108.48, 0.00, 0.00, 0.00, 340.20); | |||
CreateMapObject(1632, 2121.21, 105.21, 0.00, 0.00, 0.00, 340.20); | |||
CreateMapObject(1632, 2127.84, 102.06, 0.00, 0.00, 0.00, 334.68); | |||
CreateMapObject(1632, 2090.09, 40.90, 0.00, 0.00, 0.00, 348.36); | |||
CreateMapObject(1632, 2098.73, 39.12, 0.00, 0.00, 0.00, 348.36); | |||
CreateMapObject(1632, 2107.17, 37.94, 0.00, 0.00, 0.00, 348.36); | |||
CreateMapObject(1632, 2115.88, 36.47, 0.00, 0.00, 0.00, 348.36); | |||
CreateMapObject(1632, 2117.46, 45.86, 0.00, 0.00, 0.00, 529.20); | |||
CreateMapObject(1632, 2108.98, 46.95, 0.00, 0.00, 0.00, 529.20); | |||
CreateMapObject(1632, 2100.42, 48.11, 0.00, 0.00, 0.00, 526.68); | |||
CreateMapObject(1632, 2091.63, 50.02, 0.00, 0.00, 0.00, 526.80); | |||
return 1; | |||
} | |||
//--------------------------------------------------------- | |||
public OnPlayerConnect(playerid) | |||
{ | |||
SetPlayerColor(playerid,0x888888FF); | |||
GameTextForPlayer(playerid,"~r~SA-MP: ~w~Rivershell",2000,5); | |||
RemoveNeededBuildingsForPlayer(playerid); | |||
return 1; | |||
} | |||
//--------------------------------------------------------- | |||
public OnPlayerRequestClass(playerid, classid) | |||
{ | |||
SetupPlayerForClassSelection(playerid); | |||
SetPlayerTeamFromClass(playerid,classid); | |||
if(classid == 0 || classid == 1) { | |||
GameTextForPlayer(playerid,"~g~GREEN ~w~TEAM",1000,5); | |||
} else if(classid == 2 || classid == 3) { | |||
GameTextForPlayer(playerid,"~b~BLUE ~w~TEAM",1000,5); | |||
} | |||
return 1; | |||
} | |||
//--------------------------------------------------------- | |||
public OnPlayerSpawn(playerid) | |||
{ | |||
// Wait a bit before allowing them to respawn. Switch to spectate mode. | |||
if( GetPVarInt(playerid, "LastDeathTick") != 0 && | |||
GetTickCount() - GetPVarInt(playerid, "LastDeathTick") < (ALLOW_RESPAWN_AFTER_N_SECONDS * 1000) ) | |||
{ | |||
SendClientMessage(playerid, 0xFFAAEEEE, "Waiting to respawn...."); | |||
TogglePlayerSpectating(playerid, 1); | |||
// If the last killer id is valid, we should try setting it now to avoid any camera lag switching to spectate. | |||
new LastKillerId = GetPVarInt(playerid, "LastKillerId"); | |||
if( IsPlayerConnected(LastKillerId) && | |||
(GetPlayerState(LastKillerId) == PLAYER_STATE_ONFOOT || | |||
GetPlayerState(LastKillerId) == PLAYER_STATE_DRIVER || | |||
GetPlayerState(LastKillerId) == PLAYER_STATE_PASSENGER) ) | |||
{ | |||
SpectatePlayer(playerid, LastKillerId); | |||
SetPVarInt(playerid, "SpectateState", SPECTATE_STATE_PLAYER); | |||
} | |||
return 1; | |||
} | |||
SetPlayerToTeamColor(playerid); | |||
if(gTeam[playerid] == TEAM_GREEN) { | |||
GameTextForPlayer(playerid, | |||
"Defend the ~g~GREEN ~w~team's ~y~Reefer~n~~w~Capture the ~b~BLUE ~w~team's ~y~Reefer", | |||
6000,5); | |||
} | |||
else if(gTeam[playerid] == TEAM_BLUE) { | |||
GameTextForPlayer(playerid, | |||
"Defend the ~b~BLUE ~w~team's ~y~Reefer~n~~w~Capture the ~g~GREEN ~w~team's ~y~Reefer", | |||
6000,5); | |||
} | |||
SetPlayerHealth(playerid, 100.0); | |||
SetPlayerArmour(playerid, 100.0); | |||
SetPlayerWorldBounds(playerid, 2500.0, 1850.0, 631.2963, -454.9898); | |||
SetPVarInt(playerid, "SpectateState", SPECTATE_STATE_NONE); | |||
SetPVarInt(playerid, "SpectateMode", SPECTATE_MODE_NONE); | |||
return 1; | |||
} | |||
//--------------------------------------------------------- | |||
public OnPlayerEnterCheckpoint(playerid) | |||
{ | |||
new playervehicleid = GetPlayerVehicleID(playerid); | |||
if(gObjectiveReached) return; | |||
if(playervehicleid == OBJECTIVE_VEHICLE_GREEN && gTeam[playerid] == TEAM_GREEN) | |||
{ // Green OBJECTIVE REACHED. | |||
gGreenTimesCapped++; | |||
SetPlayerScore(playerid,GetPlayerScore(playerid)+5); | |||
if(gGreenTimesCapped==CAPS_TO_WIN) { | |||
GameTextForAll("~g~GREEN ~w~team wins!",3000,5); | |||
gObjectiveReached = 1; PlaySoundForAll(1185, 0.0, 0.0, 0.0); | |||
SetTimer("ExitTheGameMode", 6000, 0); // Set up a timer to exit this mode. | |||
} else { | |||
GameTextForAll("~g~GREEN ~w~team captured the ~y~boat!",3000,5); | |||
SetVehicleToRespawn(OBJECTIVE_VEHICLE_GREEN); | |||
} | |||
return; | |||
} | |||
else if(playervehicleid == OBJECTIVE_VEHICLE_BLUE && gTeam[playerid] == TEAM_BLUE) | |||
{ // Blue OBJECTIVE REACHED. | |||
gBlueTimesCapped++; | |||
SetPlayerScore(playerid,GetPlayerScore(playerid)+5); | |||
if(gBlueTimesCapped==CAPS_TO_WIN) { | |||
GameTextForAll("~b~BLUE ~w~team wins!",3000,5); | |||
gObjectiveReached = 1; PlaySoundForAll(1185, 0.0, 0.0, 0.0); | |||
SetTimer("ExitTheGameMode", 6000, 0); // Set up a timer to exit this mode. | |||
} else { | |||
GameTextForAll("~b~BLUE ~w~team captured the ~y~boat!",3000,5); | |||
SetVehicleToRespawn(OBJECTIVE_VEHICLE_BLUE); | |||
} | |||
return; | |||
} | |||
} | |||
//--------------------------------------------------------- | |||
public OnPlayerDeath(playerid, killerid, reason) | |||
{ | |||
if(killerid == INVALID_PLAYER_ID) { | |||
SendDeathMessage(INVALID_PLAYER_ID,playerid,reason); | |||
} else { | |||
if(gTeam[killerid] != gTeam[playerid]) { | |||
// Valid kill | |||
SendDeathMessage(killerid,playerid,reason); | |||
SetPlayerScore(killerid,GetPlayerScore(killerid)+1); | |||
} | |||
else { | |||
// Team kill | |||
SendDeathMessage(killerid,playerid,reason); | |||
} | |||
} | |||
SetPVarInt(playerid, "LastDeathTick", GetTickCount()); | |||
SetPVarInt(playerid, "LastKillerId", killerid); | |||
return 1; | |||
} | |||
//--------------------------------- | |||
public OnVehicleStreamIn(vehicleid, forplayerid) | |||
{ | |||
// As the vehicle streams in, player team dependant params are applied. They can't be | |||
// applied to vehicles that don't exist in the player's world. | |||
if(vehicleid == OBJECTIVE_VEHICLE_BLUE) { | |||
if(gTeam[forplayerid] == TEAM_GREEN) { | |||
SetVehicleParamsForPlayer(OBJECTIVE_VEHICLE_BLUE,forplayerid,1,1); // objective; locked | |||
} | |||
else if(gTeam[forplayerid] == TEAM_BLUE) { | |||
SetVehicleParamsForPlayer(OBJECTIVE_VEHICLE_BLUE,forplayerid,1,0); // objective; unlocked | |||
} | |||
} | |||
else if(vehicleid == OBJECTIVE_VEHICLE_GREEN) { | |||
if(gTeam[forplayerid] == TEAM_BLUE) { | |||
SetVehicleParamsForPlayer(OBJECTIVE_VEHICLE_GREEN,forplayerid,1,1); // objective; locked | |||
} | |||
else if(gTeam[forplayerid] == TEAM_GREEN) { | |||
SetVehicleParamsForPlayer(OBJECTIVE_VEHICLE_GREEN,forplayerid,1,0); // objective; unlocked | |||
} | |||
} | |||
return 1; | |||
//printf("GameMode: VehicleStreamIn(%d,%d)",vehicleid,forplayerid); | |||
} | |||
//--------------------------------- | |||
public OnVehicleStreamOut(vehicleid, forplayerid) | |||
{ | |||
return 1; | |||
//printf("GameMode: VehicleStreamOut(%d,%d)",vehicleid,forplayerid); | |||
} | |||
//--------------------------------- | |||
public OnPlayerUpdate(playerid) | |||
{ | |||
if(!IsPlayerConnected(playerid)) return 0; | |||
if(IsPlayerNPC(playerid)) return 1; | |||
if(GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) { | |||
if(GetPVarInt(playerid, "LastDeathTick") == 0) { | |||
TogglePlayerSpectating(playerid, 0); | |||
return 1; | |||
} | |||
// Allow respawn after an arbitrary time has passed | |||
if(GetTickCount() - GetPVarInt(playerid, "LastDeathTick") > (ALLOW_RESPAWN_AFTER_N_SECONDS * 1000)) { | |||
TogglePlayerSpectating(playerid, 0); | |||
return 1; | |||
} | |||
HandleSpectating(playerid); | |||
return 1; | |||
} | |||
// Check the resupply huts | |||
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) { | |||
if(IsPlayerInRangeOfPoint(playerid, 2.5, 2140.83, -235.13, 7.13) || IsPlayerInRangeOfPoint(playerid, 2.5, 2318.73, 590.96, 6.75)) { | |||
DoResupply(playerid); | |||
} | |||
} | |||
return 1; | |||
} | |||
//--------------------------------- | |||
PlaySoundForAll(soundid, Float:x, Float:y, Float:z) | |||
{ | |||
for (new i=0; i<MAX_PLAYERS; i++) | |||
{ | |||
if (IsPlayerConnected(i)) | |||
{ | |||
PlayerPlaySound(i, soundid, x, y, z); | |||
} | |||
} | |||
} | |||
//--------------------------------- | |||
CreateMapObject(modelid, Float:fX, Float:fY, Float:fZ, Float:fRX, Float:fRY, Float:fRZ) | |||
{ | |||
return CreateObject(modelid, fX, fY, fZ, fRX, fRY, fRZ, 500.0); | |||
} | |||
//--------------------------------- | |||
RemoveNeededBuildingsForPlayer(playerid) | |||
{ | |||
if(GetPVarInt(playerid,"BuildingsRemoved") == 0) { | |||
RemoveBuildingForPlayer(playerid, 9090, 2317.0859, 572.2656, -20.9688, 10.0); | |||
RemoveBuildingForPlayer(playerid, 9091, 2317.0859, 572.2656, -20.9688, 10.0); | |||
RemoveBuildingForPlayer(playerid, 13483, 2113.5781, -96.7344, 0.9844, 0.25); | |||
RemoveBuildingForPlayer(playerid, 12990, 2113.5781, -96.7344, 0.9844, 0.25); | |||
RemoveBuildingForPlayer(playerid, 935, 2119.8203, -84.4063, -0.0703, 0.25); | |||
RemoveBuildingForPlayer(playerid, 1369, 2104.0156, -105.2656, 1.7031, 0.25); | |||
RemoveBuildingForPlayer(playerid, 935, 2122.3750, -83.3828, 0.4609, 0.25); | |||
RemoveBuildingForPlayer(playerid, 935, 2119.5313, -82.8906, -0.1641, 0.25); | |||
RemoveBuildingForPlayer(playerid, 935, 2120.5156, -79.0859, 0.2188, 0.25); | |||
RemoveBuildingForPlayer(playerid, 935, 2119.4688, -69.7344, 0.2266, 0.25); | |||
RemoveBuildingForPlayer(playerid, 935, 2119.4922, -73.6172, 0.1250, 0.25); | |||
RemoveBuildingForPlayer(playerid, 935, 2117.8438, -67.8359, 0.1328, 0.25); | |||
SetPVarInt(playerid,"BuildingsRemoved",1); | |||
} | |||
} | |||
//--------------------------------- | |||
SpectatePlayer(playerid, specplayerid) | |||
{ | |||
if(GetPlayerState(specplayerid) == PLAYER_STATE_ONFOOT) { | |||
if(GetPVarInt(playerid, "SpectateMode") != SPECTATE_MODE_PLAYER) { | |||
PlayerSpectatePlayer(playerid, specplayerid); | |||
SetPVarInt(playerid, "SpectateMode", SPECTATE_MODE_PLAYER); | |||
} | |||
} | |||
else if( GetPlayerState(specplayerid) == PLAYER_STATE_DRIVER || | |||
GetPlayerState(specplayerid) == PLAYER_STATE_PASSENGER ) | |||
{ | |||
if(GetPVarInt(playerid, "SpectateMode") != SPECTATE_MODE_VEHICLE) { | |||
PlayerSpectateVehicle(playerid, GetPlayerVehicleID(specplayerid)); | |||
SetPVarInt(playerid, "SpectateMode", SPECTATE_MODE_VEHICLE); | |||
} | |||
} | |||
} | |||
//--------------------------------- | |||
SpectateFixedPosition(playerid) | |||
{ | |||
if(gTeam[playerid] == TEAM_GREEN) { | |||
SetPlayerCameraPos(playerid, 2221.5820, -273.9985, 61.7806); | |||
SetPlayerCameraLookAt(playerid, 2220.9978, -273.1861, 61.4606); | |||
} | |||
else { | |||
SetPlayerCameraPos(playerid, 2274.8467, 591.3257, 30.1311); | |||
SetPlayerCameraLookAt(playerid, 2275.0503, 590.3463, 29.9460); | |||
} | |||
} | |||
//--------------------------------- | |||
HandleSpectating(playerid) | |||
{ | |||
new LastKillerId = GetPVarInt(playerid, "LastKillerId"); | |||
// Make sure the killer player is still active in the world | |||
if( IsPlayerConnected(LastKillerId) && | |||
(GetPlayerState(LastKillerId) == PLAYER_STATE_ONFOOT || | |||
GetPlayerState(LastKillerId) == PLAYER_STATE_DRIVER || | |||
GetPlayerState(LastKillerId) == PLAYER_STATE_PASSENGER) ) | |||
{ | |||
SpectatePlayer(playerid, LastKillerId); | |||
SetPVarInt(playerid, "SpectateState", SPECTATE_STATE_PLAYER); | |||
} | |||
else | |||
{ | |||
// Else switch to the fixed position camera | |||
if(GetPVarInt(playerid, "SpectateState") != SPECTATE_STATE_FIXED) { | |||
SpectateFixedPosition(playerid); | |||
SetPVarInt(playerid, "SpectateState", SPECTATE_STATE_FIXED); | |||
} | |||
} | |||
} | |||
//--------------------------------- | |||
DoResupply(playerid) | |||
{ | |||
new iLastResupplyTime = GetPVarInt(playerid, "LastResupply"); | |||
if(iLastResupplyTime == 0 || (GetTickCount() - iLastResupplyTime) > 30000) { | |||
SetPVarInt(playerid, "LastResupply", GetTickCount()); | |||
ResetPlayerWeapons(playerid); | |||
GivePlayerWeapon(playerid,31,100); | |||
GivePlayerWeapon(playerid,29,200); | |||
GivePlayerWeapon(playerid,34,10); | |||
SetPlayerHealth(playerid, 100.0); | |||
SetPlayerArmour(playerid, 100.0); | |||
GameTextForPlayer(playerid,"Resupplied", 2000, 5); | |||
PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); | |||
} | |||
} | |||
//--------------------------------- | |||
@ -0,0 +1,36 @@ | |||
#include <a_samp> | |||
forward OneSecTimer(); | |||
new lasttick = 0; | |||
main() | |||
{ | |||
print("\n----------------------------------"); | |||
print(" This is a blank GameModeScript"); | |||
print("----------------------------------\n"); | |||
} | |||
public OnGameModeInit() | |||
{ | |||
// Set timer of 1 second. | |||
SetTimer("OneSecTimer", 1000, 1); | |||
print("GameModeInit()"); | |||
SetGameModeText("Timer Test"); | |||
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); | |||
return 1; | |||
} | |||
public OneSecTimer() { | |||
if(lasttick == 0) { | |||
lasttick = GetTickCount(); | |||
return; | |||
} | |||
new sText[256]; | |||
format(sText,sizeof(sText),"GetTickCountOffset = %d",GetTickCount() - lasttick); | |||
print(sText); | |||
SendClientMessageToAll(0xFF0000, sText); | |||
lasttick = GetTickCount(); | |||
} | |||