Advertisement
Lorenc

GangZone Editor by Lorenc_

Jan 17th, 2012
5,781
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.40 KB | None | 0 0
  1. /*
  2.     *       GangZone Editor FS created by Lorenc_
  3.     *                 Version: 1.0b
  4.     *
  5.     *   - Credits:
  6.     *       Zamaroht - Colors/sounds    Dracoblue - HexToInt( )
  7.     *       ZeeX - zcmd                 Lorenc_ - Barbequing the script
  8.     *
  9.     *
  10. */
  11.  
  12. /* ** Includes ** */
  13. #include                            < a_samp >
  14. #include                            < zcmd >
  15.  
  16. /* ** Configuration ** */
  17. #define FILE_VERSION                "1.0b"
  18.  
  19. #define COLOR_MSG                   0xFAF0CEFF // Stolen from TextDrawEditor1.0
  20. #define COLOR_ZONE                  3402287696
  21.  
  22. #define D_TITLE                     "Gang Zone Editor - By Lorenc_"
  23. #define DIALOG_NEW_PROJECT          ( 0 + 777 )
  24. #define DIALOG_PROJECT_CONFIG       ( 1 + 777 )
  25. #define DIALOG_ZONE_MANAGE          ( 2 + 777 )
  26. #define DIALOG_ZONE_MODIFY          ( 3 + 777 )
  27. #define DIALOG_ZONE_MODIFY_XY       ( 4 + 777 )
  28. #define DIALOG_ZONE_MODIFY_COLOR    ( 5 + 777 )
  29. #define DIALOG_ZONE_MODIFY_DEL      ( 6 + 777 )
  30.  
  31. #define SCM                         SendClientMessage
  32.  
  33. /* ** Server/Player Data ** */
  34. enum E_GANGZONE_DATA
  35. {
  36.     E_ZONE,
  37.     Float: E_MAX_X,
  38.     Float: E_MAX_Y,
  39.     Float: E_MIN_X,
  40.     Float: E_MIN_Y,
  41.     E_COLOR,
  42.     bool: E_CREATED
  43. };
  44.  
  45. new
  46.     g_ProjectName                   [ 30 ],
  47.     g_gangzoneData                  [ 20 ] [ E_GANGZONE_DATA ],
  48.     p_EditingZone                   [ MAX_PLAYERS char ],
  49.     g_totalZones                    = 0,
  50.     p_ModifyLengthMode              [ MAX_PLAYERS char ],
  51.     bool: g_WorkingProject          = false
  52. ;
  53.  
  54. /* ** Continue ** */
  55.  
  56. public OnFilterScriptInit( )
  57. {
  58.     print( " - Gang Zone Editor v"#FILE_VERSION" by Lorenc_ Loaded!" );
  59.     return 1;
  60. }
  61.  
  62. public OnFilterScriptExit( )
  63. {
  64.     for( new z; z < sizeof( g_gangzoneData ); z++ )
  65.     {
  66.         GangZoneHideForAll( g_gangzoneData[ z ] [ E_ZONE ] );
  67.         GangZoneDestroy( g_gangzoneData[ z ] [ E_ZONE ] );
  68.         g_gangzoneData[ z ] [ E_CREATED ] = false;
  69.         g_totalZones = 0;
  70.     }
  71.     return 1;
  72. }
  73.  
  74. public OnPlayerDisconnect( playerid, reason )
  75. {
  76.     p_ModifyLengthMode{ playerid } = 0;
  77.     return 1;
  78. }
  79.  
  80. CMD:zone( playerid, params[ ] )
  81. {
  82.     if( playerid != 0 )
  83.         return SendClientMessage( playerid, COLOR_MSG, "Only the smaller ID's can create gangzones." );
  84.        
  85.     if( p_ModifyLengthMode{ playerid } != 0 )
  86.         return SCM( playerid, COLOR_MSG, "Your currently setting a position on a gangzone, to exit that press your sprint key (SPACE)" );
  87.     if( g_WorkingProject == true )
  88.     {
  89.         ShowPlayerDialog( playerid, DIALOG_PROJECT_CONFIG, DIALOG_STYLE_LIST, D_TITLE, "Zone Management\nClose Project\nExport Project", "Select", "" );
  90.     }
  91.     else
  92.     {
  93.         ShowPlayerDialog( playerid, DIALOG_NEW_PROJECT, DIALOG_STYLE_INPUT, D_TITLE, "Enter a project name:\n\n(NOTE) The project name is what the save file is going to be located\ninside your scriptfiles folder.", "Submit", "Cancel" );
  94.     }
  95.     return 1;
  96. }
  97.  
  98. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  99. {
  100.     new
  101.         string[ 500 ]
  102.     ;
  103.  
  104.     if( response )  PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0); // Confirmation sound
  105.     else            PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0); // Cancelation sound
  106.    
  107.     if( ( dialogid == DIALOG_NEW_PROJECT ) && response )
  108.     {
  109.         if( !strlen( inputtext ) || strlen( inputtext ) >= 30 )
  110.             return ShowPlayerDialog(playerid, DIALOG_NEW_PROJECT, DIALOG_STYLE_INPUT, D_TITLE, "Enter a project name:\n\n(NOTE) The project name is what the save file is going to be located\ninside your scriptfiles folder.\n\n{FF0000}A project name must not exceed 30 characters or be blank.", "Submit", "Cancel" );
  111.         format( string, 40, "%s.ini", inputtext );
  112.         if( fexist( string ) )
  113.             return ShowPlayerDialog(playerid, DIALOG_NEW_PROJECT, DIALOG_STYLE_INPUT, D_TITLE, "Enter a project name:\n\n(NOTE) The project name is what the save file is going to be located\ninside your scriptfiles folder.\n\n{FF0000}This project already exists, try a different name.", "Submit", "Cancel" );
  114.         format( g_ProjectName, 30, "%s", inputtext );
  115.         g_WorkingProject = true;
  116.         ShowPlayerDialog( playerid, DIALOG_PROJECT_CONFIG, DIALOG_STYLE_LIST, D_TITLE, "Zone Management\nClose Project\nExport Project", "Select", "" );
  117.     }
  118.     if( ( dialogid == DIALOG_PROJECT_CONFIG ) && response )
  119.     {
  120.         switch( listitem )
  121.         {
  122.             case 0:
  123.             {
  124.                 format( string, sizeof( string ), "{00FFFF}Create New Gangzone{FFFFFF}\n" );
  125.                 for( new i; i < sizeof( g_gangzoneData ); i++ )
  126.                 {
  127.                     if( g_gangzoneData[ i ] [ E_CREATED ] == true ) {
  128.                         format( string, sizeof( string ), "%sZone %d\n", string, i );
  129.                     }
  130.                 }
  131.                 ShowPlayerDialog( playerid, DIALOG_ZONE_MANAGE, DIALOG_STYLE_LIST, D_TITLE, string, "Select", "Go Back" );
  132.             }
  133.             case 1:
  134.             {
  135.                 g_ProjectName[ 0 ] = '\0';
  136.                 g_WorkingProject = false;
  137.  
  138.                 for( new z; z < sizeof( g_gangzoneData ); z++ )
  139.                 {
  140.                     GangZoneHideForAll( g_gangzoneData[ z ] [ E_ZONE ] );
  141.                     GangZoneDestroy( g_gangzoneData[ z ] [ E_ZONE ] );
  142.                     g_gangzoneData[ z ] [ E_CREATED ] = false;
  143.                     g_totalZones = 0;
  144.                 }
  145.                
  146.                 SCM( playerid, COLOR_MSG, "You have successfully closed this project." );
  147.             }
  148.             case 2:
  149.             {
  150.                 if( g_totalZones )
  151.                 {
  152.                     new
  153.                         File: iFile
  154.                     ;
  155.                     format( string, 40, "%s.ini", g_ProjectName );
  156.                     iFile = fopen( string );
  157.                     fwrite( iFile, "Vote Lorenc for president :D\r\n\r\n" );
  158.                     for( new i; i < g_totalZones; i++ )
  159.                     {
  160.                         format( string, sizeof( string ), "GangZoneCreate( %0.3f, %0.3f, %0.3f, %0.3f ); // color = %d\r\n", g_gangzoneData[ i ] [ E_MIN_X ], g_gangzoneData[ i ] [ E_MIN_Y ], g_gangzoneData[ i ] [ E_MAX_X ], g_gangzoneData[ i ] [ E_MAX_Y ], g_gangzoneData[ i ] [ E_COLOR ] );
  161.                         fwrite( iFile, string );
  162.                     }
  163.                     fclose( iFile );
  164.                     ShowPlayerDialog( playerid, DIALOG_PROJECT_CONFIG, DIALOG_STYLE_LIST, D_TITLE, "Zone Management\nClose Project\nExport Project", "Select", "" );
  165.                     SCM( playerid, COLOR_MSG, "You have successfully exported this project, check your scriptfiles for the export file." );
  166.                 }
  167.                 else
  168.                 {
  169.                     ShowPlayerDialog( playerid, DIALOG_PROJECT_CONFIG, DIALOG_STYLE_LIST, D_TITLE, "Zone Management\nClose Project\nExport Project", "Select", "" );
  170.                     SCM( playerid, COLOR_MSG, "Couldn't process due to being that there are no textdraws created." );
  171.                 }
  172.             }
  173.         }
  174.     }
  175.     if( dialogid == DIALOG_ZONE_MANAGE )
  176.     {
  177.         if( response )
  178.         {
  179.             if( listitem != 0 )
  180.             {
  181.                 p_EditingZone{ playerid } = -1;
  182.                
  183.                 for( new i, x = 1; ; i ++ )
  184.                 {
  185.                     if( g_gangzoneData[ i ] [ E_CREATED ] )
  186.                     {
  187.                         if( x == listitem )
  188.                         {
  189.                             p_EditingZone{ playerid } = i;
  190.                             format( string, 100, "You are new editing Zone %d", i );
  191.                             SCM( playerid, COLOR_MSG, string );
  192.                             ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY, DIALOG_STYLE_LIST, D_TITLE, "Change Position\nChange Color\nDelete Zone", "Select", "Go Back" );
  193.                         }
  194.                         x ++;
  195.                     }
  196.                 }
  197.  
  198.             }
  199.             else
  200.             {
  201.                 new gID = getFreeGangZone( );
  202.  
  203.                 if( gID == -1 )
  204.                 {
  205.                     SCM( playerid, COLOR_MSG, "You have reached the limit of gang zones." );
  206.                     goto skip_createzone;
  207.                 }
  208.  
  209.                 g_gangzoneData[ gID ] [ E_CREATED ] = true;
  210.                 g_gangzoneData[ gID ] [ E_COLOR ] = COLOR_ZONE;
  211.                 g_gangzoneData[ gID ] [ E_MAX_X ] = 10.0;
  212.                 g_gangzoneData[ gID ] [ E_MAX_Y ] = 10.0;
  213.                 g_gangzoneData[ gID ] [ E_MIN_X ] = 10.0;
  214.                 g_gangzoneData[ gID ] [ E_MIN_Y ] = 10.0;
  215.                 g_gangzoneData[ gID ] [ E_ZONE ] = GangZoneCreate( 10.0, 10.0, 10.0, 10.0 );
  216.                 GangZoneShowForPlayer( playerid, g_gangzoneData[ gID ] [ E_ZONE ], g_gangzoneData[ gID ] [ E_COLOR ] );
  217.                 g_totalZones ++;
  218.                
  219.                 skip_createzone:
  220.                 format( string, sizeof( string ), "{00FFFF}Create New Gangzone{FFFFFF}\n" );
  221.                 for( new i; i < sizeof( g_gangzoneData ); i++ )
  222.                 {
  223.                     if( g_gangzoneData[ i ] [ E_CREATED ] == true ) {
  224.                         format( string, sizeof( string ), "%sZone %d\n", string, i );
  225.                     }
  226.                 }
  227.                 ShowPlayerDialog( playerid, DIALOG_ZONE_MANAGE, DIALOG_STYLE_LIST, D_TITLE, string, "Select", "Go Back" );
  228.             }
  229.         }
  230.         else ShowPlayerDialog( playerid, DIALOG_PROJECT_CONFIG, DIALOG_STYLE_LIST, D_TITLE, "Zone Management\nClose Project\nExport Project", "Select", "" );
  231.     }
  232.     if( dialogid == DIALOG_ZONE_MODIFY )
  233.     {
  234.         if( response )
  235.         {
  236.             switch( listitem )
  237.             {
  238.                 case 0: ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY_XY, DIALOG_STYLE_LIST, D_TITLE, "Modify Max X/Y\nModify Min X/Y", "Select", "Go Back" );
  239.                 case 1: ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY_COLOR, DIALOG_STYLE_INPUT, D_TITLE, "Enter the color you wish to use for your gangzone.\n(NOTE) Must be in hexidecimal otherwise something can go wrong!", "Submit", "Go Back" );
  240.                 case 2: ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY_DEL, DIALOG_STYLE_MSGBOX, D_TITLE, "Are you sure you want to delete this gangzone?", "Delete", "Cancel" );
  241.             }
  242.         }
  243.         else
  244.         {
  245.             format( string, sizeof( string ), "{00FFFF}Create New Gangzone{FFFFFF}\n" );
  246.             for( new i; i < sizeof( g_gangzoneData ); i++ )
  247.             {
  248.                 if( g_gangzoneData[ i ] [ E_CREATED ] == true ) {
  249.                     format( string, sizeof( string ), "%sZone %d\n", string, i );
  250.                 }
  251.             }
  252.             ShowPlayerDialog( playerid, DIALOG_ZONE_MANAGE, DIALOG_STYLE_LIST, D_TITLE, string, "Select", "Go Back" );
  253.         }
  254.     }
  255.     if( dialogid == DIALOG_ZONE_MODIFY_XY )
  256.     {
  257.         if( response )
  258.         {
  259.             p_ModifyLengthMode{ playerid } = listitem + 1;
  260.             SCM( playerid, COLOR_MSG, "Use you map and right click on the position that you want to set the max/min X-Y at." );
  261.             SCM( playerid, COLOR_MSG, "Press your sprint key (SPACE) when you're done." );
  262.         }
  263.         else ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY, DIALOG_STYLE_LIST, D_TITLE, "Change Position\nChange Color\nDelete Zone", "Select", "Go Back" );
  264.     }
  265.     if( dialogid == DIALOG_ZONE_MODIFY_COLOR )
  266.     {
  267.         if( response )
  268.         {
  269.             #define n inputtext
  270.             if( !strlen( n ) || n[ 0 ] != '0' || n[ 1 ] != 'x' || strlen( n ) > 10 )
  271.                 return ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY_COLOR, DIALOG_STYLE_INPUT, D_TITLE, "Enter the color you wish to use for your gangzone.\n(NOTE) Must be in hexidecimal otherwise something can go wrong!\n\n{FF0000}Invalid hexidecimal color!", "Submit", "Go Back" );
  272.  
  273.             GangZoneHideForPlayer( playerid, g_gangzoneData[ p_EditingZone{ playerid } ] [ E_ZONE ] );
  274.             g_gangzoneData[ p_EditingZone{ playerid } ] [ E_COLOR ] = HexToInt( n );
  275.             GangZoneShowForPlayer( playerid, g_gangzoneData[ p_EditingZone{ playerid } ] [ E_ZONE ], HexToInt( n ) );
  276.             ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY_COLOR, DIALOG_STYLE_INPUT, D_TITLE, "Enter the color you wish to use for your gangzone.\n(NOTE) Must be in hexidecimal otherwise something can go wrong!", "Submit", "Go Back" );
  277.             #undef n
  278.         }
  279.         else ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY, DIALOG_STYLE_LIST, D_TITLE, "Change Position\nChange Color\nDelete Zone", "Select", "Go Back" );
  280.     }
  281.     if( dialogid == DIALOG_ZONE_MODIFY_DEL )
  282.     {
  283.         if( response )
  284.         {
  285.             new z = p_EditingZone{ playerid };
  286.             GangZoneHideForAll( g_gangzoneData[ z ] [ E_ZONE ] );
  287.             GangZoneDestroy( g_gangzoneData[ z ] [ E_ZONE ] );
  288.             g_gangzoneData[ z ] [ E_CREATED ] = false;
  289.             g_totalZones --;
  290.             format( string, sizeof( string ), "{00FFFF}Create New Gangzone{FFFFFF}\n" );
  291.             for( new i; i < sizeof( g_gangzoneData ); i++ )
  292.             {
  293.                 if( g_gangzoneData[ i ] [ E_CREATED ] == true ) {
  294.                     format( string, sizeof( string ), "%sZone %d\n", string, i );
  295.                 }
  296.             }
  297.             ShowPlayerDialog( playerid, DIALOG_ZONE_MANAGE, DIALOG_STYLE_LIST, D_TITLE, string, "Select", "Go Back" );
  298.         }
  299.         else ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY, DIALOG_STYLE_LIST, D_TITLE, "Change Position\nChange Color\nDelete Zone", "Select", "Go Back" );
  300.     }
  301.     return 1;
  302. }
  303.  
  304. public OnPlayerClickMap( playerid, Float:fX, Float:fY, Float:fZ )
  305. {
  306.     switch( p_ModifyLengthMode{ playerid } )
  307.     {
  308.         case 1:
  309.         {
  310.             new i = p_EditingZone{ playerid };
  311.             g_gangzoneData[ i ] [ E_MAX_X ] = fX;
  312.             g_gangzoneData[ i ] [ E_MAX_Y ] = fY;
  313.             GangZoneHideForPlayer( playerid, g_gangzoneData[ i ] [ E_ZONE ] );
  314.             g_gangzoneData[ i ] [ E_ZONE ] = GangZoneCreate( g_gangzoneData[ i ] [ E_MIN_X ], g_gangzoneData[ i ] [ E_MIN_Y ], g_gangzoneData[ i ] [ E_MAX_X ], g_gangzoneData[ i ] [ E_MAX_Y ] );
  315.             GangZoneShowForPlayer( playerid, g_gangzoneData[ i ] [ E_ZONE ], g_gangzoneData[ i ] [ E_COLOR ] );
  316.             SCM( playerid, COLOR_MSG, "You have successfully set the max X-Y at the point selected." );
  317.         }
  318.         case 2:
  319.         {
  320.             new i = p_EditingZone{ playerid };
  321.             g_gangzoneData[ i ] [ E_MIN_X ] = fX;
  322.             g_gangzoneData[ i ] [ E_MIN_Y ] = fY;
  323.             GangZoneHideForPlayer( playerid, g_gangzoneData[ i ] [ E_ZONE ] );
  324.             GangZoneDestroy( g_gangzoneData[ i ] [ E_ZONE ] );
  325.             g_gangzoneData[ i ] [ E_ZONE ] = GangZoneCreate( g_gangzoneData[ i ] [ E_MIN_X ], g_gangzoneData[ i ] [ E_MIN_Y ], g_gangzoneData[ i ] [ E_MAX_X ], g_gangzoneData[ i ] [ E_MAX_Y ] );
  326.             GangZoneShowForPlayer( playerid, g_gangzoneData[ i ] [ E_ZONE ], g_gangzoneData[ i ] [ E_COLOR ] );
  327.             SCM( playerid, COLOR_MSG, "You have successfully set the min X-Y at the point selected." );
  328.         }
  329.     }
  330.     return 1;
  331. }
  332.  
  333. public OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
  334. {
  335.     if( ( newkeys & KEY_SPRINT ) && p_ModifyLengthMode{ playerid } != 0 )
  336.     {
  337.         p_ModifyLengthMode{ playerid } = 0;
  338.         ShowPlayerDialog( playerid, DIALOG_ZONE_MODIFY_XY, DIALOG_STYLE_LIST, D_TITLE, "Modify Max X/Y\nModify Min X/Y", "Select", "Go Back" );
  339.         SCM( playerid, COLOR_MSG, "You have finished setting the position on this axis." );
  340.     }
  341.     return 1;
  342. }
  343.  
  344. stock getFreeGangZone( )
  345. {
  346.     for( new i; i < sizeof( g_gangzoneData ); i++ )
  347.     {
  348.         if( !g_gangzoneData[ i ] [ E_CREATED ] )
  349.             return i;
  350.     }
  351.     return -1;
  352. }
  353.  
  354. stock HexToInt(string[]) // By DracoBlue
  355. {
  356.     if (string[0]==0) return 0;
  357.     new i;
  358.     new cur=1;
  359.     new res=0;
  360.     for (i=strlen(string);i>0;i--) {
  361.         if (string[i-1]<58) res=res+cur*(string[i-1]-48); else res=res+cur*(string[i-1]-65+10);
  362.         cur=cur*16;
  363.     }
  364.     return res;
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement