Raised This Month: $ Target: $400
 0% 

Alive When Dead - Ghosts can't use boosts


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Fr0sTbY7eX
Member
Join Date: Feb 2008
Old 04-25-2011 , 23:42   Alive When Dead - Ghosts can't use boosts
Reply With Quote #1

This script was made by Pastout, what it does is when a player dies they will re-spawn as a ghost while they are dead. Only problem is that ghosts can't use boosts. I want this for my surf server so players don't have to wait a million years for the last guy to die. Any suggestions?


Code:
#include <amxmodx>
#include <fun>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>

#define VERSION "1.1"

new const g_szPluginPrefix[] = "[AMXX]";

#pragma semicolon 1;

#define IsPlayer(%1)            (1 <= %1 <= g_iMaxPlayers)

#define SB_ATTRIB_DEAD          1<<0

// --| Macros
#define get_bit(%1,%2)         ( %1 &   1 << ( %2 & 31 ) )
#define set_bit(%1,%2)         %1 |=  ( 1 << ( %2 & 31 ) )
#define clear_bit(%1,%2)    %1 &= ~( 1 << ( %2 & 31 ) )

#define GetPlayerHullSize(%1)  ( ( pev ( %1, pev_flags ) & FL_DUCKING ) ? HULL_HEAD : HULL_HUMAN )
//Credits to Emp`
#define LoopThroughAlivePlayers(%1) new %1;while( (%1=NextAlivePlayer(%1)) )

// --| The first search distance for finding a free location in the map.
#define START_DISTANCE    32   
// --| How many times to search in an area for a free space.
#define MAX_ATTEMPTS      128  

// --| Just for readability.
enum Coord_e { Float:x, Float:y, Float:z };

new g_iMaxPlayers;
new g_iMsgSayText;
new g_iItemsMenu;
new g_iLargestPlayer;
new g_iDeathFlag;
new g_iScoreBoard;

new g_bUserDead;
new g_bUserReady;
new g_bIsNoMore;
new g_bHasMenuOpen;
new g_bGravity;
new g_bNoClip;
new g_bSpeed;

new bool:g_bRoundEnd;

new Float:vecOrigin[3];

public plugin_init()
{
    register_plugin("Alive When Dead", VERSION, "Pastout!");
    register_cvar("author", "Pastout!", FCVAR_SPONLY);
    register_cvar("version", VERSION, FCVAR_SPONLY);
    
    RegisterHam(Ham_Killed, "player", "Ham_PlayerKilled_Post", 1);
    RegisterHam(Ham_Spawn, "player", "Ham_PlayerSpawn_Post", 1);
    RegisterHam(Ham_Player_PreThink, "player", "Ham_CBasePlayer_PreThink_Post", 1);
    
    register_forward(FM_AddToFullPack, "Fwd_AddToFullPack_Post", 1);
    
    // --| Variables
    g_iMaxPlayers = get_maxplayers();
    g_iMsgSayText = get_user_msgid("SayText");
    g_iScoreBoard = get_user_msgid("ScoreAttrib");
    
    register_message(g_iScoreBoard, "MsgScoreBoard");
    
    // --| Client Commands
    new command[] = "CmdMainMenu";
    register_clcmd("say /dead", command);
    register_clcmd("say_team /dead", command);
    
    register_event("HLTV", "ev_NewRound", "a", "1=0", "2=0");
    register_logevent("ev_RoundEnd",2,"1=Round_End");
}

public ev_NewRound()
    g_bRoundEnd = false;
    
public ev_RoundEnd()
    g_bRoundEnd = true;

public client_disconnect(id)
{
    Reset_all(id);
    if( g_iLargestPlayer == id )
    {
        g_iLargestPlayer = 0;
        for( new i = id - 1; i > 0; i-- )
        {
            g_iLargestPlayer = i;
            break;
        }
    }
}

public client_putinserver(id)
{
    Reset_all(id);
    g_iLargestPlayer = max( g_iLargestPlayer, id );
}

public MsgScoreBoard()
{
    new id = get_msg_arg_int(1);
    
    if(get_bit(g_bUserDead, id))
        set_msg_arg_int(2, ARG_BYTE, SB_ATTRIB_DEAD);
}

public Ham_PlayerKilled_Post(victim, attacker, shouldgib)
{    
    if (!is_user_connected(victim))
        return HAM_IGNORED;
    
    // --| Update the scoreboard
    new szDeaths;
    szDeaths = cs_get_user_deaths(victim);
    cs_set_user_deaths(victim, szDeaths);

    if(is_user_connected(attacker))
    {
        szDeaths = cs_get_user_deaths(attacker);
        cs_set_user_deaths(attacker, szDeaths);
    }
    
    if(!g_bRoundEnd)
    {
        if(victim == attacker)
        {
            if (get_bit(g_bUserDead, victim))
            {
                clear_bit(g_bGravity, victim);
                clear_bit(g_bNoClip, victim);
                clear_bit(g_bSpeed, victim);
                if (get_bit(g_bHasMenuOpen, victim))
                {
                    if(player_menu_info(victim, g_iItemsMenu, g_iItemsMenu))
                    {
                        menu_cancel(victim);
                        client_cmd(victim, "slot1");
                    }
                    clear_bit(g_bHasMenuOpen, victim);
                }    
            }
        }
        else
        {
            if(!get_bit(g_bUserDead, victim) && !get_bit(g_bIsNoMore, victim))
            {
                
                entity_get_vector(victim, EV_VEC_origin, vecOrigin);
                
                if(GetPlayerHullSize(victim) == HULL_HEAD)
                    vecOrigin[2] += 15;
                else
                    vecOrigin[2] += 30;
                    
                set_task(2.0, "RespawnPlayer", victim);
            }
        }
    }
    
    return HAM_IGNORED;
}

public RespawnPlayer(victim)
{
    if(!g_bRoundEnd)
    {
        set_bit(g_iDeathFlag, victim);    
        
        set_bit(g_bUserDead, victim);
        clear_bit(g_bUserReady, victim);
        
        // --| Respawn Player at Deadbody
        ExecuteHamB(Ham_CS_RoundRespawn, victim);
        
        entity_set_vector(victim, EV_VEC_origin, vecOrigin);
        
        ClientCommand_UnStuck(victim);
        
        // --| Show Dead Menu Items
        CmdMainMenu(victim);
    
        // --| Set The Victims Flags to DEAD_RESPAWNABLE
        entity_set_int(victim, EV_INT_deadflag, DEAD_RESPAWNABLE);
    }
}

public Ham_PlayerSpawn_Post(id)
{ 
    if (!is_user_alive(id))
        return HAM_IGNORED;        
        
    if (get_bit(g_iDeathFlag, id))
        entity_set_int(id, EV_INT_deadflag, DEAD_RESPAWNABLE);    

    if (get_bit(g_bUserReady, id))
    {
        clear_bit(g_bUserDead, id);
        clear_bit(g_bIsNoMore, id);
        clear_bit(g_bGravity, id);
        clear_bit(g_bNoClip, id);
        clear_bit(g_bSpeed, id);
        message_begin(MSG_ONE_UNRELIABLE, g_iScoreBoard, _, id);
        write_byte(id);
        write_byte(0);
        message_end();
        if (get_bit(g_bHasMenuOpen, id))
        {
            if(player_menu_info(id, g_iItemsMenu, g_iItemsMenu))
            {
                menu_cancel(id);
                client_cmd(id, "slot1");
            }
            clear_bit(g_bHasMenuOpen, id);
        }
    }

    set_bit(g_bUserReady, id);
    clear_bit(g_iDeathFlag, id);
    return HAM_IGNORED;
}

public Fwd_AddToFullPack_Post(es, e, iEnt, id, hostflags, player, pSet)
{
    if( player && id != iEnt )
    {
        if(get_bit(g_bUserDead, id))
        {
            set_es(es, ES_Solid, SOLID_NOT);
            if( get_bit(g_bUserDead, iEnt) )
            {
                set_es(es, ES_RenderMode, kRenderTransAdd);
                set_es(es, ES_RenderAmt, 80);
                set_es(es, ES_RenderColor, 0, 0, 0);
                set_es(es, ES_RenderFx, kRenderFxDeadPlayer);
            }
        }
        else if(get_bit(g_bUserDead, iEnt) )
        {
            set_es(es, ES_Solid, SOLID_NOT);
            set_es(es, ES_Effects, get_es(es, ES_Effects) | EF_NODRAW);
            set_es(es, ES_Origin, Float:{99999.9,99999.9,99999.9});
        }
    }
}

public Ham_CBasePlayer_PreThink_Post(id)
{
    // --| Is alive, ignore.
    if( !get_bit(g_bUserDead, id) )
        return;
    
    if(get_bit(g_bUserDead, id))
        set_pev( id, pev_solid, SOLID_NOT );
        
    LoopThroughAlivePlayers( iPlayer )
        if( id != iPlayer )
            set_pev( iPlayer, pev_solid, SOLID_NOT );
}

public client_PostThink(id)
{
    // --| Is alive, ignore.
    if( !get_bit(g_bUserDead, id) )
        return;
        
    if(get_bit(g_bUserDead, id))
        set_pev( id, pev_solid, SOLID_SLIDEBOX );

    LoopThroughAlivePlayers( iPlayer )
        if( id != iPlayer )
            set_pev( iPlayer, pev_solid, SOLID_SLIDEBOX );
}

public ClientCommand_UnStuck( const id )
{
    new i_Value;

    if ( ( i_Value = UTIL_UnstuckPlayer ( id, START_DISTANCE, MAX_ATTEMPTS ) ) != 1 )
        switch ( i_Value )
        {
            case 0: ColorPrint(id, "Couldn't find a free spot to move you too");
            case -1: ColorPrint(id, "You cannot free yourself as alive player");
        }

    return PLUGIN_CONTINUE;
}


UTIL_UnstuckPlayer( const id, const i_StartDistance, const i_MaxAttempts )
{
    // --| Is alive, ignore.
    if ( !get_bit(g_bUserDead, id) )  return -1;
    
    static Float:vf_OriginalOrigin[ Coord_e ], Float:vf_NewOrigin[ Coord_e ];
    static i_Attempts, i_Distance;
    
    // --| Get the current player's origin.
    pev ( id, pev_origin, vf_OriginalOrigin );
    
    i_Distance = i_StartDistance;

    while ( i_Distance < 1000 )
    {
        i_Attempts = i_MaxAttempts;
    
        while ( i_Attempts-- )
        {
            vf_NewOrigin[ x ] = random_float ( vf_OriginalOrigin[ x ] - i_Distance, vf_OriginalOrigin[ x ] + i_Distance );
            vf_NewOrigin[ y ] = random_float ( vf_OriginalOrigin[ y ] - i_Distance, vf_OriginalOrigin[ y ] + i_Distance );
            vf_NewOrigin[ z ] = random_float ( vf_OriginalOrigin[ z ] - i_Distance, vf_OriginalOrigin[ z ] + i_Distance );
        
            engfunc ( EngFunc_TraceHull, vf_NewOrigin, vf_NewOrigin, DONT_IGNORE_MONSTERS, GetPlayerHullSize ( id ), id, 0 );
        
            // --| Free space found.
            if ( get_tr2 ( 0, TR_InOpen ) && !get_tr2 ( 0, TR_AllSolid ) && !get_tr2 ( 0, TR_StartSolid ) )
            {
                // --| Set the new origin .
                engfunc ( EngFunc_SetOrigin, id, vf_NewOrigin );
                return 1;
            }
        }
    
        i_Distance += i_StartDistance;
    }

    // --| Could not be found.
    return 0;
}  

NextAlivePlayer(id)
{
    do id++;
    while( id <= g_iLargestPlayer && !is_user_alive( id ) );
    return ( id <= g_iLargestPlayer ) ? id : 0;
}

public CmdMainMenu(id)
{
    if(!get_bit(g_bUserDead, id) && is_user_alive(id))
    {
        ColorPrint(id, "Sorry you have to be^3 dead^1 to view this menu");
        return PLUGIN_HANDLED;
    }
        
    set_bit(g_bHasMenuOpen, id);
    
    // --| Menu Title
    new szText[777 char];
    formatex(szText, charsmax(szText), "\yMain Menu");
    
    // --| Create the menu
    g_iItemsMenu = menu_create(szText, "StartMenu_Handle");
    
    formatex(szText, charsmax(szText), "Gravity: %s", get_bit(g_bGravity, id) ? "\yOn" : "\rOff" );
    menu_additem(g_iItemsMenu, szText, "1", 0);
    
    formatex(szText, charsmax(szText), "Noclip: %s", get_bit(g_bNoClip, id) ? "\yOn" : "\rOff" );
    menu_additem(g_iItemsMenu, szText, "2", 0);
    
    formatex(szText, charsmax(szText), "Speed: %s", get_bit(g_bSpeed, id) ? "\yOn" : "\rOff" );
    menu_additem(g_iItemsMenu, szText, "3", 0);
    
    formatex(szText, charsmax(szText), "Stuck?^n^n");
    menu_additem(g_iItemsMenu, szText, "4", 0);
    
    formatex(szText, charsmax(szText), "\y%s? \rPress ME!", get_bit(g_bUserDead, id) ? "Don't want to be a Ghost anymore" : "Would you like to become a Ghost" );
    menu_additem(g_iItemsMenu, szText, "5", 0);
    
    menu_display(id, g_iItemsMenu);
    
    return PLUGIN_HANDLED;
}

public StartMenu_Handle(id, g_iItemsMenu, item)
{
    if(item == MENU_EXIT)
    {
        clear_bit(g_bHasMenuOpen, id);
        menu_destroy(g_iItemsMenu);
        return PLUGIN_HANDLED;
    }
    
    if(!get_bit(g_bUserDead, id) && is_user_alive(id))
    {
        clear_bit(g_bHasMenuOpen, id);
        ColorPrint(id, "Sorry you have to be dead to view this menu");
        return PLUGIN_HANDLED;
    }
    
    new data[6], iName[64];
    new access, callback;
    
    menu_item_getinfo(g_iItemsMenu, item, access, data, 5, iName, 63, callback);
    
    new key = str_to_num(data);
    switch(key)
    {
        case 1:{ ToggleGravity(id);CmdMainMenu(id); }
        case 2:{ ToggleNoClip(id);CmdMainMenu(id); }
        case 3:{ ToggleSpeed(id);CmdMainMenu(id); }
        case 4:{ ClientCommand_UnStuck(id);CmdMainMenu(id); }
        case 5:{ ToggleGhost(id);CmdMainMenu(id); }
    }
    return PLUGIN_HANDLED;
}

ToggleGravity(id)
{
    // --| Make sure player is dead
    if (get_bit(g_bUserDead, id))
        // --| If player has gravity
        if (get_bit(g_bGravity, id))
        {
            // --| Turn off gravity for player
            set_user_gravity(id, 1.0);
            clear_bit(g_bGravity, id);
        }
        else
        {
            // --| Turn on gravity for player
            set_user_gravity(id, 0.5);
            set_bit(g_bGravity, id);
        }
}

ToggleNoClip(id)
{
    // --| Make sure player is dead
    if (get_bit(g_bUserDead, id))
        // --| If player has noclip
        if (get_user_noclip(id))
        {
            // --| Turn off noclip for player
            set_user_noclip(id, 0);
            clear_bit(g_bNoClip, id);
            // --| Check if player is stuck
            ClientCommand_UnStuck(id);
        }
        else
        {
            // --| Turn on noclip for player
            set_user_noclip(id, 1);
            set_bit(g_bNoClip, id);
        }
}

ToggleSpeed(id)
{
    // --| Make sure player is dead
    if (get_bit(g_bUserDead, id))
        // --| If player has speed
        if (get_bit(g_bSpeed, id))
        {
            // --| Turn off speed for player
            set_user_maxspeed(id, 250.0);
            clear_bit(g_bSpeed, id);
        }
        else
        {
            // --| Turn on speed for player
            set_user_maxspeed(id, 600.0);
            set_bit(g_bSpeed, id);
        }
}
        
ToggleGhost(id)
{
    if (get_bit(g_bUserDead, id))
    {
        clear_bit(g_bUserDead, id);
        set_bit(g_bIsNoMore, id);
        new szFrags, szDeaths;
        szFrags = get_user_frags(id);
        szDeaths = cs_get_user_deaths(id);
        set_user_frags(id, szFrags+1);
        cs_set_user_deaths(id, szDeaths-1);
        set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET);
        client_cmd(id, "kill");
        set_task(2.0, "Allow_Reset", id);
    }
    else if(!get_bit(g_bIsNoMore, id))
        RespawnPlayer(id);
}

public Allow_Reset(id)
    clear_bit(g_bIsNoMore, id);

public Reset_all(id)
{     
    clear_bit(g_iDeathFlag, id);
    clear_bit(g_bUserDead, id);
    clear_bit(g_bUserReady, id);
    clear_bit(g_bIsNoMore, id);
    clear_bit(g_bHasMenuOpen, id);
    clear_bit(g_bGravity, id);
    clear_bit(g_bNoClip, id);
    clear_bit(g_bSpeed, id);
}

ColorPrint(id, const Msg[], {Float, Sql, Result,_}:...) {
    new Buffer[190], Buffer2[192];
    formatex(Buffer2, sizeof(Buffer2)-1, "^4%s^1 %s", g_szPluginPrefix, Msg);
    vformat(Buffer, sizeof(Buffer)-1, Buffer2, 3);

    if (!id) {
        for (new i = 1; i <= g_iMaxPlayers; i++) {
            if (!is_user_connected(i))
                continue;

            message_begin(MSG_ONE_UNRELIABLE, g_iMsgSayText,_, i);
            write_byte(i);
            write_string(Buffer);
            message_end();
        }
    }
    else {
        if (!is_user_connected(id))
            return;

        message_begin(MSG_ONE_UNRELIABLE, g_iMsgSayText,_, id);
        write_byte(id);
        write_string(Buffer);
        message_end();
    }
}
Fr0sTbY7eX is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 04:18.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode