- Код: Выделить всё
#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 /fs", command);
register_clcmd("say_team /fs", 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), "\rFree surf меню");
// --| Create the menu
g_iItemsMenu = menu_create(szText, "StartMenu_Handle");
formatex(szText, charsmax(szText), "Гравитация: %s", get_bit(g_bGravity, id) ? "\r[\yВкл\r]" : "\rВыкл" );
menu_additem(g_iItemsMenu, szText, "1", 0);
formatex(szText, charsmax(szText), "Нет преград: %s", get_bit(g_bNoClip, id) ? "\r[\yВкл\r]" : "\r[\yВыкл\r]" );
menu_additem(g_iItemsMenu, szText, "2", 0);
formatex(szText, charsmax(szText), "Скорость: %s", get_bit(g_bSpeed, id) ? "\r[\yВкл\r]" : "\r[\yВыкл\r]" );
menu_additem(g_iItemsMenu, szText, "3", 0);
formatex(szText, charsmax(szText), "Застрял? Жми сюда!^n^n");
menu_additem(g_iItemsMenu, szText, "4", 0);
formatex(szText, charsmax(szText), "\y%s? \rЖми сюда!", get_bit(g_bUserDead, id) ? "Надоело быть призраком?" : "Хочешь вернуться в мир мертвых?" );
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();
}
RegisterHam(Ham_Killed, "player", "Ham_PlayerKilled", false);
}
public Ham_PlayerKilled(iVictim)
{
StartMenu_Handle(iVictim);
}
Неинформативное название темы (исправлено) // Subb98