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

Live Custom Rounds 1.3.1

xtance

Участник
Сообщения
513
Реакции
743
  • Автор ресурса
  • #1
Пользователь xTance разместил новый ресурс:

Live Custom Rounds - Создание кастомных раундов прямо на сервере

Админ (ADMFLAG_BAN или d) пишет команду !round, выбирает оружие, пистолет и команду для выполнения, следующий раунд становится "кастомным" - у игроков и у карты удаляются все оружия, взамен даются выбранные админом. В конце раунда они отнимаются.

Подойдёт для AWP серверов, и вообще любых, где нет возможности закупиться. В теории можно сделать 1000+ уникальных раундов.
Добавление оружия или команд пока что только через изменение исходника....

Узнать больше об этом ресурсе...
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
По моему кто-то заказывал подобный плагин на dev-source. Код плохо написан.

Сразу хочу предупредить, у меня нет цели как то оскорбить автора, я задаю вопросы не для себя, мне они не нужны, я бы хотел чтобы автор ответил на них сам себе.

C-подобный:
char aWeapons[][] = ...
Записывать так в глобальные переменные нежелательно. Дословно:
upload_2018-10-29_10-51-47.png
C-подобный:
 static const char aWeapons[][] = ...

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

HookConVarChange · convars · SourceMod Scripting API Reference
ConVar.AddChangeHook · convars · SourceMod Scripting API Reference
C-подобный:
fDiff = 0.5;

Не проше было бы вести свой подсчет раундов, нежели каждый раз считать общий счет команд при каждом возрождении игрока (проверка на валидность игрока при возрождении не нужна), в конце и в начале раунда?
C-подобный:
if (iRound == (CS_GetTeamScore(2) + CS_GetTeamScore(3)))

Далее, ты удаляешь все оружие со всей карты и у игроков соответственно тоже, зачем после того как ты удалил все оружие снова пытаешься удалить оружие у игроков?
C-подобный:
        RemoveMap();
        bCustomRoundEnd = true;
        for (int iClient = 1; iClient <= MAXPLAYERS; iClient++)
        {
            RemoveAll(iClient);
        }
Зачем проверка 'if(i > 0)' ?
C-подобный:
        for (new i = 1; i <= MaxClients; i++)
        {
            if (i > 0)
            {
                if (IsClientInGame(i))
                {
Код на удаление всего оружие у игрока:
C-подобный:
stock void RemoveNades(int iClient)
{
    while (RemoveWeaponBySlot(iClient, 3))
    {
        for (int i = 0; i < 6; i++)
            SetEntProp(iClient, Prop_Send, "m_iAmmo", 0, _, g_iGrenadeOffsets[i]);
    }
}

stock bool RemoveWeaponBySlot(int iClient, int slot)
{
    int entity = GetPlayerWeaponSlot(iClient, slot);
    if (IsValidEdict(entity))
    {
        RemovePlayerItem(iClient, entity);
        AcceptEntityInput(entity, "Kill");
        return true;
    }
    return false;
}
Можно заменить на >>
C-подобный:
void RemoveWeapon(int iClient)
{
    for(int i = 0, iEntity; i < 5; i++)
    {
        while((iEntity= GetPlayerWeaponSlot(iClient, i)) != -1)
        {
            RemovePlayerItem(iClient, iEntity);
            AcceptEntityInput(iEntity, "Kill");
        }
    }
}
Цикл за тем еще один цикл.
Стоило использовать в верхнем цикле: PrintToChat(i, " ");
C-подобный:
    char sz1[256],sz2[256],sz3[256];
    iRound = (CS_GetTeamScore(2) + CS_GetTeamScore(3) + 1);
    PrintToChatAll(" ");
    for (int i = 1; i <= MAXPLAYERS; i++)
    {
        if (IsClientInGame(i)){
            SetGlobalTransTarget(i);
            FormatEx(sz1, sizeof(sz1), "%t", "sz1", iRound);
            FormatEx(sz2, sizeof(sz2), "%t", "sz2", aWeaponName[1], aPistolName[1]);
            FormatEx(sz3, sizeof(sz3), "%t", "sz3", aCommandName[1]);
      
            CGOPrintToChat(i, sz1);
            CGOPrintToChat(i, sz2);
            CGOPrintToChat(i, sz3);
        }
    }
    PrintToChatAll(" ");

Убивай таймеры при смене карты.
В пабликах 'hWeapons' и 'hPistols' практически идентичный код, можно было оптимизировать этот момент.

Остальное потом напишу, если будет желание...
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #4
К слову, касательно этого фрагмента:
PHP:
       if (IsClientInGame(i)){
           SetGlobalTransTarget(i);
           FormatEx(sz1, sizeof(sz1), "%t", "sz1", iRound);
           FormatEx(sz2, sizeof(sz2), "%t", "sz2", aWeaponName[1], aPistolName[1]);
           FormatEx(sz3, sizeof(sz3), "%t", "sz3", aCommandName[1]);
        
           CGOPrintToChat(i, sz1);
           CGOPrintToChat(i, sz2);
           CGOPrintToChat(i, sz3);
       }
Если в отформатированную строку попадёт %s или ещё любая форматирующая комбинация, CGOPrintToChat() попытается произвести форматирование строки. Но т.к. аргументов нет, виртуалка высрет ошибку.

Потому принято обычно делать так:
PHP:
       if (IsClientInGame(i)){
           SetGlobalTransTarget(i);
           FormatEx(sz1, sizeof(sz1), "%t", "sz1", iRound);
           FormatEx(sz2, sizeof(sz2), "%t", "sz2", aWeaponName[1], aPistolName[1]);
           FormatEx(sz3, sizeof(sz3), "%t", "sz3", aCommandName[1]);
        
           CGOPrintToChat(i, "%s", sz1);
           CGOPrintToChat(i, "%s",sz2);
           CGOPrintToChat(i, "%s",sz3);
       }
К тому же, ещё можно избавиться от FormatEx(), т.к. CGOPrintToChat() выполняет форматирование (что мы выяснили выше):
PHP:
       if (IsClientInGame(i)){
           CGOPrintToChat(i, "%t", "sz1", iRound);
           CGOPrintToChat(i, "%t", "sz2", aWeaponName[1], aPistolName[1]);
           CGOPrintToChat(i, "%t", "sz3", aCommandName[1]);
       }
А если пойти дальше, то можно и от цикла избавиться, т.к. CGOPrintToChatAll() уже его содержит, а массивы и конкретные элементы не изменяются.
В итоге весь цикл заменяется на:
PHP:
    CGOPrintToChatAll("%t", "sz1", iRound);
    CGOPrintToChatAll("%t", "sz2", aWeaponName[1], aPistolName[1]);
    CGOPrintToChatAll("%t", "sz3", aCommandName[1]);
 

xtance

Участник
Сообщения
513
Реакции
743
  • Автор ресурса
  • #5
Зачем проверка 'if(i > 0)' ?
C-подобный:
        for (new i = 1; i <= MaxClients; i++)
        {
            if (i > 0)
            {
                if (IsClientInGame(i))
                {
Видимо уже по привычке влепил не подумав. =|
В следующей версии это всё поправлю (и то что объяснил Kr1kuzya тоже).
 

Svoboda

Помощь по CSS v92
Сообщения
393
Реакции
56
Видимо уже по привычке влепил не подумав. =|
В следующей версии это всё поправлю (и то что объяснил Kr1kuzya тоже).
есть возможность добавить выбор когда запустить раунд ну типа
1) Запустить на след раунд
2) Укажите в чате через сколько раундов запустить CR
 

xtance

Участник
Сообщения
513
Реакции
743
  • Автор ресурса
  • #7
Обновил (фикс разных багов, не спамит в логи ошибками, поправлен код где успел), фич не добавлено, поэтому без уведомления об апдейте.
 

Haruko

Участник
Сообщения
119
Реакции
6
Плагин спамит такой ошибкой и при вводе команд sm_round !round /round ничего не происходит

L 12/04/2018 - 20:40:05: [SM] Exception reported: Language phrase "szTitleWeapons" not found (arg 5)
L 12/04/2018 - 20:40:05: [SM] Blaming: livecustomrounds.smx
L 12/04/2018 - 20:40:05: [SM] Call stack trace:
L 12/04/2018 - 20:40:05: [SM] [0] FormatEx
L 12/04/2018 - 20:40:05: [SM] [1] Line 79, D:\Server\scripting\livecustomrounds.sp::XRound
 

xtance

Участник
Сообщения
513
Реакции
743
  • Автор ресурса
  • #9
Плагин спамит такой ошибкой и при вводе команд sm_round !round /round ничего не происходит

L 12/04/2018 - 20:40:05: [SM] Exception reported: Language phrase "szTitleWeapons" not found (arg 5)
L 12/04/2018 - 20:40:05: [SM] Blaming: livecustomrounds.smx
L 12/04/2018 - 20:40:05: [SM] Call stack trace:
L 12/04/2018 - 20:40:05: [SM] [0] FormatEx
L 12/04/2018 - 20:40:05: [SM] [1] Line 79, D:\Server\scripting\livecustomrounds.sp::XRound
Забыл положить перевод в архив, вот он, кинуть в :
--> csgo/addons/sourcemod/translations
 

Вложения

  • livecustomrounds.phrases.txt
    1.3 КБ · Просмотры: 118

Azenot

Токсичный жировик
Сообщения
331
Реакции
365
Решил добавить scout
C-подобный:
static const char aWeapons[][] = { "none_None", "weapon_AK47", "weapon_M4A1", "weapon_SCOUT"...
но при старте раунда сервер падает. Что я делаю не так?
 

xtance

Участник
Сообщения
513
Реакции
743
  • Автор ресурса
  • #11
@Terryfold, weapon_ssg08 для CS:GO, а в остальных играх плагин не тестировался.
 

Azenot

Токсичный жировик
Сообщения
331
Реакции
365
Кто знает как решить проблему с удалением оружия в конце кастомного раунда? Оно вроде как оружие убирает, но зависает моделька в руках. Возможно нужно исходник подправить немного.
 

PEP

Участник
Сообщения
26
Реакции
1
Такой вопрос. Можно ли как то сделать чтобы можно было отдельно выбрать калаш или юсп. Тоесть играть с 1 оружием а не с 2 сразу.
 

xtance

Участник
Сообщения
513
Реакции
743
  • Автор ресурса
  • #14
Пофикшен баг с нерабочим голосованием (оно не работало всё это время)
Впрочем, судя по количеству багрепортов (один за последние 9 месяцев) никого это особенно не тревожило.
 

CEREGA

Участник
Сообщения
57
Реакции
1
Пофикшен баг с нерабочим голосованием (оно не работало всё это время)
Впрочем, судя по количеству багрепортов (один за последние 9 месяцев) никого это особенно не тревожило.
та не, плагин очень классный) продолжай в том же духе :)
 

Dimmer

Юзерок
Сообщения
192
Реакции
25
Пофикшен баг с нерабочим голосованием (оно не работало всё это время)
Впрочем, судя по количеству багрепортов (один за последние 9 месяцев) никого это особенно не тревожило.
А можешь пожалуйста вырезать пистолеты полностью, и однозначно команды сервера, мне нужен плагин , что бы люди просто могли написать !round выбрать оружие основное и вылетило голосование тупо да или нет, спасибо заранее
 

danikfml

Участник
Сообщения
121
Реакции
35
Как убрать возможность закупаться во время кастомного раунда?
Сообщения автоматически склеены:

Кто знает как решить проблему с удалением оружия в конце кастомного раунда? Оно вроде как оружие убирает, но зависает моделька в руках. Возможно нужно исходник подправить немного.
И вот это кто то смог решить?
 

Round

Участник
Сообщения
303
Реакции
65
Можнои ли сделать готовые и чтоб среди них игроки выбирали за какое проголосовать,без админов?
 
Сверху Снизу