Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

sirena

Статус пользователя Connect1507
сообщение 18.3.2012, 12:08
Сообщение #1
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

Всем добрый день! Столкнулся с проблеммой.
Поставил зм класс сирена, но когда остаётся последний человек сиренм подбигает на близкое расстояние, заорёт и снимает чуть ли на 1к хп. Скока квары не менял всё бестолку.
Вот исходник. Мб кто то пользуется классом таким....
Помогите сделать что бы сирена наносила меньше урона своим криком(аурой)

скрытый текст
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fun>
#include <xs>
#include <hamsandwich>
#include <zombieplague>

/*===============================================================================
=
[Customizations]
================================================================================
=*/

// Zombie Attributes
new const zclass_name[] = "Сирена" // name
new const zclass_info[] = "[Воет на E]" // description
new const zclass_model[] = "Shaman" // model
new const zclass_clawmodel[] = "Shaman.mdl" // claw model
new const zclass_ring_sprite[] = "sprites/shockwave.spr" // ring sprite
new const zclass_screamsounds[][] = { "killing_floor/siren_scream.wav" } // scream sound

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

const zclass_health = 4000 // health
const zclass_speed = 245 // speed

const Float:zclass_gravity = 0.79 // gravity
const Float:zclass_knockback = 0.9 // knockback

/*===============================================================================
=
Customization ends here! Yes, that's it. Editing anything beyond
here is not officially supported. Proceed at your own risk...
================================================================================
=*/

// Variables
new g_iSirenZID, g_iMaxPlayers, g_msgSayText, g_msgScreenFade, g_msgScreenShake,
g_msgBarTime, g_sprRing , g_modenow

// Arrays
new g_iPlayerTaskTimes[33]

// Cvar pointers
new cvar_screammode, cvar_duration, cvar_screamdmg, cvar_startime, cvar_reloadtime,
cvar_radius, cvar_damagemode, cvar_slowdown

// Cached cvars
new g_iCvar_ScreamMode, g_iCvar_ScreamDuration, g_iCvar_ScreamDmg,
g_iCvar_ScreamStartTime, Float:g_flCvar_ReloadTime, Float:g_flCvar_Radius,
g_iCvar_DamageMode, Float:g_flCvar_ScreamSlowdown , cvar_armorhit

// Bools
new bool:g_bIsConnected[33], bool:g_bIsAlive[33], bool:g_bInScreamProcess[33],
bool:g_bCanDoScreams[33], bool:g_bKilledByScream[33], bool:g_bDoingScream[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.2"
#define PLUG_AUTH "meTaLiCroSS"

// Macros
#define zp_get_grenade_type(%1) (entity_get_int(%1, EV_INT_flTimeStepSound))
#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])

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

public plugin_init()
{
// Plugin Info
register_plugin("[ZP] Zombie Class: KF Siren Zombie", PLUG_VERSION, PLUG_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")

// Hamsandwich Forward
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)

// Cvars
cvar_screammode = register_cvar("zp_siren_mode", "1")
cvar_duration = register_cvar("zp_siren_scream_duration", "3")
cvar_screamdmg = register_cvar("zp_siren_scream_damage", "2")
cvar_startime = register_cvar("zp_siren_scream_start_time", "1")
cvar_reloadtime = register_cvar("zp_siren_scream_reload_time", "20.0")
cvar_radius = register_cvar("zp_siren_scream_radius", "150.0")
cvar_damagemode = register_cvar("zp_siren_damage_mode", "1")
cvar_slowdown = register_cvar("zp_siren_damage_slowdown", "0.5")
cvar_armorhit = register_cvar("zp_siren_armor_hit", "1")

static szCvar[30]
formatex(szCvar, charsmax(szCvar), "v%s by %s", PLUG_VERSION, PLUG_AUTH)
register_cvar("zp_zclass_siren", szCvar, FCVAR_SERVER|FCVAR_SPONLY)

// Vars
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 some cvars
cache_cvars()
}

public plugin_precache()
{
// Register the new class and store ID for reference
g_iSirenZID = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)

// Ring sprite
g_sprRing = precache_model(zclass_ring_sprite)

// Sounds
static i
for(i = 0; i < sizeof zclass_screamsounds; i++)
precache_sound(zclass_screamsounds[i])
}

/*===============================================================================
=
[Main Events/Messages]
================================================================================
=*/

public event_RoundStart()
{
// Caching cvars
cache_cvars()

// Reset round end bar
g_bRoundEnding = false
}

public message_DeathMsg(msg_id, msg_dest, id)
{
static iAttacker, iVictim

// 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 siren scream
if(g_bKilledByScream[iVictim])
set_msg_arg_string(4, "siren scream")

return PLUGIN_CONTINUE
}

/*===============================================================================
=
[Main Forwards]
================================================================================
=*/

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

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

public fw_PlayerSpawn_Post(id)
{
// Not alive...
if(!is_user_alive(id))
return HAM_IGNORED

// Player is alive
g_bIsAlive[id] = true

// Reset player vars and tasks
stop_scream_task(id)

g_bCanDoScreams[id] = false
g_bDoingScream[id] = false
g_iPlayerTaskTimes[id] = 0

remove_task(id+TASK_RELOAD)
remove_task(id+TASK_SCREAMDMG)

return HAM_IGNORED
}

public fw_PlayerKilled(victim, attacker, shouldgib)
{
// 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_bDoingScream[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(id, handle, random_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_iSirenZID)
return FMRES_IGNORED;

// Get user old and actual buttons
static iInUseButton, iInUseOldButton
iInUseButton = (get_uc(handle, UC_Buttons) & IN_USE)
iInUseOldButton = (get_user_oldbutton(id) & IN_USE)

// Pressing +use button
if(iInUseButton)
{
// Last used button isn't +use, i need to
// do this, because i call this "only" 1 time
if(!iInUseOldButton && g_bCanDoScreams[id] && !g_bDoingScream[id] && !g_bRoundEnding)
{
// A bar appears in his screen
message_begin(MSG_ONE, g_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
}

/*===============================================================================
=
[Tasks]
================================================================================
=*/

public task_do_scream(id)
{
// Normalize task
id -= TASK_SCREAM

// Do scream sound
emit_sound(id, CHAN_STREAM, zclass_screamsounds[random_num(0, sizeof zclass_screamsounds - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)

// Block screams
g_bCanDoScreams[id] = false

// Reload task
set_task(g_flCvar_ReloadTime, "task_reload_scream", id+TASK_RELOAD)

// Now it's doing an scream
g_bDoingScream[id] = true

// Get his origin coords
static iOrigin[3]
get_user_origin(id, iOrigin)

// Do a good effect, life the original Killing Floor.
message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin)
write_byte(TE_LAVASPLASH)
write_coord(iOrigin[0])
write_coord(iOrigin[1])
write_coord(iOrigin[2])
message_end()

// 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[ZP]/y Готово! Ты можешь /gКричать/y сейчас")
client_printcolor(id, "/g[ZP]/y Ты должен нажать на /g^"E^"/что бы /gЗакричать/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

// Update bool
g_bDoingScream[id] = false

return;
}

// Update player task time
g_iPlayerTaskTimes[id]++

// Get player origin
static Float:flOrigin[3]
entity_get_vector(id, EV_VEC_origin, flOrigin)

// Collisions
static iVictim
iVictim = -1

// Vector var
static Float:flVictimOrigin[3]

// A ring effect
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]) // z
engfunc(EngFunc_WriteCoord, flOrigin[0]) // x axis
engfunc(EngFunc_WriteCoord, flOrigin[1]) // y axis
engfunc(EngFunc_WriteCoord, flOrigin[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(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(iVictim, flOrigin, g_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(iVictim, EV_SZ_classname, szClassname, charsmax(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(iVictim, EV_VEC_origin, flVictimOrigin)

// Do a good effect
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flVictimOrigin, 0)
write_byte(TE_PARTICLEBURST) // TE id
engfunc(EngFunc_WriteCoord, flVictimOrigin[0]) // x
engfunc(EngFunc_WriteCoord, flVictimOrigin[1]) // y
engfunc(EngFunc_WriteCoord, flVictimOrigin[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)
}
// If i don't check his solid type, it's used all the time.
else if(equal(szClassname, "func_breakable") && entity_get_int(iVictim, EV_INT_solid) != SOLID_NOT)
{
// Destroy entity if he can
force_use(id, iVictim)
}
}

continue;
}

static Float:fl2Origin[3] , Float:fl3Origin[3]
fl3Origin = flOrigin
fl3Origin[2] += 120.0
entity_get_vector(iVictim, EV_VEC_origin, fl2Origin)

// Not alive, zombie or with Godmode
if(!g_bIsAlive[iVictim] || zp_get_user_zombie(iVictim) || get_user_godmode(iVictim) || !get_can_see(fl3Origin, fl2Origin))
continue;

// Screen effects for victims
screen_effects(iVictim)

// Get scream mode
new a
if(g_modenow == 0)
{
a = g_iCvar_ScreamMode
}else{
a = 0
}
switch(a)
{
// Do damage
case 0:
{
// Scream slowdown, first should be enabled
if(g_flCvar_ScreamSlowdown > 0.0)
{
// Get his current velocity vector
static Float:flVelocity[3]
get_user_velocity(iVictim, flVelocity)

// Multiply his velocity by a number
xs_vec_mul_scalar(flVelocity, g_flCvar_ScreamSlowdown, flVelocity)

// Set his new velocity vector
set_user_velocity(iVictim, flVelocity)
}

// Get damage result
static iNewHealth
iNewHealth = max(0, get_user_health(iVictim) - g_iCvar_ScreamDmg)

// Does not has health
if(!iNewHealth)
{
// Be infected when it's going to die
if(g_iCvar_DamageMode /* == 1*/)
{
// Returns 1 on sucess...
if(zp_infect_user(iVictim, id, 0, 1))
continue
}

// Kill it
scream_kill(iVictim, id)

continue
}

// Do fake damage
set_user_health(iVictim, iNewHealth)
}

// Instantly Infect
case 1:
{
if(get_user_armor(iVictim) > 0)
{
if(get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit) >= 0) set_user_armor(iVictim,get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit))
if(get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit) < 0) set_user_armor(iVictim,0)
}else{
// Can be infected?
if(!zp_infect_user(iVictim, id, 0, 1))
{
// Kill it
scream_kill(iVictim, id)
}
}
}

// Instantly Kill
case 2:
{
// Kill it
scream_kill(iVictim, id)
}
}

}
}

/*===============================================================================
=
[Zombie Plague Forwards]
================================================================================
=*/

public zp_user_infected_post(id, infector)
{
// It's the selected zombie class
if(zp_get_user_zombie_class(id) == g_iSirenZID && !zp_get_user_nemesis(id))
{
// Array
g_bCanDoScreams[id] = true
g_bDoingScream[id] = false

// Message
client_printcolor(id, "/g[ZP]/y Ты можешь делать /gкрик/y нажава на /g^"E^"/y клавишу")
}
}

public zp_user_humanized_post(id)
{
// Reset player vars and tasks
stop_scream_task(id)

g_bCanDoScreams[id] = false
g_bDoingScream[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 = 1; id <= g_iMaxPlayers; id++)
{
// Valid connected
if(is_user_valid_connected(id))
{
// Remove mainly tasks
stop_scream_task(id)
remove_task(id+TASK_RELOAD)
}
}
}

/*===============================================================================
=
[Internal Functions]
================================================================================
=*/

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_ONE, g_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_UNRELIABLE, g_msgScreenFade, _, id)
write_short(UNIT_SECOND*1) // duration
write_short(UNIT_SECOND*1) // hold time
write_short(FFADE_IN) // fade type
write_byte(200) // r
write_byte(0) // g
write_byte(0) // b
write_byte(125) // alpha
message_end()

// Screen Shake
message_begin(MSG_ONE_UNRELIABLE, g_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.0, get_pcvar_float(cvar_reloadtime))
g_flCvar_Radius = get_pcvar_float(cvar_radius)
g_flCvar_ScreamSlowdown = get_pcvar_float(cvar_slowdown)
}

scream_kill(victim, attacker)
{
// To use later in DeathMsg event
g_bKilledByScream[victim] = true

// Do kill
ExecuteHamB(Ham_Killed, victim, attacker, GIB_NEVER)

// We don't need this
g_bKilledByScream[victim] = false
}

/*===============================================================================
=
[Stocks]
================================================================================
=*/

stock client_printcolor(id, const input[], any:...)
{
static iPlayersNum[32], iCount; iCount = 1
static szMsg[191]

vformat(szMsg, charsmax(szMsg), input, 3)

replace_all(szMsg, 190, "/g", "^4") // green txt
replace_all(szMsg, 190, "/y", "^1") // orange txt
replace_all(szMsg, 190, "/ctr", "^3") // team txt
replace_all(szMsg, 190, "/w", "^0") // team txt

if(id) iPlayersNum[0] = id
else get_players(iPlayersNum, iCount, "ch")

for (new i = 0; i < iCount; i++)
{
if (g_bIsConnected[iPlayersNum[i]])
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayersNum[i])
write_byte(iPlayersNum[i])
write_string(szMsg)
message_end()
}
}
}
public zp_round_started(gamemode)
{
if(gamemode ==MODE_INFECTION || gamemode == MODE_MULTI)
{
g_modenow = 0
}else{
g_modenow = 1
}
}
stock get_can_see(Float:ent_origin[3], Float:target_origin[3])
{
new Float:hit_origin[3]
trace_line(-1, ent_origin, target_origin, hit_origin)

if (!vector_distance(hit_origin, target_origin)) return 1;

return 0;
}


Отредактировал: Connect1507, - 18.3.2012, 12:25
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Pakistan
сообщение 18.3.2012, 12:14
Сообщение #2
Стаж: 14 лет

Сообщений: 808
Благодарностей: 246
Полезность: 554

Цитата(Connect1507 @ 18.3.2012, 13:08) *
Всем добрый день! Столкнулся с проблеммой.
Поставил зм класс сирена, но когда остаётся последний человек сиренм подбигает на близкое расстояние, заорёт и снимает чуть ли на 1к хп. Скока квары не менял всё бестолку.
Вот исходник. Мб кто то пользуется классом таким....

скрытый текст
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fun>
#include <xs>
#include <hamsandwich>
#include <zombieplague>

/*===============================================================================
=
[Customizations]
================================================================================
=*/

// Zombie Attributes
new const zclass_name[] = "Сирена" // name
new const zclass_info[] = "[Воет на E]" // description
new const zclass_model[] = "Shaman" // model
new const zclass_clawmodel[] = "Shaman.mdl" // claw model
new const zclass_ring_sprite[] = "sprites/shockwave.spr" // ring sprite
new const zclass_screamsounds[][] = { "killing_floor/siren_scream.wav" } // scream sound

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

const zclass_health = 4000 // health
const zclass_speed = 245 // speed

const Float:zclass_gravity = 0.79 // gravity
const Float:zclass_knockback = 0.9 // knockback

/*===============================================================================
=
Customization ends here! Yes, that's it. Editing anything beyond
here is not officially supported. Proceed at your own risk...
================================================================================
=*/

// Variables
new g_iSirenZID, g_iMaxPlayers, g_msgSayText, g_msgScreenFade, g_msgScreenShake,
g_msgBarTime, g_sprRing , g_modenow

// Arrays
new g_iPlayerTaskTimes[33]

// Cvar pointers
new cvar_screammode, cvar_duration, cvar_screamdmg, cvar_startime, cvar_reloadtime,
cvar_radius, cvar_damagemode, cvar_slowdown

// Cached cvars
new g_iCvar_ScreamMode, g_iCvar_ScreamDuration, g_iCvar_ScreamDmg,
g_iCvar_ScreamStartTime, Float:g_flCvar_ReloadTime, Float:g_flCvar_Radius,
g_iCvar_DamageMode, Float:g_flCvar_ScreamSlowdown , cvar_armorhit

// Bools
new bool:g_bIsConnected[33], bool:g_bIsAlive[33], bool:g_bInScreamProcess[33],
bool:g_bCanDoScreams[33], bool:g_bKilledByScream[33], bool:g_bDoingScream[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.2"
#define PLUG_AUTH "meTaLiCroSS"

// Macros
#define zp_get_grenade_type(%1) (entity_get_int(%1, EV_INT_flTimeStepSound))
#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])

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

public plugin_init()
{
// Plugin Info
register_plugin("[ZP] Zombie Class: KF Siren Zombie", PLUG_VERSION, PLUG_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")

// Hamsandwich Forward
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)

// Cvars
cvar_screammode = register_cvar("zp_siren_mode", "1")
cvar_duration = register_cvar("zp_siren_scream_duration", "3")
cvar_screamdmg = register_cvar("zp_siren_scream_damage", "2")
cvar_startime = register_cvar("zp_siren_scream_start_time", "1")
cvar_reloadtime = register_cvar("zp_siren_scream_reload_time", "20.0")
cvar_radius = register_cvar("zp_siren_scream_radius", "150.0")
cvar_damagemode = register_cvar("zp_siren_damage_mode", "1")
cvar_slowdown = register_cvar("zp_siren_damage_slowdown", "0.5")
cvar_armorhit = register_cvar("zp_siren_armor_hit", "1")

static szCvar[30]
formatex(szCvar, charsmax(szCvar), "v%s by %s", PLUG_VERSION, PLUG_AUTH)
register_cvar("zp_zclass_siren", szCvar, FCVAR_SERVER|FCVAR_SPONLY)

// Vars
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 some cvars
cache_cvars()
}

public plugin_precache()
{
// Register the new class and store ID for reference
g_iSirenZID = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)

// Ring sprite
g_sprRing = precache_model(zclass_ring_sprite)

// Sounds
static i
for(i = 0; i < sizeof zclass_screamsounds; i++)
precache_sound(zclass_screamsounds[i])
}

/*===============================================================================
=
[Main Events/Messages]
================================================================================
=*/

public event_RoundStart()
{
// Caching cvars
cache_cvars()

// Reset round end bar
g_bRoundEnding = false
}

public message_DeathMsg(msg_id, msg_dest, id)
{
static iAttacker, iVictim

// 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 siren scream
if(g_bKilledByScream[iVictim])
set_msg_arg_string(4, "siren scream")

return PLUGIN_CONTINUE
}

/*===============================================================================
=
[Main Forwards]
================================================================================
=*/

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

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

public fw_PlayerSpawn_Post(id)
{
// Not alive...
if(!is_user_alive(id))
return HAM_IGNORED

// Player is alive
g_bIsAlive[id] = true

// Reset player vars and tasks
stop_scream_task(id)

g_bCanDoScreams[id] = false
g_bDoingScream[id] = false
g_iPlayerTaskTimes[id] = 0

remove_task(id+TASK_RELOAD)
remove_task(id+TASK_SCREAMDMG)

return HAM_IGNORED
}

public fw_PlayerKilled(victim, attacker, shouldgib)
{
// 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_bDoingScream[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(id, handle, random_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_iSirenZID)
return FMRES_IGNORED;

// Get user old and actual buttons
static iInUseButton, iInUseOldButton
iInUseButton = (get_uc(handle, UC_Buttons) & IN_USE)
iInUseOldButton = (get_user_oldbutton(id) & IN_USE)

// Pressing +use button
if(iInUseButton)
{
// Last used button isn't +use, i need to
// do this, because i call this "only" 1 time
if(!iInUseOldButton && g_bCanDoScreams[id] && !g_bDoingScream[id] && !g_bRoundEnding)
{
// A bar appears in his screen
message_begin(MSG_ONE, g_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
}

/*===============================================================================
=
[Tasks]
================================================================================
=*/

public task_do_scream(id)
{
// Normalize task
id -= TASK_SCREAM

// Do scream sound
emit_sound(id, CHAN_STREAM, zclass_screamsounds[random_num(0, sizeof zclass_screamsounds - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)

// Block screams
g_bCanDoScreams[id] = false

// Reload task
set_task(g_flCvar_ReloadTime, "task_reload_scream", id+TASK_RELOAD)

// Now it's doing an scream
g_bDoingScream[id] = true

// Get his origin coords
static iOrigin[3]
get_user_origin(id, iOrigin)

// Do a good effect, life the original Killing Floor.
message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin)
write_byte(TE_LAVASPLASH)
write_coord(iOrigin[0])
write_coord(iOrigin[1])
write_coord(iOrigin[2])
message_end()

// 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[ZP]/y Готово! Ты можешь /gКричать/y сейчас")
client_printcolor(id, "/g[ZP]/y Ты должен нажать на /g^"E^"/что бы /gЗакричать/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

// Update bool
g_bDoingScream[id] = false

return;
}

// Update player task time
g_iPlayerTaskTimes[id]++

// Get player origin
static Float:flOrigin[3]
entity_get_vector(id, EV_VEC_origin, flOrigin)

// Collisions
static iVictim
iVictim = -1

// Vector var
static Float:flVictimOrigin[3]

// A ring effect
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]) // z
engfunc(EngFunc_WriteCoord, flOrigin[0]) // x axis
engfunc(EngFunc_WriteCoord, flOrigin[1]) // y axis
engfunc(EngFunc_WriteCoord, flOrigin[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(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(iVictim, flOrigin, g_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(iVictim, EV_SZ_classname, szClassname, charsmax(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(iVictim, EV_VEC_origin, flVictimOrigin)

// Do a good effect
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flVictimOrigin, 0)
write_byte(TE_PARTICLEBURST) // TE id
engfunc(EngFunc_WriteCoord, flVictimOrigin[0]) // x
engfunc(EngFunc_WriteCoord, flVictimOrigin[1]) // y
engfunc(EngFunc_WriteCoord, flVictimOrigin[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)
}
// If i don't check his solid type, it's used all the time.
else if(equal(szClassname, "func_breakable") && entity_get_int(iVictim, EV_INT_solid) != SOLID_NOT)
{
// Destroy entity if he can
force_use(id, iVictim)
}
}

continue;
}

static Float:fl2Origin[3] , Float:fl3Origin[3]
fl3Origin = flOrigin
fl3Origin[2] += 120.0
entity_get_vector(iVictim, EV_VEC_origin, fl2Origin)

// Not alive, zombie or with Godmode
if(!g_bIsAlive[iVictim] || zp_get_user_zombie(iVictim) || get_user_godmode(iVictim) || !get_can_see(fl3Origin, fl2Origin))
continue;

// Screen effects for victims
screen_effects(iVictim)

// Get scream mode
new a
if(g_modenow == 0)
{
a = g_iCvar_ScreamMode
}else{
a = 0
}
switch(a)
{
// Do damage
case 0:
{
// Scream slowdown, first should be enabled
if(g_flCvar_ScreamSlowdown > 0.0)
{
// Get his current velocity vector
static Float:flVelocity[3]
get_user_velocity(iVictim, flVelocity)

// Multiply his velocity by a number
xs_vec_mul_scalar(flVelocity, g_flCvar_ScreamSlowdown, flVelocity)

// Set his new velocity vector
set_user_velocity(iVictim, flVelocity)
}

// Get damage result
static iNewHealth
iNewHealth = max(0, get_user_health(iVictim) - g_iCvar_ScreamDmg)

// Does not has health
if(!iNewHealth)
{
// Be infected when it's going to die
if(g_iCvar_DamageMode /* == 1*/)
{
// Returns 1 on sucess...
if(zp_infect_user(iVictim, id, 0, 1))
continue
}

// Kill it
scream_kill(iVictim, id)

continue
}

// Do fake damage
set_user_health(iVictim, iNewHealth)
}

// Instantly Infect
case 1:
{
if(get_user_armor(iVictim) > 0)
{
if(get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit) >= 0) set_user_armor(iVictim,get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit))
if(get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit) < 0) set_user_armor(iVictim,0)
}else{
// Can be infected?
if(!zp_infect_user(iVictim, id, 0, 1))
{
// Kill it
scream_kill(iVictim, id)
}
}
}

// Instantly Kill
case 2:
{
// Kill it
scream_kill(iVictim, id)
}
}

}
}

/*===============================================================================
=
[Zombie Plague Forwards]
================================================================================
=*/

public zp_user_infected_post(id, infector)
{
// It's the selected zombie class
if(zp_get_user_zombie_class(id) == g_iSirenZID && !zp_get_user_nemesis(id))
{
// Array
g_bCanDoScreams[id] = true
g_bDoingScream[id] = false

// Message
client_printcolor(id, "/g[ZP]/y Ты можешь делать /gкрик/y нажава на /g^"E^"/y клавишу")
}
}

public zp_user_humanized_post(id)
{
// Reset player vars and tasks
stop_scream_task(id)

g_bCanDoScreams[id] = false
g_bDoingScream[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 = 1; id <= g_iMaxPlayers; id++)
{
// Valid connected
if(is_user_valid_connected(id))
{
// Remove mainly tasks
stop_scream_task(id)
remove_task(id+TASK_RELOAD)
}
}
}

/*===============================================================================
=
[Internal Functions]
================================================================================
=*/

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_ONE, g_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_UNRELIABLE, g_msgScreenFade, _, id)
write_short(UNIT_SECOND*1) // duration
write_short(UNIT_SECOND*1) // hold time
write_short(FFADE_IN) // fade type
write_byte(200) // r
write_byte(0) // g
write_byte(0) // b
write_byte(125) // alpha
message_end()

// Screen Shake
message_begin(MSG_ONE_UNRELIABLE, g_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.0, get_pcvar_float(cvar_reloadtime))
g_flCvar_Radius = get_pcvar_float(cvar_radius)
g_flCvar_ScreamSlowdown = get_pcvar_float(cvar_slowdown)
}

scream_kill(victim, attacker)
{
// To use later in DeathMsg event
g_bKilledByScream[victim] = true

// Do kill
ExecuteHamB(Ham_Killed, victim, attacker, GIB_NEVER)

// We don't need this
g_bKilledByScream[victim] = false
}

/*===============================================================================
=
[Stocks]
================================================================================
=*/

stock client_printcolor(id, const input[], any:...)
{
static iPlayersNum[32], iCount; iCount = 1
static szMsg[191]

vformat(szMsg, charsmax(szMsg), input, 3)

replace_all(szMsg, 190, "/g", "^4") // green txt
replace_all(szMsg, 190, "/y", "^1") // orange txt
replace_all(szMsg, 190, "/ctr", "^3") // team txt
replace_all(szMsg, 190, "/w", "^0") // team txt

if(id) iPlayersNum[0] = id
else get_players(iPlayersNum, iCount, "ch")

for (new i = 0; i < iCount; i++)
{
if (g_bIsConnected[iPlayersNum[i]])
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayersNum[i])
write_byte(iPlayersNum[i])
write_string(szMsg)
message_end()
}
}
}
public zp_round_started(gamemode)
{
if(gamemode ==MODE_INFECTION || gamemode == MODE_MULTI)
{
g_modenow = 0
}else{
g_modenow = 1
}
}
stock get_can_see(Float:ent_origin[3], Float:target_origin[3])
{
new Float:hit_origin[3]
trace_line(-1, ent_origin, target_origin, hit_origin)

if (!vector_distance(hit_origin, target_origin)) return 1;

return 0;
}

Так в чем суть вопроса то?!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Connect1507
сообщение 18.3.2012, 12:31
Сообщение #3
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

Цитата(Pakistan @ 18.3.2012, 13:14) *
Так в чем суть вопроса то?!

Помогите сделать что бы сирена наносила меньше урона своим криком(аурой)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Connect1507
сообщение 18.3.2012, 15:10
Сообщение #4
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

Ещё не как не получается поменять флаг в вип зм.
Хочу что бы вместо фалага "d" был "i"
Пробовал менять, но всё равно нечего не происходит.
Флаг d влияет на увелечение дамага.


скрытый текст
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <zombieplague>

////////// PLUGIN SETTINGS //////////
#define MODE 3
#define CHAT_PREFIX "[VIP]"

// (Only if MODE 1 is turrned OFF. Otherwise set flags in vips.ini.) //
#define VIPACCES ADMIN_LEVEL_H
#define MJACCES ADMIN_LEVEL_H
////////// SETTINGS END //////////

// Flags
#define FLAG_A (1<<0)
#define FLAG_B (1<<1)
#define FLAG_C (1<<2)
#define FLAG_D (1<<3)
#define FLAG_E (1<<4)
#define FLAG_K (1<<10)

#define VERSION "1.6"

#if cellbits == 32
const OFFSET_CLIPAMMO = 51
#else
const OFFSET_CLIPAMMO = 65
#endif
const OFFSET_LINUX_WEAPONS = 4

const DMG_HEGRENADE = (1<<24)

#if MODE & (1<<0) || MODE & (1<<1)
new amx_password_field_string[31]
#endif
#if MODE & (1<<0)
new g_user_privileges[33]
enum _:database_items
{
auth[50],
password[50],
accessflags,
flags
}
new vips_database[database_items]
new Array:database_holder
#endif
#if MODE & (1<<1)
const ZV_PLUGIN_HANDLED = 97
enum _:items
{
i_name[31],
i_description[31],
i_cost,
i_team
}
new g_register_in_zp_extra
new g_zp_extra_item_number
new g_menu_close
new extra_items[items]
new Array:items_database
new g_registered_items_count
new g_forward_return
new g_extra_item_selected
#endif
#if MODE == 3
new g_vip_buy_time
new g_vip_cost_ammo
new g_vip_buy_flags
new days
new months
new years
#endif
new const MAXCLIP[] = { -1, 13, -1, 10, 1, 7, -1, 30, 30, 1, 30, 20, 25, 30, 35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50 }
static const CONTACT[] = ""
new g_jumps, g_armor, g_killammo, g_infectammo, g_infecthealth, g_nemhealth, g_show_vips, g_unlimited_clip, g_damage_reward, g_damage_increase
new g_bit
new maxplayers, g_msgSayText
new jumpnum[33]
new bool:dojump[33]
new Float:g_damage[33]

public plugin_init() {

register_plugin("ZM VIP", VERSION, "aaarnas")
RegisterHam(Ham_Spawn, "player", "FwdHamPlayerSpawnPost", 1)
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_event("ResetHUD", "HUDReset", "be")
register_message(get_user_msgid("CurWeapon"), "message_cur_weapon")

maxplayers = get_maxplayers()
g_msgSayText = get_user_msgid("SayText")

g_jumps = register_cvar("zp_vip_jumps", "1")
g_bit = get_pcvar_num(register_cvar("zp_vip_allow_jump", "3"))
g_armor = register_cvar("zp_vip_armor", "65")
g_killammo = register_cvar("zp_vip_killammo", "2")
g_infectammo = register_cvar("zp_vip_infectammo", "2")
g_infecthealth = register_cvar("zp_vip_infecthealth", "300")
g_nemhealth = register_cvar("zp_vip_nemextra", "1")
g_show_vips = register_cvar("zp_vip_show", "1")
g_unlimited_clip = register_cvar("zp_vip_unlimited_ammo", "0")
g_damage_reward = register_cvar("zp_vip_damage_reward", "500")
g_damage_increase = register_cvar("zp_vip_damage_increase", "1.5")
register_cvar("amx_contactinfo", CONTACT, FCVAR_SERVER)
register_cvar("zp_vip_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
set_cvar_string("zp_vip_version", VERSION)
#if MODE & (1<<0) || MODE & (1<<1)
get_cvar_string("amx_password_field", amx_password_field_string, 30)
register_dictionary("zm_vip.txt")
#endif
#if MODE & (1<<0) && MODE & (1<<1)
g_vip_cost_ammo = register_cvar("zp_vip_cost_ammo", "0")
g_vip_buy_time = register_cvar("zp_vip_buy_time", "7")
g_vip_buy_flags = register_cvar("zp_vip_buy_flags", "abcd")
set_task(5.0,"check_date",0)
#endif
#if MODE & (1<<0)
register_concmd("amx_reloadvips", "reload_vips", ADMIN_CFG)
reload_vips()
#endif
#if MODE & (1<<1)
register_clcmd("say /vm", "menu_open")
g_register_in_zp_extra = register_cvar("zp_vip_register_in_zp_extra", "1")
g_menu_close = register_cvar("zp_vip_menu_close", "1")
items_database = ArrayCreate(items)

new temp[31]
formatex(temp, 30, "%L", LANG_PLAYER, "VIP_EXTRA_NAME")
if(get_pcvar_num(g_register_in_zp_extra)) g_zp_extra_item_number = zp_register_extra_item(temp, 0, 0)
g_extra_item_selected = CreateMultiForward("zv_extra_item_selected", ET_CONTINUE, FP_CELL, FP_CELL)
#endif
register_clcmd("say /vips", "print_adminlist")
register_clcmd("say /vip", "ShowMotd")
}
public plugin_cfg()
{
new directory[31]
get_configsdir(directory, 30)
server_cmd("exec %s/zm_vip.cfg", directory)
}
#if MODE & (1<<1) || MODE & (1<<0)
public plugin_natives() {
#if MODE & (1<<1)
register_native("zv_register_extra_item", "native_zv_register_extra_item", 1)
#endif
#if MODE & (1<<0)
register_native("zv_get_user_flags", "native_zv_get_user_flags", 1)
#endif
}
#endif
public FwdHamPlayerSpawnPost(id) {
#if MODE & (1<<0)
if(!(g_user_privileges[id] & FLAG_A))
#else
if(!(get_user_flags(id) & VIPACCES))
#endif
return PLUGIN_HANDLED;

if(pev(id, pev_armorvalue) < get_pcvar_num(g_armor))
set_pev(id, pev_armorvalue, float(get_pcvar_num(g_armor)))
return HAM_IGNORED;
}

public fw_PlayerKilled(victim, attacker) {
#if MODE & (1<<0)
if(is_user_alive(attacker) && g_user_privileges[attacker] & FLAG_A) {
#else
if(is_user_alive(attacker) && get_user_flags(attacker) & VIPACCES) {
#endif
if(zp_get_user_zombie(attacker) && !(zp_get_user_nemesis(attacker) && !get_pcvar_num(g_nemhealth))) fm_set_user_health(attacker, (pev(attacker, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_killammo))
}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) {

if(victim == attacker)
return HAM_IGNORED

if(damage_type & DMG_HEGRENADE)
return HAM_IGNORED

if(!is_user_connected(attacker))
return HAM_IGNORED

if(zp_get_user_zombie(attacker) || zp_get_user_survivor(attacker))
return HAM_IGNORED

#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_D) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
if(get_pcvar_num(g_damage_reward) != 0) {
g_damage[attacker]+damage
if(g_damage[attacker] > float(get_pcvar_num(g_damage_reward))) {
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker)+1)
g_damage[attacker] -= float(get_pcvar_num(g_damage_reward))
}
}
}
#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_D) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
damage *= get_pcvar_float(g_damage_increase)
SetHamParamFloat(4, damage)
}
return HAM_IGNORED

}

public zp_user_infected_post(id, infector, nemesis) {

setVip()
#if MODE & (1<<0)
if(g_user_privileges[infector] & FLAG_A) {
#else
if(get_user_flags(infector) & VIPACCES) {
#endif
fm_set_user_health(infector, (pev(infector, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(infector, zp_get_user_ammo_packs(infector) + get_pcvar_num(g_infectammo))
}
}

public client_connect(id) {

jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
#if MODE & (1<<0)
set_flags(id)
if(get_pcvar_num(g_show_vips) == 1 && g_user_privileges[id] & FLAG_A) {
#else
if(get_pcvar_num(g_show_vips) == 1 && get_user_flags(id) & VIPACCES) {
#endif
new name[100]
get_user_name(id, name, 100)
client_printcolor(0, "/g%L", LANG_PLAYER, "VIP_CONNECTED", name)
}
}
#if MODE & (1<<1)
public zp_extra_item_selected(id, item_id)
if(item_id == g_zp_extra_item_number)
menu_open(id)

public menu_open(id) {
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_E)
vip_menu(id)
else if(g_user_privileges[id] > 0) client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
#else
if(get_user_flags(id) & VIPACCES)
vip_menu(id)
#endif
#if MODE & (1<<0)
else if(get_pcvar_num(g_vip_cost_ammo) != 0)
buy_meniu(id)
#endif
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NOT_A_VIP")
return ZP_PLUGIN_HANDLED
}

public vip_menu(id)
{
if(g_registered_items_count == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
return PLUGIN_HANDLED
}
new buttons_string[16], menu_string[31], menu
formatex(menu_string, 30, "\r%L", id, "MENU_TOP")
menu = menu_create(menu_string, "vip_menu_handler")
static i, menu_item[61], team_check, num[3], ammo_packs, check
check = 0
team_check = 0
ammo_packs = zp_get_user_ammo_packs(id)
if(zp_get_user_zombie(id) && !zp_get_user_nemesis(id)) team_check |= FLAG_A
else if(!zp_get_user_zombie(id)) team_check |= FLAG_B
else if(zp_get_user_nemesis(id)) team_check |= FLAG_C
else if(zp_get_user_survivor(id)) team_check |= FLAG_D
for(i=0; i < g_registered_items_count; i++) {
ArrayGetArray(items_database, i, extra_items)
if(extra_items[i_team] == 0 || team_check & extra_items[i_team]) {
formatex(menu_item, 61, "%s \r[%s] %s[%d %L]", extra_items[i_name], extra_items[i_description], ammo_packs < extra_items[i_cost] ? "\r" : "\y", extra_items[i_cost], id, "AMMO")
formatex(num, 2, "%d", i)
menu_additem(menu, menu_item, num, 0)
check++
}
}
if(check == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NO_ITEMS")
return 1
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "NEXT")
menu_setprop(menu, MPROP_NEXTNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_BACKNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

return 1
}

public vip_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[6], iName[64], item_id, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)
item_id = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
ArrayGetArray(items_database, item_id, extra_items)
if(ammo_packs >= extra_items[i_cost]) zp_set_user_ammo_packs(id, ammo_packs - extra_items[i_cost])
else {
client_printcolor(id, "/g%s %L", CHAT_PREFIX, id, "MISSING_AMMO", extra_items[i_cost]-ammo_packs)
if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
item_id++
ExecuteForward(g_extra_item_selected, g_forward_return, id, item_id)
if (g_forward_return >= ZV_PLUGIN_HANDLED)
zp_set_user_ammo_packs(id, ammo_packs)

if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public buy_meniu(id)
{
new buttons_string[16], menu_string[101], menu_item[31], menu
formatex(menu_string, 100, "\r%L", id, "BUY_MENU_TOP", get_pcvar_num(g_vip_cost_ammo), get_pcvar_num(g_vip_buy_time))
menu = menu_create(menu_string, "buy_menu_handler")

formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE3")
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)
}

public buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new data[6], iName[64], key, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

key = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
if(key > 1) {
if(ammo_packs >= get_pcvar_num(g_vip_cost_ammo)) {
amx_tempadmin(id, key)
zp_set_user_ammo_packs(id, ammo_packs - get_pcvar_num(g_vip_cost_ammo))
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "BOUGHT_VIP", get_pcvar_num(g_vip_buy_time))

}
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "MISSING_AMMO", get_pcvar_num(g_vip_cost_ammo)-ammo_packs)
}
else {
nick_buy_meniu(id)
return PLUGIN_HANDLED
}

menu_destroy(menu)
return PLUGIN_HANDLED
}

public nick_buy_meniu(id)
{
new buttons_string[16], menu_string[151], menu_item[81], menu, client_password[21]
get_user_info(id, amx_password_field_string, client_password, 20)
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_TOP", client_password)
menu = menu_create(menu_string, "nick_buy_menu_handler")

formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE3", get_pcvar_num(g_vip_cost_ammo) ,get_pcvar_num(g_vip_buy_time))
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

}

public nick_buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
buy_meniu(id)
return PLUGIN_HANDLED
}

new data[6], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

new key = str_to_num(data)
switch(key) {
case 1: {
generate_password(id)
nick_buy_meniu(id)
}
case 2: nick_buy_meniu_sec(id)
case 3: {
amx_tempadmin(id, 1)
menu_destroy(menu)
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}
public nick_buy_meniu_sec(id)
{
new menu_string[151], menu_item[51], menu
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_SEC_TOP")
menu = menu_create(menu_string, "nick_buy_menu_sec_handler")

formatex(menu_item, 50, "%L", id, "EXIT")
menu_additem(menu, menu_item, "1", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
menu_display(id, menu, 0)
}

public nick_buy_menu_sec_handler(id, menu, item)
{
nick_buy_meniu(id)
}
#endif
public message_cur_weapon(msg_id, msg_dest, msg_entity)
{
if (!get_pcvar_num(g_unlimited_clip)) return
#if MODE & (1<<0)
if (!(g_user_privileges[msg_entity] & FLAG_C)) return
#else
if (!(get_user_flags(msg_entity) & VIPACCES)) return
#endif
if (!is_user_alive(msg_entity) || get_msg_arg_int(1) != 1) return

static weapon, clip
weapon = get_msg_arg_int(2)
clip = get_msg_arg_int(3)

if (MAXCLIP[weapon] > 2)
{
set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon])

if (clip < 2)
{
static wname[32], weapon_ent
get_weaponname(weapon, wname, sizeof wname - 1)
weapon_ent = fm_find_ent_by_owner(-1, wname, msg_entity)
fm_set_weapon_ammo(weapon_ent, MAXCLIP[weapon])
}
}
}

public HUDReset()
setVip()

public setVip()
{
new players[32], pNum
get_players(players, pNum, "a")

for (new i = 0; i < pNum; i++)
{
new id = players[i]
#if MODE & (1<<0)
if (g_user_privileges[id] & FLAG_A)
#else
if (get_user_flags(id) & VIPACCES)
#endif
{
message_begin(MSG_ALL, get_user_msgid("ScoreAttrib"))
write_byte(id)
write_byte(4)
message_end()
}
}
return PLUGIN_HANDLED
}

public print_adminlist(user)
{
new adminnames[33][32]
new message[256]
new contactinfo[256], contact[112]
new id, count, x, len

for(id = 1 ; id <= maxplayers ; id++)
if(is_user_connected(id))
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_A)
#else
if(get_user_flags(id) & VIPACCES)
#endif
get_user_name(id, adminnames[count++], 31)

len = format(message, 255, "%L ", id, "VIP_STATUS")
if(count > 0) {
for(x = 0 ; x < count ; x++) {
len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
if(len > 96 ) {
client_printcolor(user, "/g%s", message)
len = format(message, 255, "")
}
}
client_printcolor(user, "/g%s", message)
}
else {
len += format(message[len], 255-len, "%L ", id, "VIP_STATUS_N")
client_printcolor(user, "/g%s", message)
}

get_cvar_string("amx_contactinfo", contact, 63)
if(contact[0]) {
format(contactinfo, 111, "%L ", id, "VIP_STATUS_CON", contact)
client_printcolor(user, "/g%s", contactinfo)
}

}

public client_disconnect(id)
{
jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
}

public client_PreThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !g_jumps || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !g_jumps || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
new nbut = get_user_button(id)
new obut = get_user_oldbutton(id)
if((nbut & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND) && !(obut & IN_JUMP))
{
if(jumpnum[id] < get_pcvar_num(g_jumps) &&
((g_bit & FLAG_D && zp_get_user_nemesis(id)) ||
(g_bit & FLAG_C && zp_get_user_survivor(id)) ||
(g_bit & FLAG_A && !zp_get_user_zombie(id)) ||
(g_bit & FLAG_B && zp_get_user_zombie(id) && !zp_get_user_nemesis(id))))
{
dojump[id] = true
jumpnum[id]++
return PLUGIN_CONTINUE
}
}
if((nbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND))
{
jumpnum[id] = 0
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public client_PostThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
if(dojump[id] == true)
{
new Float:velocity[3]
entity_get_vector(id,EV_VEC_velocity,velocity)
velocity[2] = random_float(265.0,285.0)
entity_set_vector(id,EV_VEC_velocity,velocity)
dojump[id] = false
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public ShowMotd(id)
show_motd(id, "vip.txt")
#if MODE & (1<<0)
public reload_vips() {

if(database_holder) ArrayDestroy(database_holder)
database_holder = ArrayCreate(database_items)
new configsDir[64]
get_configsdir(configsDir, 63)
format(configsDir, 63, "%s/vips.ini", configsDir)

new File=fopen(configsDir,"r");

if (File)
{
static Text[512], Flags[32], AuthData[50], Privileges_Flags[32], Password[50]
while (!feof(File))
{
fgets(File,Text,sizeof(Text)-1);

trim(Text);

// comment
if (Text[0]==';')
{
continue;
}

Flags[0]=0;
AuthData[0]=0;
Privileges_Flags[0]=0;
Password[0]=0;

// not enough parameters
if (parse(Text,AuthData,sizeof(AuthData)-1,Password,sizeof(Password)-1,Privileges_Flags,sizeof(Privileges_Flags)-1,Flags,sizeof(Flags)-1) < 2)
{
continue;
}

vips_database[auth] = AuthData
vips_database[password] = Password
vips_database[accessflags] = read_flags(Privileges_Flags)
vips_database[flags] = read_flags(Flags)
ArrayPushArray(database_holder, vips_database)
}

fclose(File);
}
else log_amx("Error: vips.ini file doesn't exist")
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public check_date()
{
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new todaysdaynum = str_to_num(todaysday)
new todaysmonthnum = str_to_num(todaysmonth)
new todaysyearnum = str_to_num(todaysyear)
new alltogether[200]
format(alltogether,199,"m%dd%dy%d",todaysmonthnum,todaysdaynum,todaysyearnum)

new configdir[200]
get_configsdir(configdir,199)

new configfile1[200]

format(configfile1,199,"%s/vips.ini",configdir)

new text[512], len
new pnum = file_size(configfile1,1)
for(new i = 1; i < pnum; i++)
{
read_file(configfile1, i, text, 511, len)
if ( contain(text, alltogether) != -1 )
{
DeleteLine(configfile1, i)
}
}
return PLUGIN_HANDLED
}

public amx_tempadmin(id, type)
{
new authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new day = str_to_num(todaysday)
months = str_to_num(todaysmonth)
years = str_to_num(todaysyear)
days = day + get_pcvar_num(g_vip_buy_time)

if(get_pcvar_num(g_vip_buy_time) == 0 || get_pcvar_num(g_vip_buy_time)>=900)
{
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"",name,client_password,p_flags)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"",authid,p_flags)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"",ip,p_flags)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

switch(months) {
case 1: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 2: {
if(days>28)
{
february(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 3: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 4: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 5: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 6: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 7: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 8: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 9: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 10: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 11: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 12: {
if(days>31)
{
december(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}

public makenewdate(id, type)
{
new alltogether[200], authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
format(alltogether,199,"m%dd%dy%d",months,days,years)
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"; Exp: %s",name,client_password,p_flags,alltogether)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"; Exp: %s",authid,p_flags,alltogether)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"; Exp: %s",ip,p_flags,alltogether)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

public december(id, type)
{
if(days>31)
{
days = days - 31
months = 1
years = years + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirtyone(id, type)
{
if(days>31)
{
days = days - 31
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirty(id, type)
{
if(days>30)
{
days = days - 30
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public february(id, type)
{
if(days>28)
{
days = days - 28
months = 3
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public newyear(id, type)
{
if(days>31)
{
days = days - 31
years = years + 1
months = 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public select_days(id, type)
{
switch(months) {
case 1, 4, 5, 7, 8, 10: thirtyone(id, type)
case 2: february(id, type)
case 3, 6, 9, 11: thirty(id, type)
case 12: newyear(id, type)
}
return PLUGIN_HANDLED
}

DeleteLine( const szFilename[ ], const iLine )
{
new iFile = fopen( szFilename, "rt" );
if( !iFile )
{
return;
}
static const szTempFilename[ ] = "delete_line.txt";
new iTempFile = fopen( szTempFilename, "wt" );

new szData[ 256 ], iLineCount, bool:bReplaced = false;
while( !feof( iFile ) )
{
fgets( iFile, szData, 255 );

if( iLineCount++ == iLine )
{
bReplaced = true;
}
else
{
fputs( iTempFile, szData );
}
}

fclose( iFile );
fclose( iTempFile );

if( bReplaced )
{
delete_file( szFilename );

while( !rename_file( szTempFilename, szFilename, 1 ) ) { }
}
else
{
delete_file( szTempFilename );
}
}
#endif
stock fm_set_user_health(id, health)
{
(health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
}

stock client_printcolor(const id, const input[], any:...)
{

new iCount = 1, iPlayers[32]

static szMsg[191]
vformat(szMsg, charsmax(szMsg), input, 3)

replace_all(szMsg, 190, "/g", "^4") // green txt
replace_all(szMsg, 190, "/y", "^1") // orange txt
replace_all(szMsg, 190, "/ctr", "^3") // team txt
replace_all(szMsg, 190, "/w", "^0") // team txt

if(id) iPlayers[0] = id
else get_players(iPlayers, iCount, "ch")

for (new i = 0; i < iCount; i++)
{
if (is_user_connected(iPlayers[i]))
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayers[i])
write_byte(iPlayers[i])
write_string(szMsg)
message_end()
}
}
}

stock fm_find_ent_by_owner(entity, const classname[], owner)
{
while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) {}

return entity;
}

stock fm_set_weapon_ammo(entity, amount)
{
set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
}
#if MODE & (1<<0)
public set_flags(id) {

static authid[31], ip[31], name[51], index, client_password[31], size, log_flags[11]
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 30)

g_user_privileges[id] = 0
size = ArraySize(database_holder)
for(index=0; index < size ; index++) {
ArrayGetArray(database_holder, index, vips_database)
if(vips_database[flags] & FLAG_D) {
if(equal(ip, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else if(vips_database[flags] & FLAG_C) {
if(equal(authid, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if(vips_database[flags] & FLAG_K) {
if((vips_database[flags] & FLAG_B && contain(name, vips_database[auth]) != -1) || equal(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if((vips_database[flags] & FLAG_B && containi(name, vips_database[auth]) != -1) || equali(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
}
}
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
stock generate_password(id) {

new password_holder[31]
formatex(password_holder, 30, "%d%d%d%d%d", random(9), random(9), random(9), random(9), random(9))
client_cmd(id, "setinfo %s %s", amx_password_field_string, password_holder)
}
#endif
#if MODE & (1<<0)
public native_zv_get_user_flags(id)
return g_user_privileges[id]
#endif
#if MODE & (1<<1)
public native_zv_register_extra_item(const item_name[], const item_discription[], item_cost, item_team)
{
param_convert(1)
param_convert(2)
copy(extra_items[i_name], 30, item_name)
copy(extra_items[i_description], 30, item_discription)
extra_items[i_cost] = item_cost
extra_items[i_team] = item_team
ArrayPushArray(items_database, extra_items)
g_registered_items_count++

return g_registered_items_count
}
#endif


А вот что я сделал:
скрытый текст
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <zombieplague>

////////// PLUGIN SETTINGS //////////
#define MODE 3
#define CHAT_PREFIX "[VIP]"

// (Only if MODE 1 is turrned OFF. Otherwise set flags in vips.ini.) //
#define VIPACCES ADMIN_LEVEL_H
#define MJACCES ADMIN_LEVEL_H
////////// SETTINGS END //////////

// Flags
#define FLAG_A (1<<0)
#define FLAG_B (1<<1)
#define FLAG_C (1<<2)
#define FLAG_I (1<<3)
#define FLAG_E (1<<4)
#define FLAG_K (1<<10)

#define VERSION "1.6"

#if cellbits == 32
const OFFSET_CLIPAMMO = 51
#else
const OFFSET_CLIPAMMO = 65
#endif
const OFFSET_LINUX_WEAPONS = 4

const DMG_HEGRENADE = (1<<24)

#if MODE & (1<<0) || MODE & (1<<1)
new amx_password_field_string[31]
#endif
#if MODE & (1<<0)
new g_user_privileges[33]
enum _:database_items
{
auth[50],
password[50],
accessflags,
flags
}
new vips_database[database_items]
new Array:database_holder
#endif
#if MODE & (1<<1)
const ZV_PLUGIN_HANDLED = 97
enum _:items
{
i_name[31],
i_description[31],
i_cost,
i_team
}
new g_register_in_zp_extra
new g_zp_extra_item_number
new g_menu_close
new extra_items[items]
new Array:items_database
new g_registered_items_count
new g_forward_return
new g_extra_item_selected
#endif
#if MODE == 3
new g_vip_buy_time
new g_vip_cost_ammo
new g_vip_buy_flags
new days
new months
new years
#endif
new const MAXCLIP[] = { -1, 13, -1, 10, 1, 7, -1, 30, 30, 1, 30, 20, 25, 30, 35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50 }
static const CONTACT[] = ""
new g_jumps, g_armor, g_killammo, g_infectammo, g_infecthealth, g_nemhealth, g_show_vips, g_unlimited_clip, g_damage_reward, g_damage_increase
new g_bit
new maxplayers, g_msgSayText
new jumpnum[33]
new bool:dojump[33]
new Float:g_damage[33]

public plugin_init() {

register_plugin("ZM VIP", VERSION, "aaarnas")
RegisterHam(Ham_Spawn, "player", "FwdHamPlayerSpawnPost", 1)
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_event("ResetHUD", "HUDReset", "be")
register_message(get_user_msgid("CurWeapon"), "message_cur_weapon")

maxplayers = get_maxplayers()
g_msgSayText = get_user_msgid("SayText")

g_jumps = register_cvar("zp_vip_jumps", "1")
g_bit = get_pcvar_num(register_cvar("zp_vip_allow_jump", "3"))
g_armor = register_cvar("zp_vip_armor", "65")
g_killammo = register_cvar("zp_vip_killammo", "2")
g_infectammo = register_cvar("zp_vip_infectammo", "2")
g_infecthealth = register_cvar("zp_vip_infecthealth", "300")
g_nemhealth = register_cvar("zp_vip_nemextra", "1")
g_show_vips = register_cvar("zp_vip_show", "1")
g_unlimited_clip = register_cvar("zp_vip_unlimited_ammo", "0")
g_damage_reward = register_cvar("zp_vip_damage_reward", "500")
g_damage_increase = register_cvar("zp_vip_damage_increase", "1.5")
register_cvar("amx_contactinfo", CONTACT, FCVAR_SERVER)
register_cvar("zp_vip_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
set_cvar_string("zp_vip_version", VERSION)
#if MODE & (1<<0) || MODE & (1<<1)
get_cvar_string("amx_password_field", amx_password_field_string, 30)
register_dictionary("zm_vip.txt")
#endif
#if MODE & (1<<0) && MODE & (1<<1)
g_vip_cost_ammo = register_cvar("zp_vip_cost_ammo", "0")
g_vip_buy_time = register_cvar("zp_vip_buy_time", "7")
g_vip_buy_flags = register_cvar("zp_vip_buy_flags", "abci")
set_task(5.0,"check_date",0)
#endif
#if MODE & (1<<0)
register_concmd("amx_reloadvips", "reload_vips", ADMIN_CFG)
reload_vips()
#endif
#if MODE & (1<<1)
register_clcmd("say /vm", "menu_open")
g_register_in_zp_extra = register_cvar("zp_vip_register_in_zp_extra", "1")
g_menu_close = register_cvar("zp_vip_menu_close", "1")
items_database = ArrayCreate(items)

new temp[31]
formatex(temp, 30, "%L", LANG_PLAYER, "VIP_EXTRA_NAME")
if(get_pcvar_num(g_register_in_zp_extra)) g_zp_extra_item_number = zp_register_extra_item(temp, 0, 0)
g_extra_item_selected = CreateMultiForward("zv_extra_item_selected", ET_CONTINUE, FP_CELL, FP_CELL)
#endif
register_clcmd("say /vips", "print_adminlist")
register_clcmd("say /vip", "ShowMotd")
}
public plugin_cfg()
{
new directory[31]
get_configsdir(directory, 30)
server_cmd("exec %s/zm_vip.cfg", directory)
}
#if MODE & (1<<1) || MODE & (1<<0)
public plugin_natives() {
#if MODE & (1<<1)
register_native("zv_register_extra_item", "native_zv_register_extra_item", 1)
#endif
#if MODE & (1<<0)
register_native("zv_get_user_flags", "native_zv_get_user_flags", 1)
#endif
}
#endif
public FwdHamPlayerSpawnPost(id) {
#if MODE & (1<<0)
if(!(g_user_privileges[id] & FLAG_A))
#else
if(!(get_user_flags(id) & VIPACCES))
#endif
return PLUGIN_HANDLED;

if(pev(id, pev_armorvalue) < get_pcvar_num(g_armor))
set_pev(id, pev_armorvalue, float(get_pcvar_num(g_armor)))
return HAM_IGNORED;
}

public fw_PlayerKilled(victim, attacker) {
#if MODE & (1<<0)
if(is_user_alive(attacker) && g_user_privileges[attacker] & FLAG_A) {
#else
if(is_user_alive(attacker) && get_user_flags(attacker) & VIPACCES) {
#endif
if(zp_get_user_zombie(attacker) && !(zp_get_user_nemesis(attacker) && !get_pcvar_num(g_nemhealth))) fm_set_user_health(attacker, (pev(attacker, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_killammo))
}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) {

if(victim == attacker)
return HAM_IGNORED

if(damage_type & DMG_HEGRENADE)
return HAM_IGNORED

if(!is_user_connected(attacker))
return HAM_IGNORED

if(zp_get_user_zombie(attacker) || zp_get_user_survivor(attacker))
return HAM_IGNORED

#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_I) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
if(get_pcvar_num(g_damage_reward) != 0) {
g_damage[attacker]+damage
if(g_damage[attacker] > float(get_pcvar_num(g_damage_reward))) {
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker)+1)
g_damage[attacker] -= float(get_pcvar_num(g_damage_reward))
}
}
}
#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_I) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
damage *= get_pcvar_float(g_damage_increase)
SetHamParamFloat(4, damage)
}
return HAM_IGNORED

}

public zp_user_infected_post(id, infector, nemesis) {

setVip()
#if MODE & (1<<0)
if(g_user_privileges[infector] & FLAG_A) {
#else
if(get_user_flags(infector) & VIPACCES) {
#endif
fm_set_user_health(infector, (pev(infector, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(infector, zp_get_user_ammo_packs(infector) + get_pcvar_num(g_infectammo))
}
}

public client_connect(id) {

jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
#if MODE & (1<<0)
set_flags(id)
if(get_pcvar_num(g_show_vips) == 1 && g_user_privileges[id] & FLAG_A) {
#else
if(get_pcvar_num(g_show_vips) == 1 && get_user_flags(id) & VIPACCES) {
#endif
new name[100]
get_user_name(id, name, 100)
client_printcolor(0, "/g%L", LANG_PLAYER, "VIP_CONNECTED", name)
}
}
#if MODE & (1<<1)
public zp_extra_item_selected(id, item_id)
if(item_id == g_zp_extra_item_number)
menu_open(id)

public menu_open(id) {
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_E)
vip_menu(id)
else if(g_user_privileges[id] > 0) client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
#else
if(get_user_flags(id) & VIPACCES)
vip_menu(id)
#endif
#if MODE & (1<<0)
else if(get_pcvar_num(g_vip_cost_ammo) != 0)
buy_meniu(id)
#endif
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NOT_A_VIP")
return ZP_PLUGIN_HANDLED
}

public vip_menu(id)
{
if(g_registered_items_count == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
return PLUGIN_HANDLED
}
new buttons_string[16], menu_string[31], menu
formatex(menu_string, 30, "\r%L", id, "MENU_TOP")
menu = menu_create(menu_string, "vip_menu_handler")
static i, menu_item[61], team_check, num[3], ammo_packs, check
check = 0
team_check = 0
ammo_packs = zp_get_user_ammo_packs(id)
if(zp_get_user_zombie(id) && !zp_get_user_nemesis(id)) team_check |= FLAG_A
else if(!zp_get_user_zombie(id)) team_check |= FLAG_B
else if(zp_get_user_nemesis(id)) team_check |= FLAG_C
else if(zp_get_user_survivor(id)) team_check |= FLAG_I
for(i=0; i < g_registered_items_count; i++) {
ArrayGetArray(items_database, i, extra_items)
if(extra_items[i_team] == 0 || team_check & extra_items[i_team]) {
formatex(menu_item, 61, "%s \r[%s] %s[%d %L]", extra_items[i_name], extra_items[i_description], ammo_packs < extra_items[i_cost] ? "\r" : "\y", extra_items[i_cost], id, "AMMO")
formatex(num, 2, "%d", i)
menu_additem(menu, menu_item, num, 0)
check++
}
}
if(check == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NO_ITEMS")
return 1
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "NEXT")
menu_setprop(menu, MPROP_NEXTNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_BACKNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

return 1
}

public vip_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[6], iName[64], item_id, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)
item_id = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
ArrayGetArray(items_database, item_id, extra_items)
if(ammo_packs >= extra_items[i_cost]) zp_set_user_ammo_packs(id, ammo_packs - extra_items[i_cost])
else {
client_printcolor(id, "/g%s %L", CHAT_PREFIX, id, "MISSING_AMMO", extra_items[i_cost]-ammo_packs)
if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
item_id++
ExecuteForward(g_extra_item_selected, g_forward_return, id, item_id)
if (g_forward_return >= ZV_PLUGIN_HANDLED)
zp_set_user_ammo_packs(id, ammo_packs)

if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public buy_meniu(id)
{
new buttons_string[16], menu_string[101], menu_item[31], menu
formatex(menu_string, 100, "\r%L", id, "BUY_MENU_TOP", get_pcvar_num(g_vip_cost_ammo), get_pcvar_num(g_vip_buy_time))
menu = menu_create(menu_string, "buy_menu_handler")

formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE3")
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)
}

public buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new data[6], iName[64], key, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

key = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
if(key > 1) {
if(ammo_packs >= get_pcvar_num(g_vip_cost_ammo)) {
amx_tempadmin(id, key)
zp_set_user_ammo_packs(id, ammo_packs - get_pcvar_num(g_vip_cost_ammo))
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "BOUGHT_VIP", get_pcvar_num(g_vip_buy_time))

}
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "MISSING_AMMO", get_pcvar_num(g_vip_cost_ammo)-ammo_packs)
}
else {
nick_buy_meniu(id)
return PLUGIN_HANDLED
}

menu_destroy(menu)
return PLUGIN_HANDLED
}

public nick_buy_meniu(id)
{
new buttons_string[16], menu_string[151], menu_item[81], menu, client_password[21]
get_user_info(id, amx_password_field_string, client_password, 20)
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_TOP", client_password)
menu = menu_create(menu_string, "nick_buy_menu_handler")

formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE3", get_pcvar_num(g_vip_cost_ammo) ,get_pcvar_num(g_vip_buy_time))
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

}

public nick_buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
buy_meniu(id)
return PLUGIN_HANDLED
}

new data[6], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

new key = str_to_num(data)
switch(key) {
case 1: {
generate_password(id)
nick_buy_meniu(id)
}
case 2: nick_buy_meniu_sec(id)
case 3: {
amx_tempadmin(id, 1)
menu_destroy(menu)
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}
public nick_buy_meniu_sec(id)
{
new menu_string[151], menu_item[51], menu
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_SEC_TOP")
menu = menu_create(menu_string, "nick_buy_menu_sec_handler")

formatex(menu_item, 50, "%L", id, "EXIT")
menu_additem(menu, menu_item, "1", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
menu_display(id, menu, 0)
}

public nick_buy_menu_sec_handler(id, menu, item)
{
nick_buy_meniu(id)
}
#endif
public message_cur_weapon(msg_id, msg_dest, msg_entity)
{
if (!get_pcvar_num(g_unlimited_clip)) return
#if MODE & (1<<0)
if (!(g_user_privileges[msg_entity] & FLAG_C)) return
#else
if (!(get_user_flags(msg_entity) & VIPACCES)) return
#endif
if (!is_user_alive(msg_entity) || get_msg_arg_int(1) != 1) return

static weapon, clip
weapon = get_msg_arg_int(2)
clip = get_msg_arg_int(3)

if (MAXCLIP[weapon] > 2)
{
set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon])

if (clip < 2)
{
static wname[32], weapon_ent
get_weaponname(weapon, wname, sizeof wname - 1)
weapon_ent = fm_find_ent_by_owner(-1, wname, msg_entity)
fm_set_weapon_ammo(weapon_ent, MAXCLIP[weapon])
}
}
}

public HUDReset()
setVip()

public setVip()
{
new players[32], pNum
get_players(players, pNum, "a")

for (new i = 0; i < pNum; i++)
{
new id = players[i]
#if MODE & (1<<0)
if (g_user_privileges[id] & FLAG_A)
#else
if (get_user_flags(id) & VIPACCES)
#endif
{
message_begin(MSG_ALL, get_user_msgid("ScoreAttrib"))
write_byte(id)
write_byte(4)
message_end()
}
}
return PLUGIN_HANDLED
}

public print_adminlist(user)
{
new adminnames[33][32]
new message[256]
new contactinfo[256], contact[112]
new id, count, x, len

for(id = 1 ; id <= maxplayers ; id++)
if(is_user_connected(id))
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_A)
#else
if(get_user_flags(id) & VIPACCES)
#endif
get_user_name(id, adminnames[count++], 31)

len = format(message, 255, "%L ", id, "VIP_STATUS")
if(count > 0) {
for(x = 0 ; x < count ; x++) {
len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
if(len > 96 ) {
client_printcolor(user, "/g%s", message)
len = format(message, 255, "")
}
}
client_printcolor(user, "/g%s", message)
}
else {
len += format(message[len], 255-len, "%L ", id, "VIP_STATUS_N")
client_printcolor(user, "/g%s", message)
}

get_cvar_string("amx_contactinfo", contact, 63)
if(contact[0]) {
format(contactinfo, 111, "%L ", id, "VIP_STATUS_CON", contact)
client_printcolor(user, "/g%s", contactinfo)
}

}

public client_disconnect(id)
{
jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
}

public client_PreThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !g_jumps || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !g_jumps || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
new nbut = get_user_button(id)
new obut = get_user_oldbutton(id)
if((nbut & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND) && !(obut & IN_JUMP))
{
if(jumpnum[id] < get_pcvar_num(g_jumps) &&
((g_bit & FLAG_I && zp_get_user_nemesis(id)) ||
(g_bit & FLAG_C && zp_get_user_survivor(id)) ||
(g_bit & FLAG_A && !zp_get_user_zombie(id)) ||
(g_bit & FLAG_B && zp_get_user_zombie(id) && !zp_get_user_nemesis(id))))
{
dojump[id] = true
jumpnum[id]++
return PLUGIN_CONTINUE
}
}
if((nbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND))
{
jumpnum[id] = 0
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public client_PostThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
if(dojump[id] == true)
{
new Float:velocity[3]
entity_get_vector(id,EV_VEC_velocity,velocity)
velocity[2] = random_float(265.0,285.0)
entity_set_vector(id,EV_VEC_velocity,velocity)
dojump[id] = false
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public ShowMotd(id)
show_motd(id, "vip.txt")
#if MODE & (1<<0)
public reload_vips() {

if(database_holder) ArrayDestroy(database_holder)
database_holder = ArrayCreate(database_items)
new configsDir[64]
get_configsdir(configsDir, 63)
format(configsDir, 63, "%s/vips.ini", configsDir)

new File=fopen(configsDir,"r");

if (File)
{
static Text[512], Flags[32], AuthData[50], Privileges_Flags[32], Password[50]
while (!feof(File))
{
fgets(File,Text,sizeof(Text)-1);

trim(Text);

// comment
if (Text[0]==';')
{
continue;
}

Flags[0]=0;
AuthData[0]=0;
Privileges_Flags[0]=0;
Password[0]=0;

// not enough parameters
if (parse(Text,AuthData,sizeof(AuthData)-1,Password,sizeof(Password)-1,Privileges_Flags,sizeof(Privileges_Flags)-1,Flags,sizeof(Flags)-1) < 2)
{
continue;
}

vips_database[auth] = AuthData
vips_database[password] = Password
vips_database[accessflags] = read_flags(Privileges_Flags)
vips_database[flags] = read_flags(Flags)
ArrayPushArray(database_holder, vips_database)
}

fclose(File);
}
else log_amx("Error: vips.ini file doesn't exist")
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public check_date()
{
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new todaysdaynum = str_to_num(todaysday)
new todaysmonthnum = str_to_num(todaysmonth)
new todaysyearnum = str_to_num(todaysyear)
new alltogether[200]
format(alltogether,199,"m%dd%dy%d",todaysmonthnum,todaysdaynum,todaysyearnum)

new configdir[200]
get_configsdir(configdir,199)

new configfile1[200]

format(configfile1,199,"%s/vips.ini",configdir)

new text[512], len
new pnum = file_size(configfile1,1)
for(new i = 1; i < pnum; i++)
{
read_file(configfile1, i, text, 511, len)
if ( contain(text, alltogether) != -1 )
{
DeleteLine(configfile1, i)
}
}
return PLUGIN_HANDLED
}

public amx_tempadmin(id, type)
{
new authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new day = str_to_num(todaysday)
months = str_to_num(todaysmonth)
years = str_to_num(todaysyear)
days = day + get_pcvar_num(g_vip_buy_time)

if(get_pcvar_num(g_vip_buy_time) == 0 || get_pcvar_num(g_vip_buy_time)>=900)
{
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"",name,client_password,p_flags)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"",authid,p_flags)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"",ip,p_flags)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

switch(months) {
case 1: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 2: {
if(days>28)
{
february(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 3: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 4: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 5: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 6: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 7: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 8: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 9: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 10: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 11: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 12: {
if(days>31)
{
december(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}

public makenewdate(id, type)
{
new alltogether[200], authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
format(alltogether,199,"m%dd%dy%d",months,days,years)
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"; Exp: %s",name,client_password,p_flags,alltogether)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"; Exp: %s",authid,p_flags,alltogether)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"; Exp: %s",ip,p_flags,alltogether)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

public december(id, type)
{
if(days>31)
{
days = days - 31
months = 1
years = years + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirtyone(id, type)
{
if(days>31)
{
days = days - 31
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirty(id, type)
{
if(days>30)
{
days = days - 30
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public february(id, type)
{
if(days>28)
{
days = days - 28
months = 3
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public newyear(id, type)
{
if(days>31)
{
days = days - 31
years = years + 1
months = 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public select_days(id, type)
{
switch(months) {
case 1, 4, 5, 7, 8, 10: thirtyone(id, type)
case 2: february(id, type)
case 3, 6, 9, 11: thirty(id, type)
case 12: newyear(id, type)
}
return PLUGIN_HANDLED
}

DeleteLine( const szFilename[ ], const iLine )
{
new iFile = fopen( szFilename, "rt" );
if( !iFile )
{
return;
}
static const szTempFilename[ ] = "delete_line.txt";
new iTempFile = fopen( szTempFilename, "wt" );

new szData[ 256 ], iLineCount, bool:bReplaced = false;
while( !feof( iFile ) )
{
fgets( iFile, szData, 255 );

if( iLineCount++ == iLine )
{
bReplaced = true;
}
else
{
fputs( iTempFile, szData );
}
}

fclose( iFile );
fclose( iTempFile );

if( bReplaced )
{
delete_file( szFilename );

while( !rename_file( szTempFilename, szFilename, 1 ) ) { }
}
else
{
delete_file( szTempFilename );
}
}
#endif
stock fm_set_user_health(id, health)
{
(health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
}

stock client_printcolor(const id, const input[], any:...)
{

new iCount = 1, iPlayers[32]

static szMsg[191]
vformat(szMsg, charsmax(szMsg), input, 3)

replace_all(szMsg, 190, "/g", "^4") // green txt
replace_all(szMsg, 190, "/y", "^1") // orange txt
replace_all(szMsg, 190, "/ctr", "^3") // team txt
replace_all(szMsg, 190, "/w", "^0") // team txt

if(id) iPlayers[0] = id
else get_players(iPlayers, iCount, "ch")

for (new i = 0; i < iCount; i++)
{
if (is_user_connected(iPlayers[i]))
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayers[i])
write_byte(iPlayers[i])
write_string(szMsg)
message_end()
}
}
}

stock fm_find_ent_by_owner(entity, const classname[], owner)
{
while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) {}

return entity;
}

stock fm_set_weapon_ammo(entity, amount)
{
set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
}
#if MODE & (1<<0)
public set_flags(id) {

static authid[31], ip[31], name[51], index, client_password[31], size, log_flags[11]
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 30)

g_user_privileges[id] = 0
size = ArraySize(database_holder)
for(index=0; index < size ; index++) {
ArrayGetArray(database_holder, index, vips_database)
if(vips_database[flags] & FLAG_I) {
if(equal(ip, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else if(vips_database[flags] & FLAG_C) {
if(equal(authid, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if(vips_database[flags] & FLAG_K) {
if((vips_database[flags] & FLAG_B && contain(name, vips_database[auth]) != -1) || equal(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if((vips_database[flags] & FLAG_B && containi(name, vips_database[auth]) != -1) || equali(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
}
}
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
stock generate_password(id) {

new password_holder[31]
formatex(password_holder, 30, "%d%d%d%d%d", random(9), random(9), random(9), random(9), random(9))
client_cmd(id, "setinfo %s %s", amx_password_field_string, password_holder)
}
#endif
#if MODE & (1<<0)
public native_zv_get_user_flags(id)
return g_user_privileges[id]
#endif
#if MODE & (1<<1)
public native_zv_register_extra_item(const item_name[], const item_discription[], item_cost, item_team)
{
param_convert(1)
param_convert(2)
copy(extra_items[i_name], 30, item_name)
copy(extra_items[i_description], 30, item_discription)
extra_items[i_cost] = item_cost
extra_items[i_team] = item_team
ArrayPushArray(items_database, extra_items)
g_registered_items_count++

return g_registered_items_count
}
#endif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Pakistan
сообщение 19.3.2012, 7:04
Сообщение #5
Стаж: 14 лет

Сообщений: 808
Благодарностей: 246
Полезность: 554

Цитата(Connect1507 @ 18.3.2012, 16:10) *
Ещё не как не получается поменять флаг в вип зм.
Хочу что бы вместо фалага "d" был "i"
Пробовал менять, но всё равно нечего не происходит.
Флаг d влияет на увелечение дамага.


скрытый текст
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <zombieplague>

////////// PLUGIN SETTINGS //////////
#define MODE 3
#define CHAT_PREFIX "[VIP]"

// (Only if MODE 1 is turrned OFF. Otherwise set flags in vips.ini.) //
#define VIPACCES ADMIN_LEVEL_H
#define MJACCES ADMIN_LEVEL_H
////////// SETTINGS END //////////

// Flags
#define FLAG_A (1<<0)
#define FLAG_B (1<<1)
#define FLAG_C (1<<2)
#define FLAG_D (1<<3)
#define FLAG_E (1<<4)
#define FLAG_K (1<<10)

#define VERSION "1.6"

#if cellbits == 32
const OFFSET_CLIPAMMO = 51
#else
const OFFSET_CLIPAMMO = 65
#endif
const OFFSET_LINUX_WEAPONS = 4

const DMG_HEGRENADE = (1<<24)

#if MODE & (1<<0) || MODE & (1<<1)
new amx_password_field_string[31]
#endif
#if MODE & (1<<0)
new g_user_privileges[33]
enum _:database_items
{
auth[50],
password[50],
accessflags,
flags
}
new vips_database[database_items]
new Array:database_holder
#endif
#if MODE & (1<<1)
const ZV_PLUGIN_HANDLED = 97
enum _:items
{
i_name[31],
i_description[31],
i_cost,
i_team
}
new g_register_in_zp_extra
new g_zp_extra_item_number
new g_menu_close
new extra_items[items]
new Array:items_database
new g_registered_items_count
new g_forward_return
new g_extra_item_selected
#endif
#if MODE == 3
new g_vip_buy_time
new g_vip_cost_ammo
new g_vip_buy_flags
new days
new months
new years
#endif
new const MAXCLIP[] = { -1, 13, -1, 10, 1, 7, -1, 30, 30, 1, 30, 20, 25, 30, 35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50 }
static const CONTACT[] = ""
new g_jumps, g_armor, g_killammo, g_infectammo, g_infecthealth, g_nemhealth, g_show_vips, g_unlimited_clip, g_damage_reward, g_damage_increase
new g_bit
new maxplayers, g_msgSayText
new jumpnum[33]
new bool:dojump[33]
new Float:g_damage[33]

public plugin_init() {

register_plugin("ZM VIP", VERSION, "aaarnas")
RegisterHam(Ham_Spawn, "player", "FwdHamPlayerSpawnPost", 1)
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_event("ResetHUD", "HUDReset", "be")
register_message(get_user_msgid("CurWeapon"), "message_cur_weapon")

maxplayers = get_maxplayers()
g_msgSayText = get_user_msgid("SayText")

g_jumps = register_cvar("zp_vip_jumps", "1")
g_bit = get_pcvar_num(register_cvar("zp_vip_allow_jump", "3"))
g_armor = register_cvar("zp_vip_armor", "65")
g_killammo = register_cvar("zp_vip_killammo", "2")
g_infectammo = register_cvar("zp_vip_infectammo", "2")
g_infecthealth = register_cvar("zp_vip_infecthealth", "300")
g_nemhealth = register_cvar("zp_vip_nemextra", "1")
g_show_vips = register_cvar("zp_vip_show", "1")
g_unlimited_clip = register_cvar("zp_vip_unlimited_ammo", "0")
g_damage_reward = register_cvar("zp_vip_damage_reward", "500")
g_damage_increase = register_cvar("zp_vip_damage_increase", "1.5")
register_cvar("amx_contactinfo", CONTACT, FCVAR_SERVER)
register_cvar("zp_vip_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
set_cvar_string("zp_vip_version", VERSION)
#if MODE & (1<<0) || MODE & (1<<1)
get_cvar_string("amx_password_field", amx_password_field_string, 30)
register_dictionary("zm_vip.txt")
#endif
#if MODE & (1<<0) && MODE & (1<<1)
g_vip_cost_ammo = register_cvar("zp_vip_cost_ammo", "0")
g_vip_buy_time = register_cvar("zp_vip_buy_time", "7")
g_vip_buy_flags = register_cvar("zp_vip_buy_flags", "abcd")
set_task(5.0,"check_date",0)
#endif
#if MODE & (1<<0)
register_concmd("amx_reloadvips", "reload_vips", ADMIN_CFG)
reload_vips()
#endif
#if MODE & (1<<1)
register_clcmd("say /vm", "menu_open")
g_register_in_zp_extra = register_cvar("zp_vip_register_in_zp_extra", "1")
g_menu_close = register_cvar("zp_vip_menu_close", "1")
items_database = ArrayCreate(items)

new temp[31]
formatex(temp, 30, "%L", LANG_PLAYER, "VIP_EXTRA_NAME")
if(get_pcvar_num(g_register_in_zp_extra)) g_zp_extra_item_number = zp_register_extra_item(temp, 0, 0)
g_extra_item_selected = CreateMultiForward("zv_extra_item_selected", ET_CONTINUE, FP_CELL, FP_CELL)
#endif
register_clcmd("say /vips", "print_adminlist")
register_clcmd("say /vip", "ShowMotd")
}
public plugin_cfg()
{
new directory[31]
get_configsdir(directory, 30)
server_cmd("exec %s/zm_vip.cfg", directory)
}
#if MODE & (1<<1) || MODE & (1<<0)
public plugin_natives() {
#if MODE & (1<<1)
register_native("zv_register_extra_item", "native_zv_register_extra_item", 1)
#endif
#if MODE & (1<<0)
register_native("zv_get_user_flags", "native_zv_get_user_flags", 1)
#endif
}
#endif
public FwdHamPlayerSpawnPost(id) {
#if MODE & (1<<0)
if(!(g_user_privileges[id] & FLAG_A))
#else
if(!(get_user_flags(id) & VIPACCES))
#endif
return PLUGIN_HANDLED;

if(pev(id, pev_armorvalue) < get_pcvar_num(g_armor))
set_pev(id, pev_armorvalue, float(get_pcvar_num(g_armor)))
return HAM_IGNORED;
}

public fw_PlayerKilled(victim, attacker) {
#if MODE & (1<<0)
if(is_user_alive(attacker) && g_user_privileges[attacker] & FLAG_A) {
#else
if(is_user_alive(attacker) && get_user_flags(attacker) & VIPACCES) {
#endif
if(zp_get_user_zombie(attacker) && !(zp_get_user_nemesis(attacker) && !get_pcvar_num(g_nemhealth))) fm_set_user_health(attacker, (pev(attacker, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_killammo))
}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) {

if(victim == attacker)
return HAM_IGNORED

if(damage_type & DMG_HEGRENADE)
return HAM_IGNORED

if(!is_user_connected(attacker))
return HAM_IGNORED

if(zp_get_user_zombie(attacker) || zp_get_user_survivor(attacker))
return HAM_IGNORED

#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_D) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
if(get_pcvar_num(g_damage_reward) != 0) {
g_damage[attacker]+damage
if(g_damage[attacker] > float(get_pcvar_num(g_damage_reward))) {
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker)+1)
g_damage[attacker] -= float(get_pcvar_num(g_damage_reward))
}
}
}
#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_D) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
damage *= get_pcvar_float(g_damage_increase)
SetHamParamFloat(4, damage)
}
return HAM_IGNORED

}

public zp_user_infected_post(id, infector, nemesis) {

setVip()
#if MODE & (1<<0)
if(g_user_privileges[infector] & FLAG_A) {
#else
if(get_user_flags(infector) & VIPACCES) {
#endif
fm_set_user_health(infector, (pev(infector, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(infector, zp_get_user_ammo_packs(infector) + get_pcvar_num(g_infectammo))
}
}

public client_connect(id) {

jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
#if MODE & (1<<0)
set_flags(id)
if(get_pcvar_num(g_show_vips) == 1 && g_user_privileges[id] & FLAG_A) {
#else
if(get_pcvar_num(g_show_vips) == 1 && get_user_flags(id) & VIPACCES) {
#endif
new name[100]
get_user_name(id, name, 100)
client_printcolor(0, "/g%L", LANG_PLAYER, "VIP_CONNECTED", name)
}
}
#if MODE & (1<<1)
public zp_extra_item_selected(id, item_id)
if(item_id == g_zp_extra_item_number)
menu_open(id)

public menu_open(id) {
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_E)
vip_menu(id)
else if(g_user_privileges[id] > 0) client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
#else
if(get_user_flags(id) & VIPACCES)
vip_menu(id)
#endif
#if MODE & (1<<0)
else if(get_pcvar_num(g_vip_cost_ammo) != 0)
buy_meniu(id)
#endif
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NOT_A_VIP")
return ZP_PLUGIN_HANDLED
}

public vip_menu(id)
{
if(g_registered_items_count == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
return PLUGIN_HANDLED
}
new buttons_string[16], menu_string[31], menu
formatex(menu_string, 30, "\r%L", id, "MENU_TOP")
menu = menu_create(menu_string, "vip_menu_handler")
static i, menu_item[61], team_check, num[3], ammo_packs, check
check = 0
team_check = 0
ammo_packs = zp_get_user_ammo_packs(id)
if(zp_get_user_zombie(id) && !zp_get_user_nemesis(id)) team_check |= FLAG_A
else if(!zp_get_user_zombie(id)) team_check |= FLAG_B
else if(zp_get_user_nemesis(id)) team_check |= FLAG_C
else if(zp_get_user_survivor(id)) team_check |= FLAG_D
for(i=0; i < g_registered_items_count; i++) {
ArrayGetArray(items_database, i, extra_items)
if(extra_items[i_team] == 0 || team_check & extra_items[i_team]) {
formatex(menu_item, 61, "%s \r[%s] %s[%d %L]", extra_items[i_name], extra_items[i_description], ammo_packs < extra_items[i_cost] ? "\r" : "\y", extra_items[i_cost], id, "AMMO")
formatex(num, 2, "%d", i)
menu_additem(menu, menu_item, num, 0)
check++
}
}
if(check == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NO_ITEMS")
return 1
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "NEXT")
menu_setprop(menu, MPROP_NEXTNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_BACKNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

return 1
}

public vip_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[6], iName[64], item_id, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)
item_id = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
ArrayGetArray(items_database, item_id, extra_items)
if(ammo_packs >= extra_items[i_cost]) zp_set_user_ammo_packs(id, ammo_packs - extra_items[i_cost])
else {
client_printcolor(id, "/g%s %L", CHAT_PREFIX, id, "MISSING_AMMO", extra_items[i_cost]-ammo_packs)
if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
item_id++
ExecuteForward(g_extra_item_selected, g_forward_return, id, item_id)
if (g_forward_return >= ZV_PLUGIN_HANDLED)
zp_set_user_ammo_packs(id, ammo_packs)

if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public buy_meniu(id)
{
new buttons_string[16], menu_string[101], menu_item[31], menu
formatex(menu_string, 100, "\r%L", id, "BUY_MENU_TOP", get_pcvar_num(g_vip_cost_ammo), get_pcvar_num(g_vip_buy_time))
menu = menu_create(menu_string, "buy_menu_handler")

formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE3")
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)
}

public buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new data[6], iName[64], key, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

key = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
if(key > 1) {
if(ammo_packs >= get_pcvar_num(g_vip_cost_ammo)) {
amx_tempadmin(id, key)
zp_set_user_ammo_packs(id, ammo_packs - get_pcvar_num(g_vip_cost_ammo))
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "BOUGHT_VIP", get_pcvar_num(g_vip_buy_time))

}
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "MISSING_AMMO", get_pcvar_num(g_vip_cost_ammo)-ammo_packs)
}
else {
nick_buy_meniu(id)
return PLUGIN_HANDLED
}

menu_destroy(menu)
return PLUGIN_HANDLED
}

public nick_buy_meniu(id)
{
new buttons_string[16], menu_string[151], menu_item[81], menu, client_password[21]
get_user_info(id, amx_password_field_string, client_password, 20)
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_TOP", client_password)
menu = menu_create(menu_string, "nick_buy_menu_handler")

formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE3", get_pcvar_num(g_vip_cost_ammo) ,get_pcvar_num(g_vip_buy_time))
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

}

public nick_buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
buy_meniu(id)
return PLUGIN_HANDLED
}

new data[6], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

new key = str_to_num(data)
switch(key) {
case 1: {
generate_password(id)
nick_buy_meniu(id)
}
case 2: nick_buy_meniu_sec(id)
case 3: {
amx_tempadmin(id, 1)
menu_destroy(menu)
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}
public nick_buy_meniu_sec(id)
{
new menu_string[151], menu_item[51], menu
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_SEC_TOP")
menu = menu_create(menu_string, "nick_buy_menu_sec_handler")

formatex(menu_item, 50, "%L", id, "EXIT")
menu_additem(menu, menu_item, "1", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
menu_display(id, menu, 0)
}

public nick_buy_menu_sec_handler(id, menu, item)
{
nick_buy_meniu(id)
}
#endif
public message_cur_weapon(msg_id, msg_dest, msg_entity)
{
if (!get_pcvar_num(g_unlimited_clip)) return
#if MODE & (1<<0)
if (!(g_user_privileges[msg_entity] & FLAG_C)) return
#else
if (!(get_user_flags(msg_entity) & VIPACCES)) return
#endif
if (!is_user_alive(msg_entity) || get_msg_arg_int(1) != 1) return

static weapon, clip
weapon = get_msg_arg_int(2)
clip = get_msg_arg_int(3)

if (MAXCLIP[weapon] > 2)
{
set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon])

if (clip < 2)
{
static wname[32], weapon_ent
get_weaponname(weapon, wname, sizeof wname - 1)
weapon_ent = fm_find_ent_by_owner(-1, wname, msg_entity)
fm_set_weapon_ammo(weapon_ent, MAXCLIP[weapon])
}
}
}

public HUDReset()
setVip()

public setVip()
{
new players[32], pNum
get_players(players, pNum, "a")

for (new i = 0; i < pNum; i++)
{
new id = players[i]
#if MODE & (1<<0)
if (g_user_privileges[id] & FLAG_A)
#else
if (get_user_flags(id) & VIPACCES)
#endif
{
message_begin(MSG_ALL, get_user_msgid("ScoreAttrib"))
write_byte(id)
write_byte(4)
message_end()
}
}
return PLUGIN_HANDLED
}

public print_adminlist(user)
{
new adminnames[33][32]
new message[256]
new contactinfo[256], contact[112]
new id, count, x, len

for(id = 1 ; id <= maxplayers ; id++)
if(is_user_connected(id))
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_A)
#else
if(get_user_flags(id) & VIPACCES)
#endif
get_user_name(id, adminnames[count++], 31)

len = format(message, 255, "%L ", id, "VIP_STATUS")
if(count > 0) {
for(x = 0 ; x < count ; x++) {
len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
if(len > 96 ) {
client_printcolor(user, "/g%s", message)
len = format(message, 255, "")
}
}
client_printcolor(user, "/g%s", message)
}
else {
len += format(message[len], 255-len, "%L ", id, "VIP_STATUS_N")
client_printcolor(user, "/g%s", message)
}

get_cvar_string("amx_contactinfo", contact, 63)
if(contact[0]) {
format(contactinfo, 111, "%L ", id, "VIP_STATUS_CON", contact)
client_printcolor(user, "/g%s", contactinfo)
}

}

public client_disconnect(id)
{
jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
}

public client_PreThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !g_jumps || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !g_jumps || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
new nbut = get_user_button(id)
new obut = get_user_oldbutton(id)
if((nbut & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND) && !(obut & IN_JUMP))
{
if(jumpnum[id] < get_pcvar_num(g_jumps) &&
((g_bit & FLAG_D && zp_get_user_nemesis(id)) ||
(g_bit & FLAG_C && zp_get_user_survivor(id)) ||
(g_bit & FLAG_A && !zp_get_user_zombie(id)) ||
(g_bit & FLAG_B && zp_get_user_zombie(id) && !zp_get_user_nemesis(id))))
{
dojump[id] = true
jumpnum[id]++
return PLUGIN_CONTINUE
}
}
if((nbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND))
{
jumpnum[id] = 0
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public client_PostThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
if(dojump[id] == true)
{
new Float:velocity[3]
entity_get_vector(id,EV_VEC_velocity,velocity)
velocity[2] = random_float(265.0,285.0)
entity_set_vector(id,EV_VEC_velocity,velocity)
dojump[id] = false
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public ShowMotd(id)
show_motd(id, "vip.txt")
#if MODE & (1<<0)
public reload_vips() {

if(database_holder) ArrayDestroy(database_holder)
database_holder = ArrayCreate(database_items)
new configsDir[64]
get_configsdir(configsDir, 63)
format(configsDir, 63, "%s/vips.ini", configsDir)

new File=fopen(configsDir,"r");

if (File)
{
static Text[512], Flags[32], AuthData[50], Privileges_Flags[32], Password[50]
while (!feof(File))
{
fgets(File,Text,sizeof(Text)-1);

trim(Text);

// comment
if (Text[0]==';')
{
continue;
}

Flags[0]=0;
AuthData[0]=0;
Privileges_Flags[0]=0;
Password[0]=0;

// not enough parameters
if (parse(Text,AuthData,sizeof(AuthData)-1,Password,sizeof(Password)-1,Privileges_Flags,sizeof(Privileges_Flags)-1,Flags,sizeof(Flags)-1) < 2)
{
continue;
}

vips_database[auth] = AuthData
vips_database[password] = Password
vips_database[accessflags] = read_flags(Privileges_Flags)
vips_database[flags] = read_flags(Flags)
ArrayPushArray(database_holder, vips_database)
}

fclose(File);
}
else log_amx("Error: vips.ini file doesn't exist")
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public check_date()
{
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new todaysdaynum = str_to_num(todaysday)
new todaysmonthnum = str_to_num(todaysmonth)
new todaysyearnum = str_to_num(todaysyear)
new alltogether[200]
format(alltogether,199,"m%dd%dy%d",todaysmonthnum,todaysdaynum,todaysyearnum)

new configdir[200]
get_configsdir(configdir,199)

new configfile1[200]

format(configfile1,199,"%s/vips.ini",configdir)

new text[512], len
new pnum = file_size(configfile1,1)
for(new i = 1; i < pnum; i++)
{
read_file(configfile1, i, text, 511, len)
if ( contain(text, alltogether) != -1 )
{
DeleteLine(configfile1, i)
}
}
return PLUGIN_HANDLED
}

public amx_tempadmin(id, type)
{
new authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new day = str_to_num(todaysday)
months = str_to_num(todaysmonth)
years = str_to_num(todaysyear)
days = day + get_pcvar_num(g_vip_buy_time)

if(get_pcvar_num(g_vip_buy_time) == 0 || get_pcvar_num(g_vip_buy_time)>=900)
{
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"",name,client_password,p_flags)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"",authid,p_flags)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"",ip,p_flags)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

switch(months) {
case 1: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 2: {
if(days>28)
{
february(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 3: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 4: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 5: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 6: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 7: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 8: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 9: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 10: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 11: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 12: {
if(days>31)
{
december(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}

public makenewdate(id, type)
{
new alltogether[200], authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
format(alltogether,199,"m%dd%dy%d",months,days,years)
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"; Exp: %s",name,client_password,p_flags,alltogether)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"; Exp: %s",authid,p_flags,alltogether)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"; Exp: %s",ip,p_flags,alltogether)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

public december(id, type)
{
if(days>31)
{
days = days - 31
months = 1
years = years + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirtyone(id, type)
{
if(days>31)
{
days = days - 31
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirty(id, type)
{
if(days>30)
{
days = days - 30
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public february(id, type)
{
if(days>28)
{
days = days - 28
months = 3
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public newyear(id, type)
{
if(days>31)
{
days = days - 31
years = years + 1
months = 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public select_days(id, type)
{
switch(months) {
case 1, 4, 5, 7, 8, 10: thirtyone(id, type)
case 2: february(id, type)
case 3, 6, 9, 11: thirty(id, type)
case 12: newyear(id, type)
}
return PLUGIN_HANDLED
}

DeleteLine( const szFilename[ ], const iLine )
{
new iFile = fopen( szFilename, "rt" );
if( !iFile )
{
return;
}
static const szTempFilename[ ] = "delete_line.txt";
new iTempFile = fopen( szTempFilename, "wt" );

new szData[ 256 ], iLineCount, bool:bReplaced = false;
while( !feof( iFile ) )
{
fgets( iFile, szData, 255 );

if( iLineCount++ == iLine )
{
bReplaced = true;
}
else
{
fputs( iTempFile, szData );
}
}

fclose( iFile );
fclose( iTempFile );

if( bReplaced )
{
delete_file( szFilename );

while( !rename_file( szTempFilename, szFilename, 1 ) ) { }
}
else
{
delete_file( szTempFilename );
}
}
#endif
stock fm_set_user_health(id, health)
{
(health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
}

stock client_printcolor(const id, const input[], any:...)
{

new iCount = 1, iPlayers[32]

static szMsg[191]
vformat(szMsg, charsmax(szMsg), input, 3)

replace_all(szMsg, 190, "/g", "^4") // green txt
replace_all(szMsg, 190, "/y", "^1") // orange txt
replace_all(szMsg, 190, "/ctr", "^3") // team txt
replace_all(szMsg, 190, "/w", "^0") // team txt

if(id) iPlayers[0] = id
else get_players(iPlayers, iCount, "ch")

for (new i = 0; i < iCount; i++)
{
if (is_user_connected(iPlayers[i]))
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayers[i])
write_byte(iPlayers[i])
write_string(szMsg)
message_end()
}
}
}

stock fm_find_ent_by_owner(entity, const classname[], owner)
{
while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) {}

return entity;
}

stock fm_set_weapon_ammo(entity, amount)
{
set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
}
#if MODE & (1<<0)
public set_flags(id) {

static authid[31], ip[31], name[51], index, client_password[31], size, log_flags[11]
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 30)

g_user_privileges[id] = 0
size = ArraySize(database_holder)
for(index=0; index < size ; index++) {
ArrayGetArray(database_holder, index, vips_database)
if(vips_database[flags] & FLAG_D) {
if(equal(ip, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else if(vips_database[flags] & FLAG_C) {
if(equal(authid, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if(vips_database[flags] & FLAG_K) {
if((vips_database[flags] & FLAG_B && contain(name, vips_database[auth]) != -1) || equal(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if((vips_database[flags] & FLAG_B && containi(name, vips_database[auth]) != -1) || equali(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
}
}
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
stock generate_password(id) {

new password_holder[31]
formatex(password_holder, 30, "%d%d%d%d%d", random(9), random(9), random(9), random(9), random(9))
client_cmd(id, "setinfo %s %s", amx_password_field_string, password_holder)
}
#endif
#if MODE & (1<<0)
public native_zv_get_user_flags(id)
return g_user_privileges[id]
#endif
#if MODE & (1<<1)
public native_zv_register_extra_item(const item_name[], const item_discription[], item_cost, item_team)
{
param_convert(1)
param_convert(2)
copy(extra_items[i_name], 30, item_name)
copy(extra_items[i_description], 30, item_discription)
extra_items[i_cost] = item_cost
extra_items[i_team] = item_team
ArrayPushArray(items_database, extra_items)
g_registered_items_count++

return g_registered_items_count
}
#endif


А вот что я сделал:
скрытый текст
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <zombieplague>

////////// PLUGIN SETTINGS //////////
#define MODE 3
#define CHAT_PREFIX "[VIP]"

// (Only if MODE 1 is turrned OFF. Otherwise set flags in vips.ini.) //
#define VIPACCES ADMIN_LEVEL_H
#define MJACCES ADMIN_LEVEL_H
////////// SETTINGS END //////////

// Flags
#define FLAG_A (1<<0)
#define FLAG_B (1<<1)
#define FLAG_C (1<<2)
#define FLAG_I (1<<3)
#define FLAG_E (1<<4)
#define FLAG_K (1<<10)

#define VERSION "1.6"

#if cellbits == 32
const OFFSET_CLIPAMMO = 51
#else
const OFFSET_CLIPAMMO = 65
#endif
const OFFSET_LINUX_WEAPONS = 4

const DMG_HEGRENADE = (1<<24)

#if MODE & (1<<0) || MODE & (1<<1)
new amx_password_field_string[31]
#endif
#if MODE & (1<<0)
new g_user_privileges[33]
enum _:database_items
{
auth[50],
password[50],
accessflags,
flags
}
new vips_database[database_items]
new Array:database_holder
#endif
#if MODE & (1<<1)
const ZV_PLUGIN_HANDLED = 97
enum _:items
{
i_name[31],
i_description[31],
i_cost,
i_team
}
new g_register_in_zp_extra
new g_zp_extra_item_number
new g_menu_close
new extra_items[items]
new Array:items_database
new g_registered_items_count
new g_forward_return
new g_extra_item_selected
#endif
#if MODE == 3
new g_vip_buy_time
new g_vip_cost_ammo
new g_vip_buy_flags
new days
new months
new years
#endif
new const MAXCLIP[] = { -1, 13, -1, 10, 1, 7, -1, 30, 30, 1, 30, 20, 25, 30, 35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50 }
static const CONTACT[] = ""
new g_jumps, g_armor, g_killammo, g_infectammo, g_infecthealth, g_nemhealth, g_show_vips, g_unlimited_clip, g_damage_reward, g_damage_increase
new g_bit
new maxplayers, g_msgSayText
new jumpnum[33]
new bool:dojump[33]
new Float:g_damage[33]

public plugin_init() {

register_plugin("ZM VIP", VERSION, "aaarnas")
RegisterHam(Ham_Spawn, "player", "FwdHamPlayerSpawnPost", 1)
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_event("ResetHUD", "HUDReset", "be")
register_message(get_user_msgid("CurWeapon"), "message_cur_weapon")

maxplayers = get_maxplayers()
g_msgSayText = get_user_msgid("SayText")

g_jumps = register_cvar("zp_vip_jumps", "1")
g_bit = get_pcvar_num(register_cvar("zp_vip_allow_jump", "3"))
g_armor = register_cvar("zp_vip_armor", "65")
g_killammo = register_cvar("zp_vip_killammo", "2")
g_infectammo = register_cvar("zp_vip_infectammo", "2")
g_infecthealth = register_cvar("zp_vip_infecthealth", "300")
g_nemhealth = register_cvar("zp_vip_nemextra", "1")
g_show_vips = register_cvar("zp_vip_show", "1")
g_unlimited_clip = register_cvar("zp_vip_unlimited_ammo", "0")
g_damage_reward = register_cvar("zp_vip_damage_reward", "500")
g_damage_increase = register_cvar("zp_vip_damage_increase", "1.5")
register_cvar("amx_contactinfo", CONTACT, FCVAR_SERVER)
register_cvar("zp_vip_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
set_cvar_string("zp_vip_version", VERSION)
#if MODE & (1<<0) || MODE & (1<<1)
get_cvar_string("amx_password_field", amx_password_field_string, 30)
register_dictionary("zm_vip.txt")
#endif
#if MODE & (1<<0) && MODE & (1<<1)
g_vip_cost_ammo = register_cvar("zp_vip_cost_ammo", "0")
g_vip_buy_time = register_cvar("zp_vip_buy_time", "7")
g_vip_buy_flags = register_cvar("zp_vip_buy_flags", "abci")
set_task(5.0,"check_date",0)
#endif
#if MODE & (1<<0)
register_concmd("amx_reloadvips", "reload_vips", ADMIN_CFG)
reload_vips()
#endif
#if MODE & (1<<1)
register_clcmd("say /vm", "menu_open")
g_register_in_zp_extra = register_cvar("zp_vip_register_in_zp_extra", "1")
g_menu_close = register_cvar("zp_vip_menu_close", "1")
items_database = ArrayCreate(items)

new temp[31]
formatex(temp, 30, "%L", LANG_PLAYER, "VIP_EXTRA_NAME")
if(get_pcvar_num(g_register_in_zp_extra)) g_zp_extra_item_number = zp_register_extra_item(temp, 0, 0)
g_extra_item_selected = CreateMultiForward("zv_extra_item_selected", ET_CONTINUE, FP_CELL, FP_CELL)
#endif
register_clcmd("say /vips", "print_adminlist")
register_clcmd("say /vip", "ShowMotd")
}
public plugin_cfg()
{
new directory[31]
get_configsdir(directory, 30)
server_cmd("exec %s/zm_vip.cfg", directory)
}
#if MODE & (1<<1) || MODE & (1<<0)
public plugin_natives() {
#if MODE & (1<<1)
register_native("zv_register_extra_item", "native_zv_register_extra_item", 1)
#endif
#if MODE & (1<<0)
register_native("zv_get_user_flags", "native_zv_get_user_flags", 1)
#endif
}
#endif
public FwdHamPlayerSpawnPost(id) {
#if MODE & (1<<0)
if(!(g_user_privileges[id] & FLAG_A))
#else
if(!(get_user_flags(id) & VIPACCES))
#endif
return PLUGIN_HANDLED;

if(pev(id, pev_armorvalue) < get_pcvar_num(g_armor))
set_pev(id, pev_armorvalue, float(get_pcvar_num(g_armor)))
return HAM_IGNORED;
}

public fw_PlayerKilled(victim, attacker) {
#if MODE & (1<<0)
if(is_user_alive(attacker) && g_user_privileges[attacker] & FLAG_A) {
#else
if(is_user_alive(attacker) && get_user_flags(attacker) & VIPACCES) {
#endif
if(zp_get_user_zombie(attacker) && !(zp_get_user_nemesis(attacker) && !get_pcvar_num(g_nemhealth))) fm_set_user_health(attacker, (pev(attacker, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_killammo))
}
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) {

if(victim == attacker)
return HAM_IGNORED

if(damage_type & DMG_HEGRENADE)
return HAM_IGNORED

if(!is_user_connected(attacker))
return HAM_IGNORED

if(zp_get_user_zombie(attacker) || zp_get_user_survivor(attacker))
return HAM_IGNORED

#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_I) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
if(get_pcvar_num(g_damage_reward) != 0) {
g_damage[attacker]+damage
if(g_damage[attacker] > float(get_pcvar_num(g_damage_reward))) {
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker)+1)
g_damage[attacker] -= float(get_pcvar_num(g_damage_reward))
}
}
}
#if MODE & (1<<0)
if(g_user_privileges[attacker] & FLAG_I) {
#else
if(get_user_flags(attacker) & VIPACCES) {
#endif
damage *= get_pcvar_float(g_damage_increase)
SetHamParamFloat(4, damage)
}
return HAM_IGNORED

}

public zp_user_infected_post(id, infector, nemesis) {

setVip()
#if MODE & (1<<0)
if(g_user_privileges[infector] & FLAG_A) {
#else
if(get_user_flags(infector) & VIPACCES) {
#endif
fm_set_user_health(infector, (pev(infector, pev_health) + get_pcvar_num(g_infecthealth)))
zp_set_user_ammo_packs(infector, zp_get_user_ammo_packs(infector) + get_pcvar_num(g_infectammo))
}
}

public client_connect(id) {

jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
#if MODE & (1<<0)
set_flags(id)
if(get_pcvar_num(g_show_vips) == 1 && g_user_privileges[id] & FLAG_A) {
#else
if(get_pcvar_num(g_show_vips) == 1 && get_user_flags(id) & VIPACCES) {
#endif
new name[100]
get_user_name(id, name, 100)
client_printcolor(0, "/g%L", LANG_PLAYER, "VIP_CONNECTED", name)
}
}
#if MODE & (1<<1)
public zp_extra_item_selected(id, item_id)
if(item_id == g_zp_extra_item_number)
menu_open(id)

public menu_open(id) {
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_E)
vip_menu(id)
else if(g_user_privileges[id] > 0) client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
#else
if(get_user_flags(id) & VIPACCES)
vip_menu(id)
#endif
#if MODE & (1<<0)
else if(get_pcvar_num(g_vip_cost_ammo) != 0)
buy_meniu(id)
#endif
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NOT_A_VIP")
return ZP_PLUGIN_HANDLED
}

public vip_menu(id)
{
if(g_registered_items_count == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "OFF")
return PLUGIN_HANDLED
}
new buttons_string[16], menu_string[31], menu
formatex(menu_string, 30, "\r%L", id, "MENU_TOP")
menu = menu_create(menu_string, "vip_menu_handler")
static i, menu_item[61], team_check, num[3], ammo_packs, check
check = 0
team_check = 0
ammo_packs = zp_get_user_ammo_packs(id)
if(zp_get_user_zombie(id) && !zp_get_user_nemesis(id)) team_check |= FLAG_A
else if(!zp_get_user_zombie(id)) team_check |= FLAG_B
else if(zp_get_user_nemesis(id)) team_check |= FLAG_C
else if(zp_get_user_survivor(id)) team_check |= FLAG_I
for(i=0; i < g_registered_items_count; i++) {
ArrayGetArray(items_database, i, extra_items)
if(extra_items[i_team] == 0 || team_check & extra_items[i_team]) {
formatex(menu_item, 61, "%s \r[%s] %s[%d %L]", extra_items[i_name], extra_items[i_description], ammo_packs < extra_items[i_cost] ? "\r" : "\y", extra_items[i_cost], id, "AMMO")
formatex(num, 2, "%d", i)
menu_additem(menu, menu_item, num, 0)
check++
}
}
if(check == 0) {
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "NO_ITEMS")
return 1
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "NEXT")
menu_setprop(menu, MPROP_NEXTNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_BACKNAME, buttons_string)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

return 1
}

public vip_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[6], iName[64], item_id, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)
item_id = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
ArrayGetArray(items_database, item_id, extra_items)
if(ammo_packs >= extra_items[i_cost]) zp_set_user_ammo_packs(id, ammo_packs - extra_items[i_cost])
else {
client_printcolor(id, "/g%s %L", CHAT_PREFIX, id, "MISSING_AMMO", extra_items[i_cost]-ammo_packs)
if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
item_id++
ExecuteForward(g_extra_item_selected, g_forward_return, id, item_id)
if (g_forward_return >= ZV_PLUGIN_HANDLED)
zp_set_user_ammo_packs(id, ammo_packs)

if(g_menu_close) menu_destroy(menu)
else vip_menu(id)
return PLUGIN_HANDLED
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public buy_meniu(id)
{
new buttons_string[16], menu_string[101], menu_item[31], menu
formatex(menu_string, 100, "\r%L", id, "BUY_MENU_TOP", get_pcvar_num(g_vip_cost_ammo), get_pcvar_num(g_vip_buy_time))
menu = menu_create(menu_string, "buy_menu_handler")

formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 30, "%L", id, "BUY_MENU_TYPE3")
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)
}

public buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new data[6], iName[64], key, ammo_packs
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

key = str_to_num(data)
ammo_packs = zp_get_user_ammo_packs(id)
if(key > 1) {
if(ammo_packs >= get_pcvar_num(g_vip_cost_ammo)) {
amx_tempadmin(id, key)
zp_set_user_ammo_packs(id, ammo_packs - get_pcvar_num(g_vip_cost_ammo))
client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "BOUGHT_VIP", get_pcvar_num(g_vip_buy_time))

}
else client_printcolor(id, "/g%s /y%L", CHAT_PREFIX, id, "MISSING_AMMO", get_pcvar_num(g_vip_cost_ammo)-ammo_packs)
}
else {
nick_buy_meniu(id)
return PLUGIN_HANDLED
}

menu_destroy(menu)
return PLUGIN_HANDLED
}

public nick_buy_meniu(id)
{
new buttons_string[16], menu_string[151], menu_item[81], menu, client_password[21]
get_user_info(id, amx_password_field_string, client_password, 20)
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_TOP", client_password)
menu = menu_create(menu_string, "nick_buy_menu_handler")

formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE1")
menu_additem(menu, menu_item, "1", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE2")
menu_additem(menu, menu_item, "2", 0)
formatex(menu_item, 80, "%L", id, "NICK_BUY_MENU_TYPE3", get_pcvar_num(g_vip_cost_ammo) ,get_pcvar_num(g_vip_buy_time))
menu_additem(menu, menu_item, "3", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
formatex(buttons_string, 15, "%L", id, "BACK")
menu_setprop(menu, MPROP_EXITNAME, buttons_string)
menu_display(id, menu, 0)

}

public nick_buy_menu_handler(id, menu, item)
{
if( item == MENU_EXIT )
{
buy_meniu(id)
return PLUGIN_HANDLED
}

new data[6], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback)

new key = str_to_num(data)
switch(key) {
case 1: {
generate_password(id)
nick_buy_meniu(id)
}
case 2: nick_buy_meniu_sec(id)
case 3: {
amx_tempadmin(id, 1)
menu_destroy(menu)
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}
public nick_buy_meniu_sec(id)
{
new menu_string[151], menu_item[51], menu
formatex(menu_string, 150, "\r%L", id, "NICK_BUY_MENU_SEC_TOP")
menu = menu_create(menu_string, "nick_buy_menu_sec_handler")

formatex(menu_item, 50, "%L", id, "EXIT")
menu_additem(menu, menu_item, "1", 0)

menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
menu_display(id, menu, 0)
}

public nick_buy_menu_sec_handler(id, menu, item)
{
nick_buy_meniu(id)
}
#endif
public message_cur_weapon(msg_id, msg_dest, msg_entity)
{
if (!get_pcvar_num(g_unlimited_clip)) return
#if MODE & (1<<0)
if (!(g_user_privileges[msg_entity] & FLAG_C)) return
#else
if (!(get_user_flags(msg_entity) & VIPACCES)) return
#endif
if (!is_user_alive(msg_entity) || get_msg_arg_int(1) != 1) return

static weapon, clip
weapon = get_msg_arg_int(2)
clip = get_msg_arg_int(3)

if (MAXCLIP[weapon] > 2)
{
set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon])

if (clip < 2)
{
static wname[32], weapon_ent
get_weaponname(weapon, wname, sizeof wname - 1)
weapon_ent = fm_find_ent_by_owner(-1, wname, msg_entity)
fm_set_weapon_ammo(weapon_ent, MAXCLIP[weapon])
}
}
}

public HUDReset()
setVip()

public setVip()
{
new players[32], pNum
get_players(players, pNum, "a")

for (new i = 0; i < pNum; i++)
{
new id = players[i]
#if MODE & (1<<0)
if (g_user_privileges[id] & FLAG_A)
#else
if (get_user_flags(id) & VIPACCES)
#endif
{
message_begin(MSG_ALL, get_user_msgid("ScoreAttrib"))
write_byte(id)
write_byte(4)
message_end()
}
}
return PLUGIN_HANDLED
}

public print_adminlist(user)
{
new adminnames[33][32]
new message[256]
new contactinfo[256], contact[112]
new id, count, x, len

for(id = 1 ; id <= maxplayers ; id++)
if(is_user_connected(id))
#if MODE & (1<<0)
if(g_user_privileges[id] & FLAG_A)
#else
if(get_user_flags(id) & VIPACCES)
#endif
get_user_name(id, adminnames[count++], 31)

len = format(message, 255, "%L ", id, "VIP_STATUS")
if(count > 0) {
for(x = 0 ; x < count ; x++) {
len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
if(len > 96 ) {
client_printcolor(user, "/g%s", message)
len = format(message, 255, "")
}
}
client_printcolor(user, "/g%s", message)
}
else {
len += format(message[len], 255-len, "%L ", id, "VIP_STATUS_N")
client_printcolor(user, "/g%s", message)
}

get_cvar_string("amx_contactinfo", contact, 63)
if(contact[0]) {
format(contactinfo, 111, "%L ", id, "VIP_STATUS_CON", contact)
client_printcolor(user, "/g%s", contactinfo)
}

}

public client_disconnect(id)
{
jumpnum[id] = 0
g_damage[id] = 0.0
dojump[id] = false
}

public client_PreThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !g_jumps || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !g_jumps || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
new nbut = get_user_button(id)
new obut = get_user_oldbutton(id)
if((nbut & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND) && !(obut & IN_JUMP))
{
if(jumpnum[id] < get_pcvar_num(g_jumps) &&
((g_bit & FLAG_I && zp_get_user_nemesis(id)) ||
(g_bit & FLAG_C && zp_get_user_survivor(id)) ||
(g_bit & FLAG_A && !zp_get_user_zombie(id)) ||
(g_bit & FLAG_B && zp_get_user_zombie(id) && !zp_get_user_nemesis(id))))
{
dojump[id] = true
jumpnum[id]++
return PLUGIN_CONTINUE
}
}
if((nbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND))
{
jumpnum[id] = 0
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public client_PostThink(id)
{
#if MODE & (1<<0)
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(g_user_privileges[id] & FLAG_B))) return PLUGIN_CONTINUE
#else
if(!is_user_alive(id) || !get_pcvar_num(g_jumps) || (!(get_user_flags(id) & MJACCES))) return PLUGIN_CONTINUE
#endif
if(dojump[id] == true)
{
new Float:velocity[3]
entity_get_vector(id,EV_VEC_velocity,velocity)
velocity[2] = random_float(265.0,285.0)
entity_set_vector(id,EV_VEC_velocity,velocity)
dojump[id] = false
return PLUGIN_CONTINUE
}
return PLUGIN_CONTINUE
}

public ShowMotd(id)
show_motd(id, "vip.txt")
#if MODE & (1<<0)
public reload_vips() {

if(database_holder) ArrayDestroy(database_holder)
database_holder = ArrayCreate(database_items)
new configsDir[64]
get_configsdir(configsDir, 63)
format(configsDir, 63, "%s/vips.ini", configsDir)

new File=fopen(configsDir,"r");

if (File)
{
static Text[512], Flags[32], AuthData[50], Privileges_Flags[32], Password[50]
while (!feof(File))
{
fgets(File,Text,sizeof(Text)-1);

trim(Text);

// comment
if (Text[0]==';')
{
continue;
}

Flags[0]=0;
AuthData[0]=0;
Privileges_Flags[0]=0;
Password[0]=0;

// not enough parameters
if (parse(Text,AuthData,sizeof(AuthData)-1,Password,sizeof(Password)-1,Privileges_Flags,sizeof(Privileges_Flags)-1,Flags,sizeof(Flags)-1) < 2)
{
continue;
}

vips_database[auth] = AuthData
vips_database[password] = Password
vips_database[accessflags] = read_flags(Privileges_Flags)
vips_database[flags] = read_flags(Flags)
ArrayPushArray(database_holder, vips_database)
}

fclose(File);
}
else log_amx("Error: vips.ini file doesn't exist")
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
public check_date()
{
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new todaysdaynum = str_to_num(todaysday)
new todaysmonthnum = str_to_num(todaysmonth)
new todaysyearnum = str_to_num(todaysyear)
new alltogether[200]
format(alltogether,199,"m%dd%dy%d",todaysmonthnum,todaysdaynum,todaysyearnum)

new configdir[200]
get_configsdir(configdir,199)

new configfile1[200]

format(configfile1,199,"%s/vips.ini",configdir)

new text[512], len
new pnum = file_size(configfile1,1)
for(new i = 1; i < pnum; i++)
{
read_file(configfile1, i, text, 511, len)
if ( contain(text, alltogether) != -1 )
{
DeleteLine(configfile1, i)
}
}
return PLUGIN_HANDLED
}

public amx_tempadmin(id, type)
{
new authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
new todaysmonth[32]
new todaysday[32]
new todaysyear[32]
get_time("%m",todaysmonth,31)
get_time("%d",todaysday,31)
get_time("%Y",todaysyear,31)
new day = str_to_num(todaysday)
months = str_to_num(todaysmonth)
years = str_to_num(todaysyear)
days = day + get_pcvar_num(g_vip_buy_time)

if(get_pcvar_num(g_vip_buy_time) == 0 || get_pcvar_num(g_vip_buy_time)>=900)
{
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"",name,client_password,p_flags)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"",authid,p_flags)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"",ip,p_flags)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

switch(months) {
case 1: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 2: {
if(days>28)
{
february(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 3: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 4: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 5: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 6: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 7: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 8: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 9: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 10: {
if(days>31)
{
thirtyone(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 11: {
if(days>30)
{
thirty(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
case 12: {
if(days>31)
{
december(id, type)
return PLUGIN_HANDLED
}
else
{
makenewdate(id, type)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}

public makenewdate(id, type)
{
new alltogether[200], authid[31], ip[31], name[51], client_password[21], p_flags[21]
get_pcvar_string(g_vip_buy_flags, p_flags, 20)
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 20)
format(alltogether,199,"m%dd%dy%d",months,days,years)
new instertintovips[200]
switch(type) {
case 1: formatex(instertintovips,199,"^"%s^" ^"%s^" ^"%s^" ^"b^"; Exp: %s",name,client_password,p_flags,alltogether)
case 2: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"ce^"; Exp: %s",authid,p_flags,alltogether)
case 3: formatex(instertintovips,199,"^"%s^" ^"^" ^"%s^" ^"de^"; Exp: %s",ip,p_flags,alltogether)
}
new configdir[200]
get_configsdir(configdir,199)
new configfile1[200]
format(configfile1,199,"%s/vips.ini",configdir)
write_file(configfile1,instertintovips,-1)
server_cmd("amx_reloadvips")
set_task(1.0, "set_flags", id)
return PLUGIN_HANDLED
}

public december(id, type)
{
if(days>31)
{
days = days - 31
months = 1
years = years + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirtyone(id, type)
{
if(days>31)
{
days = days - 31
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public thirty(id, type)
{
if(days>30)
{
days = days - 30
months = months + 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public february(id, type)
{
if(days>28)
{
days = days - 28
months = 3
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public newyear(id, type)
{
if(days>31)
{
days = days - 31
years = years + 1
months = 1
select_days(id, type)
}
else
{
makenewdate(id, type)
}
return PLUGIN_HANDLED
}

public select_days(id, type)
{
switch(months) {
case 1, 4, 5, 7, 8, 10: thirtyone(id, type)
case 2: february(id, type)
case 3, 6, 9, 11: thirty(id, type)
case 12: newyear(id, type)
}
return PLUGIN_HANDLED
}

DeleteLine( const szFilename[ ], const iLine )
{
new iFile = fopen( szFilename, "rt" );
if( !iFile )
{
return;
}
static const szTempFilename[ ] = "delete_line.txt";
new iTempFile = fopen( szTempFilename, "wt" );

new szData[ 256 ], iLineCount, bool:bReplaced = false;
while( !feof( iFile ) )
{
fgets( iFile, szData, 255 );

if( iLineCount++ == iLine )
{
bReplaced = true;
}
else
{
fputs( iTempFile, szData );
}
}

fclose( iFile );
fclose( iTempFile );

if( bReplaced )
{
delete_file( szFilename );

while( !rename_file( szTempFilename, szFilename, 1 ) ) { }
}
else
{
delete_file( szTempFilename );
}
}
#endif
stock fm_set_user_health(id, health)
{
(health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
}

stock client_printcolor(const id, const input[], any:...)
{

new iCount = 1, iPlayers[32]

static szMsg[191]
vformat(szMsg, charsmax(szMsg), input, 3)

replace_all(szMsg, 190, "/g", "^4") // green txt
replace_all(szMsg, 190, "/y", "^1") // orange txt
replace_all(szMsg, 190, "/ctr", "^3") // team txt
replace_all(szMsg, 190, "/w", "^0") // team txt

if(id) iPlayers[0] = id
else get_players(iPlayers, iCount, "ch")

for (new i = 0; i < iCount; i++)
{
if (is_user_connected(iPlayers[i]))
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayers[i])
write_byte(iPlayers[i])
write_string(szMsg)
message_end()
}
}
}

stock fm_find_ent_by_owner(entity, const classname[], owner)
{
while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) {}

return entity;
}

stock fm_set_weapon_ammo(entity, amount)
{
set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
}
#if MODE & (1<<0)
public set_flags(id) {

static authid[31], ip[31], name[51], index, client_password[31], size, log_flags[11]
get_user_authid(id, authid, 30)
get_user_ip(id, ip, 30, 1)
get_user_name(id, name, 50)
get_user_info(id, amx_password_field_string, client_password, 30)

g_user_privileges[id] = 0
size = ArraySize(database_holder)
for(index=0; index < size ; index++) {
ArrayGetArray(database_holder, index, vips_database)
if(vips_database[flags] & FLAG_I) {
if(equal(ip, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else if(vips_database[flags] & FLAG_C) {
if(equal(authid, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if(vips_database[flags] & FLAG_K) {
if((vips_database[flags] & FLAG_B && contain(name, vips_database[auth]) != -1) || equal(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
else {
if((vips_database[flags] & FLAG_B && containi(name, vips_database[auth]) != -1) || equali(name, vips_database[auth])) {
if(!(vips_database[flags] & FLAG_E)) {
if(equal(client_password, vips_database[password]))
g_user_privileges[id] = vips_database[accessflags]
else if(vips_database[flags] & FLAG_A) {
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "INV_PAS")
break
}
}
else g_user_privileges[id] = vips_database[accessflags]
get_flags(vips_database[accessflags], log_flags, 10)
log_amx("%L",LANG_PLAYER, "AUTHORISED", name, authid, ip, log_flags)
break
}
}
}
}
}
#endif
#if MODE & (1<<0) && MODE & (1<<1)
stock generate_password(id) {

new password_holder[31]
formatex(password_holder, 30, "%d%d%d%d%d", random(9), random(9), random(9), random(9), random(9))
client_cmd(id, "setinfo %s %s", amx_password_field_string, password_holder)
}
#endif
#if MODE & (1<<0)
public native_zv_get_user_flags(id)
return g_user_privileges[id]
#endif
#if MODE & (1<<1)
public native_zv_register_extra_item(const item_name[], const item_discription[], item_cost, item_team)
{
param_convert(1)
param_convert(2)
copy(extra_items[i_name], 30, item_name)
copy(extra_items[i_description], 30, item_discription)
extra_items[i_cost] = item_cost
extra_items[i_team] = item_team
ArrayPushArray(items_database, extra_items)
g_registered_items_count++

return g_registered_items_count
}
#endif

Попробуй сменить флаг тут
cmdaccess.ini
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Connect1507
сообщение 19.3.2012, 12:10
Сообщение #6
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

Цитата(Pakistan @ 19.3.2012, 8:04) *
Попробуй сменить флаг тут
cmdaccess.ini


"amx_reloadvips" "h" ; zm_vip.amxx

поменял на
"amx_reloadvips" "i" ; zm_vip.amxx

некатит.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Pakistan
сообщение 19.3.2012, 15:13
Сообщение #7
Стаж: 14 лет

Сообщений: 808
Благодарностей: 246
Полезность: 554

Цитата(Connect1507 @ 19.3.2012, 13:10) *
"amx_reloadvips" "h" ; zm_vip.amxx

поменял на
"amx_reloadvips" "i" ; zm_vip.amxx

некатит.

РР Сервера делал?!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Connect1507
сообщение 19.3.2012, 15:33
Сообщение #8
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

Да, но почему то оно перекопирывается и остаётся такой же флаг h/

Отредактировал: Connect1507, - 19.3.2012, 15:35
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Pakistan
сообщение 19.3.2012, 16:34
Сообщение #9
Стаж: 14 лет

Сообщений: 808
Благодарностей: 246
Полезность: 554

Цитата(Connect1507 @ 19.3.2012, 16:33) *
Да, но почему то оно перекопирывается и остаётся такой же флаг h/

Ну извини не чем не могу помочь я в ЗМ не так много знаю!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Connect1507
сообщение 19.3.2012, 17:50
Сообщение #10
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

Вё допёрло у меня всё с випкой.

Остаётся решить роблем с сиреной.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Connect1507
сообщение 20.3.2012, 11:02
Сообщение #11
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

Цитата(Connect1507 @ 18.3.2012, 12:08) *
Всем добрый день! Столкнулся с проблеммой.
Поставил зм класс сирена, но когда остаётся последний человек сиренм подбигает на близкое расстояние, заорёт и снимает чуть ли на 1к хп. Скока квары не менял всё бестолку.
Вот исходник. Мб кто то пользуется классом таким....
Помогите сделать что бы сирена наносила меньше урона своим криком(аурой)

скрытый текст
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fun>
#include <xs>
#include <hamsandwich>
#include <zombieplague>

/*===============================================================================
=
[Customizations]
================================================================================
=*/

// Zombie Attributes
new const zclass_name[] = "Сирена" // name
new const zclass_info[] = "[Воет на E]" // description
new const zclass_model[] = "Shaman" // model
new const zclass_clawmodel[] = "Shaman.mdl" // claw model
new const zclass_ring_sprite[] = "sprites/shockwave.spr" // ring sprite
new const zclass_screamsounds[][] = { "killing_floor/siren_scream.wav" } // scream sound

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

const zclass_health = 4000 // health
const zclass_speed = 245 // speed

const Float:zclass_gravity = 0.79 // gravity
const Float:zclass_knockback = 0.9 // knockback

/*===============================================================================
=
Customization ends here! Yes, that's it. Editing anything beyond
here is not officially supported. Proceed at your own risk...
================================================================================
=*/

// Variables
new g_iSirenZID, g_iMaxPlayers, g_msgSayText, g_msgScreenFade, g_msgScreenShake,
g_msgBarTime, g_sprRing , g_modenow

// Arrays
new g_iPlayerTaskTimes[33]

// Cvar pointers
new cvar_screammode, cvar_duration, cvar_screamdmg, cvar_startime, cvar_reloadtime,
cvar_radius, cvar_damagemode, cvar_slowdown

// Cached cvars
new g_iCvar_ScreamMode, g_iCvar_ScreamDuration, g_iCvar_ScreamDmg,
g_iCvar_ScreamStartTime, Float:g_flCvar_ReloadTime, Float:g_flCvar_Radius,
g_iCvar_DamageMode, Float:g_flCvar_ScreamSlowdown , cvar_armorhit

// Bools
new bool:g_bIsConnected[33], bool:g_bIsAlive[33], bool:g_bInScreamProcess[33],
bool:g_bCanDoScreams[33], bool:g_bKilledByScream[33], bool:g_bDoingScream[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.2"
#define PLUG_AUTH "meTaLiCroSS"

// Macros
#define zp_get_grenade_type(%1) (entity_get_int(%1, EV_INT_flTimeStepSound))
#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])

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

public plugin_init()
{
// Plugin Info
register_plugin("[ZP] Zombie Class: KF Siren Zombie", PLUG_VERSION, PLUG_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")

// Hamsandwich Forward
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)

// Cvars
cvar_screammode = register_cvar("zp_siren_mode", "1")
cvar_duration = register_cvar("zp_siren_scream_duration", "3")
cvar_screamdmg = register_cvar("zp_siren_scream_damage", "2")
cvar_startime = register_cvar("zp_siren_scream_start_time", "1")
cvar_reloadtime = register_cvar("zp_siren_scream_reload_time", "20.0")
cvar_radius = register_cvar("zp_siren_scream_radius", "150.0")
cvar_damagemode = register_cvar("zp_siren_damage_mode", "1")
cvar_slowdown = register_cvar("zp_siren_damage_slowdown", "0.5")
cvar_armorhit = register_cvar("zp_siren_armor_hit", "1")

static szCvar[30]
formatex(szCvar, charsmax(szCvar), "v%s by %s", PLUG_VERSION, PLUG_AUTH)
register_cvar("zp_zclass_siren", szCvar, FCVAR_SERVER|FCVAR_SPONLY)

// Vars
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 some cvars
cache_cvars()
}

public plugin_precache()
{
// Register the new class and store ID for reference
g_iSirenZID = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)

// Ring sprite
g_sprRing = precache_model(zclass_ring_sprite)

// Sounds
static i
for(i = 0; i < sizeof zclass_screamsounds; i++)
precache_sound(zclass_screamsounds[i])
}

/*===============================================================================
=
[Main Events/Messages]
================================================================================
=*/

public event_RoundStart()
{
// Caching cvars
cache_cvars()

// Reset round end bar
g_bRoundEnding = false
}

public message_DeathMsg(msg_id, msg_dest, id)
{
static iAttacker, iVictim

// 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 siren scream
if(g_bKilledByScream[iVictim])
set_msg_arg_string(4, "siren scream")

return PLUGIN_CONTINUE
}

/*===============================================================================
=
[Main Forwards]
================================================================================
=*/

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

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

public fw_PlayerSpawn_Post(id)
{
// Not alive...
if(!is_user_alive(id))
return HAM_IGNORED

// Player is alive
g_bIsAlive[id] = true

// Reset player vars and tasks
stop_scream_task(id)

g_bCanDoScreams[id] = false
g_bDoingScream[id] = false
g_iPlayerTaskTimes[id] = 0

remove_task(id+TASK_RELOAD)
remove_task(id+TASK_SCREAMDMG)

return HAM_IGNORED
}

public fw_PlayerKilled(victim, attacker, shouldgib)
{
// 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_bDoingScream[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(id, handle, random_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_iSirenZID)
return FMRES_IGNORED;

// Get user old and actual buttons
static iInUseButton, iInUseOldButton
iInUseButton = (get_uc(handle, UC_Buttons) & IN_USE)
iInUseOldButton = (get_user_oldbutton(id) & IN_USE)

// Pressing +use button
if(iInUseButton)
{
// Last used button isn't +use, i need to
// do this, because i call this "only" 1 time
if(!iInUseOldButton && g_bCanDoScreams[id] && !g_bDoingScream[id] && !g_bRoundEnding)
{
// A bar appears in his screen
message_begin(MSG_ONE, g_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
}

/*===============================================================================
=
[Tasks]
================================================================================
=*/

public task_do_scream(id)
{
// Normalize task
id -= TASK_SCREAM

// Do scream sound
emit_sound(id, CHAN_STREAM, zclass_screamsounds[random_num(0, sizeof zclass_screamsounds - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)

// Block screams
g_bCanDoScreams[id] = false

// Reload task
set_task(g_flCvar_ReloadTime, "task_reload_scream", id+TASK_RELOAD)

// Now it's doing an scream
g_bDoingScream[id] = true

// Get his origin coords
static iOrigin[3]
get_user_origin(id, iOrigin)

// Do a good effect, life the original Killing Floor.
message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin)
write_byte(TE_LAVASPLASH)
write_coord(iOrigin[0])
write_coord(iOrigin[1])
write_coord(iOrigin[2])
message_end()

// 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[ZP]/y Готово! Ты можешь /gКричать/y сейчас")
client_printcolor(id, "/g[ZP]/y Ты должен нажать на /g^"E^"/что бы /gЗакричать/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

// Update bool
g_bDoingScream[id] = false

return;
}

// Update player task time
g_iPlayerTaskTimes[id]++

// Get player origin
static Float:flOrigin[3]
entity_get_vector(id, EV_VEC_origin, flOrigin)

// Collisions
static iVictim
iVictim = -1

// Vector var
static Float:flVictimOrigin[3]

// A ring effect
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]) // z
engfunc(EngFunc_WriteCoord, flOrigin[0]) // x axis
engfunc(EngFunc_WriteCoord, flOrigin[1]) // y axis
engfunc(EngFunc_WriteCoord, flOrigin[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(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(iVictim, flOrigin, g_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(iVictim, EV_SZ_classname, szClassname, charsmax(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(iVictim, EV_VEC_origin, flVictimOrigin)

// Do a good effect
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flVictimOrigin, 0)
write_byte(TE_PARTICLEBURST) // TE id
engfunc(EngFunc_WriteCoord, flVictimOrigin[0]) // x
engfunc(EngFunc_WriteCoord, flVictimOrigin[1]) // y
engfunc(EngFunc_WriteCoord, flVictimOrigin[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)
}
// If i don't check his solid type, it's used all the time.
else if(equal(szClassname, "func_breakable") && entity_get_int(iVictim, EV_INT_solid) != SOLID_NOT)
{
// Destroy entity if he can
force_use(id, iVictim)
}
}

continue;
}

static Float:fl2Origin[3] , Float:fl3Origin[3]
fl3Origin = flOrigin
fl3Origin[2] += 120.0
entity_get_vector(iVictim, EV_VEC_origin, fl2Origin)

// Not alive, zombie or with Godmode
if(!g_bIsAlive[iVictim] || zp_get_user_zombie(iVictim) || get_user_godmode(iVictim) || !get_can_see(fl3Origin, fl2Origin))
continue;

// Screen effects for victims
screen_effects(iVictim)

// Get scream mode
new a
if(g_modenow == 0)
{
a = g_iCvar_ScreamMode
}else{
a = 0
}
switch(a)
{
// Do damage
case 0:
{
// Scream slowdown, first should be enabled
if(g_flCvar_ScreamSlowdown > 0.0)
{
// Get his current velocity vector
static Float:flVelocity[3]
get_user_velocity(iVictim, flVelocity)

// Multiply his velocity by a number
xs_vec_mul_scalar(flVelocity, g_flCvar_ScreamSlowdown, flVelocity)

// Set his new velocity vector
set_user_velocity(iVictim, flVelocity)
}

// Get damage result
static iNewHealth
iNewHealth = max(0, get_user_health(iVictim) - g_iCvar_ScreamDmg)

// Does not has health
if(!iNewHealth)
{
// Be infected when it's going to die
if(g_iCvar_DamageMode /* == 1*/)
{
// Returns 1 on sucess...
if(zp_infect_user(iVictim, id, 0, 1))
continue
}

// Kill it
scream_kill(iVictim, id)

continue
}

// Do fake damage
set_user_health(iVictim, iNewHealth)
}

// Instantly Infect
case 1:
{
if(get_user_armor(iVictim) > 0)
{
if(get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit) >= 0) set_user_armor(iVictim,get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit))
if(get_user_armor(iVictim) - get_pcvar_num(cvar_armorhit) < 0) set_user_armor(iVictim,0)
}else{
// Can be infected?
if(!zp_infect_user(iVictim, id, 0, 1))
{
// Kill it
scream_kill(iVictim, id)
}
}
}

// Instantly Kill
case 2:
{
// Kill it
scream_kill(iVictim, id)
}
}

}
}

/*===============================================================================
=
[Zombie Plague Forwards]
================================================================================
=*/

public zp_user_infected_post(id, infector)
{
// It's the selected zombie class
if(zp_get_user_zombie_class(id) == g_iSirenZID && !zp_get_user_nemesis(id))
{
// Array
g_bCanDoScreams[id] = true
g_bDoingScream[id] = false

// Message
client_printcolor(id, "/g[ZP]/y Ты можешь делать /gкрик/y нажава на /g^"E^"/y клавишу")
}
}

public zp_user_humanized_post(id)
{
// Reset player vars and tasks
stop_scream_task(id)

g_bCanDoScreams[id] = false
g_bDoingScream[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 = 1; id <= g_iMaxPlayers; id++)
{
// Valid connected
if(is_user_valid_connected(id))
{
// Remove mainly tasks
stop_scream_task(id)
remove_task(id+TASK_RELOAD)
}
}
}

/*===============================================================================
=
[Internal Functions]
================================================================================
=*/

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_ONE, g_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_UNRELIABLE, g_msgScreenFade, _, id)
write_short(UNIT_SECOND*1) // duration
write_short(UNIT_SECOND*1) // hold time
write_short(FFADE_IN) // fade type
write_byte(200) // r
write_byte(0) // g
write_byte(0) // b
write_byte(125) // alpha
message_end()

// Screen Shake
message_begin(MSG_ONE_UNRELIABLE, g_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.0, get_pcvar_float(cvar_reloadtime))
g_flCvar_Radius = get_pcvar_float(cvar_radius)
g_flCvar_ScreamSlowdown = get_pcvar_float(cvar_slowdown)
}

scream_kill(victim, attacker)
{
// To use later in DeathMsg event
g_bKilledByScream[victim] = true

// Do kill
ExecuteHamB(Ham_Killed, victim, attacker, GIB_NEVER)

// We don't need this
g_bKilledByScream[victim] = false
}

/*===============================================================================
=
[Stocks]
================================================================================
=*/

stock client_printcolor(id, const input[], any:...)
{
static iPlayersNum[32], iCount; iCount = 1
static szMsg[191]

vformat(szMsg, charsmax(szMsg), input, 3)

replace_all(szMsg, 190, "/g", "^4") // green txt
replace_all(szMsg, 190, "/y", "^1") // orange txt
replace_all(szMsg, 190, "/ctr", "^3") // team txt
replace_all(szMsg, 190, "/w", "^0") // team txt

if(id) iPlayersNum[0] = id
else get_players(iPlayersNum, iCount, "ch")

for (new i = 0; i < iCount; i++)
{
if (g_bIsConnected[iPlayersNum[i]])
{
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, iPlayersNum[i])
write_byte(iPlayersNum[i])
write_string(szMsg)
message_end()
}
}
}
public zp_round_started(gamemode)
{
if(gamemode ==MODE_INFECTION || gamemode == MODE_MULTI)
{
g_modenow = 0
}else{
g_modenow = 1
}
}
stock get_can_see(Float:ent_origin[3], Float:target_origin[3])
{
new Float:hit_origin[3]
trace_line(-1, ent_origin, target_origin, hit_origin)

if (!vector_distance(hit_origin, target_origin)) return 1;

return 0;
}



up
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Connect1507
сообщение 21.3.2012, 17:20
Сообщение #12
Стаж: 14 лет

Сообщений: 172
Благодарностей: 2
Полезность: 22

up
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: