Grey83
не пишу плагины с весны 2022
- Сообщения
- 8,520
- Реакции
- 4,979
decl содержит мусор не равный 0Всем добрый вечер, подскажите пожалуйста, как на новом синтаксисе правильно записать decl Float:
new Float это просто float На новом синтаксисе
а decl Float это static float? или так же просто float
получается он попросту не нужен?decl содержит мусор не равный 0
float x;
Спасибо@7pElllHuK, на новом синтаксисе правильно писатьfloat x;
На старом синтаксисе decl создавал переменную, но не задавал ей значение, в отличии от new.
У новых компиляторов (SM1.7+) decl компилируется как new.
А static и в новом и старом синтаксисе одинаково используются.
#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;
}
Потому что в случае с кириллическим алфавитом буквы содержат 2 байта, вам необходимо определять размер одного символа и от этого уже плясать, можете использовать эту функциюВсем добрый день, подскажите пожалуйста, как сделать так, чтоб ник написанный на русском выводился корректно, а не так: Посмотреть вложение 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 байта, вам необходимо определять размер одного символа и от этого уже плясать, можете использовать эту функцию
Если можете, дайте пожалуйста пример. При использовании вашей функции, результат тот же что и без нееПотому что в случае с кириллическим алфавитом буквы содержат 2 байта, вам необходимо определять размер одного символа и от этого уже плясать, можете использовать эту функцию
Всем добрый день, подскажите пожалуйста, как сделать так, чтоб ник написанный на русском выводился корректно, а не так: Посмотреть вложение 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
#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;
}
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; }
Перебирайте в массиве каждый символ через функцию получения количества байт из символа, устанавливайте HEX код по следующему в массиве индексу и так с каждым символомНе помогло
Сообщения автоматически склеены:
Если можете, дайте пожалуйста пример. При использовании вашей функции, результат тот же что и без нее
У меня все работает
Напишите пожалуйста свой код, то что вы скинули совсем не то что у вас на скрине)
Если упростить:Напишите пожалуйста свой код, то что вы скинули совсем не то что у вас на скрине)
Свой код я уже кучу раз правил, в поисках верного решения
#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;
}
Ура, все работает, спасибо большоеЕсли упростить:
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; }
Гуру поправят, но по идеи никаких ограничений в разумных приделах нетПодскажите, максимальное количество хэндлов, открываемых одним плагином, равняется тысяче?
Пробовал проверить через цикл, в итоге плагин не загружался, но, может, если у 64 игроков будет открыто по 15+ хэндлов на каждого в разное время (в сумме единовременно все равно более 1к), ситуация будет иной?
У меня в плагине пару десятков итемов с кулдауном на каждый, вот кроме как отдельными таймерами это делать, идей нет. Уж не знаю, разумный ли это предел)Гуру поправят, но по идеи никаких ограничений в разумных приделах нет