562 lines
22 KiB
Plaintext
562 lines
22 KiB
Plaintext
/*
|
|
* Irresistible Gaming (c) 2018
|
|
* Developed by Lorenc
|
|
* Module: cnr\features\gates.pwn
|
|
* Purpose: personal player gate system
|
|
*/
|
|
|
|
/* ** Includes ** */
|
|
#include < YSI\y_hooks >
|
|
|
|
/* ** Definitions ** */
|
|
#define MAX_GATES ( 300 )
|
|
|
|
/* ** Variables ** */
|
|
enum E_GATE_DATA
|
|
{
|
|
E_OBJECT, E_PASS[ 8 ], Float: E_SPEED,
|
|
Float: E_RANGE, E_MODEL, bool: E_MOVING,
|
|
E_OWNER, E_NAME[ 24 ], E_TIME,
|
|
E_GANG_SQL_ID,
|
|
|
|
Float: E_X, Float: E_Y, Float: E_Z,
|
|
Float: E_RX, Float: E_RY, Float: E_RZ,
|
|
|
|
Float: E_MOVE_X, Float: E_MOVE_Y, Float: E_MOVE_Z,
|
|
Float: E_MOVE_RX, Float: E_MOVE_RY, Float: E_MOVE_RZ,
|
|
|
|
E_CLOSE_TIMER
|
|
};
|
|
|
|
static stock
|
|
g_gateData [ MAX_GATES ] [ E_GATE_DATA ],
|
|
Iterator: gates < MAX_GATES >
|
|
;
|
|
|
|
/* ** Hooks ** */
|
|
hook OnScriptInit( )
|
|
{
|
|
mysql_function_query( dbHandle, "SELECT * FROM `GATES`", true, "OnGatesLoad", "" );
|
|
return 1;
|
|
}
|
|
|
|
hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|
{
|
|
if ( PRESSED( KEY_LOOK_BEHIND ) ) // MMB to open gate
|
|
{
|
|
new
|
|
Float: gate_distance = 99999.9,
|
|
gate_id = getClosestGate( playerid, gate_distance )
|
|
;
|
|
|
|
if ( gate_id != INVALID_OBJECT_ID && gate_distance < g_gateData[ gate_id ] [ E_RANGE ] )
|
|
{
|
|
new
|
|
gangId = p_GangID[ playerid ];
|
|
|
|
if ( p_AdminLevel[ playerid ] >= 5 || g_gateData[ gate_id ] [ E_OWNER ] == p_AccountID[ playerid ] || ( Iter_Contains( gangs, gangId ) && g_gateData[ gate_id ] [ E_GANG_SQL_ID ] == g_gangData[ gangId ] [ E_SQL_ID ] ) ) {
|
|
OpenPlayerGate( playerid, gate_id );
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
|
|
{
|
|
if ( dialogid == DIALOG_GATE && response )
|
|
{
|
|
new
|
|
objectid = GetPVarInt( playerid, "gate_editing" );
|
|
|
|
SetPVarInt( playerid, "gate_edititem", listitem );
|
|
|
|
if ( listitem == 0 )
|
|
{
|
|
Iter_Remove( gates, objectid );
|
|
DestroyDynamicObject( g_gateData[ objectid ] [ E_OBJECT ] );
|
|
g_gateData[ objectid ] [ E_OBJECT ] = INVALID_OBJECT_ID;
|
|
DeletePVar( playerid, "gate_editing" );
|
|
DeletePVar( playerid, "gate_edititem" );
|
|
|
|
SaveToAdminLog( playerid, objectid, "destroyed gate" );
|
|
format( szNormalString, sizeof( szNormalString ), "DELETE FROM `GATES` WHERE ID=%d", objectid );
|
|
mysql_single_query( szNormalString );
|
|
|
|
SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GATE]"COL_WHITE" You have removed a gate: "COL_GREY"%s"COL_WHITE".", g_gateData[ objectid ] [ E_NAME ] );
|
|
}
|
|
else if ( listitem < 9 ) ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
else
|
|
{
|
|
SendServerMessage( playerid, "Hit the save icon to update the position of the gate." );
|
|
EditDynamicObject( playerid, g_gateData[ objectid ] [ E_OBJECT ] );
|
|
}
|
|
}
|
|
else if ( dialogid == DIALOG_GATE_OWNER && response )
|
|
{
|
|
SetPVarInt( playerid, "gate_o_edititem", listitem );
|
|
ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?", "Commit", "Back" );
|
|
}
|
|
else if ( dialogid == DIALOG_GATE_OWNER_EDIT )
|
|
{
|
|
new
|
|
gID = GetPVarInt( playerid, "gate_o_editing" );
|
|
|
|
if ( ! Iter_Contains( gates, gID ) )
|
|
return SendError( playerid, "Invalid gate detected, please try again." );
|
|
|
|
if ( g_gateData[ gID ] [ E_OWNER ] != p_AccountID[ playerid ] )
|
|
return SendError( playerid, "You need to be the owner of this gate to edit it." );
|
|
|
|
if ( response )
|
|
{
|
|
switch( GetPVarInt( playerid, "gate_o_edititem" ) )
|
|
{
|
|
case 0:
|
|
{
|
|
if ( strlen( inputtext ) < 3 || strlen( inputtext ) >= 24 )
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"The name must range between 3 and 24 characters.", "Commit", "Back" );
|
|
|
|
format( g_gateData[ gID ] [ E_NAME ], 24, "%s", inputtext );
|
|
SendServerMessage( playerid, "Your gate name has been set to \"%s\".", g_gateData[ gID ] [ E_NAME ] );
|
|
UpdateGateData( gID, .recreate_obj = false );
|
|
}
|
|
case 1:
|
|
{
|
|
if ( strlen( inputtext ) < 3 || strlen( inputtext ) >= 8 )
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"The password must range between 3 and 8 characters.", "Commit", "Back" );
|
|
|
|
format( g_gateData[ gID ] [ E_PASS ], 8, "%s", inputtext );
|
|
SendServerMessage( playerid, "Your gate password has been set to \"%s\".", g_gateData[ gID ] [ E_PASS ] );
|
|
UpdateGateData( gID, .recreate_obj = false );
|
|
}
|
|
case 2:
|
|
{
|
|
new
|
|
sql_id;
|
|
|
|
if ( sscanf( inputtext, "D(0)", sql_id ) ) {
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"The Gang ID must be an integer.", "Commit", "Back" );
|
|
}
|
|
|
|
// check if valid gang lol
|
|
if ( sql_id != 0 )
|
|
{
|
|
new
|
|
gangId = -1;
|
|
|
|
foreach ( new g : gangs ) if ( sql_id == g_gangData[ g ] [ E_SQL_ID ] ) {
|
|
gangId = g;
|
|
}
|
|
|
|
if ( gangId == -1 ) {
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_OWNER_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"What would you like to change this to?\n\n"COL_RED"This gang is invalid or not currently online.", "Commit", "Back" );
|
|
} else {
|
|
SendServerMessage( playerid, "Your gate will be openable by members of \"%s\".", g_gangData[ gangId ] [ E_NAME ] );
|
|
}
|
|
} else {
|
|
SendServerMessage( playerid, "You have unassigned a gang from your gate." );
|
|
}
|
|
|
|
g_gateData[ gID ] [ E_GANG_SQL_ID ] = sql_id;
|
|
mysql_single_query( sprintf( "UPDATE `GATES` SET `GANG_ID`=%d WHERE `ID`=%d", sql_id, gID ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
// redirect
|
|
format( szNormalString, sizeof( szNormalString ), ""COL_WHITE"Gate Label\t"COL_GREY"%s\n"COL_WHITE"Gate Password\t"COL_GREY"%s\n"COL_WHITE"Gate Gang ID\t"COL_GREY"%d", g_gateData[ gID ] [ E_NAME ], g_gateData[ gID ] [ E_PASS ], g_gateData[ gID ] [ E_GANG_SQL_ID ] );
|
|
ShowPlayerDialog( playerid, DIALOG_GATE_OWNER, DIALOG_STYLE_TABLIST, "{FFFFFF}Edit Gate", szNormalString, "Select", "Cancel" );
|
|
return 1;
|
|
}
|
|
else if ( dialogid == DIALOG_GATE_EDIT )
|
|
{
|
|
new
|
|
gID = GetPVarInt( playerid, "gate_editing" );
|
|
|
|
if ( response )
|
|
{
|
|
switch( GetPVarInt( playerid, "gate_edititem" ) )
|
|
{
|
|
case 1:
|
|
{
|
|
new
|
|
pID;
|
|
|
|
if ( sscanf( inputtext, "u", pID ) )
|
|
{
|
|
SendError( playerid, "This value must be numerical." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
else if ( !IsPlayerConnected( pID ) )
|
|
{
|
|
SendError( playerid, "Invalid Player ID." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
g_gateData[ gID ] [ E_OWNER ] = p_AccountID[ pID ];
|
|
}
|
|
case 2:
|
|
{
|
|
if ( strlen( inputtext ) < 3 || strlen( inputtext ) >= 24 )
|
|
{
|
|
SendError( playerid, "The name must range between 3 and 24 characters." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
format( g_gateData[ gID ] [ E_NAME ], 24, "%s", inputtext );
|
|
}
|
|
case 3:
|
|
{
|
|
if ( strlen( inputtext ) < 3 || strlen( inputtext ) >= 8 )
|
|
{
|
|
SendError( playerid, "The password must range between 3 and 8 characters." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
format( g_gateData[ gID ] [ E_PASS ], 8, "%s", inputtext );
|
|
}
|
|
case 4:
|
|
{
|
|
new
|
|
model;
|
|
|
|
if ( sscanf( inputtext, "d", model ) )
|
|
{
|
|
SendError( playerid, "This value must be numerical." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
g_gateData[ gID ] [ E_MODEL ] = model;
|
|
}
|
|
case 5:
|
|
{
|
|
new
|
|
Float: speed;
|
|
|
|
if ( sscanf( inputtext, "f", speed ) )
|
|
{
|
|
SendError( playerid, "This value must be numerical." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
g_gateData[ gID ] [ E_SPEED ] = speed;
|
|
}
|
|
case 6:
|
|
{
|
|
new
|
|
Float: range;
|
|
|
|
if ( sscanf( inputtext, "f", range ) )
|
|
{
|
|
SendError( playerid, "This value must be numerical." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
else if ( ! ( 1.0 <= range <= 100.0 ) )
|
|
{
|
|
SendError( playerid, "Please specify a range between 1.0 and 100.0 metres." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
g_gateData[ gID ] [ E_RANGE ] = range;
|
|
}
|
|
case 7:
|
|
{
|
|
new
|
|
time;
|
|
|
|
if ( sscanf( inputtext, "d", time ) )
|
|
{
|
|
SendError( playerid, "This value must be numerical." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
else if ( time < 100 || time > 60000 )
|
|
{
|
|
SendError( playerid, "This value must be between 100 and 60000 miliseconds." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
g_gateData[ gID ] [ E_TIME ] = time;
|
|
}
|
|
case 8:
|
|
{
|
|
new
|
|
sql_id;
|
|
|
|
if ( sscanf( inputtext, "d", sql_id ) )
|
|
{
|
|
SendError( playerid, "This value must be numerical." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
else if ( ! ( 0 <= sql_id < 1000000 ) )
|
|
{
|
|
SendError( playerid, "Invalid Gang ID specified." );
|
|
return ShowPlayerDialog( playerid, DIALOG_GATE_EDIT, DIALOG_STYLE_INPUT, "{FFFFFF}Gate - Edit", ""COL_WHITE"Value to replace with:", "Commit", "Back" );
|
|
}
|
|
g_gateData[ gID ] [ E_GANG_SQL_ID ] = sql_id;
|
|
mysql_single_query( sprintf( "UPDATE `GATES` SET `GANG_ID`=%d WHERE `ID`=%d", sql_id, gID ) );
|
|
}
|
|
}
|
|
UpdateGateData( gID );
|
|
Streamer_Update( playerid );
|
|
cmd_editgate( playerid, sprintf( "%d", gID ) );
|
|
SendServerMessage( playerid, "You have successfully updated this gate." );
|
|
}
|
|
else cmd_editgate( playerid, sprintf( "%d", gID ) );
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
hook OnPlayerEditDynObject( playerid, objectid, response, Float: x, Float: y, Float: z, Float: rx, Float: ry, Float: rz )
|
|
{
|
|
new
|
|
gateItem = GetPVarInt( playerid, "gate_edititem" );
|
|
|
|
if ( gateItem > 6 )
|
|
{
|
|
if ( response == EDIT_RESPONSE_FINAL )
|
|
{
|
|
new
|
|
gID = GetPVarInt( playerid, "gate_editing" );
|
|
|
|
switch( gateItem )
|
|
{
|
|
case 9:
|
|
{
|
|
g_gateData[ gID ] [ E_X ] = x;
|
|
g_gateData[ gID ] [ E_Y ] = y;
|
|
g_gateData[ gID ] [ E_Z ] = z;
|
|
g_gateData[ gID ] [ E_RX ] = float( floatround( rx ) );
|
|
g_gateData[ gID ] [ E_RY ] = float( floatround( ry ) );
|
|
g_gateData[ gID ] [ E_RZ ] = float( floatround( rz ) );
|
|
SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GATE]"COL_WHITE" Gate Open Position: "COL_GREY" %f, %f, %f, %f, %f, %f", g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] );
|
|
}
|
|
case 10:
|
|
{
|
|
g_gateData[ gID ] [ E_MOVE_X ] = x;
|
|
g_gateData[ gID ] [ E_MOVE_Y ] = y;
|
|
g_gateData[ gID ] [ E_MOVE_Z ] = z;
|
|
g_gateData[ gID ] [ E_MOVE_RX ] = float( floatround( rx ) );
|
|
g_gateData[ gID ] [ E_MOVE_RY ] = float( floatround( ry ) );
|
|
g_gateData[ gID ] [ E_MOVE_RZ ] = float( floatround( rz ) );
|
|
SendClientMessageFormatted( playerid, -1, ""COL_PINK"[GATE]"COL_WHITE" Gate Open Position: "COL_GREY" %f, %f, %f, %f, %f, %f", g_gateData[ gID ] [ E_MOVE_X ], g_gateData[ gID ] [ E_MOVE_Y ], g_gateData[ gID ] [ E_MOVE_Z ], g_gateData[ gID ] [ E_MOVE_RX ], g_gateData[ gID ] [ E_MOVE_RY ], g_gateData[ gID ] [ E_MOVE_RZ ] );
|
|
}
|
|
}
|
|
UpdateGateData( gID );
|
|
cmd_editgate( playerid, sprintf( "%d", gID ) );
|
|
Streamer_Update( playerid );
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* ** Commands ** */
|
|
CMD:gate( playerid, params[ ] )
|
|
{
|
|
new
|
|
Float: distance = 99999.99,
|
|
gID = getClosestGate( playerid, distance )
|
|
;
|
|
|
|
if ( gID == INVALID_OBJECT_ID )
|
|
return SendError( playerid, "You're not near any gates." );
|
|
|
|
if ( strmatch( params, "edit" ) )
|
|
{
|
|
if ( g_gateData[ gID ] [ E_OWNER ] != p_AccountID[ playerid ] )
|
|
return SendError( playerid, "You need to be the owner of this gate to edit it." );
|
|
|
|
format( szNormalString, sizeof( szNormalString ), ""COL_WHITE"Gate Label\t"COL_GREY"%s\n"COL_WHITE"Gate Password\t"COL_GREY"%s\n"COL_WHITE"Gate Gang ID\t"COL_GREY"%d", g_gateData[ gID ] [ E_NAME ], g_gateData[ gID ] [ E_PASS ], g_gateData[ gID ] [ E_GANG_SQL_ID ] );
|
|
ShowPlayerDialog( playerid, DIALOG_GATE_OWNER, DIALOG_STYLE_TABLIST, "{FFFFFF}Edit Gate", szNormalString, "Select", "Cancel" );
|
|
|
|
SetPVarInt( playerid, "gate_o_editing", gID );
|
|
SendClientMessageFormatted( playerid, -1, ""COL_GREY"[GATE]"COL_WHITE" You're now editing "COL_GREY"%s"COL_WHITE".", g_gateData[ gID ] [ E_NAME ] );
|
|
}
|
|
else if ( !strcmp( params, "open", true, 4 ) )
|
|
{
|
|
new
|
|
szPassword[ 8 ];
|
|
|
|
strreplacechar( params, '\\', '/' );
|
|
|
|
if ( sscanf( params[ 5 ], "s[8]", szPassword ) )
|
|
return SendUsage( playerid, "/gate open [PASSWORD]" );
|
|
|
|
new
|
|
gates = 0;
|
|
|
|
foreach(new g : gates)
|
|
{
|
|
if ( ( distance = GetPlayerDistanceFromPoint( playerid, g_gateData[ g ] [ E_X ], g_gateData[ g ] [ E_Y ], g_gateData[ g ] [ E_Z ] ) ) > g_gateData[ g ] [ E_RANGE ] )
|
|
continue; // return SendError( playerid, "You're not within the gates' operation range." );
|
|
|
|
if ( strcmp( szPassword, g_gateData[ g ] [ E_PASS ], false ) )
|
|
continue; // return SendError( playerid, "Incorrect password. Please try again." );
|
|
|
|
if ( OpenPlayerGate( playerid, g ) ) {
|
|
gates ++;
|
|
}
|
|
}
|
|
return !gates ? SendError( playerid, "Either a gate is in operation, not in range or simply incorrect password." ) : 1;
|
|
}
|
|
else if ( strmatch( params, "closest" ) && p_AdminLevel[ playerid ] > 1 )
|
|
{
|
|
SendServerMessage( playerid, "The closest gate to you is "COL_GREY"%s"COL_WHITE". (id: %d, distance: %f)", g_gateData[ gID ] [ E_NAME ], gID, distance );
|
|
}
|
|
else SendUsage( playerid, "/gate [OPEN/EDIT]" );
|
|
return 1;
|
|
}
|
|
|
|
/* ** SQL Threads ** */
|
|
thread OnGatesLoad( )
|
|
{
|
|
new
|
|
rows, fields, i = -1, gID,
|
|
loadingTick = GetTickCount( )
|
|
;
|
|
|
|
cache_get_data( rows, fields );
|
|
if ( rows )
|
|
{
|
|
while( ++i < rows )
|
|
{
|
|
gID = cache_get_field_content_int( i, "ID", dbHandle );
|
|
|
|
cache_get_field_content( i, "PASSWORD", g_gateData[ gID ] [ E_PASS ], dbHandle, 8 );
|
|
cache_get_field_content( i, "NAME", g_gateData[ gID ] [ E_NAME ], dbHandle, 24 );
|
|
|
|
g_gateData[ gID ] [ E_OWNER ] = cache_get_field_content_int( i, "OWNER", dbHandle );
|
|
g_gateData[ gID ] [ E_MODEL ] = cache_get_field_content_int( i, "MODEL", dbHandle );
|
|
g_gateData[ gID ] [ E_TIME ] = cache_get_field_content_int( i, "TIME", dbHandle );
|
|
g_gateData[ gID ] [ E_SPEED ] = cache_get_field_content_float( i, "SPEED", dbHandle );
|
|
g_gateData[ gID ] [ E_RANGE ] = cache_get_field_content_float( i, "RANGE", dbHandle );
|
|
g_gateData[ gID ] [ E_X ] = cache_get_field_content_float( i, "X", dbHandle );
|
|
g_gateData[ gID ] [ E_Y ] = cache_get_field_content_float( i, "Y", dbHandle );
|
|
g_gateData[ gID ] [ E_Z ] = cache_get_field_content_float( i, "Z", dbHandle );
|
|
g_gateData[ gID ] [ E_RX ] = cache_get_field_content_float( i, "RX", dbHandle );
|
|
g_gateData[ gID ] [ E_RY ] = cache_get_field_content_float( i, "RY", dbHandle );
|
|
g_gateData[ gID ] [ E_RZ ] = cache_get_field_content_float( i, "RZ", dbHandle );
|
|
g_gateData[ gID ] [ E_MOVE_X ] = cache_get_field_content_float( i, "MOVE_X", dbHandle );
|
|
g_gateData[ gID ] [ E_MOVE_Y ] = cache_get_field_content_float( i, "MOVE_Y", dbHandle );
|
|
g_gateData[ gID ] [ E_MOVE_Z ] = cache_get_field_content_float( i, "MOVE_Z", dbHandle );
|
|
g_gateData[ gID ] [ E_MOVE_RX ] = cache_get_field_content_float( i, "MOVE_RX", dbHandle );
|
|
g_gateData[ gID ] [ E_MOVE_RY ] = cache_get_field_content_float( i, "MOVE_RY", dbHandle );
|
|
g_gateData[ gID ] [ E_MOVE_RZ ] = cache_get_field_content_float( i, "MOVE_RZ", dbHandle );
|
|
g_gateData[ gID ] [ E_GANG_SQL_ID ] = cache_get_field_content_int( i, "GANG_ID", dbHandle );
|
|
|
|
g_gateData[ gID ] [ E_CLOSE_TIMER ] = -1;
|
|
g_gateData[ gID ] [ E_OBJECT ] = CreateDynamicObject( g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] );
|
|
|
|
Iter_Add(gates, gID);
|
|
}
|
|
}
|
|
printf( "[GATES]: %d gates have been loaded. (Tick: %dms)", i, GetTickCount( ) - loadingTick );
|
|
return 1;
|
|
}
|
|
|
|
/* ** Functions ** */
|
|
stock CreateGate( playerid, password[ 8 ], model, Float: speed, Float: range, Float: x, Float: y, Float: z, Float: rx, Float: ry, Float: rz )
|
|
{
|
|
new gID = Iter_Free(gates);
|
|
|
|
if ( gID != ITER_NONE )
|
|
{
|
|
erase( g_gateData[ gID ] [ E_NAME ] );
|
|
|
|
format( g_gateData[ gID ] [ E_PASS ], 8, "%s", password );
|
|
format( g_gateData[ gID ] [ E_NAME ], 24, "Gate" );
|
|
g_gateData[ gID ] [ E_OWNER ] = p_AccountID[ playerid ];
|
|
g_gateData[ gID ] [ E_MODEL ] = model;
|
|
g_gateData[ gID ] [ E_SPEED ] = speed;
|
|
g_gateData[ gID ] [ E_TIME ] = 2000;
|
|
g_gateData[ gID ] [ E_CLOSE_TIMER ] = -1;
|
|
g_gateData[ gID ] [ E_RANGE ] = range;
|
|
g_gateData[ gID ] [ E_X ] = x;
|
|
g_gateData[ gID ] [ E_Y ] = y;
|
|
g_gateData[ gID ] [ E_Z ] = z;
|
|
g_gateData[ gID ] [ E_RX ] = rx;
|
|
g_gateData[ gID ] [ E_RY ] = ry;
|
|
g_gateData[ gID ] [ E_RZ ] = rz;
|
|
g_gateData[ gID ] [ E_MOVE_X ] = x;
|
|
g_gateData[ gID ] [ E_MOVE_Y ] = y;
|
|
g_gateData[ gID ] [ E_MOVE_Z ] = z;
|
|
g_gateData[ gID ] [ E_MOVE_RX ] = rx;
|
|
g_gateData[ gID ] [ E_MOVE_RY ] = ry;
|
|
g_gateData[ gID ] [ E_MOVE_RZ ] = rz;
|
|
g_gateData[ gID ] [ E_GANG_SQL_ID ] = 0;
|
|
|
|
format( szBigString, sizeof( szBigString ), "INSERT INTO `GATES` VALUES(%d,%d,'%s','Gate',%d,2000,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,0)", gID, playerid, mysql_escape( password ), model, speed, range, x, y, z, rx, ry, rz, x, y, z, rx, ry, rz );
|
|
mysql_single_query( szBigString );
|
|
|
|
g_gateData[ gID ] [ E_OBJECT ] = CreateDynamicObject( g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] );
|
|
Iter_Add(gates, gID);
|
|
}
|
|
return gID;
|
|
}
|
|
|
|
stock getClosestGate( playerid, &Float: dis = 99999.99 )
|
|
{
|
|
new
|
|
Float: dis2,
|
|
object = INVALID_OBJECT_ID
|
|
;
|
|
foreach(new i : gates)
|
|
{
|
|
dis2 = GetPlayerDistanceFromPoint( playerid, g_gateData[ i ] [ E_X ], g_gateData[ i ] [ E_Y ], g_gateData[ i ] [ E_Z ] );
|
|
if ( dis2 < dis && dis2 != -1.00 ) {
|
|
dis = dis2;
|
|
object = i;
|
|
}
|
|
}
|
|
return object;
|
|
}
|
|
|
|
stock UpdateGateData( gID, bool: recreate_obj = true )
|
|
{
|
|
if ( Iter_Contains( gates, gID ) )
|
|
{
|
|
format( szLargeString, sizeof( szLargeString ),
|
|
"UPDATE `GATES` SET `OWNER`=%d,`NAME`='%s',`PASSWORD`='%s',`MODEL`=%d,`TIME`=%d,`SPEED`=%f,`RANGE`=%f,`X`=%f,`Y`=%f,`Z`=%f,`RX`=%f,`RY`=%f,`RZ`=%f,`MOVE_X`=%f,`MOVE_Y`=%f,`MOVE_Z`=%f,`MOVE_RX`=%f,`MOVE_RY`=%f,`MOVE_RZ`=%f WHERE `ID`=%d",
|
|
g_gateData[ gID ] [ E_OWNER ], mysql_escape( g_gateData[ gID ] [ E_NAME ] ), mysql_escape( g_gateData[ gID ] [ E_PASS ] ), g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_TIME ], g_gateData[ gID ] [ E_SPEED ], g_gateData[ gID ] [ E_RANGE ],
|
|
g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ],
|
|
g_gateData[ gID ] [ E_MOVE_X ], g_gateData[ gID ] [ E_MOVE_Y ], g_gateData[ gID ] [ E_MOVE_Z ], g_gateData[ gID ] [ E_MOVE_RX ], g_gateData[ gID ] [ E_MOVE_RY ], g_gateData[ gID ] [ E_MOVE_RZ ], gID );
|
|
|
|
mysql_single_query( szLargeString );
|
|
|
|
if ( recreate_obj ) {
|
|
DestroyDynamicObject( g_gateData[ gID ] [ E_OBJECT ] );
|
|
g_gateData[ gID ] [ E_OBJECT ] = CreateDynamicObject( g_gateData[ gID ] [ E_MODEL ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
stock OpenPlayerGate( forplayerid, g )
|
|
{
|
|
if ( g_gateData[ g ] [ E_CLOSE_TIMER ] != -1 ) {
|
|
return 0;
|
|
}
|
|
|
|
if ( forplayerid != INVALID_PLAYER_ID && !strmatch( g_gateData[ g ] [ E_NAME ], "N/A" ) ) {
|
|
SendClientMessageFormatted( forplayerid, -1, ""COL_GREY"[GATE]"COL_WHITE" You've opened "COL_GREY"%s"COL_WHITE".", g_gateData[ g ] [ E_NAME ] );
|
|
}
|
|
|
|
new
|
|
travelInterval = MoveDynamicObject( g_gateData[ g ] [ E_OBJECT ], g_gateData[ g ] [ E_MOVE_X ], g_gateData[ g ] [ E_MOVE_Y ], g_gateData[ g ] [ E_MOVE_Z ], g_gateData[ g ] [ E_SPEED ], g_gateData[ g ] [ E_MOVE_RX ], g_gateData[ g ] [ E_MOVE_RY ], g_gateData[ g ] [ E_MOVE_RZ ] );
|
|
|
|
g_gateData[ g ] [ E_CLOSE_TIMER ] = SetTimerEx( "StartGateClose", travelInterval + g_gateData[ g ] [ E_TIME ], false, "d", g );
|
|
return 1;
|
|
}
|
|
|
|
function StartGateClose( gID ) {
|
|
g_gateData[ gID ] [ E_CLOSE_TIMER ] = -1;
|
|
return MoveDynamicObject( g_gateData[ gID ] [ E_OBJECT ], g_gateData[ gID ] [ E_X ], g_gateData[ gID ] [ E_Y ], g_gateData[ gID ] [ E_Z ], g_gateData[ gID ] [ E_SPEED ], g_gateData[ gID ] [ E_RX ], g_gateData[ gID ] [ E_RY ], g_gateData[ gID ] [ E_RZ ] ), 1;
|
|
}
|
|
|
|
stock Gate_Exists( gateid ) {
|
|
return 0 <= gateid < MAX_GATES && Iter_Contains( gates, gateid );
|
|
}
|
|
|
|
stock SetPlayerEditGate( playerid, gateid )
|
|
{
|
|
format( szLargeString, sizeof( szLargeString ),
|
|
""COL_RED"Remove This Gate?\t \nOwner ID\t"COL_GREY"%d\nName\t"COL_GREY"%s\nPassword\t"COL_GREY"%s\nModel\t"COL_GREY"%d\nSpeed\t"COL_GREY"%f\nRange\t"COL_GREY"%f\nPause\t"COL_GREY"%d MS\nGang ID\t%d\nChange Closed Positioning\t \nChange Opened Positioning\t ",
|
|
g_gateData[ gateid ] [ E_OWNER ], g_gateData[ gateid ] [ E_NAME ], g_gateData[ gateid ] [ E_PASS ], g_gateData[ gateid ] [ E_MODEL ], g_gateData[ gateid ] [ E_SPEED ], g_gateData[ gateid ] [ E_RANGE ], g_gateData[ gateid ] [ E_TIME ], g_gateData[ gateid ] [ E_GANG_SQL_ID ]
|
|
);
|
|
|
|
SetPVarInt( playerid, "gate_editing", gateid );
|
|
ShowPlayerDialog( playerid, DIALOG_GATE, DIALOG_STYLE_TABLIST, "{FFFFFF}Edit Gate", szLargeString, "Select", "Cancel" );
|
|
}
|