Reconnect

Версия Minecraft
1.7+
Сразу говорю, новичек. Подскажите пожалуйста, как при отключении от сервера, сделать автозаход на него. (несколько раз, что бы после рестарта сервера смог пользователь зайти)

Java:
package com.example.examplemod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;

@Mod(modid = Reconnect.MODID, version = Reconnect.VERSION)
public class Reconnect
{
    public static final String MODID = "Reconnect";
    public static final String VERSION = "1.0";

    @SubscribeEvent
    public void onClientDisconnect(FMLNetworkEvent.ClientDisconnectionFromServerEvent event)
    {
         ?
    }
}
 
Последнее редактирование:
The constructor GuiConnecting(Reconnect, Minecraft, ServerData) is undefined

Java:
package com.example.examplemod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.GuiConnecting;
import net.minecraft.client.multiplayer.ServerData;

@Mod(modid = Reconnect.MODID, version = Reconnect.VERSION)
public class Reconnect
{
    public static final String MODID = "Reconnect";
    public static final String VERSION = "1.0";

    @SubscribeEvent
    public void onClientDisconnect(FMLNetworkEvent.ClientDisconnectionFromServerEvent event)
    {
        Minecraft.getMinecraft().displayGuiScreen(new GuiConnecting(this, Minecraft.getMinecraft(), new ServerData("ServerName", "IP")));
    }
}
 
Ну создай тогда класс который наследует GuiConnecting, к примеру:
Java:
public class GuiReconnect extends GuiConnecting {

   public GuiReconnect(GuiScreen guiScreen, Minecraft mc, ServerData serverData) {
      super(guiScreen, mc, serverData);
   }
}

И вместо этого Minecraft.getMinecraft().displayGuiScreen(new GuiConnecting(this, Minecraft.getMinecraft(), new ServerData("ServerName", "IP")));
Пишешь это
Minecraft.getMinecraft().displayGuiScreen(new GuiReconnect(this, Minecraft.getMinecraft(), new ServerData("ServerName", "IP")));
 
The constructor GuiReconnect(Reconnect, Minecraft, ServerData) is undefined
Предлагает поменять на
Java:
{
...
{
public GuiReconnect(Reconnect reconnect, Minecraft mc, ServerData
serverData)
{
super(reconnect, mc, serverData);
}
}
}
или
Java:
...
super(guiScreen, mc, serverData);
}

public GuiReconnect(Reconnect reconnect, Minecraft minecraft, ServerData
serverData) {
// TODO Auto-generated constructor stub
}
}


Так-же (20): public class GuiReconnect extends GuiConnecting
Link all references for a local rename (does not change references in other files)



Java:
package com.example.examplemod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.multiplayer.GuiConnecting;
import net.minecraft.client.multiplayer.ServerData;

@Mod(modid = Reconnect.MODID, version = Reconnect.VERSION)
public class Reconnect
{
    public static final String MODID = "Reconnect";
    public static final String VERSION = "1.0";

    @SubscribeEvent
    public void onClientDisconnect(FMLNetworkEvent.ClientDisconnectionFromServerEvent event)
    {
        Minecraft.getMinecraft().displayGuiScreen(new GuiReconnect(this, Minecraft.getMinecraft(), new ServerData("ServerName", "IP")));
    }
}

public class GuiReconnect extends GuiConnecting
{
    public GuiReconnect(GuiScreen guiScreen, Minecraft mc, ServerData serverData)
    {
        super(guiScreen, mc, serverData);
    }
}
 
Может язык учить все таки начать? Ты в конструктор this передаешь. this в данном случае - Reconnect, а конструктор требует GuiScreen.
@tox1cozZ Подскажите, как в итоге всё привести в рабочее состояние?
Ну не знаю я java, другое дело плюсы
 
Последнее редактирование:
На практике никак не реагирует при отключении от сервера или при принудительном отключении.
Как в java возможно создать таймер и проверку на сервере игрок или нет? Если сервер не работает (перезапуск), он попытался снова зайти на него

Java:
package com.example.examplemod;

import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData;

@Mod(modid = Reconnect.MODID, version = Reconnect.VERSION)
public class Reconnect
{
    public static final String MODID = "Reconnect";
    public static final String VERSION = "1.0";

    @SubscribeEvent
    public void onClientDisconnect(FMLNetworkEvent.ClientDisconnectionFromServerEvent event)
    {
        FMLClientHandler.instance().connectToServer(null, new ServerData("Сервер Minecraft", "159.69.136.213:4015"));
    }
}

Нашел что-то похожее на гитхабе ТЫК
 
Последнее редактирование:
Возможно, нужно
FMLClientHandler.instance().setupServerList();

Перед коннектом вызвать.
 
Да прикол в том что он вызывает повторный коннект сразу после кика, сервер то еще не запущен. По идее надо пытаться подключиться пока не будет успешно
 
Ну, есть как минимум 2 готовых мода на реконнект, плюс всякие кастомные лаунчеры с реконнектом. 🤔 Посмотреть от туда можно было давно и не пилить свои костыли с кучей вопросов "а почему я делаю, а оно не делается".
 
Сделал кнопку автоперезахода на проект(код с помощью миксинов и на 1.15.2):

Java:
package net.simpleclient.mixin;

import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.client.gui.screen.DisconnectedScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.text.Text;
import net.simpleclient.SimpleClient;
import net.simpleclient.tools.AutoReconnect;
import net.simpleclient.util.LastServerRememberer;

@Mixin(DisconnectedScreen.class)
public class DisconnectedScreenMixin extends Screen {
    private int autoReconnectTimer;

    private ButtonWidget autoReconnectButton;

    @Shadow
    @Final
    private Screen parent;

    @Shadow
    private int reasonHeight;

    private DisconnectedScreenMixin(SimpleClient simpleClient, Text text) {
        super(text);
    }

    @Inject(at = {@At("TAIL")}, method = {"init()V"})
    private void onInit(CallbackInfo ci) {
        if (!SimpleClient.INSTANCE.isEnabled()) {
            return;
        }

        int backButtonX = width / 2 - 100;
        int backButtonY = Math.min(height / 2 + reasonHeight / 2 + 9, height - 30);

        addButton(new ButtonWidget(backButtonX, backButtonY + 24, 200, 20, "Reconnect", b ->LastServerRememberer.reconnect(parent)));

        autoReconnectButton =addButton(new ButtonWidget(backButtonX, backButtonY + 48, 200, 20, "AutoReconnect", b -> pressAutoReconnect()));

        if (SimpleClient.INSTANCE.getTools().autoReconnect.isEnabled()) {
            autoReconnectTimer = 200;
        }
    }

    private void pressAutoReconnect() {
        AutoReconnect autoReconnect = SimpleClient.INSTANCE.getToold().autoReconnect;

        autoReconnect.setEnabled(!autoReconnect.isEnabled());

        if (autoReconnect.isEnabled()) {
            autoReconnectTimer = 200;
        }
    }

    @Override
    public void tick() {
        AutoReconnect autoReconnect = SimpleClient.INSTANCE.getTools().autoReconnect;

        if (!autoReconnect.isEnabled()) {
            autoReconnectButton.setMessage("AutoReconnect");
            return;
        }

        autoReconnectButton.setMessage("AutoReconnect (" + (int) Math.ceil(autoReconnectTimer / 20.0) + ")");

        if (autoReconnectTimer > 0) {
            autoReconnectTimer--;
            return;
        }

        LastServerRememberer.reconnect(parent);
    }
}
 
Кто может написать вышеуказанное? Не нужны даже кнопки, необходимо просто автоконект на определенный сервер, после его рестарта или временного отключения интернета. Бесплатно было бы круто, но если нет, то готов символическую сумму заплатить.
 
Назад
Сверху