Этот плагин очень просто разбирается с игроками, которые килают заложников. Он работает только на картах с заложниками.
Вы можете указать наказание (при помощи cvars) для игроков которые убивают заложников. Плагин блокирует любое нанесение урона заложнику.
Cvars:
варианты наказаний - hp_punishment: 0 - ничего | 1 - наносит урон игроку | 2 - самойбийство | 3 - бан | 4 - случайное действие
урон игроку - hp_slap_value: от 0 до 100
время бана - hp_ban_time: время бана (0 навсегда)
кровь заложника - hp_showblood: 1 - да, 0 - нет.
Установка:
1 Скачайте файл.
2 Положите hostage_protection.amxx в addons/amxmodx/plugins
3 Откройте addons/amxmodx/configs/plugins.ini и добавьте в конец строку hostage_protection.amxx
4 Положите hostage_protection.txt в addons/amxmodx/data/lang
5 Перезапустите сервер или смените карту.
Код плагина:
/*
Copyleft 2016 @ HamletEagle
Plugin Theard: https://forums.alliedmods.net/showthread.php?t=242948
Hostage Protection is free software;
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Hostage Protection; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include <amxmodx>
#include <hamsandwich>
#include <engine>
#include <cstrike>
#include <fun>
#include <fakemeta>
#if AMXX_VERSION_NUM >= 183
#include <csx>
#endif
#define PluginName "Hostage Protection"
#define PluginVersion "1.8"
#define PluginAuthor "HamletEagle"
#define ValidPlayer(%0) (1 <= %0 <= MaxPlayers)
enum _:CvarsData
{
Slap,
Ban,
Punish,
Blood,
Team
}
new MaxPlayers
new HandleCvars[CvarsData]
new bool:IsAmxBansRunning
new HamHook:HandleCHostageTraceAttackHook
new HamHook:HandleCHostageTakeDamageHook
stock const m_rgpPlayerItems_CBasePlayer[ 6 ] = { 367 , 368 , ... }
const XO_PLAYER = 5
public plugin_init()
{
register_plugin
(
.plugin_name = PluginName,
.version = PluginVersion,
.author = PluginAuthor
)
register_dictionary("hostage_protection.txt")
new const HostageEntity[] = "hostage_entity"
HandleCHostageTraceAttackHook = RegisterHam(Ham_TraceAttack, HostageEntity, "CHostage_TraceAttack", false)
HandleCHostageTakeDamageHook = RegisterHam(Ham_TakeDamage , HostageEntity, "CHostage_TakeDamage" , false)
HandleCvars[Slap ] = register_cvar("hp_slap_value", "25")
HandleCvars[Ban ] = register_cvar("hp_ban_time" , "10")
HandleCvars[Punish ] = register_cvar("hp_punishment", "4" )
HandleCvars[Blood ] = register_cvar("hp_showblood" , "0" )
HandleCvars[Team ] = register_cvar("hp_blockteam" , "b" )
register_event("HLTV", "OnNewRound_Event", "a", "1=0", "2=0")
MaxPlayers = get_maxplayers()
CheckMapType()
}
public plugin_cfg()
{
if(is_plugin_loaded("amxbans_core.amxx", true) != -1)
{
IsAmxBansRunning = true
}
}
public plugin_pause()
{
DisableHamForward(HandleCHostageTraceAttackHook)
DisableHamForward(HandleCHostageTakeDamageHook)
}
public plugin_unpause()
{
EnableHamForward(HandleCHostageTraceAttackHook)
EnableHamForward(HandleCHostageTakeDamageHook)
}
CheckMapType()
{
#if AMXX_VERSION_NUM < 183
new const EntClasses[][] =
{
"func_hostage_rescue",
"info_hostage_rescue",
"hostage_entity",
"monster_entity"
}
for(new i; i < sizeof EntClasses; i++)
{
if(find_ent_by_class(-1, EntClasses[i]))
{
//At least a needed ent is here, return
return
}
}
#else
if(get_map_objectives() & MapObjective_Hostage)
{
return
}
#endif
log_amx("%L", LANG_SERVER, "HP_FAILPLUGIN")
pause("a")
}
public CHostage_TraceAttack(Ent, Attacker)
{
if(GetTeamToBlock(get_user_team(Attacker)))
{
if(get_pcvar_num(HandleCvars[Punish]) != 0)
{
PunishPlayer(Attacker)
}
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public CHostage_TakeDamage(Victim, Inflictor, Attacker)
{
if(ValidPlayer(Attacker))
{
if(GetTeamToBlock(get_user_team(Attacker)))
{
if(get_pcvar_num(HandleCvars[Punish]) != 0)
{
PunishPlayer(Attacker)
}
return HAM_SUPERCEDE
}
}
return HAM_IGNORED
}
public OnNewRound_Event()
{
if(!get_pcvar_num(HandleCvars[Blood]))
{
EnableHamForward(HandleCHostageTraceAttackHook)
}
else
{
DisableHamForward(HandleCHostageTraceAttackHook)
}
}
PunishPlayer(Attacker)
{
new Userid = get_user_userid(Attacker)
switch(get_pcvar_num(HandleCvars[Punish]))
{
case 1:
{
server_cmd("amx_slap #%i %i", Userid, get_pcvar_num(HandleCvars[Slap]))
}
case 2:
{
server_cmd("amx_slay #%i", Userid)
}
case 3:
{
if(!IsAmxBansRunning)
{
server_cmd("amx_ban #%i %i ^"%L^"", Userid, get_pcvar_num(HandleCvars[Ban]), Userid, "HP_NOTALLOWED")
}
else
{
server_cmd("amx_ban %i #%i ^"%L^"", get_pcvar_num(HandleCvars[Ban]), Userid, "HP_NOTALLOWED")
}
}
case 4 :
{
switch(random_num(1, 3))
{
case 1:
{
set_user_health(Attacker, (get_user_health(Attacker) / 2))
}
case 2:
{
cs_set_user_money(Attacker, (cs_get_user_money(Attacker) / 2))
}
case 3:
{
if(!HasOnlyKnife(Attacker))
{
strip_user_weapons(Attacker)
give_item(Attacker, "weapon_knife")
}
}
}
}
}
}
HasOnlyKnife(id)
{
for(new i = 1; i < 5; i++)//5 because on cs_ maps player can't have a c4
{
if(get_pdata_cbase(id, m_rgpPlayerItems_CBasePlayer[i], XO_PLAYER) != -1)
{
if(i != 3)
{
return false
}
}
}
return true
}
bool:GetTeamToBlock(PlayerTeam)
{
new TeamIdentifier[2]
get_pcvar_string(HandleCvars[Team], TeamIdentifier, charsmax(TeamIdentifier))
new Index
switch(TeamIdentifier[0])
{
case 't':
{
Index = 1
}
case 'c':
{
Index = 2
}
case 'b':
{
Index = 3
}
}
if(Index == 3 || PlayerTeam == Index)
{
return true
}
return false
}