РЕШЕНО Player disconnecting: SimpleFlare.CalculateLights

Хостинг игровых серверов

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
Здравствуйте.

"Баг" стар как мир, обсуждался на oxidemod`е но вариантов возникновения и решения проблемы я так и не нашел.

Может здесь что подскажут.

Суть "бага", когда игрок убивает NPC поражденного через BotSpawn его выкидывает с нижеописанной ошибкой.

Код:
(00:15:56) | ***.***.***.***:51377/76************/Player disconnecting: NullReferenceException: Object reference not set to an instance of an object
SimpleFlare.CalculateLights () (at <9d2777c134424ee9a777345d06f47c53>:0)
SimpleFlare.Update () (at <9d2777c134424ee9a777345d06f47c53>:0)

Version: 30829

Куда копать?

Притом я сам не смог воспроизвести баг, хотя у вылетевшего спрашивал из чего стрелял, во что был одет.
 
Последнее редактирование:

Night_Tiger

Прохожий
27 Янв 2018
280
66
Ума не приложу причем тут боты и сей код...
upload_2018-12-20_21-22-16.png
это же похоже на свет толи фонаря толи чегото подобного, единственное оно юзает players а т.к ботов сует в актив лист может поэтому?
 

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
@Night_Tiger, все возможно.
Но у меня NPC без фонарей, даже их стандартные одежды я убираю к ним в основной инвентарь ( если даже предположить что "глаза" зомби это фонарь ).
А причем тут то что HTNPlayer вываливается в activePlayerList?
 

Night_Tiger

Прохожий
27 Янв 2018
280
66
@Night_Tiger, все возможно.
Но у меня NPC без фонарей, даже их стандартные одежды я убираю к ним в основной инвентарь ( если даже предположить что "глаза" зомби это фонарь ).
А причем тут то что HTNPlayer вываливается в activePlayerList?
про ошибку фонаря мож какаят обработка именно в том что ты на бота светиш им? а при смерти у бот спауна помница труп спаунило вручную

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

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
про ошибку фонаря мож какаят обработка именно в том что ты на бота светиш им? а при смерти у бот спауна помница труп спаунило вручную

а про плеерлист я подумал если боты с ботспауна тоже вываливаюц в него, а в этом симплфлеере список зачемто используец то может это влиять?
@Night_Tiger, нет боты с BotSpawn в activePlayerList замечены не были)

Что меня больше всего смущает я нигде не могу найти метода CalculateLights в котором возникает ошибка.
 

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
Выяснил что проблема не в плагине BotSpawn.

Если NPCMureder спавнить через ( редактируя только здоровье )
Код:
+halloween.enabled true
+halloween.murdererpopulation 5

Все равно проявляется ошибка.
 

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
@Night_Tiger, мы смотрели не туда :)

Ошибка происходит не со стороны сервера, а со стороны клиента.

Это кусок кода из Assembly-CSharp но со стороны клиента.
 

Вложения

  • 2018-12-25 23_27_22-dnSpy v5.0.12 (x64, Администратор).png
    2018-12-25 23_27_22-dnSpy v5.0.12 (x64, Администратор).png
    58 KB · Просмотры: 20

Night_Tiger

Прохожий
27 Янв 2018
280
66
Всетаки фонарик виноват) на шапке минера, только в чем дело, на хелоуин и на офе врубали мурдер ботов.
 

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
Всетаки фонарик виноват) на шапке минера, только в чем дело, на хелоуин и на офе врубали мурдер ботов.
Не совсем фонарик.
Ночь виновата.

2019-01-06 03_01_11-dnSpy v5.0.12 (x64, Администратор).png

CalculateLights запускается когда num4 < 0.2. А меньше 0.2 она становится ночью.

Заметил что не только игроки в шапке подвержены данному багу, т.е. получается что в какой то момент времени в NULL переходит либо позиция глаз, либо позиция SimpleFlare.
Код:
Mathf.InverseLerp(2f, 6f, Vector3.Distance(base.transform.position, basePlayer.eyes.position));
Подозреваю что все таки позиция глаз, т.к. выкидывает игрока при смерти зомби у которого глаза "пропадают" из-за его неожиданной кончины.

Но при этом разработчики, уверены что они всегда есть :)
Т.к. проверок на Null нет.

И опять же, не известно что в массиве players этого класса, есть ли там зомби?
 
Последнее редактирование:

Night_Tiger

Прохожий
27 Янв 2018
280
66
Не совсем фонарик.
Ночь виновата.

Посмотреть вложение 3013

CalculateLights запускается когда num4 < 0.2. А меньше 0.2 она становится ночью.

Заметил что не только игроки в шапке подвержены данному багу, т.е. получается что в какой то момент времени в NULL переходит либо позиция глаз, либо позиция SimpleFlare.
Код:
Mathf.InverseLerp(2f, 6f, Vector3.Distance(base.transform.position, basePlayer.eyes.position));
Подозреваю что все таки позиция глаз, т.к. выкидывает игрока при смерти зомби у которого глаза "пропадают" из-за его неожиданной кончины.

Но при этом разработчики, уверены что они всегда есть :)
Т.к. проверок на Null нет.

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

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
глубокий анализ провел, тут получаец либо разрабам отписывать о косяке чтоб фиксили либо волку писать чтоб добавили это в оксид либо самому модить дллку.. или если есть возможность плагином
А Wulf то тут причем?

Проблема на стороне клиента, а uMod патчит только dll`ку сервера ( и я могу патчить только dll`ку ) сервера.

Это нужно разрабам писать, но идеале попытаться воспроизвести глюк на чистом Rust`е без uMod`а, т.к. я не исключаю что uMod может как ломать все это дело.

Ибо баг вообще очень странный.
 

Kaidoz

вышел покурить
Разработчик С#
Обитатель
Прохожий
4 Фев 2018
330
208
vk.com
А Wulf то тут причем?

Проблема на стороне клиента, а uMod патчит только dll`ку сервера ( и я могу патчить только dll`ку ) сервера.

Это нужно разрабам писать, но идеале попытаться воспроизвести глюк на чистом Rust`е без uMod`а, т.к. я не исключаю что uMod может как ломать все это дело.

Ибо баг вообще очень странный.
Можно добавить хук в функцию отвечающий за кик и не давать игроку вылететь с сервера. Как временное решение сойдет,пока не исправят.
 

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
@Kaidoz, думаешь все таки при дисконнекте игрок проходит метод BasePlayer.Kick()?

Ибо игрока выкидывает примерно с таким сообщением.

KnG0e3WgqzU.jpg
 
Последнее редактирование:

Kaidoz

вышел покурить
Разработчик С#
Обитатель
Прохожий
4 Фев 2018
330
208
vk.com
@Kaidoz, думаешь все таки при дисконнекте плеер проходит метод BasePlayer.Kick()?

Ибо игрока выкидывает примерно с таким сообщением.

Посмотреть вложение 3052
Сделай поиск по выбранным файлам(ядро) и введи в поиске "Disconnected:". Ну и найди функцию отвечающую за это. Если таких несколько будет, можно добавить рядом дебаг лог и написать сообщение к каждой из такой функций.
 

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
@Kaidoz,

Что-то мне подсказывает что все не так просто
Код:
  public void ReadDisconnectReason(Message packet)
  {
    string str1 = packet.get_read().String();
    string str2 = ((object) packet.connection).ToString();
    if (string.IsNullOrEmpty(str1) || string.IsNullOrEmpty(str2))
      return;
    DebugEx.Log((object) (str2 + " disconnecting: " + str1), (StackTraceLogType) 0);
  }

Код:
  public void OnNetworkMessage(Message packet)
  {
    Message.Type type = (Message.Type) packet.type;
    switch (type - 9)
    {
       .....
      case 5:
       .....
        using (TimeWarning.New("ReadDisconnectReason", 20L))
        {
          try
          {
            this.ReadDisconnectReason(packet);
          }
          catch (Exception ex)
          {
            this.Log(ex);
            ((Network.Server) Network.Net.sv).Kick((Connection) packet.connection, "Invalid Packet: Disconnect Reason");
          }
        }
        ((Connection) packet.connection).AddPacketsPerSecond((Message.Type) packet.type);
        break;
       .....
     }
  }

Получается клиент уже просто уведомляет сервер что он отключился с таким то Reason`ом. Т.е. особо на это никак не повлияешь, ибо выкидывает не сервер :(
 

Ryamkk

Прохожий
4 Июн 2018
873
354
27
Попробуй данный плагин:
 

Вложения

  • NPCFix.cs
    1.5 KB · Просмотры: 5

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
@Ryamkk, не понял твой плагин раз в 30 убивает всех NPC, причем здесь это?
 

ХУЙ228

Распиздяй
Прохожий
17 Дек 2017
707
196
@Ryamkk, нет. Тут проблема совсем в другом, NPC как бы это часть сервера, и отказываться от них как бы не очень хочется. Твой же плагин их всех убивает :)
Так что нет, не поможет.
 

Kaidoz

вышел покурить
Разработчик С#
Обитатель
Прохожий
4 Фев 2018
330
208
vk.com
@Kaidoz,

Что-то мне подсказывает что все не так просто
Код:
  public void ReadDisconnectReason(Message packet)
  {
    string str1 = packet.get_read().String();
    string str2 = ((object) packet.connection).ToString();
    if (string.IsNullOrEmpty(str1) || string.IsNullOrEmpty(str2))
      return;
    DebugEx.Log((object) (str2 + " disconnecting: " + str1), (StackTraceLogType) 0);
  }

Код:
  public void OnNetworkMessage(Message packet)
  {
    Message.Type type = (Message.Type) packet.type;
    switch (type - 9)
    {
       .....
      case 5:
       .....
        using (TimeWarning.New("ReadDisconnectReason", 20L))
        {
          try
          {
            this.ReadDisconnectReason(packet);
          }
          catch (Exception ex)
          {
            this.Log(ex);
            ((Network.Server) Network.Net.sv).Kick((Connection) packet.connection, "Invalid Packet: Disconnect Reason");
          }
        }
        ((Connection) packet.connection).AddPacketsPerSecond((Message.Type) packet.type);
        break;
       .....
     }
  }

Получается клиент уже просто уведомляет сервер что он отключился с таким то Reason`ом. Т.е. особо на это никак не повлияешь, ибо выкидывает не сервер :(
Ты вроде писал, что админов не кикает, а спамит кучами ошибками, то уже выходит, что на стороне сервера. Сейчас сам гляну.