1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Отправка ScoreBoard пакетов

Тема в разделе "Разработка плагинов для новичков", создана пользователем Phizzle, 19 июн 2020.

Метки:
Статус темы:
Закрыта.
  1. Автор темы
    Phizzle

    Phizzle Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    Привет всем, я пытаюсь отправить игроку/игрокам пакет PacketScoreBoardTeam (класс с и пытаюсь присвоить ему допустим префикс "§cABC", но выдает предупреждение ниже и следовательно не отправляет пакет. Тоже самое и с PacketPlayOutScoreboardTeam/PacketPlayOutScoreboardScore

    PHP:
    [06:25:16 WARN]: java.lang.IllegalArgumentExceptionCan not set net.minecraft.server.v1_15_R1.EnumChatFormat field net.minecraft.server.v1_15_R1.PacketPlayOutScoreboardTeam.g to java.lang.Integer
    [06:25:16 WARN]:        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    [
    06:25:16 WARN]:        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    [
    06:25:16 WARN]:        at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source)
    [
    06:25:16 WARN]:        at java.lang.reflect.Field.set(Unknown Source)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.utils.nms.ReflectionUtils.setFieldValue(ReflectionUtils.java:11)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.utils.nms.packet.PacketScoreBoardTeam.init(PacketScoreBoardTeam.java:39)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.utils.nms.packet.PacketScoreBoardTeam.init(PacketScoreBoardTeam.java:8)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.utils.nms.packet.PacketBase.sendPacket(PacketBase.java:22)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.utils.nms.packet.PacketContainer.lambda$sendPacket$0(PacketContainer.java:20)
    [
    06:25:16 WARN]:        at java.util.Arrays$ArrayList.forEach(Unknown Source)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.utils.nms.packet.PacketContainer.sendPacket(PacketContainer.java:20)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.scoreboard.PlayerTag.sendTo(PlayerTag.java:59)
    [
    06:25:16 WARN]:        at ru.phizzle.cwtags.spCommand.onCommand(spCommand.java:18)
    [
    06:25:16 WARN]:        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45)
    [
    06:25:16 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159)
    [
    06:25:16 WARN]:        at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:752)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1825)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1633)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:47)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:5)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:23)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.ba(MinecraftServer.java:1038)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:1031)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.sleepForTick(MinecraftServer.java:1015)
    [
    06:25:16 WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:938)
    [
    06:25:16 WARN]:        at java.lang.Thread.run(Unknown Source)

    Код:
    PHP:
    public class PacketScoreBoardTeam extends PacketBase<PacketPlayOutScoreboardTeam> {

        private 
    HTeam team;
        private 
    TeamAction teamAction;

        public 
    PacketScoreBoardTeam(HTeam teamTeamAction teamAction) {
            
    this.team team;
            
    this.teamAction teamAction;
        }

        public 
    void setTeamAction(TeamAction action) {
            
    this.teamAction action;
            
    init();
        }

        public 
    HTeam getTeam() {
            return 
    team;
        }

        public 
    void setTeam(HTeam team) {
            
    this.team team;
            
    init();
        }

        protected 
    PacketPlayOutScoreboardTeam init() {
            
    PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
            
    ReflectionUtils.setFieldValue(packet"a"team.getName());
            
    ReflectionUtils.setFieldValue(packet"e"team.getVisibility().getValue());

            
    ReflectionUtils.setFieldValue(packet"i"teamAction.getMode());
            
    ReflectionUtils.setFieldValue(packet"j"team.packOptionData());
            
    ReflectionUtils.setFieldValue(packet"g"0);

            
    ReflectionUtils.setFieldValue(packet"h"team.getPlayers());

            if (
    teamAction == TeamAction.CREATE || teamAction == TeamAction.UPDATE) {
                
    ReflectionUtils.setFieldValue(packet"b"team.getDisplayName());
                
    ReflectionUtils.setFieldValue(packet"c"team.getPrefix());
                
    ReflectionUtils.setFieldValue(packet"d"team.getSuffix());

                
    ReflectionUtils.setFieldValue(packet"f"team.getCollides().getValue());
            }
            return 
    packet;
        }
    }


    Отправка пакета:
    PHP:
        public void sendPacket(final Player playerHPacket... hPackets) {
            if (
    hPackets.length == 0) {
                return;
            }

            
    Arrays.asList(hPackets).forEach(packet -> packet.sendPacket(player));
        }
     
    Последнее редактирование: 19 июн 2020
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Есть же апи в ведре на это. Земля пухом :D
     
  3. SHADOWDAN

    SHADOWDAN Активный участник Пользователь

    Баллы:
    76
    Тип переменной PacketPlayOutScoreboardTeam#g net.minecraft.server.EnumChatFormat, а не int. Лучше просто используй PacketWrapper вместо собственных костылей
     
  4. Автор темы
    Phizzle

    Phizzle Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    не помогла замена 0 на EnumChatFormat.ЦВЕТ, а библиотеку мне не хотелось бы использовать(
     
  5. SHADOWDAN

    SHADOWDAN Активный участник Пользователь

    Баллы:
    76
    Ты уверен что ошибка не изменилась после того как ты изменил? Не понимаю в чём проблема использовать PacketWrapper.
     
  6. kefavova

    kefavova Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Afek
    Код:
    public class PacketScoreBoardTeam extends PacketBase<PacketPlayOutScoreboardTeam> {
    
        private HTeam team;
        private TeamAction teamAction;
        private Class<? extends Enum> typeEnumChatFormat;
    
        public PacketScoreBoardTeam(HTeam team, TeamAction teamAction) {
            this.team = team;
            this.teamAction = teamAction;
           
            try {
            String version = Bukkit.getServer().getClass().getPackage()
                       .getName().split("\\.")[3];
           typeEnumChatFormat = (Class<? extends Enum>) Class.forName(
                            "net.minecraft.server." + version + ".EnumChatFormat");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void setTeamAction(TeamAction action) {
            this.teamAction = action;
            init();
        }
    
        public HTeam getTeam() {
            return team;
        }
    
        public void setTeam(HTeam team) {
            this.team = team;
            init();
        }
    
        protected PacketPlayOutScoreboardTeam init() {
            PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
            ReflectionUtils.setFieldValue(packet, "a", team.getName());
            ReflectionUtils.setFieldValue(packet, "e", team.getVisibility().getValue());
    
            ReflectionUtils.setFieldValue(packet, "i", teamAction.getMode());
            ReflectionUtils.setFieldValue(packet, "j", team.packOptionData());
           Enum<?> colorEnum = Enum.valueOf(typeEnumChatFormat,
                                COLOR);
            ReflectionUtils.setFieldValue(packet, "g", colorEnum );
    
            ReflectionUtils.setFieldValue(packet, "h", team.getPlayers());
    
            if (teamAction == TeamAction.CREATE || teamAction == TeamAction.UPDATE) {
                ReflectionUtils.setFieldValue(packet, "b", team.getDisplayName());
                ReflectionUtils.setFieldValue(packet, "c", team.getPrefix());
                ReflectionUtils.setFieldValue(packet, "d", team.getSuffix());
    
                ReflectionUtils.setFieldValue(packet, "f", team.getCollides().getValue());
            }
            return packet;
        }
    }
    Не могу понять, зачем создавать велосипед, если есть ведро апи?
     
  7. Автор темы
    Phizzle

    Phizzle Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    Спасибо, посмотрю работоспособность кода, не используя я готовый апи т.к. с помощью пакета можно обойти регистрацию Team для каждой команды и игрока в принципе, и я по логике могу сделать на одном пакете сразу таб/тэги над игроком/борд справа
     
  8. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    С ведроапи все точно так же делается. И таб и борд. Чудной ты.
     
  9. Автор темы
    Phizzle

    Phizzle Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    Team требуется для тэгов над игроком, про таб и борд знаю
     
  10. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну это все часть сборборд апи, держу в курсе.
     
  11. Автор темы
    Phizzle

    Phizzle Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    хорошо, буду разбираться
     
Статус темы:
Закрыта.

Поделиться этой страницей