Собственный рабочий метод

Сообщения
683
Лучшие ответы
3
Реакции
19
Версия Minecraft
1.12.2
Я хочу создать метод,который будет срабатывать когда игрок держит нужный предмет(допустим класс морковки унаследует от класса с этим методов и используется этот метод, то срабатывать будет когда игрок держит в руке морковку).
И срабатывать тогда когда у игрока который держит этот предмет осталось определенное количество HP (будет переменная float в методе и при унаследовании в super надо будет указать значение этого float, это и будет то определенное количество HP )
 
Сообщения
3,526
Лучшие ответы
48
Реакции
339
Проверяй в каком-нибудь эвенте наличие у игрока данного предмета и вызывай свой метод.
Можно сделать через интерфейсы, а можно тупо класс чекать.
 
Сообщения
690
Лучшие ответы
29
Реакции
92
Унаследовать кастомный класс от предмета, унаследовать предмет от кастомного класса. В кастомном классе прописать твоё метод (пишем как ты) и вызвать его в плэерТике. Что не так?
 
Сообщения
683
Лучшие ответы
3
Реакции
19
ничерта не понял
 
Сообщения
844
Лучшие ответы
23
Реакции
133
Если тебе нужно только на новые предметы действие приделать, то тогда создай интерфейс с методом, который возвращает float (например, getCallHP) и сделай каждому предмету реализацию этого интерфейса.

Если же тебе нужно применять это на любой предмет, например из модов или ваниллы, тогда есть два варианта:
Создать Map<String, Float>, где ключом (String) будет ID предмета, а значением (Float) нужное тебе значение HP;
А второй вариант — всунуть в Item (и Block?) метод хуком с параметром "создавать метод", ну и затем всем нужным наследникам переопределять (тем же хуком, если нельзя редактировать).

Ну а как вызывать метод тебе уже сказали, в каком нибудь PlayerTickEvent'е, проверяешь наличие [интерфейса/наличие в Map/сразу получаешь значение из метода] и затем вызываешь свой метод, перед этим проверив значение.
 
Сообщения
683
Лучшие ответы
3
Реакции
19
o_O
 
Сообщения
683
Лучшие ответы
3
Реакции
19
UP
 

Agravaine :j

Модератор
Сообщения
5,506
Лучшие ответы
276
Реакции
1,210
Что ты апаешь? Тебе объяснили выше.
 

mayakplay

GUIMASTA
Сообщения
165
Лучшие ответы
1
Реакции
27

Agravaine :j

Модератор
Сообщения
5,506
Лучшие ответы
276
Реакции
1,210
Проверить что предмет instanceof IYourItem - это дорого? Да ну.
 
Сообщения
683
Лучшие ответы
3
Реакции
19
я конечно могу сделать это вот так
Java:
    @Override
        public float getHPandItem(float heath, EntityLiving living, EnumHand hand) {
           if(living.getHeldItem(hand) == new ItemStack(ItemInit.CowardsTotem)) {
              
           }
            return 0;
        }
но я хочу допустим чтобы это не писать в каждом классе сделать это в interface как сказал @MJaroslav но я чет хз как узнать что в руке мой предмет (тот который реализовал интерфейс и после узнать что float heath которую я возвратил в super равна количеству хп энтити)
 

timaxa007

Модератор
Сообщения
5,590
Лучшие ответы
363
Реакции
552
чтобы это не писать в каждом классе
Тогда зачем пишешь? Можно там где это надо.
тот который реализовал интерфейс и после узнать что float heath
Тогда наверное не интерфейс, а абстрактный класс в котором используется интерфейс. И твой предмет унаследуется от этого абстрактного класса.
 
Сообщения
4,430
Лучшие ответы
115
Реакции
661
В интерфейсах можно делать default методы. Отличие в том, что можно много интерфейсов замиксить в одну реализацию, а много абстрактных классов - нельзя. Если у ТС повятся другие хандлеры для предметов, например
 
Сообщения
624
Лучшие ответы
4
Реакции
8
Так и не понял что тебе надо, но лови проверку в эвентах.

if (!(event.entityPlayer.inventory.getCurrentItem() == null) && event.entityPlayer.inventory.getCurrentItem().getItem() instanceof Item){ //действия }
 

timaxa007

Модератор
Сообщения
5,590
Лучшие ответы
363
Реакции
552
Так и не понял что тебе надо
Если я правильно его понял, то он хочет для тотемов сделать метод, который для каждого определённого предмета возвращал свой определённое значения для восстановления здоровья.
Эта тема по 1.12.2, в этой версии в принципе ни где ItemStack не должен быть null'ом (он может быть ItemStack.EMPTY).
 
Сообщения
1,383
Лучшие ответы
57
Реакции
393
я конечно могу сделать это вот так
Там, где ты вызываешь этот метод, можешь проверять что предмет тот что надо и только тогда его вызывать, попутно передавая туда же и этот предмет(если надо с ним чет делать в методе), не делая лишних проверок(типа if(living.getHeldItem(hand) == new ItemStack(ItemInit.CowardsTotem))) в реализации самого метода
 
Последнее редактирование:

timaxa007

Модератор
Сообщения
5,590
Лучшие ответы
363
Реакции
552
Java:
@Mod(modid = TotemMod.MODID, name = TotemMod.NAME, version = TotemMod.VERSION)
public class TotemMod {

    public static final String
    MODID = "totem",
    NAME = "Totem Mod",
    VERSION = "0.5";

    @Mod.Instance(MODID)
    public static TotemMod instance;

    public static final SimpleNetworkWrapper network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);

    public static Item
    my_totem1,
    my_totem2,
    my_totem3,
    my_totem4,
    my_totem5
    ;

    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.CLIENT);
        network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.SERVER);


        my_totem1 = new ItemMyTotem() {
            {setRegistryName(MODID, "my_totem1").setUnlocalizedName("my_totem1").setCreativeTab(CreativeTabs.MISC);}
            public boolean doTotem(EntityPlayer player, ItemStack item) {
                player.setHealth(1.0F);
                player.clearActivePotions();
                player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 900, 1));
                player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 100, 1));
                return true;
            }
        };
        ForgeRegistries.ITEMS.register(my_totem1);


        my_totem2 = new ItemMyTotem() {
            {setRegistryName(MODID, "my_totem2").setUnlocalizedName("my_totem2").setCreativeTab(CreativeTabs.MISC);}
            public boolean doTotem(EntityPlayer player, ItemStack item) {
                player.setHealth(0.5F);
                player.clearActivePotions();
                player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 500, 1));
                player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 40, 1));
                return true;
            }
        };
        ForgeRegistries.ITEMS.register(my_totem2);


        my_totem3 = new ItemMyTotem() {
            {setRegistryName(MODID, "my_totem3").setUnlocalizedName("my_totem3").setCreativeTab(CreativeTabs.MISC);}
            public boolean doTotem(EntityPlayer player, ItemStack item) {
                player.setHealth(1.5F);
                player.clearActivePotions();
                player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 900, 1));
                player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 140, 1));
                return true;
            }
        };
        ForgeRegistries.ITEMS.register(my_totem3);


        my_totem4 = new ItemMyTotem() {
            {setRegistryName(MODID, "my_totem4").setUnlocalizedName("my_totem4").setCreativeTab(CreativeTabs.MISC);}
            public boolean doTotem(EntityPlayer player, ItemStack item) {
                player.setHealth(2.0F);
                player.clearActivePotions();
                player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 1000, 1));
                player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 200, 1));
                return true;
            }
        };
        ForgeRegistries.ITEMS.register(my_totem4);


        my_totem5 = new ItemMyTotem() {
            {setRegistryName(MODID, "my_totem5").setUnlocalizedName("my_totem5").setCreativeTab(CreativeTabs.MISC);}
            public boolean doTotem(EntityPlayer player, ItemStack item) {
                player.setHealth(5.0F);
                player.clearActivePotions();
                player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 500, 1));
                player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 200, 1));
                return true;
            }
        };
        ForgeRegistries.ITEMS.register(my_totem5);


        MinecraftForge.EVENT_BUS.register(new EventsForge());

    }

}
Java:
public class ItemMyTotem extends Item {

    public boolean doTotem(EntityPlayer player, ItemStack item) {
        return false;
    }

}
Java:
public class EventsForge {

    @SubscribeEvent(priority = EventPriority.HIGHEST)
    public void onDeath(LivingDeathEvent event) {
        if (event.isCanceled()) return;
        if (event.getEntityLiving().world.isRemote) return;
        if (event.getEntityLiving() instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer)event.getEntityLiving();

            for(EnumHand hand : EnumHand.values()) {
                ItemStack item = player.getHeldItem(hand);
                if (!item.isEmpty() && item.getItem() instanceof ItemMyTotem) {

                    item.shrink(1);
                    if (item.getCount() <= 0)
                        player.setHeldItem(hand, ItemStack.EMPTY);
                    else
                        player.setHeldItem(hand, item);

                    if (((ItemMyTotem)item.getItem()).doTotem(player, item)) {

                        EntityStatusMessage message = new EntityStatusMessage();
                        message.entityID = player.getEntityId();
                        message.itemStack = item;
                        TotemMod.network.sendToDimension(message, player.dimension);

                        event.setCanceled(true);
                        break;
                    }
                }
            }

        }
    }

}
Java:
public class EntityStatusMessage implements IMessage {

    public int entityID;
    public ItemStack itemStack = ItemStack.EMPTY;

    public EntityStatusMessage() {}

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(entityID);
        ByteBufUtils.writeItemStack(buf, itemStack);
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        entityID = buf.readInt();
        itemStack = ByteBufUtils.readItemStack(buf);
    }

    public static class Handler implements IMessageHandler<EntityStatusMessage, IMessage> {

        @Override
        public IMessage onMessage(EntityStatusMessage packet, MessageContext message) {
            if (message.side.isClient())
                act(packet);
            else
                act(message.getServerHandler().player, packet);
            return null;
        }

        @SideOnly(Side.CLIENT)
        private void act(EntityStatusMessage packet) {
            Minecraft mc = Minecraft.getMinecraft();
            Entity entity = mc.world.getEntityByID(packet.entityID);
            if (entity instanceof EntityPlayer) {
                mc.effectRenderer.emitParticleAtEntity(entity, EnumParticleTypes.TOTEM, 30);
                mc.world.playSound(entity.posX, entity.posY, entity.posZ, SoundEvents.ITEM_TOTEM_USE, entity.getSoundCategory(), 1.0F, 1.0F, false);
                if (entity == mc.player && packet.itemStack != ItemStack.EMPTY)
                    mc.entityRenderer.displayItemActivation(packet.itemStack);
            }
        }

        private void act(EntityPlayerMP player, EntityStatusMessage packet) {

        }

    }

}
 
Сообщения
683
Лучшие ответы
3
Реакции
19
Единственное (наверное ), что осталось это как указывать heath в super при унаследовании
 

Agravaine :j

Модератор
Сообщения
5,506
Лучшие ответы
276
Реакции
1,210
Ты абсолютно не понимаешь что ты делаешь.
Супер просто вызывает весь код из метода-родителя.
 
Сверху