View Single Post
strangeguy
Senior Member
Join Date: Mar 2019
Old 10-07-2019 , 11:02   Re: [ZP] Help with class
Reply With Quote #3

Quote:
Originally Posted by iNvectus View Post
Here you go:
PHP Code:
#include <amxmodx>
#include <fun>
#include <xs>
#include <hamsandwich>
#include <zombieplague>

// Zombie Attributes
new const zclass_name[] = "Zombie Siren UP" // name
new const zclass_info[] = "\yScream ability press R" // description
new const zclass_model[] = "zombie_siren_z7p" // model
new const zclass_clawmodel[] = "v_siren_z7p.mdl" // claw model
new const zclass_ring_sprite[] = "sprites/shockwave.spr" // ring sprite
new const zclass_screamsounds[][] = { "tox_cso/zm_skills/shaman-scream.wav" // scream sound

// // Scream ring color        R    G    B
// new zclass_ring_colors[3] = {    random_num(0),    239,    255    }

const zclass_health 5500 // health
const zclass_speed 255 // speed

const Float:zclass_gravity 0.80 // gravity
const Float:zclass_knockback =  0.5 // knockback

// Variables
new g_ishamanZIDg_iMaxPlayersg_msgSayTextg_msgScreenFadeg_msgScreenShake,
g_msgBarTimeg_sprRing

// Arrays
new g_iPlayerTaskTimes[33]

// Cvar pointers
new cvar_screammodecvar_durationcvar_screamdmgcvar_startimecvar_reloadtime,
cvar_radiuscvar_damagemodecvar_slowdown

// Cached cvars
new g_iCvar_ScreamModeg_iCvar_ScreamDurationg_iCvar_ScreamDmg
g_iCvar_ScreamStartTimeFloat:g_flCvar_ReloadTimeFloat:g_flCvar_Radius,
g_iCvar_DamageModeFloat:g_flCvar_ScreamSlowdown

// Bools
new bool:g_bIsConnected[33], bool:g_bIsAlive[33], bool:g_bInScreamProcess[33], 
bool:g_bCanDoScreams[33], bool:g_bKilledByScream[33], bool:g_bRoundEnding

// Some constants
const FFADE_IN =         0x0000
const GIB_NEVER =        0
const UNIT_SECOND =         (1<<12)
const 
TASK_SCREAM =        37729
const TASK_RELOAD =        55598
const TASK_SCREAMDMG =        48289
const NADE_TYPE_INFECTION =     1111

// Plug info.
#define PLUG_VERSION "0.1"
#define PLUG_AUTH "meTaLiCroSS"

// Macros
#define is_user_valid_alive(%1)     (1 <= %1 <= g_iMaxPlayers && g_bIsAlive[%1])
#define is_user_valid_connected(%1)     (1 <= %1 <= g_iMaxPlayers && g_bIsConnected[%1])
#define zp_get_grenade_type(%1)        (entity_get_int(%1, EV_INT_flTimeStepSound))

/*================================================================================
 [Init, CFG and Precache]
=================================================================================*/

public plugin_init()
{
    
// Plugin Info
    
register_plugin("[CSO:Shaman Zombie]"PLUG_VERSIONPLUG_AUTH)
        
    
// Main events
    
register_event("HLTV""event_RoundStart""a""1=0""2=0")
    
    
// Main messages
    
register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
    
    
// Fakemeta Forwards
    
register_forward(FM_CmdStart"fw_CmdStart")
    
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHam(Ham_Spawn"player""fw_PlayerSpawn_Post"1)
    
    
cvar_screammode register_cvar("zp_shaman_mode""0")
    
cvar_duration register_cvar("zp_shaman_scream_duration""3")
    
cvar_screamdmg register_cvar("zp_shaman_scream_damage""1.5")
    
cvar_startime register_cvar("zp_shaman_scream_start_time""1")
    
cvar_reloadtime register_cvar("zp_shaman_scream_reload_time""20.0")
    
cvar_radius register_cvar("zp_shaman_scream_radius""250.0")
    
cvar_damagemode register_cvar("zp_shaman_damage_mode""0")
    
cvar_slowdown register_cvar("zp_shaman_damage_slowdown""0.4")
    
    
g_iMaxPlayers get_maxplayers()
    
g_msgBarTime get_user_msgid("BarTime")
    
g_msgSayText get_user_msgid("SayText")
    
g_msgScreenFade get_user_msgid("ScreenFade")
    
g_msgScreenShake get_user_msgid("ScreenShake")
}

public 
plugin_cfg()
{
    
cache_cvars()
}

public 
plugin_precache()
{
    
g_ishamanZID zp_register_zombie_class(zclass_namezclass_infozclass_modelzclass_clawmodelzclass_healthzclass_speedzclass_gravityzclass_knockback)    

    
g_sprRing precache_model(zclass_ring_sprite)

    for(new 
0sizeof zclass_screamsoundsi++) precache_sound(zclass_screamsounds[i])
}
public 
event_RoundStart()
{
    
cache_cvars()
    
g_bRoundEnding false
}

public 
message_DeathMsg(msg_idmsg_destid)
{
    static 
iAttackeriVictim
    
    
// Get attacker and victim
    
iAttacker get_msg_arg_int(1)
    
iVictim get_msg_arg_int(2)
    
    
// Non-player attacker or self kill
    
if(!is_user_connected(iAttacker) || iAttacker == iVictim)
        return 
PLUGIN_CONTINUE
        
    
// Killed by shaman scream
    
if(g_bKilledByScream[iVictim])
        
set_msg_arg_string(4"shaman scream")
        
    return 
PLUGIN_CONTINUE
}

public 
client_putinserver(id)
{
    
g_bIsConnected[id] = true
}

public 
client_disconnect(id)
{
    
g_bIsAlive[id] = false
    g_bIsConnected
[id] = false
}

public 
fw_PlayerSpawn_Post(id)
{
    if(!
is_user_alive(id)) return HAM_IGNORED

    g_bIsAlive
[id] = true

    stop_scream_task
(id)

    if(
zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_ishamanZID)
        
g_bCanDoScreams[id] = true
    
else
        
g_bCanDoScreams[id] = false
        g_iPlayerTaskTimes
[id] = 0

    remove_task
(id+TASK_RELOAD)
    
remove_task(id+TASK_SCREAMDMG)
    
    return 
HAM_IGNORED
}

public 
fw_PlayerKilled(victimattackershouldgib)
{
    
// Player victim
    
if(is_user_valid_connected(victim))
    {
        
// Victim is not alive
        
g_bIsAlive[victim] = false
        
        
// Reset player vars and tasks
        
stop_scream_task(victim)
        
        
g_bCanDoScreams[victim] = false
        g_iPlayerTaskTimes
[victim] = 0
        
        remove_task
(victim+TASK_RELOAD)
        
remove_task(victim+TASK_SCREAMDMG)
        
        return 
HAM_HANDLED
    
}
    
    return 
HAM_IGNORED
}

public 
fw_CmdStart(idhandlerandom_seed)
{
    
// Not alive
    
if(!is_user_alive(id))
        return 
FMRES_IGNORED;
    
    
// Isn't a zombie?
    
if(!zp_get_user_zombie(id) || zp_get_user_nemesis(id))
        return 
FMRES_IGNORED;
        
    
// Invalid class id
    
if(zp_get_user_zombie_class(id) != g_ishamanZID)
        return 
FMRES_IGNORED;
        
    
// Get user old and actual buttons
    
static iInUseButtoniInUseOldButton
    iInUseButton 
= (get_uc(handleUC_Buttons) & IN_RELOAD)
    
iInUseOldButton = (get_user_oldbutton(id) & IN_RELOAD)
    
    
// Pressing +use button
    
if(iInUseButton)
    {
        if(!
iInUseOldButton && g_bCanDoScreams[id] && !task_exists(id+TASK_SCREAMDMG) && !g_bRoundEnding)
        {
            
// A bar appears in his screen
            
message_begin(MSG_ONEg_msgBarTime_id)
            
write_byte(g_iCvar_ScreamStartTime// time
            
write_byte(0// unknown
            
message_end()
            
            
// Update bool
            
g_bInScreamProcess[id] = true
            
            
// Next scream time
            
set_task(g_iCvar_ScreamStartTime 0.2"task_do_scream"id+TASK_SCREAM)
            
            return 
FMRES_HANDLED
        
}
    }
    else
    {
        
// Last used button it's +use
        
if(iInUseOldButton && g_bInScreamProcess[id])
        {
            
// Stop scream main task
            
stop_scream_task(id)
            
            return 
FMRES_HANDLED
        
}
    }
    
    return 
FMRES_IGNORED
}

public 
task_do_scream(id)
{
    
// Normalize task
    
id -= TASK_SCREAM
    
    
// Do scream sound
    
emit_sound(idCHAN_VOICEzclass_screamsounds[random_num(0sizeof zclass_screamsounds 1)], 1.0ATTN_NORM0PITCH_NORM)
    
    
// Block screams
    
g_bCanDoScreams[id] = false
    
    
// Reload task
    
set_task(g_flCvar_ReloadTime"task_reload_scream"id+TASK_RELOAD)
    
    
// Scream damage task
    
set_task(0.1"task_scream_process"id+TASK_SCREAMDMG__"b")
}

public 
task_reload_scream(id)
{
    
// Normalize taks
    
id -= TASK_RELOAD
    
    
// Can do screams again
    
g_bCanDoScreams[id] = true
    
    
// Message
    
client_printcolor(id"/g[CSO ZM] /yСпособность /g^"[&#1050;рик]^"/y | Кнопка /g[R]/y")
}

public 
task_scream_process(id)
{
    
// Normalize task
    
id -= TASK_SCREAMDMG
    
    
// Time exceed
    
if(g_iPlayerTaskTimes[id] >= (g_iCvar_ScreamDuration*10) || g_bRoundEnding)
    {
        
// Remove player task
        
remove_task(id+TASK_SCREAMDMG)
        
        
// Reset task times count
        
g_iPlayerTaskTimes[id] = 0
        
        
return;
    }
    
    
// Update player task time
    
g_iPlayerTaskTimes[id]++
    
    
// Get player origin
    
static Float:flOrigin[3]
    
entity_get_vector(idEV_VEC_originflOrigin)
    
    
// Collisions
    
static iVictim
    iVictim 
= -1
    
    
// Vector var
    
static Float:flVictimOrigin[3]
    
    
// A ring effect
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYflOrigin0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordflOrigin[0]) // x
    
engfunc(EngFunc_WriteCoordflOrigin[1]) // y
    
engfunc(EngFunc_WriteCoordflOrigin[2]) // z
    
engfunc(EngFunc_WriteCoordflOrigin[0]) // x axis
    
engfunc(EngFunc_WriteCoordflOrigin[1]) // y axis
    
engfunc(EngFunc_WriteCoordflOrigin[2] + g_flCvar_Radius// z axis
    
write_short(g_sprRing// sprite
    
write_byte(0// startframe
    
write_byte(0// framerate
    
write_byte(10// life
    
write_byte(25// width
    
write_byte(0// noise
    // write_byte(zclass_ring_colors[0]) // red
    // write_byte(zclass_ring_colors[1]) // green
    // write_byte(zclass_ring_colors[2]) // blue
    
write_byte(random_num(0255)) // red
    
write_byte(random_num(0255)) // green
    
write_byte(random_num(0255)) // blue
    
write_byte(200// brightness
    
write_byte(0// speed
    
message_end()
    
    
// Screen effects for him self
    
screen_effects(id)
    
    
// Do scream effects
    
while((iVictim find_ent_in_sphere(iVictimflOriging_flCvar_Radius)) != 0)
    {
        
// Non-player entity
        
if(!is_user_valid_connected(iVictim))
        {
            
// Validation check
            
if(is_valid_ent(iVictim))
            {
                
// Get entity classname
                
static szClassname[33]
                
entity_get_string(iVictimEV_SZ_classnameszClassnamecharsmax(szClassname))
                
                
// It's a grenade, and isn't an Infection Bomb
                
if(equal(szClassname"grenade") && zp_get_grenade_type(iVictim) != NADE_TYPE_INFECTION)
                {
                    
// Get grenade origin
                    
entity_get_vector(iVictimEV_VEC_originflVictimOrigin)
                    
                    
// Do a good effect
                    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYflVictimOrigin0)
                    
write_byte(TE_PARTICLEBURST// TE id
                    
engfunc(EngFunc_WriteCoordflVictimOrigin[0]) // x
                    
engfunc(EngFunc_WriteCoordflVictimOrigin[1]) // y
                    
engfunc(EngFunc_WriteCoordflVictimOrigin[2]) // z
                    
write_short(45// radius
                    
write_byte(108// particle color
                    
write_byte(10// duration * 10 will be randomized a bit
                    
message_end()
                    
                    
// Remove it
                    
remove_entity(iVictim)
                }
            }
            
            continue;
        }
            
        
// Not alive, zombie or with Godmode
        
if(!g_bIsAlive[iVictim] || zp_get_user_zombie(iVictim) || get_user_godmode(iVictim))
            continue;
            
        
// Screen effects for victims
        
screen_effects(iVictim)
            
        
// Get scream mode
        
switch(g_iCvar_ScreamMode)
        {
            
// Do damage
            
case 0:
            {
                
// Get human health
                
static iHealth
                iHealth 
get_user_health(iVictim)
                
                
// It's going to die and can be infected?
                
if((iHealth g_iCvar_ScreamDmg) <= && g_iCvar_DamageMode)
                {
                    
// Can be infected?
                    
if(zp_infect_user(iVictimid01))
                        continue
                }
                
                
// It's going to die
                
if(iHealth g_iCvar_ScreamDmg <= 0)
                {
                    
// Be infected when it's going to die
                    
if(g_iCvar_DamageMode /* == 1*/)
                    {
                        
// Returns 1 on sucess...
                        
if(zp_infect_user(iVictimid01))
                            continue
                    }
    
                    
// Kill it
                    
scream_kill(iVictimid)
                    
                    continue
                }
                
                
// Do fake damage
                
set_user_health(iVictimiHealth g_iCvar_ScreamDmg)
                
                
// Scream slowdown, first should be enabled
                
if(g_flCvar_ScreamSlowdown 0.0)
                {
                    
// Get his current velocity vector
                    
static Float:flVelocity[3]
                    
get_user_velocity(iVictimflVelocity)
                    
                    
// Multiply his velocity by a number
                    
xs_vec_mul_scalar(flVelocityg_flCvar_ScreamSlowdownflVelocity)
                    
                    
// Set his new velocity vector
                    
set_user_velocity(iVictimflVelocity)    
                }
            }
            
            
// Instantly Infect
            
case 1:
            {
                
// Can be infected?
                
if(!zp_infect_user(iVictimid01))
                {
                    
// Kill it
                    
scream_kill(iVictimid)
                }
            }
            
            
// Instantly Kill
            
case 2:
            {
                
// Kill it
                
scream_kill(iVictimid)
            }
        }
            
    }
}

public 
zp_user_infected_post(idinfector)
{
    
// It's the selected zombie class
    
if(zp_get_user_zombie_class(id) == g_ishamanZID && !zp_get_user_nemesis(id))
    {
        
// Array
        
g_bCanDoScreams[id] = true
        
        
// Message
        
client_printcolor(id"/g[CSO ZM] /yСпособность /g[Крик]/y | Кнопка /g^"[R]^"/y для использования")
    }
}

public 
zp_user_humanized_post(id)
{
    
// Reset player vars and tasks
    
stop_scream_task(id)
    
    
g_bCanDoScreams[id] = false
    g_iPlayerTaskTimes
[id] = 0
    
    remove_task
(id+TASK_RELOAD)
    
remove_task(id+TASK_SCREAMDMG)
}

public 
zp_round_ended(winteam)
{
    
// Update bool
    
g_bRoundEnding true
    
    
// Make a loop
    
static id
    
for(id 1id <= g_iMaxPlayersid++)
    {
        
// Valid connected
        
if(is_user_valid_connected(id))
        {
            
// Remove mainly tasks
            
stop_scream_task(id)
            
remove_task(id+TASK_RELOAD)
        }
    }
}

stop_scream_task(id)
{
    
// Remove the task
    
if(task_exists(id+TASK_SCREAM)) 
    {
        
remove_task(id+TASK_SCREAM)
    
        
// Remove screen's bar
        
message_begin(MSG_ONEg_msgBarTime_id)
        
write_byte(0// time
        
write_byte(0// unknown
        
message_end()
        
        
// Update bool
        
g_bInScreamProcess[id] = false
    
}
}

screen_effects(id)
{
    
// Screen Fade
    
message_begin(MSG_ONE_UNRELIABLEg_msgScreenFade_id)
    
write_short(UNIT_SECOND*1// duration
    
write_short(UNIT_SECOND*1// hold time
    
write_short(FFADE_IN// fade type
    
write_byte(random_num(0255)) // r
    
write_byte(random_num(0255)) // g
    
write_byte(random_num(0255)) // b
    
write_byte(125// alpha
    
message_end()
    
    
// Screen Shake
    
message_begin(MSG_ONE_UNRELIABLEg_msgScreenShake_id)
    
write_short(UNIT_SECOND*5// amplitude
    
write_short(UNIT_SECOND*1// duration
    
write_short(UNIT_SECOND*5// frequency
    
message_end()
}

cache_cvars()
{
    
g_iCvar_ScreamMode get_pcvar_num(cvar_screammode)
    
g_iCvar_ScreamDuration get_pcvar_num(cvar_duration)
    
g_iCvar_ScreamDmg get_pcvar_num(cvar_screamdmg)
    
g_iCvar_ScreamStartTime get_pcvar_num(cvar_startime)
    
g_iCvar_DamageMode get_pcvar_num(cvar_damagemode)
    
g_flCvar_ReloadTime floatmax(g_iCvar_ScreamDuration+0.0get_pcvar_float(cvar_reloadtime))
    
g_flCvar_Radius get_pcvar_float(cvar_radius)
    
g_flCvar_ScreamSlowdown get_pcvar_float(cvar_slowdown)
}

scream_kill(victimattacker)
{
    
// To use later in DeathMsg event
    
g_bKilledByScream[victim] = true
    
    
// Do kill
    
ExecuteHamB(Ham_KilledvictimattackerGIB_NEVER)
    
    
// We don't need this
    
g_bKilledByScream[victim] = false
}

stock client_printcolor(id, const input[], any:...)
{
    static 
iPlayersNum[32], iCountiCount 1
    
static szMsg[191]
    
    
vformat(szMsgcharsmax(szMsg), input3)
    
    
replace_all(szMsg190"/g""^4"// green txt
    
replace_all(szMsg190"/y""^1"// orange txt
    
replace_all(szMsg190"/ctr""^3"// team txt
    
replace_all(szMsg190"/w""^0"// team txt
    
    
if(idiPlayersNum[0] = id
    
else get_players(iPlayersNumiCount"ch")
        
    for (new 
0iCounti++)
    {
        if (
g_bIsConnected[iPlayersNum[i]])
        {
            
message_begin(MSG_ONE_UNRELIABLEg_msgSayText_iPlayersNum[i])
            
write_byte(iPlayersNum[i])
            
write_string(szMsg)
            
message_end()
        }
    }

Thank you <3
strangeguy is offline