Post by ShaunCraft15 on Nov 24, 2021 14:23:12 GMT
i have guys problem with this grenade it's not supported with any mod of nademodes only homing
/*
Plugin generated by AMXX-Studio
Plugin: Pumpkin Grenade
Creator: Chrescoe1 //Cluster code used from http://forum.zombielite.ru/index.php?/topic/81-clustergrenade/ by Alexander.3
Version: 3.0
Changelog:
v1.0 - First released
v2.0 - Little Fixed - Optimization
v3.0 - Too many fixed from ZP - Little Optimization
Visit to ZombieLite.ru
*/
#include <amxmodx>
#include <fun>
#include <hamsandwich>
#include <fakemeta_util>
#define PLUGIN "Pumpkin Grenade"
#define VERSION "3.0"
#define AUTHOR "Chrescoe1"
#define USE_ZP50
#if defined USE_ZP50
#include <zp50_items>
#include <zp50_ammopacks>
#include <zp50_class_survivor>
#include <zp50_core>
#else
#include <zombieplague>
#endif
//Resource
new const v_model_pumpkin[] = "models/v_pumpkin.mdl"
new const p_model_pumpkin[] = "models/p_pumpkin.mdl"
new const w_model_pumpkin[] = "models/w_pumpkin.mdl"
new const cluster_models[] = "models/w_pumpkinSmall3.mdl"
new const g_soundexpl[] = "weapons/pump_exp.wav"
new const blast_sprite[] = "sprites/shockwave.spr"
new const cluster_trail[] = "sprites/laserbeam.spr"
new const exp_sprite[] = "sprites/pumpkin_exp.spr"
//Settings
const Float:expl_damage = 500.0 // Óðîí íàíîñèìûé ãðàíàòîé
const Float:expl_damage_ent = 60.0 // Óðîí íàíîñèìûé åíòèòè \ íïö
const Float:expl_radius = 400.0 // Ðàäèóñ óðîíà ãðàíàòû
const Float:cluster_damage = 100.0 // Óðîí íàíîñèìûé îñêîëêàìè
const Float:cluster_damage_ent = 20.0 // Óðîí íàíîñèìûé åíòèòè \ íïö
const Float:cluster_radius = 200.0 // Ðàäèóñ óðîíà îñêîëîê
const cluster_num_min = 15 // Ìèí êîë-âî îñêîëêîâ
const cluster_num_max = 30 // Ìàêñ êîë-âî îñêîëêîâ
const Float:cluster_rad_min = 250.0 // Ìèí ðàäèóñ ðàçëåòà îñêîëîê
const Float:cluster_rad_max = 350.0 // Ìàêñ ðàäèóñ ðàçëåòà îñêîëîê
const Float:cluster_up_min = 350.0 // Ìèí âçë¸ò îñêîëêîâ ââåðõ
const Float:cluster_up_max = 450.0 // Ìàêñ âçë¸ò îñêîëêîâ ââåðõ
#define weapon_name "weapon_hegrenade"
#define Bomb_Classname "Pumpkin_Grenade"
#define Cluster_Classname "Pumpkin_ClusterBomb"
#define weaponlist_name "weapon_pumpkin"
#define weaponlist_original "weapon_hegrenade"
#define NAME "Pumpkin Grenade"
#define COST 45
new g_itemid_pumpkin
new bool:g_has_pumpkin[32]
new g_sprRing,spriteexpl,g_Trail
new Msg_ScreenShake,Msg_ScreenFade
public plugin_precache()
{
precache_sound( "weapons/pump_deploy.wav" )
precache_sound( "weapons/pump_in.wav" )
precache_sound( "weapons/pump_throw.wav" )
precache_model(w_model_pumpkin)
precache_model(v_model_pumpkin)
precache_model(p_model_pumpkin)
precache_model(cluster_models)
precache_sound(g_soundexpl)
spriteexpl = precache_model(exp_sprite)
g_Trail = precache_model(cluster_trail)
g_sprRing = precache_model(blast_sprite)
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
Msg_ScreenShake = get_user_msgid("ScreenShake")
Msg_ScreenFade = get_user_msgid("ScreenFade")
//Ham
RegisterHam(Ham_Item_Deploy, weapon_name, "Ham_Item_Deploy_Post", 1)
//Fakemeta
register_forward(FM_SetModel, "Fakemeta_SetModel")
register_forward(FM_Touch, "Fakemeta_Touch")
//Hook Weapon
register_clcmd(weaponlist_name, "hook_weapon")
#if defined USE_ZP50
g_itemid_pumpkin = zp_items_register(NAME, COST)
#else
g_itemid_pumpkin = zp_register_extra_item(NAME, COST, ZP_TEAM_HUMAN)
#endif
}
#if defined USE_ZP50
public zp_fw_core_infect_post(id)
{
g_has_pumpkin[id] = false
}
public zp_fw_items_select_pre(id, itemid, ignorecost)
{
if(itemid != g_itemid_pumpkin) return ZP_ITEM_AVAILABLE;
if(zp_core_is_zombie(id)) return ZP_ITEM_DONT_SHOW;
if(zp_class_survivor_get(id)) return ZP_ITEM_DONT_SHOW;
if(g_has_pumpkin[id]) return ZP_ITEM_NOT_AVAILABLE;
return ZP_ITEM_AVAILABLE;
}
public zp_fw_items_select_post(id, itemid, ignorecost)
{
if(itemid!=g_itemid_pumpkin)return PLUGIN_HANDLED
g_has_pumpkin[id]=true
give_item(id, weapon_name)
return PLUGIN_HANDLED
}
#else
public zp_user_infected_post(id)
{
g_has_pumpkin[id] = false
}
public zp_extra_item_selected(id, itemid)
{
if(itemid!=g_itemid_pumpkin)return PLUGIN_HANDLED
if(g_has_pumpkin[id])return PLUGIN_HANDLED
g_has_pumpkin[id]=true
give_item(id, weapon_name)
return PLUGIN_HANDLED
}
#endif
public hook_weapon(id){client_cmd(id,weaponlist_original);return PLUGIN_HANDLED;}
public Ham_Item_Deploy_Post(ent)
{
if(!pev_valid(ent))return
new id = get_pdata_cbase(ent, 41, 4)
if (is_user_alive(id))
if(g_has_pumpkin[id])
{
set_pev(id, pev_viewmodel2, v_model_pumpkin)
set_pev(id, pev_weaponmodel2, p_model_pumpkin)
}
}
//Fakemeta
public Fakemeta_SetModel(ent, const Model[])
{
if(!pev_valid(ent))return FMRES_IGNORED
if(equal(Model, "models/w_hegrenade.mdl")) //If model HE Grenade
{
new id = pev(ent, pev_owner)
if(g_has_pumpkin[id]) //if owner has bomb
{
Trail(ent,g_Trail,12,8,255,155,55,255)
set_pev(ent, pev_classname, Bomb_Classname) //Set classname
set_pev(ent, pev_dmgtime, 9999999.0) //Block Explode
engfunc(EngFunc_SetModel, ent, w_model_pumpkin) //Change Model
g_has_pumpkin[id]=false //Remove bomb on player
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public Fakemeta_Touch(ent, touch)
{
if(!pev_valid(ent))return HAM_IGNORED
new EntClassname[32],TouchClassname[32]
pev(ent, pev_classname, EntClassname, sizeof(EntClassname))
if(pev_valid(touch))
pev(touch, pev_classname, TouchClassname, sizeof(TouchClassname))
if(equal(EntClassname, Bomb_Classname))
{
if(pev_valid(touch))
{
if(equal(TouchClassname, Cluster_Classname))return FMRES_SUPERCEDE
if(equal(TouchClassname, Bomb_Classname))return FMRES_SUPERCEDE
}
Pumpkin_Explode(ent)
return FMRES_SUPERCEDE
}
if(equal(EntClassname, Cluster_Classname))
{
if(pev_valid(touch))
{
if(equal(TouchClassname, Cluster_Classname))return FMRES_SUPERCEDE
if(equal(TouchClassname, Bomb_Classname))return FMRES_SUPERCEDE
}
Cluster_Explode(ent)
return FMRES_SUPERCEDE
}
return HAM_IGNORED
}
//Public Func
public Pumpkin_Explode(ent)
{
new Float:ExpOrigin[3],owner= pev(ent, pev_owner)
pev(ent,pev_origin,ExpOrigin)
engfunc(EngFunc_EmitSound, ent, CHAN_WEAPON,g_soundexpl, 1.0, ATTN_NORM, 0, PITCH_NORM)
//Explode
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ExpOrigin, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, ExpOrigin[0])
engfunc(EngFunc_WriteCoord, ExpOrigin[1])
engfunc(EngFunc_WriteCoord, ExpOrigin[2]+50.0)
write_short(spriteexpl)
write_byte(30)
write_byte(10)
write_byte(0)
message_end()
ExplodeDecals(ExpOrigin)
Light(ExpOrigin,45,250,150,50,15)
Ring(ExpOrigin,20,80)
Ring(ExpOrigin,40,60)
Ring(ExpOrigin,60,40)
Ring(ExpOrigin,80,20)
static victim = -1
while((victim = engfunc(EngFunc_FindEntityInSphere, victim, ExpOrigin, expl_radius)) != 0)
{
if(victim>0&&pev(victim, pev_takedamage)!=DAMAGE_NO&&pev(victim, pev_solid)!=SOLID_NOT)
{
if(is_user_connected(victim))
{
#if defined USE_ZP50
if(!is_user_alive(victim) || !zp_core_is_zombie(victim)) continue;
#else
if(!is_user_alive(victim) || !zp_get_user_zombie(victim)) continue;
#endif
ExecuteHam(Ham_TakeDamage, victim, ent, owner,expl_damage , DMG_BULLET),
ScreenFadeAndShake(victim)
}
else ExecuteHamB(Ham_TakeDamage, victim, ent, owner,expl_damage_ent , DMG_BULLET)
}
}
//Make Cluster Grenade
//Code by Alexander.3 - http://forum.zombielite.ru/index.php?/topic/81-clustergrenade/
for (new i=0;i<random_num(cluster_num_min,cluster_num_max); i++)
{
new bomb
bomb = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")) // Ñîçäàåì ýíòèòè
engfunc(EngFunc_SetOrigin, bomb, ExpOrigin) // Óñòàíàâëèâàåì êîîðäèíàòû äëÿ ñîçäàííîé ýíòèòè
engfunc(EngFunc_SetModel, bomb, cluster_models) // Óñòàíàâëèâàåì ìîäåëüêó
set_pev(bomb, pev_solid, SOLID_TRIGGER) // Ñîëèäíîñòü ñòàâèì íà TRGGGER, ÷òî áû íå âçðûâàëèñü ðàíüøå íóæíîãî âðåìåíè
set_pev(bomb, pev_classname, Cluster_Classname) // Óñòàíàâëèâàåì ClassName äëÿ ïðîâåðêè â Touch ýâåíòå
set_pev(bomb, pev_movetype, MOVETYPE_TOSS) // Óñòàíàâëèâàåì MOVETYPE_TOSS
set_pev(bomb, pev_owner, pev(ent, pev_owner)) // Óñòàíàâëèâàåì èíäåêñ èãðîêà äëÿ ýíòèòè
Util_PlayAnimation(bomb,1,0.6) //Play Anim
// Ðàáîòà ñ ðàçáðîñîì, áóäåò ðàíäîìíàÿ â ïðåäåëå ëèìèòà.
new Float:velocity[3]
velocity[0] = random_float(-random_float(cluster_rad_min,cluster_rad_max), random_float(cluster_rad_min,cluster_rad_max))
velocity[1] = random_float(-random_float(cluster_rad_min,cluster_rad_max), random_float(cluster_rad_min,cluster_rad_max))
velocity[2] = random_float(-random_float(cluster_rad_min,cluster_rad_max), random_float(cluster_rad_min,cluster_rad_max))+ random_float(cluster_up_min,cluster_up_max)
// Óñòàíàâëèâàåì ñèëó ðàçëåòà îñêîëîê
set_pev(bomb, pev_velocity, velocity)
new Float: Angles[3]
Angles[1]=random_float(0.0,360.0)
set_pev(bomb,pev_angles,Angles)
Trail(bomb,g_Trail,4,4,255,155,55,255)
}
//And remove pumkin...
if(pev_valid(ent))engfunc(EngFunc_RemoveEntity, ent)
}
public Cluster_Explode(ent)
{
if (!pev_valid( ent ))return
new Float:ExpOrigin[3],victim = -1
pev(ent, pev_origin, ExpOrigin)
Ring(ExpOrigin,20,40)
Ring(ExpOrigin,40,20)
Light(ExpOrigin,15,250,150,50,15)
//Explode
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ExpOrigin, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, ExpOrigin[0])
engfunc(EngFunc_WriteCoord, ExpOrigin[1])
engfunc(EngFunc_WriteCoord, ExpOrigin[2] + 15.0)
write_short(spriteexpl)
write_byte(5)
write_byte(10)
write_byte(0)
message_end()
while((victim = engfunc(EngFunc_FindEntityInSphere, victim, ExpOrigin, cluster_radius)) != 0)
{
if(victim>0&&pev(victim, pev_takedamage)!=DAMAGE_NO&&pev(victim, pev_solid)!=SOLID_NOT)
{
if(is_user_connected(victim))
{
#if defined USE_ZP50
if(!is_user_alive(victim) || !zp_core_is_zombie(victim)) continue;
#else
if(!is_user_alive(victim) || !zp_get_user_zombie(victim)) continue;
#endif
ExecuteHamB(Ham_TakeDamage, victim, ent, pev(ent,pev_owner),cluster_damage , DMG_BULLET),
ScreenFadeAndShake(victim)
}
else ExecuteHamB(Ham_TakeDamage, victim, ent, pev(ent,pev_owner),cluster_damage_ent , DMG_BULLET)
}
}
if(pev_valid(ent))engfunc(EngFunc_RemoveEntity, ent) //and remove entity
}
//Stocks
stock Trail(ent,sprite,life,size,R,G,B,F)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(ent)
write_short(sprite)
write_byte(life)
write_byte(size)
write_byte(R)
write_byte(G)
write_byte(B)
write_byte(F)
message_end()
}
stock ExplodeDecals(Float:Origin[3])
{
engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, Origin, 0)
write_byte(TE_WORLDDECAL)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_byte(engfunc(EngFunc_DecalIndex,"{scorch3"))
message_end()
}
stock Light(Float:Origin[3],RAD,R,G,B,Life)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_DLIGHT)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_byte(RAD) //Radius
write_byte(R) // r
write_byte(G) // g
write_byte(B) // b
write_byte(Life) //Life
write_byte(10)
message_end()
}
stock Ring(Float:flOrigin[3],Size,width)
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, flOrigin[0]) // x
engfunc(EngFunc_WriteCoord, flOrigin[1]) // y
engfunc(EngFunc_WriteCoord, flOrigin[2]-20.0) // z
engfunc(EngFunc_WriteCoord, flOrigin[0]) // x axis
engfunc(EngFunc_WriteCoord, flOrigin[1]) // y axis
engfunc(EngFunc_WriteCoord, flOrigin[2] + Size) // z axis
write_short(g_sprRing) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(10) // life
write_byte(width) // width
write_byte(0) // noise
write_byte(255) // red
write_byte(155) // green
write_byte(55) // blue
write_byte(255) // brightness
write_byte(0) // speed
message_end()
}
stock ScreenFadeAndShake(victim)
{
// ScreenShake
message_begin(MSG_ONE_UNRELIABLE, Msg_ScreenShake, {0,0,0}, victim)
write_short(1<<14)
write_short((1<<12) * 8)
write_short((2<<12) * 7)
message_end()
//ScreenFade
message_begin(MSG_ONE_UNRELIABLE, Msg_ScreenFade, _, victim)
write_short(6<<8)
write_short(6<<10)
write_short(1<<1)
write_byte(255)
write_byte(155)
write_byte(55)
write_byte(255)
message_end()
}
stock Util_PlayAnimation(index, sequence, Float: framerate = 1.0)
{
set_pev(index, pev_animtime, get_gametime())
set_pev(index, pev_framerate, framerate)
set_pev(index, pev_frame, 0.0)
set_pev(index, pev_sequence, sequence)
}