- 7,099
- 324
- 1,510
Рефакторил код одного мода, переписал пакеты на ElegantNetworking. Заметил, что в каждом пакете, отправляемым с сервера на клиент и работающем с игроком, есть проверка что игрок не отсутствует. Я пошел посмотреть код. При приеме на сервере игрок берется из NetHandlerPlayServer, а в нем он никогда не null. При приеме на клиенте было не очень прозрачно в коде, так что я сделал следующий тест:
Рассчет на то, что когда клиент ливает, из-за задержек сети на клиенте поле player обнулится раньше чем сервер перестанет отправлять пакеты вдогонку.
Запустил это на отдельном хосте.
Попробовал заходить и выходить на этот сервер - в логе клиента не было строк "TestPacket#onReceive minecraft.player==null".
Добавил в клиентскую сборку мод Proxy Server.
Попробовал заходить и выходить на сервер через прокси с 100 пингом - в логе клиента появились строки "TestPacket#onReceive minecraft.player==null".
Результаты этого эксперимента могут означать две вещи:
Вопрос лишь в том, могут ли существовать разумные кейсы логики модов, когда нужно обработать входящий пакет при отсутствующем игроке?
Java:
@ElegantPacket
public class TestPacket implements ServerToClientPacket {
final String payload;
public TestPacket(String payload) {
this.payload = payload;
}
@SideOnly(Side.CLIENT)
@Override
public void onReceive(Minecraft minecraft) {
if(minecraft.player==null)
System.out.println("TestPacket#onReceive minecraft.player==null");
}
}
Java:
public static final String payload = "Просто 300 рандомных символов";
@SideOnly(Side.SERVER)
@SubscribeEvent
public static void onPlayerTick(TickEvent.PlayerTickEvent event){
for (int i = 0; i < 10; i++)
new TestPacket(payload).sendToPlayer((EntityPlayerMP) event.player);
}
Запустил это на отдельном хосте.
Попробовал заходить и выходить на этот сервер - в логе клиента не было строк "TestPacket#onReceive minecraft.player==null".
Добавил в клиентскую сборку мод Proxy Server.
Попробовал заходить и выходить на сервер через прокси с 100 пингом - в логе клиента появились строки "TestPacket#onReceive minecraft.player==null".
Результаты этого эксперимента могут означать две вещи:
- Клиент реально может принять пакет от сервера после отключения
- Мод Proxy Server нарушает чистоту эксперимента и кейс возникает только с ним
Вопрос лишь в том, могут ли существовать разумные кейсы логики модов, когда нужно обработать входящий пакет при отсутствующем игроке?
Последнее редактирование: