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

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

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

PetroW
Начинающий
Сообщения: 23
Зарегистрирован: Вс янв 21, 2007 12:30 am
Откуда: Бобруйск

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

Сообщение 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: Еще раз огромное спасибо, дарагой афтар, за твою работу!
Последний раз редактировалось PetroW Чт апр 26, 2007 1:56 pm, всего редактировалось 1 раз.
Ничто так не портит цель, как - попадание!!!
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

-- erased --
(заголовок темы исправлен)
Последний раз редактировалось piroJOKE Сб апр 28, 2007 12:44 pm, всего редактировалось 1 раз.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

Афтар.
Попробуй посмотреть в СВНке, там где находятся бранчи, уверен найдёш.

Просто данный пакет был давным давно убран со всех офовых серваков.
PetroW
Начинающий
Сообщения: 23
Зарегистрирован: Вс янв 21, 2007 12:30 am
Откуда: Бобруйск

Сообщение PetroW »

Скачал Тортилу, бегал по ревизиям (не по всем, выборочно) но у всех ревизий начиная с первых тот же набор 80-х пакетов, что и у последней - 81,87,88.

Не пахнет там 86-ым
Просто данный пакет был давным давно убран
ты точно знаешь, что он был в Коре, или это предположение?
Ничто так не портит цель, как - попадание!!!
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

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

Сообщение 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 его тоже нет.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

PetroW
Афтар, не спи, замерзнешь. Чо-то еще умудрился наловить?

* * *

Да! Это kartina of Repin! Kore видит, что моб все время стоит на месте. :P Ну а если отойти подальше от него, и вернуться, он стоймя стоит уже в другом месте. :crazy:
Последний раз редактировалось piroJOKE Сб апр 28, 2007 11:39 am, всего редактировалось 1 раз.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
PetroW
Начинающий
Сообщения: 23
Зарегистрирован: Вс янв 21, 2007 12:30 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);
Ничто так не портит цель, как - попадание!!!
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Есть одна бяка. Точнее две.

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

А вот WX не полностью рабочий, увы. Да, ты можешь давать команды ml и видеть, как изменяются координаты. Но, точки мобов на карте НЕ двигаются! Чего-то не хватает.
Ага, даже не так. Если ты двигаешься САМ, то карта обновляется, а если только объекты на карте - то нет. ((
Последний раз редактировалось piroJOKE Сб апр 28, 2007 12:20 pm, всего редактировалось 1 раз.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение 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.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
PetroW
Начинающий
Сообщения: 23
Зарегистрирован: Вс янв 21, 2007 12:30 am
Откуда: Бобруйск

Сообщение PetroW »

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

А на форум OpenKore можете отписать сами? :oops:
Ничто так не портит цель, как - попадание!!!
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Во, я на ломаном английском состряпал тему: http://forums.openkore.com/viewtopic.php?t=29974
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
PetroW
Начинающий
Сообщения: 23
Зарегистрирован: Вс янв 21, 2007 12:30 am
Откуда: Бобруйск

Сообщение PetroW »

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

Сообщение 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:
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

ЫЫ. Новый???? Блин, нужно одного товарисча помучать на щёт сервака, или даже может в клиенте порытся. 100% что на все 100% мы пакеты не знаем!
Ответить