Страница 2 из 2

Добавлено: Пт фев 22, 2008 9:09 pm
piroJOKE
Хм... можно предположить, что в клиенте на самом деле где-то храняцца имена мобов (прямо в exe-шнике?!), а кривые г-да еАзеновцы по умолчанию их не высылают.

Добавлено: Пт фев 22, 2008 9:12 pm
vit
Забыл добавить одну важную вещь: это я проверял на версии ОК 206SVN6172.....

Добавлено: Пт фев 22, 2008 9:14 pm
piroJOKE
vit
А это как раз пофигу, в какой версии. :twisted: Эта проблема возникла очень давно и ею никто никогда не занимался.

Добавлено: Сб фев 23, 2008 1:41 am
Aib0
Что-то емули кривят(
Имхо - неправильно читается пакет с именем моба.

Добавлено: Сб фев 23, 2008 1:54 am
piroJOKE
Хотя эмули - эмулями, а люди-то играют. :( Черт знает что.

Добавлено: Сб фев 23, 2008 2:06 am
vit
Ну, половил я пакеты, посмотрел..... Там кроме имени моба еще какая-то полезная инфа(может быть HP). А вот какая именно, хз. Но она просто не обрабатывается. Завтра еще посмотрю.

Добавлено: Пн фев 25, 2008 11:35 pm
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:

Добавлено: Пн фев 25, 2008 11:44 pm
Aib0
Умница) Возьми с полки пирож... то есть плюшку)

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

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

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

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

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

Отлично, будем коммитить!

Добавлено: Вт фев 26, 2008 12:04 am
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 моба.

Добавлено: Вт фев 26, 2008 1:07 pm
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:

Добавлено: Вт фев 26, 2008 10:56 pm
piroJOKE
Чо-то у мну параноя: надеюсь мы этим работу на оф-серверах не заломаем? >__>

* * *

[info] Обработка имени моба из пакта 0x0195 вошла как svn-6212.

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