Использование NBT для кнопки

Версия Minecraft
1.7.10
769
1
42
Добрый день, у меня появилась затея сделать кнопку, которая работала бы как вкл и выкл. Мне нужна она, когда игрок одевает броню на себя.
Регистрирую кнопку:
Java:
public class CoreClientProxy extends CoreCommonProxy {
    
    @Override
   public void init(FMLInitializationEvent event) {
       super.init(event);
       this.registerKeyBoard();
   }
    
   public void registerKeyBoard () {
       FMLCommonHandler.instance().bus().register(new CoreKeyHandler());
   }
}
Java:
public class CoreKeyHandler {

   public static KeyBinding magnetizeKey = new KeyBinding("key.vh.magnetize", Keyboard.KEY_H, "category.vhfeatures");

   public CoreKeyHandler() {
      ClientRegistry.registerKeyBinding(magnetizeKey);
   }
}
Захожу в арморТик своей брони, вижу метод:
Java:
public class CoreMagnetArmor extends CoreElectricItem {
    @Override
    public void onArmorTick(World world, EntityPlayer player, ItemStack stack) {
        if (stack.getItem() != null) {
            if (this.getElectricityStored(stack) > 0.0F) { //просто написать isPressed не надо, это работает только если кнопка зажата
                this.magnetize(world, player, stack); //выполняет примагничивание
            }
        }
    }
}
Вопрос: как это можно реализовать? Простите за тупость
 
269
8
19
Ну можно так,В метод нажатие кнопки
public static boolean isOn = false;

Java:
    @SubscribeEvent
        public void key(KeyInputEvent event){
         if(CoreKeyHandler.magnetizeKey.isPressed()){
         //тут ещё можешь впилить проверку на то что надет фул сет и.т.д
                if(isOn == false) {
                  isOn = true;
                } else {
                  isOn = false;
                }
Если же тебе надо так чтоб допустим ты нажал кнопку (исходя из того что тебе нужно) магнитизм,то тогда это наверняка уже надо делать пакет что-то типа, включен выключен
 
Последнее редактирование:
269
8
19
Ну да, я думаю можно сделать пакета один off другой on и при нажатий.
ну и проверять nbt и активировать магнизитм
Java:
              if(isOn == false) {
                //отсылать пакет on который устанавливает nbt на то что магнитизм активен
                  isOn = true;

                } else {
       //отсылать пакет off который устанавливает nbt на то что магнитизм выключен.
                  isOn = false;

                }


При нажатии на кнопку отправляешь пакет на сервер, там в нбт брони пишешь булев. В армор тике достаешь этот булев и проверяешь если тру - магнитишь.
 
769
1
42
При нажатии на кнопку отправляешь пакет на сервер, там в нбт брони пишешь булев. В армор тике достаешь этот булев и проверяешь если тру - магнитишь.
Тэкс, нажимаю на кнопку, отправляется пакет:
Java:
@SubscribeEvent
   public void onKeyPress(KeyInputEvent event) {
       if (CoreKeyHandler.magnetizeKey.isPressed()) {
           ItemStack armor = this.mc.thePlayer.inventory.armorInventory[0];
           if (isOn == false && armor != null && armor.getItem() == CoreItems.Magnet_boots) {
             isOn = true;
             CoreNetworkChannel.network.sendToServer(new CorePacketMagnetize());
           } else {
             isOn = false;
           }
       }
   }
У меня с NBT проблемы, мне надо написать свою переменную, которая бы работала как вкл и выкл, я не понимаю как это реализовать.
Java:
public class CorePacketMagnetize extends CorePacketHandler {
    
    @Override
    public void client(EntityPlayer player) {
        ItemStack armor = player.inventory.armorInventory[0];
        World world = player.worldObj;
        player.addChatComponentMessage(new ChatComponentText("I'm here!"));
        if (armor != null && armor.getItem() == CoreItems.Magnet_boots) {
                if (armor.getTagCompound().getBoolean("isMagnetizeON")) {
                    armor.getTagCompound().setBoolean("isMagnetizeON", false);
                    CoreCommonProxy.sendPlayerMessage(player, StatCollector.translateToLocal("mess.magnetizeOFF"));
                } else {
                    armor.getTagCompound().setBoolean("isMagnetizeON", true);
                    ((CoreMagnetArmor) armor.getItem()).magnetize(world, player, armor);//магнитит
                    CoreCommonProxy.sendPlayerMessage(player, StatCollector.translateToLocal("mess.magnetizeON"));
                }
        }
        return;
    }
}
Java:
public class CoreServerPacketMagnetize extends CorePacketHandler {
    
     @Override
     public void server(EntityPlayerMP player) {
         CoreNetworkChannel.network.sendToServer(new CorePacketMagnetize());
     }
}
Java:
public class CorePacketHandler implements IMessage {

    public double setclass;
    
    public CorePacketHandler() {
        this.setclass = 0;
    }
    
    public CorePacketHandler(double setclass) {
        this.setclass = setclass;
    }
    
     public void client(EntityPlayer player) {}
     public void server(EntityPlayerMP player) {}
    
     @SideOnly(Side.CLIENT)
     private static EntityPlayer clientPlayer() {
         return Minecraft.getMinecraft().thePlayer;
     }
    
    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeDouble(setclass);
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        setclass = buf.readDouble();
    }
    
    public static class Handler implements IMessageHandler<CorePacketHandler, IMessage> {

        @Override
        public IMessage onMessage(CorePacketHandler message, MessageContext ctx) {
            if (ctx.side.isServer())
                message.server(ctx.getServerHandler().playerEntity);
            else
                message.client(clientPlayer());
            return null;
        }
    }// Делал по гайду Ивасика +/-
}
С NBT пробовал по гайду TaoGunner'a, но не совсем воткнул как вписать свою переменную в броню
Java:
public class CoreMagnetArmor extends CoreElectricItem {
    @Override
    public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) {
        if (!stack.hasTagCompound()) {
            stack.getTagCompound().setBoolean("tag", true);
            NBTTagCompound itemCompound = new NBTTagCompound();
            itemCompound.getInteger("isMagnetizeON");
            stack.getTagCompound().setTag(VacuumHorizon.MODID, itemCompound);
        }
    }
    
     @Override
    public void onArmorTick(World world, EntityPlayer player, ItemStack stack) {
        if (stack.getItem() != null) {
            if (this.getElectricityStored(stack) > 0.0F && stack.getTagCompound().getBoolean("isMagnetizeON") == true) {
                this.magnetize(world, player, stack);
            } else if (stack.getTagCompound().getBoolean("isMagnetizeON") == false) {
                
            }
        }
    }
}

Java:
public class CoreKeyHandler {
    
    public static boolean isOn = false;
    
     @SubscribeEvent
   public void onKeyPress(KeyInputEvent event) {
       if (CoreKeyHandler.magnetizeKey.isPressed()) {
           ItemStack armor = this.mc.thePlayer.inventory.armorInventory[0];
           if (isOn == false && armor != null && armor.getItem() == CoreItems.Magnet_boots) {
             isOn = true;
             CoreNetworkChannel.network.sendToServer(new CorePacketMagnetize());
           } else {
             isOn = false;
           }
       }
   }
}
Я вообще запутался как делать, по возможности, распишите порядок действий опираясь на код, который я кинул
 
269
8
19
@RonyC

У тебя этот код на клиентской стороне исполняется? если да,то добавление nbt на серверной должно быть.
Попробуй что-то сделать более легкое но с таким же принципом,а потом уже переделай.
Тэкс, нажимаю на кнопку, отправляется пакет:
Java:
public class CorePacketMagnetize extends CorePacketHandler {
  
    @Override
    public void client(EntityPlayer player) {
        ItemStack armor = player.inventory.armorInventory[0];
        World world = player.worldObj;
        player.addChatComponentMessage(new ChatComponentText("I'm here!"));
        if (armor != null && armor.getItem() == CoreItems.Magnet_boots) {
                if (armor.getTagCompound().getBoolean("isMagnetizeON")) {
                    armor.getTagCompound().setBoolean("isMagnetizeON", false);
                    CoreCommonProxy.sendPlayerMessage(player, StatCollector.translateToLocal("mess.magnetizeOFF"));
                } else {
                    armor.getTagCompound().setBoolean("isMagnetizeON", true);
                    ((CoreMagnetArmor) armor.getItem()).magnetize(world, player, armor);//магнитит
                    CoreCommonProxy.sendPlayerMessage(player, StatCollector.translateToLocal("mess.magnetizeON"));
                }
        }
        return;
    }
}
 
Сверху