Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Packet 0xAD
GumanoiD
сообщение 29.8.2013, 22:23
Сообщение #1


****

Apprentice
Сообщений: 176
Регистрация: 6.5.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 5.924



Пытаюсь сделать, что бы велся лог разговоров....
но проблема
пока еще не научился выдирать из пакета сам текст, который произносит персонаж
Но уже из этого можно сделать антифлуд скрипт =)

не подскажите как это сделать?

конфиг uopacket.cfg
Код
Packet 0xAD
{
  Length           variable
  ReceiveFunction  msg_log:LogSystem
}


сам скрипт

Код
use uo;
use os;

program msg_log()
Print( "Log's message system." );
return 1;
endprogram

const SPEECH_PKG_OFFSET_MODE := 3;

exported function LogSystem(character, byref packet)
var mode := packet.GetInt8(SPEECH_PKG_OFFSET_MODE);
  if (mode == 0xc0)
    return 0;
  endif
endfunction
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
GumanoiD
сообщение 29.8.2013, 22:45
Сообщение #2


****

Apprentice
Сообщений: 176
Регистрация: 6.5.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 5.924



Разобрался... гугл рулит =)

вот итог:
Код
use uo;
use os;
use util;
use unicode;

program msg_log()
Print( "Log's message system." );
return 1;
endprogram

exported function LogSystem(character, byref packet)
   var speech := "";
   var speechstart := 12;
   if (packet.GetInt8(3) == 0xC0)
      var triggers := packet.GetInt16(12)/16;
      var bytes := CInt(triggers*1.5 + 2);
      speechstart := CInt(speechstart + bytes);
      var speechlen := packet.GetInt16(1) - 1 - speechstart;
      speech := CStr(packet.GetString(speechstart, speechlen));
   else
      var speechlen := (packet.GetInt16(1) - 13)/2;
      speech := packet.GetUnicodeString(speechstart, speechlen);
   endif
   syslog("["+character.name+"] [X-"+character.x+", Y-"+character.y+"] say ["+speech+"]");
endfunction


В логи можете писать как вам нравиться...
Вот пример как тут сохраняет:
Код
[08/29 23:43:33] [pkg/foundations/msg_log/msg_log.ecl]: [Gumanoid] [X5445, Y1152] say [{ 1072, 1072, 1072, 1072 }]
[08/29 23:43:42] [pkg/foundations/msg_log/msg_log.ecl]: [Gumanoid] [X5445, Y1152] say [{ 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081 }]
[08/29 23:43:48] [pkg/foundations/msg_log/msg_log.ecl]: [Gumanoid] [X5445, Y1152] say [{ 1056, 1072, 1073, 1086, 1090, 1072, 1077, 1090, 33 }]
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
oda128
сообщение 18.10.2013, 1:07
Сообщение #3


***

Группа: Пользователи
Наличность: 0
Пользователь №: 15.797



А как ты потом переводишь в слова?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
GumanoiD
сообщение 18.10.2013, 11:23
Сообщение #4


****

Apprentice
Сообщений: 176
Регистрация: 6.5.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 5.924



Цитата(oda128 @ 18.10.2013, 2:07) *

А как ты потом переводишь в слова?

этим я пока не заморачивался)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 18.10.2013, 11:34
Сообщение #5


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Нужно к каждому элементу массива speech применить вот такую строку
Код
uc_text_array[_uc_char_value_iter] := uc_char_value - rus_uc_char_start + RUS_ASCII_START;

где
uc_char_value - это наш символ/элемент массива
rus_uc_char_start - это оффсет равный 1040
RUS_ASCII_START - это оффсет равный 192

в итоге uc_text_array получится строкой на русском языке


Для того чтобы понять откуда берутся эти цифры оффсетов придётся прочитать вот эту статейку http://en.wikipedia.org/wiki/Cyrillic_script_in_Unicode
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
gunja
сообщение 15.4.2015, 18:06
Сообщение #6


*

Registred
Сообщений: 5
Регистрация: 15.3.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.354
Возраст: 23



Цитата(RL_ka @ 18.10.2013, 11:34) *

Нужно к каждому элементу массива speech применить вот такую строку
Код
uc_text_array[_uc_char_value_iter] := uc_char_value - rus_uc_char_start + RUS_ASCII_START;

где
uc_char_value - это наш символ/элемент массива
rus_uc_char_start - это оффсет равный 1040
RUS_ASCII_START - это оффсет равный 192

в итоге uc_text_array получится строкой на русском языке
Для того чтобы понять откуда берутся эти цифры оффсетов придётся прочитать вот эту статейку http://en.wikipedia.org/wiki/Cyrillic_script_in_Unicode


Можешь поподробнее объяснить? Не очень понял сути и действия.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 15.4.2015, 18:57
Сообщение #7


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



Цитата(gunja @ 15.4.2015, 17:06) *

Можешь поподробнее объяснить? Не очень понял сути и действия.


Кириллическая буква 'А' в юникоде имеет порядковый номер 1040
Кириллическая буква 'а' в юникоде имеет порядковый номер 1072

Кириллическая буква 'A' в ASCII имеет порядковый номер 192
Кириллическая буква 'а' в ASCII имеет порядковый номер 224

Возьмём строку из второго сообщения, нашу "формулу" и оффсеты которые я дал выше.
[Gumanoid] [X5445, Y1152] say [{ 1072, 1072, 1072, 1072 }] // из написанного выше становится понятно что это строка 'aaaa'

Применяем к ней посимвольно формулу:
uc_text_array[_uc_char_value_iter] := uc_char_value - rus_uc_char_start + RUS_ASCII_START;

Из этого выходит:
1072 - 1040 + 192 = 224

Из 'a' (1072) в юникоде мы получили 'a' (224) в ASCII, которая может отображаться не как код, а как символ(IMG:style_emoticons/default/smile.gif)
Всё просто

Сообщение отредактировал RL_ka - 15.4.2015, 19:03
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
gunja
сообщение 15.4.2015, 20:14
Сообщение #8


*

Registred
Сообщений: 5
Регистрация: 15.3.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.354
Возраст: 23



Цитата(RL_ka @ 15.4.2015, 18:57) *

Кириллическая буква 'А' в юникоде имеет порядковый номер 1040
Кириллическая буква 'а' в юникоде имеет порядковый номер 1072

Кириллическая буква 'A' в ASCII имеет порядковый номер 192
Кириллическая буква 'а' в ASCII имеет порядковый номер 224

Возьмём строку из второго сообщения, нашу "формулу" и оффсеты которые я дал выше.
[Gumanoid] [X5445, Y1152] say [{ 1072, 1072, 1072, 1072 }] // из написанного выше становится понятно что это строка 'aaaa'

Применяем к ней посимвольно формулу:
uc_text_array[_uc_char_value_iter] := uc_char_value - rus_uc_char_start + RUS_ASCII_START;

Из этого выходит:
1072 - 1040 + 192 = 224

Из 'a' (1072) в юникоде мы получили 'a' (224) в ASCII, которая может отображаться не как код, а как символ(IMG:style_emoticons/default/smile.gif)
Всё просто


Это как раз понятно, но вот как сделать чтобы это нормальным шрифтом в логи записывалось, а не результатом в цифрах.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 16.4.2015, 13:14
Сообщение #9


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13715
Из: Екатеринбург
Пользователь №: 16.211



учим мат.часть (IMG:style_emoticons/default/smile.gif)
http://docs.polserver.com/pol099/singlefun...ile=basicem.xml
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
gunja
сообщение 16.4.2015, 17:48
Сообщение #10


*

Registred
Сообщений: 5
Регистрация: 15.3.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.354
Возраст: 23



Цитата(RL_ka @ 16.4.2015, 13:14) *

Спасибо за разъяснения, не со всеми функциями ещё знаком (IMG:style_emoticons/default/rolleyes.gif).
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 19.4.2024, 12:52
Designed by Nickostyle