Иконка ресурса

Random Give Shield 2.0

Нет прав для скачивания

FIVE

Developer & Informer
Сообщения
173
Реакции
128
Пользователь FIVE разместил новый ресурс:

Random Give Shield - Рандомно выдает игрокам щит

В недавнем обновлении CS:GO от Valve был добавлен новый предмет weapon_shield (Щит).
Данный предмет может ввести новую механику.
Я придумал легкий плагин который позволяет рандомно одному или нескольким игрокам из одной или разных команд выдать с определенным шансом щит.
Узнать больше об этом ресурсе...
 

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
sm_giveshield admin - данная команда выдает игроку щит. <admin> можно изменить в исходнике.
секретный пароль для получения щита? Не проще ли использовать флаг доступа к команде или добавить квар для хранения секретного слова?
 
  • Like
Реакции: R1KO

Faya™

Жуестер
Сообщения
602
Реакции
254
Разве так не проще?

Команда sm_giveshield сделана для админов с флагом а
Изменен квар sm_rgs_teamallow теперь его описание -1 - выключен, 2 - Только Т, 3 - Только КТ, 4 - Все
 

Вложения

FIVE

Developer & Informer
Сообщения
173
Реакции
128
Пользователь FIVE обновил ресурс Random Give Shield новой записью:

Фикс ошибок

- Исправлена ошибка повторной выдачи щита
- Исправлена ошибка буквы c в кваре sm_rgs_chace
- Исправлена ошибка шанса выпадения
- Добавлен квар на оповещения: sm_rgs_notify

TODO:
- Добавить поддержку INC Colors от Феникса
- Добавить файл переводов
Узнать больше об этом обновлении...
 

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
Почистил и немного оптимизировал код, добавил квар sm_rgs_key для возможности менять секретное слово без перекомпиляции (если оставить пустым, то щит с помощью команды сможет получить любой)

@FIVE, по поводу имён кваров: обычно в плагинах имена капсом только для разных дефайнов (ну и я для констант юзаю).
Для глобальных переменных перед её именем лучше указывать тип переменной:
h - для хэндлов (Handle),
b - для булевых (bool),
i - для целых чисел (int),
f - для чисел с плавающей запятой (float)
s - для строковых (char и String, некоторые обозначают sz)
Иногда ещё для глобальных переменных добавляют приставку g_ (когда ещё и локальным переменным указывают тип).
Это позволяет не путаться в типах переменных в коде и несколько облегчает работу с кодом.

Кстати, поменял значения квара sm_rgs_teamallow: 0 - выключен, 1 - Все, 2 - Только Т, 3 - Только КТ.
Так запоминать удобнее какое значение за что отвечает (да и в коде обрабатывать значения удобнее)
Поменял минимум у кваров sm_rgs_chance и sm_rgs_maxplayers с 0 до 1: не имеет смысла использовать значение 0 (ну для чего нам аж 3 способа выключить плагин?)
 

Вложения

Последнее редактирование:

FIVE

Developer & Informer
Сообщения
173
Реакции
128
@FIVE, по поводу имён кваров: обычно в плагинах имена капсом только для разных дефайнов (ну и я для констант юзаю)
Для глобалных переменных перед её именем лучше указывать тип переменной:
h - для хэндлов (Handle),
b - для булевых (bool),
i - для целых чисел (int),
f - для чисел с плавающей запятой (float)
s - для строковых (char и String, некоторые обозначают sz)
Иногда ещё для глобальных переменных добавляют приставку g_ (когда ещё и локальным переменным указывают тип).
Это позволяет не путаться в типах переменных в коде и несколько облегчает работу с кодом.
--- Добавлено позже ---
Кстати, поменял значения квара sm_rgs_teamallow: 0 - выключен, 1 - Все, 2 - Только Т, 3 - Только КТ.
Так запоминать удобнее какое значение за что отвечает (да и в коде обрабатывать значения удобнее)
Поменял минимум у кваров sm_rgs_chance и sm_rgs_maxplayers с 0 до 1: не имеет смысла использовать значение 0 (ну для чего нам аж 3 способа выключить плагин?)
Полностью согласен, когда писал квары были дефайнами поэтому они все большими буквами, щя перепишу в человеческий вид :)
 

FIVE

Developer & Informer
Сообщения
173
Реакции
128
Пользователь FIVE обновил ресурс Random Give Shield новой записью:

Обновление

- Исправлена ошибка выпадения щита (теперь плагин понимает есть ли у игрока щит | Данная проверка добавлена в общий подсчет при выдачи щита | Спасибо Faya)
- Оптимизация кода + исходник выполнен по стандарту (Спасибо Grey83)
- Добавлены квары:
sm_rgs_deleteshield - Удаляет щит в конце раунда (Пока не тестировал)
sm_rgs_key - Секретный ключ для команды sm_giveshield (если пустой, выдача будет работать без нее)
- Добавлен файл переводов (EN, RU)
- Добавлена...
Узнать больше об этом обновлении...
 

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
@FIVE, снова каша в
Интересно, если в консоль сервера прописать sm_giveshield <ключ>, то какую ошибку выдаст?
Я же фиксил эту фигню
В ShieldCMD() нужно сначала проверить от чьего имени написана команда. Если индекс игрока равна 0, то это сервер. Ему щит точно никак не пригодится.

У тебя есть функции IsTargetValid() и IsClientValid() (при этом вторая содержит код, который используется в первой). Почему бы не вызывать тогда вторую из первой?
PHP:
stock bool IsTargetValid(int iClient)
{
    static int team;
    return g_iTeamAllowWithShield && IsClientInGame(iClient) && !IsFakeClient(iClient) && IsPlayerAlive(iClient)
        && (team = GetClientTeam(iClient)) > Team_Spec && (g_iTeamAllowWithShield == 1 || g_iTeamAllowWithShield == team);
}

stock bool IsClientValid(int iClient)
{
    return IsClientInGame(iClient) && !IsFakeClient(iClient) && IsPlayerAlive(iClient);
}
-->
PHP:
stock bool IsTargetValid(int iClient)
{
    static int team;
    return g_iTeamAllowWithShield && IsClientValid(iClient)
        && (team = GetClientTeam(iClient)) > Team_Spec && (g_iTeamAllowWithShield == 1 || g_iTeamAllowWithShield == team);
}

stock bool IsClientValid(int iClient)
{
    return IsClientInGame(iClient) && !IsFakeClient(iClient) && IsPlayerAlive(iClient);
}
Ещё на счёт циклов: если ты используешь целочисленную переменную только внутри цикла, то не нужно объявлять её вне цикла. Можно объявить её там же где инкрементную
PHP:
    int iWeapon;
    for(int i; i < 64; i++)
-->
PHP:
    for(int i, iWeapon; i < 64; i++)
--- Добавлено позже ---
А какой смысл 3 раза пересчитывать щиты?
PHP:
    PlayersWithShield(false);   // 1-й
    CheckStart();   // 2-й
    if(g_bNotify) CGOPrintToChatAll("%t%i", "TOTAL_SHIELDS", g_iTotalShields);
    PlayersWithShield(true)   // 3-й;
 
Последнее редактирование:

FIVE

Developer & Informer
Сообщения
173
Реакции
128
@Grey83,
@FIVE
--- Добавлено позже ---
А какой смысл 3 раза пересчитывать щиты?
PHP:
    PlayersWithShield(false);   // 1-й
    CheckStart();   // 2-й
    if(g_bNotify) CGOPrintToChatAll("%t%i", "TOTAL_SHIELDS", g_iTotalShields);
    PlayersWithShield(true)   // 3-й;
В первый раз идет подсчет всех игроков с щитом в начале раунда (вдруг у игрока остался щит в конце прошлого раунда)
Во второй начинается выдача на основе уже подсчитанных
Третий раз уже выводит сообщение с точным кол-вом щитов в команде(-ах)
--- Добавлено позже ---
В остальном исправлюсь!
 

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
Кстати, зачем убрали флаг EventHookMode_PostNoCopy у хука события round_start, неужели нам стало нужно получать какие-то данные о событии, помимо того, что это событие вообще произошло?
И в round_end тоже надо бы этот флаг добавить по той же самой причине.
В первый раз идет подсчет всех игроков с щитом в начале раунда (вдруг у игрока остался щит в конце прошлого раунда)
Во второй начинается выдача на основе уже подсчитанных
Третий раз уже выводит сообщение с точным кол-вом щитов в команде(-ах)
и все 3 раза делается цикл по всем игрокам. Неужели нельзя это сделать с первого раза?
Самое смешное в том, что первый раз функция не выполняет совершенно никаких полезных действий (потому что в CheckStart() снова каждый игрок проверяется функцией GetPlayerItem())
Да и второй раз PlayersWithShield() тоже не нужна: достаточно вытащить из неё if(g_bNotify) CGOPrintToChatAll("%t%i", "PLAYERS_WITH_SHIELD", g_iPlayersWithShield); и поместить эту строку на место второго вызова этой функции. И оба вызова снести вместе с самой функцией.
--- Добавлено позже ---
Кстати, когда ты объявляешь переменную, то при компиляции плагина она всегда приравнивается к нулю, если ты во время объявления не присваиваешь ей другое значение, конечно:
Handle становятся равными null
bool
становятся равными false
int
становятся равными 0
float
становятся равными 0.0
Со всеми ячейками массивов происходит то же самоем (в строковых каждая ячейка становится равной '\0', т.е. 0).

Так что писать что-то вроде int g_iPlayersWithShield = 0; не имеет никакого смысла (масло маслянное).
--- Добавлено позже ---
И форматирование для переводов ты используешь не слишком удачно:
вместо CGOPrintToChatAll("%t%i", "TOTAL_SHIELDS", g_iTotalShields); было бы лучше сделать CGOPrintToChatAll("%t", "TOTAL_SHIELDS", g_iTotalShields);
а в файле перевода вместо
Код:
    "TOTAL_SHIELDS"
    {
        "en" ">>> {LIGHTRED}Total shields: {RED}"
        "ru" ">>> {LIGHTRED}Всего выдано щитов: {RED}"
    }
сделать
Код:
    "TOTAL_SHIELDS"
    {
        "#format"   "{1:d}"
        "en" ">>> {LIGHTRED}Total shields: {RED}{1}"
        "ru" ">>> {LIGHTRED}Всего выдано щитов: {RED}{1}"
    }
--- Добавлено позже ---
Вот как это должно было бы быть (в папке plugins лежит 3 версии плагина, скомпиленные с помощью SM 1.8 - 1.10, закидывать только ту, что соответствует версии на сервере; ещё добавил в архив инклюд csgo_colors.inc):
 

Вложения

Последнее редактирование:

FIVE

Developer & Informer
Сообщения
173
Реакции
128
Пользователь FIVE обновил ресурс Random Give Shield новой записью:

Исправлены недочеты

- Добавлена новая фраза: U_DONT_HAVE_SHIELD
- Исправлен недочет в файле перевода (теперь можно изменять положение цифры в TOTAL_SHIELDS и PLAYERS_WITH_SHIELD)
- Добавлена новая команда:
sm_remshield - удаляет щит у игрока, если он имеется (ключей не требует)
- Теперь щит удаляется исправно в конце раунда (протестировано на 1.10)
- Добавлена пере выдача щита у игрока в начале раунда так как старый щит мог быть покоцан
- Оптимизация кода
- В архив добавлен [INC] CSGO Colors (для компиляции если версия изменится)

Посмотреть вложение 41732

Спасибо...
Узнать больше об этом обновлении...
--- Добавлено позже ---
Это забыл добавить, но править сил уже нет :)
Поменял минимум у кваров sm_rgs_chance и sm_rgs_maxplayers с 0 до 1: не имеет смысла использовать значение 0 (ну для чего нам аж 3 способа выключить плагин?)
@Grey83 Не могу понять зачем ты в версии 1.2.1 убрал переменные m_hMyWeapons и m_iItemDefinitionIndex в вызов функции IsHasShield()? Просто мне кажется что каждый раз находить смещение будет не очень хорошо? Хотя они кешируются.
 
Последнее редактирование:

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
Просто мне кажется что каждый раз находить смещение будет не очень хорошо?
Тебе именно кажется: после того как оффсет будет найден (после первого же вызова функции IsHasShield()), плагин перестанет искать оффсет.
--- Добавлено позже ---
По функции EntIsShield(): внутри функции else не нужна (у тебя, кстати, компилер не выдаёт текст, что функция должна возвращать значение?).
 
Последнее редактирование:
Сообщения
339
Реакции
13
Для выдачи одного терам и одного ментам писать так?
Оффтоп
 

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
@Ozzy, а плагин не распределяет щиты равномерно по командам: нет там такой функции
sm_rgs_teamallow 1 - тогда щиты будут выдаваться обеим командам вначале раунда
 
Сообщения
711
Реакции
92
А можно добавить в плагин еще и покупку шита? По команде !shield, !s допустим, с таким же ограничением по количеству
 

FIVE

Developer & Informer
Сообщения
173
Реакции
128
Пользователь FIVE обновил ресурс Random Give Shield новой записью:

Обновление

- Добавлена задержка перед выдачей щитов
- Добавлена возможность покупки щита
- Добавлены новые фразы:
U_BOUATH_A_SHIELD
BALANCE_PULL
U_DONT_HAVE_MONEY
- Добавлены новые квары:
sm_rgs_accounting - Учитывать ли игроков, которые имеют щит в начале раунда?
sm_rgs_delay - Задержка перед выдачей щитов
sm_rgs_buy_enable - Включить ли покупку щита?
sm_rgs_buy_price - Цена покупки щита через команду
sm_rgs_buy_balance - Учитывать ли максимально доступных щитов для...
Узнать больше об этом обновлении...
--- Добавлено позже ---
По функции EntIsShield(): внутри функции else не нужна (у тебя, кстати, компилер не выдаёт текст, что функция должна возвращать значение?).
Вроде нет)
upload_2019-5-9_18-39-0.png
 

Grey83

похухоль
Сообщения
2,664
Реакции
1,449
@Heinz, можно импортировать модельку, но для её нормальной работы придётся серьёзно заморочиться.
Хотя давно есть щит для L4D2: [L4D2] Shield - AlliedModders
 

FIVE

Developer & Informer
Сообщения
173
Реакции
128
Пользователь FIVE обновил ресурс Random Give Shield новой записью:

Фикс ошибок

- Исправлена ошибка подсчета игроков
- Добавлена возможность включать настройки BuyZone (то есть игрок сможет закупаться только в зоне закупки, время берется из mp_buytime)
- Добавлены новый фразы:
U_ARE_NO_IN_THE_BUYZONE
U_DONT_HAVE_BUYTIME
- Добавлен новый квар: sm_rgs_buy_zone
- Исходник плагина разделен по нескольким файлам (так проще искать код)
Узнать больше об этом обновлении...
 
Сверху