Raised This Month: $51 Target: $400
 12% 

Bug Report Nademodes Buged


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Toni1
Member
Join Date: Sep 2016
Location: Kosova
Old 09-02-2016 , 04:38   Nademodes Buged
Reply With Quote #1

Hellp I Get Buged from nade modes

Erros

PHP Code:
[AMXXDisplaying debug trace (plugin "zp50_grenade_flare.amxx")
L 08/31/2016 15:10:52: [AMXXRun time error 10native error (native "zp_core_is_zombie")
L 08/31/2016 15:10:52: [AMXX]    [0zp50_grenade_flare.sma::fw_SetModel (line 121)



[
AMXXDisplaying debug trace (plugin "zp50_grenade_frost.amxx")
L 08/31/2016 15:10:52: [AMXXRun time error 10native error (native "zp_core_is_zombie")
L 08/31/2016 15:10:52: [AMXX]    [0zp50_grenade_frost.sma::fw_SetModel (line 365



[AMXXDisplaying debug trace (plugin "zp50_grenade_fire.amxx")
L 08/31/2016 15:10:52: [AMXXRun time error 10native error (native "zp_core_is_zombie")
L 08/31/2016 15:10:52: [AMXX]    [0zp50_grenade_fire.sma::fw_SetModel (line 289


There Is And Code game modes [ .SMA ]

Codes:

PHP Code:
/*================================================================================
    
    --------------------------
    -*- [ZP] Grenade: Fire -*-
    --------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
#include <amx_settings_api>
#include <cs_weap_models_api>
#include <cs_ham_bots_api>
#include <zp50_core>
#define LIBRARY_NEMESIS "zp50_class_nemesis"
#include <zp50_class_nemesis>

// Settings file
new const ZP_SETTINGS_FILE[] = "zombieplague.ini"

// Default sounds
new const sound_grenade_fire_explode[][] = { "zombie_plague/grenade_explode.wav" }
new const 
sound_grenade_fire_player[][] = { "zombie_plague/zombie_burn3.wav" "zombie_plague/zombie_burn4.wav" "zombie_plague/zombie_burn5.wav" "zombie_plague/zombie_burn6.wav" "zombie_plague/zombie_burn7.wav" }

#define MODEL_MAX_LENGTH 64
#define SOUND_MAX_LENGTH 64
#define SPRITE_MAX_LENGTH 64

// Models
new g_model_grenade_fire[MODEL_MAX_LENGTH] = "models/zombie_plague/v_grenade_fire.mdl"

// Sprites
new g_sprite_grenade_trail[SPRITE_MAX_LENGTH] = "sprites/laserbeam.spr"
new g_sprite_grenade_ring[SPRITE_MAX_LENGTH] = "sprites/shockwave.spr"
new g_sprite_grenade_fire[SPRITE_MAX_LENGTH] = "sprites/flame.spr"
new g_sprite_grenade_smoke[SPRITE_MAX_LENGTH] = "sprites/black_smoke3.spr"

new Array:g_sound_grenade_fire_explode
new Array:g_sound_grenade_fire_player

// Explosion radius for custom grenades
const Float:NADE_EXPLOSION_RADIUS 240.0

// HACK: pev_ field used to store custom nade types and their values
const PEV_NADE_TYPE pev_flTimeStepSound
const NADE_TYPE_NAPALM 2222

#define TASK_BURN 100
#define ID_BURN (taskid - TASK_BURN)

#define MAXPLAYERS 32

// Custom Forwards
enum _:TOTAL_FORWARDS
{
    
FW_USER_BURN_PRE 0
}
new 
g_Forwards[TOTAL_FORWARDS]
new 
g_ForwardResult

new g_BurningDuration[MAXPLAYERS+1]

new 
g_MsgDamage
new g_trailSprg_exploSprg_flameSprg_smokeSpr

new cvar_grenade_fire_durationcvar_grenade_fire_damagecvar_grenade_fire_slowdowncvar_grenade_fire_hudiconcvar_grenade_fire_explosion

public plugin_init()
{
    
register_plugin("[ZP] Grenade: Fire"ZP_VERSION_STRING"ZP Dev Team")
    
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHamBots(Ham_Killed"fw_PlayerKilled")
    
register_forward(FM_SetModel"fw_SetModel")
    
RegisterHam(Ham_Think"grenade""fw_ThinkGrenade")
    
    
g_MsgDamage get_user_msgid("Damage")
    
    
cvar_grenade_fire_duration register_cvar("zp_grenade_fire_duration""10")
    
cvar_grenade_fire_damage register_cvar("zp_grenade_fire_damage""5")
    
cvar_grenade_fire_slowdown register_cvar("zp_grenade_fire_slowdown""0.5")
    
cvar_grenade_fire_hudicon register_cvar("zp_grenade_fire_hudicon""1")
    
cvar_grenade_fire_explosion register_cvar("zp_grenade_fire_explosion""0")
    
    
g_Forwards[FW_USER_BURN_PRE] = CreateMultiForward("zp_fw_grenade_fire_pre"ET_CONTINUEFP_CELL)
}

public 
plugin_precache()
{
    
// Initialize arrays
    
g_sound_grenade_fire_explode ArrayCreate(SOUND_MAX_LENGTH1)
    
g_sound_grenade_fire_player ArrayCreate(SOUND_MAX_LENGTH1)
    
    
// Load from external file
    
amx_load_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FIRE EXPLODE"g_sound_grenade_fire_explode)
    
amx_load_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FIRE PLAYER"g_sound_grenade_fire_player)
    
    
// If we couldn't load custom sounds from file, use and save default ones
    
new index
    
if (ArraySize(g_sound_grenade_fire_explode) == 0)
    {
        for (
index 0index sizeof sound_grenade_fire_explodeindex++)
            
ArrayPushString(g_sound_grenade_fire_explodesound_grenade_fire_explode[index])
        
        
// Save to external file
        
amx_save_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FIRE EXPLODE"g_sound_grenade_fire_explode)
    }
    if (
ArraySize(g_sound_grenade_fire_player) == 0)
    {
        for (
index 0index sizeof sound_grenade_fire_playerindex++)
            
ArrayPushString(g_sound_grenade_fire_playersound_grenade_fire_player[index])
        
        
// Save to external file
        
amx_save_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FIRE PLAYER"g_sound_grenade_fire_player)
    }
    
    
// Load from external file, save if not found
    
if (!amx_load_setting_string(ZP_SETTINGS_FILE"Weapon Models""GRENADE FIRE"g_model_grenade_firecharsmax(g_model_grenade_fire)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Weapon Models""GRENADE FIRE"g_model_grenade_fire)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""TRAIL"g_sprite_grenade_trailcharsmax(g_sprite_grenade_trail)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""TRAIL"g_sprite_grenade_trail)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""RING"g_sprite_grenade_ringcharsmax(g_sprite_grenade_ring)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""RING"g_sprite_grenade_ring)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""FIRE"g_sprite_grenade_firecharsmax(g_sprite_grenade_fire)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""FIRE"g_sprite_grenade_fire)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""SMOKE"g_sprite_grenade_smokecharsmax(g_sprite_grenade_smoke)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""SMOKE"g_sprite_grenade_smoke)
    
    
// Precache sounds
    
new sound[SOUND_MAX_LENGTH]
    for (
index 0index ArraySize(g_sound_grenade_fire_explode); index++)
    {
        
ArrayGetString(g_sound_grenade_fire_explodeindexsoundcharsmax(sound))
        
precache_sound(sound)
    }
    for (
index 0index ArraySize(g_sound_grenade_fire_player); index++)
    {
        
ArrayGetString(g_sound_grenade_fire_playerindexsoundcharsmax(sound))
        
precache_sound(sound)
    }
    
    
// Precache models
    
precache_model(g_model_grenade_fire)
    
g_trailSpr precache_model(g_sprite_grenade_trail)
    
g_exploSpr precache_model(g_sprite_grenade_ring)
    
g_flameSpr precache_model(g_sprite_grenade_fire)
    
g_smokeSpr precache_model(g_sprite_grenade_smoke)
}

public 
plugin_natives()
{
    
register_library("zp50_grenade_fire")
    
register_native("zp_grenade_fire_get""native_grenade_fire_get")
    
register_native("zp_grenade_fire_set""native_grenade_fire_set")
    
    
set_module_filter("module_filter")
    
set_native_filter("native_filter")
}
public 
module_filter(const module[])
{
    if (
equal(moduleLIBRARY_NEMESIS))
        return 
PLUGIN_HANDLED;
    
    return 
PLUGIN_CONTINUE;
}
public 
native_filter(const name[], indextrap)
{
    if (!
trap)
        return 
PLUGIN_HANDLED;
        
    return 
PLUGIN_CONTINUE;
}

public 
native_grenade_fire_get(plugin_idnum_params)
{
    new 
id get_param(1)
    
    if (!
is_user_alive(id))
    {
        
log_error(AMX_ERR_NATIVE"[ZP] Invalid Player (%d)"id)
        return 
false;
    }
    
    return 
task_exists(id+TASK_BURN);
}

public 
native_grenade_fire_set(plugin_idnum_params)
{
    new 
id get_param(1)
    
    if (!
is_user_alive(id))
    {
        
log_error(AMX_ERR_NATIVE"[ZP] Invalid Player (%d)"id)
        return 
false;
    }
    
    new 
set get_param(2)
    
    
// End fire
    
if (!set)
    {
        
// Not burning
        
if (!task_exists(id+TASK_BURN))
            return 
true;
        
        
// Get player origin
        
static origin[3]
        
get_user_origin(idorigin)
        
        
// Smoke sprite
        
message_begin(MSG_PVSSVC_TEMPENTITYorigin)
        
write_byte(TE_SMOKE// TE id
        
write_coord(origin[0]) // x
        
write_coord(origin[1]) // y
        
write_coord(origin[2]-50// z
        
write_short(g_smokeSpr// sprite
        
write_byte(random_num(1520)) // scale
        
write_byte(random_num(1020)) // framerate
        
message_end()
        
        
// Task not needed anymore
        
remove_task(id+TASK_BURN)
        return 
true;
    }
    
    
// Set on fire
    
return set_on_fire(id);
}

public 
zp_fw_core_cure_post(idattacker)
{
    
// Stop burning
    
remove_task(id+TASK_BURN)
    
g_BurningDuration[id] = 0
    
    
// Set custom grenade model
    
cs_set_player_view_model(idCSW_HEGRENADEg_model_grenade_fire)
}

public 
zp_fw_core_infect(idattacker)
{
    
// Remove custom grenade model
    
cs_reset_player_view_model(idCSW_HEGRENADE)
}

// Ham Player Killed Forward
public fw_PlayerKilled(victimattackershouldgib)
{
    
// Stop burning
    
remove_task(victim+TASK_BURN)
    
g_BurningDuration[victim] = 0
}

public 
client_disconnect(id)
{
    
// Stop burning
    
remove_task(id+TASK_BURN)
    
g_BurningDuration[id] = 0
}

// Forward Set Model
public fw_SetModel(entity, const model[])
{
    
// We don't care
    
if (strlen(model) < 8)
        return;
    
    
// Narrow down our matches a bit
    
if (model[7] != 'w' || model[8] != '_')
        return;
    
    
// Get damage time of grenade
    
static Float:dmgtime
    pev
(entitypev_dmgtimedmgtime)
    
    
// Grenade not yet thrown
    
if (dmgtime == 0.0)
        return;
    
    
// Grenade's owner is zombie?
    
if (zp_core_is_zombie(pev(entitypev_owner)))
        return;
    
    
// HE Grenade
    
if (model[9] == 'h' && model[10] == 'e')
    {
        
// Give it a glow
        
fm_set_rendering(entitykRenderFxGlowShell20000kRenderNormal16)
        
        
// And a colored trail
        
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
        
write_byte(TE_BEAMFOLLOW// TE id
        
write_short(entity// entity
        
write_short(g_trailSpr// sprite
        
write_byte(10// life
        
write_byte(10// width
        
write_byte(200// r
        
write_byte(0// g
        
write_byte(0// b
        
write_byte(200// brightness
        
message_end()
        
        
// Set grenade type on the thrown grenade entity
        
set_pev(entityPEV_NADE_TYPENADE_TYPE_NAPALM)
    }
}

// Ham Grenade Think Forward
public fw_ThinkGrenade(entity)
{
    
// Invalid entity
    
if (!pev_valid(entity)) return HAM_IGNORED;
    
    
// Get damage time of grenade
    
static Float:dmgtime
    pev
(entitypev_dmgtimedmgtime)
    
    
// Check if it's time to go off
    
if (dmgtime get_gametime())
        return 
HAM_IGNORED;
    
    
// Not a napalm grenade
    
if (pev(entityPEV_NADE_TYPE) != NADE_TYPE_NAPALM)
        return 
HAM_IGNORED;
    
    
fire_explode(entity);
    
    
// Keep the original explosion?
    
if (get_pcvar_num(cvar_grenade_fire_explosion))
    {
        
set_pev(entityPEV_NADE_TYPE0)
        return 
HAM_IGNORED;
    }
    
    
// Get rid of the grenade
    
engfunc(EngFunc_RemoveEntityentity)
    return 
HAM_SUPERCEDE;
}

// Fire Grenade Explosion
fire_explode(ent)
{
    
// Get origin
    
static Float:origin[3]
    
pev(entpev_originorigin)
    
    
// Override original HE grenade explosion?
    
if (!get_pcvar_num(cvar_grenade_fire_explosion))
    {
        
// Make the explosion
        
create_blast2(origin)
        
        
// Fire nade explode sound
        
static sound[SOUND_MAX_LENGTH]
        
ArrayGetString(g_sound_grenade_fire_exploderandom_num(0ArraySize(g_sound_grenade_fire_explode) - 1), soundcharsmax(sound))
        
emit_sound(entCHAN_WEAPONsound1.0ATTN_NORM0PITCH_NORM)
    }
    
    
// Collisions
    
new victim = -1
    
    
while ((victim engfunc(EngFunc_FindEntityInSpherevictimoriginNADE_EXPLOSION_RADIUS)) != 0)
    {
        
// Only effect alive zombies
        
if (!is_user_alive(victim) || !zp_core_is_zombie(victim))
            continue;
        
        
set_on_fire(victim)
    }
}

set_on_fire(victim)
{
    
// Allow other plugins to decide whether player should be burned or not
    
ExecuteForward(g_Forwards[FW_USER_BURN_PRE], g_ForwardResultvictim)
    if (
g_ForwardResult >= PLUGIN_HANDLED)
        return 
false;
    
    
// Heat icon?
    
if (get_pcvar_num(cvar_grenade_fire_hudicon))
    {
        
message_begin(MSG_ONE_UNRELIABLEg_MsgDamage_victim)
        
write_byte(0// damage save
        
write_byte(0// damage take
        
write_long(DMG_BURN// damage type
        
write_coord(0// x
        
write_coord(0// y
        
write_coord(0// z
        
message_end()
    }
    
    
// Reduced duration for Nemesis
    
if (LibraryExists(LIBRARY_NEMESISLibType_Library) && zp_class_nemesis_get(victim))
    {
        
// fire duration (nemesis)
        
g_BurningDuration[victim] += get_pcvar_num(cvar_grenade_fire_duration)
    }
    else
    {
        
// fire duration (zombie)
        
g_BurningDuration[victim] += get_pcvar_num(cvar_grenade_fire_duration) * 5
    
}
    
    
// Set burning task on victim
    
remove_task(victim+TASK_BURN)
    
set_task(0.2"burning_flame"victim+TASK_BURN__"b")
    return 
true;
}

// Burning Flames
public burning_flame(taskid)
{
    
// Get player origin and flags
    
static origin[3]
    
get_user_origin(ID_BURNorigin)
    new 
flags pev(ID_BURNpev_flags)
    
    
// In water or burning stopped
    
if ((flags FL_INWATER) || g_BurningDuration[ID_BURN] < 1)
    {
        
// Smoke sprite
        
message_begin(MSG_PVSSVC_TEMPENTITYorigin)
        
write_byte(TE_SMOKE// TE id
        
write_coord(origin[0]) // x
        
write_coord(origin[1]) // y
        
write_coord(origin[2]-50// z
        
write_short(g_smokeSpr// sprite
        
write_byte(random_num(1520)) // scale
        
write_byte(random_num(1020)) // framerate
        
message_end()
        
        
// Task not needed anymore
        
remove_task(taskid)
        return;
    }
    
    
// Nemesis Class loaded?
    
if (!LibraryExists(LIBRARY_NEMESISLibType_Library) || !zp_class_nemesis_get(ID_BURN))
    {
        
// Randomly play burning zombie scream sounds
        
if (random_num(120) == 1)
        {
            static 
sound[SOUND_MAX_LENGTH]
            
ArrayGetString(g_sound_grenade_fire_playerrandom_num(0ArraySize(g_sound_grenade_fire_player) - 1), soundcharsmax(sound))
            
emit_sound(ID_BURNCHAN_VOICEsound1.0ATTN_NORM0PITCH_NORM)
        }
        
        
// Fire slow down
        
if ((flags FL_ONGROUND) && get_pcvar_float(cvar_grenade_fire_slowdown) > 0.0)
        {
            static 
Float:velocity[3]
            
pev(ID_BURNpev_velocityvelocity)
            
xs_vec_mul_scalar(velocityget_pcvar_float(cvar_grenade_fire_slowdown), velocity)
            
set_pev(ID_BURNpev_velocityvelocity)
        }
    }
    
    
// Get player's health
    
new health get_user_health(ID_BURN)
    
    
// Take damage from the fire
    
if (health floatround(get_pcvar_float(cvar_grenade_fire_damage), floatround_ceil) > 0)
        
set_user_health(ID_BURNhealth floatround(get_pcvar_float(cvar_grenade_fire_damage), floatround_ceil))
    
    
// Flame sprite
    
message_begin(MSG_PVSSVC_TEMPENTITYorigin)
    
write_byte(TE_SPRITE// TE id
    
write_coord(origin[0]+random_num(-55)) // x
    
write_coord(origin[1]+random_num(-55)) // y
    
write_coord(origin[2]+random_num(-1010)) // z
    
write_short(g_flameSpr// sprite
    
write_byte(random_num(510)) // scale
    
write_byte(200// brightness
    
message_end()
    
    
// Decrease burning duration counter
    
g_BurningDuration[ID_BURN]--
}

// Fire Grenade: Fire Blast
create_blast2(const Float:origin[3])
{
    
// Smallest ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYorigin0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordorigin[0]) // x
    
engfunc(EngFunc_WriteCoordorigin[1]) // y
    
engfunc(EngFunc_WriteCoordorigin[2]) // z
    
engfunc(EngFunc_WriteCoordorigin[0]) // x axis
    
engfunc(EngFunc_WriteCoordorigin[1]) // y axis
    
engfunc(EngFunc_WriteCoordorigin[2]+385.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe
    
write_byte(0// framerate
    
write_byte(4// life
    
write_byte(60// width
    
write_byte(0// noise
    
write_byte(200// red
    
write_byte(100// green
    
write_byte(0// blue
    
write_byte(200// brightness
    
write_byte(0// speed
    
message_end()
    
    
// Medium ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYorigin0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordorigin[0]) // x
    
engfunc(EngFunc_WriteCoordorigin[1]) // y
    
engfunc(EngFunc_WriteCoordorigin[2]) // z
    
engfunc(EngFunc_WriteCoordorigin[0]) // x axis
    
engfunc(EngFunc_WriteCoordorigin[1]) // y axis
    
engfunc(EngFunc_WriteCoordorigin[2]+470.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe
    
write_byte(0// framerate
    
write_byte(4// life
    
write_byte(60// width
    
write_byte(0// noise
    
write_byte(200// red
    
write_byte(50// green
    
write_byte(0// blue
    
write_byte(200// brightness
    
write_byte(0// speed
    
message_end()
    
    
// Largest ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYorigin0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordorigin[0]) // x
    
engfunc(EngFunc_WriteCoordorigin[1]) // y
    
engfunc(EngFunc_WriteCoordorigin[2]) // z
    
engfunc(EngFunc_WriteCoordorigin[0]) // x axis
    
engfunc(EngFunc_WriteCoordorigin[1]) // y axis
    
engfunc(EngFunc_WriteCoordorigin[2]+555.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe
    
write_byte(0// framerate
    
write_byte(4// life
    
write_byte(60// width
    
write_byte(0// noise
    
write_byte(200// red
    
write_byte(0// green
    
write_byte(0// blue
    
write_byte(200// brightness
    
write_byte(0// speed
    
message_end()
}

// Set entity's rendering type (from fakemeta_util)
stock fm_set_rendering(entityfx kRenderFxNone255255255render kRenderNormalamount 16)
{
    static 
Float:color[3]
    
color[0] = float(r)
    
color[1] = float(g)
    
color[2] = float(b)
    
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtfloat(amount))


PHP Code:
/*================================================================================
    
    ---------------------------
    -*- [ZP] Grenade: Flare -*-
    ---------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <amx_settings_api>
#include <cs_weap_models_api>
#include <zp50_core>

// Settings file
new const ZP_SETTINGS_FILE[] = "zombieplague.ini"

// Default sounds
new const sound_grenade_flare_explode[][] = { "items/nvg_on.wav" }

#define MODEL_MAX_LENGTH 64
#define SOUND_MAX_LENGTH 64
#define SPRITE_MAX_LENGTH 64

// Models
new g_model_grenade_flare[MODEL_MAX_LENGTH] = "models/zombie_plague/v_grenade_flare.mdl"

// Sprites
new g_sprite_grenade_trail[SPRITE_MAX_LENGTH] = "sprites/laserbeam.spr"

new Array:g_sound_grenade_flare_explode

// HACK: pev_ field used to store custom nade types and their values
const PEV_NADE_TYPE pev_flTimeStepSound
const NADE_TYPE_FLARE 4444
const PEV_FLARE_COLOR pev_punchangle
const PEV_FLARE_DURATION pev_flSwimTime

new g_trailSpr

new cvar_grenade_flare_durationcvar_grenade_flare_radiuscvar_grenade_flare_color

public plugin_init()
{
    
register_plugin("[ZP] Grenade: Flare"ZP_VERSION_STRING"ZP Dev Team")
    
    
register_forward(FM_SetModel"fw_SetModel")
    
RegisterHam(Ham_Think"grenade""fw_ThinkGrenade")
    
    
cvar_grenade_flare_duration register_cvar("zp_grenade_flare_duration""60")
    
cvar_grenade_flare_radius register_cvar("zp_grenade_flare_radius""25")
    
cvar_grenade_flare_color register_cvar("zp_grenade_flare_color""0")
}

public 
plugin_precache()
{
    
// Initialize arrays
    
g_sound_grenade_flare_explode ArrayCreate(SOUND_MAX_LENGTH1)
    
    
// Load from external file
    
amx_load_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FLARE"g_sound_grenade_flare_explode)
    
    
// If we couldn't load custom sounds from file, use and save default ones
    
new index
    
if (ArraySize(g_sound_grenade_flare_explode) == 0)
    {
        for (
index 0index sizeof sound_grenade_flare_explodeindex++)
            
ArrayPushString(g_sound_grenade_flare_explodesound_grenade_flare_explode[index])
        
        
// Save to external file
        
amx_save_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FLARE"g_sound_grenade_flare_explode)
    }
    
    
// Load from external file, save if not found
    
if (!amx_load_setting_string(ZP_SETTINGS_FILE"Weapon Models""GRENADE FLARE"g_model_grenade_flarecharsmax(g_model_grenade_flare)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Weapon Models""GRENADE FLARE"g_model_grenade_flare)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""TRAIL"g_sprite_grenade_trailcharsmax(g_sprite_grenade_trail)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""TRAIL"g_sprite_grenade_trail)
    
    
// Precache models
    
precache_model(g_model_grenade_flare)
    
g_trailSpr precache_model(g_sprite_grenade_trail)
}

public 
zp_fw_core_cure_post(idattacker)
{
    
// Set custom grenade model
    
cs_set_player_view_model(idCSW_SMOKEGRENADEg_model_grenade_flare)
}

public 
zp_fw_core_infect(idattacker)
{
    
// Remove custom grenade model
    
cs_reset_player_view_model(idCSW_SMOKEGRENADE)
}

// Forward Set Model
public fw_SetModel(entity, const model[])
{
    
// We don't care
    
if (strlen(model) < 8)
        return;
    
    
// Narrow down our matches a bit
    
if (model[7] != 'w' || model[8] != '_')
        return;
    
    
// Get damage time of grenade
    
static Float:dmgtime
    pev
(entitypev_dmgtimedmgtime)
    
    
// Grenade not yet thrown
    
if (dmgtime == 0.0)
        return;
    
    
// Grenade's owner is zombie?
    
if (zp_core_is_zombie(pev(entitypev_owner)))
        return;
    
    
// Smoke Grenade
    
if (model[9] == 's' && model[10] == 'm')
    {
        
// Build flare's color
        
static rgb[3]
        switch (
get_pcvar_num(cvar_grenade_flare_color))
        {
            case 
0// white
            
{
                
rgb[0] = 255 // r
                
rgb[1] = 255 // g
                
rgb[2] = 255 // b
            
}
            case 
1// red
            
{
                
rgb[0] = random_num(50,255// r
                
rgb[1] = // g
                
rgb[2] = // b
            
}
            case 
2// green
            
{
                
rgb[0] = // r
                
rgb[1] = random_num(50,255// g
                
rgb[2] = // b
            
}
            case 
3// blue
            
{
                
rgb[0] = // r
                
rgb[1] = // g
                
rgb[2] = random_num(50,255// b
            
}
            case 
4// random (all colors)
            
{
                
rgb[0] = random_num(50,200// r
                
rgb[1] = random_num(50,200// g
                
rgb[2] = random_num(50,200// b
            
}
            case 
5// random (r,g,b)
            
{
                switch (
random_num(13))
                {
                    case 
1// red
                    
{
                        
rgb[0] = random_num(50,255// r
                        
rgb[1] = // g
                        
rgb[2] = // b
                    
}
                    case 
2// green
                    
{
                        
rgb[0] = // r
                        
rgb[1] = random_num(50,255// g
                        
rgb[2] = // b
                    
}
                    case 
3// blue
                    
{
                        
rgb[0] = // r
                        
rgb[1] = // g
                        
rgb[2] = random_num(50,255// b
                    
}
                }
            }
        }
        
        
// Give it a glow
        
fm_set_rendering(entitykRenderFxGlowShellrgb[0], rgb[1], rgb[2], kRenderNormal16);
        
        
// And a colored trail
        
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
        
write_byte(TE_BEAMFOLLOW// TE id
        
write_short(entity// entity
        
write_short(g_trailSpr// sprite
        
write_byte(10// life
        
write_byte(10// width
        
write_byte(rgb[0]) // r
        
write_byte(rgb[1]) // g
        
write_byte(rgb[2]) // b
        
write_byte(200// brightness
        
message_end()
        
        
// Set grenade type on the thrown grenade entity
        
set_pev(entityPEV_NADE_TYPENADE_TYPE_FLARE)
        
        
// Set flare color on the thrown grenade entity
        
set_pev(entityPEV_FLARE_COLORrgb)
    }
}

// Ham Grenade Think Forward
public fw_ThinkGrenade(entity)
{
    
// Invalid entity
    
if (!pev_valid(entity)) return HAM_IGNORED;
    
    
// Get damage time of grenade
    
static Float:dmgtime
    pev
(entitypev_dmgtimedmgtime)
    
    new 
Float:current_time get_gametime()
    
    
// Check if it's time to go off
    
if (dmgtime current_time)
        return 
HAM_IGNORED;
    
    
// Check if it's one of our custom nades
    
switch (pev(entityPEV_NADE_TYPE))
    {
        case 
NADE_TYPE_FLARE// Flare
        
{
            
// Get its duration
            
new duration pev(entityPEV_FLARE_DURATION)
            
            
// Already went off, do lighting loop for the duration of PEV_FLARE_DURATION
            
if (duration 0)
            {
                
// Check whether this is the last loop
                
if (duration == 1)
                {
                    
// Get rid of the flare entity
                    
engfunc(EngFunc_RemoveEntityentity)
                    return 
HAM_SUPERCEDE;
                }
                
                
// Light it up!
                
flare_lighting(entityduration)
                
                
// Set time for next loop
                
set_pev(entityPEV_FLARE_DURATION, --duration)
                
set_pev(entitypev_dmgtimecurrent_time 2.0)
            }
            
// Light up when it's stopped on ground
            
else if ((pev(entitypev_flags) & FL_ONGROUND) && fm_get_speed(entity) < 10)
            {
                
// Flare sound
                
static sound[SOUND_MAX_LENGTH]
                
ArrayGetString(g_sound_grenade_flare_exploderandom_num(0ArraySize(g_sound_grenade_flare_explode) - 1), soundcharsmax(sound))
                
emit_sound(entityCHAN_WEAPONsound1.0ATTN_NORM0PITCH_NORM)
                
                
// Set duration and start lightning loop on next think
                
set_pev(entityPEV_FLARE_DURATIONget_pcvar_num(cvar_grenade_flare_duration)/2)
                
set_pev(entitypev_dmgtimecurrent_time 0.1)
            }
            else
            {
                
// Delay explosion until we hit ground
                
set_pev(entitypev_dmgtimecurrent_time 0.5)
            }
        }
    }
    
    return 
HAM_IGNORED;
}

// Flare Lighting Effects
flare_lighting(entityduration)
{
    
// Get origin and color
    
static Float:origin[3], color[3]
    
pev(entitypev_originorigin)
    
pev(entityPEV_FLARE_COLORcolor)
    
    
// Lighting
    
engfunc(EngFunc_MessageBeginMSG_PASSVC_TEMPENTITYorigin0)
    
write_byte(TE_DLIGHT// TE id
    
engfunc(EngFunc_WriteCoordorigin[0]) // x
    
engfunc(EngFunc_WriteCoordorigin[1]) // y
    
engfunc(EngFunc_WriteCoordorigin[2]) // z
    
write_byte(get_pcvar_num(cvar_grenade_flare_radius)) // radius
    
write_byte(color[0]) // r
    
write_byte(color[1]) // g
    
write_byte(color[2]) // b
    
write_byte(21//life
    
write_byte((duration 2) ? 0//decay rate
    
message_end()
    
    
// Sparks
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYorigin0)
    
write_byte(TE_SPARKS// TE id
    
engfunc(EngFunc_WriteCoordorigin[0]) // x
    
engfunc(EngFunc_WriteCoordorigin[1]) // y
    
engfunc(EngFunc_WriteCoordorigin[2]) // z
    
message_end()
}

// Set entity's rendering type (from fakemeta_util)
stock fm_set_rendering(entityfx kRenderFxNone255255255render kRenderNormalamount 16)
{
    static 
Float:color[3]
    
color[0] = float(r)
    
color[1] = float(g)
    
color[2] = float(b)
    
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtfloat(amount))
}

// Get entity's speed (from fakemeta_util)
stock fm_get_speed(entity)
{
    static 
Float:velocity[3]
    
pev(entitypev_velocityvelocity)
    
    return 
floatround(vector_length(velocity));


PHP Code:
/*================================================================================
    
    ---------------------------
    -*- [ZP] Grenade: Frost -*-
    ---------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <amx_settings_api>
#include <cs_weap_models_api>
#include <cs_ham_bots_api>
#include <zp50_core>

// Settings file
new const ZP_SETTINGS_FILE[] = "zombieplague.ini"

// Default sounds
new const sound_grenade_frost_explode[][] = { "warcraft3/frostnova.wav" }
new const 
sound_grenade_frost_player[][] = { "warcraft3/impalehit.wav" }
new const 
sound_grenade_frost_break[][] = { "warcraft3/impalelaunch1.wav" }

#define MODEL_MAX_LENGTH 64
#define SOUND_MAX_LENGTH 64
#define SPRITE_MAX_LENGTH 64

// Models
new g_model_grenade_frost[MODEL_MAX_LENGTH] = "models/zombie_plague/v_grenade_frost.mdl"

// Sprites
new g_sprite_grenade_trail[SPRITE_MAX_LENGTH] = "sprites/laserbeam.spr"
new g_sprite_grenade_ring[SPRITE_MAX_LENGTH] = "sprites/shockwave.spr"
new g_sprite_grenade_glass[SPRITE_MAX_LENGTH] = "models/glassgibs.mdl"

new Array:g_sound_grenade_frost_explode
new Array:g_sound_grenade_frost_player
new Array:g_sound_grenade_frost_break

#define GRAVITY_HIGH 999999.9
#define GRAVITY_NONE 0.000001

#define TASK_FROST_REMOVE 100
#define ID_FROST_REMOVE (taskid - TASK_FROST_REMOVE)

#define MAXPLAYERS 32

#define flag_get(%1,%2) (%1 & (1 << (%2 & 31)))
#define flag_get_boolean(%1,%2) (flag_get(%1,%2) ? true : false)
#define flag_set(%1,%2) %1 |= (1 << (%2 & 31))
#define flag_unset(%1,%2) %1 &= ~(1 << (%2 & 31))

// Hack to be able to use Ham_Player_ResetMaxSpeed (by joaquimandrade)
new Ham:Ham_Player_ResetMaxSpeed Ham_Item_PreFrame

// Explosion radius for custom grenades
const Float:NADE_EXPLOSION_RADIUS 240.0

// HACK: pev_ field used to store custom nade types and their values
const PEV_NADE_TYPE pev_flTimeStepSound
const NADE_TYPE_FROST 3333

// Some constants
const UNIT_SECOND = (1<<12)
const 
BREAK_GLASS 0x01
const FFADE_IN 0x0000
const FFADE_STAYOUT 0x0004

// Custom Forwards
enum _:TOTAL_FORWARDS
{
    
FW_USER_FREEZE_PRE 0,
    
FW_USER_UNFROZEN
}
new 
g_Forwards[TOTAL_FORWARDS]
new 
g_ForwardResult

new g_IsFrozen
new Float:g_FrozenGravity[MAXPLAYERS+1]
new 
g_FrozenRenderingFx[MAXPLAYERS+1]
new 
Float:g_FrozenRenderingColor[MAXPLAYERS+1][3]
new 
g_FrozenRenderingRender[MAXPLAYERS+1]
new 
Float:g_FrozenRenderingAmount[MAXPLAYERS+1]

new 
g_MsgDamageg_MsgScreenFade
new g_trailSprg_exploSprg_glassSpr

new cvar_grenade_frost_durationcvar_grenade_frost_hudicon

public plugin_init()
{
    
register_plugin("[ZP] Grenade: Frost"ZP_VERSION_STRING"ZP Dev Team")
    
    
RegisterHam(Ham_Player_ResetMaxSpeed"player""fw_ResetMaxSpeed_Post"1)
    
RegisterHamBots(Ham_Player_ResetMaxSpeed"fw_ResetMaxSpeed_Post"1)
    
RegisterHam(Ham_TakeDamage"player""fw_TakeDamage")
    
RegisterHamBots(Ham_TakeDamage"fw_TakeDamage")
    
RegisterHam(Ham_TraceAttack"player""fw_TraceAttack")
    
RegisterHamBots(Ham_TraceAttack"fw_TraceAttack")
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHamBots(Ham_Killed"fw_PlayerKilled")
    
register_forward(FM_PlayerPreThink"fw_PlayerPreThink")
    
register_forward(FM_SetModel"fw_SetModel")
    
RegisterHam(Ham_Think"grenade""fw_ThinkGrenade")
    
    
g_MsgDamage get_user_msgid("Damage")
    
g_MsgScreenFade get_user_msgid("ScreenFade")
    
    
cvar_grenade_frost_duration register_cvar("zp_grenade_frost_duration""3")
    
cvar_grenade_frost_hudicon register_cvar("zp_grenade_frost_hudicon""1")
    
    
g_Forwards[FW_USER_FREEZE_PRE] = CreateMultiForward("zp_fw_grenade_frost_pre"ET_CONTINUEFP_CELL)
    
g_Forwards[FW_USER_UNFROZEN] = CreateMultiForward("zp_fw_grenade_frost_unfreeze"ET_IGNOREFP_CELL)
}

public 
plugin_natives()
{
    
register_library("zp50_grenade_frost")
    
register_native("zp_grenade_frost_get""native_grenade_frost_get")
    
register_native("zp_grenade_frost_set""native_grenade_frost_set")
}

public 
native_grenade_frost_get(plugin_idnum_params)
{
    new 
id get_param(1)
    
    if (!
is_user_alive(id))
    {
        
log_error(AMX_ERR_NATIVE"[ZP] Invalid Player (%d)"id)
        return 
false;
    }
    
    return 
flag_get_boolean(g_IsFrozenid);
}

public 
native_grenade_frost_set(plugin_idnum_params)
{
    new 
id get_param(1)
    
    if (!
is_user_alive(id))
    {
        
log_error(AMX_ERR_NATIVE"[ZP] Invalid Player (%d)"id)
        return 
false;
    }
    
    new 
set get_param(2)
    
    
// Unfreeze
    
if (!set)
    {
        
// Not frozen
        
if (!flag_get(g_IsFrozenid))
            return 
true;
        
        
// Remove freeze right away and stop the task
        
remove_freeze(id+TASK_FROST_REMOVE)
        
remove_task(id+TASK_FROST_REMOVE)
        return 
true;
    }
    
    return 
set_freeze(id);
}

public 
plugin_precache()
{
    
// Initialize arrays
    
g_sound_grenade_frost_explode ArrayCreate(SOUND_MAX_LENGTH1)
    
g_sound_grenade_frost_player ArrayCreate(SOUND_MAX_LENGTH1)
    
g_sound_grenade_frost_break ArrayCreate(SOUND_MAX_LENGTH1)
    
    
// Load from external file
    
amx_load_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FROST EXPLODE"g_sound_grenade_frost_explode)
    
amx_load_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FROST PLAYER"g_sound_grenade_frost_player)
    
amx_load_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FROST BREAK"g_sound_grenade_frost_break)
    
    
// If we couldn't load custom sounds from file, use and save default ones
    
new index
    
if (ArraySize(g_sound_grenade_frost_explode) == 0)
    {
        for (
index 0index sizeof sound_grenade_frost_explodeindex++)
            
ArrayPushString(g_sound_grenade_frost_explodesound_grenade_frost_explode[index])
        
        
// Save to external file
        
amx_save_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FROST EXPLODE"g_sound_grenade_frost_explode)
    }
    if (
ArraySize(g_sound_grenade_frost_player) == 0)
    {
        for (
index 0index sizeof sound_grenade_frost_playerindex++)
            
ArrayPushString(g_sound_grenade_frost_playersound_grenade_frost_player[index])
        
        
// Save to external file
        
amx_save_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FROST PLAYER"g_sound_grenade_frost_player)
    }
    if (
ArraySize(g_sound_grenade_frost_break) == 0)
    {
        for (
index 0index sizeof sound_grenade_frost_breakindex++)
            
ArrayPushString(g_sound_grenade_frost_breaksound_grenade_frost_break[index])
        
        
// Save to external file
        
amx_save_setting_string_arr(ZP_SETTINGS_FILE"Sounds""GRENADE FROST BREAK"g_sound_grenade_frost_break)
    }
    
    
// Load from external file, save if not found
    
if (!amx_load_setting_string(ZP_SETTINGS_FILE"Weapon Models""GRENADE FROST"g_model_grenade_frostcharsmax(g_model_grenade_frost)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Weapon Models""GRENADE FROST"g_model_grenade_frost)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""TRAIL"g_sprite_grenade_trailcharsmax(g_sprite_grenade_trail)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""TRAIL"g_sprite_grenade_trail)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""RING"g_sprite_grenade_ringcharsmax(g_sprite_grenade_ring)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""RING"g_sprite_grenade_ring)
    if (!
amx_load_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""GLASS"g_sprite_grenade_glasscharsmax(g_sprite_grenade_glass)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Grenade Sprites""GLASS"g_sprite_grenade_glass)
    
    
// Precache sounds
    
new sound[SOUND_MAX_LENGTH]
    for (
index 0index ArraySize(g_sound_grenade_frost_explode); index++)
    {
        
ArrayGetString(g_sound_grenade_frost_explodeindexsoundcharsmax(sound))
        
precache_sound(sound)
    }
    for (
index 0index ArraySize(g_sound_grenade_frost_player); index++)
    {
        
ArrayGetString(g_sound_grenade_frost_playerindexsoundcharsmax(sound))
        
precache_sound(sound)
    }
    for (
index 0index ArraySize(g_sound_grenade_frost_break); index++)
    {
        
ArrayGetString(g_sound_grenade_frost_breakindexsoundcharsmax(sound))
        
precache_sound(sound)
    }
    
    
// Precache models
    
precache_model(g_model_grenade_frost)
    
g_trailSpr precache_model(g_sprite_grenade_trail)
    
g_exploSpr precache_model(g_sprite_grenade_ring)
    
g_glassSpr precache_model(g_sprite_grenade_glass)
}

public 
zp_fw_core_cure_post(idattacker)
{
    
// Set custom grenade model
    
cs_set_player_view_model(idCSW_FLASHBANGg_model_grenade_frost)
    
    
// If frozen, remove freeze after player is cured
    
if (flag_get(g_IsFrozenid))
    {
        
// Update gravity and rendering values first
        
ApplyFrozenGravity(id)
        
ApplyFrozenRendering(id)
        
        
// Remove freeze right away and stop the task
        
remove_freeze(id+TASK_FROST_REMOVE)
        
remove_task(id+TASK_FROST_REMOVE)
    }
}

public 
zp_fw_core_infect(idattacker)
{
    
// Remove custom grenade model
    
cs_reset_player_view_model(idCSW_FLASHBANG)
}

public 
zp_fw_core_infect_post(idattacker)
{
    
// If frozen, update gravity and rendering
    
if (flag_get(g_IsFrozenid))
    {
        
ApplyFrozenGravity(id)
        
ApplyFrozenRendering(id)
    }
}

public 
client_disconnect(id)
{
    
flag_unset(g_IsFrozenid)
    
remove_task(id+TASK_FROST_REMOVE)
}

public 
fw_ResetMaxSpeed_Post(id)
{
    
// Dead or not frozen
    
if (!is_user_alive(id) || !flag_get(g_IsFrozenid))
        return;
    
    
// Prevent from moving
    
set_user_maxspeed(id1.0)
}

// Ham Trace Attack Forward
public fw_TraceAttack(victimattacker)
{
    
// Non-player damage or self damage
    
if (victim == attacker || !is_user_alive(attacker))
        return 
HAM_IGNORED;
    
    
// Block damage while frozen, as it makes killing zombies too easy
    
if (flag_get(g_IsFrozenvictim))
        return 
HAM_SUPERCEDE;
    
    return 
HAM_IGNORED;
}

// Ham Take Damage Forward (needed to block explosion damage too)
public fw_TakeDamage(victiminflictorattackerFloat:damagedamage_type)
{
    
// Non-player damage or self damage
    
if (victim == attacker || !is_user_alive(attacker))
        return 
HAM_IGNORED;
    
    
// Block damage while frozen, as it makes killing zombies too easy
    
if (flag_get(g_IsFrozenvictim))
        return 
HAM_SUPERCEDE;
    
    return 
HAM_IGNORED;
}

// Ham Player Killed Forward
public fw_PlayerKilled(victimattackershouldgib)
{
    
// Frozen player being killed (usually caused by a 3rd party plugin, e.g. lasermines)
    
if (flag_get(g_IsFrozenvictim))
    {
        
// Remove freeze right away and stop the task
        
remove_freeze(victim+TASK_FROST_REMOVE)
        
remove_task(victim+TASK_FROST_REMOVE)
    }
}

// Forward Player PreThink
public fw_PlayerPreThink(id)
{
    
// Not alive or not frozen
    
if (!is_user_alive(id) || !flag_get(g_IsFrozenid))
        return;
    
    
// Stop motion
    
set_pev(idpev_velocityFloat:{0.0,0.0,0.0})
}

// Forward Set Model
public fw_SetModel(entity, const model[])
{
    
// We don't care
    
if (strlen(model) < 8)
        return;
    
    
// Narrow down our matches a bit
    
if (model[7] != 'w' || model[8] != '_')
        return;
    
    
// Get damage time of grenade
    
static Float:dmgtime
    pev
(entitypev_dmgtimedmgtime)
    
    
// Grenade not yet thrown
    
if (dmgtime == 0.0)
        return;
    
    
// Grenade's owner is zombie?
    
if (zp_core_is_zombie(pev(entitypev_owner)))
        return;
    
    
// Flashbang
    
if (model[9] == 'f' && model[10] == 'l')
    {
        
// Give it a glow
        
fm_set_rendering(entitykRenderFxGlowShell0100200kRenderNormal16);
        
        
// And a colored trail
        
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
        
write_byte(TE_BEAMFOLLOW// TE id
        
write_short(entity// entity
        
write_short(g_trailSpr// sprite
        
write_byte(10// life
        
write_byte(10// width
        
write_byte(0// r
        
write_byte(100// g
        
write_byte(200// b
        
write_byte(200// brightness
        
message_end()
        
        
// Set grenade type on the thrown grenade entity
        
set_pev(entityPEV_NADE_TYPENADE_TYPE_FROST)
    }
}

// Ham Grenade Think Forward
public fw_ThinkGrenade(entity)
{
    
// Invalid entity
    
if (!pev_valid(entity)) return HAM_IGNORED;
    
    
// Get damage time of grenade
    
static Float:dmgtime
    pev
(entitypev_dmgtimedmgtime)
    
    
// Check if it's time to go off
    
if (dmgtime get_gametime())
        return 
HAM_IGNORED;
    
    
// Check if it's one of our custom nades
    
switch (pev(entityPEV_NADE_TYPE))
    {
        case 
NADE_TYPE_FROST// Frost Grenade
        
{
            
frost_explode(entity)
            return 
HAM_SUPERCEDE;
        }
    }
    
    return 
HAM_IGNORED;
}

// Frost Grenade Explosion
frost_explode(ent)
{
    
// Get origin
    
static Float:origin[3]
    
pev(entpev_originorigin)
    
    
// Make the explosion
    
create_blast3(origin)
    
    
// Frost nade explode sound
    
static sound[SOUND_MAX_LENGTH]
    
ArrayGetString(g_sound_grenade_frost_exploderandom_num(0ArraySize(g_sound_grenade_frost_explode) - 1), soundcharsmax(sound))
    
emit_sound(entCHAN_WEAPONsound1.0ATTN_NORM0PITCH_NORM)
    
    
// Collisions
    
new victim = -1
    
    
while ((victim engfunc(EngFunc_FindEntityInSpherevictimoriginNADE_EXPLOSION_RADIUS)) != 0)
    {
        
// Only effect alive zombies
        
if (!is_user_alive(victim) || !zp_core_is_zombie(victim))
            continue;
        
        
set_freeze(victim)
    }
    
    
// Get rid of the grenade
    
engfunc(EngFunc_RemoveEntityent)
}

set_freeze(victim)
{
    
// Already frozen
    
if (flag_get(g_IsFrozenvictim))
        return 
false;
    
    
// Allow other plugins to decide whether player should be frozen or not
    
ExecuteForward(g_Forwards[FW_USER_FREEZE_PRE], g_ForwardResultvictim)
    if (
g_ForwardResult >= PLUGIN_HANDLED)
    {
        
// Get player's origin
        
static origin2[3]
        
get_user_origin(victimorigin2)
        
        
// Broken glass sound
        
static sound[SOUND_MAX_LENGTH]
        
ArrayGetString(g_sound_grenade_frost_breakrandom_num(0ArraySize(g_sound_grenade_frost_break) - 1), soundcharsmax(sound))
        
emit_sound(victimCHAN_BODYsound1.0ATTN_NORM0PITCH_NORM)
        
        
// Glass shatter
        
message_begin(MSG_PVSSVC_TEMPENTITYorigin2)
        
write_byte(TE_BREAKMODEL// TE id
        
write_coord(origin2[0]) // x
        
write_coord(origin2[1]) // y
        
write_coord(origin2[2]+24// z
        
write_coord(16// size x
        
write_coord(16// size y
        
write_coord(16// size z
        
write_coord(random_num(-5050)) // velocity x
        
write_coord(random_num(-5050)) // velocity y
        
write_coord(25// velocity z
        
write_byte(10// random velocity
        
write_short(g_glassSpr// model
        
write_byte(10// count
        
write_byte(25// life
        
write_byte(BREAK_GLASS// flags
        
message_end()
        
        return 
false;
    }
    
    
// Freeze icon?
    
if (get_pcvar_num(cvar_grenade_frost_hudicon))
    {
        
message_begin(MSG_ONE_UNRELIABLEg_MsgDamage_victim)
        
write_byte(0// damage save
        
write_byte(0// damage take
        
write_long(DMG_DROWN// damage type - DMG_FREEZE
        
write_coord(0// x
        
write_coord(0// y
        
write_coord(0// z
        
message_end()
    }
    
    
// Set frozen flag
    
flag_set(g_IsFrozenvictim)
    
    
// Freeze sound
    
static sound[SOUND_MAX_LENGTH]
    
ArrayGetString(g_sound_grenade_frost_playerrandom_num(0ArraySize(g_sound_grenade_frost_player) - 1), soundcharsmax(sound))
    
emit_sound(victimCHAN_BODYsound1.0ATTN_NORM0PITCH_NORM)
    
    
// Add a blue tint to their screen
    
message_begin(MSG_ONEg_MsgScreenFade_victim)
    
write_short(0// duration
    
write_short(0// hold time
    
write_short(FFADE_STAYOUT// fade type
    
write_byte(0// red
    
write_byte(50// green
    
write_byte(200// blue
    
write_byte(100// alpha
    
message_end()
    
    
// Update player entity rendering
    
ApplyFrozenRendering(victim)
    
    
// Block gravity
    
ApplyFrozenGravity(victim)
    
    
// Update player's maxspeed
    
ExecuteHamB(Ham_Player_ResetMaxSpeedvictim)
    
    
// Set a task to remove the freeze
    
set_task(get_pcvar_float(cvar_grenade_frost_duration), "remove_freeze"victim+TASK_FROST_REMOVE)
    return 
true;
}

ApplyFrozenGravity(id)
{
    
// Get current gravity
    
new Float:gravity get_user_gravity(id)
    
    
// Already set, no worries...
    
if (gravity == GRAVITY_HIGH || gravity == GRAVITY_NONE)
        return;
    
    
// Save player's old gravity
    
g_FrozenGravity[id] = gravity
    
    
// Prevent from jumping
    
if (pev(idpev_flags) & FL_ONGROUND)
        
set_user_gravity(idGRAVITY_HIGH// set really high
    
else
        
set_user_gravity(idGRAVITY_NONE// no gravity
}

ApplyFrozenRendering(id)
{
    
// Get current rendering
    
new rendering_fx pev(idpev_renderfx)
    new 
Float:rendering_color[3]
    
pev(idpev_rendercolorrendering_color)
    new 
rendering_render pev(idpev_rendermode)
    new 
Float:rendering_amount
    pev
(idpev_renderamtrendering_amount)
    
    
// Already set, no worries...
    
if (rendering_fx == kRenderFxGlowShell && rendering_color[0] == 0.0 && rendering_color[1] == 100.0
        
&& rendering_color[2] == 200.0 && rendering_render == kRenderNormal && rendering_amount == 25.0)
        return;
    
    
// Save player's old rendering    
    
g_FrozenRenderingFx[id] = pev(idpev_renderfx)
    
pev(idpev_rendercolorg_FrozenRenderingColor[id])
    
g_FrozenRenderingRender[id] = pev(idpev_rendermode)
    
pev(idpev_renderamtg_FrozenRenderingAmount[id])
    
    
// Light blue glow while frozen
    
fm_set_rendering(idkRenderFxGlowShell0100200kRenderNormal25)
}

// Remove freeze task
public remove_freeze(taskid)
{
    
// Remove frozen flag
    
flag_unset(g_IsFrozenID_FROST_REMOVE)
    
    
// Restore gravity
    
set_pev(ID_FROST_REMOVEpev_gravityg_FrozenGravity[ID_FROST_REMOVE])
    
    
// Update player's maxspeed
    
ExecuteHamB(Ham_Player_ResetMaxSpeedID_FROST_REMOVE)
    
    
// Restore rendering
    
fm_set_rendering_float(ID_FROST_REMOVEg_FrozenRenderingFx[ID_FROST_REMOVE], g_FrozenRenderingColor[ID_FROST_REMOVE], g_FrozenRenderingRender[ID_FROST_REMOVE], g_FrozenRenderingAmount[ID_FROST_REMOVE])
    
    
// Gradually remove screen's blue tint
    
message_begin(MSG_ONEg_MsgScreenFade_ID_FROST_REMOVE)
    
write_short(UNIT_SECOND// duration
    
write_short(0// hold time
    
write_short(FFADE_IN// fade type
    
write_byte(0// red
    
write_byte(50// green
    
write_byte(200// blue
    
write_byte(100// alpha
    
message_end()
    
    
// Broken glass sound
    
static sound[SOUND_MAX_LENGTH]
    
ArrayGetString(g_sound_grenade_frost_breakrandom_num(0ArraySize(g_sound_grenade_frost_break) - 1), soundcharsmax(sound))
    
emit_sound(ID_FROST_REMOVECHAN_BODYsound1.0ATTN_NORM0PITCH_NORM)
    
    
// Get player's origin
    
static origin[3]
    
get_user_origin(ID_FROST_REMOVEorigin)
    
    
// Glass shatter
    
message_begin(MSG_PVSSVC_TEMPENTITYorigin)
    
write_byte(TE_BREAKMODEL// TE id
    
write_coord(origin[0]) // x
    
write_coord(origin[1]) // y
    
write_coord(origin[2]+24// z
    
write_coord(16// size x
    
write_coord(16// size y
    
write_coord(16// size z
    
write_coord(random_num(-5050)) // velocity x
    
write_coord(random_num(-5050)) // velocity y
    
write_coord(25// velocity z
    
write_byte(10// random velocity
    
write_short(g_glassSpr// model
    
write_byte(10// count
    
write_byte(25// life
    
write_byte(BREAK_GLASS// flags
    
message_end()
    
    
ExecuteForward(g_Forwards[FW_USER_UNFROZEN], g_ForwardResultID_FROST_REMOVE)
}

// Frost Grenade: Freeze Blast
create_blast3(const Float:originF[3])
{
    
// Smallest ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYoriginF0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y
    
engfunc(EngFunc_WriteCoordoriginF[2]) // z
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x axis
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y axis
    
engfunc(EngFunc_WriteCoordoriginF[2]+385.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe
    
write_byte(0// framerate
    
write_byte(4// life
    
write_byte(60// width
    
write_byte(0// noise
    
write_byte(0// red
    
write_byte(100// green
    
write_byte(200// blue
    
write_byte(200// brightness
    
write_byte(0// speed
    
message_end()
    
    
// Medium ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYoriginF0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y
    
engfunc(EngFunc_WriteCoordoriginF[2]) // z
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x axis
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y axis
    
engfunc(EngFunc_WriteCoordoriginF[2]+470.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe
    
write_byte(0// framerate
    
write_byte(4// life
    
write_byte(60// width
    
write_byte(0// noise
    
write_byte(0// red
    
write_byte(100// green
    
write_byte(200// blue
    
write_byte(200// brightness
    
write_byte(0// speed
    
message_end()
    
    
// Largest ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYoriginF0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y
    
engfunc(EngFunc_WriteCoordoriginF[2]) // z
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x axis
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y axis
    
engfunc(EngFunc_WriteCoordoriginF[2]+555.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe
    
write_byte(0// framerate
    
write_byte(4// life
    
write_byte(60// width
    
write_byte(0// noise
    
write_byte(0// red
    
write_byte(100// green
    
write_byte(200// blue
    
write_byte(200// brightness
    
write_byte(0// speed
    
message_end()
}

// Set entity's rendering type (from fakemeta_util)
stock fm_set_rendering(entityfx kRenderFxNone255255255render kRenderNormalamount 16)
{
    static 
Float:color[3]
    
color[0] = float(r)
    
color[1] = float(g)
    
color[2] = float(b)
    
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtfloat(amount))
}

// Set entity's rendering type (float parameters version)
stock fm_set_rendering_float(entityfx kRenderFxNoneFloat:color[3], render kRenderNormalFloat:amount 16.0)
{
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtamount)


Last edited by Toni1; 09-02-2016 at 04:41.
Toni1 is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 05:20.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode