PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#define PLUGIN "Fantasma"
#define VERSION "1.0"
#define AUTHOR "sonel"
#define SetBits(%1,%2) %1 |= 1<<(%2 & 31)
#define DelBits(%1,%2) %1 &= ~(1<<(%2 & 31))
#define GetBits(%1,%2) %1 & 1<<(%2 & 31)
#define MAX_PLAYERS 32 + 1
#define SB_ATTRIB_DEAD 1<<0
#define XO_WEAPONS 4
#define m_pPlayer 41
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
new g_bIsConnected, g_bIsAlive, g_bIsSpectator
new bool:g_bIsGhost[MAX_PLAYERS]
new g_iMaxPlayers
new bool:g_bStartSemiclip
new bool:g_bBombIsPlanted
new bool:g_bRoundEnd
new g_ScoreAttrib
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
g_ScoreAttrib = get_user_msgid("ScoreAttrib")
register_message(g_ScoreAttrib, "MsgScoreAttrib")
register_clcmd("say /ghost" , "fantasma")
register_clcmd("say_team /ghost" , "fantasma")
register_clcmd("say /fantasma" , "fantasma")
register_clcmd("say_team /fantasma" , "fantasma")
register_event("HLTV", "ev_NewRound", "a", "1=0", "2=0")
register_event( "CurWeapon", "evCurWeapon" , "be" , "1=1" , "2!29" );
g_iMaxPlayers = get_maxplayers()
register_forward(FM_CmdStart, "CmdStart")
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn", 1)
register_clcmd("radio1", "BlockCmd")
register_clcmd("radio2", "BlockCmd")
register_clcmd("radio3", "BlockCmd")
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled", 1)
RegisterHam(Ham_Player_PreThink, "player", "fw_PreThink_Post", 1)
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "fw_KnifePrimaryAttack")
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "fw_KnifeSecondaryAttack")
register_forward(FM_AddToFullPack, "fw_AddToFullPack_Post", 1)
register_logevent("ev_FunctionP", 3, "2=Planted_The_Bomb")
register_logevent("ev_RoundEnd",2,"1=Round_End")
RegisterHam( Ham_Touch, "armoury_entity", "Ham_WeaponTouch_Pre",0 )
RegisterHam( Ham_Touch, "weaponbox", "Ham_WeaponTouch_Pre", 0 )
register_message(get_user_msgid("StatusIcon"), "Message_StatusIcon");
}
public client_putinserver(id)
{
g_bIsGhost[id] = false
DelBits(g_bIsSpectator, id)
DelBits(g_bIsAlive, id)
SetBits(g_bIsConnected, id)
}
public client_disconnect(id)
{
g_bIsGhost[id] = false
DelBits(g_bIsSpectator, id)
DelBits(g_bIsAlive, id)
DelBits(g_bIsConnected, id)
if(!IsAlive(CS_TEAM_CT) || !IsAlive(CS_TEAM_T) && !g_bBombIsPlanted)
{
ForceRoundEnd()
}
}
public ev_FunctionP()
{
g_bBombIsPlanted = true
}
public fantasma(id)
{
if( is_user_alive( id ) )
{
client_print( id, print_chat, "You can only be ghost when dead!")
return PLUGIN_HANDLED;
}
new CsTeams:iTeam = cs_get_user_team(id)
if(iTeam == CS_TEAM_T || iTeam == CS_TEAM_CT)
{
RespawnGhost(id)
return PLUGIN_HANDLED;
}
return PLUGIN_HANDLED;
//return PLUGIN_HANDLED;
/*
if( is_user_alive( id ) )
{
client_print( id, print_chat, "Queres renascer vivo? Deves estar maluco!")
return PLUGIN_HANDLED;
}
new CsTeams:iTeam = cs_get_user_team(id)
if(iTeam == CS_TEAM_T || iTeam == CS_TEAM_CT)
ExecuteHamB(Ham_CS_RoundRespawn,id)
//set_task(0.5, "efeitosfantasma", id)
g_bIsGhost[id] = true;
//g_bStartSemiclip = true;
return PLUGIN_HANDLED;
*/
}
public ev_NewRound()
{
g_bRoundEnd = false
g_bBombIsPlanted = false
for(new i = 1; i <= g_iMaxPlayers; i++)
{
if(GetBits(g_bIsConnected, i))
{
if(g_bIsGhost[i])
{
cs_set_user_deaths(i, cs_get_user_deaths(i) - 1)
set_user_footsteps(i, 0)
//set_user_rendering(i)
g_bStartSemiclip = false
set_pev(i, pev_takedamage, DAMAGE_AIM)
}
g_bIsGhost[i] = false
}
}
}
public ev_RoundEnd()
{
if(!g_bRoundEnd)
{
ForceRoundEnd()
}
}
public RespawnGhost(id)
{
if(!g_bRoundEnd)
{
g_bStartSemiclip = true
g_bIsGhost[id] = true
ExecuteHamB(Ham_CS_RoundRespawn, id)
}
}
public fw_PlayerSpawn(id)
{
if(is_user_alive(id))
{
SetBits(g_bIsAlive, id)
DelBits(g_bIsSpectator, id)
if(g_bIsGhost[id])
{
StripWeapons(id)
SetUserGhost(id)
}
}
}
public fw_PlayerKilled(id)
{
DelBits(g_bIsAlive, id)
if(!g_bRoundEnd)
{
if(!IsAlive(CS_TEAM_CT) || !IsAlive(CS_TEAM_T) && !g_bBombIsPlanted)
{
ForceRoundEnd()
}
} }
public StripWeapons(id)
{
if(GetBits(g_bIsAlive, id) && g_bIsGhost[id])
{
strip_user_weapons(id)
give_item(id, "weapon_knife")
}
}
public MsgScoreAttrib()
{
new id = get_msg_arg_int(1)
if(g_bIsGhost[id])
{
set_msg_arg_int(2, ARG_BYTE, SB_ATTRIB_DEAD)
}
}
public fw_KnifePrimaryAttack(iEnt)
{
new id = get_pdata_cbase(iEnt, m_pPlayer, XO_WEAPONS)
if(g_bIsGhost[id])
{
set_pdata_float(iEnt, m_flNextPrimaryAttack, 20.0, XO_WEAPONS)
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public fw_KnifeSecondaryAttack(iEnt)
{
new id = get_pdata_cbase(iEnt, m_pPlayer, XO_WEAPONS)
if(g_bIsGhost[id])
{
set_pdata_float(iEnt, m_flNextSecondaryAttack, 20.0, XO_WEAPONS)
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public evCurWeapon( id )
{
if(g_bIsGhost[id])
{
engclient_cmd( id , "weapon_knife" );
}
}
public fw_PreThink_Post(id)
{
if(g_bIsGhost[id])
{
set_pev(id, pev_takedamage, DAMAGE_NO)
}
if(g_bStartSemiclip)
{
if(!(GetBits(g_bIsAlive, id)))
return
static i
for(i = 1; i <= g_iMaxPlayers; i++)
{
if(g_bIsGhost[id] != g_bIsGhost[i] || g_bIsGhost[id] && !g_bIsGhost[i])
{
if(GetBits(g_bIsAlive, i))
set_pev(i, pev_solid, SOLID_NOT)
}
}
}
}
public client_PostThink(id)
{
if(g_bStartSemiclip)
{
if(!(GetBits(g_bIsAlive, id)))
return
static i
for(i = 1; i <= g_iMaxPlayers; i++)
{
if(id != i)
{
if(GetBits(g_bIsAlive, i)) //&& !g_bIsGhost[i])
set_pev(i, pev_solid, SOLID_SLIDEBOX)
}
}
}
}
public fw_AddToFullPack_Post(es, e, ent, host, hostflags, player, pSet)
{
if(!player || !get_orig_retval() || !(GetBits(g_bIsAlive, host)) && !(GetBits(g_bIsSpectator, host)) || !g_bStartSemiclip)
{
return FMRES_IGNORED
}
if(host != ent)
{
set_es(es, ES_Solid, SOLID_NOT)
if(g_bIsGhost[ent])
{
set_es(es, ES_RenderFx, kRenderFxHologram) //kRenderFxDistort) //:
set_es(es, ES_RenderMode, kRenderTransAdd)
set_es(es, ES_RenderAmt, 175)
if(!g_bIsGhost[host])
{
set_es(es, ES_Effects, get_es(es, ES_Effects) | EF_NODRAW)
set_es(es, ES_Origin, Float:{99999.9,99999.9,99999.9})
}
}
}
return FMRES_IGNORED
}
public CmdStart(id, Handle)
{
if(is_user_alive(id))
{
if(g_bIsGhost[id])
{
static button
button = get_uc(Handle, UC_Buttons)
if (button & IN_USE)
{
button &= ~IN_USE // This blocks Use. I'd rather prefer blocking use while pressing both. So i comment button &= ~IN_ATTACK
}
set_uc(Handle, UC_Buttons, button)
}
}
}
public Ham_WeaponTouch_Pre( iEntity, id )
{
if( !is_user_alive( id ) )
{
return HAM_IGNORED;
}
if(g_bIsGhost[id])
{
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
public BlockCmd(id)
{
return g_bIsGhost[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}
public Message_StatusIcon(iMsgId, iMsgDest, id)
{
if(!g_bIsGhost[id])
{
return PLUGIN_CONTINUE;
}
static szIcon[8];
get_msg_arg_string(2, szIcon, charsmax(szIcon));
if( equal(szIcon, "buyzone") )
{
if( get_msg_arg_int(1) )
{
set_pdata_int(id, 235, get_pdata_int(id, 235) & ~(1<<0));
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
}
IsAlive(CsTeams:iTeam)
{
new iAliveNum
for(new i = 1; i <= g_iMaxPlayers; i++)
{
if(GetBits(g_bIsAlive, i) && cs_get_user_team(i) == iTeam && !g_bIsGhost[i])
{
iAliveNum++
}
}
return iAliveNum
}
ForceRoundEnd()
{
g_bRoundEnd = true
for(new i = 1; i <= g_iMaxPlayers; i++)
{
if(GetBits(g_bIsAlive, i) && g_bIsGhost[i])
{
set_pev(i, pev_takedamage, DAMAGE_AIM)
set_pev(i, pev_movetype, MOVETYPE_WALK)
user_silentkill(i)
}
}
}
SetUserGhost(id)
{
set_user_footsteps(id, 1)
set_pev(id, pev_takedamage, DAMAGE_NO)
}