Skip to content

Instantly share code, notes, and snippets.

@addonszz
Last active January 26, 2016 21:29
Show Gist options
  • Save addonszz/e2831dd591d6deb4d710 to your computer and use it in GitHub Desktop.
Save addonszz/e2831dd591d6deb4d710 to your computer and use it in GitHub Desktop.

Revisions

  1. addonszz revised this gist Jan 26, 2016. 1 changed file with 159 additions and 24 deletions.
    183 changes: 159 additions & 24 deletions duels.sma
    Original file line number Original file line Diff line number Diff line change
    @@ -5,49 +5,129 @@
    #include < regex > #include < regex >
    #include < engine > #include < engine >
    #include < fakemeta > #include < fakemeta >
    #include < fakemeta_util >
    #include < hamsandwich > #include < hamsandwich >


    #define ADMIN_FLAG ADMIN_BAN #define ADMIN_FLAG ADMIN_BAN


    new const Float:VEC_BLANK[ 3 ] = { 9999.0, 9999.0, 9999.0 }; new const Float:VEC_BLANK[ 3 ] = { 9999.0, 9999.0, 9999.0 };


    //new bool:g_bOriginSet; new bool:g_bOriginSet;
    new Float:g_vecOrigin[ 2 ][ 3 ]; new Float:g_vecOrigin[ 2 ][ 3 ];
    new g_szMapFile[ 128 ]; new g_szMapFile[ 128 ];


    #define fm_DispatchSpawn(%1) dllfunc(DLLFunc_Spawn, %1)
    #define ValidOrigin(%1) !xs_vec_equal( g_vecOrigin[ %1 ], VEC_BLANK ) #define ValidOrigin(%1) !xs_vec_equal( g_vecOrigin[ %1 ], VEC_BLANK )
    #define ValidOrigins() ( ValidOrigin( 0 ) && ValidOrigin( 1 ) ) #define ValidOrigins() ( ValidOrigin( 0 ) && ValidOrigin( 1 ) )


    #define LONG_STRING 256

    /** This is to view internal program data while execution. See the function 'debugMesssageLogger(...)'
    * and the variable 'g_debug_level' for more information. Default value: 0 - which is disabled.
    */
    #define IS_DEBUG_ENABLED 1

    #if IS_DEBUG_ENABLED > 0
    #define DEBUG_LOGGER(%1) debugMesssageLogger( %1 );

    /**
    * ( 0 ) 0 disabled all debug.
    * ( 1 ) 1 displays basic debug messages.
    */
    new g_debug_level = 1;

    /**
    * Write debug messages to server's console accordantly to the global variable g_debug_level.
    *
    * @param mode the debug mode level, see the variable 'g_debug_level' for the levels.
    * @param message[] the text formatting rules to display.
    * @param any the variable number of formatting parameters.
    */
    stock debugMesssageLogger( mode, message[], any: ... )
    {
    if( mode & g_debug_level )
    {
    static formated_message[ LONG_STRING ];

    vformat( formated_message, charsmax( formated_message ), message, 3 );

    server_print( "%s", formated_message );
    client_print( 0, print_console, "%s", formated_message );
    }
    }
    #else
    #define DEBUG_LOGGER(%1) //
    #endif

    new const g_szMenuTitleAdmin[ ] = "KnifeDuelAdminMenu"; new const g_szMenuTitleAdmin[ ] = "KnifeDuelAdminMenu";


    new bool:g_bChallenging; new bool:g_bChallenging;
    new bool:g_bChallenging_canceled

    new g_iChallenger, g_iChallenged; new g_iChallenger, g_iChallenged;


    new g_bChallenging_rounds_counter
    new g_iChallenger_wins
    new g_iChallenged_wins

    new pCvarSlashCount; new pCvarSlashCount;
    new pCvarCountDown; new pCvarCountDown;
    new pCvarSetHealth; new pCvarSetHealth;



    public plugin_init( ) public plugin_init( )
    { {
    register_plugin( "Knife Duel", "0.0.1", "Sneaky.amxx AKA HumboldtAnon" ); register_plugin( "Knife Duel", "0.2", "Sneaky.amxx AKA HumboldtAnon/Addons zz" );


    register_clcmd( "knifeduel_menu", "CmdAdminMenu" ); register_clcmd( "knifeduel_menu", "CmdAdminMenu" );


    register_menu( g_szMenuTitleAdmin, ( MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_0 ), "MenuHandlerAdmin" ); register_menu( g_szMenuTitleAdmin, ( MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_0 ), "MenuHandlerAdmin" );


    register_forward( FM_EmitSound, "FwdEmitSound" ); register_forward( FM_EmitSound, "FwdEmitSound" );
    register_forward( FM_ClientKill, "FwdClientKill" ); register_forward( FM_ClientKill, "FwdClientKill" );

    register_clcmd( "say /stopduel", "stop_duel" );


    register_event( "DeathMsg", "EventDeathMsg", "a" ); register_event( "DeathMsg", "EventDeathMsg", "a" );


    pCvarSlashCount = register_cvar( "knifeduel_slash_count", "3" ); pCvarSlashCount = register_cvar( "knifeduel_slash_count", "3" );
    pCvarCountDown = register_cvar( "knifeduel_countdown", "3" ); pCvarCountDown = register_cvar( "knifeduel_countdown", "3" );
    pCvarSetHealth = register_cvar( "knifeduel_set_health", "0" ); pCvarSetHealth = register_cvar( "knifeduel_set_health", "0" );

    register_logevent( "game_commencing_event", 2, "0=World triggered",
    "1=Game_Commencing", "1&Restart_Round_" )
    register_logevent("logevent_round_start", 2, "1=Round_Start")


    //g_bOriginSet = LoadOrigins( ); g_bOriginSet = LoadOrigins( );
    }

    public stop_duel()
    {
    g_bChallenging_canceled = true;
    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;
    g_bChallenging_rounds_counter = 0
    g_iChallenger_wins = 0
    g_iChallenged_wins = 0
    }

    public logevent_round_start()
    {
    stop_duel()
    }

    public game_commencing_event()
    {
    stop_duel()
    } }


    public client_disconnect( iPlayer ) public client_disconnect( iPlayer )
    {
    end_challange( iPlayer )
    }

    stock end_challange( iPlayer )
    { {
    if( g_bChallenging ) if( g_bChallenging )
    { {
    @@ -59,9 +139,7 @@ public client_disconnect( iPlayer )


    entity_set_int( iOtherPlayer, EV_INT_flags, entity_get_int( iOtherPlayer, EV_INT_flags ) & ~FL_FROZEN ); entity_set_int( iOtherPlayer, EV_INT_flags, entity_get_int( iOtherPlayer, EV_INT_flags ) & ~FL_FROZEN );


    g_bChallenging = false; stop_duel()
    g_iChallenger = 0;
    g_iChallenged = 0;
    } }
    } }
    } }
    @@ -159,13 +237,13 @@ public FwdEmitSound( iPlayer, iChannel, const szSound[ ] )
    } }
    else if( ++iHitCount[ iPlayer ] >= get_pcvar_num( pCvarSlashCount ) ) else if( ++iHitCount[ iPlayer ] >= get_pcvar_num( pCvarSlashCount ) )
    { {

    if( g_bChallenging ) if( g_bChallenging )
    { {
    client_print( iPlayer, print_chat, "* Someone is already starting a challenge." ); client_print( iPlayer, print_chat, "* Someone is already starting a challenge." );
    } }
    else else
    { {
    g_bChallenging_canceled = false;
    g_bChallenging = true; g_bChallenging = true;
    g_iChallenger = iPlayer; g_iChallenger = iPlayer;


    @@ -181,26 +259,73 @@ public FwdEmitSound( iPlayer, iChannel, const szSound[ ] )


    public FwdClientKill( iPlayer ) public FwdClientKill( iPlayer )
    { {
    return ( g_bChallenging && ( iPlayer == g_iChallenger || iPlayer == g_iChallenged ) ) ? FMRES_SUPERCEDE : FMRES_IGNORED; if( g_bChallenging && ( iPlayer == g_iChallenger || iPlayer == g_iChallenged ) )
    {
    return FMRES_SUPERCEDE;
    }

    return FMRES_IGNORED;
    } }


    public EventDeathMsg( ) public EventDeathMsg()
    { {
    if( g_bChallenging ) if( g_bChallenging )
    { {
    new iVictim = read_data( 1 ); new iVictim = read_data( 2 ); //read_data( 1 ) = killer


    if( iVictim == g_iChallenger ) if( g_bChallenging_canceled )
    { {
    ShowWinner( g_iChallenged, g_iChallenger ); if( iVictim == g_iChallenger )
    {
    if( ++g_iChallenged_wins > g_iChallenger_wins )
    {
    ShowWinner( g_iChallenged, g_iChallenger );
    }
    }
    else if( iVictim == g_iChallenged )
    {
    if( g_iChallenged_wins > ++g_iChallenger_wins )
    {
    ShowWinner( g_iChallenger, g_iChallenged );
    }
    }
    } }
    else if( iVictim == g_iChallenged ) else
    { {
    ShowWinner( g_iChallenger, g_iChallenged ); if( iVictim == g_iChallenger )
    {
    g_iChallenger_wins++
    }
    else if( iVictim == g_iChallenged )
    {
    g_iChallenged_wins++
    }

    g_bChallenging_rounds_counter++;
    }

    DEBUG_LOGGER( 1, "EventDeathMsg(): \
    ( g_bChallenging && ( iVictim == g_iChallenger || iVictim == g_iChallenged ): %d", \
    ( g_bChallenging && ( iVictim == g_iChallenger || iVictim == g_iChallenged ) ) )

    if( g_bChallenging && ( iVictim == g_iChallenger || iVictim == g_iChallenged ) )
    {
    new name[64]

    get_user_name( iVictim, name, charsmax( name ) )

    server_cmd( "amx_revive %s", name )
    } }

    set_task( 0.5, "move_player", iVictim )
    } }
    } }


    public move_player( id )
    {
    SetPosition( id, 1 );
    }

    ShowWinner( iWinner, iLoser ) ShowWinner( iWinner, iLoser )
    { {
    g_bChallenging = false; g_bChallenging = false;
    @@ -298,13 +423,20 @@ ShowChallengeMenu( )
    formatex( szTitle, charsmax( szTitle ), "\yKnife Duel^n\w%s has challeneged you^nDo you accept?", GetUserNameReturned( g_iChallenger ) ); formatex( szTitle, charsmax( szTitle ), "\yKnife Duel^n\w%s has challeneged you^nDo you accept?", GetUserNameReturned( g_iChallenger ) );


    new hMenu = menu_create( szTitle, "MenuChallenge" ); new hMenu = menu_create( szTitle, "MenuChallenge" );


    menu_additem( hMenu, "Yes", "1" ); if( is_user_bot( g_iChallenged ) )
    menu_additem( hMenu, "No", "0" ); {

    MenuChallenge( g_iChallenged, hMenu, 0 )
    menu_setprop( hMenu, MPROP_EXIT, MEXIT_NEVER ); }

    else
    menu_display( g_iChallenged, hMenu ); {
    menu_additem( hMenu, "Yes", "1" );
    menu_additem( hMenu, "No", "0" );

    menu_setprop( hMenu, MPROP_EXIT, MEXIT_NEVER );

    menu_display( g_iChallenged, hMenu );
    }
    } }


    public MenuChallenge( iPlayer, hMenu, iItem ) public MenuChallenge( iPlayer, hMenu, iItem )
    @@ -409,15 +541,18 @@ bool:LoadOrigins( )
    { {
    new strDir[101], strMapname[32] new strDir[101], strMapname[32]
    get_datadir(strDir, charsmax(strDir)); get_datadir(strDir, charsmax(strDir));

    add(strDir, charsmax(strDir), "/knife_duel" ); add(strDir, charsmax(strDir), "/knife_duel" );

    mkdir(strDir)


    get_mapname(strMapname, charsmax(strMapname)); get_mapname(strMapname, charsmax(strMapname));
    strtolower(strMapname) strtolower(strMapname)
    formatex(g_szMapFile, charsmax(g_szMapFile), "%s/%s.txt", strDir, strMapname); formatex(g_szMapFile, charsmax(g_szMapFile), "%s/%s.txt", strDir, strMapname);


    if( !dir_exists( strDir ) ) if( !dir_exists( strDir ) )
    { {
    mkdir( g_szMapFile ); mkdir( strDir );
    return false; return false;
    } }


    @@ -475,7 +610,7 @@ SaveOrigins( )


    fclose( iFile ); fclose( iFile );


    //g_bOriginSet = ValidOrigins( ); g_bOriginSet = ValidOrigins( );
    } }


    GetUserNameReturned( iPlayer ) GetUserNameReturned( iPlayer )
    @@ -501,4 +636,4 @@ GetPlayerByUserID( iUserID )
    } }


    return 0; return 0;
    } }
  2. addonszz created this gist Jan 26, 2016.
    504 changes: 504 additions & 0 deletions duels.sma
    Original file line number Original file line Diff line number Diff line change
    @@ -0,0 +1,504 @@
    #include < amxmodx >
    #include < amxmisc >
    #include < xs >
    #include < fun >
    #include < regex >
    #include < engine >
    #include < fakemeta >
    #include < hamsandwich >

    #define ADMIN_FLAG ADMIN_BAN

    new const Float:VEC_BLANK[ 3 ] = { 9999.0, 9999.0, 9999.0 };

    //new bool:g_bOriginSet;
    new Float:g_vecOrigin[ 2 ][ 3 ];
    new g_szMapFile[ 128 ];

    #define ValidOrigin(%1) !xs_vec_equal( g_vecOrigin[ %1 ], VEC_BLANK )
    #define ValidOrigins() ( ValidOrigin( 0 ) && ValidOrigin( 1 ) )

    new const g_szMenuTitleAdmin[ ] = "KnifeDuelAdminMenu";

    new bool:g_bChallenging;
    new g_iChallenger, g_iChallenged;

    new pCvarSlashCount;
    new pCvarCountDown;
    new pCvarSetHealth;

    public plugin_init( )
    {
    register_plugin( "Knife Duel", "0.0.1", "Sneaky.amxx AKA HumboldtAnon" );

    register_clcmd( "knifeduel_menu", "CmdAdminMenu" );

    register_menu( g_szMenuTitleAdmin, ( MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_0 ), "MenuHandlerAdmin" );

    register_forward( FM_EmitSound, "FwdEmitSound" );
    register_forward( FM_ClientKill, "FwdClientKill" );

    register_event( "DeathMsg", "EventDeathMsg", "a" );

    pCvarSlashCount = register_cvar( "knifeduel_slash_count", "3" );
    pCvarCountDown = register_cvar( "knifeduel_countdown", "3" );
    pCvarSetHealth = register_cvar( "knifeduel_set_health", "0" );

    //g_bOriginSet = LoadOrigins( );
    }

    public client_disconnect( iPlayer )
    {
    if( g_bChallenging )
    {
    if( iPlayer == g_iChallenged || iPlayer == g_iChallenger )
    {
    new iOtherPlayer = ( iPlayer == g_iChallenged ) ? g_iChallenger : g_iChallenged;

    ExecuteHamB( Ham_CS_RoundRespawn, iOtherPlayer );

    entity_set_int( iOtherPlayer, EV_INT_flags, entity_get_int( iOtherPlayer, EV_INT_flags ) & ~FL_FROZEN );

    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;
    }
    }
    }

    public CmdAdminMenu( iPlayer )
    {
    if( access( iPlayer, ADMIN_FLAG ) )
    {
    ShowAdminMenu( iPlayer );
    }
    else
    {
    console_print( iPlayer, "%L", iPlayer, "NO_ACC_COM" );
    }

    return PLUGIN_HANDLED;
    }

    ShowAdminMenu( iPlayer )
    {
    static szMenu[ 512 ];
    new iLen = copy( szMenu, charsmax( szMenu ), "\yKnife Duel^n\rAdmin Menu" );

    new iKeys = MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_0;
    new iValidCount;

    for( new i = 0; i < 2; i++ )
    {
    iLen += formatex( szMenu[ iLen ], charsmax( szMenu ), "^n^n\r%d. \wSet Position #%d^n \yCurrent Position: ", ( i + 1 ), ( i + 1 ) );

    if( ValidOrigin( i ) )
    {
    iLen += formatex( szMenu[ iLen ], charsmax( szMenu ), "\w%.3f %.3f %.3f", g_vecOrigin[ i ][ 0 ], g_vecOrigin[ i ][ 1 ], g_vecOrigin[ i ][ 2 ] );

    iValidCount++;
    }
    else
    {
    iLen += copy( szMenu[ iLen ], charsmax( szMenu ), "\dNot Set" );
    }
    }

    if( iValidCount == 2 )
    {
    iLen += copy( szMenu[ iLen ], charsmax( szMenu ), "^n^n\r3. \wSave Origins" );

    iKeys |= MENU_KEY_3;
    }
    else
    {
    iLen += copy( szMenu[ iLen ], charsmax( szMenu ), "^n^n\d3. Save Origins" );
    }

    iLen += copy( szMenu[ iLen ], charsmax( szMenu ), "^n^n\r0. \wExit" );

    show_menu( iPlayer, iKeys, szMenu, _, g_szMenuTitleAdmin );
    }

    public MenuHandlerAdmin( iPlayer, iKey )
    {
    switch( ++iKey % 10 )
    {
    case 1, 2:
    {
    entity_get_vector( iPlayer, EV_VEC_origin, g_vecOrigin[ iKey - 1 ] );

    ShowAdminMenu( iPlayer );
    }
    case 3:
    {
    SaveOrigins( );

    client_print( iPlayer, print_chat, "* Saved origins" );

    ShowAdminMenu( iPlayer );
    }
    case 0:
    {
    // exit
    }
    }
    }

    public FwdEmitSound( iPlayer, iChannel, const szSound[ ] )
    {
    if( is_user_alive( iPlayer ) && equal( szSound, "weapons/knife_hitwall1.wav" ) )
    {
    static iHitCount[ 33 ], Float:flLastHit[ 33 ];

    new Float:flGameTime = get_gametime( );

    if( ( flGameTime - flLastHit[ iPlayer ] ) >= 1.0 )
    {
    iHitCount[ iPlayer ] = 0;
    }
    else if( ++iHitCount[ iPlayer ] >= get_pcvar_num( pCvarSlashCount ) )
    {

    if( g_bChallenging )
    {
    client_print( iPlayer, print_chat, "* Someone is already starting a challenge." );
    }
    else
    {
    g_bChallenging = true;
    g_iChallenger = iPlayer;

    ShowPlayerMenu( iPlayer );
    }

    iHitCount[ iPlayer ] = 0;
    }

    flLastHit[ iPlayer ] = flGameTime;
    }
    }

    public FwdClientKill( iPlayer )
    {
    return ( g_bChallenging && ( iPlayer == g_iChallenger || iPlayer == g_iChallenged ) ) ? FMRES_SUPERCEDE : FMRES_IGNORED;
    }

    public EventDeathMsg( )
    {
    if( g_bChallenging )
    {
    new iVictim = read_data( 1 );

    if( iVictim == g_iChallenger )
    {
    ShowWinner( g_iChallenged, g_iChallenger );
    }
    else if( iVictim == g_iChallenged )
    {
    ShowWinner( g_iChallenger, g_iChallenged );
    }
    }
    }

    ShowWinner( iWinner, iLoser )
    {
    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;

    ExecuteHamB( Ham_CS_RoundRespawn, iWinner );

    client_print( 0, print_chat, "* %s has defeated %s in the knife duel!", GetUserNameReturned( iLoser ), GetUserNameReturned( iWinner ) );
    }

    ShowPlayerMenu( iPlayer )
    {
    new const szTeamInfo[ ][ ] = { "", "CT", "TERRORIST", "" };

    new iPlayers[ 32 ], iNum;
    get_players( iPlayers, iNum, "ae", szTeamInfo[ get_user_team( iPlayer ) ] );

    if( !iNum )
    {
    g_bChallenging = false;
    g_iChallenger = 0;

    client_print( iPlayer, print_chat, "* There are no players to challenge to a knife duel!" );

    return;
    }

    new hMenu = menu_create( "\yKnife Duel^nPlayer Menu", "MenuPlayer" );

    for( new i = 0, iTarget, szName[ 32 ], szUserID[ 11 ]; i < iNum; i++ )
    {
    iTarget = iPlayers[ i ];

    get_user_name( iTarget, szName, charsmax( szName ) );
    num_to_str( get_user_userid( iTarget ), szUserID, charsmax( szUserID ) );

    // Temporarily add userid to name item
    format( szName, charsmax( szName ), "#%s %s", szUserID, szName );

    menu_additem( hMenu, szName, szUserID );
    }

    menu_display( iPlayer, hMenu );
    }

    public MenuPlayer( iPlayer, hMenu, iItem )
    {
    if( iItem == MENU_EXIT )
    {
    menu_destroy( hMenu );

    g_bChallenging = false;
    g_iChallenger = 0;

    return;
    }

    new iAccess, szUserID[ 11 ], hCallback;
    menu_item_getinfo( hMenu, iItem, iAccess, szUserID, charsmax( szUserID ), _, _, hCallback );
    menu_destroy( hMenu );

    new iTarget = GetPlayerByUserID( str_to_num( szUserID ) );

    client_print( g_iChallenger, print_chat, "Target userid: %s; Found target: %d; Connected: %s; Alive: %s", szUserID, iTarget, is_user_connected( iTarget ) ? "true" : "false", is_user_alive( iTarget ) ? "true" : "false" );

    if( is_user_alive( iTarget ) )
    {
    g_iChallenged = iTarget;

    client_print( 0, print_chat, "* %s has challenged %s to a knife duel!", GetUserNameReturned( iPlayer ), GetUserNameReturned( iTarget ) );

    ShowChallengeMenu( );
    }
    else
    {
    client_print( iPlayer, print_chat, "* That player is no longer %s", is_user_connected( iTarget ) ? "alive" : "connected" );

    ShowPlayerMenu( iPlayer );
    }
    }

    ShowChallengeMenu( )
    {
    if( !is_user_alive( g_iChallenger ) || !is_user_alive( g_iChallenged ) )
    {
    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;

    return;
    }

    new szTitle[ 128 ];
    formatex( szTitle, charsmax( szTitle ), "\yKnife Duel^n\w%s has challeneged you^nDo you accept?", GetUserNameReturned( g_iChallenger ) );

    new hMenu = menu_create( szTitle, "MenuChallenge" );

    menu_additem( hMenu, "Yes", "1" );
    menu_additem( hMenu, "No", "0" );

    menu_setprop( hMenu, MPROP_EXIT, MEXIT_NEVER );

    menu_display( g_iChallenged, hMenu );
    }

    public MenuChallenge( iPlayer, hMenu, iItem )
    {
    menu_destroy( hMenu );

    if( iItem == MENU_EXIT || !is_user_alive( g_iChallenger ) || !is_user_alive( g_iChallenged ) )
    {
    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;

    return;
    }

    if( iItem == 0 )
    {
    SetPosition( g_iChallenger, 0 );
    SetPosition( g_iChallenged, 1 );

    new iHealth = get_pcvar_num( pCvarSetHealth );

    if( iHealth > 0 )
    {
    set_user_health( g_iChallenger, iHealth );
    set_user_health( g_iChallenged, iHealth );
    }

    client_print( 0, print_chat, "* %s accepted the knife duel with %s", GetUserNameReturned( g_iChallenged ), GetUserNameReturned( g_iChallenger ) );

    new iParam[ 1 ];
    iParam[ 0 ] = get_pcvar_num( pCvarCountDown );

    set_task( 1.0, "TaskCountDown", 123, iParam, 1 );
    }
    else
    {
    client_print( 0, print_chat, "* %s declined to have a knife duel with %s", GetUserNameReturned( g_iChallenged ), GetUserNameReturned( g_iChallenger ) );

    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;
    }
    }

    SetPosition( iPlayer, iOriginIndex )
    {
    entity_set_int( iPlayer, EV_INT_flags, entity_get_int( iPlayer, EV_INT_flags ) | FL_FROZEN );

    entity_set_origin( iPlayer, g_vecOrigin[ iOriginIndex ] );
    }

    public TaskCountDown( iParams[ ] )
    {
    if( !is_user_alive( g_iChallenger ) )
    {
    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;

    if( is_user_alive( g_iChallenged ) )
    {
    ExecuteHamB( Ham_CS_RoundRespawn, g_iChallenged );

    entity_set_int( g_iChallenged, EV_INT_flags, entity_get_int( g_iChallenged, EV_INT_flags ) & ~FL_FROZEN );
    }

    return;
    }

    if( !is_user_alive( g_iChallenged ) )
    {
    g_bChallenging = false;
    g_iChallenger = 0;
    g_iChallenged = 0;

    return;
    }

    new iTimeLeft = iParams[ 0 ]--;

    if( iTimeLeft > 0 )
    {
    set_hudmessage( 0, 255, 0, .holdtime = 1.0, .channel = -1 );
    show_hudmessage( g_iChallenger, "Knife Duel^nCount Down: %d", iTimeLeft );
    show_hudmessage( g_iChallenged, "Knife Duel^nCount Down: %d", iTimeLeft );

    set_task( 1.0, "TaskCountDown", 123, iParams, 1 );
    }
    else
    {
    entity_set_int( g_iChallenger, EV_INT_flags, entity_get_int( g_iChallenger, EV_INT_flags ) & ~FL_FROZEN );
    entity_set_int( g_iChallenged, EV_INT_flags, entity_get_int( g_iChallenged, EV_INT_flags ) & ~FL_FROZEN );

    set_hudmessage( 0, 255, 0, .holdtime = 3.0, .channel = -1 );
    show_hudmessage( g_iChallenger, "Knife Duel^nFIGHT!" );
    show_hudmessage( g_iChallenged, "Knife Duel^nFIGHT!" );
    }
    }

    bool:LoadOrigins( )
    {
    new strDir[101], strMapname[32]
    get_datadir(strDir, charsmax(strDir));
    add(strDir, charsmax(strDir), "/knife_duel" );

    get_mapname(strMapname, charsmax(strMapname));
    strtolower(strMapname)
    formatex(g_szMapFile, charsmax(g_szMapFile), "%s/%s.txt", strDir, strMapname);

    if( !dir_exists( strDir ) )
    {
    mkdir( g_szMapFile );
    return false;
    }

    if( !file_exists( g_szMapFile ) )
    {
    return false;
    }

    new iFile = fopen( g_szMapFile, "rt" );

    if( !iFile )
    {
    return false;
    }

    new szData[ 96 ], iLen;
    new szX[ 16 ], szY[ 16 ], szZ[ 16 ];
    new iOriginCount;

    new Regex:pPattern = regex_compile( "^^(\d+\.\d+ ){2}\d+\.\d+$", iLen, "", 0 );

    while( !feof( iFile ) && iOriginCount < 2 )
    {
    fgets( iFile, szData, charsmax( szData ) );
    trim( szData );

    if( regex_match_c( szData, pPattern, iLen ) > 0 )
    {
    parse( szData, szX, charsmax( szX ), szY, charsmax( szY ), szZ, charsmax( szZ ) );

    g_vecOrigin[ iOriginCount ][ 0 ] = str_to_float( szX );
    g_vecOrigin[ iOriginCount ][ 1 ] = str_to_float( szY );
    g_vecOrigin[ iOriginCount ][ 2 ] = str_to_float( szZ );

    iOriginCount++;
    }
    }

    fclose( iFile );

    return ( iOriginCount == 2 && ValidOrigins( ) );
    }

    SaveOrigins( )
    {
    new iFile = fopen(g_szMapFile, "wt+");

    if( !iFile )
    {
    return;
    }

    fprintf( iFile, "%f %f %f^n", g_vecOrigin[ 0 ][ 0 ], g_vecOrigin[ 0 ][ 1 ], g_vecOrigin[ 0 ][ 2 ] );
    fprintf( iFile, "%f %f %f", g_vecOrigin[ 1 ][ 0 ], g_vecOrigin[ 1 ][ 1 ], g_vecOrigin[ 1 ][ 2 ] );

    fclose( iFile );

    //g_bOriginSet = ValidOrigins( );
    }

    GetUserNameReturned( iPlayer )
    {
    new szName[ 32 ];
    get_user_name( iPlayer, szName, charsmax( szName ) );
    return szName;
    }

    GetPlayerByUserID( iUserID )
    {
    new iPlayers[ 32 ], iNum;
    get_players( iPlayers, iNum );

    for ( new i = 0, iTarget; i < iNum; i++ )
    {
    iTarget = iPlayers[ i ];

    if ( get_user_userid( iTarget ) == iUserID )
    {
    return iTarget;
    }
    }

    return 0;
    }