Page 1 of 1

RunUO and Mondain's Legacy workaround.

Posted: 2006-05-10 12:12:31
by ziemni
Hi.

Since RunUO sends diffrent damage packets to clients above or equal to "4.0.7a" than old ones (which are causing Injection powered clients to hang), it is easy to avoid it by setting your client version to older one. Problem when your shard demands new client, but it's kind of workaround for most people.

From RunUO code:

Code: Select all

   public sealed class DamagePacketOld : Packet
   {
      public DamagePacketOld( Mobile m, int amount ) : base( 0xBF )
      {
         EnsureCapacity( 11 );

         m_Stream.Write( (short) 0x22 );
         m_Stream.Write( (byte) 1 );
         m_Stream.Write( (int) m.Serial );

         if ( amount > 255 )
            amount = 255;
         else if ( amount < 0 )
            amount = 0;

         m_Stream.Write( (byte)amount );
      }
   }

   public sealed class DamagePacket : Packet
   {
      public static readonly ClientVersion Version = new ClientVersion( "4.0.7a" );

      public DamagePacket( Mobile m, int amount ) : base( 0x0B, 7 )
      {
         m_Stream.Write( (int) m.Serial );

         if ( amount > 0xFFFF )
            amount = 0xFFFF;
         else if ( amount < 0 )
            amount = 0;

         m_Stream.Write( (ushort) amount );
      }

      /*public DamagePacket( Mobile m, int amount ) : base( 0xBF )
      {
         EnsureCapacity( 11 );

         m_Stream.Write( (short) 0x22 );
         m_Stream.Write( (byte) 1 );
         m_Stream.Write( (int) m.Serial );

         if ( amount > 255 )
            amount = 255;
         else if ( amount < 0 )
            amount = 0;

         m_Stream.Write( (byte)amount );
      }*/
   }



and

Code: Select all

            if ( amount > 0 && (ourState != null || theirState != null) )
            {
              Packet p = null;// = new DamagePacket( this, amount );

              if ( ourState != null )
              {
                bool newPacket = ( ourState.Version != null && ourState.Version >= DamagePacket.Version );

                if ( newPacket )
                  p = new DamagePacket( this, amount );
                else
                  p = new DamagePacketOld( this, amount );

                ourState.Send( p );
              }

              if ( theirState != null && theirState != ourState )
              {
                bool newPacket = ( theirState.Version != null && theirState.x >= DamagePacket.Version );

                if ( newPacket && ( p == null || !(p is DamagePacket) ) )
                  p = new DamagePacket( this, amount );
                else if ( !newPacket && ( p == null || !(p is DamagePacketOld) ) )
                  p = new DamagePacketOld( this, amount );
                        
                theirState.Send( p );
              }

Posted: 2006-05-16 11:29:30
by omi4
Исходники которые доступны умеют обрабатывать пакеты до 0xCC, текущая версия для меня тайна. Но то, что она не понимает пакеты 0xDC, 0xDD это точно. Вот и получаем краш.

Вот те пакеты что отсутствуют в доступной версии исходников…

Code: Select all

//-------------------------------------------------------------
/* 0xCD */ UMSG(0x02), // Unknown
/* 0xCE */ UMSG(0x02), // Unknown
/* 0xCF */ SMSGH("Account Login 2", 0x3e, handle_first_login),
         /* Login to the login server. At present, OSI really uses 0x80 packets,
         but this one absolutely identified to 0x80. */
/* 0xD0 */ BMSG("Configuration File", 0x02),
/* 0xD1 */ BMSG("Logout Status", 0x02),
/* 0xD2 */ UMSG(0x02), // Unknown
/* 0xD3 */ UMSG(0x02), // Unknown
/* 0xD4 */ BMSG("Book Header", SIZE_VARIABLE),
/* 0xD5 */ UMSG(0x02), // Unknown

/* 0xD6 */ BMSG("Batch Query Properties", SIZE_VARIABLE),
         /*
         D6 - Batch Query Properties
         Batch Query Properties (Client version)
         Client sends serials of items from 0x3C packet and server sends Object
         Properties packet as answer
         */

/* 0xD6 */ // BMSG("Object Properties", SIZE_VARIABLE),
         /*
         D6 - Object Properties
         Object Properties (Server version)
         */

/* 0xD7 */ BMSG("Generic Command", SIZE_VARIABLE),
/* 0xD8 */ BMSG("Design State Detailed", SIZE_VARIABLE),
/* 0xD9 */ BMSG("Hardware Info", SIZE_VARIABLE),
/* 0xDA */ BMSG("Mahjong Game Commands", SIZE_VARIABLE),
/* 0xDB */ UMSG(0x02), // Unknown
/* 0xDC */ BMSG("OPLInfo - since 4.0.5a client", SIZE_VARIABLE),
/* 0xDD */ BMSG("Generic Gump - since 5.0.0a client", SIZE_VARIABLE),
// --------------------------------------------------------------


Damage Packet влияет только на 4.0.7a client !! По идее можно на это забить. Без этого клиента жить можно.

Code: Select all

/* 0x0B */ UMSG(0x10a),
/* 0x0B */             
/* - Damage Packet : since 4.0.7a client !!
Damage Packet
0x7 bytes
byte   ID (0B)
dword   Serial
word   Amount of damage
*/


Есть еще один хитрый пакет 0xD3, в данный момент его ранка не использует. По причине отсутствия понимания его цели. Вот его описание.

http://kec.cz/tartaros/steamengine/uploads/Keirs%20packet%20guide/www.kairtech.com/uo/info/packetd3.htm

Posted: 2006-05-16 12:04:12
by Edred
Ты все здорово ему описал, только он, если ты не заметил, по-русски не понимает... :cry:

Posted: 2006-05-16 12:46:07
by omi4
Edred wrote:Ты все здорово ему описал, только он, если ты не заметил, по-русски не понимает... :cry:


Он переводчиком читает.

Может Yoko прочтет и поправит 3 строчки в 2х файлах. И будет у нас версия 505.19 которая хотя бы не падает на новых клиентах...

Posted: 2006-05-16 18:42:30
by Edred
ты имел в виду 605.16 наверное :wink:

Posted: 2006-05-16 20:23:51
by omi4
Edred wrote:ты имел в виду 605.16 наверное :wink:


последняя 505.18 вроде?

Posted: 2006-05-16 20:42:37
by SLAK
omi4 wrote:Последняя 505.18 вроде?

выпущенная 18 числа 05 месяца 2005 года... подумай откуда я это взял? :wink:

Posted: 2006-05-16 20:59:50
by omi4
SLAK wrote:
omi4 wrote:Последняя 505.18 вроде?

выпущенная 18 числа 05 месяца 2005 года... подумай откуда я это взял? :wink:


Не знаю где взял..
505.18 имет дату 11 июля 2005 г., 9:31:26

Posted: 2006-05-17 00:10:45
by Edred
omi4 wrote:Не знаю где взял..
505.18 имет дату 11 июля 2005 г., 9:31:26


Что означает только, что Йоко при компиляции забыл исправить номер версии... Стандартная "ошибка" программистов, сам совершал ее множество раз.

Posted: 2006-05-17 12:12:09
by omi4
Наоборот исправил. Вендор собрал 505.16 о чем сообщено в топе Update, но видимо рука дрогнула и он исправил на 605. Yoko вернул нумерацию на место.

Вендор поправил только момент соединения с сервером, клиенты 4.х.х немного по другому регистрируются на сервере и использовал новую библиотеку libexpat.dll. Просто старый expat скачать негде, да и незачем. Новая ДЛЛ похоже более устойчивая, хмл не терялся не разу после ее установки.

Posted: 2006-07-07 01:02:25
by forbmannn1
really?:)