Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Say commands:
- . /setcp
- . /cpinfo
- . /changecp
- *Sprite model* REUPLOADED (7.7.2020.): https://drive.google.com/file/d/1ja13CWg6cP6cJKGSlcuaxZOf8-G2Cv4s/view?usp=sharing
- big thanks for KpoluK from: https://kz-rush.ru/en/
- */
- #include <amxmodx>
- #include <amxmisc>
- #include <colorchat>
- #include <hamsandwich>
- #include <engine>
- #include <fakemeta>
- #define PLUGIN "KZ Checkpoints/markers"
- #define VERSION "1.0"
- #define AUTHOR "JocA"
- #define MAX_MARKERS 15
- new g_Model[] = "sprites/kz_checkpoint.spr"
- new model
- new bool: g_bStarted[ 33 ]
- new Float: g_fTime[ 33 ]
- new bool: g_bVisible
- new bool: g_bPVis[ 33 ]
- new Float: g_fOrigin[ MAX_MARKERS ][ 3 ]
- new Float: saved_origin[ 3 ]
- new g_mName[ MAX_MARKERS ][ 32 ]
- new saved_mName[ 32 ]
- new mTime[ 10 ]
- new g_nEnt[ MAX_MARKERS ]
- new ent_num
- new bool: g_makingIt = false
- //new bool: g_bPlayerVis[ 33 ]
- new Float:g_fMarkerTime[ MAX_MARKERS ]
- new g_bPlayerMarker[ 33 ][ 1500 ]
- new playerTouched[ 33 ]
- new Trie:g_tStarts
- new saycmd[ 20 ]
- new forbiden_say[][] = { "say /start", "say_team /start", "say /nc", "say_team /nc", "say /godmode", "say_team /godmode",
- "say /noclip", "say_team /noclip", "+hook", "-hook", "say /ct", "say /spec" }
- new file[ 256 ], folder[ 100 ]
- new mapname[ 32 ]
- public plugin_init()
- {
- register_plugin( PLUGIN, VERSION, AUTHOR )
- register_clcmd( "say /setcp", "create_menu" )
- register_clcmd( "say /cpinfo", "cp_info" )
- register_clcmd( "say /changecp", "change_cp" )
- g_makingIt = true
- RegisterHam( Ham_Use, "func_button", "fwdUse", 0 )
- g_tStarts = TrieCreate( )
- new const szStarts[][] =
- {
- "counter_start", "clockstartbutton", "firsttimerelay", "but_start", "counter_start_button",
- "multi_start", "timer_startbutton", "start_timer_emi", "gogogo", "timer_start"
- }
- for( new i = 0; i < sizeof szStarts; i++ )
- TrieSetCell( g_tStarts, szStarts[ i ], 1 )
- for( new i = 0; i < sizeof( forbiden_say ); i++ )
- {
- formatex( saycmd, charsmax( saycmd ), "%s", forbiden_say[ i ] )
- register_clcmd( saycmd, "forbiden" )
- }
- new path[ 32 ]
- get_mapname( mapname, charsmax( mapname ) )
- get_configsdir( path, charsmax( path ) )
- formatex( folder, charsmax( folder ), "%s/kz_checkpoints/", path )
- formatex( file, charsmax( file ), "%s/%s.ini", folder, mapname )
- if( !dir_exists( folder ) )
- mkdir( folder )
- set_task( 1.0, "load_cp" )
- set_task( 220.0, "show_cp", .flags="b" )
- }
- public change_cp( id )
- {
- g_bPVis[ id ] = !g_bPVis[ id ]
- ColorChat( id, BLUE, "^4[KZ]^1 Markers are now^3 %svisible^1 for you", g_bPVis[ id ] ? "":"in" )
- }
- public show_cp()
- {
- if( ent_num < 1 )
- return
- ColorChat( 0, BLUE, "KZ-MARKERS^1 - To see all %d markers:^3 /cpinfo^1 | To change visibility: ^3/changecp", ent_num )
- }
- public cp_info( id )
- {
- if( ent_num < 1 )
- return
- client_print( id, print_console,"^nMarkers on this map %d^n", ent_num )
- for( new i = 1; i <= ent_num; i++ )
- {
- new Float:timee = g_fMarkerTime[ i ]
- new min, Float:sec
- min=floatround(timee/60,floatround_floor);
- sec=timee-min*60;
- client_print( id, print_console,"#%d Time: %02d:%s%.02f by: %s", i, min, sec < 10 ? "0" : "",sec, g_mName[ i ] )
- }
- SendCmd_1( id, "toggleconsole" )
- }
- public create_cp1( id )
- {
- g_fMarkerTime[ 2 ] = 50.0
- }
- public plugin_precache()
- {
- g_tStarts = TrieCreate();
- precache_model( g_Model )
- model = precache_model( "sprites/kz_checkpoint.spr" )
- }
- public forbiden( id )
- {
- playerTouched[ id ] = 0
- g_bStarted[ id ] = false
- arrayset( g_bPlayerMarker[ id ], 0, sizeof g_bPlayerMarker[] )
- }
- public create_menu( id )
- {
- if( !( get_user_flags( id ) & ADMIN_LEVEL_C ) )
- return PLUGIN_HANDLED
- new menu_text[ 100 ]; formatex( menu_text, charsmax( menu_text ), "Create Checkpoints^n\dCurrently:\y %d\d CPs^n^n\rPlease reset your time while making them", ent_num )
- new menu = menu_create( menu_text, "menu_handle" )
- menu_additem( menu, "Create new checkpoint" )
- menu_additem( menu, "Change CP visibility" )
- menu_additem( menu, "Delete LAST CPs" )
- menu_additem( menu, "Delete all CPs^n" )
- menu_additem( menu, "\ySave all CPs" )
- menu_display( id, menu )
- return PLUGIN_HANDLED
- }
- public menu_handle( id, menu, item )
- {
- if( item == MENU_EXIT )
- {
- g_makingIt = false
- menu_destroy( menu )
- return PLUGIN_HANDLED
- }
- switch( item )
- {
- case 0:
- {
- create_cp( id, 0 )
- g_makingIt = true
- ColorChat( id, BLUE, "^4[KZ]^1 Whooop, whoop you made new marker!" )
- }
- case 1:
- {
- g_bVisible = !g_bVisible
- for( new i = 1; i <= ent_num; i++ )
- {
- if( !g_bVisible )
- set_pev( g_nEnt[ i ], pev_rendermode, kRenderTransAlpha )
- else
- set_pev( g_nEnt[ i ], pev_rendermode, kRenderNormal )
- }
- }
- case 2:
- {
- delete_cp( id, 0 )
- ColorChat( id, BLUE, "^4[KZ]^1 You removed last marker!" )
- }
- case 3:
- {
- delete_cp( id, 1 )
- ColorChat( id, BLUE, "^4[KZ]^1 You removed all markers! Uuuups" )
- }
- case 4:
- {
- g_makingIt = false
- save_cp( id )
- ColorChat( id, BLUE, "^4[KZ]^1 You saved all^3 %d^1 markers!", ent_num )
- //SetPlayerVis( id )
- }
- }
- menu_destroy( menu )
- create_menu( id )
- return PLUGIN_HANDLED
- }
- public SetPlayerVis( id )
- {
- {
- if( is_user_connected( id ) )
- {
- for( new i = 1; i <= ent_num; i++ )
- {
- if( !pev_valid( i ) ) continue
- message_begin( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, .player = id )
- write_byte( TE_SPRITE )
- write_coord( floatround(g_fOrigin[ i ][ 0 ] ) )
- write_coord( floatround(g_fOrigin[ i ][ 1 ] ) )
- write_coord( floatround(g_fOrigin[ i ][ 2 ] ) )
- write_short( model )
- write_byte( 2 )
- write_byte( 120 )
- message_end()
- }
- }
- }
- }
- public client_putinserver( id )
- g_bPVis[ id ] = true
- public client_PreThink( id )
- {
- //if( is_user_alive(id) || !is_user_bot( id ) )
- // return PLUGIN_CONTINUE
- if( get_gametime() > 10.0 && g_bPVis[ id ] )//&& !is_user_bot( id ) )
- SetPlayerVis( id )
- }
- public create_cp( id, load )
- {
- ent_num++
- new Float: origin[ 3 ]
- entity_get_vector( id, EV_VEC_origin, origin )
- if( !load )
- {
- if( !is_user_admin( id ) ) return PLUGIN_HANDLED
- g_fOrigin[ ent_num ][ 0 ] = origin[ 0 ]
- g_fOrigin[ ent_num ][ 1 ] = origin[ 1 ]
- g_fOrigin[ ent_num ][ 2 ] = origin[ 2 ]
- g_fMarkerTime[ ent_num ] = 0.0
- g_fOrigin[ ent_num ][ 2 ] +=40.0
- }
- else
- {
- g_fOrigin[ ent_num ][ 0 ] = saved_origin[ 0 ]
- g_fOrigin[ ent_num ][ 1 ] = saved_origin[ 1 ]
- g_fOrigin[ ent_num ][ 2 ] = saved_origin[ 2 ]
- formatex( g_mName[ ent_num ], charsmax( g_mName[] ), "%s", saved_mName )
- g_fMarkerTime[ ent_num ] = str_to_float( mTime )
- }
- g_nEnt[ ent_num ] = create_entity( "info_target" )
- entity_set_origin( g_nEnt[ ent_num ], g_fOrigin[ ent_num ] )
- entity_set_string( g_nEnt[ ent_num ], EV_SZ_classname, "kz_checkpoint" )
- entity_set_model( g_nEnt[ ent_num ], g_Model )
- entity_set_int( g_nEnt[ ent_num ], EV_INT_solid, SOLID_TRIGGER )
- new Float:maxs[ 3 ] = { 70.0, 70.0, 20.0 }
- new Float:mins[ 3 ] = { -70.0, -70.0, -20.0 }
- entity_set_size( g_nEnt[ ent_num ], mins, maxs )
- if( !g_bVisible )
- set_pev( g_nEnt[ ent_num ], pev_rendermode, kRenderGlow )
- else
- set_pev( g_nEnt[ ent_num ], pev_rendermode, kRenderNormal )
- //set_pev(dot,pev_renderfx,kRenderFxNone);
- return PLUGIN_HANDLED
- }
- public fwdUse( ent, id )
- {
- if( !ent || id > 32 || !is_user_alive( id ) )
- {
- return HAM_IGNORED
- }
- new name[32]
- get_user_name(id, name, 31)
- new szTarget[ 32 ];
- pev(ent, pev_target, szTarget, 31);
- if( TrieKeyExists( g_tStarts, szTarget ) && !g_makingIt )
- {
- if( ent_num > 0 )
- {
- for( new i = 0; i <= ent_num; i++ )
- g_bPlayerMarker[ id ][ g_nEnt[ ent_num ] - i ] = false
- }
- g_bStarted[ id ] = true
- g_fTime[ id ] = get_gametime()
- playerTouched[ id ] = 0
- }
- return HAM_IGNORED
- }
- public showit()
- {
- client_print( 0, print_chat, "radi botina" )
- }
- public reset_time( id )
- {
- g_bStarted[ id ] = false
- }
- public pfn_touch( ent, id )
- {
- new classname[ 32 ], name[ 32 ]
- entity_get_string( ent, EV_SZ_classname, classname, 31 )
- if( equal( classname, "kz_checkpoint" ) && !g_makingIt && g_bStarted[ id ] )
- {
- if ( (!(1 <= id <= get_maxplayers() )) )
- return PLUGIN_HANDLED
- if( g_bPlayerMarker[ id ][ ent ] )
- return PLUGIN_HANDLED
- playerTouched[ id ]++
- g_bPlayerMarker[ id ][ ent ] = true
- get_user_name( id, name, charsmax( name ) )
- new Float:timee = get_gametime() - g_fTime[ id ]
- new min, diffmin, Float:sec, Float: diffsec
- min=floatround(timee/60,floatround_floor);
- sec=timee-min*60;
- diffmin = floatround(( g_fMarkerTime[ playerTouched[ id ] ] - timee )/60, floatround_floor )
- diffsec =( g_fMarkerTime[ playerTouched[ id ] ] - timee ) - ( diffmin * 60 )
- if( timee < g_fMarkerTime[ playerTouched[ id ] ] && g_fMarkerTime[ playerTouched[ id ] ] > 0.0 )
- {
- ColorChat( 0, RED, "^4[KZ]^3 %s made new rec on #%d in: %02d:%s%.02f^4 (-%02d:%s%.02f)", name, playerTouched[ id ], min, sec < 10 ? "0" : "",sec, diffmin, diffsec < 10 ? "0" : "", diffsec )
- g_fMarkerTime[ playerTouched[ id ] ] = timee
- update_cp( id, playerTouched[ id ], timee )
- }
- else if( g_fMarkerTime[ playerTouched[ id ] ] > 0.0 )
- {
- diffmin = floatround(( timee - g_fMarkerTime[ playerTouched[ id ] ] )/60, floatround_floor )
- diffsec =( timee - g_fMarkerTime[ playerTouched[ id ] ]) - ( diffmin * 60 )
- ColorChat( id, GREY, "^4[KZ]^3 Marker #%d: %02d:%s%.2f^4 (+%02d:%s%.2f by %s)", playerTouched[ id ], min, sec < 10 ? "0" : "", sec, diffmin, diffsec < 10 ? "0" : "", diffsec, g_mName[ playerTouched[ id ] ] )
- new players[ 32 ], pnum, ii, id2
- get_players( players, pnum, "bc" )
- for( new i; i < pnum; i++ )
- {
- ii = players[ i ]
- id2 = GetSpectatedPlayer( ii )
- if( id2 == id )
- ColorChat( ii, GREY, "^4[KZ]^3 Marker #%d: %02d:%s%.2f^4 (+%02d:%s%.2f by %s)", playerTouched[ id ], min, sec < 10 ? "0" : "", sec, diffmin, diffsec < 10 ? "0" : "", diffsec, g_mName[ playerTouched[ id ] ] )
- }
- }
- if( g_fMarkerTime[ playerTouched[ id ] ] == 0.0 )
- {
- ColorChat( 0, BLUE, "^4[KZ]^3 First record on #%d marker by^3 %s in:^4 %02d:%s%.02f", playerTouched[ id ], name, min, sec < 10 ? "0" : "",sec )
- g_fMarkerTime[ playerTouched[ id ] ] = timee
- update_cp( id, playerTouched[ id ], timee )
- }
- }
- return PLUGIN_CONTINUE
- }
- public delete_cp( id, all )
- {
- if( all )
- {
- remove_entity_name( "kz_checkpoint" )
- ent_num = 0
- }
- else
- remove_entity( g_nEnt[ ent_num-- ] )
- }
- public save_cp( id )
- {
- new filee = fopen( file, "w+" )
- if( filee )
- {
- for( new i = 1; i <= ent_num; i++ )
- {
- fprintf( filee, "%d %.01f %.01f %.01f %.02f NIKOBE^n", i, g_fOrigin[ i ][ 0 ], g_fOrigin[ i ][ 1 ], g_fOrigin[ i ][ 2 ], g_fMarkerTime[ i ] )
- }
- fclose( filee )
- }
- }
- public load_cp() //load markers
- {
- new filee = fopen( file, "r" )
- new line = 0
- if( filee )
- {
- new Data[ 150 ], file_origin[ 3 ][ 10 ], entNum[ 3 ], name[ 32 ]
- g_makingIt = false
- while( fgets( filee, Data, 149 ) )
- {
- line++
- parse( Data, entNum, 2, file_origin[ 0 ], 9, file_origin[ 1 ], 9, file_origin[ 2 ], 9, mTime, 9, name, 31 )
- remove_quotes( name )
- saved_origin[ 0 ] = str_to_float( file_origin[ 0 ] )
- saved_origin[ 1 ] = str_to_float( file_origin[ 1 ] )
- saved_origin[ 2 ] = str_to_float( file_origin[ 2 ] )
- formatex( saved_mName, charsmax( saved_mName ), "%s", name )
- create_cp( 0, 1 )
- }
- }
- }
- public update_cp( id, got_num, const Float: player_time )
- {
- new file_origin[ 3 ][ 10 ], entNum[ 3 ], name[ 32 ], entNum1
- new i, len, readdata[ 512 ]
- while(read_file(file, i++, readdata, 511, len) )
- {
- parse( readdata, entNum, 2, file_origin[ 0 ], 9, file_origin[ 1 ], 9, file_origin[ 2 ], 9, mTime, 9, name, 31 )
- entNum1 = str_to_num ( entNum )
- if( got_num == entNum1 )
- {
- new msg[256]
- get_user_name( id, g_mName[ i ], charsmax( g_mName[] ) )
- format(msg, 255, "%d %.01f %.01f %.01f %.02f ^"%s^"", i, g_fOrigin[ i ][ 0 ], g_fOrigin[ i ][ 1 ], g_fOrigin[ i ][ 2 ], player_time, g_mName[ i ] )
- replace(readdata, 511, readdata, msg)
- write_file(file, readdata, i - 1)
- return PLUGIN_HANDLED
- }
- }
- return PLUGIN_HANDLED
- }
- stock SendCmd_1( id , text[] )
- {
- message_begin( MSG_ONE, 51, _, id )
- write_byte( strlen(text) + 2 )
- write_byte( 10 )
- write_string( text )
- message_end()
- }
- stock GetSpectatedPlayer(id)
- {
- if( !is_user_alive(id)
- && ((1 << pev(id, pev_iuser1)) & ((1 << 1)|(1 << 2)|(1 << 4))) )
- {
- new player = pev( id, pev_iuser2 );
- if( is_user_alive( player ) )
- {
- return player;
- }
- }
- return id;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement