[fixed] Проблемы с именами мобов вида Poring [Unknown]

BugTraq: обнаруженные ошибки и обсуждение их устранения.

Модератор: 4epT

Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Хм... можно предположить, что в клиенте на самом деле где-то храняцца имена мобов (прямо в exe-шнике?!), а кривые г-да еАзеновцы по умолчанию их не высылают.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
vit
Бывалый
Сообщения: 624
Зарегистрирован: Вс мар 25, 2007 9:18 pm
Сервер RO:: localhost
Откуда: Санкт-Петербург

Сообщение vit »

Забыл добавить одну важную вещь: это я проверял на версии ОК 206SVN6172.....
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

vit
А это как раз пофигу, в какой версии. :twisted: Эта проблема возникла очень давно и ею никто никогда не занимался.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Aib0
Бывалый
Сообщения: 961
Зарегистрирован: Чт ноя 16, 2006 12:50 am
Контактная информация:

Сообщение Aib0 »

Что-то емули кривят(
Имхо - неправильно читается пакет с именем моба.
Wtf is "OpenKore"?

"What we're dealing with here is a total lack of respect for the law"
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Хотя эмули - эмулями, а люди-то играют. :( Черт знает что.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
vit
Бывалый
Сообщения: 624
Зарегистрирован: Вс мар 25, 2007 9:18 pm
Сервер RO:: localhost
Откуда: Санкт-Петербург

Сообщение vit »

Ну, половил я пакеты, посмотрел..... Там кроме имени моба еще какая-то полезная инфа(может быть HP). А вот какая именно, хз. Но она просто не обрабатывается. Завтра еще посмотрю.
vit
Бывалый
Сообщения: 624
Зарегистрирован: Вс мар 25, 2007 9:18 pm
Сервер RO:: localhost
Откуда: Санкт-Петербург

Сообщение vit »

Ура, товарищи! :Yahoo!: :Yahoo!: :Yahoo!:
Половил я значит пакетики, посмотрел на них. Проблема возникает с серверами, где включено отображение 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):
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 ......
Где заголовок пакета, ID, имя моба.

Решается это так:
В файле 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.S: Дописанный кусок кода писал не я. Я взял его из функции actor_info, поэтому ошибок в нем быть не должно.
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 раз на каждого моба, ну и при каждом ударе по мобу...
Так кто там спрашивал про экономлю трафика? :twisted:
Аватара пользователя
Aib0
Бывалый
Сообщения: 961
Зарегистрирован: Чт ноя 16, 2006 12:50 am
Контактная информация:

Сообщение Aib0 »

Умница) Возьми с полки пирож... то есть плюшку)
Wtf is "OpenKore"?

"What we're dealing with here is a total lack of respect for the law"
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

А разве это место не надо править? -
'0195' => ['actor_name_received', 'a4 Z24 Z24 Z24 Z24', [qw(ID name partyName guildName guildTitle)]],
Добавлено спустя 1 минуту 6 секунд:

А, я понял, это типо Дропс у нас в гильде, в пати? )))) ЛОЛ!

Добавлено спустя 36 секунд:

Не, всё равно странно, тогда внешний вид мобов должен бы меняться по /showinfo , хотя это может быть зашито в клиент. )

Добавлено спустя 1 минуту 41 секунду:

Отлично, будем коммитить!
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
vit
Бывалый
Сообщения: 624
Зарегистрирован: Вс мар 25, 2007 9:18 pm
Сервер RO:: localhost
Откуда: Санкт-Петербург

Сообщение vit »

piroJOKE писал(а):А разве это место не надо править? -
'0195' => ['actor_name_received', 'a4 Z24 Z24 Z24 Z24', [qw(ID name partyName guildName guildTitle)]],
Нет, всё и так работает. Просто этим пакетом приходит не только инфа о плеерах, но и о мобах, поэтому названия переменных можно было бы поменять на более подходящие(у меня идей нет).
piroJOKE писал(а):А, я понял, это типо Дропс у нас в гильде, в пати? )))) ЛОЛ!
Ну, просто если сравнить описание пакетов:
'0095' => ['actor_info', 'a4 Z24', [qw(ID name)]],
'0195' => ['actor_name_received', 'a4 Z24 Z24 Z24 Z24', [qw(ID name partyName guildName guildTitle)]],
То для моба мы не используем переменные partyName, guildName, guildTitle, хотя в них хранится HP/lvl моба.
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

В современной ОК это место выглядит чуть-чуть не так (изменения ниже):
(фрагмент выше, будучи вставлен в 6205 - работал, но файл с мобами не заполнялся).

Код: Выделить всё

			...
			updateMonsterLUT(Settings::getTableFilename("monsters.txt"), $monster->{nameID}, $name);
		}
	}
Вит! Огромное спасибо! :D :)

Добавлено спустя 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 секунду:

О! У мну есть клёвая идея. Вот сюда бы повесить определялку, что это за актор. Если не плеер и не монстр, то пусть оно пищит и матюкаеццо. Может так что-то еще найдем? :twisted:
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Чо-то у мну параноя: надеюсь мы этим работу на оф-серверах не заломаем? >__>

* * *

[info] Обработка имени моба из пакта 0x0195 вошла как svn-6212.
Последний раз редактировалось piroJOKE Чт фев 28, 2008 1:53 pm, всего редактировалось 1 раз.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
vit
Бывалый
Сообщения: 624
Зарегистрирован: Вс мар 25, 2007 9:18 pm
Сервер RO:: localhost
Откуда: Санкт-Петербург

Сообщение vit »

piroJOKE писал(а):Чо-то у мну параноя: надеюсь мы этим работу на оф-серверах не заломаем? >__>
Да не должны. Вот первая строчка находит моба по ИД(или 0, если по этому ИД моба нет(т е Плеер или еще что)), а вторая собственно проверяет, нашли ли мы моба...
my $monster = $monstersList->getByID($args->{ID});
if ($monster) {
...
}
Ответить