New plugin update, see the spoiler on description for more informations.
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <fun>
#define PLUGIN "Laser"
#define VERSION "1.0"
#define AUTHOR "Alliedmodders/EFFx"
#define cmx(%1) (sizeof(%1) - 1)
#define play_sound(%1,%2,%3) emit_sound(%1,CHAN_ITEM,%2,VOL_NORM,ATTN_NORM,0,%3)
#define take_damage(%1,%2) set_user_health(%1,get_user_health(%1) - %2)
#define INVALID_WEAPONS ((1 << CSW_KNIFE)|(1<<CSW_HEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_C4))
#define szPrefix "!g[Laser]!y:"
#define SPRITE_LASER "sprites/lgtning.spr"
new g_iLaserSprite
new const sounds_lased[][] =
{
"player/pl_pain2.wav",
"player/pl_pain4.wav",
"player/pl_pain5.wav",
"player/pl_pain6.wav",
"player/pl_pain7.wav"
}
new const sound_laseron[] = "items/nvg_on.wav"
new const sound_laseroff[] = "items/nvg_off.wav"
new iMaxPlayers
new bool:InimigoNoLaser[33]
new bool:Laser[33]
new bool:BroughtLaser[33]
new bool:menu_is_open[33]
new iPcvarBonus,iPcvarHealthRemove, iDefaultLaserColor,iPcvarBuyCost, iPcvarFreeLaser
const MAX_MONEY = 16000
new UsandoLaser,LevandoLaser
new iScreenShake, iScreenFade
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
iMaxPlayers = get_maxplayers()
iScreenFade = get_user_msgid("ScreenFade")
iScreenShake = get_user_msgid("ScreenShake")
iPcvarBuyCost = register_cvar("laser_buycost","3000")
iDefaultLaserColor = register_cvar("laser_defaultcolor","white")
iPcvarHealthRemove = register_cvar("laser_healthremove","10")
iPcvarBonus = register_cvar("laser_killbonus","500")
iPcvarFreeLaser = register_cvar("laser_free","0")
register_concmd("amx_laser","Concmd_Laser",ADMIN_CVAR,"<nick|@ALL> <1|0> - give/take target's laser")
register_event("DeathMsg","CmdDeath","a")
register_clcmd("say /buylaser","CmdLaserMenu")
register_clcmd("+laser","CmdLaser")
new iEntity = create_entity("info_target")
entity_set_string(iEntity,EV_SZ_classname,"EntTask_Laser")
entity_set_float(iEntity,EV_FL_nextthink,get_gametime() + 0.1)
register_think("EntTask_Laser","shot_laser")
set_task(1.0,"Check",.flags = "b")
}
public plugin_precache()
{
g_iLaserSprite = precache_model(SPRITE_LASER)
for(new i; i < sizeof sounds_lased;i++)
precache_sound(sounds_lased[i])
precache_sound(sound_laseron)
precache_sound(sound_laseroff)
}
public CmdLaserMenu(id)
{
if(is_user_alive(id))
{
new iMenu = menu_create("\yLaser Menu \w( \r/buylaser \w)","cmd_buy_laserhandler")
if(!get_pcvar_num(iPcvarFreeLaser))
{
if(!BroughtLaser[id])
{
new iFormat[100]
formatex(iFormat,cmx(iFormat),"Buy laser \r%d$^n\d- Buy a laser for take DMG from your enemy!",get_pcvar_num(iPcvarBuyCost))
menu_additem(iMenu,iFormat)
}
else
menu_additem(iMenu,Laser[id] ? "Use laser \y[ON]^n\d- Lets attack they!" : "Use laser \r[OFF]^n\d- We aren't assassin, right?")
}
else
menu_additem(iMenu,Laser[id] ? "Use laser \y[ON]^n\d- Lets attack they!" : "Use laser \r[OFF]^n\d- We aren't assassin, right?")
menu_is_open[id] = true
menu_display(id,iMenu)
}
return PLUGIN_HANDLED
}
public cmd_buy_laserhandler(id,iMenu,iItem)
{
if(!is_user_alive(id) || iItem == MENU_EXIT)
{
menu_is_open[id] = false
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
new Cost = get_pcvar_num(iPcvarBuyCost)
switch(iItem)
{
case 0:
{
if(!BroughtLaser[id])
{
if(cs_get_user_money(id) >= Cost)
{
BroughtLaser[id] = true
laser_messagecolor(id,"%s You've brought the laser!",szPrefix)
client_cmd(id,"spk buttons/bell1")
cs_set_user_money(id,cs_get_user_money(id) - Cost)
CmdLaserMenu(id)
}
else
{
laser_messagecolor(id,"%s You haven't sufficient money for buy the laser!",szPrefix)
client_cmd(id,"spk buttons/button10")
CmdLaserMenu(id)
}
}
else
{
client_cmd(id,"+laser")
CmdLaserMenu(id)
}
}
}
menu_destroy(iMenu)
return PLUGIN_HANDLED
}
public CmdLaser(id)
{
if(is_user_alive(id))
{
if(!get_pcvar_num(iPcvarFreeLaser))
{
if(BroughtLaser[id])
{
LaserOnOff(id)
CmdLaserMenu(id)
}
else
{
console_print(id,"[Laser]: You need to buy laser for use him!")
}
}
else
{
LaserOnOff(id)
}
}
else
{
console_print(id,"[Laser]: You need to be alive for use the laser!")
}
}
public LaserOnOff(id)
{
if(!Laser[id])
{
client_cmd(id,"stopsound")
client_cmd(id,"spk ^"%s^"",sound_laseron)
Laser[id] = true
}
else
{
client_cmd(id,"stopsound")
client_cmd(id,"spk ^"%s^"",sound_laseroff)
Laser[id] = false
}
}
public Concmd_Laser(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new Target[32]
read_argv(1, Target, 31)
new Mode[7]
read_argv(2, Mode, 6)
new AdminName[32], UserName[32]
get_user_name(id, AdminName, cmx(AdminName))
get_user_name(id, UserName, cmx(AdminName))
new players[32],inum,all
if(equal(Target,"@ALL"))
{
if(Mode[0] == '0')
{
get_players(players,inum)
for(new i = 0;i<inum;i++)
{
all = players[i]
BroughtLaser[all] = false
Laser[all] = false
}
laser_messagecolor(0,"%s ADMIN!t %s!y has!g taken!y Laser from!t All players",szPrefix,AdminName)
}
else if(Mode[0] == '1')
{
get_players(players,inum)
for(new i = 0;i<inum;i++)
{
BroughtLaser[all] = true
}
laser_messagecolor(0,"%s ADMIN!t %s!y has!g given!y Laser for!t All players",szPrefix,AdminName)
}
else
console_print(id,"[Laser]: Use 1 or 0 for take/give laser from/for the target.")
}
else
{
new player = cmd_target(id, Target, CMDTARGET_NO_BOTS)
if (!player)
return PLUGIN_HANDLED
if(Mode[0] == '0')
{
if(BroughtLaser[player])
{
BroughtLaser[player] = false
Laser[player] = false
if(menu_is_open[player])
CmdLaserMenu(player)
}
laser_messagecolor(0,"%s ADMIN!t %s!y has!g taken!y Laser from!t %s",szPrefix,AdminName,UserName)
}
else if(Mode[0] == '1')
{
if(!BroughtLaser[player])
{
BroughtLaser[player] = true
}
laser_messagecolor(0,"%s ADMIN!t %s!y has!g given!y Laser for!t %s",szPrefix,AdminName,UserName)
}
else
console_print(id,"[Laser]: Use 1 or 0 for take/give laser from/for the target.")
}
return PLUGIN_HANDLED
}
public Check()
{
for(new id = 1;id <= iMaxPlayers;id++)
{
if(IsUserValid(id))
{
if(InimigoNoLaser[id])
{
if(get_user_health(id) <= 10)
{
cs_set_user_money(UsandoLaser,clamp(cs_get_user_money(UsandoLaser) + get_pcvar_num(iPcvarBonus),0,MAX_MONEY),1)
new PlayerName[32],VictimName[32]
get_user_name(UsandoLaser,PlayerName,charsmax(PlayerName))
get_user_name(LevandoLaser,VictimName,charsmax(VictimName))
laser_messagecolor(0,"%s The player!t %s!y killed !t%s!y with a laser.",szPrefix,PlayerName,VictimName)
}
message_begin(MSG_ONE_UNRELIABLE, iScreenShake,_,id)
write_short(215<< 9)
write_short(10 << 9)
write_short(215<< 9)
message_end()
message_begin(MSG_ONE_UNRELIABLE , iScreenFade,_,id);
write_short(floatround(4096.0 * 0.1, floatround_round));
write_short(floatround(4096.0 * 0.1, floatround_round));
write_short(4096);
write_byte(0);
write_byte(100);
write_byte(200);
write_byte(100);
message_end();
client_print(id,print_center,"WARNING! GET OUT THE LASER!!!")
play_sound(id,sounds_lased[random(sizeof sounds_lased)],PITCH_LOW)
take_damage(id, get_pcvar_num(iPcvarHealthRemove))
InimigoNoLaser[id] = false
}
}
}
}
public CmdDeath()
{
new victim = read_data(2)
Laser[victim] = false
}
public shot_laser(ent)
{
static player, targetid, body, iOrigin[3], RGB[3]
new iBuffer[50]
get_pcvar_string(iDefaultLaserColor,iBuffer,charsmax(iBuffer))
if(equal(iBuffer,"white"))
RGB = {255,255,255}
else if(equal(iBuffer,"blue"))
RGB = {0,0,255}
else if(equal(iBuffer,"purple"))
RGB = {255,0,255}
else if(equal(iBuffer,"orange"))
RGB = {220,80,0}
else if(equal(iBuffer,"yellow"))
RGB = {255,255,0}
else if(equal(iBuffer,"green"))
RGB = {0,255,0}
else
RGB = {255,255,255}
for(player = 1;player <= 32;player++)
{
if(!is_user_alive(player))
continue
if((1 << get_user_weapon(player)) & INVALID_WEAPONS)
continue
if(!Laser[player])
continue
get_user_aiming(player,targetid,body)
if(is_user_alive(targetid))
{
if(cs_get_user_team(targetid) != cs_get_user_team(player))
{
RGB = {255,0,0}
InimigoNoLaser[targetid] = true
UsandoLaser = player
LevandoLaser = targetid
}
}
get_user_origin(player,iOrigin,3)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_BEAMENTPOINT)
write_short(player | 0x1000)
write_coord( iOrigin[0] )
write_coord( iOrigin[1] )
write_coord( iOrigin[2] )
write_short( g_iLaserSprite )
write_byte(1)
write_byte(10)
write_byte(1)
write_byte(5)
write_byte(0)
write_byte(RGB[0])
write_byte(RGB[1])
write_byte(RGB[2])
write_byte(150)
write_byte(25)
message_end()
}
entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.1)
return PLUGIN_HANDLED
}
stock laser_messagecolor(const id, const input[], any:...)
{
new count = 1, players[ 32 ]
static msg[ 191 ]
vformat( msg, 190, input, 3 )
replace_all( msg, 190, "!g", "^4" )
replace_all( msg, 190, "!y", "^1" )
replace_all( msg, 190, "!t", "^3" )
if(id) players[ 0 ] = id; else get_players( players, count, "ch" )
{
for(new i = 0; i < count; i++)
{
if( is_user_connected( players[ i ] ) )
{
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[ i ] )
write_byte( players[ i ] )
write_string( msg )
message_end( )
}
}
}
}
stock IsUserValid(const index)
return (is_user_connected(index) && is_user_alive(index) && (1 <= index <= iMaxPlayers) ? true : false)