Код:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <cstrike>
#include <engine>
#include <xs>
#define LASERMINE_TEAM pev_iuser1
#define LASERMINE_OWNER pev_iuser2
#define LASERMINE_STEP pev_iuser3
#define LASERMINE_POWERUP pev_fuser1
#define LASERMINE_BEAMTHINK pev_fuser2
#define LASERMINE_BEAMENDPOINT pev_vuser1
#define LASERMINE_CLASSNAME "LaserMine"
new g_iDeployed[33];
new g_msgSayText;
new g_msgDeathMsg;
public plugin_init()
{
register_plugin("LaserMine", "Best", "SandStriker / fl0wer")
register_clcmd("+setlaser", "ClCmdSetLM")
register_think(LASERMINE_CLASSNAME, "FwdThink")
RegisterHam(Ham_Spawn, "player", "FwdSpawnPost", 1)
RegisterHam(Ham_Killed, "info_target", "FwdKilled")
RegisterHam(Ham_TakeDamage, "info_target", "FwdTakeDamage")
g_msgSayText = get_user_msgid("SayText");
g_msgDeathMsg = get_user_msgid("DeathMsg");
}
public plugin_precache()
{
precache_sound("weapons/mine_deploy.wav")
precache_sound("weapons/mine_charge.wav")
precache_sound("weapons/mine_activate.wav")
precache_sound("debris/beamstart9.wav")
precache_model("models/v_tripmine.mdl")
}
public client_disconnect(pPlayer) RemoveAllTripmines(pPlayer)
public ClCmdSetLM(pPlayer)
{
if(!is_user_alive(pPlayer))
return PLUGIN_HANDLED;
if(get_pdata_float(pPlayer, 83) > 0.0)
return PLUGIN_HANDLED;
if(g_iDeployed[pPlayer] >= 1)
{
MessageSayText(pPlayer, "^x04[LaserMine] ^x01Maximum mines have been deployed.")
return PLUGIN_HANDLED;
}
if(cs_get_user_money(pPlayer) < 500)
{
MessageSayText(pPlayer, "^x04[LaserMine] ^x01You don't have enough money to buy a lasermine! ($500 needed)")
return PLUGIN_HANDLED;
}
new Float:vecDirection[3], Float:vecTraceEnd[3], Float:vecOrigin[3];
pev(pPlayer, pev_origin, vecOrigin)
velocity_by_aim(pPlayer, 128, vecDirection)
xs_vec_add(vecDirection, vecOrigin, vecTraceEnd)
engfunc(EngFunc_TraceLine, vecOrigin, vecTraceEnd, DONT_IGNORE_MONSTERS, pPlayer, 0)
new Float:flFraction, Float:vecTraceNormal[3];
get_tr2(0, TR_flFraction, flFraction)
if(flFraction < 1.0)
{
get_tr2(0, TR_vecEndPos, vecTraceEnd)
get_tr2(0, TR_vecPlaneNormal, vecTraceNormal)
cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) - 500, 1)
TaskSpawn(pPlayer)
return PLUGIN_HANDLED;
}
MessageSayText(pPlayer, "^x04[LaserMine] ^x01You must plant the lasermine on a wall!")
return PLUGIN_HANDLED;
}
public TaskSpawn(pPlayer)
{
new pEntity;
static iszAllocStringCached;
if(iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "info_target")))
pEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
if(!pev_valid(pEntity))
return;
set_pev(pEntity, pev_classname, LASERMINE_CLASSNAME)
set_pev(pEntity, pev_solid, SOLID_NOT)
set_pev(pEntity, pev_movetype, MOVETYPE_FLY)
set_pev(pEntity, pev_frame, 0)
set_pev(pEntity, pev_body, 3)
set_pev(pEntity, pev_sequence, 7)
set_pev(pEntity, pev_framerate, 0)
set_pev(pEntity, pev_takedamage, DAMAGE_YES)
set_pev(pEntity, pev_dmg, 100.0)
set_pev(pEntity, pev_health, 500.0)
set_pev(pEntity, LASERMINE_OWNER, pPlayer)
engfunc(EngFunc_SetModel, pEntity, "models/v_tripmine.mdl")
new Float:vecOrigin[3], Float:vecNewOrigin[3], Float:vecNormal[3], Float:vecDirection[3], Float:vecTraceEnd[3], Float:vecEntAngles[3];
pev(pPlayer, pev_origin, vecOrigin)
velocity_by_aim(pPlayer, 128, vecDirection)
xs_vec_add(vecDirection, vecOrigin, vecTraceEnd)
engfunc(EngFunc_TraceLine, vecOrigin, vecTraceEnd, DONT_IGNORE_MONSTERS, pPlayer, 0)
new Float:flFraction;
get_tr2(0, TR_flFraction, flFraction)
if(flFraction < 1.0)
{
get_tr2(0, TR_vecEndPos, vecTraceEnd)
get_tr2(0, TR_vecPlaneNormal, vecNormal)
}
xs_vec_mul_scalar(vecNormal, 8.0, vecNormal)
xs_vec_add(vecTraceEnd, vecNormal, vecNewOrigin)
engfunc(EngFunc_SetSize, pEntity, Float:{ -8.0, -8.0, -8.0 }, Float:{ 8.0, 8.0, 8.0 })
engfunc(EngFunc_SetOrigin, pEntity, vecNewOrigin)
vector_to_angle(vecNormal, vecEntAngles)
set_pev(pEntity, pev_angles, vecEntAngles)
new Float:vecBeamEnd[3], Float:vecTracedBeamEnd[3];
xs_vec_mul_scalar(vecNormal, 8192.0, vecNormal)
xs_vec_add(vecNewOrigin, vecNormal, vecBeamEnd)
engfunc(EngFunc_TraceLine, vecNewOrigin, vecBeamEnd, IGNORE_MONSTERS, -1, 0)
get_tr2(0, TR_vecPlaneNormal, vecNormal)
get_tr2(0, TR_vecEndPos, vecTracedBeamEnd)
set_pev(pEntity, LASERMINE_BEAMENDPOINT, vecTracedBeamEnd)
set_pev(pEntity, LASERMINE_TEAM, get_pdata_int(pPlayer, 114))
new Float:flGameTime = get_gametime();
set_pev(pEntity, LASERMINE_POWERUP, flGameTime + 2.5)
set_pev(pEntity, LASERMINE_STEP, 0)
set_pev(pEntity, pev_nextthink, flGameTime + 0.2)
g_iDeployed[pPlayer]++;
emit_sound(pEntity, CHAN_VOICE, "weapons/mine_deploy.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
emit_sound(pEntity, CHAN_BODY, "weapons/mine_charge.wav", 0.2, ATTN_NORM, 0, PITCH_NORM)
}
public FwdThink(pEntity)
{
if(!pev_valid(pEntity))
return;
static Float:flGameTime;
flGameTime = get_gametime();
switch(pev(pEntity, LASERMINE_STEP))
{
case 0:
{
new Float:flPowerUpTime;
pev(pEntity, LASERMINE_POWERUP, flPowerUpTime)
if(flGameTime > flPowerUpTime)
{
set_pev(pEntity, LASERMINE_STEP, 1)
set_pev(pEntity, pev_solid, SOLID_BBOX)
emit_sound(pEntity, CHAN_VOICE, "weapons/mine_activate.wav", 0.5, ATTN_NORM, 1, 75)
}
set_pev(pEntity, pev_nextthink, flGameTime + 0.1)
}
case 1:
{
static Float:vecEnd[3],Float:vecOrigin[3];
pev(pEntity, pev_origin, vecOrigin)
pev(pEntity, LASERMINE_BEAMENDPOINT, vecEnd)
static iHit, Float:flFraction;
engfunc(EngFunc_TraceLine, vecOrigin, vecEnd, DONT_IGNORE_MONSTERS, pEntity, 0)
get_tr2(0, TR_flFraction, flFraction)
iHit = get_tr2(0, TR_pHit);
if(flFraction < 1.0)
{
if(pev_valid(iHit))
{
static szClassName[32];
pev(iHit, pev_classname, szClassName, charsmax(szClassName))
if(equal(szClassName, "player"))
{
get_tr2(0, TR_vecEndPos, vecEnd)
if(is_user_alive(iHit) && pev(iHit, pev_takedamage))
{
if(pev(pEntity, LASERMINE_TEAM) != get_pdata_int(iHit, 114))
{
emit_sound(iHit, CHAN_WEAPON, "debris/beamstart9.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
new pOwner = pev(pEntity, LASERMINE_OWNER);
message_begin(MSG_ALL, g_msgDeathMsg, _, 0)
write_byte(pOwner)
write_byte(iHit)
write_byte(0)
write_string("lasermine")
message_end()
set_msg_block(g_msgDeathMsg, BLOCK_SET)
ExecuteHamB(Ham_Killed, iHit, pOwner, 0)
set_msg_block(g_msgDeathMsg, BLOCK_NOT)
set_pev(pEntity, pev_nextthink, flGameTime + 0.2)
}
}
}
}
}
static Float:flBeamThink;
pev(pEntity, LASERMINE_BEAMTHINK, flBeamThink)
if(flBeamThink < flGameTime)
{
static iSpriteLaserBeam;
if(iSpriteLaserBeam || (iSpriteLaserBeam = engfunc(EngFunc_ModelIndex, "sprites/laserbeam.spr")))
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, vecOrigin[0])
engfunc(EngFunc_WriteCoord, vecOrigin[1])
engfunc(EngFunc_WriteCoord, vecOrigin[2])
engfunc(EngFunc_WriteCoord, vecEnd[0])
engfunc(EngFunc_WriteCoord, vecEnd[1])
engfunc(EngFunc_WriteCoord, vecEnd[2])
write_short(iSpriteLaserBeam)
write_byte(0)
write_byte(0)
write_byte(1)
write_byte(5)
write_byte(0)
switch(pev(pEntity, LASERMINE_TEAM))
{
case 1:
{
write_byte(255)
write_byte(0)
write_byte(0)
}
case 2:
{
write_byte(0)
write_byte(0)
write_byte(255)
}
}
write_byte(100)
write_byte(255)
message_end()
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_SPARKS)
engfunc(EngFunc_WriteCoord, vecEnd[0])
engfunc(EngFunc_WriteCoord, vecEnd[1])
engfunc(EngFunc_WriteCoord, vecEnd[2])
message_end()
set_pev(pEntity, LASERMINE_BEAMTHINK, flGameTime + 0.1)
}
}
set_pev(pEntity, pev_nextthink, flGameTime + 0.01)
}
}
}
public FwdSpawnPost(pPlayer)
{
if(!is_user_alive(pPlayer))
return;
RemoveAllTripmines(pPlayer)
}
public FwdKilled(pEntity)
{
if(!pev_valid(pEntity))
return;
new szClassName[32];
pev(pEntity, pev_classname, szClassName, charsmax(szClassName))
if(!equal(szClassName, LASERMINE_CLASSNAME))
return;
emit_sound(pEntity, CHAN_BODY, "weapons/mine_charge.wav", 0.2, ATTN_NORM, SND_STOP, PITCH_NORM)
emit_sound(pEntity, CHAN_VOICE, "weapons/mine_activate.wav", 0.5, ATTN_NORM, SND_STOP, 75)
new pOwner = pev(pEntity, LASERMINE_OWNER);
g_iDeployed[pOwner]--;
new Float:vecOrigin[3];
pev(pEntity, pev_origin, vecOrigin)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_KILLBEAM)
write_short(pEntity)
message_end()
new iExplosionEntity;
static iszAllocStringCached;
if(iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "env_explosion")))
{
if(pev_valid((iExplosionEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached))))
{
set_pev(iExplosionEntity, pev_origin, vecOrigin)
set_pev(iExplosionEntity, pev_spawnflags, SF_ENVEXPLOSION_NODAMAGE)
DispatchKeyValue(iExplosionEntity, "iMagnitude", "050")
DispatchSpawn(iExplosionEntity)
force_use(iExplosionEntity, iExplosionEntity)
}
}
}
public FwdTakeDamage(pVictim, pInflictor, pAttacker)
{
new szClassName[32];
pev(pVictim, pev_classname, szClassName, charsmax(szClassName))
if(!equal(szClassName, LASERMINE_CLASSNAME))
return HAM_IGNORED;
if(pev(pVictim, LASERMINE_TEAM) != get_pdata_int(pAttacker, 114))
return HAM_IGNORED;
if(pev(pVictim, LASERMINE_OWNER) != pAttacker)
return HAM_SUPERCEDE;
return HAM_IGNORED;
}
RemoveAllTripmines(pPlayer)
{
new szClassName[32];
static pEntity;
pEntity = -1;
while((pEntity = engfunc(EngFunc_FindEntityByString, pEntity, "classname", LASERMINE_CLASSNAME)))
{
if(pPlayer)
{
if(pev(pEntity, LASERMINE_OWNER) != pPlayer)
continue;
pev(pEntity, pev_classname, szClassName, charsmax(szClassName))
if(equal(szClassName, LASERMINE_CLASSNAME))
{
emit_sound(pEntity, CHAN_BODY, "weapons/mine_charge.wav", 0.2, ATTN_NORM, SND_STOP, PITCH_NORM)
emit_sound(pEntity, CHAN_VOICE, "weapons/mine_activate.wav", 0.5, ATTN_NORM, SND_STOP, 75)
engfunc(EngFunc_RemoveEntity, pEntity)
}
}
else
set_pev(pEntity, pev_flags, FL_KILLME)
}
g_iDeployed[pPlayer] = 0;
}
MessageSayText(pPlayer, szMessage[])
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, pPlayer)
write_byte(pPlayer)
write_string(szMessage)
message_end()
}