diff --git a/assets/addons/amxmodx/configs/plugins-efk.ini b/assets/addons/amxmodx/configs/plugins-efk.ini index 22fda7c1..92897b7a 100644 --- a/assets/addons/amxmodx/configs/plugins-efk.ini +++ b/assets/addons/amxmodx/configs/plugins-efk.ini @@ -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 diff --git a/assets/addons/amxmodx/data/lang/next21_efk.txt b/assets/addons/amxmodx/data/lang/next21_efk.txt index 73af0414..38c439c6 100644 --- a/assets/addons/amxmodx/data/lang/next21_efk.txt +++ b/assets/addons/amxmodx/data/lang/next21_efk.txt @@ -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 @@ -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 @@ -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 @@ -327,6 +333,7 @@ ITEM_HP = 60 HP ITEM_HS = Защита от HS ITEM_CRITS = Защита от критов ITEM_CHARGEBOOSTER = Ускоритель перезарядки +ITEM_RESISTANCE_BOOTS = Сапоги стойкости BUY_BUNNY = Вы купили автораспрыг. Зажмите кнопку прыжка. BUY_REGENERATION = Вы купили регенерацию здоровья @@ -341,6 +348,7 @@ BUY_HP = Вы купили 60 HP BUY_HS = Вы купили защиту от хэд шотов BUY_CRITS = Вы купили защиту от критов BUY_CHARGEBOOSTER = Вы купили ускоритель перезарядки +BUY_RESISTANCE_BOOTS = Вы купили cапоги cтойкости REGENERATION = Регенерация REGENERATION_CHARGE = Вы продлили регенерацию до %d процентов @@ -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 = Последний раунд с автораспрыжкой @@ -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 @@ -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 @@ -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 diff --git a/src/scripts/items/efk_item_resistance_boots.sma b/src/scripts/items/efk_item_resistance_boots.sma new file mode 100644 index 00000000..5b83579e --- /dev/null +++ b/src/scripts/items/efk_item_resistance_boots.sma @@ -0,0 +1,264 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +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) +}