Контакты Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Форматирование
Форматирование
хвостег Дата: Вторник, 04.11.2014, 17:00:12 | Сообщение # 1
Сообщений: 161
Репутация: 53 [ +/- ]
Почему я не могу запртинтить такое?

Код

PrintToChat(client, "Test: %s", "%s %s");


В чат выводит Test:, а мне надо Test: %s %s

Как бороться с этим?

Можно конечно всунуть символ, который не будет виден, между % и s, но в "чатовой" строке каждый байт на счету! как обойтись без лишних символов?


Сообщение отредактировал хвостег - Вторник, 04.11.2014, 17:10:57
 
king(rus) Дата: Вторник, 04.11.2014, 17:13:32 | Сообщение # 2
Сообщений: 109
Репутация: 2 [ +/- ]
Цитата хвостег ()

В чат выводит Test:, а мне надо Test: %s %s

Как бороться с этим?

Можно конечно всунуть символ, который не будет виден, между % и s, но в "чатовой" строке каждый байт на счету! как обойтись без лишних символов?



Ахах, а как ты думаешь? Читай мануал PrintToChat
Код
Syntax:
native PrintToChat(client, const String:format[], any:...);

Usage:
     client  Client index.
     format  Formatting rules.
     ...   Variable number of format parameter.


Сообщение отредактировал king(rus) - Вторник, 04.11.2014, 17:14:38
 
хвостег Дата: Вторник, 04.11.2014, 17:21:16 | Сообщение # 3
Сообщений: 161
Репутация: 53 [ +/- ]
не думай что я идиот.
Код

public OnPluginStart()
{
   RegConsoleCmd("sm_asd", CMD_ASD);
}

public Action:CMD_ASD(client, args)
{
   print(client, "Test: %s", "%s %s");
}

stock print(client, String:format[], any:...)
{
   decl String:Compile[253];
   VFormat(Compile, sizeof(Compile), format, 3);
     
   PrintString(Compile, strlen(Compile));
     
   new Handle:bf = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS);
   if(bf != INVALID_HANDLE)
   {
    BfWriteByte(bf, 0);
    BfWriteByte(bf, false);
    BfWriteString(bf, Compile);
    EndMessage();
   }
}

stock PrintString(String:text[], len)
{
   new byte;
   for(new i = 0; i < len; i++)
   {
    byte = text[i] & 0xFF;
    PrintToServer("Char [%c]", byte);
   }
}


так тоже не принтит. ПОЧЕМУ?


Сообщение отредактировал хвостег - Вторник, 04.11.2014, 17:21:28
 
Sallcom Дата: Вторник, 04.11.2014, 17:26:27 | Сообщение # 4
Сообщений: 206
Репутация: 31 [ +/- ]
Цитата хвостег ()
В чат выводит Test:, а мне надо Test: %s %s


Делай вот так:
Код

PrintToServer("Test %%s %%s");


Для вывода знака % нужно писать %%

http://world-source.ru/forum/100-2688-16537-16-1343178504


Сообщение отредактировал Sallcom - Вторник, 04.11.2014, 17:27:23
 
хвостег Дата: Вторник, 04.11.2014, 17:34:00 | Сообщение # 5
Сообщений: 161
Репутация: 53 [ +/- ]
да в сервер принтит хоть экранируй хоть нет, мне в чат надо, не работает такой подход.
еще идеи?


Сообщение отредактировал хвостег - Вторник, 04.11.2014, 17:34:32
 
BarD Дата: Вторник, 04.11.2014, 17:42:51 | Сообщение # 6
Сообщений: 942
Репутация: 132 [ +/- ]
Код
new String:a[1]="s";
PrintToChat(client, "%%%s %%%s", a, a);


Попробуй так) я не знаю)


Сообщение отредактировал BarD - Вторник, 04.11.2014, 17:43:27
 
хвостег Дата: Вторник, 04.11.2014, 17:50:50 | Сообщение # 7
Сообщений: 161
Репутация: 53 [ +/- ]
Цитата BarD ()
new String:a[1]="s";
PrintToChat(client, "%%%s %%%s", a, a);

Так же, ничего не принтит.
 
BarD Дата: Вторник, 04.11.2014, 18:08:52 | Сообщение # 8
Сообщений: 942
Репутация: 132 [ +/- ]
Код
new String:a[1]="%";
new String:b[1] = "s";

PrintToChat(client, " %s%s %s%s", a, b, a, b);


Или так:
Код
new String:a[2]="%%";
new String:b[1] = "s";

PrintToChat(client, " %s%s %s%s", a, b, a, b);
 
хвостег Дата: Вторник, 04.11.2014, 18:13:30 | Сообщение # 9
Сообщений: 161
Репутация: 53 [ +/- ]
даже если это заработает, мне нужно запринтить строку одним %s. как это сделано в 1 посте.
т.к я без понятия какие символы напишет клиент в чат, мне нужно их передать без потерь, а это
Цитата BarD ()
" %s%s %s%s", a, b, a, b
- "городушки" какие-то
И последний вопрос.
Чем отличается стандартный (движковый) метод отображения сообщений от этого
Код

stock print(client, String:format[], any:...)
{
  decl String:Compile[253];
  VFormat(Compile, sizeof(Compile), format, 3);
   
  new Handle:bf = StartMessageOne("SayText2", client);
  if(bf != INVALID_HANDLE)
  {
   BfWriteByte(bf, 0);
   BfWriteByte(bf, false);
   BfWriteString(bf, Compile);
   EndMessage();
  }
}


Сообщение отредактировал хвостег - Вторник, 04.11.2014, 18:18:47
 
BarD Дата: Вторник, 04.11.2014, 18:22:49 | Сообщение # 10
Сообщений: 942
Репутация: 132 [ +/- ]
Даже и не знаю, как можно это провернуть...
 
Sallcom Дата: Вторник, 04.11.2014, 18:59:11 | Сообщение # 11
Сообщений: 206
Репутация: 31 [ +/- ]
Код

PrintToChat(client, "Test: %%s");



Но два %%s не выводит вообще, только "Test: ", а дальше как будто ничего нет.

Прикрепления: 7204937.png(642.2 Kb)


Сообщение отредактировал Sallcom - Вторник, 04.11.2014, 19:00:59
 
хвостег Дата: Вторник, 04.11.2014, 19:05:17 | Сообщение # 12
Сообщений: 161
Репутация: 53 [ +/- ]
Именно, я так понял чат процессор внутриигровой ругается.
Запринти с 2мя %s и обрати внимаение на сообщение в консоли (игровой)
Код

Bad format string in CLocalizeStringTable::ConstructString
 
Sallcom Дата: Вторник, 04.11.2014, 19:38:26 | Сообщение # 13
Сообщений: 206
Репутация: 31 [ +/- ]
Вспомнив про знак неразрывного пробела, я начал гуглить его для разных языков и кодировок.
В конечном итоге остановился на 0xA0, но код
Код

PrintToChat(client, "Test: %%%ss", 0xA0);

Сначала выдавал "Test: % s", а сейчас и вовсе "Test: %�s".

Тогда я сделал вот так:
Код

PrintToChat(client, "Test: %%%ss", 0xA0&10);

И вывод стал таким, какой и нужен, то есть "Test: %s".

В конечном итоге, я аналогично добавил второй символ %s и все что мне вывело, это "Test: ", так что вывести "Test: %s %s" нереально.

P.S. Информация про данный символ http://www.fileformat.info/info/unicode/char/a0/index.htm


Сообщение отредактировал Sallcom - Вторник, 04.11.2014, 20:03:13
 
хвостег Дата: Вторник, 04.11.2014, 20:18:32 | Сообщение # 14
Сообщений: 161
Репутация: 53 [ +/- ]
Это то, о чем я говорил в первом посте, можно добавить символ между % и s, так то оно и у меня работает

Код

public OnPluginStart()
{
  RegConsoleCmd("sm_asd", CMD_ASD);
}

public Action:CMD_ASD(client, args)
{
  print(client, "%s", "%s %s %s %s %s %s");
}

stock print(client, String:format[], any:...)
{
  decl String:Compile[253];
  VFormat(Compile, sizeof(Compile), format, 3);
   
  ReplaceString(Compile, sizeof(Compile), "%s", "%\x1Cs")
   
  new Handle:bf = StartMessageOne("SayText2", client);
  if(bf != INVALID_HANDLE)
  {
   BfWriteByte(bf, 0);
   BfWriteByte(bf, true);
   BfWriteString(bf, Compile);
   EndMessage();
  }
}


но хотелось бы без лишних символов обойтись...
 
BarD Дата: Среда, 05.11.2014, 04:49:16 | Сообщение # 15
Сообщений: 942
Репутация: 132 [ +/- ]
R1KO сказал, можно попробовать "\%s".


Сообщение отредактировал BarD - Среда, 05.11.2014, 17:38:04
 
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Форматирование
  • Страница 1 из 1
  • 1
Поиск: