Русское сообщество по скриптингу

Furrien Mode

Утвержденные плагины для AMX Mod X администратором/модератором форума.

Модератор: Leonidddd

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только работоспособных плагинов для AMX Mod X. Новые плагины нужно выкладывать в разделе "Новые плагины".

Furrien Mode

Сообщение БиЗоН » 29 дек 2018, 04:06

Автор: 6u3oH
Стабильная версия: 2.1
Описание: Мод представляет собой противостояние двух команд: фурий (бывших людей, зараженных вирусом, стремящихся убить всех оставшихся живых людей) и альянса (выживших людей, объединившихся под эгидой: "Смерть заражённым").

Суть мода.
В начале раунда одна из команд становится фуриями (если побеждает в предыдущем раунде или, если ничья и рандом определит её таковой), вторая - альянсом (если проигрывает в предыдущем раунде или, если ничья и рандом определит её таковой).
Фурии имеют свою модель, высокую скорость бега, низкую гравитацию и невидимость (невидимы в том случае, если стоят на месте, полуневидимы, если передвигаются тихо (shift) или если передвигаются в присяде (ctrl)), не могут использовать оружие, только нож.
Альянс имеет свою модель, но не имеет никаких способностей (ни скорости, ни гравитации), но имеет возможность использовать оружие.
Одна из команд выигрывает, если перебьет всех игроков из противоположной команды либо если взорвёт/разминирует бомбу.
Имеется разделение фурий по классам.
1) Декстер. Скилл (активируется буквой G): создает вокруг себя продолжительное кол-во времени звуковые волны расширенного частотного диапазона, что сбивает противникам прицел и наносит небольшой урон. Атаковать такую фурию стоит с расстояния, не подходя близко
2) Виндок. Скилл (активируется автоматически): ограничивает наносимый урон до N единиц, при ранении мгновенно активирует регенерацию, пока не восполнится первоначальное кол-во здоровье. Атаковать такую фурию нужно массовым огнем, единичные редкие попадания никогда не убьют её
3) Мерсер. Скилл (активируется буквой G): создает перед собой шипы в количестве N единиц (шипы находятся в небольшом рандомном разбросе), которые наносят урон противнику и замедляют его. Атаковать в лоб такую фурию крайне не рекомендуется
4) Сканер. Скилл (активируется автоматически): усиливает охотничьи инстинкты и врожденные чувства для нахождения всех сил соперников.
Для альянса имеется система уровней, которая варьирует количество здоровья и наносимый урон в зависимости от уровня.

Каждая из команд имеет свой магазин со своими различными предметами.
1) Здоровье
2) Щипцы
3) Взрывная граната
4) Ослепляющая граната
5) Замораживающая граната
6) Артефакт D (множитель урона) (сопровождается инонкой)
7) Артефакт R (регенерация здоровья) (сопровождается инонкой)
8) Артефакт J (множитель прыжков) (сопровождается инонкой)
9) Липучки (возможность цепляться к стенам [E])

Здоровье + бронежилет
2) Щипцы
3) Взрывная граната
4) Ослепляющая граната
5) Замораживающая граната
6) Распрыжка
7) Мина

Победа/поражение команд красиво сопровождаются переливающимся DHUD'ом рандомного цвета, а также специфической музыкой.
Также присутствует информер, который отображает команду, класс, уровень; при наведении на игрока отображается соответствующая информация.
nightvision (N) - для открытия основного меню
say /shop - для открытия магазина
say_team /shop - для открытия магазина
shop - для открытия магазина
say /class - для открытия меню выбора классов
say_team /class - для открытия меню выбора классов
classes_menu - для открытия меню выбора классов

Нативы:
is_user_furrien(id) - возвращает команду (фурия/альянс)
set_block_speed(id) - блокировка сброса скорости (для установки своей)
reset_block_speed(id) - разблокировка сброса скорости (для сброса установленной своей)
get_user_class(id) - возвращает номер текущего класса для игрока
set_user_class(id, iNum) - устанавливает класс игроку (iNum - идентификатор класса)
get_user_lvl(id) - возвращает текущий уровень игрока
set_user_lvl(id, iNum) - устанавливает уровень игроку (iNum - уровень)

Форварды:
1) register_class(const sName[], const sInfo[], const sModel[], iFlag) - регистрирует новый класс (возвращает идентификатор зарегистрированного героя, если всё успешно, иначе -1)
sName - имя класса
sInfo - описание класса
sModel - модель класса
iFlag - флаг доступа (get_user_flags) к классу (-1, если не нужно проверять флаг)
2) register_item(iTeam, sNameItem[], iCostItem, iLimitItem, sCallFuncItem[]) - register_item регистрирует предмет для добавления его в магазин
iTeam - команда, в магазин которой будет добавлен предмет (см. выше константы команд)
sNameItem - имя предмета, которое будет отображаться в магазине
iCostItem - цена предмета
iLimitItem - лимит покупки предмета на раунд (-1 - безлимитная покупка)
sCallFuncItem - имя функции-обработчика, которая будет вызвана при покупке предмета
Примеры можно посмотреть в исходниках.

- Добавлены классы фурий
- Добавлена система выбора оружий для альянса
- Выдача основного оружия (1 раз за респавн) [имеются VIP-предметы]
- Выдача вторичного оружия (1 раз за респавн) [имеются VIP-предметы]
- Добавлена система уровней
- Добавлен предмет для альянса "Мина". Мина ставится на землю, наступившие на неё фурии получают урон от взрыва
- Пофикшена замораживающая граната, а также расширен её функционал
- Мелкие фиксы и повышение производительности засчёт улучшения оптимизации
- Плагин полностью теперь ориентирован на AMXX v1.8.3 (ниже версии не поддерживаются)
- Все саб-плагины зашиты в ядро (furrienmod_core.sma)
- Были исключены по возможности излишние библиотеки (fun, cstrike, csx - по просьбам пользователей)
- Расширена система API

- Исправлены присутствующие баги.
- Произведена некоторая оптимизация.
- Добавлен конфиг-файл для настроек мода.

Вы должны зарегистрироваться, чтобы видеть ссылки.

Утверждено. //Leonidddd
Последний раз редактировалось БиЗоН 23 июл 2019, 00:38, всего редактировалось 5 раз(а).
Вечно занятой. Вечно в павне.
Аватара пользователя
БиЗоН
 
Сообщения: 165
Зарегистрирован: 24 мар 2014, 21:05
Благодарил (а): 10 раз.
Поблагодарили: 49 раз.
Опыт программирования: Больше трех лет

Re: Furrien Mode

Сообщение Leonidddd » 30 дек 2018, 11:21

Добрый день, здесь не хватает изображений, и там очень большое кол-во лишних форвардов(да и вообще модулей использовано как-то много, что с одной стороны и хорошо, что умеете пользоваться разными модулями, но для оптимизации уже пора бы потихоньку переезжать на reapi, который практически все модули амхх заменяет), но это походу пьесы поправлять уже будем.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Furrien Mode

Сообщение БиЗоН » 03 янв 2019, 03:13

Leonidddd, зачем изображения? Показать худ/дхуд-сообщения? Модели фурий/альянса? Не вижу смысла.
Какая связь между используемым кол-вом модулей и оптимизацией? То, что память постоянная экономится, да и всё в общем-то.
Я только окунаюсь в изучение функций reapi, так что следующий релиз будет двух версий на 1.8.3 обычный, а также для reapi.
P.S. Замечание насчёт картинок я учту.
Вечно занятой. Вечно в павне.
Аватара пользователя
БиЗоН
 
Сообщения: 165
Зарегистрирован: 24 мар 2014, 21:05
Благодарил (а): 10 раз.
Поблагодарили: 49 раз.
Опыт программирования: Больше трех лет

Re: Furrien Mode

Сообщение Leonidddd » 12 янв 2019, 17:58

Плагин утверждён, кое-какие замечания по коду есть, позже отпишу, что там не так.
Мод довольно-таки интересен, давным-давно на него как-то наткнулся, так что доведём его до ума.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Furrien Mode

Сообщение glacier2009 » 21 апр 2019, 10:17

Пацаны Здорова, слушай возможно это творение изменить на определенное время т.е с 2.00 ночи да 8.00 утра, (время сам замутишь) ну а потом также паблик или что у кого...
Аватара пользователя
glacier2009
 
Сообщения: 14
Зарегистрирован: 04 мар 2012, 08:54
Откуда: RUSSIA
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.

Re: Furrien Mode

Сообщение CyberMan » 30 май 2019, 23:30

На AMX Mod X 1.9 не может скомпилироваться ядро мода:

Код: Выделить всё

// C:\Servers\CS\Server\cstrike\addons\amxmodx\scripting\furrienmod_core.sma(2) : fatal error 100: cannot read from file: "dhudmessage"
Аватара пользователя
CyberMan
 
Сообщения: 2
Зарегистрирован: 08 окт 2017, 14:01
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Furrien Mode

Сообщение Leonidddd » 12 июн 2019, 06:56

Итак, кажется я обещал несколько желательных поправок, что-то слегка задержался, но лучше поздно чем никогда. И так, поехали:

1.
Код: Выделить всё
    if(!is_user_connected(iVictim))
        return;

В Ham функциях вместо неё достаточно использовать if(1<id<g_maxplaers){ ... }

2. Использовать синк для выставления невидимости, ну... таска с 0.2 вполне бы хватило.

3. Тут ещё и фулпак для выставления невидимости? Эм... как бы, уже и так выставляли в синке, неужели не выставляет и без него?

4. Ради отлова смены ника использовать FM_ClientUserInfoChanged ? Зачем? Она довольно-таки часто вызывается, лучше уж получать в Task_Show_HudMsg, особо не много производительности потеряется, даже прибавится.

5. Заметил бесконечной таск
Код: Выделить всё
set_task(2.0, "Task_Show_HudMsg", .flags = "b");
, как по мне, циклично пускать проверку на показ худа каждую секунду по 32 индексам дурной тон. Гораздо лучше при заходе/возрождении игрока выдать ему бесконечный таск уж и при смерти/выходе игрока, короче говоря в нужный момент, попросту отключать удаляя таск.

6.
Код: Выделить всё
    server_cmd("sv_airaccelerate 9999");
    server_cmd("mp_playerid 2");

В подобных модах используются .cfg файлы с нужными надстройками под сервер и инициализацией где-то в plugin_cfg exec-ом, ну это так, стилистика.

7. Вместо Ham_Touch гораздо рациональнее использовать register_touch, куда быстрее и менее ресурсозатратно для данного мода.

8. Автор плагина явно фанат fakemeta, я сам таким был, но лучше переобучиться и работать с разными модулями(хотя, reapi уже на данный момент чуть ли не лучший вариант), так-то да, fakemeta очень хороший модуль, быстрее других будет в своих нэтивных функциях, однако не в портированных, таких как fm_give_item, fm_set_user_bpammo и проч, это даже медленнее и больше ресурсов займет сервера, чем тот же give_item от fun модуля либо же cs_set_user_bpammo, не хочу навязывать ничего, просто сам факт того, что не стоит зацикливаться и прям упарываться в один модуль который и вправду в принципе может заменить все другие, тогда лучше уж на reapi переходить.

9. Можно добавить булевую на проверку флага админа
Код: Выделить всё
get_user_flags(id) & VIP_FLAG
, чтоб не каждый раз узнавать, а есть ли флаг випа у игрока(ну эт так уже, придирки).

10. Не помню точно, но вроде бы достаточно один раз выставить модель гранаты в fm_setmodel с суперсидом, а не запрещать выставление модели Think_Grenade, как-то жестко, однако..

P.S. В принципе, все более-менее в порядке, разве что стоит избавиться от фулпака и парочки синков, поправьте если ошибаюсь, я углубленно пока только просмотрел основной движковый код furienmod_core.sma, остальные, возможно, позже, если автор не забросил ещё на разработку и улучшение мода.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Furrien Mode

Сообщение БиЗоН » 13 июн 2019, 00:26

CyberMan, обновил, были косяки, пробуйте снова.

Leonidddd,
1. Не согласен, больше на костыль похоже.
2. В Think'e невидимость не устанавливается, а получается текущая скорость, а уже после в зависимости от нее в переменную заносится нужный процент видимости, после уже в фуллпаке устанавливается. Обработка в think'e лучше, чем в фуллпаке (в фуллпаке получать текущую скорость каждый раз не комильфо).
3. Фуллпак нужен для того, чтобы союзники видели друг друга, а не просто глобальная невидимость.
4. FM_ClientUserInfoChanged не очень часто вызывается, не знаю откуда такие у вас сведения, но это более правильно, чем таском что-то обрабатывать - костыль, который не всегда поймает то, что нужно, к тому же данный форвард участвует в цепочке действий, таск тут в пролете.
5. Тут спорный момент, в котором, возможно, я с вами согласен больше. Я попросту отдал предпочтение памяти, нежели ЦП в данном случае.
6. Убедился, что пользователи бездарят в этом моменте, предпочел принудительно пресечь эту проблему таким нехитрыми способом.
7. Хам в данном случае предпочтителен, ибо ловим мы несколько класснеймов, не регистрировать же теперь их все отдельно.
8. Я не фанат модуля fakemeta (его функции используются, конечно, но в тех моментах, где без них никак), нужно было не полениться и заглянуть в функцию, ибо там engine:
Код: Выделить всё
stock fm_give_item(id, const sItem[])
{
    new iEnt = create_entity(sItem);

    new Float: fOrigin[3];
    entity_get_vector(id, EV_VEC_origin, fOrigin);
    entity_set_vector(iEnt, EV_VEC_origin, fOrigin);
    entity_set_int(iEnt, EV_INT_spawnflags, entity_get_int(iEnt, EV_INT_spawnflags) | SF_NORESPAWN);
    dllfunc(DLLFunc_Spawn, iEnt);
    dllfunc(DLLFunc_Touch, iEnt, id);


Приставка fm_ в данном случае означает Furrien Mod, а не fakemeta.
С reapi я не знаком, нет времени и желания изучать его функции.
9. Так и не нашёл в коде подобного, везде функция не кэшируется потому, что она единожды выполняется в операторном блоке, к тому же в каких-то моментах из кейсов/моментов она попросту не задействована, поэтому не вижу смысла кэшировать её, ведь она может быть и не использована вовсе. Лишние действия для ЦП, пусть даже памяти чуть поболее это займет.
10. Недостаточно. В FM_SetModel суперсиднется выставление модели, think на ней так и будет висеть. Да и не для того форвард предназначен, чтобы в нем think'и "отключать" (если вдруг появится желание).

Добавлено спустя 5 минут 35 секунд:
В целом за критику и потраченное время на изучение спасибо, конечно.
Вечно занятой. Вечно в павне.
Аватара пользователя
БиЗоН
 
Сообщения: 165
Зарегистрирован: 24 мар 2014, 21:05
Благодарил (а): 10 раз.
Поблагодарили: 49 раз.
Опыт программирования: Больше трех лет

Re: Furrien Mode

Сообщение Leonidddd » 14 июн 2019, 10:05

Добрый день, рад что автор ещё не забросил разрабоку мода :-) что ж, думаю, стоит продолжить его изучать и улучшать.

1. Посмотрел в исх амхх модуля, да, там по-сути стоит та же самая проверка, но все же модуль быстрее работает и меньше грузит серв, так что is_user_connected предпочтительней, так что в этом плане я был не прав.

По поводу 2 и 3 вопросов не имею,задумка хорошая, чтоб союзники видели другого, особо ресурсов много не ест, но все же.. таск в 0.2(~5 вызовов в секунду) вместо think-a(который напрямую зависит от фпс игрока, там как 60 вызовов в секунду может быть, так и 101 и выше) был бы получше как по мне.

4. Перепроверил, и вправду используется когда нужно, лучше оставить как есть.

5,6 понял позицию,тут кому как удобней.

7. Engine модуль в этом плане гораздо оптимизированней и быстрей работает, плюс можно со спокойной душой избавиться от проверки is_user_connected, но тут уж как удобно, можно и так в принципе оставить.

8. Я имел ввиду то, что портированные функции, на каком бы они модуле не были написаны(fakemeta/engine/orpheu/okapi и проч) они все равно будут работать медленней и будут жрать больше ресурсов в плагинах, чем в модулях.

9. В принципе да, согласен.

10. Можно найти и попроще способ, будет время, посмотрю что можно сделать. Можно выставить к примеру FL_KillMe или же выставить nextthink в 0(либо вообще отнять гранату прям перед самим броском и эмулировать свою гранату уже), главное только, чтоб это не крэшнуло сервер после таких манипуляций :-)

UPD: Заметил сейчас в обновленном коде(возможно, до этого тоже), что
Код: Выделить всё
        set_dhudmessage(g_iColorMsgHud[0], g_iColorMsgHud[1], g_iColorMsgHud[2], -1.0, 0.01, 0, 0.1, 2.0, 0.1, 0.1);
        show_dhudmessage(0, "Фурии [%i] vs Альянс [%i]", g_iFurrienWin, g_iAllianceWin); 

выводится в цикле, но зачем? Вне цикла его нужно выставить, а то ж он все 32 раза(если, к примеру, на сервере 32 игрока) вызовется в 2 секунды(как дефолтно стоит в плагине), думаю, уловили суть проблемы.

И ещё одно..
Код: Выделить всё
public fwd_AddToFullPack_Post(es, e, ent, host, hostflags, player, pSet)
{
    if(!player)
        return;
        
    if
(!is_user_connected(host))
        return;
        
    if
(!is_user_alive(e))
        return;
        
    if
(!g_bIsFurrien[e])
        return;

    if(get_user_team(host) == get_user_team(e))
        return;
        
    set_es
(es, ES_RenderMode, kRenderTransAlpha);
    set_es(es, ES_RenderAmt, g_iInvisAmmount[e]);

Следует заменить на ------------------>
Код: Выделить всё
public fwd_AddToFullPack_Post(es, e, ent, host, hostflags, player, pSet)
{
    
    if
(player && is_user_connected(host) && is_user_alive(e) && g_bIsFurrien[e] && get_user_team(host) == get_user_team(e))
    {

        set_es(es, ES_RenderMode, kRenderTransAlpha);
        set_es(es, ES_RenderAmt, g_iInvisAmmount[e]);
    }


Даже можете не спрашивать почему, это доолгая и нудная тема, лучше в гугле почитать про практику ретёрнов в Си подобных языках, если все-таки интересует подобная тема, естественно, на англ будет лучше всего написано. Проще говоря, в одном методе(функции) не стоит делать тучу возвратчиков(return-ов). Однако далеко не всегда, но в данном случае стоит сделать таким образом, каким скинул выше.

Ну, вроде бы пока-что у меня всё, в коде уже всё получше стало, но может быть ещё лучше, нет пределу совершенству,так сказать. :-)
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Furrien Mode

Сообщение БиЗоН » 14 июн 2019, 20:05

Leonidddd,
2. Если сделать так, то будут задержки по установлении нужной невидимости. Тут важна каждая миллисекунда для фуррий.
8. Я понимаю, но пока не хочется переходить на reapi.
10. Насчёт дхуда вроде понял, похоже, мой косяк, недоглядел, посмотрю позже.
Насчёт ретёрнов на дев-кс спор был уже, это я знаю.
https://dev-cs.ru/threads/4769/page-2#post-54636


Добавлено спустя 51 секунду:
С остальным согласен.
Вечно занятой. Вечно в павне.
Аватара пользователя
БиЗоН
 
Сообщения: 165
Зарегистрирован: 24 мар 2014, 21:05
Благодарил (а): 10 раз.
Поблагодарили: 49 раз.
Опыт программирования: Больше трех лет


Вернуться в Утвержденные плагины

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11