Тотем

Версия Minecraft
1.12.2
683
3
21
У кого-то есть код тотема бессмертия ? чтобы взять за основу , а то я хз его класса нет в item.Пытался сам сделать,но не вышло
 
Решение
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.1";

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

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

    public static Item my_totem;

    @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_totem = new...
3,005
192
592
if(pl.getHeldItemOffhand() == new ItemStack(ItemInit.CowardsTotem) || pl.getHeldItemMainhand() == new ItemStack(ItemInit.CowardsTotem) ) {
Потому что ты проверяешь стак из руки и НОВЫЙ стак.
Это всегда будет false. (вроде)
Проверяй так:
Код:
public static boolean isSameItem(ItemStack stack, Item item) {
return !stack.isEmpty() && stack.getItem() == item;
}
И юзать:
isSameItem(pl.getHeldItemOffhand(), ItemInit.CowardsTotem)
 
917
22
332
onItemUse ему нельзя написать тогда? Зачем здесь эвенты
Упс это не так работает... Сорь за дезинформацию :rolleyes:. onUpdate, кажется, тикает... если я опять не ошибся. Почему нельзя проверять из него?
 
Последнее редактирование:
683
3
21
Да,я давно хотел это сделать в onUpdate, но тогда я не могу инициализировать игрока,а благодаря @SuperCatMaster я смог это сделать.Теперь как удалить item после использования(просто удалить его).
 

timaxa007

Модератор
5,831
409
672
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.1";

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

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

    public static Item my_totem;

    @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_totem = new Item().setRegistryName(MODID, "mytotem").setUnlocalizedName("mytotem").setCreativeTab(CreativeTabs.MISC);
        ForgeRegistries.ITEMS.register(my_totem);

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

    }

}
Java:
public class EventsForge {

    @SubscribeEvent(priority = EventPriority.HIGHEST)
    public void onDeath(LivingDeathEvent event) {
        if (event.isCanceled()) 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() == TotemMod.my_totem) {

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

                    player.setHealth(1.0F);
                    player.clearActivePotions();
                    player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 900, 1));
                    player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 100, 1));

                    if (player instanceof EntityPlayerMP)
                        TotemMod.network.sendTo(new EntityStatusMessage(), (EntityPlayerMP)player);

                    event.setCanceled(true);
                    break;
                }
            }

        }
    }

}
Java:
public class EntityStatusMessage implements IMessage {

    public EntityStatusMessage() {}

    @Override
    public void toBytes(ByteBuf buf) {}

    @Override
    public void fromBytes(ByteBuf 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();
            mc.effectRenderer.emitParticleAtEntity(mc.player, EnumParticleTypes.TOTEM, 30);
            mc.world.playSound(mc.player.posX, mc.player.posY, mc.player.posZ, SoundEvents.ITEM_TOTEM_USE, mc.player.getSoundCategory(), 1.0F, 1.0F, false);
            mc.entityRenderer.displayItemActivation(new ItemStack(Items.BEETROOT_SOUP));
        }

        private void act(EntityPlayerMP player, EntityStatusMessage packet) {

        }

    }

}
---
По идеи лучше по другому отправлять пакет и его содержимое (типа отправить всем кто рядом, но показывать тотем на экране тому у кого этот тотем сработал), но это уже ты сделай.
 
Последнее редактирование:

timaxa007

Модератор
5,831
409
672
типа отправить всем кто рядом, но показывать тотем на экране тому у кого этот тотем сработал
Типа так, а может и нет:
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.2";

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

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

    public static Item my_totem;

    @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_totem = new Item().setRegistryName(MODID, "mytotem").setUnlocalizedName("mytotem").setCreativeTab(CreativeTabs.MISC);
        ForgeRegistries.ITEMS.register(my_totem);

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

    }

}
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() == TotemMod.my_totem) {

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

                    player.setHealth(1.0F);
                    player.clearActivePotions();
                    player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 900, 1));
                    player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 100, 1));

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

                    event.setCanceled(true);
                    break;
                }
            }

        }
    }

}
Java:
public class EntityStatusMessage implements IMessage {

    public int entityID;

    public EntityStatusMessage() {}

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(entityID);
    }

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

    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)
                    mc.entityRenderer.displayItemActivation(new ItemStack(Items.BEETROOT_SOUP));
            }
        }

        private void act(EntityPlayerMP player, EntityStatusMessage packet) {

        }

    }

}
 
683
3
21
ИИИИ решил показать вам код , а то наверняка где-то можно сделать лучше и МЕНЯ КОЕ ЧТО НЕ УСТРАИВАЕТ , ПОСЛЕ ИСПОЛЬЗОВАНИЯ ТОТЕМА ОН ИСЧЕЗАЕТ ,НО ПОСЛЕ ЭТОГО ЕСЛИ Я УМРУ ТОТЕМ ДРОПНЕТСЯ С МЕНЯ....
 
683
3
21
Java:
    @Override
    public void onUpdate(ItemStack stack, World world, Entity entityIn, int itemSlot, boolean isSelected) {
    EntityPlayer pl = Minecraft.getMinecraft().player;
    Minecraft mc = Minecraft.getMinecraft();
    if(isSelected) {
               if(pl != null) {
                 if(pl.getHealth() <= 6.0f && !pl.capabilities.isCreativeMode) {
                     pl.clearActivePotions();
                     pl.addPotionEffect(new PotionEffect(MobEffects.SPEED, 600, 2));
                     pl.addPotionEffect(new PotionEffect(MobEffects.JUMP_BOOST, 300, 2));
                     for(EnumHand hand : EnumHand.values()) {
                         pl.setHeldItem(hand, ItemStack.EMPTY);
                     }
                     if(world.isRemote) {
                         mc.effectRenderer.emitParticleAtEntity(mc.player, EnumParticleTypes.TOTEM, 30);
                         mc.world.playSound(mc.player.posX, mc.player.posY, mc.player.posZ, SoundEvents.ITEM_TOTEM_USE, mc.player.getSoundCategory(), 1.0F, 1.0F, false);
                         mc.entityRenderer.displayItemActivation(new ItemStack(ItemInit.CowardsTotem));
                         }
                 }
               }
    }
        super.onUpdate(stack, world, entityIn, itemSlot, isSelected);
    }
 

timaxa007

Модератор
5,831
409
672
НО ПОСЛЕ ЭТОГО ЕСЛИ Я УМРУ ТОТЕМ ДРОПНЕТСЯ С МЕНЯ.
EntityPlayer pl = Minecraft.getMinecraft().player;
Думаю он у тебя удаляется видимо, но на серверной стороне он остаётся в слоте. Типа когда он исчезает, нажми на слот будто ты от туда достаёшь предмет.
 
7,099
324
1,510
7,099
324
1,510

timaxa007

Модератор
5,831
409
672
Это не дюп, ты используешь клиентского игрока, оно у тебя не убираеться из серверной стороны, а тебе нужно из аргумента Entity получать EntityPlayer.
 
7,099
324
1,510
Сверху