Идея С сервера на сервер телепортом без "экрана земли"

Статус
Закрыто для дальнейших ответов.

Devel

Участник
Пользователь
Баллы
31
Имя в Minecraft
TBOYA_MAMKA
Категория плагина: BungeeCord

Предлагаемое название: пусть будет BungeeServerTeleport

Версия сервера: 1.8 - 1.12.x

Что я хочу: Чтобы на сервер можно было попасть по BungeeCord'у без "экрана земли", а как бы телепортом. Ну и чтобы при бане не было вот так: Kicked whilst... : You have been banned, а просто "телепортировало" в лобби и при попытке подключиться просто в чате бы писало то, что указано в конфиге.
Ну короче просто вместо "экрана земли" телепорт (это как на TeslaCraft) и кастомный текст неудачной попытки подключения к серверу.
И да, скиньте уже готовый .jar файл, а не код.

Идеи для команд: ну тут, например, чтобы попасть на какой-то сервер, необходимо было просто ввести определённую команду, указанную в конфиге; Например: скайварс - /sw.

Когда мне это нужно? Конечно, желательно поскорее =)
 
Последнее редактирование:
Это как бы нельзя реализовать, т.к., сервера разные, банджа просто на стороне сервера перекидывает игрока, чтоб игрок не перезаходил и не писал другой ip и заходил
 
Это как бы нельзя реализовать, т.к., сервера разные, банджа просто на стороне сервера перекидывает игрока, чтоб игрок не перезаходил и не писал другой ip и заходил
ну посмотри как на TeslaCraft
UPD: там всё на бандже
 
Последнее редактирование:
Банжи специально меняет dimensionId мира два раза, чтобы избежать ряда багов:
1. Чанки предыдущего мира не отгрузятся
2. С мобами и игроками тоже самое
3. Проблемы с табом
4. Не выполнится сборка мусора в клиенте

Если так хочется, то достаточно принудительно подменить dimensionId в Respawn-пакете на валидный

Возможные решения проблем:
1. Держать миры в одних и тех же координатах (чанки нового мира заменят чанки старого)
2. В момент смены сервера (до отправки пакета респавна) телепортировать игрока подальше от спавна
3. Отслеживать id'шники мобов/игроков, отсылаемых игроку и отправлять игроку пакеты их удаления при смене сервера (медленно для Банжи), либо предыдущий пункт выполнять непосредственно на сервере за один тик до телепорта (таким образом сервер сам и чанки клиенту отгрузит и мобов удалит)
 
Java:
package shitcode;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import net.md_5.bungee.UserConnection;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.packet.Respawn;

public class RespawnPacketInterceptor extends MessageToMessageEncoder<DefinedPacket> {
    private ProxiedPlayer p;

    public RespawnPacketInterceptor(ProxiedPlayer p) {
        this.p = p;
    }

    protected void encode(ChannelHandlerContext context, DefinedPacket packet, List<Object> list) throws Exception {
        if ((packet instanceof Respawn)) {
            Respawn respawn = (Respawn) packet;

            UserConnection con = (UserConnection) this.p;
            if (con.getDimension() != respawn.getDimension()) {
                respawn.setDimension(con.getDimension());
            }
        }
        list.add(packet);
    }
 
    public static void inject(ProxiedPlayer p) {
        try {
            Field f = p.getClass().getDeclaredField("ch");
            f.setAccessible(true);
            Object ch = f.get(p);
            Method method = ch.getClass().getDeclaredMethod("getHandle");
            Channel channel = (Channel) method.invoke(ch);
            channel.pipeline().addAfter("packet-encoder", "respawn_interceptor", new RespawnPacketInterceptor(p));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Java:
@EventHandler
public void onPostLogin(PostLoginEvent e)
{
      RespawnPacketInterceptor.inject(e.getPlayer());
}
 
Java:
package shitcode;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import net.md_5.bungee.UserConnection;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.packet.Respawn;

public class RespawnPacketInterceptor extends MessageToMessageEncoder<DefinedPacket> {
    private ProxiedPlayer p;

    public RespawnPacketInterceptor(ProxiedPlayer p) {
        this.p = p;
    }

    protected void encode(ChannelHandlerContext context, DefinedPacket packet, List<Object> list) throws Exception {
        if ((packet instanceof Respawn)) {
            Respawn respawn = (Respawn) packet;

            UserConnection con = (UserConnection) this.p;
            if (con.getDimension() != respawn.getDimension()) {
                respawn.setDimension(con.getDimension());
            }
        }
        list.add(packet);
    }
 
    public static void inject(ProxiedPlayer p) {
        try {
            Field f = p.getClass().getDeclaredField("ch");
            f.setAccessible(true);
            Object ch = f.get(p);
            Method method = ch.getClass().getDeclaredMethod("getHandle");
            Channel channel = (Channel) method.invoke(ch);
            channel.pipeline().addAfter("packet-encoder", "respawn_interceptor", new RespawnPacketInterceptor(p));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Java:
@EventHandler
public void onPostLogin(PostLoginEvent e)
{
      RespawnPacketInterceptor.inject(e.getPlayer());
}
куда Usage вставлять надо?
вроде плагин созан, а вроде и нет...
12:48:25 [WARNING] Error enabling plugin BungeeServerTeleport
java.lang.NoSuchMethodException: nomcraft.RespawnPacketInterceptor.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at net.md_5.bungee.api.plugin.PluginManager.enablePlugin(PluginManager.java:
305)
at net.md_5.bungee.api.plugin.PluginManager.loadPlugins(PluginManager.java:2
12)
at net.md_5.bungee.BungeeCord.start(BungeeCord.java:268)
at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:56)
at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15)
 
Последнее редактирование:
Учи джаву и учись правильно копировать код.
Без этого программистом не стать :D
Ну я как-бы в эклипс вставил код; package поменял; после вставил Usage.. Вроде ошибок нет, плагин создан, но не робит..
 
Ребят я решил проблему спасибо всем, кто писал по делу ;)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх