Страница 1 из 3

[fixed] Бот не видит передвижения окружающих / пакет 0086

Добавлено: Чт апр 26, 2007 12:25 pm
PetroW
- Ты суслика видишь?
- Нет!
- А он есть!!!
из к-ф "ДМБ"

Я догдывался о причине данного поведения бота раньше: что-то не то с координатами окружающих, но в плотную заняться не выходило.

Занялся! :x

Взял два сервака, RusRo и Etherial
на RusRo все чики-пуки, прист всегда рядом, мирные убиваются без проблем и головной боли.
Etherial - все с точностью до наоборот. Отлично обстоят дела только с Географерами, Генералами, плантами с теми кто только стоит!

Беру WPE pro, и тут сразу видна разница!!!
Rusro при появлении или любом движении окружающих высылает пакет 022C => actor_display

А Etherial!!!
При появлении в зоне видимости кого-то: пакет 022C => actor_display,
но если тот делает передвижение, приходит маленький пакетик 0086 на 16 байт с содержанием что-то типа (ID x y). ID точно есть.

Лезем в Receive.pm и... OOPS!!!
А там нет разбора пакета 0086

судя по нумерации - пакет не новый, но почему его убрали из Коры?
или заменили? на какой?

Вот такой вот калинКор получается! :)
Диагноз ясен, помогите вылечить!

ПС:щас пытаюсь разобраться в структуре 86-го пакета и ищу его в старых Корах.


* * *

pJ (добавлено после завершения всей катавасии):
Резюме: Текущий 1.9.4 SVN 56** содержит полностью работоспособный патч г-на Петрова. Рекомендуеццо к использованию!

* * *

Типо новости: Подтверждено, что на большинстве приватников отказались от пакета 0х86, т.к. ленивые г-да разработчики eAthena так и с не сумели добиться правильной анимации передвижения мобов с этим пакетом.
pJ: Еще раз огромное спасибо, дарагой афтар, за твою работу!

Добавлено: Чт апр 26, 2007 1:40 pm
piroJOKE
-- erased --
(заголовок темы исправлен)

Добавлено: Пт апр 27, 2007 12:05 am
kLabMouse
Афтар.
Попробуй посмотреть в СВНке, там где находятся бранчи, уверен найдёш.

Просто данный пакет был давным давно убран со всех офовых серваков.

Добавлено: Пт апр 27, 2007 12:10 pm
PetroW
Скачал Тортилу, бегал по ревизиям (не по всем, выборочно) но у всех ревизий начиная с первых тот же набор 80-х пакетов, что и у последней - 81,87,88.

Не пахнет там 86-ым
Просто данный пакет был давным давно убран
ты точно знаешь, что он был в Коре, или это предположение?

Добавлено: Пт апр 27, 2007 12:43 pm
kLabMouse
PetroW
ХМ... не где-то оно точно было описано. Только вот не помнюгде.

Добавлено: Пт апр 27, 2007 1:15 pm
piroJOKE
PetroW
Поставь серию экспериментов. Например, подключись 2 обычными клиентами, причем один просто наблюдатель (с wpe), а вторым побегай вокруг да около, да налови изрядно этих пакетов.

В древнем(!) гайде packet_table_en.txt, такой пакет не описан. BTW, serverType 0 хорош тем, что в пакетах нет ничего лишнего, и, что самое интересное, номера пакетов (всех, ну а данном случае 85....87) идут логически один за другим. Да собственно, вот фрагмент гайда:
\svn-ea\branches\eapp\doc\packet_table_en.txt:

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

 S 0085 <X_Y>.3B
	?Ъ“®—v‹Ѓ
	request to walk
R 0087 <server tick>.l <X_Y_X_Y>.5B ?.B
	?Ъ“®‰ћ“љ
	response to the request to walk
R 0088 <ID>.l <X>.w <Y>.w
	?Ъ“®“r’†’вЋ~
	stop walking
* * *

Вот нечто интересное:
\svn-ea\trunk\src\map\clif.c:

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

/// Move the unit (does nothing if the client has no info about the unit)
/// Note: unit must not be self
void clif_move(struct unit_data *ud)
{
	unsigned char buf[16];
	struct view_data* vd;
	struct block_list* bl = ud->bl;
	vd = status_get_viewdata(bl);
	if (!vd || vd->class_ == INVISIBLE_CLASS)
		return; 
	
	if (ud->state.speed_changed) {
		// Since we don't know how to update the speed of other objects,
		// use the old walk packet to update the data.
		ud->state.speed_changed = 0;
		clif_move2(bl, vd, ud);
		return;
	}

	WBUFW(buf,0)=0x86;
	WBUFL(buf,2)=bl->id;
	WBUFPOS2(buf,6,bl->x,bl->y,ud->to_x,ud->to_y,8,8);
	WBUFL(buf,12)=gettick();
	clif_send(buf, 16, bl, AREA_WOS);
	if (disguised(bl))
		clif_setdisguise((TBL_PC*)bl, buf, 16, 0);
}
* * *
судя по нумерации - пакет не новый, но почему его убрали из Коры?
Выходит, судишь ты неверно. Я просмотрел многие версии OpenKore которые у меня есть в коллекции. Даже заглянул в других ботофф и в оригинальный Kore. Этого 0086 нигде нет. И в \tables\packetdescriptions.txt его тоже нет.

Добавлено: Сб апр 28, 2007 9:47 am
piroJOKE
PetroW
Афтар, не спи, замерзнешь. Чо-то еще умудрился наловить?

* * *

Да! Это kartina of Repin! Kore видит, что моб все время стоит на месте. :P Ну а если отойти подальше от него, и вернуться, он стоймя стоит уже в другом месте. :crazy:

Добавлено: Сб апр 28, 2007 11:22 am
PetroW
Этого 0086 нигде нет. И в \tables\packetdescriptions.txt его тоже нет.
А в recvpackets.txt ? Есть!

Очень люблю перл за то, что кучу операций можно записать короткой командой в одну строку, но вот разгреба-а-ать эту строку... %)
Устала Алла! кому интересно:

В файле Receive.pm:
найти
'0081' => ['errors', 'C1', [qw(type)]],
'0087' => ['character_moves', 'x4 a5 C1', [qw(coords unknown)]],
Вставить 86 пакет
'0081' => ['errors', 'C1', [qw(type)]],
'0086' => ['actor_display', 'a4 a5', [qw(ID coords)]],
'0087' => ['character_moves', 'x4 a5 C1', [qw(coords unknown)]],
Найти
#### Step 1: create/get the correct actor object ####
Всавить
#### Step 1: create/get the correct actor object ####

if ($args->{switch} eq "0086") {
$args = &Actor::get($args->{ID});
$args->{switch} = "0086";
}
Найти
} elsif ($args->{switch} eq "007B" ||
$args->{switch} eq "01DA" ||
$args->{switch} eq "022C") {
# Actor Moved
Заменить
} elsif ($args->{switch} eq "007B" ||
$args->{switch} eq "0086" ||
$args->{switch} eq "01DA" ||
$args->{switch} eq "022C") {
# Actor Moved

Файл Vx.pm
Найти
} elsif ($switch eq "007B" || $switch eq "01DA") {
Заменить
} elsif ($switch eq "007B" || $switch eq "0086" || $switch eq "01DA") {
В файл packetdescriptions.txt добавить после
0081 Disconnected from Server

0086 actor_display (actor moved)

Вроде работает.
Прист как пришитый, даже вперед забегает ))

Спасибо piroJOKE за

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

   WBUFW(buf,0)=0x86; 
   WBUFL(buf,2)=bl->id; 
   WBUFPOS2(buf,6,bl->x,bl->y,ud->to_x,ud->to_y,8,8); 
   WBUFL(buf,12)=gettick(); 
   clif_send(buf, 16, bl, AREA_WOS); 
   if (disguised(bl)) 
      clif_setdisguise((TBL_PC*)bl, buf, 16, 0);

Добавлено: Сб апр 28, 2007 12:13 pm
piroJOKE
Есть одна бяка. Точнее две.

VX - это древний интерфейс, он никем вообще не используется.

А вот WX не полностью рабочий, увы. Да, ты можешь давать команды ml и видеть, как изменяются координаты. Но, точки мобов на карте НЕ двигаются! Чего-то не хватает.
Ага, даже не так. Если ты двигаешься САМ, то карта обновляется, а если только объекты на карте - то нет. ((

Добавлено: Сб апр 28, 2007 12:19 pm
piroJOKE
Короче. Отличная работа!!!

Парень, СРОЧНО публикуй это на форуме OpenKore, в Developers Corner; это надобно внести в код!

ЗАЧОТ! :good: :good: :good:

ЗЫ: Краткая запись апдейта:
Receive.pm:

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

		'0081' => ['errors', 'C1', [qw(type)]],
+		'0086' => ['actor_display', 'a4 a5', [qw(ID coords)]], 
		'0087' => ['character_moves', 'x4 a5 C1', [qw(coords unknown)]],

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

	#### Step 1: create/get the correct actor object ####
+	if ($args->{switch} eq "0086") {
+		$args = &Actor::get($args->{ID});
+		$args->{switch} = "0086";
+	} 

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

	} elsif ($args->{switch} eq "007B" ||
+		$args->{switch} eq "0086" || 
		$args->{switch} eq "01DA" ||
		$args->{switch} eq "022C") {
		# Actor Moved
Vx.pm:

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

-	} elsif ($switch eq "007B" || $switch eq "01DA") { 
+	} elsif ($switch eq "007B" || $switch eq "0086" || $switch eq "01DA") {
packetdescriptions.txt:

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

0081 Disconnected from Server
+0086 actor_display (actor moved)
2All: Кто может, тестируйте. Интересуют возможные "побочные эффекты", баги, etc.

Добавлено: Сб апр 28, 2007 1:40 pm
PetroW
Я тоже заметил, что в WX-e обновляется карта и итемлист только при появлении нового объекта, пропадании старого, убийстве объекта и при собственном движении.
Но при этом кора корректно отслеживает координаты у себя в закромах, т. е. на работоспособности, вернее на Ботоспособности :lol: это не сказывается.

А на форум OpenKore можете отписать сами? :oops:

Добавлено: Сб апр 28, 2007 1:54 pm
piroJOKE
Во, я на ломаном английском состряпал тему: http://forums.openkore.com/viewtopic.php?t=29974

Добавлено: Сб апр 28, 2007 2:00 pm
PetroW
Mr. PetroW :ROFL:

Добавлено: Сб апр 28, 2007 2:02 pm
piroJOKE
Ха-ха, это оказывается не "какой-то старый пакет", а "какой-то новый пакет":
2007/03/12
...
* Changed the unit-walk packet to be 0x86 as pointed out by FlavioJS. This
new packet is much smaller, and should greatly decrease bandwidth usage.
The only drawback is that the character will not display at all if the
client didn't know of it's existance previously, but eA should always be
sending a spawn packet when an object gets into/out of sight anyway, so
it should work correctly.
2007/03/09
...
* Added info on packet 0x86 (simple move packet). Not usable until a clear
separation between entering sight/leaving sight/walking in sight is done.

* * *
PetroW писал(а):Mr. PetroW :ROFL:
Ну, это чтоб те ребята опять случайно меня в credits'ы не записали! А то, вон я сдуру даже в "разработчегах" числюсь, лол! :lol:

Добавлено: Сб апр 28, 2007 6:26 pm
kLabMouse
ЫЫ. Новый???? Блин, нужно одного товарисча помучать на щёт сервака, или даже может в клиенте порытся. 100% что на все 100% мы пакеты не знаем!