[fixed] Проблемы с именами мобов вида Poring [Unknown]
Модератор: 4epT
-
- Бывалый
- Сообщения: 624
- Зарегистрирован: Вс мар 25, 2007 9:18 pm
- Сервер RO:: localhost
- Откуда: Санкт-Петербург
Ура, товарищи!
Половил я значит пакетики, посмотрел на них. Проблема возникает с серверами, где включено отображение HP/lvl у мобов, а именно в настройках eAthena эта опция находится в файле conf/battle/monster.conf и выглядит так:
Если отображение инфы о мобах включено, то приходят совсем другие пакеты(на примере все того же Дропса, и при значении show_mob_info: 1):
Решается это так:
В файле Receive.pm в функцию actor_name_received дописать:
P.S: Дописанный кусок кода писал не я. Я взял его из функции actor_info, поэтому ошибок в нем быть не должно.
P.P.S: Тут никак не используется информация о HP/lvl моба. ее обработку можно будет прифигачить потом(а надо ли это?)
P.P.P.S: Если смотреть на строчку с разбором пакета 0195:
P.P.P.P.S: Кусок кода
P.P.P.P.P.S: Еще интересный факт: теперь ОК отсылает меньше пакетов(естесственно это относится только к указанным серверам). Раньше ОК отсылала пакет на получение информации от моба каждую секунду(так как приходящий пакет не обрабатывался корректно), теперь же все корректно, и запрос отправляется 1 раз на каждого моба, ну и при каждом ударе по мобу...
Так кто там спрашивал про экономлю трафика?
Половил я значит пакетики, посмотрел на них. Проблема возникает с серверами, где включено отображение HP/lvl у мобов, а именно в настройках eAthena эта опция находится в файле conf/battle/monster.conf и выглядит так:
Если её значение равно нулю, то приходят пакеты вида(на примере Дропса):// Display some mob info next to their name? (add as needed)
// (does not works on guardian or emperium)
// 1: Display mob HP (Hp/MaxHp format)
// 2: Display mob HP (Percent of full life format)
// 4: Display mob's level
show_mob_info: 0
которые прекрасно обрабатываются, и все нормально.0000 95 00 52 B4 8E 06 44 72 6F 70 73 00 00 00 00 00 ..R...Drops.....
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..............
Если отображение инфы о мобах включено, то приходят совсем другие пакеты(на примере все того же Дропса, и при значении show_mob_info: 1):
Где заголовок пакета, ID, имя моба.0000 95 01 52 B4 8E 06 44 72 6F 70 73 00 00 00 00 00 ..R...Drops.....
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 50 ..............HP
0020 3A 20 35 35 2F 35 35 00 7C 20 00 C9 22 00 00 00 : 55/55.| .."...
0030 00 00 06 00 00 00 00 06 04 00 00 00 88 5C D3 7F .............\..
0040 00 00 00 00 00 00 00 00 FC CE 2F 73 00 00 48 50 ........../s..HP
0050 3A 20 35 35 2F 35 35 00 7C 20 00 C9 22 00 00 00 : 55/55.| .."...
0060 00 00 06 00 00 00 ......
Решается это так:
В файле Receive.pm в функцию actor_name_received дописать:
Код: Выделить всё
sub actor_name_received {
my ($self, $args) = @_;
# FIXME: There is more to this packet than just party name and guild name.
# This packet is received when you leave a guild
# (with cryptic party and guild name fields, at least for now)
my $player = $playersList->getByID($args->{ID});
if (defined $player) {
# Receive names of players who are in a guild.
$player->setName(bytesToString($args->{name}));
$player->{party}{name} = bytesToString($args->{partyName});
$player->{guild}{name} = bytesToString($args->{guildName});
$player->{guild}{title} = bytesToString($args->{guildTitle});
updatePlayerNameCache($player);
debug "Player Info: $player->{name} ($player->{binID})\n", "parseMsg_presence", 2;
Plugins::callHook('charNameUpdate', $player);
} else {
debug "Player Info for " . unpack("V", $args->{ID}) .
" (not on screen): " . bytesToString($args->{name}) . "\n",
"parseMsg_presence/remote", 2;
}
+ my $monster = $monstersList->getByID($args->{ID});
+ if ($monster) {
+ my $name = bytesToString($args->{name});
+ debug "Monster Info: $name ($monster->{binID})\n", "parseMsg", 2;
+ $monster->{name_given} = $name;
+ if ($monsters_lut{$monster->{nameID}} eq "") {
+ $monster->setName($name);
+ $monsters_lut{$monster->{nameID}} = $name;
+ +updateMonsterLUT("$Settings::tables_folder/monsters.txt", $monster->{nameID}, $name);
+ }
+ }
}
P.P.S: Тут никак не используется информация о HP/lvl моба. ее обработку можно будет прифигачить потом(а надо ли это?)
P.P.P.S: Если смотреть на строчку с разбором пакета 0195:
то вот имена переменных теперь не совсем корректны...'0195' => ['actor_name_received', 'a4 Z24 Z24 Z24 Z24', [qw(ID name partyName guildName guildTitle)]],
P.P.P.P.S: Кусок кода
я бы выкинул...else {
debug "Player Info for " . unpack("V", $args->{ID}) .
" (not on screen): " . bytesToString($args->{name}) . "\n",
"parseMsg_presence/remote", 2;
}
P.P.P.P.P.S: Еще интересный факт: теперь ОК отсылает меньше пакетов(естесственно это относится только к указанным серверам). Раньше ОК отсылала пакет на получение информации от моба каждую секунду(так как приходящий пакет не обрабатывался корректно), теперь же все корректно, и запрос отправляется 1 раз на каждого моба, ну и при каждом ударе по мобу...
Так кто там спрашивал про экономлю трафика?
- piroJOKE
- Модератор
- Сообщения: 8205
- Зарегистрирован: Сб ноя 04, 2006 2:20 am
- Сервер RO:: localhost
- Откуда: Molvania
А разве это место не надо править? -
А, я понял, это типо Дропс у нас в гильде, в пати? )))) ЛОЛ!
Добавлено спустя 36 секунд:
Не, всё равно странно, тогда внешний вид мобов должен бы меняться по /showinfo , хотя это может быть зашито в клиент. )
Добавлено спустя 1 минуту 41 секунду:
Отлично, будем коммитить!
Добавлено спустя 1 минуту 6 секунд:'0195' => ['actor_name_received', 'a4 Z24 Z24 Z24 Z24', [qw(ID name partyName guildName guildTitle)]],
А, я понял, это типо Дропс у нас в гильде, в пати? )))) ЛОЛ!
Добавлено спустя 36 секунд:
Не, всё равно странно, тогда внешний вид мобов должен бы меняться по /showinfo , хотя это может быть зашито в клиент. )
Добавлено спустя 1 минуту 41 секунду:
Отлично, будем коммитить!
-
- Бывалый
- Сообщения: 624
- Зарегистрирован: Вс мар 25, 2007 9:18 pm
- Сервер RO:: localhost
- Откуда: Санкт-Петербург
Нет, всё и так работает. Просто этим пакетом приходит не только инфа о плеерах, но и о мобах, поэтому названия переменных можно было бы поменять на более подходящие(у меня идей нет).piroJOKE писал(а):А разве это место не надо править? -'0195' => ['actor_name_received', 'a4 Z24 Z24 Z24 Z24', [qw(ID name partyName guildName guildTitle)]],
Ну, просто если сравнить описание пакетов:piroJOKE писал(а):А, я понял, это типо Дропс у нас в гильде, в пати? )))) ЛОЛ!
То для моба мы не используем переменные partyName, guildName, guildTitle, хотя в них хранится HP/lvl моба.'0095' => ['actor_info', 'a4 Z24', [qw(ID name)]],'0195' => ['actor_name_received', 'a4 Z24 Z24 Z24 Z24', [qw(ID name partyName guildName guildTitle)]],
- piroJOKE
- Модератор
- Сообщения: 8205
- Зарегистрирован: Сб ноя 04, 2006 2:20 am
- Сервер RO:: localhost
- Откуда: Molvania
В современной ОК это место выглядит чуть-чуть не так (изменения ниже):
(фрагмент выше, будучи вставлен в 6205 - работал, но файл с мобами не заполнялся).
Добавлено спустя 20 минут 16 секунд:
Опубликовал ядовитую заметку про это на форуме ОК: http://forums.openkore.com/viewtopic.php?t=37821
(Приписал в конце, что мол то, что эту х-ню нашли только щас,
говорит о том, что на разработку ОК давно забит толстый болт).
Добавлено спустя 16 минут 51 секунду:
Забавно, что ОК-шники подозревали, что с этим 0x0195 что-то не так:
# FIXME: There is more to this packet than just party name and guild name.
Но до конца так дело и не довели.
Добавлено спустя 1 минуту 35 секунд:
А насчет прочей инфы в пакете. По идее, HP моба можно загружать прямо в target delta hp!
Добавлено спустя 5 минут 42 секунды:
Для справки: формированием пакета 0x195 занимается в eAthena следующая процедура:
// updates the object's (bl) name on client
int clif_charnameack (int fd, struct block_list *bl)
...
Добавлено спустя 24 минуты 19 секунд:
Вроде бы как еще в этом пакете может быть инфа об петах, гомункулах и... открытых чатах(?!).
Добавлено спустя 20 минут 41 секунду:
О! У мну есть клёвая идея. Вот сюда бы повесить определялку, что это за актор. Если не плеер и не монстр, то пусть оно пищит и матюкаеццо. Может так что-то еще найдем?
(фрагмент выше, будучи вставлен в 6205 - работал, но файл с мобами не заполнялся).
Вит! Огромное спасибо!Код: Выделить всё
... updateMonsterLUT(Settings::getTableFilename("monsters.txt"), $monster->{nameID}, $name); } }
Добавлено спустя 20 минут 16 секунд:
Опубликовал ядовитую заметку про это на форуме ОК: http://forums.openkore.com/viewtopic.php?t=37821
(Приписал в конце, что мол то, что эту х-ню нашли только щас,
говорит о том, что на разработку ОК давно забит толстый болт).
Добавлено спустя 16 минут 51 секунду:
Забавно, что ОК-шники подозревали, что с этим 0x0195 что-то не так:
# FIXME: There is more to this packet than just party name and guild name.
Но до конца так дело и не довели.
Добавлено спустя 1 минуту 35 секунд:
А насчет прочей инфы в пакете. По идее, HP моба можно загружать прямо в target delta hp!
Добавлено спустя 5 минут 42 секунды:
Для справки: формированием пакета 0x195 занимается в eAthena следующая процедура:
// updates the object's (bl) name on client
int clif_charnameack (int fd, struct block_list *bl)
...
Добавлено спустя 24 минуты 19 секунд:
Вроде бы как еще в этом пакете может быть инфа об петах, гомункулах и... открытых чатах(?!).
Добавлено спустя 20 минут 41 секунду:
О! У мну есть клёвая идея. Вот сюда бы повесить определялку, что это за актор. Если не плеер и не монстр, то пусть оно пищит и матюкаеццо. Может так что-то еще найдем?
- piroJOKE
- Модератор
- Сообщения: 8205
- Зарегистрирован: Сб ноя 04, 2006 2:20 am
- Сервер RO:: localhost
- Откуда: Molvania
Чо-то у мну параноя: надеюсь мы этим работу на оф-серверах не заломаем? >__>
* * *
[info] Обработка имени моба из пакта 0x0195 вошла как svn-6212.
* * *
[info] Обработка имени моба из пакта 0x0195 вошла как svn-6212.
Последний раз редактировалось piroJOKE Чт фев 28, 2008 1:53 pm, всего редактировалось 1 раз.
-
- Бывалый
- Сообщения: 624
- Зарегистрирован: Вс мар 25, 2007 9:18 pm
- Сервер RO:: localhost
- Откуда: Санкт-Петербург
Да не должны. Вот первая строчка находит моба по ИД(или 0, если по этому ИД моба нет(т е Плеер или еще что)), а вторая собственно проверяет, нашли ли мы моба...piroJOKE писал(а):Чо-то у мну параноя: надеюсь мы этим работу на оф-серверах не заломаем? >__>
my $monster = $monstersList->getByID($args->{ID});
if ($monster) {
...
}