Код
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <fun>
#include <cstrike>
#define ACCESS_VIP ADMIN_LEVEL_H
#define is_user_valid_alive(%1) (1 <= %1 <= g_maxplayers && is_user_alive(%1))
#define RADIUS 400.0
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MEN
U_KEY_8|MENU_KEY_9|MENU_KEY_0
enum
{
NOSELECT = 0,
THIEF,
SLIMY,
MEDIC,
VIP
}
new Float:speed_start = 270.0
new Float:speed_add = 10.0
new Float:gravity_start = 0.9
new Float:gravity_add = 0.12
new Float:dmg_start = 1.5
new Float:dmg_add = 0.1
new money_start = 30
new money_add = 10
new health_start = 25
new health_add = 10
new level_max = 5
new kills_1st_lvl = 10
new kills_step = 15
new g_level[33], g_kills[33]
new Float:lvl_speed[33], Float:lvl_gravity[33], Float:lvl_dmg[33], lvl_money[33], lvl_health[33]
new next_lvl[33]
new g_class[33]
new g_maxplayers, g_msgSayText
new g_wave_sprite
public plugin_init()
{
register_plugin("CSDM Classes", "1.0", "ill")
register_clcmd("class_menu", "show_class_menu")
register_menu("Class Menu", KEYSMENU, "class_menu")
RegisterHam(Ham_Killed, "player", "fw_Killed")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
g_maxplayers = get_maxplayers()
g_msgSayText = get_user_msgid("SayText")
}
public plugin_precache()
g_wave_sprite = precache_model("sprites/shockwave.spr")
public client_connect(id)
{
reset_level(id)
g_class[id] = random(3)
}
public reset_level(id)
{
g_kills[id] = 0
g_level[id] = 0
lvl_speed[id] = 250.0
lvl_gravity[id] = 1.0
lvl_money[id] = 30
lvl_dmg[id] = 1.5
lvl_health[id] = 50
remove_task(id)
next_lvl[id] = kills_1st_lvl
}
public fw_PlayerPreThink(id)
{
if(!is_user_alive(id))
return
set_pev(id, pev_maxspeed, lvl_speed[id])
set_pev(id, pev_gravity, lvl_gravity[id])
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if(!is_user_connected(victim) || !is_user_connected(attacker))
return
if(g_class[attacker] == THIEF && get_user_team(victim) != get_user_team(attacker))
{
cs_set_user_money(attacker, cs_get_user_money(attacker) + lvl_money[attacker])
cs_set_user_money(victim, cs_get_user_money(victim) - lvl_money[attacker])
}
else if(g_class[attacker] == VIP)
{
SetHamParamFloat(4, damage * lvl_dmg[attacker])
}
}
public fw_Killed(victim, attacker, corpse)
{
if(!is_user_connected(victim) || !is_user_connected(attacker) || victim == attacker)
return
if(g_level[attacker] >= level_max)
return
g_kills[attacker]++
if(g_kills[attacker] >= next_lvl[attacker]) {
next_lvl[attacker] += kills_step
g_level[attacker]++
colored_print(attacker, "^x01[^x04Информация^x01] Вы достигли^x04 %d ^x01уровня. Следующий через^x04 %d ^x01убийств.", g_level[attacker], next_lvl[attacker])
g_kills[attacker] = 0
switch(g_class[attacker])
{
case THIEF:
{
lvl_money[attacker] += money_add
}
case SLIMY:
{
lvl_speed[attacker] += speed_add
lvl_gravity[attacker] -= gravity_add
}
case MEDIC:
{
lvl_health[attacker] += health_add
}
case VIP:
{
lvl_gravity[attacker] -= gravity_add
lvl_dmg[attacker] += dmg_add
}
}
}
}
public show_class_menu(id)
{
static menu[450], len
len = 0
len += formatex(menu[len], charsmax(menu) - len, "\yВыберите класс^n^n")
if(g_class[id] == THIEF)
len += formatex(menu[len], charsmax(menu) - len, "\r1.\d Вор [\rворует деньги\d]^n")
else
len += formatex(menu[len], charsmax(menu) - len, "\r1.\w Вор [\rворует деньги\w]^n")
if(g_class[id] == SLIMY)
len += formatex(menu[len], charsmax(menu) - len, "\r2.\d Скользкий [\rскорость/гравити\d]^n")
else
len += formatex(menu[len], charsmax(menu) - len, "\r2.\w Скользкий [\rскорость/гравити\w]^n")
if(g_class[id] == MEDIC)
len += formatex(menu[len], charsmax(menu) - len, "\r3.\d Целитель [\rлечит игроков\d]^n")
else
len += formatex(menu[len], charsmax(menu) - len, "\r3.\w Целитель [\rлечит игроков\w]^n")
if(g_class[id] == VIP || !(get_user_flags(id) & ACCESS_VIP))
len += formatex(menu[len], charsmax(menu) - len, "\r4.\d VIP [\rурон/гравитация\d]^n")
else
len += formatex(menu[len], charsmax(menu) - len, "\r4.\w VIP [\rурон/гравитация\w]^n")
len += formatex(menu[len], charsmax(menu) - len, "^n\r0.\w Выход")
show_menu(id, KEYSMENU, menu, -1, "Class Menu")
}
public class_menu(id, key)
{
switch (key)
{
case 0:
{
if(g_class[id] == THIEF)
{
show_class_menu(id)
return
}
g_class[id] = THIEF
reset_level(id)
lvl_money[id] = money_start
colored_print(id, "^x01[^x04Информация^x01] Вы выбрали класс: ^x03Вор^x01.")
colored_print(id, "^x01[^x04Информация^x01] Этот класс ^x04ворует деньги при каждом попадании^x01.")
}
case 1:
{
if(g_class[id] == SLIMY)
{
show_class_menu(id)
return
}
g_class[id] = SLIMY
reset_level(id)
lvl_speed[id] = speed_start
lvl_gravity[id] = gravity_start
colored_print(id, "^x01[^x04Информация^x01] Вы выбрали класс: ^x03Скользкий^x01.")
colored_print(id, "^x01[^x04Информация^x01] Этот класс имеет ^x04повышенную скорость и гравитацию^x01.")
}
case 2:
{
if(g_class[id] == MEDIC)
{
show_class_menu(id)
return
}
g_class[id] = MEDIC
reset_level(id)
lvl_health[id] = health_start
client_print(id, print_chat, "[debug] lvl_health[id] = %d", lvl_health[id])
set_task(15.0, "healing", id, _, _, "b")
colored_print(id, "^x01[^x04Информация^x01] Вы выбрали класс: ^x03Целитель^x01.")
colored_print(id, "^x01[^x04Информация^x01] Этот класс может ^x04исцелять себя и союзников которые рядом с вами^x01.")
}
case 3:
{
if(g_class[id] == VIP)
{
show_class_menu(id)
return
}
if(!(get_user_flags(id) & ACCESS_VIP))
{
show_class_menu(id)
colored_print(id, "^x01[^x04Информация^x01] Этот класс только для ^x04VIP клиентов^x01.")
return
}
g_class[id] = VIP
reset_level(id)
lvl_gravity[id] = gravity_start
lvl_dmg[id] = dmg_start
colored_print(id, "^x01[^x04Информация^x01] Вы выбрали класс: ^x03VIP^x01.")
colored_print(id, "^x01[^x04Информация^x01] Этот класс имеет ^x04увеличенный урон и гравитацию^x01.")
}
}
}
public healing(id)
{
if(!is_user_alive(id))
return
static Float:originF[3], victim = -1
pev(id, pev_origin, originF)
create_ring(originF, RADIUS, 4, 65, 0, 234, 0)
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, RADIUS)) != 0)
{
if (!is_user_valid_alive(victim))
continue;
if(get_user_team(id) != get_user_team(victim))
continue;
new newhp = get_user_health(victim) + lvl_health[id]
new limit = 150
if(newhp < limit)
set_user_health(victim, newhp)
else
set_user_health(victim, limit)
}
}
stock colored_print( target, const message[], any:... )
{
static buffer[ 512 ]
if( !target )
{
static player
for( player = 1; player <= g_maxplayers; player++ )
{
if ( !is_user_connected( player ) )
continue;
vformat( buffer, charsmax( buffer ), message, 3 )
message_begin( MSG_ONE_UNRELIABLE, g_msgSayText, _, player )
write_byte( player )
write_string( buffer )
message_end()
}
}
else
{
vformat( buffer, charsmax( buffer ), message, 3 )
message_begin( MSG_ONE, g_msgSayText, _, target )
write_byte( target )
write_string( buffer )
message_end()
}
}
create_ring(const Float:flOrigin[3], Float:radius, life, width, r, g, b)
{
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] - 25.0) // z
engfunc(EngFunc_WriteCoord, flOrigin[0]) // x axis
engfunc(EngFunc_WriteCoord, flOrigin[1]) // y axis
engfunc(EngFunc_WriteCoord, flOrigin[2] + radius) // z axis
write_short(g_wave_sprite) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(life) // life
write_byte(width) // width
write_byte(0) // noise
write_byte(r) // red
write_byte(g) // green
write_byte(b) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}