/* * 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" ); }