Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions assets/addons/amxmodx/configs/plugins-efk.ini
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ efk_item_hp.amxx
efk_item_hp-scan.amxx
efk_item_hs.amxx
efk_item_crits.amxx
efk_item_resistance_boots.amxx
efk_item_vampirism.amxx
efk_item_regeneration.amxx
efk_item_bunny.amxx
Expand Down
18 changes: 18 additions & 0 deletions assets/addons/amxmodx/data/lang/next21_efk.txt
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ ITEM_HP = 60 HP
ITEM_HS = Head shots protection
ITEM_CRITS = Crits protection
ITEM_CHARGEBOOSTER = Charge booster
ITEM_RESISTANCE_BOOTS = Resistance Boots

BUY_BUNNY = You bought a bunnyhop. Hold the jump button.
BUY_REGENERATION = You bought a health regeneration
Expand All @@ -117,6 +118,7 @@ BUY_HP = You bought 60 HP
BUY_HS = You bought head shots protection
BUY_CRITS = You bought crits protection
BUY_CHARGEBOOSTER = You bought a charge booster
BUY_RESISTANCE_BOOTS = You bought the boots of fortitude

REGENERATION = Regeneration
REGENERATION_CHARGE = You have extended the regeneration to %d percent
Expand All @@ -127,6 +129,10 @@ REGENERATION_OFF = Regeneration Off
VAMPIRISM_CHARGE = Vampirism charged up to %d HP
VAMPIRISM_EXHAUSTED = Vampirism has been exhausted

RESISTANCE_CHARGE = Resistance increased by %d
RESISTANCE_EXHAUSTED = Resistance exhausted
PRESENT_RESISTANCE_BOOTS = Resistance Boots

CHARGEBOOSTER_EXHAUSTED = Charge booster has been exhausted

BUNNY_LAST_ROUND = The latest round with bunnyhop
Expand Down Expand Up @@ -327,6 +333,7 @@ ITEM_HP = 60 HP
ITEM_HS = Защита от HS
ITEM_CRITS = Защита от критов
ITEM_CHARGEBOOSTER = Ускоритель перезарядки
ITEM_RESISTANCE_BOOTS = Сапоги стойкости

BUY_BUNNY = Вы купили автораспрыг. Зажмите кнопку прыжка.
BUY_REGENERATION = Вы купили регенерацию здоровья
Expand All @@ -341,6 +348,7 @@ BUY_HP = Вы купили 60 HP
BUY_HS = Вы купили защиту от хэд шотов
BUY_CRITS = Вы купили защиту от критов
BUY_CHARGEBOOSTER = Вы купили ускоритель перезарядки
BUY_RESISTANCE_BOOTS = Вы купили cапоги cтойкости

REGENERATION = Регенерация
REGENERATION_CHARGE = Вы продлили регенерацию до %d процентов
Expand All @@ -351,6 +359,10 @@ REGENERATION_OFF = Регенерация выключена
VAMPIRISM_CHARGE = Вампиризм заряжен до %d HP
VAMPIRISM_EXHAUSTED = Вампиризм исчерпан

RESISTANCE_CHARGE = Стойкость увеличена на %d
RESISTANCE_EXHAUSTED = Стойкость исчерпана
PRESENT_RESISTANCE_BOOTS = Сапоги стойкости

CHARGEBOOSTER_EXHAUSTED = Ускоритель перезарядки израсходован

BUNNY_LAST_ROUND = Последний раунд с автораспрыжкой
Expand Down Expand Up @@ -551,6 +563,7 @@ ITEM_HP = 60 HP
ITEM_HS = Protección contra disparos a la cabeza
ITEM_CRITS = Protección contra críticos
ITEM_CHARGEBOOSTER = Potenciador de carga
ITEM_RESISTANCE_BOOTS = Botas de resistencia

BUY_BUNNY = Has comprado Bunnyhop. Mantén presionado el botón de salto.
BUY_REGENERATION = Has comprado regeneración de salud
Expand All @@ -565,6 +578,7 @@ BUY_HP = Has comprado 60 HP
BUY_HS = Has comprado protección contra disparos a la cabeza
BUY_CRITS = Has comprado protección contra críticos
BUY_CHARGEBOOSTER = Has comprado un potenciador de carga
BUY_RESISTANCE_BOOTS = Compraste las botas de la fortaleza

REGENERATION = Regeneración
REGENERATION_CHARGE = Has aumentado la regeneración al %d por ciento
Expand All @@ -575,6 +589,10 @@ REGENERATION_OFF = Regeneración desactivada
VAMPIRISM_CHARGE = El vampirismo se ha cargado hasta %d HP
VAMPIRISM_EXHAUSTED = El vampirismo se ha agotado

RESISTANCE_CHARGE = Resistencia aumentada en %d
RESISTANCE_EXHAUSTED = Resistencia agotada
PRESENT_RESISTANCE_BOOTS = Botas resistentes

CHARGEBOOSTER_EXHAUSTED = El potenciador de carga se ha agotado

BUNNY_LAST_ROUND = Última ronda con Bunnyhop
Expand Down
264 changes: 264 additions & 0 deletions src/scripts/items/efk_item_resistance_boots.sma
Original file line number Diff line number Diff line change
@@ -0,0 +1,264 @@
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <engine>
#include <hamsandwich>
#include <reapi>
#include <efk_core>
#include <efk_utils>

new const PLUGIN[] = "EFK: Resistance Boots"
new const GAME_TAG[] = EFK_GAME_TAG

const ITEM_RESISTANCE = 300
const ITEM_PRICE = 10000
const Float:DAMAGE_RESTORE_PERCENT = 0.40

#define DAMAGE_RESTORE_START_TIME 2.0
#define DAMAGE_RESTORE_HEAL 4
#define DAMAGE_RESTORE_DELAY 1.0

new g_iItemId
new bool:g_bIsRoundEnded
new g_iFallRestore[MAX_PLAYERS + 1]
new Float:g_flFallRestoreTime[MAX_PLAYERS + 1]

public plugin_init()
{
register_plugin(PLUGIN, EFK_VERSION, "SUMY")

g_iItemId = kc_register_item("ITEM_RESISTANCE_BOOTS","BUY_RESISTANCE_BOOTS","efk_give_item",ITEM_PRICE,.iFlags = ITMF_INVENTORY|ITMF_MENU_REDRAW)

if (g_iItemId < 0)
set_fail_state("[%s] error registration", PLUGIN)

RegisterHam(Ham_TakeDamage,"player","Ham_Player_TakeDamage_Post",true)
RegisterHam(Ham_Player_PreThink,"player","Ham_Player_PreThink_Post")
register_event("TextMsg","event_NewGame","a","2=#Game_Commencing","2=#Game_will_restart_in")

register_logevent("logevent_RoundStart",2,"1=Round_Start")
register_logevent("logevent_RoundEnd",2,"1=Round_End")
}

public client_putinserver(iPlayer)
{
kc_player_set_item_value(iPlayer, g_iItemId, -1)
g_iFallRestore[iPlayer] = 0
}

public client_disconnected(iPlayer)
{
g_iFallRestore[iPlayer] = 0
}

public event_NewGame()
{
g_bIsRoundEnded = false

for (new iPlayer = 1; iPlayer <= MaxClients; iPlayer++)
{
if (is_user_connected(iPlayer))
kc_player_set_item_value(iPlayer, g_iItemId, -1)

g_iFallRestore[iPlayer] = 0
}
}

public logevent_RoundStart()
{
g_bIsRoundEnded = false
}

public logevent_RoundEnd()
{
g_bIsRoundEnded = true
}

public Ham_Player_TakeDamage_Post(iVictim,iInflictor,iAttacker,Float:fDamage,iDamageBits)
{
if (!is_user_alive(iVictim))
return HAM_IGNORED

if (!(iDamageBits & DMG_FALL) || (iAttacker && iAttacker != iVictim))
return HAM_IGNORED

if (fDamage <= 0.0)
return HAM_IGNORED

new iResistance = kc_player_get_item_value(iVictim,g_iItemId)

if (iResistance <= 0)
return HAM_IGNORED

if (!kc_player_item_get_enabled(iVictim,g_iItemId))
{
return HAM_IGNORED
}

if (kc_player_in_protection(iVictim))
return HAM_IGNORED

new iHeal = floatround(fDamage * DAMAGE_RESTORE_PERCENT, floatround_floor)

if (iHeal <= 0)
return HAM_IGNORED

if (iHeal > iResistance)
iHeal = iResistance

if (iHeal <= 0)
return HAM_IGNORED

if (!g_iFallRestore[iVictim])
g_flFallRestoreTime[iVictim] = get_gametime() + DAMAGE_RESTORE_START_TIME

g_iFallRestore[iVictim] += iHeal

spend_resistance(iVictim, iHeal)

return HAM_IGNORED
}


public Ham_Player_PreThink_Post(iPlayer)
{
if (!g_iFallRestore[iPlayer])
return HAM_IGNORED


if (!is_user_alive(iPlayer))
{
g_iFallRestore[iPlayer] = 0
return HAM_IGNORED
}


new Float:fGameTime = get_gametime()

if (g_flFallRestoreTime[iPlayer] > fGameTime)
return HAM_IGNORED


new Float:fMaxHealth = kc_player_get_maxhealth(iPlayer)
new Float:fHealth = Float:get_entvar(iPlayer, var_health)

if (fHealth >= fMaxHealth)
{
refund_resistance(iPlayer, g_iFallRestore[iPlayer])
g_iFallRestore[iPlayer] = 0
return HAM_IGNORED
}

new iChunk = min(g_iFallRestore[iPlayer], DAMAGE_RESTORE_HEAL)
new iActual = iChunk

if (fHealth + float(iChunk) > fMaxHealth)
iActual = floatround(fMaxHealth - fHealth, floatround_floor)

if (iActual <= 0)
{
refund_resistance(iPlayer, g_iFallRestore[iPlayer])
g_iFallRestore[iPlayer] = 0
return HAM_IGNORED
}

set_entvar(iPlayer, var_health, fHealth + float(iActual))

if (iActual < iChunk)
refund_resistance(iPlayer, iChunk - iActual)

g_iFallRestore[iPlayer] -= iChunk

if (g_iFallRestore[iPlayer] > 0)
g_flFallRestoreTime[iPlayer] = fGameTime + DAMAGE_RESTORE_DELAY

return HAM_IGNORED
}

spend_resistance(iPlayer, iAmount)
{
new iResistance = kc_player_get_item_value(iPlayer,g_iItemId)

if (iResistance <= 0)
return

iResistance -= iAmount

if (iResistance > 0)
{
kc_player_set_item_value(iPlayer,g_iItemId,iResistance)
}
else
{
kc_player_set_item_value(iPlayer,g_iItemId,-1)

client_print(iPlayer,print_center,"%L",iPlayer,"RESISTANCE_EXHAUSTED")
}
}

refund_resistance(iPlayer, iAmount)
{
if (iAmount <= 0)
return

new iResistance = kc_player_get_item_value(iPlayer,g_iItemId)

if (iResistance < 0)
return

kc_player_set_item_value(iPlayer,g_iItemId,iResistance + iAmount)
}

public ItemGiveCode:efk_give_item(iPlayer,iSenderImpulse)
{
if (iSenderImpulse == IMPULSE_PRESENT)
{
give_resistance(iPlayer,ITEM_RESISTANCE)
client_print_color(iPlayer,print_team_default,"^4[%s] ^1%L ^3%L",GAME_TAG,iPlayer,"PRESENT_GET",iPlayer,"PRESENT_RESISTANCE_BOOTS")
return ITEM_OK
}

if (iSenderImpulse != iPlayer || !is_user_alive(iPlayer))
{
give_resistance(iPlayer,ITEM_RESISTANCE)
return ITEM_OK
}

if (g_bIsRoundEnded)
return ITEM_NOT_AVAILABLE

if (Float:get_member(iPlayer, m_flNextAttack) > 0.0)
return ITEM_NOT_AVAILABLE

if (kc_player_get_capture(iPlayer) != CAPTURE_NONE)
return ITEM_NOT_AVAILABLE

new VisibilityType:iVisibility =
kc_player_get_visibility(iPlayer)

if (iVisibility >= VIS_TRANS && iVisibility != VIS_CLONE)
return ITEM_NOT_AVAILABLE

give_resistance(iPlayer,ITEM_RESISTANCE)

return ITEM_OK
}

give_resistance(iPlayer,iValue)
{
if (!is_user_connected(iPlayer))
return

new iCurrValue = kc_player_get_item_value(iPlayer,g_iItemId)

if (iCurrValue == -1)
{
iCurrValue = 0

kc_player_item_set_enabled(iPlayer,g_iItemId,true)
}

iCurrValue += iValue
kc_player_set_item_value(iPlayer,g_iItemId,iCurrValue)
client_print(iPlayer,print_center,"%L",iPlayer,"RESISTANCE_CHARGE",iValue)
}