Проблемы с пакетами

Версия Minecraft
1.19.4
API
Forge
12
0
Ситуация такая: я в программировании модов вообще не разбираюсь, но мне понадобилось разработать пару небольших модов. Я сел их делать в MCreator, у меня даже по большей части получалось. Все эти моды были мне нужны для взаимодействии с ботом, написанном на питоне. И вот я столкнулся с проблемой - бот отказывается подключаться к серверу, на котором есть мод созданный с помощью MCreator. Возвращает RuntimeError: Minecraft server reply with code 400. Попробовал на полностью пустом моде - отказывается. Сделал пустой мод на джаве - подключился. Начал разбираться в чем проблема, запустил мод из MCreator на джаве и нашел конкретные несколько строчек, убрав которые все заработает. Но проблема в том, что в том моде, что я уже сделал, просто так удалить эти строчки нельзя, они, как я понял, используются каким-то образом при работе с глобальными переменными.
Вот эти строчки, в которых проблема:
private static final String PROTOCOL_VERSION = "1";
    public static final SimpleChannel PACKET_HANDLER = NetworkRegistry.newSimpleChannel(new ResourceLocation(MODID, MODID), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals);
    private static int messageID = 0;

    public static <T> void addNetworkMessage(Class<T> messageType, BiConsumer<T, FriendlyByteBuf> encoder, Function<FriendlyByteBuf, T> decoder, BiConsumer<T, Supplier<NetworkEvent.Context>> messageConsumer) {
        PACKET_HANDLER.registerMessage(messageID, messageType, encoder, decoder, messageConsumer);
        messageID++;
    }
Вот тут переменная PACKET_HANDLER используется. В других местах, где она используется пишется, что эта часть кода нигде не используется, значит я ее, в теории, могу просто удалить, но эта часть кода используется в 3 местах и все эти места связанны с глобальными переменными:
        public void syncData(LevelAccessor world) {
            this.setDirty();
            if (world instanceof Level && !world.isClientSide())
                PlayerSpectatorMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new SavedDataSyncMessage(0, this));
        }

В момент, когда бот пытается подключиться, но не может, в консоли написано:
Java:
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'fml:loginwrapper' : Vanilla acceptance test: ACCEPTED
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'forge:tier_sorting' : Vanilla acceptance test: ACCEPTED
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'fml:handshake' : Vanilla acceptance test: ACCEPTED
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'player_spectator:player_spectator' : Vanilla acceptance test: REJECTED
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'minecraft:unregister' : Vanilla acceptance test: ACCEPTED
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'fml:play' : Vanilla acceptance test: ACCEPTED
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'minecraft:register' : Vanilla acceptance test: ACCEPTED
[00:48:48] [Netty Server IO #3/DEBUG] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channel 'forge:split' : Vanilla acceptance test: ACCEPTED
[00:48:48] [Netty Server IO #3/ERROR] [ne.mi.ne.NetworkRegistry/NETREGISTRY]: Channels [player_spectator:player_spectator] rejected vanilla connections
[00:48:48] [Netty Server IO #3/INFO] [ne.mi.se.ServerLifecycleHooks/SERVERHOOKS]: Disconnecting VANILLA connection attempt: This server has mods that require Forge to be installed on the client. Contact your server admin for more details.


Можете подсказать что не так с этой частью кода, как ее можно изменить, чтобы бот смог подключиться к серверу?
 
12
0
@_SupCM_, я изначально тоже так подумал, поэтому я создал сборку, закидал туда штук 5 рандомных модов и бот подключился без проблем. На всякий случай уточню: бота я запускаю со своего же компа с проекта из PyCharma, то есть он каким-то образом получает доступ ко всем модам и Форджу, по всей видимости. Бот так же подключался на сборку с Фабриком
 
12
0
код для общения с ботом?
А что конкретно показать? Код бота? Там его дохрена. Код, который я писал? Там ничего особенного. Напрямую я к боту не обращаюсь, только беру его ник и добавляю в глобальную переменную
 
12
0
@_SupCM_ Я понимаю, я тоже логи почитал. Но я без понятия чего ему не хватает. В инструкции к боту ничего не сказано про установку каких-либо дополнительных модов или форджа в какое-то особенное место. Нужно просто сделать сборку модов, на фордже или фабрике, открыть сейв для сети, указать порт в коде бота и просто запустить. И до этого он работал без проблем, все подключалось. У меня изначально стояла небольшая сборка вспомогательных модов на фабрике, потом я перешел на фордж и начал делать свой мод и вот конкретно с ним возникли проблемы
 
12
0
@russia_nekto справедливо. Ну код частично я скидывал выше. Вот эта функция
public void syncData(LevelAccessor world)
Используется тут:
Эту функцию я вызываю из команды и передаю сюда игрока:
public class LookingplayerProcedure {
    public static void execute(LevelAccessor world, double x, double y, double z, CommandContext<CommandSourceStack> arguments, Entity entity) {
        if (entity == null)
            return;
        PlayerSpectatorModVariables.MapVariables.get(world).Player_name = (new Object() {
            public Entity getEntity() {
                try {
                    return EntityArgument.getEntity(arguments, "player");
                } catch (CommandSyntaxException e) {
                    e.printStackTrace();
                    return null;
                }
            }
        }.getEntity()).getDisplayName().getString();
        PlayerSpectatorModVariables.MapVariables.get(world).syncData(world);
        if (!world.isClientSide() && world.getServer() != null)
            world.getServer().getPlayerList().broadcastSystemMessage(Component.literal(("\u0421\u043E\u0432\u043F\u0430\u043B\u043E " + PlayerSpectatorModVariables.MapVariables.get(world).Player_name)), false);
        OpeninventoryProcedure.execute(world, x, y, z, entity);
        Openinventory2Procedure.execute(world, entity);
    }
}
Код в креаторе
1712258711257.png
Это вторая функция, я хотел сделать что-то вроде аналога "подождать одну секунду". Каждый тик прибавлял к переменной 1, а при 20 выполнял какую-то функцию. Но она себя пока что не очень зарекомендовала, так что я ее считай отключил:
public class TemerrefresherProcedure {
    public static void execute(LevelAccessor world) {
        PlayerSpectatorModVariables.MapVariables.get(world).GTimer = PlayerSpectatorModVariables.MapVariables.get(world).GTimer + 1;
        PlayerSpectatorModVariables.MapVariables.get(world).syncData(world);
        if (!world.isClientSide() && world.getServer() != null)
            world.getServer().getPlayerList().broadcastSystemMessage(Component.literal(("Message " + PlayerSpectatorModVariables.MapVariables.get(world).GTimer)), false);
    }
}
1712258867356.png

Это те места, где используются те самые пакеты, из-за которых бот не может подключиться
 
бот отказывается подключаться к серверу, на котором есть мод созданный с помощью MCreator. Возвращает RuntimeError: Minecraft server reply with code 400.
Это ключевое верно?
Ты все таки с внешнего сервера бота подключаешься к серверу Forge?
 
12
0
Это ключевое верно?
Да, бот не хочет заходить, в шапке указал конкретно часть кода с которой проблемы
с внешнего сервера
Я запускаю прогу из которой бот подключается к моему серверу. Сервер это я просто открыл мир для локальной сети
 
В момент, когда бот пытается подключиться, но не может, в консоли написано:
в консоли Forge ? или бота?
те надо бы уточнить.
У тебя косяк, ты пытыаешься дать мало инфы и получит точный ответ.
Если логи, то давай весь файл и т.п.
 
12
0
ты пытыаешься дать мало инфы
Да я просто понять не могу, что может быть полезно, а что нет. Или например про логи, я не знаю где их найти, чтобы скинуть

в консоли Forge ? или бота?
Ошибка входа пишется в консоли бота
Самый последний иф возвращает ошибку 400:
    def check_process(self):
        if self.mc_instance and not self.mc_instance.is_running:
            # if self.mc_instance:
            #     self.mc_instance.check_process()
            #     if not self.mc_instance.is_running:
            print("Starting Minecraft server")
            self.mc_instance.run()
            self.mc_port = self.mc_instance.port
            self.reset_options["port"] = self.mc_instance.port
            print(f"Server started on port {self.reset_options['port']}")
        retry = 0
        while not self.mineflayer.is_running:
            print("Mineflayer process has exited, restarting")
            self.mineflayer.run()
            if not self.mineflayer.is_running:
                if retry > 3:
                    raise RuntimeError("Mineflayer process failed to start")
                else:
                    continue
            print(self.mineflayer.ready_line)
            res = requests.post(
                f"{self.server}/start",
                json=self.reset_options,
                timeout=self.request_timeout,
            )
            if res.status_code != 200:
                self.mineflayer.stop()
                raise RuntimeError(
                    f"Minecraft server reply with code {res.status_code}"
                )
            return res.json()

А вот у бота нашел логи
Код:
2024-04-05 11:08:12,226 - mineflayer - INFO - Subprocess is ready.
2024-04-05 11:08:12,260 - mineflayer - INFO - {
2024-04-05 11:08:12,261 - mineflayer - INFO - port: 5555,
2024-04-05 11:08:12,261 - mineflayer - INFO - reset: 'hard',
2024-04-05 11:08:12,261 - mineflayer - INFO - inventory: {},
2024-04-05 11:08:12,261 - mineflayer - INFO - equipment: [],
2024-04-05 11:08:12,261 - mineflayer - INFO - spread: false,
2024-04-05 11:08:12,261 - mineflayer - INFO - waitTicks: 20,
2024-04-05 11:08:12,261 - mineflayer - INFO - position: null
2024-04-05 11:08:12,261 - mineflayer - INFO - }
2024-04-05 11:08:13,132 - mineflayer - INFO - Error: read ECONNRESET
2024-04-05 11:08:13,133 - mineflayer - INFO - at TCP.onStreamRead (node:internal/stream_base_commons:217:20) {
2024-04-05 11:08:13,133 - mineflayer - INFO - errno: -4077,
2024-04-05 11:08:13,133 - mineflayer - INFO - code: 'ECONNRESET',
2024-04-05 11:08:13,133 - mineflayer - INFO - syscall: 'read'
2024-04-05 11:08:13,133 - mineflayer - INFO - }
2024-04-05 11:08:13,133 - mineflayer - INFO - Error: read ECONNRESET
2024-04-05 11:08:13,133 - mineflayer - INFO - at TCP.onStreamRead (node:internal/stream_base_commons:217:20) {
2024-04-05 11:08:13,133 - mineflayer - INFO - errno: -4077,
2024-04-05 11:08:13,133 - mineflayer - INFO - code: 'ECONNRESET',
2024-04-05 11:08:13,133 - mineflayer - INFO - syscall: 'read'
2024-04-05 11:08:13,133 - mineflayer - INFO - }
2024-04-05 11:08:13,150 - mineflayer - INFO - Stopping subprocess.
 
12
0
Но общаться с ботом ты не сможешь.
А что значит общаться? В своем моде я беру данные бота как от игрока. Данные боту планирую передавать просто через текстовый файл.

Я не очень понял что ты скинул по ссылке, можешь немного подробнее рассказать что это и как с этим работать? Вроде как это плагин на сервер, но я просто открываю мир для сети, подойдет ли мне это. Как его устанавливать? Там вроде есть команда (npm install minecraft-protocol-forge) и куда мне ее списывать? В cmd или где-то на сервере? В общем сложно...
 
87
4
11
А что значит общаться? В своем моде я беру данные бота как от игрока. Данные боту планирую передавать просто через текстовый файл.
Это значит то, что бот не сможет обрабатывать или отправлять модовые пакеты
Я не очень понял что ты скинул по ссылке, можешь немного подробнее рассказать что это и как с этим работать?
Там прикол в том, что ты используешь веб-сокеты для связи Python и JS(бот по факту работает на JS). Это плагин на JS и как тебе его подключить к Python я понятия не имею((
 
Сверху