
Kod: Tümünü seç
#include < amxmodx >
#include < engine >
#include < fakemeta >
#include < hamsandwich >
#define NAME "[ZL] ClusterGrenade"
#define VERSION "Public [1.0]"
#define AUTHOR "Alexander.3"
#define TRAIL // Âêëş÷èòü ïîääåğæêó õâîñòèêà îò îñêîëîê
#define SHOCKWAVE // Âêëş÷èòü ïîääåğæêó îáğó÷à îò îñêîëîê
#define SCREENFADE // Âêëş÷èòü ïîääåğæêó çàòåìíåíèÿ ıêğàíà
#define SCREENSHACKE // Âêëş÷èòü ïîääåğæêó òğÿñêè ıêğàíà
#define RANDOM // Âêëş÷èòü ïîääåğæêó ğàçíûõ öâåòîâ ( öâåòà áóäóò â ğàíäîìíîì ïîğÿäêå )
const cluster_num = 10 // Êîë-âî îñêîëîê
const Float:cluster_radius = 200.0 // Ğàäèóñ ğàçëåòà îñêîëîê
const Float:cluster_dradius = 240.0 // Ğàäèóñ óğîíà îñêîëîê
const Float:cluster_damage = 100.0 // Óğîí íàíîñèìûé îò îñêîëîê
new const cluster_models[] = "models/w_hegrenade.mdl" // Ìîäåëü îñêîëîê
new const cluster_sprite[] = "sprites/dexplo.spr" // Ñïğàéò âçğûâà îñêîëîê
// Íàñòğîéêà ñëåäà îò ãğàíàòû
#if defined TRAIL
new g_Trail
new const cluster_trail[] = "sprites/laserbeam.spr" // Ñïğàéò ïîëîñîêè îò îñêîëîê
new cluster_trail_red = 255 // Êğàñíûé
new cluster_trail_green = 0 // Çåëåíûé
new cluster_trail_blue = 50 // Ñèíèé
#endif
// Íàñòğîéêà îáğó÷à
#if defined SHOCKWAVE
new g_sw
new const cluster_sw[] = "sprites/shockwave.spr" // Ñïğàéò-îáğó÷ îò îñêîëîê
new cluster_sw_red = 255 // Êğàñíûé
new cluster_sw_green = 0 // Çåëåíûé
new cluster_sw_blue = 50 // Ñèíèé
#endif
// ÍÀñòğîéêà çàòåìíåíèÿ ıêğàíà
#if defined SCREENFADE
new cluster_sf_red = 255 // Êğàñíûé
new cluster_sf_green = 0 // Ñèíèé
new cluster_sf_blue = 50 // Çåëåíûé
#endif
new g_Exlplosion
public plugin_init() {
register_plugin(NAME, VERSION, AUTHOR)
RegisterHam(Ham_Think, "grenade", "Hook_Grenade", 1) // Ğåãèñòğèğóåì ñèíê äëÿ ãğàíàò
register_touch("cluster_bomb", "*", "Hook_Touch") // Ëîâèì ïğèêîñíîâåíèå ãğàíàòû
}
public Hook_Grenade( Ent ) {
if (!pev_valid( Ent )) // Ïğîâåğêà íà âàëèäíîñòü
return HAM_IGNORED
static Float:dmgtime
pev(Ent, pev_dmgtime, dmgtime) // Ïîëó÷àåì âğåìÿ âçğûâà ãğàíàòû
if (dmgtime > get_gametime()) // Ëîâèì ìîìåíò âçğûâà ãğàíàòû
return HAM_IGNORED
new szModels[32]
pev(Ent, pev_model, szModels, charsmax(szModels)) // Ïîëó÷àåì ìîäåëü
if (!equal(szModels, "models/w_hegrenade.mdl")) // Ïğîâåğêà íà he_ ãğàíàòó
return HAM_IGNORED
new Float:b_origin[3]
pev(Ent, pev_origin, b_origin) // Ïîëó÷àåì êîîğäèíàòû ãğàíàòû
for (new i; i < cluster_num; i++) {
#if defined RANDOM
cluster_effect()
#endif
new bomb
bomb = create_entity("info_target") // Ñîçäàåì ıíòèòè
engfunc(EngFunc_SetOrigin, bomb, b_origin) // Óñòàíàâëèâàåì êîîğäèíàòû äëÿ ñîçäàííîé ıíòèòè
engfunc(EngFunc_SetModel, bomb, cluster_models) // Óñòàíàâëèâàåì ìîäåëüêó
set_pev(bomb, pev_solid, SOLID_TRIGGER) // Ñîëèäíîñòü ñòàâèì íà TRGGGER, ÷òî áû íå âçğûâàëèñü ğàíüøå íóæíîãî âğåìåíè
set_pev(bomb, pev_classname, "cluster_bomb") // Óñòàíàâëèâàåì ClassName äëÿ ïğîâåğêè â Touch ıâåíòå
set_pev(bomb, pev_movetype, MOVETYPE_TOSS) // Óñòàíàâëèâàåì MOVETYPE_TOSS
set_pev(bomb, pev_owner, pev(Ent, pev_owner)) // Óñòàíàâëèâàåì èíäåêñ èãğîêà äëÿ ıíòèòè
// Ğàáîòà ñ ğàçáğîñîì, áóäåò ğàíäîìíàÿ â ïğåäåëå ëèìèòà.
new Float:velocity[3]
velocity[0] = random_float(-(cluster_radius), cluster_radius)
velocity[1] = random_float(-(cluster_radius), cluster_radius)
velocity[2] = cluster_radius + 185.0 // 185 - ñìåùåíèå
set_pev(bomb, pev_velocity, velocity) // Óñòàíàâëèâàåì ñèëó ğàçëåòà îñêîëîê
#if defined TRAIL
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(bomb)
write_short(g_Trail)
write_byte(13)
write_byte(5)
write_byte(cluster_trail_red)
write_byte(cluster_trail_green)
write_byte(cluster_trail_blue)
write_byte(255)
message_end()
#endif
}
set_pev(Ent, pev_flags, FL_KILLME) // Óäàëÿåì ñòàíäàğòíóş áîìáó
return HAM_HANDLED
}
public Hook_Touch(grenade, went) {
if (!pev_valid( grenade )) // Ïğîâåğêà íà âàëèäíîñòü
return
new szWEnt[32]
pev(went, pev_classname, szWEnt, charsmax(szWEnt)) // Ïîëó÷àåì ClassName íàøåãî îñêîëêà
if (equal(szWEnt, "cluster_bomb")) // Ïğîâåğêà ıíòèòè íà îñêîëêè
return
new Float:origin[3] // Êîîğäèíàòû îñêîëîê
new victim = -1 // Èãğîêè êîòîğûå ïîïàäóò â ğàäèóñ
pev(grenade, pev_origin, origin) // Ïîëó÷àåì êîîğäèíàòû ãğàíàòû
while((victim = engfunc(EngFunc_FindEntityInSphere, victim, origin, cluster_dradius))) {
if (!is_user_alive( victim )) // Ïğîâåğêà íà âàëèäíîñòü
continue
if (get_user_team(victim) == get_user_team(pev(grenade, pev_owner))) // Ïğîâåğêà íà êîìàíäó, ÷òî áû íå íàíîñèëî óğîí ÷ëåíàì ïî êîìàíäå
continue
ExecuteHamB(Ham_TakeDamage, victim, 0, grenade, cluster_damage, (1<<24)) // Íàíîñèì óğîí èãğîêàì êîòîğûå ïîïàëè â ğàäèóñ äåéñòâèÿ âçğûâà
// Áîëåâàÿ èêîíêà
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), {0,0,0}, victim)
write_byte(0)
write_byte(100)
write_long(1<<1)
engfunc(EngFunc_WriteCoord, origin[0])
engfunc(EngFunc_WriteCoord, origin[1])
engfunc(EngFunc_WriteCoord, origin[2])
message_end()
#if defined SCREENFADE
ZL_ScreenFade(victim, 2, 1, cluster_sf_red, cluster_sf_green, cluster_sf_blue, 130, 1) // Îêğàñêà ıêğàíà
#endif
// Òğÿñêà ıêğàíà
#if defined SCREENSHACKE
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenShake"), {0,0,0}, victim)
write_short(1<<14)
write_short((1<<12) * 8)
write_short((2<<12) * 7)
message_end()
#endif
}
// Âîëíà îò îñêîëîê
#if defined SHOCKWAVE
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_BEAMCYLINDER)
engfunc(EngFunc_WriteCoord, origin[0])
engfunc(EngFunc_WriteCoord, origin[1])
engfunc(EngFunc_WriteCoord, origin[2])
engfunc(EngFunc_WriteCoord, origin[0])
engfunc(EngFunc_WriteCoord, origin[1])
engfunc(EngFunc_WriteCoord, origin[2] + cluster_dradius)
write_short(g_sw)
write_byte(0)
write_byte(0)
write_byte(4)
write_byte(20)
write_byte(0)
write_byte(cluster_sw_red)
write_byte(cluster_sw_green)
write_byte(cluster_sw_blue)
write_byte(255)
write_byte(0)
message_end()
#endif
// İìóëèğóåì âçğûâ
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, origin[0])
engfunc(EngFunc_WriteCoord, origin[1])
engfunc(EngFunc_WriteCoord, origin[2] + 25.0)
write_short(g_Exlplosion)
write_byte(20)
write_byte(10)
write_byte(0)
message_end()
// Óäàëÿåì îñêîëîê
engfunc(EngFunc_RemoveEntity, grenade)
}
// Çàãğóæàåì ğåñóğñû
public plugin_precache() {
g_Exlplosion = precache_model(cluster_sprite)
#if defined TRAIL
g_Trail = precache_model(cluster_trail)
#endif
#if defined SHOCKWAVE
g_sw = precache_model(cluster_sw)
#endif
}
#if defined RANDOM
cluster_effect() {
#if defined TRAIL
cluster_trail_red = random(255)
cluster_trail_green = random(255)
cluster_trail_blue = random(255)
#endif
#if defined SHOCKWAVE
cluster_sw_red = random(255)
cluster_sw_green = random(255)
cluster_sw_blue = random(255)
#endif
#if defined SCREENFADE
cluster_sf_red = random(255)
cluster_sf_green = random(255)
cluster_sf_blue = random(255)
#endif
}
#endif
stock ZL_ScreenFade(id, Timer, FadeTime, red, green, blue, Alpha, type) {
if(id) if(!is_user_connected(id)) return
if (Timer > 0xFFFF) Timer = 0xFFFF
if (FadeTime <= 0) FadeTime = 4
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, get_user_msgid("ScreenFade"), _, id);
write_short(Timer * 1 << 12)
write_short(FadeTime * 1 << 12)
switch (type) {
case 1: write_short(0x0000) // IN ( FFADE_IN )
case 2: write_short(0x0001) // OUT ( FFADE_OUT )
case 3: write_short(0x0002) // MODULATE ( FFADE_MODULATE )
case 4: write_short(0x0004) // STAYOUT ( FFADE_STAYOUT )
default: write_short(0x0001)
}
write_byte(red)
write_byte(green)
write_byte(blue)
write_byte(Alpha)
message_end()
}