Написание плагинов

pl.ol-245

Участник
Сообщения
61
Реакции
5
Ты хочешь сделать всегда одного выжившего? Если я правильно помню этот квар то плагин и не нужен . Так как он отвечает за кол-во зараженных.
А как сделать чтобы постоянно был один выживший? Прописываю zr_infect_mzombie_ratio -1 во время отчëта до заражения, появляется один выживший, в следующем раунде если во время отчëта не прописать опять становится 1 зомби
 

DarkerZ

Участник
Сообщения
395
Реакции
175
А как сделать чтобы постоянно был один выживший? Прописываю zr_infect_mzombie_ratio -1 во время отчëта до заражения, появляется один выживший, в следующем раунде если во время отчëта не прописать опять становится 1 зомби
Возможно сама карта выставляет это значение
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый день, подскажите пожалуйста, как заменить массив со словами на конфиг. Сейчас плагин берет слова из массива, а надо сделать тоже самое но из списка
И если есть возможность, буду рад помощи в оптимизации если она тут нужна (можно советом, все же надо учиться самому исправлять проблемы)

Аналог Wordle но для Counter Struke:
#pragma semicolon 1
#include <colors>

#define MAX_ATTEMPTS 6
#define WORD_LENGTH 5  

char    g_sWord[WORD_LENGTH * 3 + 1],
        g_sWordList[][] = {"песня", "груша", "ветер", "лампа", "точка", "скала"};

bool    g_bUsedWords[sizeof(g_sWordList)],
        g_bStopGame;

int     g_iAttempts[MAXPLAYERS + 1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_wordle", Cmd_Startuem);
    SelectRandomWord();
}

public Action Cmd_Startuem(int iClient, int iArgs)
{
    if (iClient < 0 || !IsClientInGame(iClient))  return Plugin_Handled;
   
    if (g_bStopGame)
    {
        CPrintToChat(iClient, "{red}Нет слов в списке! Игра окончена.");
        return Plugin_Handled;
    }
   
    if (iArgs != 1)
    {
        ReplyToCommand(iClient, "Использование: sm_wordle <слово из %d букв>", WORD_LENGTH);
        return Plugin_Handled;
    }
   
    char iInputWord[WORD_LENGTH * 3 + 1];
    GetCmdArg(1, iInputWord, sizeof(iInputWord));
   
    if (GetUtf8CharCount(iInputWord) != WORD_LENGTH)
    {
        ReplyToCommand(iClient, "Слово должно содержать ровно %d букв!", WORD_LENGTH);
        return Plugin_Handled;
    }
   
    CheckWord(iClient, iInputWord);
    return Plugin_Handled;
}

void SelectRandomWord()
{
    int iAvailableWords[sizeof(g_sWordList)],
        iCount;
   
    for (int i = 0; i < sizeof(g_sWordList); i++)
        if (!g_bUsedWords[i])
            iAvailableWords[iCount++] = i;
   
    if (iCount == 0)
    {
        g_bStopGame = true;
        return;
    }
   
    int iIndex = iAvailableWords[GetRandomInt(0, iCount - 1)];
    g_bUsedWords[iIndex] = true;
    strcopy(g_sWord, sizeof(g_sWord), g_sWordList[iIndex]);
}

void CheckWord(int iClient, char[] iInputWord)
{
    g_iAttempts[iClient]++;
   
    if (StrEqual(iInputWord, g_sWord, false))
    {
        CPrintToChat(iClient, "{green}Поздравляем! {default}Вы угадали слово: {green}%s", g_sWord);
        g_iAttempts[iClient] = 0;
        SelectRandomWord();
        return;
    }
   
    char sMsg[128], sInputStr[8], sOutputStr[8];
    int iInputPos, iOutputPos;

    for (int i = 0; i < WORD_LENGTH; i++)
    {
        iInputPos += ReadUtf8Char(iInputWord[iInputPos], sInputStr, sizeof(sInputStr));
        iOutputPos += ReadUtf8Char(g_sWord[iOutputPos], sOutputStr, sizeof(sOutputStr));
        if (StrEqual(sInputStr, sOutputStr, false)) Format(sMsg, sizeof(sMsg), "%s{green}[%s]", sMsg, sInputStr);
        else if (StrContains(g_sWord, sInputStr, false) != -1) Format(sMsg, sizeof(sMsg), "%s{default}[%s]", sMsg, sInputStr);
        else Format(sMsg, sizeof(sMsg), "%s{red}[%s]", sMsg, sInputStr);
    }
   
    CPrintToChat(iClient, "Результат: %s", sMsg);
   
    if (g_iAttempts[iClient] >= MAX_ATTEMPTS)
    {
        CPrintToChat(iClient, "{red}Вы проиграли! {default}Загаданное слово было: {green}%s", g_sWord);
        g_iAttempts[iClient] = 0;
        SelectRandomWord();
    }
}

int GetUtf8CharCount(const char[] szStr)
{
    int iCount;

    for (int i = 0; i < strlen(szStr); i++)
        if ((szStr[i] & 0xC0) != 0x80)
            iCount++;

    return iCount;
}

int ReadUtf8Char(const char[] szStr, char[] sOut, int iSize)
{
    if (strlen(szStr) == 0) return 0;
    int bytes = 1;
    if ((szStr[0] & 0xE0) == 0xC0) bytes = 2;
    else if ((szStr[0] & 0xF0) == 0xE0) bytes = 3;
    else if ((szStr[0] & 0xF8) == 0xF0) bytes = 4;
    for (int i = 0; i < bytes && i < iSize - 1; i++) sOut[i] = szStr[i];
    sOut[bytes] = '\0';
    return bytes;
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
простого, где на каждой новой строке только одна нужная строка целиком без лишней инфы?
Вот примерно как в этом блоке: -NMRiH-Skins/sourcemod/scripting/nmrih_skins.sp at master · Grey83/-NMRiH-Skins
Спасибо, попробую отпишусь
Сообщения автоматически склеены:

простого, где на каждой новой строке только одна нужная строка целиком без лишней инфы?
Вот примерно как в этом блоке: -NMRiH-Skins/sourcemod/scripting/nmrih_skins.sp at master · Grey83/-NMRiH-Skins
Спасибо, то что надо)
 
Последнее редактирование:

alexnet

Участник
Сообщения
82
Реакции
3
Привет, ребят! Если кто может, помогите со скриптом. Нужно, чтобы он делал рестарт игры, как только завершится первый раунд. Я этот скрипт проверил, скомпилировал, закинул его на сервер, и делает он рестарт игры не только после первого раунда, но и после каждого раунда. То есть в конце каждого раунда происходит рестарт игры (сервер CS Source). Заранее благодарю!

C-подобный:
#define ROUND_RESTART 1

new iRoundCount;

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (++iRoundCount == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
        iRoundCount = 0;
    }
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Привет, ребят! Если кто может, помогите со скриптом. Нужно, чтобы он делал рестарт игры, как только завершится первый раунд. Я этот скрипт проверил, скомпилировал, закинул его на сервер, и делает он рестарт игры не только после первого раунда, а после каждого раунда. То есть в конце каждого раунда происходит рестарт игры (сервер CS Source). Заранее благодарю!

C-подобный:
#define ROUND_RESTART 1

new iRoundCount;

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (++iRoundCount == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
        iRoundCount = 0;
    }
}
C-подобный:
#define ROUND_RESTART 1

new iRoundCount;

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (++iRoundCount == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
    }
}
 

alexnet

Участник
Сообщения
82
Реакции
3
C-подобный:
#define ROUND_RESTART 1

new iRoundCount;

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (++iRoundCount == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
    }
}
спасибо сейчас проверил но все равно выполняет рестарт игры после каждого рауда
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
спасибо сейчас проверил но все равно выполняет рестарт игры после каждого рауда
А если так?
C-подобный:
#define ROUND_RESTART 0

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (GetTeamScore(2) + GetTeamScore(3) == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
    }
}
 

alexnet

Участник
Сообщения
82
Реакции
3
А если так?
C-подобный:
#define ROUND_RESTART 0

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (GetTeamScore(2) + GetTeamScore(3) == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
    }
}
вот при компиляции если использовать sourcemod 1.9 выходит

error 017: undefined symbol "GetTeamScore"

при компиляции если использовать sourcemod 1.13 выходит

error 437: functions in global scope must use braces
// 3 | public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

error 010: invalid function or declaration
// 3 | public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
вот при компиляции если использовать sourcemod 1.9 выходит

error 017: undefined symbol "GetTeamScore"

при компиляции если использовать sourcemod 1.13 выходит

error 437: functions in global scope must use braces
// 3 | public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

error 010: invalid function or declaration
// 3 | public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
C-подобный:
#include <sdktools>
#define ROUND_RESTART 0

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (GetTeamScore(2) + GetTeamScore(3) == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
    }
}
Забыл инклуд подключить
 

alexnet

Участник
Сообщения
82
Реакции
3
C-подобный:
#define ROUND_RESTART 0

public OnPluginStart() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

public Event_RoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
    if (GetTeamScore(2) + GetTeamScore(3) == ROUND_RESTART)
    {
        ServerCommand("mp_restartgame 1");
    }
}
Забыл инклуд подключить
ты прислал тот же код а что надо какой сверху прописать
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
скомпилировался на sm 1.9 все ок а вот рестарт после каждого раунда к сожалению остался
попробуй файл зилу перезапустить и проверь что счет в 1 из команд > 1 потому что плагин проверяет счет в командах и если он равен 0 то делает рестарт, в других случаях ничего быть не должно
 

alexnet

Участник
Сообщения
82
Реакции
3
попробуй файл зилу перезапустить и проверь что счет в 1 из команд > 1 потому что плагин проверяет счет в командах и если он равен 0 то делает рестарт, в других случаях ничего быть не должно
Сейчас вот была таблица между раундами террористы победили, счет поменялся на 1 у команды теров, а потом сразу резко опять поменялся и стал 0:0, то есть новый раунд; мы начинаем со счетом в табе 0:0, и так каждый раунд.
Сообщения автоматически склеены:

Сейчас вот была таблица между раундами террористы победили, счет поменялся на 1 у команды теров, а потом сразу резко опять поменялся и стал 0:0, то есть новый раунд; мы начинаем со счетом в табе 0:0, и так каждый раунд.
сервер перезапустил FileZilla тоже перезапущена хотя да рестарт же после каждого раунда остался вот он и сбрасывает в 0 то счет
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
рестарт после каждого раунда к сожалению остался
ты экземпляр старого плагина хоть удалил?

@7pElllHuK, ты бы сброс счётчика раундов при смене карты сделал, что ли. А то ведь сработает всего раз после старта карты.
И вообще можно вырубать хук после срабатывания проверки, а после старта карты включать снова. =)
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
ты экземпляр старого плагина хоть удалил?

@7pElllHuK, ты бы сброс счётчика раундов при смене карты сделал, что ли. А то ведь сработает всего раз после старта карты.
И вообще можно вырубать хук после срабатывания проверки, а после старта карты включать снова. =)
Получение счета надежнее и считать ничего не надо)
 
Сверху Снизу