Code: Select all
#include <zombie_escape>
#include <xs>
#define ITEM_NAME "Pushing Armor" // Название айтема
#define ITEM_COST 15 // Стоимость айтема
#define ZP_BUY_ARMOR 100.0 // Сколько брони давать при покупке
#define ZP_MAX_ARMOR_VALUE 200.0 // Сколько максимально игрок может купить брони
#define ZP_MAX_BUY 2 // Сколько можно купить брони за один раунд
#define ZP_SOUND_BUY_ARMOR "xman2030/td_nuc_launch.wav" // Звук покупки брони
#define ZP_LIGHT_RED 0 // Красный цвет по RGB
#define ZP_LIGHT_GREEN 255 // Зеленый цвет по RGB
#define ZP_LIGHT_BLUE 0 // Синий цвет по RGB
#define ZP_LIGHT_DISTANCE 45.0 // Дистанция свечения
#define ZP_KNOCKBACK 30.0 // Сила отталкивания
new g_iItemId, bool: g_bUserArmor[33], g_NowBuy[33];
public plugin_precache() engfunc(EngFunc_PrecacheSound, ZP_SOUND_BUY_ARMOR);
public plugin_init()
{
register_plugin("[AMXX | ZP] KnockBack Armor", "0.0.1", "1331");
register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
RegisterHam(Ham_TakeDamage, "player", "HamHook_TakeDamage_Post", 1);
RegisterHam(Ham_Killed, "player", "HamHook_PlayerKilled_Post", 1);
g_iItemId = ze_register_item("Push Armor", 100, 0);
}
public Event_RoundStart()
{
for(new pPlayer = 1; pPlayer <= get_maxplayers(); pPlayer++)
{
if(!is_user_connected(pPlayer) || !g_bUserArmor[pPlayer])
continue;
g_bUserArmor[pPlayer] = false;
}
}
public ze_select_item_pre(id, itemid)
{
// Return Available and we will block it in Post, So it dosen't affect other plugins
if (itemid != g_iItemId)
return ZE_ITEM_AVAILABLE
// Available for Humans only, So don't show it for zombies
if (ze_is_user_zombie(id))
return ZE_ITEM_DONT_SHOW
return ZE_ITEM_AVAILABLE
}
public ze_select_item_post(iPlayer, iItemId)
{
if(iItemId != g_iItemId)
return PLUGIN_HANDLED;
if(g_NowBuy[iPlayer] < ZP_MAX_BUY)
{
new Float: flArmor; pev(iPlayer, pev_armorvalue, flArmor);
if(flArmor >= ZP_MAX_ARMOR_VALUE)
{
client_print(iPlayer, print_center, "You bought push armor");
return ZP_PLUGIN_HANDLED;
}
// Thanks Mercylezz
set_pev(iPlayer, pev_armorvalue, floatmin(flArmor + ZP_BUY_ARMOR, ZP_MAX_ARMOR_VALUE));
emit_sound(iPlayer, CHAN_BODY, ZP_SOUND_BUY_ARMOR, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
g_bUserArmor[iPlayer] = true;
g_NowBuy[iPlayer] ++
return PLUGIN_CONTINUE;
}
else
{
zp_set_user_ammo_packs(iPlayer, zp_get_user_ammo_packs(iPlayer) + ITEM_COST)
client_print(iPlayer, print_center, "Вы купили максимум брони в этом раунде");
}
return PLUGIN_CONTINUE;
}
public HamHook_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, iBitDamage)
{
if(!is_user_alive(iVictim) || !is_user_alive(iAttacker) || iVictim == iAttacker)
return;
if(!ze_is_user_zombie(iAttacker) || ze_is_user_zombie(iVictim))
return;
if(!g_bUserArmor[iVictim] || pev(iVictim, pev_armorvalue) == 0.0)
return;
new Float: vecOrigin[3], Float: vecVelocity[3];
pev(iVictim, pev_origin, vecOrigin);
pev(iAttacker, pev_velocity, vecVelocity);
UTIL_LightPlayer(vecOrigin, floatround(ZP_LIGHT_DISTANCE), ZP_LIGHT_RED, ZP_LIGHT_GREEN, ZP_LIGHT_BLUE, 5, 3);
UTIL_CreateVelocity(iVictim, iAttacker, vecVelocity);
set_pev(iAttacker, pev_velocity, vecVelocity);
}
public HamHook_PlayerKilled_Post(iVictim, iKiller)
{
if(!is_user_alive(iVictim) || !is_user_alive(iKiller) || iVictim == iKiller)
return;
if(!g_bUserArmor[iVictim])
return;
g_bUserArmor[iVictim] = false;
}
// Other
public client_putinserver(iPlayer) if(g_bUserArmor[iPlayer]) g_bUserArmor[iPlayer] = false;
public zp_user_infected_pre(iPlayer) if(g_bUserArmor[iPlayer]) g_bUserArmor[iPlayer] = false;
public zp_user_humanized_pre(iPlayer) if(g_bUserArmor[iPlayer]) g_bUserArmor[iPlayer] = false;
stock UTIL_CreateVelocity(iVictim, iAttacker, Float: vecVelocity[3])
{
new Float: vecVictimOrigin[3], Float: vecAttackerOrigin[3], Float: vecVictimVelocty[3];
pev(iVictim, pev_velocity, vecVictimVelocty);
pev(iVictim, pev_origin, vecVictimOrigin);
pev(iAttacker, pev_origin, vecAttackerOrigin);
new Float: vecOrigin[3]
vecOrigin[0] = vecVictimOrigin[0] - vecAttackerOrigin[0];
vecOrigin[1] = vecVictimOrigin[1] - vecAttackerOrigin[1];
new Float: flLargestNum = 0.0;
if(0 <= floatcmp(floatabs(vecOrigin[0]), floatabs(vecOrigin[1])) <= 1)
{
if(floatabs(vecOrigin[0]) > 0)
flLargestNum = floatabs(vecOrigin[0])
}
else
{
if(floatabs(vecOrigin[1]) > 0)
flLargestNum = floatabs(vecOrigin[1])
}
vecOrigin[0] /= flLargestNum;
vecOrigin[1] /= flLargestNum;
vecVelocity[0] = (vecOrigin[0] * (ZP_KNOCKBACK * 3000)) / get_distance_f(vecVictimOrigin, vecAttackerOrigin);
vecVelocity[1] = (vecOrigin[1] * (ZP_KNOCKBACK * 3000)) / get_distance_f(vecVictimOrigin, vecAttackerOrigin);
vecOrigin[0] += vecVictimVelocty[0];
vecOrigin[1] += vecVictimVelocty[1];
if(vecVelocity[0] <= 20.0 || vecVelocity[1] <= 20.0)
vecVelocity[2] = random_float(180.0 , 220.0);
return 1;
}
stock UTIL_LightPlayer(Float: vecOrigin[3], iRadius, iRed, iGreen, iBlue, iLife, iDecayRate)
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOrigin, 0)
write_byte(TE_DLIGHT) // TE id
engfunc(EngFunc_WriteCoord, vecOrigin[0]) // x
engfunc(EngFunc_WriteCoord, vecOrigin[1]) // y
engfunc(EngFunc_WriteCoord, vecOrigin[2]) // z
write_byte(iRadius) // radius
write_byte(iRed) // r
write_byte(iGreen) // g
write_byte(iBlue) // b
write_byte(iLife) // life
write_byte(iDecayRate) // decay rate
message_end()
}
//// push_armor.sma
//
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\push_armor.sma(73) : error 017: undefined symbol "ZP_PLUGIN_HANDLED"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\push_armor.sma(86) : error 017: undefined symbol "zp_set_user_ammo_packs"
//
// 2 Errors.
// Could not locate output file compiled\push_armor.amx (compile failed).
//
// Compilation Time: 1 sec