1. Скачайте по ЭТОЙ ссылке weapon_limit.hueco_mundo и переместите в addons/sourcemod/plugins/ws_vip/ или plugins/ws_knife_arena и т.п. (требуется один любой купленный плагин из ЭТИХ).
2. Распакуйте ЭТОТ архив с конфигами. 3. Включите/перезагрузите сервер.
Это улучшенная (с 0 переписанная) версия вот этой бесплатной. Работает по принципу SDKHook_WeaponCanUse, когда ограниченное оружие лежит на земле и ничего с ним не сделать. Но есть отличие от plugin'ов, что я видел на форумах, а именно: слабая нагрузка. Например, в SDKHook_WeaponCanUse callback'е (а он вызывается 66/100 раз в секунду) не используется ни один native. Поэтому, даже если 64 игрока будут стоять на ограниченном оружии, то вряд ли это как-то грузанёт сервер.
Теперь поддерживается всё актуальное CSGO оружие. Раньше можно было ограничить только сразу m4a1 + m4a1_silencer, а теперь можно и отдельные на выбор. Теперь можно ограничить оружие 'x' для команды T и 'y' (другое число) для команды CT, или ограничить только T или CT.
cfg/weapon_limit/weapon_limit.cfg - настройки. cfg/weapon_limit/weapon_limit.txt - ограничить оружие на нужных картах. addons/sourcemod/scripting/include/weapon_limit.inc - api.
Код
// 1 = ограничение оружия работает. // 0 = ограничение оружия приостановлено. Перед сменой карты изменится на 1, но раз здесь 0, то будет снова 0. wl_enabled "1"
// awp ограничено 1 на команду. // Игрок с иммунитетом поднял awp. // Товарищ по команде без иммунитета пытается поднять второе awp. // 0 = сможет поднять. // 1 = не сможет. wl_count_immune_players "0"
// Если оружие ограничено 0 на команду, сможет ли игрок с иммунитетом его покупать/использовать? (1 = да, 0 = нет). wl_immunity_when_zero "0"
// Если начался новый раунд и у команды в руках больше оружия, чем положено: // 0 = ничего не делать.Оружие станет недоступным для игрока, только когда он сам его выбросит, и только если у него нет иммунитета. // 1 = выбросить лишнее оружие. // 2 = удалить лишнее оружие. // Чьё из игроков оружие будет выброшено/удалено: игроки выбираются случайно из тех, у кого нет иммунитета. // Команда может оказаться с лишним оружием, например, из-за смены команды игроков в конце раунда, когда перемещаются живые игроки . wl_drop_limited_at_round_start "1"
// Звук предупреждения, когда игрок не может купить оружие, т.к. оно ограничено ("" = откл). wl_sound "resource/warning.wav"
В примере ниже ограничение для awp работает:
- на карте cs_office. - на всех de картах, кроме de_dust2. - на всех awp_ картах. - у T по одному awp на каждые 5 товарищей по команде. - игрокам CT покупать/поднимать awp запрещено.
Код
"awp" { // Количество на команду. // // Если wl_count_immune_players "0" (игроков с иммунитетом не считать), и иммунитет для оружия работает, то игроки с иммунитетом не считаются. // Может быть указано только одно значение для "tt_limit" и одно для "ct_limit". // "tt_limit" и "ct_limit" никак не связаны, т.к. ограничение настраивается для конкретной команды (неважно что там в другой). // // Способ 1: Постоянное значение. //-1 = разрешено всем (или можно указать "", или удалить параметр). // 0 = запрещено всем. // 1 = одно оружие на команду. // 2 = два оружия на команду и т.д. // // Способ 2: Соотношение "1:x" (по одному оружию на каждые 'x' товарищей по команде). // "1:" указывать обязательно, а "x" может быть от 2 и выше. // Например, при "tt_limit" "1:3" ограничение работает так: // 1-3 t игрока = 1 оружие на t команду. // 4-6 t игрока = 2 оружия на t команду. // 7-9 t игрока = 3 оружия на t команду. // 10-12 t игрока = 4 оружия на t команду. // И т.д. (всегда добавляется +3, т.к. указано "1:3"). // "tt_limit" "1:5" "ct_limit" "0"
// На каких картах работает ограничение. "ALL" = на всех картах. "map" { "cs_office" "" }
// На каких картах работает ограничение (любые префиксы). "map prefixes" { "de" "" "awp_" "" }
// На каких картах ограничение НЕ работает. "map ignore" { "de_dust2" "" }
// На каких картах ограничение НЕ работает (любые префиксы). "map prefixes ignore" {
typeset WL_CB { function bool (int client, const char[] sWeapon, int limit, bool &warningSound); function void (CSWeaponID weapon_id, int old_tt_limit, int new_tt_limit, int old_ct_limit, int new_ct_limit); }
native bool WL_GetWeaponLimit(CSWeaponID weapon_id, int &tt_limit, int &ct_limit, int &tt_ratio=0, int &ct_ratio=0); native void WL_SetWeaponLimit(CSWeaponID weapon_id, int tt_limit=-2, int ct_limit=-2, bool ratio=false);
native ArrayList WL_GetWeaponRefList(CSWeaponID weapon_id, int &arrayLength=0); native bool WL_IsValidWeaponID(CSWeaponID &weapon_id); native bool WL_IsClientCanPickupWeapon(int client, int weapon_index);
native WL_SetImmunity (и WL_SetWeaponImmunity) сделан так, чтобы плагины друг с другом не конфликтовали. Когда plugin выдаёт иммунитет игроку, то счётчик увеличивается и иммунитет работает, пока число > 0. А когда plugin отбирает иммунитет или отключается, то он отбирает конкретно тот, который выдал (отобрать чужие не получится).
После смены карты весь иммунитет очищается и вступают в силу настройки из weapon_limit.txt.
Дата: Понедельник, 23.05.2022, 11:03:44 | Сообщение # 4
ЦитатаLexx77 ()
По флагам нельзя разграничить оружие? К примеру awp и скорострелки.
В ближайшее время это будет. Я продолжаю его обновлять. Стоп, речь про иммунитет по флагу же? И чтобы для каждого оружия указывать свой флаг можно было? Не знаю, как-то это не так выглядит, обычно вроде дают сразу весь иммунитет ко всему оружию.
Стоп, речь про иммунитет по флагу же? И чтобы для каждого оружия указывать свой флаг можно было? Не знаю, как-то это не так выглядит, обычно вроде дают сразу весь иммунитет ко всему оружию.
Да нужно разделить скорострелки и awp, awp остается на флаг "a", скорострелки на другой.
- Теперь tt_limit/ct_limit можно указывать и так: "1:2", "1:3", "1:4", и т.д. ("одно оружие на 'x' товарищей по команде"). Player Count Cfg plugin не подходит для подсчёта игроков, т.к. всегда считает и игроков с иммунитетом. Например, при "tt_limit" "1:3" ограничение работает так:
Код
1-3 t игрока = 1 оружие на t команду. При wl_count_immune_players "0" игроки с иммунитетом не учитываются. 4-6 t игрока = 2 оружия на t команду. 7-9 t игрока = 3 оружия на t команду. 10-12 t игрока = 4 оружия на t команду. И т.д.
- Если wl_drop_limited_at_round_start "1", то событие round_start вызывается с задержкой (0.15 сек), чтобы дать время другим плагинам подгрузить .cfg и т.д.
- К native WL_SetWeaponLimit добавлен параметр bool ratio=false
Дата: Четверг, 26.05.2022, 18:40:53 | Сообщение # 7
v2.0.4
- Исправлена ошибка, когда событие WL_OnLimitChanged не вызывалось. Теперь вызов для конкретного оружия будет, только если это оружие есть на карте (во избежание нагрузки).
- Исправлена ошибка, когда после перезахода на сервер, игроку не выдавался иммунитет. - Исправлена ошибка, когда не удавалось отменить "1:x" (ratio) ограничение. - В native WL_GetWeaponLimit добавлены параметры int &tt_ratio=0, int &ct_ratio=0. - Теперь weapon_limit.txt парсится в OnConfigsExecuted, чтобы у других плагинов была возможность что-то сделать с файлом в OnMapStart. - В weapon_limit.txt изменено описание для "tt_limit" и "ct_limit", чтобы было более понятно. - Добавлено:
Код
// Будет ли работать иммунитет при использовании указанного оружия. native void WL_SetWeaponImmunity(CSWeaponID weapon_id, bool immunity, int team=0);
// Работает ли иммунитет при использовании указанного оружия? native bool WL_GetWeaponImmunity(CSWeaponID weapon_id, bool &tt_immunity, bool &ct_immunity);
А если например у игрока есть уже VIP но другой группы и я ему хочу добавить ИММУНИТЕТ НА AWP. как это сделать не добавляя в файл которые находятся в groups
Дата: Понедельник, 06.06.2022, 20:54:08 | Сообщение # 12
Цитатаyeah ()
А если например у игрока есть уже VIP но другой группы и я ему хочу добавить ИММУНИТЕТ НА AWP. как это сделать не добавляя в файл которые находятся в groups
VIP доступ же зависит от группы. Чтобы дать VIP игроку иммунитет к Weapon Limit, ставим VIP [Immunity To Weapon Limit] модуль и в группу пишем wl_immunity. Если в группу писать не хочется, то заказывать у кого-то. В .inc есть: