Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Отвергнутые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=50)
-   -   [FIX] SMSG_ATTACKSTOP (http://mangos.ytdb.ru/showthread.php?t=3814)

Lordronn 27.02.2011 16:40

[FIX] SMSG_ATTACKSTOP
 
Стало интересно, что же это за неизвестные 4 байта. Копая снифф я заметил, что значение колеблется в зависимости от типа таргета(victim - а) Если victim == player - 1, а если unit или pet - 0

Код:

--- /src/game/Unit.cpp        Thu Feb 24 12:31:30 2011
+++ /src/game/Unit.cpp        Sun Feb 27 16:36:36 2011
@@ -2855,7 +2855,7 @@
    WorldPacket data( SMSG_ATTACKSTOP, (4+16) );            // we guess size
    data << GetPackGUID();
    data << victim->GetPackGUID();                          // can be 0x00...
-    data << uint32(0);                                      // can be 0x1
+    data << uint32(victim->GetTypeId()==TYPEID_PLAYER ? 1 : 0); // victim is player
    SendMessageToSet(&data, true);
    DETAIL_FILTER_LOG(LOG_FILTER_COMBAT, "%s %u stopped attacking %s %u", (GetTypeId()==TYPEID_PLAYER ? "player" : "creature"), GetGUIDLow(), (victim->GetTypeId()==TYPEID_PLAYER ? "player" : "creature"),victim->GetGUIDLow());


zergtmn 27.02.2011 17:59

Почему 4 байта, а не 1? В некоторых других пакетах bool передается в 1 байте.

Lordronn 27.02.2011 18:11

Также в некоторых пакетах почему-то булл идет в 4 байта. В коде мангоса и тринити отправляются 4 байта, в парсере своем тоже читаю 4 байта и все нормально - не крашит.

zergtmn 27.02.2011 18:14

Предположение не верно.

Код:

S->C: SMSG_ATTACKSTOP (0x144), Size: 20, Timestamp: 2010-09-17 07:29:06
-----------------------------------------------------------------------------
GUID: { 0xF13000747010EBCE, Type: Creature, Entry: 29808, Counter: 1108942 }
Victim GUID: { 0xF13000746110E54D, Type: Creature, Entry: 29793, Counter: 1107277 }
Unknown (dword): 1


Lordronn 27.02.2011 18:27

Код:

Attacker: GUID (High: Unit Entry: 48029, Counter: 986876)
Target: GUID (High: Player Entry: 0, Counter: 47358415)
Target is player: true

Код:

Attacker: GUID (High: Player Entry: 0, Counter: 47358415)
Target: GUID (High: Unit Entry: 48029, Counter: 986876)
Target is player: false

Код:

Attacker: GUID (High: Unit Entry: 48029, Counter: 987159)
Target: GUID (High: Player Entry: 0, Counter: 47358415)
Target is player: true

Код:

Attacker: GUID (High: Unit Entry: 48267, Counter: 983783)
Target: GUID (High: Player Entry: 0, Counter: 51678088)
Target is player: true

Хотя возможно это просто случайность)

TOM_RUS 27.02.2011 18:58

Судя по коду в клиенте, этот параметр как-то влияет на позицию/ориентацию юнитов относительно друг друга, если ида все правильно декомпилировала, то значения могут быть только 0 или 1.

SeT 01.04.2015 03:28

Если установить 1 то моб будет стараться "смотреть" в сторону цели, даже если цель убита.

На оффе используется довольно часто, но смысл и как это можно использовать (особенно когда цель игрок) понять не могу.

virusav 01.04.2015 09:45

Может, установка параметра в 1 решит проблему https://github.com/cmangos/issues/issues/590 ?
Там как раз нпц не хватает ориентации на игрока при наложении на него ауры.

RomanRom2 01.04.2015 15:13

раз уж мы некропостим, то у меня вот так:
Код:

function msgBuild(var Buf: TBuffer; var m: T_SMSG_ATTACKSTOP): longint; overload;
begin
  pkt.InitCmd      (Buf, SMSG_ATTACKSTOP);
  pkt.AddGUID      (Buf, m.AttackerGUID);
  pkt.AddGUID      (Buf, m.TargetGUID);
  pkt.AddLong      (Buf, m.Following);
  result:= pkt.pktLen;
end;

это от классика 1.12
вообще булеан у близзов мнооооого где передается в виде инта, а мнооооого где в виде байта. это нормально. просто одну фичу делала одна команда программистов (которая не экономит трафик), другую - другая (которая экономит).

SeT 01.04.2015 17:15

Цитата:

Сообщение от virusav (Сообщение 33872)
Может, установка параметра в 1 решит проблему https://github.com/cmangos/issues/issues/590 ?
Там как раз нпц не хватает ориентации на игрока при наложении на него ауры.

Я не помню такой проблемы на TC, там тоже всегда шлется 0.
Цитата:

Сообщение от RomanRom2 (Сообщение 33874)
раз уж мы некропостим, то у меня вот так:
Код:

function msgBuild(var Buf: TBuffer; var m: T_SMSG_ATTACKSTOP): longint; overload;
begin
  pkt.InitCmd      (Buf, SMSG_ATTACKSTOP);
  pkt.AddGUID      (Buf, m.AttackerGUID);
  pkt.AddGUID      (Buf, m.TargetGUID);
  pkt.AddLong      (Buf, m.Following);
  result:= pkt.pktLen;
end;

это от классика 1.12
вообще булеан у близзов мнооооого где передается в виде инта, а мнооооого где в виде байта. это нормально. просто одну фичу делала одна команда программистов (которая не экономит трафик), другую - другая (которая экономит).

И при каких случаях вы шлете 1? ) Я не могу вспомнить случаев, когда после остановки атаки цели нужно продолжать держать ориентацию на цель. Если еще можно что то придумать у существ в скриптах, то зачем это надо делать для игроков, ума не представляю.

Amaru 01.04.2015 23:33

Цитата:

Сообщение от SeT (Сообщение 33876)
Я не помню такой проблемы на TC, там тоже всегда шлется 0.


И при каких случаях вы шлете 1? ) Я не могу вспомнить случаев, когда после остановки атаки цели нужно продолжать держать ориентацию на цель. Если еще можно что то придумать у существ в скриптах, то зачем это надо делать для игроков, ума не представляю.

Некоторые мобы, когда добивают игрока, некоторое время все еще смотрят на него, а потом продолжают делать свои дела - переключаются на другую цель, или убегают на точку спавна

RomanRom2 03.04.2015 20:51

это скорее всего какие то нетипичные сценарии. в основном конечно посылается ноль. просто был вопрос про "неизвестное" поле following, я рассказал. это действительно и было открыто/выяснено мной лично в свое время: сначала я анализировал сниффы на предмет, какие значения бывают. затем экспериментировал на сандбоксе, подставляя эти значения и смотрел как ведет себя клиент. по другому не умею.

MaS0n 04.04.2015 02:12

Это не нетипичные сценарии, этот параметр называется NowDead. 1 шлется в том случае, если атака была остановлена по причине смерти цели. И да, это отвечает за facing нападавшего относительно виктима. Почему uint32 в классике и до каты? Возможно дело не только в команде программистов, на альфе была другая боевая система, возможно здесь предполагалась причина (reason) остановки атаки и делать какие-то действия нападающим в зависимости от переданного значения. Систему переделали, отказались от фичи, а пакет остался.

SeT 04.04.2015 02:42

Цитата:

Сообщение от MaS0n (Сообщение 33883)
Это не нетипичные сценарии, этот параметр называется NowDead. 1 шлется в том случае, если атака была остановлена по причине смерти цели. И да, это отвечает за facing нападавшего относительно виктима. Почему uint32 в классике и до каты? Возможно дело не только в команде программистов, на альфе была другая боевая система, возможно здесь предполагалась причина (reason) остановки атаки и делать какие-то действия нападающим в зависимости от переданного значения. Систему переделали, отказались от фичи, а пакет остался.

Так называется параметр у ТС в 6.х. Они взяли это имя с клиента?
Все равно дурацкая система выходит, сначала посылается true, а потом еще надо послать false, чтобы клиент перестал смотреть на цель...

RomanRom2 04.04.2015 11:19

во, точно, по причине смерти цели. я стал забывать всё... печально...
спасибо за подробный ответ. да, назавания полей у меня порой самовыдуманные, как и у всех остальных наверное. каким образом узнали название NowDead? были какие то билды с дебаг инфой?

MaS0n 04.04.2015 12:16

https://www.ownedcore.com/forums/wor...ml#post3159112

TOM_RUS же упоминал, дебаг клиент MacOS x64. Есть и 4.1.0 тоже где-то же в этой теме

Этот пакет не менялся, поэтому название параметра в нем с тех далеких времен.

PS:
Ну и из альфа-дебаг клиента

Цитата:

void __thiscall CGUnit_C::OnAttackStop(CGUnit_C *this, unsigned __int64 previousTarget, int nowDead)

RomanRom2 04.04.2015 20:20

ок, спасибо.
у себя я еще не дошел, что бы эти нюансы реализовывать. помню что разбирал, а сделать не сделал еще.


Текущее время: 20:31. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS