Hide and Seek: Developer Engine Module

Описание: Модуль включает в себя все необходимое для создания своего мода Hide and Seek. По сути, тот же Hide and Seek: Developer Mode, но в наиболее доработанном виде, ну и, конечно же, реализованный как AMXX Модуль, что несомненно делает его оптимальней, чем версия, реализованная на павне.

Поддерживаемые версии HLDS: 5787,6027,6153 (Windows/Linux).
На остальных билдах работа не гарантирована, т.к. тесты проводились именно на перечисленных.

Установка: Закинуть hnsmod_amxx.dll или hnsmod_amxx_i386.so (в зависимости от ОС) в директорию /cstrike/addons/amxmodx/modules/, и в modules.ini добавить строку hnsmod .

[pawn][MAIN]
{
 
# HNS_FRAG_DURATION — время в секундах, через которое потенциальная жертва фрагера будет лишена защиты.
    HNS_FRAG_DURATION = 3
 
# HNS_TIMER_SECONDS — время таймера, в секундах.
    HNS_TIMER_SECONDS = 10
   
# HNS_SERVER_AA — акселерация на сервере (sv_airaccelerate).
    HNS_SERVER_AA = 100
 
# HNS_BLOCK_MONEY — блокировка изменения HUDа денег.
    HNS_BLOCK_MONEY = 1
}
 
[AUTO JOIN TEAM]
{
 
# HNS_JOIN_TEAM — принудительный выбор команда. 5 — автовыбор.
    HNS_JOIN_TEAM = 5
   
# HNS_JOIN_CLASS — принудительный выбор класса. 5 — автовыбор.
    HNS_JOIN_CLASS = 5
   
# HNS_CHANGE_BLOCK — запрет смены команды во время игры (1/0).
    HNS_CHANGE_BLOCK = 1
}
 
[ENTITY REMOVED LIST]
{
 
#СПИСОК ОБЪЕКТОВ, КОТОРЫЕ БУДУТ УДАЛЕНЫ
 
    func_buyzone
    info_bomb_target
    func_hostage_rescue
    monster_scientist
    hostage_entity
    info_hostage_rescue
    func_bomb_target
    func_escapezone
    info_vip_start
    func_vip_safetyzone
    armoury_entity
    func_breakable
}[/pawn]

API

INCLUDE ( hns_engine.inc ):

Описание функций найдете в нем.[pawn] #if defined _HNSENGINE_
    #endinput
 #endif
 
 #define _HNSENGINE_
 
 #define HNS_NORMAL 1
 #define HNS_SUPERCEDE 2
 
 enum HnsTeams
 {
        HNS_DRAW_OR_UNASSIGNED,
        HNS_TEAM_T,
        HNS_TEAM_CT,
        HNS_TEAM_SPECTATOR
 };
 
/**
 * Вызывается, когда раунд заканчивается в пользу той или иной команды или вничью.
 *
 * @param team                  Победившая команда.
 */
 forward hns_round_end(HnsTeams:team);
 
/**
 * Вызывается, когда таймер закончен и CT начинают действовать.
 *
 * @param index         Индекс игрока.
 */
 forward hns_round_start(index);
 
/**
 * Вызывается в процессе таймера.
 *
 * @param index         Индекс игрока.
 * @param time          Секунды таймера.
 */
 forward hns_timer_process(index, time);
 
/**
 * Вызывается после смены команды игрока, произведенной нативой hns_switch_teams().
 *
 * @param index         Индекс игрока.
 * @param team                  Новая команда игрока.
 */
 forward hns_became_team(index, HnsTeams:team);
 
/**
 * Вызывается когда в опр. команде остается один игрок.
 *
 * @param index         Индекс игрока.
 * @param team          Команда игрока.
 */
 forward hns_player_loner(index, HnsTeams:team);
 
 /**
 * Вызывается до фактического совершения фрага.
 *
 * @param victim                Индекс жертвы.
 * @param attacker              Индекс фрагера (убийцы).
 * @param damage                Нанесенный урон.
 */
 forward hns_frag_pre(victim, attacker, Float: damage);
 
 /**
 * Вызывается после фактического совершения фрага.
 *
 * @param victim                Индекс жертвы.
 * @param attacker              Индекс фрагера (убийцы).
 * @param damage                Нанесенный урон.
 */
 forward hns_frag_post(victim, attacker, Float: damage);
 
  /**
* Вызывается до фактического присоединения к команде.
*
* @param index Индекс игрока.
*/
forward hns_jointeam_pre(index);

/**
* Вызывается после фактического присоединения к команде.
*
* @param index Индекс игрока.
*/
forward hns_jointeam_post(index);
 
/**
 * Функция предназначена для переформирования команд, а именно изменения их местами.
 */
 native hns_switch_teams();
 
 /**
 * Функция возвращает истину, если имеется состав обеих команд.
 */
 native bool:hns_get_gamestarted();
 
 /**
 * Функция возвращает кол-во  игроков в опр. команде.
 *
 * @param team                  Необходимая команда.
 * @param alive                 Брать в рассчет только живых игроков (по умолчанию: false).
 */
 native hns_get_playersnum(HnsTeams:team, bool: alive = false);
 
 /**
 * Функция позволяет изменять команду игрокам.
 *
 * @param index                 Индекс игрока.
 * @param team                  Новая команда игрока.
 */
 native hns_set_user_team(index, HnsTeams:team);
 
 /**
 * Функция возвращает команду игрока.
 *
 * @param index                 Индекс игрока.
 */
 native HnsTeams: hns_get_user_team(index);
 
 /**
 * Функция позволяет ослеплять игрока или наоборот, убирать ослепление.
 *
 * @param index                 Индекс игрока.
 * @param status            Состояние (true/false).
 */
 native hns_set_screenfade(index, bool: status);[/pawn]

Отдельное внимание хотелось бы уделить двум нововведениям: два форварда, которые дают возможность контролировать одно неприятное нарушение многих игроков Hide and Seek — фрагерство. Для тех, кто не знает — это когда контр-террорист догнав террориста не отпускает его после первого удара, а добивает и не дает террористу шанс на то, чтобы тот унес свою тушу.

Информация из заголовочного файла:
[pawn]/**
* Вызывается до фактического совершения фрага.
*
* @param victim Индекс жертвы.
* @param attacker Индекс фрагера (убийцы).
* @param damage Нанесенный урон.
* @param time Оставшееся время действия анти-фрага.
*/
forward hns_frag_pre(victim, attacker, Float: damage, time);

/**
* Вызывается после фактического совершения фрага.
*
* @param victim Индекс жертвы.
* @param attacker Индекс фрагера (убийцы).
* @param damage Нанесенный урон.
* @param time Оставшееся время действия анти-фрага.
*/
forward hns_frag_post(victim, attacker, Float: damage, time);[/pawn]

Покажу вам пример использования данных форвард-функций. Давайте поставим для себя такую задачу — нам нужно защищать админа от фрагерства. В этом случае нам необходимо использовать pre событие, т.к. мы будем блокировать урон:
[pawn]public hns_frag_pre(victim, attacker, Float: damage)
{
    if (get_user_flags(victim) & ADMIN_BAN)//если жертва — админ с флагом ADMIN_BAN
    {
        client_print(attacker, print_chat, «You can not frag an admin.»);//выводим нарушителю сообщение, что нельзя фрагерить админа
        client_print(victim, print_chat,  «Hurry flee!»);//выводим жертве сообщение с советом скорее бежать
       
        return HNS_SUPERCEDE;//блокируем урон по жертве
    }
   
    return HNS_NORMAL;
}[/pawn]
Поставленная задача решена. : )

Теперь поставим перед собой такую задачу: нам нужно написать вспомогательный плагин, который будет просто уведомлять, что фрагерство на сервере запрещено. В этом случае нам подойдет post событие, ведь блокировать мы ничего не будем:
[pawn]public hns_frag_post(victim, attacker, Float: damage)
{
    new szName[32]; get_user_name(attacker, szName, charsmax(szName));//получаем имя нарушителя
   
    client_print(attacker, print_chat, «%s, on this server forbidden frag!», szName);//выводим нарушителю сообщение о том, что фрагерить на сервере запрещено и он получит по попке
}[/pawn]
Собственно, все. Это лишь примеры, все остальное остается на вашей фантазии. : )

Пример реализации эмуляции фризтайма для CT, показ дхуд сообщения с выигравшей командой, а также переформирование команд в случае победы CT уже в архиве.

P.S.: В конфигурационном файле вы можете настроить продолжительность анти-фрага.

Авторы: Eriurias & s1lent
Версия: 2.0.5