Благодаря.
Код за потвърждение: Избери целия код
// Copyright © 2019 Vaqtincha
/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
const MGRENADE_DAMAGE = 150 // Урон гранаты. (Также влияет на радиус взрыва хардкод (Урон * 3.5 = радиус)
const MGRENADE_DAMAGE_COST = 700 // Цена мега гранаты. (грубо говоря цена урона)
const HEGRENADE_COST_DEFAULT = 300 // Цена НЕ гранаты. (Если у игрока уже есть обычный НЕ то снимается MGRENADE_DAMAGE_COST)
// #define MGRENADE_GRAVITY 0.3 // Гравитация мега гранаты. (Комментируйте если нужен дефолтный)
#define MGRENADE_DANGER_COLOR 225.0, 0.0, 0.0 // Особый рендер летающий гранаты (Комментируйте чтобы отключить)
/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
// #define PL_DEBUG
const MGRENADE_COST = MGRENADE_DAMAGE_COST + HEGRENADE_COST_DEFAULT
#include <amxmodx>
#include <reapi>
public plugin_init()
{
register_plugin("Mega HE Grenade", "0.1", "Vaqtincha")
register_clcmd("megahegren", "ClientCommand_BuyGrenade")
register_clcmd("say /megahe", "ClientCommand_BuyGrenade")
register_clcmd("say_team /megahe", "ClientCommand_BuyGrenade")
RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "CBasePlayer_ThrowGrenade", .post = true)
RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", .post = true)
}
public ClientCommand_BuyGrenade(const pPlayer)
{
if (!CanPlayerBuy(pPlayer))
return PLUGIN_HANDLED
GiveMegaGrenade(pPlayer)
return PLUGIN_HANDLED
}
GiveMegaGrenade(const pPlayer)
{
new pItem = GetHeGrenadeWeaponEntity(pPlayer)
if (pItem != NULLENT)
{
set_entvar(pItem, var_dmg_take, float(MGRENADE_DAMAGE))
rg_add_account(pPlayer, -MGRENADE_DAMAGE_COST)
SendStatusIcon(pPlayer, "d_grenade", 0)
SendStatusIcon(pPlayer, "d_grenade", 1)
emit_sound(pPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
return pItem
}
pItem = rg_give_item(pPlayer, "weapon_hegrenade")
if (!is_nullent(pItem))
{
set_entvar(pItem, var_dmg_take, float(MGRENADE_DAMAGE))
rg_add_account(pPlayer, -MGRENADE_COST)
SendStatusIcon(pPlayer, "d_grenade", 0)
SendStatusIcon(pPlayer, "d_grenade", 1)
return pItem
}
return NULLENT
}
public CBasePlayer_Killed(const pPlayer, const pevAttacker, const iGib)
{
if (is_user_connected(pPlayer))
{
SendStatusIcon(pPlayer, "d_grenade", 0)
}
}
public CBasePlayer_ThrowGrenade(const pPlayer, const pWeapon, Float:vecSrc[3], Float:vecThrow[3], Float:time, const usEvent)
{
new Float:fNewDmg
if (is_nullent(pWeapon) || get_member(pWeapon, m_iId) != WEAPON_HEGRENADE)
return HC_CONTINUE
/* if (pWeapon != get_member(pPlayer, m_pActiveItem))
return HC_CONTINUE */
if ((fNewDmg = get_entvar(pWeapon, var_dmg_take)) != float(MGRENADE_DAMAGE))
return HC_CONTINUE
new pGrenade = GetHookChainReturn(ATYPE_INTEGER)
if (pGrenade > 0 /* && GetGrenadeType(pGrenade) == WEAPON_HEGRENADE */)
{
#if defined PL_DEBUG
server_print("[CBasePlayer_ThrowGrenade] OldDmg %f, NewDmg %f", get_entvar(pGrenade, var_dmg), fNewDmg)
#endif
if (is_user_connected(pPlayer))
{
SendStatusIcon(pPlayer, "d_grenade", 0)
}
set_entvar(pWeapon, var_dmg_take, 0.0)
set_entvar(pGrenade, var_dmg, fNewDmg)
#if defined MGRENADE_GRAVITY
set_entvar(pGrenade, var_gravity, MGRENADE_GRAVITY)
#endif
#if defined MGRENADE_DANGER_COLOR
set_entvar(pGrenade, var_renderfx, kRenderFxGlowShell)
set_entvar(pGrenade, var_rendercolor, Float:{MGRENADE_DANGER_COLOR})
set_entvar(pGrenade, var_renderamt, 150.0)
#endif
}
return HC_CONTINUE
}
bool:CanPlayerBuy(const pPlayer)
{
if (!is_user_alive(pPlayer))
return false
#if !defined PL_DEBUG
new iSignals[UnifiedSignals]
get_member(pPlayer, m_signals, iSignals)
if (!(iSignals[US_State] & any:SIGNAL_BUY))
return false
new Float:flBuyTime = get_cvar_float("mp_buytime")
if (flBuyTime == 0.0)
return false
if (flBuyTime != -1.0 && (get_gametime() - Float:get_member_game(m_fRoundStartTime) > (flBuyTime * 60)))
{
new szBuyTime[3]
// client_print(pPlayer, print_center, "%0.f seconds have passed.^rYou can't buy anything now!", flBuyTime * 60)
num_to_str(floatround(flBuyTime * 60), szBuyTime, charsmax(szBuyTime))
CenterMessage(pPlayer, "#Cant_buy", szBuyTime)
return false
}
#endif
new pItem = GetHeGrenadeWeaponEntity(pPlayer)
if (pItem != NULLENT && floatround(get_entvar(pItem, var_dmg_take)) == MGRENADE_DAMAGE)
{
// client_print(pPlayer, print_center, "You already own that weapon.")
CenterMessage(pPlayer, "#Already_Have_One")
return false
}
if (get_member(pPlayer, m_iAccount) < (pItem != NULLENT ? MGRENADE_DAMAGE_COST : MGRENADE_COST))
{
// client_print(pPlayer, print_center, "You have insufficient funds!")
CenterMessage(pPlayer, "#Not_Enough_Money")
BlinkAccount(pPlayer)
return false
}
return true
}
GetHeGrenadeWeaponEntity(const pPlayer)
{
new pItem = get_member(pPlayer, m_rgpPlayerItems, GRENADE_SLOT)
while (!is_nullent(pItem))
{
if (get_member(pItem, m_iId) == WEAPON_HEGRENADE)
{
return pItem
}
pItem = get_member(pItem, m_pNext)
}
return NULLENT
}
stock CenterMessage(const pPlayer, const szText[], const szText2[] = "")
{
static iMsgIdTextMsg
if (iMsgIdTextMsg || (iMsgIdTextMsg = get_user_msgid("TextMsg")))
{
message_begin(MSG_ONE_UNRELIABLE, iMsgIdTextMsg, .player = pPlayer)
write_byte(print_center)
write_string(szText)
if (szText2[0])
write_string(szText2)
message_end()
}
}
stock BlinkAccount(const pPlayer, const iNumBlinks = 2)
{
static iMsgIdBlinkAcct
if (iMsgIdBlinkAcct || (iMsgIdBlinkAcct = get_user_msgid("BlinkAcct")))
{
message_begin(MSG_ONE_UNRELIABLE, iMsgIdBlinkAcct, .player = pPlayer)
write_byte(iNumBlinks)
message_end()
}
}
stock SendStatusIcon(pPlayer, const szSprite[] = "", iStatus = 0, red = 225, green = 0, blue = 0)
{
static iMsgIdStatusIcon
if (iMsgIdStatusIcon || (iMsgIdStatusIcon = get_user_msgid("StatusIcon")))
{
message_begin(MSG_ONE_UNRELIABLE, iMsgIdStatusIcon, .player = pPlayer)
write_byte(iStatus)
write_string(szSprite)
write_byte(red)
write_byte(green)
write_byte(blue)
message_end()
}
}