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

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый вечер, подскажите пожалуйста, как на новом синтаксисе правильно записать decl Float:
new Float это просто float На новом синтаксисе
а decl Float это static float? или так же просто float
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Всем добрый вечер, подскажите пожалуйста, как на новом синтаксисе правильно записать decl Float:
new Float это просто float На новом синтаксисе
а decl Float это static float? или так же просто float
decl содержит мусор не равный 0
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@7pElllHuK, на новом синтаксисе правильно писать float x;
На старом синтаксисе decl создавал переменную, но не задавал ей значение, в отличии от new.
У новых компиляторов (SM1.7+) decl компилируется как new.

А static и в новом и старом синтаксисе одинаково используются.
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
@7pElllHuK, на новом синтаксисе правильно писать float x;
На старом синтаксисе decl создавал переменную, но не задавал ей значение, в отличии от new.
У новых компиляторов (SM1.7+) decl компилируется как new.

А static и в новом и старом синтаксисе одинаково используются.
Спасибо
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
decl обычно использовался для создания массива (в том числе строкового), когда не было необходимости чтобы все значения равнялись нулевому значению соответствующего типа. Так было экономней по нагрузке при создании массивов.
В новом имеет смысл в таких случаях использовать static или просто создавать глобальную переменную.
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый день, подскажите пожалуйста, как сделать так, чтоб ник написанный на русском выводился корректно, а не так:
1712143732736.png

Код:
#pragma semicolon 1

public void OnPluginStart()
{
    AddCommandListener(SayChat, "say");
    AddCommandListener(SayChat, "say_team");  
}

public Action SayChat(int iClient, const char[] sCommand, int iArgs)
{  
    if (iClient <= 0) return Plugin_Continue;

    char    sName[MAX_NAME_LENGTH],
            sText[128],
            sBuffer[220],
            sBuffer2[220];

    GetCmdArgString(sText, sizeof(sText));
    GetClientName(iClient, sName, sizeof(sName));

    int iColor,
        iLen = strlen(sName);

    for (int i = 0; i < iLen; i++)
    {
        iColor = 100000 * (i + 1);
        Format(sBuffer, sizeof(sBuffer), "\x07%i%c", iColor, sName[i]);
        StrCat(sBuffer2, sizeof(sBuffer2), sBuffer);
    }

    StripQuotes(sText);
    TrimString(sText);

    PrintToChatAll("%s\x01: %s", sBuffer2, sText);
    return Plugin_Handled;
}

UPD Кодировка UTF8 без BOOM
 
Последнее редактирование:

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Всем добрый день, подскажите пожалуйста, как сделать так, чтоб ник написанный на русском выводился корректно, а не так: Посмотреть вложение 117359
Код:
#pragma semicolon 1

public void OnPluginStart()
{
    AddCommandListener(SayChat, "say");
    AddCommandListener(SayChat, "say_team");
}

public Action SayChat(int iClient, const char[] sCommand, int iArgs)
{
    if (iClient <= 0) return Plugin_Continue;

    char    sName[MAX_NAME_LENGTH],
            sText[128],
            sBuffer[220],
            sBuffer2[220];

    GetCmdArgString(sText, sizeof(sText));
    GetClientName(iClient, sName, sizeof(sName));

    int iColor,
        iLen = strlen(sName);

    for (int i = 0; i < iLen; i++)
    {
        iColor = 100000 * (i + 1);
        Format(sBuffer, sizeof(sBuffer), "\x07%i%c", iColor, sName[i]);
        StrCat(sBuffer2, sizeof(sBuffer2), sBuffer);
    }

    StripQuotes(sText);
    TrimString(sText);

    PrintToChatAll("%s\x01: %s", sBuffer2, sText);
    return Plugin_Handled;
}

UPD Кодировка UTF8 без BOOM
Потому что в случае с кириллическим алфавитом буквы содержат 2 байта, вам необходимо определять размер одного символа и от этого уже плясать, можете использовать эту функцию
 

7pElllHuK

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

Потому что в случае с кириллическим алфавитом буквы содержат 2 байта, вам необходимо определять размер одного символа и от этого уже плясать, можете использовать эту функцию
Если можете, дайте пожалуйста пример. При использовании вашей функции, результат тот же что и без нее
 
Последнее редактирование:

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Всем добрый день, подскажите пожалуйста, как сделать так, чтоб ник написанный на русском выводился корректно, а не так: Посмотреть вложение 117359
Код:
#pragma semicolon 1

public void OnPluginStart()
{
    AddCommandListener(SayChat, "say");
    AddCommandListener(SayChat, "say_team"); 
}

public Action SayChat(int iClient, const char[] sCommand, int iArgs)
{ 
    if (iClient <= 0) return Plugin_Continue;

    char    sName[MAX_NAME_LENGTH],
            sText[128],
            sBuffer[220],
            sBuffer2[220];

    GetCmdArgString(sText, sizeof(sText));
    GetClientName(iClient, sName, sizeof(sName));

    int iColor,
        iLen = strlen(sName);

    for (int i = 0; i < iLen; i++)
    {
        iColor = 100000 * (i + 1);
        Format(sBuffer, sizeof(sBuffer), "\x07%i%c", iColor, sName[i]);
        StrCat(sBuffer2, sizeof(sBuffer2), sBuffer);
    }

    StripQuotes(sText);
    TrimString(sText);

    PrintToChatAll("%s\x01: %s", sBuffer2, sText);
    return Plugin_Handled;
}

UPD Кодировка UTF8 без BOOM
code:
#include <chat-core>

public void OnMapStart(){
    RegConsoleCmd("sm_ctext", cmd_text);
}
public Action cmd_text(int client, int args){
    char cMessage[] = "фывфывфывфывфывфывфывфывфыв";
    CM_PrintBigSayText(client, "[0] %s", cMessage);

    char cNewMessage[2048];
    FormatText(cMessage, cNewMessage, sizeof(cNewMessage));

    CM_PrintBigSayText(client, "[1] %s", cNewMessage);
}
public void FormatText(const char[] text, char[] result, int size_result){
    int index;
    char cTest[][] = { " _ ", " . " };
    
    for(int x, count = 0; x < strlen(text); count++){
        int bytes = GetBytes(text[x]);
        if(bytes == -1) break;

        if(text[x] != ' '){
            int temp = count % 2;
            for(int y; y < strlen(cTest[temp]); y++)
                result[index++] = cTest[temp][y];
        }
        
        for(int y; y < bytes; y++)
            result[index++] = text[x+y];

        x += bytes;
    }

    result[index] = '\0';

    for(int x; x < index && x < size_result-1; x++)
        result[x] = result[x];

    result[size_result-1] = '\0';
}
int GetBytes(const char cSymb){
    int sym = cSymb & 0xFF;
    if((sym & 0x80) == 0)             return 1;
    else if((sym & 0xE0) == 0xC0)     return 2;
    else if((sym & 0xF0) == 0xE0)     return 3;
    else if((sym & 0xF8) == 0xF0)     return 4;
    return -1;
}
 

Вложения

  • изображение_2024-04-03_160144942.png
    изображение_2024-04-03_160144942.png
    1,021 байт · Просмотры: 43

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
code:
#include <chat-core>

public void OnMapStart(){
    RegConsoleCmd("sm_ctext", cmd_text);
}
public Action cmd_text(int client, int args){
    char cMessage[] = "фывфывфывфывфывфывфывфывфыв";
    CM_PrintBigSayText(client, "[0] %s", cMessage);

    char cNewMessage[2048];
    FormatText(cMessage, cNewMessage, sizeof(cNewMessage));

    CM_PrintBigSayText(client, "[1] %s", cNewMessage);
}
public void FormatText(const char[] text, char[] result, int size_result){
    int index;
    char cTest[][] = { " _ ", " . " };
   
    for(int x, count = 0; x < strlen(text); count++){
        int bytes = GetBytes(text[x]);
        if(bytes == -1) break;

        if(text[x] != ' '){
            int temp = count % 2;
            for(int y; y < strlen(cTest[temp]); y++)
                result[index++] = cTest[temp][y];
        }
       
        for(int y; y < bytes; y++)
            result[index++] = text[x+y];

        x += bytes;
    }

    result[index] = '\0';

    for(int x; x < index && x < size_result-1; x++)
        result[x] = result[x];

    result[size_result-1] = '\0';
}
int GetBytes(const char cSymb){
    int sym = cSymb & 0xFF;
    if((sym & 0x80) == 0)             return 1;
    else if((sym & 0xE0) == 0xC0)     return 2;
    else if((sym & 0xF0) == 0xE0)     return 3;
    else if((sym & 0xF8) == 0xF0)     return 4;
    return -1;
}
1712150817870.png
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Не помогло
Сообщения автоматически склеены:


Если можете, дайте пожалуйста пример. При использовании вашей функции, результат тот же что и без нее
Перебирайте в массиве каждый символ через функцию получения количества байт из символа, устанавливайте HEX код по следующему в массиве индексу и так с каждым символом
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
У меня все работает 🤷‍♂️
Возможно вы где-то ошиблись, напишите сюда свой код
Напишите пожалуйста свой код, то что вы скинули совсем не то что у вас на скрине)
Свой код я уже кучу раз правил, в поисках верного решения
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Напишите пожалуйста свой код, то что вы скинули совсем не то что у вас на скрине)
Свой код я уже кучу раз правил, в поисках верного решения
Если упростить:
изображение_2024-04-03_171907673.png
code:
#include <chat-core>
char cGrdMsg[][][] = {
    { "{#fc0303}", "{#fcf003}", "{#39fc03}" },
    { "{#0318fc}", "{#b503fc}", "{#fc0303}" }
};
public void OnPluginStart(){
    AddCommandListener(SayChat, "say");
    AddCommandListener(SayChat, "say_team"); 
}
public Action SayChat(int client, const char[] sCommand, int iArgs){ 
    if(client <= 0) return Plugin_Continue;
    char cNick[128];        GetClientName(client, cNick, sizeof(cNick));
    char cMessage[512];     GetCmdArgString(cMessage, sizeof(cMessage));
    StripQuotes(cMessage);
    TrimString(cMessage);
    char cNewNick[2048];
    char cNewMessage[2048];
    FormatText(0, cNick, cNewNick, sizeof(cNewNick));
    FormatText(1, cMessage, cNewMessage, sizeof(cNewMessage));

    CM_PrintBigSayText(client, "%s: %s", cNewNick, cNewMessage);
    return Plugin_Handled;
}


public void FormatText(int type, const char[] text, char[] result, int size_result){
    int index;
    for(int x, count = 0; x < strlen(text); count++){
        int bytes = GetBytes(text[x]);
        if(bytes == -1) break;

        if(text[x] != ' '){
            int temp = count % sizeof(cGrdMsg[]);
            for(int y; y < strlen(cGrdMsg[type][temp]); y++)
                result[index++] = cGrdMsg[type][temp][y];
        }
        
        for(int y; y < bytes; y++)
            result[index++] = text[x+y];

        x += bytes;
    }

    result[index] = '\0';

    for(int x; x < index && x < size_result-1; x++)
        result[x] = result[x];

    result[size_result-1] = '\0';
}
int GetBytes(const char cSymb){
    int sym = cSymb & 0xFF;
    if((sym & 0x80) == 0)             return 1;
    else if((sym & 0xE0) == 0xC0)     return 2;
    else if((sym & 0xF0) == 0xE0)     return 3;
    else if((sym & 0xF8) == 0xF0)     return 4;
    return -1;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Если упростить:
code:
#include <chat-core>
char cGrdMsg[][][] = {
    { "{#fc0303}", "{#fcf003}", "{#39fc03}" },
    { "{#0318fc}", "{#b503fc}", "{#fc0303}" }
};
public void OnPluginStart(){
    AddCommandListener(SayChat, "say");
    AddCommandListener(SayChat, "say_team");
}
public Action SayChat(int client, const char[] sCommand, int iArgs){
    if(client <= 0) return Plugin_Continue;
    char cNick[128];        GetClientName(client, cNick, sizeof(cNick));
    char cMessage[512];     GetCmdArgString(cMessage, sizeof(cMessage));
    StripQuotes(cMessage);
    TrimString(cMessage);
    char cNewNick[2048];
    char cNewMessage[2048];
    FormatText(0, cNick, cNewNick, sizeof(cNewNick));
    FormatText(1, cMessage, cNewMessage, sizeof(cNewMessage));

    CM_PrintBigSayText(client, "%s: %s", cNewNick, cNewMessage);
    return Plugin_Handled;
}


public void FormatText(int type, const char[] text, char[] result, int size_result){
    int index;
    for(int x, count = 0; x < strlen(text); count++){
        int bytes = GetBytes(text[x]);
        if(bytes == -1) break;

        if(text[x] != ' '){
            int temp = count % sizeof(cGrdMsg[]);
            for(int y; y < strlen(cGrdMsg[type][temp]); y++)
                result[index++] = cGrdMsg[type][temp][y];
        }
       
        for(int y; y < bytes; y++)
            result[index++] = text[x+y];

        x += bytes;
    }

    result[index] = '\0';

    for(int x; x < index && x < size_result-1; x++)
        result[x] = result[x];

    result[size_result-1] = '\0';
}
int GetBytes(const char cSymb){
    int sym = cSymb & 0xFF;
    if((sym & 0x80) == 0)             return 1;
    else if((sym & 0xE0) == 0xC0)     return 2;
    else if((sym & 0xF0) == 0xE0)     return 3;
    else if((sym & 0xF8) == 0xF0)     return 4;
    return -1;
}
Ура, все работает, спасибо большое
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Подскажите, максимальное количество хэндлов, открываемых одним плагином, равняется тысяче?
Пробовал проверить через цикл, в итоге плагин не загружался, но, может, если у 64 игроков будет открыто по 15+ хэндлов на каждого в разное время (в сумме единовременно все равно более 1к), ситуация будет иной?
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Подскажите, максимальное количество хэндлов, открываемых одним плагином, равняется тысяче?
Пробовал проверить через цикл, в итоге плагин не загружался, но, может, если у 64 игроков будет открыто по 15+ хэндлов на каждого в разное время (в сумме единовременно все равно более 1к), ситуация будет иной?
Гуру поправят, но по идеи никаких ограничений в разумных приделах нет
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Гуру поправят, но по идеи никаких ограничений в разумных приделах нет
У меня в плагине пару десятков итемов с кулдауном на каждый, вот кроме как отдельными таймерами это делать, идей нет. Уж не знаю, разумный ли это предел)
 
Сверху Снизу