Jump to content

[1.10.2] Give equipment (armor + hands) to a custom Entity through a GUI ?


Major Squirrel

Recommended Posts

Good evening,

 

I am trying to set up a GUI to equip my custom Entity, meaning giving it some armor pieces or items in hands.

 

Here is how it looks like right now :

 

xGjrCzY.png

 

ContainerNPCInventory:

public class                ContainerNPCInventory extends Container {

    private static final EntityEquipmentSlot[]  VALID_EQUIPMENT_SLOTS = new EntityEquipmentSlot[] {
            EntityEquipmentSlot.HEAD,
            EntityEquipmentSlot.CHEST,
            EntityEquipmentSlot.LEGS,
            EntityEquipmentSlot.FEET
    };

    private final EntityNPCDialog   entityNPC;
    private Iterable<ItemStack>     inventoryArmor;
    private Iterable<ItemStack>     heldEquipment;

    private final InventoryPlayer   playerInventory;
    private InventoryBasic          entityInventory;

    public                  ContainerNPCInventory(EntityPlayer playerIn, EntityNPCDialog entityNPC) {
        this.entityNPC = entityNPC;
        this.inventoryArmor = entityNPC.getArmorInventoryList();
        this.heldEquipment = entityNPC.getHeldEquipment();

        this.playerInventory = playerIn.inventory;
        this.entityInventory = new InventoryBasic("NPC Inventory", true,
                Iterables.size(this.inventoryArmor) + Iterables.size(this.heldEquipment));
        this.entityInventory.addInventoryChangeListener(entityNPC);

        for (int index = 0; index < 4; ++index) {
            final EntityEquipmentSlot   equipmentSlot = ContainerNPCInventory.VALID_EQUIPMENT_SLOTS[index];

            this.addSlotToContainer(new Slot(this.entityInventory, index, 8, 8 + index * 18) {

                @Override
                public boolean  isItemValid(@Nullable ItemStack stack) {
                    return (stack != null && stack.getItem().isValidArmor(stack, equipmentSlot, entityNPC));
                }

                @Override
                public int      getSlotStackLimit() {
                    return (1);
                }

                @Nullable
                @Override
                public String   getSlotTexture() {
                    return (ItemArmor.EMPTY_SLOT_NAMES[equipmentSlot.getIndex()]);
                }
            });
        }

        this.addSlotToContainer(new Slot(this.entityInventory, 4, 77, );

        this.addSlotToContainer(new Slot(this.entityInventory, 5, 95,  {

            @Nullable
            @Override
            public String   getSlotTexture() {
                return ("minecraft:items/empty_armor_slot_shield");
            }
        });

        for (int index = 0; index < 9; ++index) {
            this.addSlotToContainer(new Slot(this.playerInventory, index, 9 + index * 18, 112));
        }
    }

    @Override
    public boolean          canInteractWith(EntityPlayer playerIn) {
        return (true);
    }
}

 

EntityNPCDialog:

public class                EntityNPCDialog extends EntityLiving implements IInventoryChangedListener {

//    private static final DataParameter<Integer> TEXTURE_INDEX = EntityDataManager.<Integer>createKey(EntityNPCDialog.class, DataSerializers.VARINT);

    public                  EntityNPCDialog(World worldIn) {
        super(worldIn);
    }

    @Override
    protected void          initEntityAI() {
        super.initEntityAI();

        this.tasks.addTask(0, new EntityAISwimming(this));
        this.tasks.addTask(1, new EntityAIWatchClosest(this, EntityPlayer.class, 16.0F, 42.0F));
        this.tasks.addTask(2, new EntityAILookIdle(this));
    }

    @Override
    public boolean          canBePushed() {
        return (false);
    }

    @Override
    public boolean          isPushedByWater() {
        return (false);
    }

    @Override
    protected boolean       canDespawn() {
        return(false);
    }

    @Override
    public void             addVelocity(double x, double y, double z) {}

    @Override
    public boolean          canRiderInteract() {
        return (false);
    }

    @Override
    public boolean          isEntityInvulnerable(DamageSource source) {
        return (false);
    }

    @Override
    public boolean          isPotionApplicable(PotionEffect potioneffectIn) {
        return (false);
    }

    @Override
    public boolean          isImmuneToExplosions() {
        return (false);
    }

    @Nullable
    @Override
    protected SoundEvent    getAmbientSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Nullable
    @Override
    protected SoundEvent    getHurtSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Nullable
    @Override
    protected SoundEvent    getDeathSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Override
    protected SoundEvent    getFallSound(int heightIn) {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Override
    protected SoundEvent    getSwimSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Override
    protected SoundEvent    getSplashSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    public static ThreadDownloadImageData   getDownloadImageSkin(ResourceLocation resourceLocationIn) {
        TextureManager          textureManager = Minecraft.getMinecraft().getTextureManager();
        ThreadDownloadImageData threadDownloadImageData;

        threadDownloadImageData = new ThreadDownloadImageData(null, "http://imgur.com/Z0pbA3P.png", DefaultNPCSkin.getDefaultSkin(), new ImageBufferDownload() {

            @Override
            public BufferedImage    parseUserSkin(BufferedImage image) {
                return (image);
            }

        });

        textureManager.loadTexture(resourceLocationIn, threadDownloadImageData);

        return (threadDownloadImageData);
    }

    private void            updateNPCSlots(InventoryBasic inventoryBasic) {
        if (!this.worldObj.isRemote) {
            this.setItemStackToSlot(EntityEquipmentSlot.HEAD, inventoryBasic.getStackInSlot(0));
            this.setItemStackToSlot(EntityEquipmentSlot.CHEST, inventoryBasic.getStackInSlot(1));
            this.setItemStackToSlot(EntityEquipmentSlot.LEGS, inventoryBasic.getStackInSlot(2));
            this.setItemStackToSlot(EntityEquipmentSlot.FEET, inventoryBasic.getStackInSlot(3));
            this.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, inventoryBasic.getStackInSlot(4));
            this.setItemStackToSlot(EntityEquipmentSlot.OFFHAND, inventoryBasic.getStackInSlot(5));
        }
    }

    @Override
    public void             onInventoryChanged(InventoryBasic inventoryBasic) {
        this.updateNPCSlots(inventoryBasic);
    }
}

 

I must admit I am really confused. I got inspired by the GuiContainerCreative, ContainerHorseInventory (the container for horses) and EntityZombie, but it seems that I am going in the wrong way. What I would like to achieve is that, when I place an item in the Slots of my container, it updates the equipment and hands ItemStack arrays of my Entity (+ rendering the items on the entity, like Zombies or Skeletons but this should work since my Entity model extends from ModelBiped).

 

I think I am complicating the task for no reason. Could you guys highlight me on what should I achieve this ?

 

Thank you for your time. :)

Squirrel ! Squirrel ! Squirrel !

Link to comment
Share on other sites

Good evening,

 

After checking my code again, I don't really understand why it does not work at all. The EntityLivingBase#setItemStackToSlot(EntityEquipmentSlot slotIn, @Nullable ItemStack stack) method should work, but in my case I think I'm not using it in the right way.

 

Basically, I've made some simple tests to check if my entity could currently hold those items. One of this test is very simplistic: when I proceed a right-click on my entity with an equipment item, I call the method above from the server.

 

NPCInteractEvent:

    @SubscribeEvent
    public void     onEntityNPCInteract(PlayerInteractEvent.EntityInteract event) {
        ItemStack   heldItem = event.getEntityPlayer().getHeldItem(EnumHand.MAIN_HAND);
        ItemBase    npcManager = CraftAndConquerItems.npcManager;

        if (event.getTarget() instanceof EntityNPCDialog && event.getHand().equals(EnumHand.MAIN_HAND) && heldItem != null) {
            if (!event.getWorld().isRemote) {
                if (heldItem.getItem().equals(npcManager))
                    event.getEntityPlayer().openGui(CraftAndConquer.instance, GuiHandler.CAC_NPC_GUI, event.getWorld(), event.getTarget().getEntityId(), 0, 0);
                else if (heldItem.getItem().equals(Items.DIAMOND_HELMET))
                    event.getTarget().setItemStackToSlot(EntityEquipmentSlot.HEAD, heldItem);
                else if (heldItem.getItem().equals(Items.DIAMOND_CHESTPLATE))
                    event.getTarget().setItemStackToSlot(EntityEquipmentSlot.CHEST, heldItem);
                else if (heldItem.getItem().equals(Items.DIAMOND_LEGGINGS))
                    event.getTarget().setItemStackToSlot(EntityEquipmentSlot.LEGS, heldItem);
                else if (heldItem.getItem().equals(Items.DIAMOND_BOOTS))
                    event.getTarget().setItemStackToSlot(EntityEquipmentSlot.FEET, heldItem);
                else if (heldItem.getItem().equals(Items.DIAMOND_SWORD))
                    event.getTarget().setItemStackToSlot(EntityEquipmentSlot.MAINHAND, heldItem);
                else if (heldItem.getItem().equals(Items.SHIELD))
                    event.getTarget().setItemStackToSlot(EntityEquipmentSlot.OFFHAND, heldItem);
            }
        }
    }

 

The event does actually work, even when I disconnect/reconnect, the equipment has been successfully saved in NBTTags, here is the result:

 

width=800 height=433https://images.discordapp.net/.eJwFwVEOgyAMANC7cABqO4vM2xAkaNSWQM0-lt19733d0y-3ut2sjRVgO0bWvvlh2lMtvqrWq6R2DJ_1hmSW8n4XsQEUkAnDRMSMFJjeQAu9GJc4R8LIEyLBI6foR3yT6n5_BBkixQ.vHGe_Qq0t2Fo_YJzemzOELu6gjU?width=1250&height=677[/img]

 

But still, through a GUI, my code does not work. What is strange is that, when those entities are wearing the equipment in the event andler way, it does not appear in the GUI:

 

NhUKOBC.png

 

I don't really want to add an Inventory in my Entity class, since I only want to access to the existing inventoryHands and inventoryArmor fields of the EntityLiving class. I don't see the point to add an Inventory that includes what already exists in their own way. I feel that this is something stupid that I am missing, but I don't see what.

Squirrel ! Squirrel ! Squirrel !

Link to comment
Share on other sites

What do you think this does,

this.entityInventory = new InventoryBasic("NPC Inventory", true,
                Iterables.size(this.inventoryArmor) + Iterables.size(this.heldEquipment));

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

What do you think this does,

this.entityInventory = new InventoryBasic("NPC Inventory", true,
                Iterables.size(this.inventoryArmor) + Iterables.size(this.heldEquipment));

 

It does create an empty InventoryBasic, which I use it to make the link between the already-existing inventoryHands and inventoryArmor fields from LivingEntity and my Container, but it does not seem to work at all.  ;D I use them because Slots don't support Iterable<ItemStack> to be constructed.

Squirrel ! Squirrel ! Squirrel !

Link to comment
Share on other sites

Create a custom Inventory that does then.

 

What do you mean by creating a "custom Inventory" ? Is the InventoryBasic not sufficient for this kind of things ?

 

Also, I am surprised that nobody tried to develop this in Forge. I searched few minutes on google and different forge forums and I have not been able to find a single topic talking about this.  :-[

Squirrel ! Squirrel ! Squirrel !

Link to comment
Share on other sites

Create a custom Inventory that does then.

 

What do you mean by creating a "custom Inventory" ? Is the InventoryBasic not sufficient for this kind of things ?

 

Also, I am surprised that nobody tried to develop this in Forge. I searched few minutes on google and different forge forums and I have not been able to find a single topic talking about this.  :-[

Create a class that extends InventoryBasic. Then in the constructor have it pass ItemStack Arrays and loop through them and add them to the already existing array with setInventorySlotContents or addItem.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

Good evening,

 

So I tried the suggestion of Animefan8888:

 

Create a class that extends InventoryBasic. Then in the constructor have it pass ItemStack Arrays and loop through them and add them to the already existing array with setInventorySlotContents or addItem.

 

Here is the code.

 

NPCInventoryBasic:

public class    NPCInventoryBasic extends InventoryBasic {

    public      NPCInventoryBasic(Iterable<ItemStack> inventoryArmor, Iterable<ItemStack> inventoryHands) {
        super("NPC Inventory Basic", true, Iterables.size(inventoryArmor) + Iterables.size(inventoryHands));

        Iterable<ItemStack> equipment = Iterables.concat(inventoryArmor, inventoryHands);

        for (int index = 0; index < Iterables.size(inventoryArmor) + Iterables.size(inventoryHands); ++index) {
            this.setInventorySlotContents(index, Iterables.get(equipment, index));
        }
    }
}

 

ContainerNPCInventory:

public class                ContainerNPCInventory extends Container {

    private static final EntityEquipmentSlot[]  VALID_EQUIPMENT_SLOTS = new EntityEquipmentSlot[] {
            EntityEquipmentSlot.HEAD,
            EntityEquipmentSlot.CHEST,
            EntityEquipmentSlot.LEGS,
            EntityEquipmentSlot.FEET
    };

    private EntityNPCDialog         entityNPC;

    private final InventoryPlayer   playerInventory;
    private NPCInventoryBasic       entityInventory;

    public                  ContainerNPCInventory(EntityPlayer playerIn, EntityNPCDialog entityNPC) {
        Iterable<ItemStack> inventoryArmor;
        Iterable<ItemStack> heldEquipment;

        this.entityNPC = entityNPC;
        inventoryArmor = entityNPC.getArmorInventoryList();
        heldEquipment = entityNPC.getHeldEquipment();

        if (!playerIn.worldObj.isRemote) {
            inventoryArmor.forEach(armor -> CraftAndConquer.logger.log(Level.INFO, "[ARMOR] I am:\t" + (armor != null ? armor.getDisplayName() : "null")));
            heldEquipment.forEach(hand -> CraftAndConquer.logger.log(Level.INFO, "[HANDS] I am:\t" + (hand != null ? hand.getDisplayName() : "null")));
        }


        this.playerInventory = playerIn.inventory;
        this.entityInventory = new NPCInventoryBasic(inventoryArmor, heldEquipment);
        //this.entityInventory.addInventoryChangeListener(this.entityNPC);

        for (int index = 0; index < 4; ++index) {
            final EntityEquipmentSlot   equipmentSlot = ContainerNPCInventory.VALID_EQUIPMENT_SLOTS[index];

            this.addSlotToContainer(new Slot(this.entityInventory, index, 8, 8 + index * 18) {

                @Override
                public void onSlotChanged() {
                    entityNPC.setItemStackToSlot(equipmentSlot, this.getStack());
                    super.onSlotChanged();
                }

                @Override
                public boolean  isItemValid(@Nullable ItemStack stack) {
                    return (stack != null && stack.getItem().isValidArmor(stack, equipmentSlot, entityNPC));
                }

                @Override
                public int      getSlotStackLimit() {
                    return (1);
                }

                @Nullable
                @Override
                public String   getSlotTexture() {
                    return (ItemArmor.EMPTY_SLOT_NAMES[equipmentSlot.getIndex()]);
                }
            });
        }

        this.addSlotToContainer(new Slot(this.entityInventory, 4, 77,  {

            @Override
            public void onSlotChanged() {
                entityNPC.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, this.getStack());
                super.onSlotChanged();
            }
        });

        this.addSlotToContainer(new Slot(this.entityInventory, 5, 95,  {

            @Override
            public void onSlotChanged() {
                entityNPC.setItemStackToSlot(EntityEquipmentSlot.OFFHAND, this.getStack());
                super.onSlotChanged();
            }

            @Nullable
            @Override
            public String   getSlotTexture() {
                return ("minecraft:items/empty_armor_slot_shield");
            }
        });

        for (int index = 0; index < 9; ++index) {
            this.addSlotToContainer(new Slot(this.playerInventory, index, 9 + index * 18, 112));
        }
    }

    @Override
    public boolean          canInteractWith(EntityPlayer playerIn) {
        return (true);
    }
}

 

I think it works.

 

tPGMmUl.png

 

Well, it "half" works.

 

bIdQzbF.png

 

Wtf haha. When I place the equipment in the different slots, it updates the entity correctly as it equips and renders all the stuff nicely. But when I leave the GUI and open it again, this kind of thing happens as above (meaning, all the armor pieces are reversed, but not the hands). I just don't understand why, the indexes of the EntityEquipmentSlot enums are correct, the slots in my container didn't change, so what could happen ??

Squirrel ! Squirrel ! Squirrel !

Link to comment
Share on other sites

Minecraft started it's IDs for armor at zero = to boots, and so on upwards. I know a little strange right.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

Minecraft started it's IDs for armor at zero = to boots, and so on upwards. I know a little strange right.

 

g1352129205367343592.jpg

 

I figured it out by myself and your comment confirmed what I noticed, thanks !

 

I managed to make it work without a custom inventory and by using EntityLiving#getItemStackFromSlot(EntityEquipmentSlot slotIn) and EntityLiving#setItemStackToSlot(EntityEquipmentSlot slotIn, @Nullable ItemStack stack) instead of going through the Iterable<ItemStack>.

 

EntityNPCDialog:

public class                EntityNPCDialog extends EntityLiving {

//    private static final DataParameter<Integer> TEXTURE_INDEX = EntityDataManager.<Integer>createKey(EntityNPCDialog.class, DataSerializers.VARINT);

    public                  EntityNPCDialog(World worldIn) {
        super(worldIn);
    }

    @Override
    protected void          initEntityAI() {
        super.initEntityAI();

        this.tasks.addTask(0, new EntityAISwimming(this));
        this.tasks.addTask(1, new EntityAIWatchClosest(this, EntityPlayer.class, 16.0F, 42.0F));
        this.tasks.addTask(2, new EntityAILookIdle(this));
    }

    @Override
    public boolean          canBePushed() {
        return (false);
    }

    @Override
    public boolean          isPushedByWater() {
        return (false);
    }

    @Override
    protected boolean       canDespawn() {
        return(false);
    }

    @Override
    public void             addVelocity(double x, double y, double z) {}

    @Override
    public boolean          canRiderInteract() {
        return (false);
    }

    @Override
    public boolean          isEntityInvulnerable(DamageSource source) {
        return (false);
    }

    @Override
    public boolean          isPotionApplicable(PotionEffect potioneffectIn) {
        return (false);
    }

    @Override
    public boolean          isImmuneToExplosions() {
        return (false);
    }

    @Nullable
    @Override
    protected SoundEvent    getAmbientSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Nullable
    @Override
    protected SoundEvent    getHurtSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Nullable
    @Override
    protected SoundEvent    getDeathSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Override
    protected SoundEvent    getFallSound(int heightIn) {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Override
    protected SoundEvent    getSwimSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

    @Override
    protected SoundEvent    getSplashSound() {
        return (CraftAndConquerSounds.NPCDialogSoundEvent);
    }

//    public static ThreadDownloadImageData   getDownloadImageSkin(ResourceLocation resourceLocationIn) {
//        TextureManager          textureManager = Minecraft.getMinecraft().getTextureManager();
//        ThreadDownloadImageData threadDownloadImageData;
//
//        threadDownloadImageData = new ThreadDownloadImageData(null, "http://imgur.com/Z0pbA3P.png", DefaultNPCSkin.getDefaultSkin(), new ImageBufferDownload() {
//
//            @Override
//            public BufferedImage    parseUserSkin(BufferedImage image) {
//                return (image);
//            }
//
//        });
//
//        textureManager.loadTexture(resourceLocationIn, threadDownloadImageData);
//
//        return (threadDownloadImageData);
//    }
}

 

ContainerNPCInventory:

public class                ContainerNPCInventory extends Container {

    public static final EntityEquipmentSlot[]   VALID_EQUIPMENT_SLOTS = new EntityEquipmentSlot[] {
            EntityEquipmentSlot.HEAD,
            EntityEquipmentSlot.CHEST,
            EntityEquipmentSlot.LEGS,
            EntityEquipmentSlot.FEET,
            EntityEquipmentSlot.MAINHAND,
            EntityEquipmentSlot.OFFHAND
    };

    private EntityNPCDialog         entityNPC;

    private final InventoryPlayer   playerInventory;
    private InventoryBasic          entityInventory;

    public                  ContainerNPCInventory(EntityPlayer playerIn, EntityNPCDialog entityNPC) {
        this.entityNPC = entityNPC;


        this.playerInventory = playerIn.inventory;
        this.entityInventory = new InventoryBasic("NPC Inventory", true, ContainerNPCInventory.VALID_EQUIPMENT_SLOTS.length);
        for (int index = 0; index < ContainerNPCInventory.VALID_EQUIPMENT_SLOTS.length; ++index) {
            this.entityInventory.setInventorySlotContents(index, entityNPC.getItemStackFromSlot(ContainerNPCInventory.VALID_EQUIPMENT_SLOTS[index]));
        }

        for (int index = 0; index < 4; ++index) {
            final EntityEquipmentSlot   equipmentSlot = ContainerNPCInventory.VALID_EQUIPMENT_SLOTS[index];

            this.addSlotToContainer(new Slot(this.entityInventory, index, 8, 8 + index * 18) {

                @Override
                public void onSlotChanged() {
                    entityNPC.setItemStackToSlot(equipmentSlot, this.getStack());
                    super.onSlotChanged();
                }

                @Override
                public boolean  isItemValid(@Nullable ItemStack stack) {
                    return (stack != null && stack.getItem().isValidArmor(stack, equipmentSlot, entityNPC));
                }

                @Override
                public int      getSlotStackLimit() {
                    return (1);
                }

                @Nullable
                @Override
                public String   getSlotTexture() {
                    return (ItemArmor.EMPTY_SLOT_NAMES[equipmentSlot.getIndex()]);
                }
            });
        }

        this.addSlotToContainer(new Slot(this.entityInventory, 4, 77,  {

            @Override
            public void onSlotChanged() {
                entityNPC.setItemStackToSlot(ContainerNPCInventory.VALID_EQUIPMENT_SLOTS[4], this.getStack());
                super.onSlotChanged();
            }
        });

        this.addSlotToContainer(new Slot(this.entityInventory, 5, 95,  {

            @Override
            public void onSlotChanged() {
                entityNPC.setItemStackToSlot(ContainerNPCInventory.VALID_EQUIPMENT_SLOTS[5], this.getStack());
                super.onSlotChanged();
            }

            @SideOnly(Side.CLIENT)
            @Nullable
            @Override
            public String   getSlotTexture() {
                return ("minecraft:items/empty_armor_slot_shield");
            }
        });

        for (int index = 0; index < 9; ++index) {
            this.addSlotToContainer(new Slot(this.playerInventory, index, 9 + index * 18, 112));
        }
    }

    @Override
    public boolean          canInteractWith(EntityPlayer playerIn) {
        return (true);
    }
}

 

It seems to work on multiplayer, I tested and I didn't have any crash. Also, the server stops correctly and restarts correctly with the correct equipement on the Entity.

 

One last question though: when putting a debug message in Slot#onSlotChanged() method, I noticed that this method was called multiple times, either client side or server side. Why is that ? And does it influence the Entity stats when I put the equipment once ? (like summing the armor stats because the method is called multiple times)

Squirrel ! Squirrel ! Squirrel !

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Did you check the getRenderShape method of your block to ensure it's returning the correct enum value?
    • new to messing with modpacks. the server starts and the pack is playable on personal worlds, but every time i try to enter the server, i get "internal exception: io.netty.handler.codec.DecoderException: java.lang.IllegalArgumentException: Payload may not be larger than 1048576 bytes" and it boots me. not sure what this means. the debug log is essentially gibberish to me and i'm not sure... about anything. is it saying that it's sending me too much data? if it helps at all, my mc username is "leucanella", and the disconnect reasons are near the very bottom (at least once was due to mismatched modlists, but i got that fixed i'm pretty sure). i just can't make sense of it myself. https://gist.github.com/idlebird/c5269e80434a501104f6b99ebc16be46
    • We somehow figured out the issue: Whenever we try to eat a food item from the mod "[Let's Do] Candlelight" that can be eaten multiple times using a feeding upgrade from "Sophisticated Backpacks", that's when we crash. Food items include: - Beef Wellington - Bolognese - Chicken Alfredo - Chicken with Vegetables - Cooked Beef - Fricasse with Hash Browns - Lasagna - Lettuce with Steak - Lettuce with Tomatoes, Potatoes and Carrots - Mushroom Soup - Pasta with Bolognese - Pasta with Tomato Sauce - Pork Ribs - Roastbeef with Carrots - Salmon with White Wine Sauce - Tomato Mozzarella Salad - Tomato Soup - Tropical Fish Supreme
    • Me and my sister are playing on a modded minecraft server, but recently she has been crashing at random intervals and no one I've talked with knows why. There's no crash report on my sister's side, but in the log of the server there appears a bunch of lines every time she crashes. They appear to be mostly similar with different mods changing each crash. Minecraft Version: 1.20.1 Forge version: forge-47.2.20 Server log: [07May2024 18:13:29.067] [Server thread/ERROR] [net.minecraftforge.eventbus.EventBus/EVENTBUS]: Exception caught during firing event: null     Index: 12     Listeners:         0: NORMAL         1: ASM: com.github.alexthe666.citadel.server.CitadelEvents@28c884eb onEntityUpdateDebug(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         2: net.minecraftforge.eventbus.EventBus$$Lambda$4374/0x00007f0098c72da0@10f79ae2         3: ASM: com.github.alexthe666.alexsmobs.event.ServerEvents@6f4126f3 onLivingUpdateEvent(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         4: ASM: class tallestegg.illagersweararmor.IWASpawnEvents tickEntity(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         5: ASM: class io.github.lightman314.lightmanscurrency.common.EventHandler entityTick(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         6: ASM: com.github.L_Ender.cataclysm.event.ServerEventHandler@1bbd60d8 onLivingUpdateEvent(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         7: ASM: class io.github.edwinmindcraft.apoli.common.ApoliPowerEventHandler playerTick(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         8: ASM: class io.github.edwinmindcraft.apoli.common.ApoliEventHandler livingTick(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         9: net.minecraftforge.eventbus.EventBus$$Lambda$4374/0x00007f0098c72da0@1e30768c         10: ASM: class net.mcreator.borninchaosv.init.EntityAnimationFactory onEntityTick(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         11: ASM: squeek.appleskin.network.SyncHandler@29e380f7 onLivingTickEvent(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V         12: ASM: top.theillusivec4.curios.common.event.CuriosEventHandler@55b4416c tick(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V java.lang.ArrayIndexOutOfBoundsException [07May2024 18:13:29.146] [Server thread/WARN] [net.minecraft.server.network.ServerConnectionListener/]: Failed to handle packet for /OMITTED IP net.minecraft.ReportedException: Ticking player     at net.minecraft.server.level.ServerPlayer.m_9240_(ServerPlayer.java:530) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.server.network.ServerGamePacketListenerImpl.m_9933_(ServerGamePacketListenerImpl.java:262) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.network.Connection.m_129483_(Connection.java:263) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.server.network.ServerConnectionListener.m_9721_(ServerConnectionListener.java:142) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.server.MinecraftServer.m_5703_(MinecraftServer.java:907) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.server.dedicated.DedicatedServer.m_5703_(DedicatedServer.java:283) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:814) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:661) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.20.1-20230612.114412-srg.jar%23461!/:?]     at java.lang.Thread.run(Thread.java:833) ~[?:?] Caused by: java.lang.ArrayIndexOutOfBoundsException Mod List: SecurityCraft v1.9.9.jar additional_lights-1.20.1-2.1.7.jar advancements_tracker_1.20.1-6.1.0.jar AI-Improvements-1.20-0.5.2.jar alexsdelight-1.5.jar alexsmobs-1.22.8.jar AmbientSounds_FORGE_v5.3.9_mc1.20.1.jar amendments-1.20-1.1.26.jar appleskin-forge-mc1.20.1-2.5.1.jar Aquaculture-1.20.1-2.5.1.jar aquaculture_delight_1.0.0_forge_1.20.1.jar architectury-9.2.14-forge.jar Arda's Sculks 1.3.2 [FORGE] [1.20.1].jar artifacts-forge-9.5.3.jar async-locator-forge-1.20-1.3.0.jar athena-forge-1.20.1-3.1.2.jar AttributeFix-Forge-1.20.1-21.0.4.jar BadOptimizations-2.1.1.jar badpackets-forge-0.4.3.jar balm-forge-1.20.1-7.2.2.jar beautify-2.0.2.jar BetterAdvancements-1.20.1-0.3.2.162.jar bettercombat-forge-1.8.5+1.20.1.jar BetterF3-7.0.2-Forge-1.20.1.jar betterfarmerscombat-1.2-1.20.1.jar BetterThirdPerson-Forge-1.20-1.9.0.jar BiomesOPlenty-1.20.1-18.0.0.598.jar Bookshelf-Forge-1.20.1-20.1.10.jar born_in_chaos_[Forge]1.20.1_1.2.jar Bountiful-6.0.3+1.20.1-forge.jar caelus-forge-3.2.0+1.20.1.jar camera-forge-1.20.1-1.0.8.jar canary-mc1.20.1-0.3.3.jar chat_heads-0.10.32-forge-1.20.jar Chimes-v2.0.1-1.20.1.jar Chipped-forge-1.20.1-3.0.6.jar chunksending-1.20.1-2.8.jar Chunky-1.3.136.jar citadel-2.5.4-1.20.1.jar cloth-config-11.1.118-forge.jar Clumps-forge-1.20.1-12.0.0.3.jar cluttered-2.1-1.20.1.jar connectedglass-1.1.11-forge-mc1.20.1.jar Controlling-forge-1.20.1-12.0.2.jar corpse-forge-1.20.1-1.0.12.jar cosmeticarmorreworked-1.20.1-v1a.jar CreativeCore_FORGE_v2.11.27_mc1.20.1.jar creeperoverhaul-3.0.2-forge.jar Croptopia-1.20.1-FORGE-3.0.4.jar ctia-1.20.1-forge-2.0.9.jar cupboard-1.20.1-2.6.jar curios-forge-5.9.0+1.20.1.jar CustomPlayerModels-1.20-0.6.16c.jar darktimer-forge-1.20.1-1.0.9.jar dotbe-1.20.1-1.5.5.jar dummmmmmy-1.20-1.8.14.jar DungeonsArise-1.20.x-2.1.58-release.jar DungeonsAriseSevenSeas-1.20.x-1.0.2-forge.jar dye_depot-1.0.0-forge.jar dynamiclights-v1.7.1-mc1.17x-1.20x-mod.jar easy_mob_farm_1.20.1-7.1.0.jar elevatorid-1.20.1-lex-1.9.jar embeddium-0.3.17+mc1.20.1-all.jar embeddiumplus-1.20.1-v1.2.8.jar emotecraft-for-MC1.20.1-2.2.7-b.build.50-forge.jar EnchantmentDescriptions-Forge-1.20.1-17.0.14.jar EnderMail-1.20.1-1.2.9.jar endermanoverhaul-forge-1.20.1-1.0.4.jar endersdelight-1.20.1-1.0.3.jar entityculling-forge-1.6.2-mc1.20.1.jar EpheroLib-1.20.1-FORGE-1.2.0.jar fantasyfurniture-1.20.1-9.0.0.jar FarmersDelight-1.20.1-1.2.4.jar farmersutils-1.0.5-1.20.1.jar Fastload-Reforged-mc1.20.1-3.4.0.jar fastpaintings-1.20-1.2.5.jar ferritecore-6.0.1-forge.jar friendsandfoes-forge-mc1.20.1-2.0.10.jar ftb-essentials-forge-2001.2.2.jar ftb-library-forge-2001.2.1.jar fusion-1.1.1-forge-mc1.20.1.jar geckolib-forge-1.20.1-4.4.4.jar getittogetherdrops-forge-1.20-1.3.jar handcrafted-forge-1.20.1-3.0.6.jar IllagerInvasion-v8.0.5-1.20.1-Forge.jar illagersweararmor-1.20.1-1.3.4.jar ImmediatelyFast-Forge-1.2.13+1.20.4.jar immersive_melodies-0.1.0+1.20.1-forge.jar Incendium_1.20.4_v5.3.4.jar Item_Obliterator-FORGE-MC1.20.1-1.7.0.jar Jade-1.20.1-forge-11.8.0.jar jei-1.20.1-forge-15.3.0.4.jar journeymap-1.20.1-5.9.20-forge.jar Kambrik-6.1.1+1.20.1-forge.jar kotlinforforge-4.10.0-all.jar L_Enders_Cataclysm-1.99.2 -1.20.1.jar LeavesBeGone-v8.0.0-1.20.1-Forge.jar letmedespawn-forge-1.20.x-1.2.0.jar letsdo-addon-compat-forge-v1.4.1.jar letsdo-API-forge-1.2.9-forge.jar letsdo-bakery-forge-1.1.8.jar letsdo-beachparty-forge-1.1.4-1.jar letsdo-brewery-forge-1.1.6.jar letsdo-candlelight-forge-1.2.11.jar letsdo-herbalbrews-forge-1.0.6.jar letsdo-meadow-forge-1.3.8.jar letsdo-nethervinery-forge-1.2.10.jar letsdo-vinery-forge-1.4.15.jar lightmanscurrency-1.20.1-2.2.1.3b.jar lionfishapi-1.8.jar magicvibedecorations-HALLOWEEN 1.5.0 1.20.1 forge.jar make_bubbles_pop-0.2.0-forge-mc1.19.4+.jar memoryleakfix-forge-1.17+-1.1.5.jar MobLassos-v8.0.1-1.20.1-Forge.jar modelfix-1.15.jar moonlight-1.20-2.11.14-forge.jar morediscs-1.20.1-33-forge.jar MouseTweaks-forge-mc1.20-2.25.jar Necronomicon-Forge-1.4.2.jar nether-s-exoticism-1.20.1-1.2.7.jar nethersdelight-1.20.1-4.0.jar nomowanderer-1.20.1_1.6.4.jar oculus-mc1.20.1-1.7.0.jar origins-forge-1.20.1-1.10.0.7-all.jar origins-plus-plus-2.2-forge.jar Paraglider-forge-20.1.3.jar Patchouli-1.20.1-84-FORGE.jar Paxi-1.20-Forge-4.0.jar Pehkui-3.8.0+1.20.1-forge.jar player-animation-lib-forge-1.0.2-rc1+1.20.jar PlayerRevive_FORGE_v2.0.24_mc1.20.1.jar plushies-1.4.0-forge.jar polymorph-forge-0.49.3+1.20.1.jar projectvibrantjourneys-1.20.1-6.0.0.jar PuzzlesLib-v8.1.18-1.20.1-Forge.jar resourcefulconfig-forge-1.20.1-2.1.2.jar resourcefullib-forge-1.20.1-2.1.24.jar right-click-harvest-3.2.3+1.20.1-forge.jar rubidium-extra-0.5.4.3+mc1.20.1-build.121.jar Runelic-Forge-1.20.1-18.0.2.jar saturn-mc1.20.1-0.1.3.jar sawmill-1.20-1.3.13.jar scholar-1.20.1-1.0.0-forge.jar screenshot_viewer-1.2.1-forge-mc1.20.1.jar Searchables-forge-1.20.1-1.0.2.jar selfexpression-2.8 1.20.1.jar servercore-forge-1.5.1+1.20.1.jar ShulkerArmory_1.20.1_1.2.1_hotfix.jar simplehats-forge-1.20.1-0.2.4.jar simplevoicechat_broadcast-mc1.20.1-1.0.1.jar simplyswords-forge-1.55.0-1.20.1.jar smoothboot(reloaded)-mc1.20.1-0.0.4.jar Sniffer+-forge-1.20.1-0.3.0.jar sophisticatedbackpacks-1.20.1-3.20.5.1044.jar sophisticatedcore-1.20.1-0.6.21.609.jar sophisticatedstorage-1.20.1-0.10.21.793.jar spark-1.10.53-forge.jar stalwart-dungeons-1.20.1-1.2.8.jar starlight-1.1.2+forge.1cda73c.jar step-1.20.1-1.2.2.jar supermartijn642corelib-1.1.17-forge-mc1.20.1.jar supplementaries-1.20-2.8.10.jar temporalapi-1.5.0.jar TerraBlender-forge-1.20.1-3.0.1.4.jar Terralith_1.20.4_v2.4.11.jar toms_storage-1.20-1.6.6.jar torchmaster-20.1.6.jar trashslot-forge-1.20-15.1.0.jar treasuredistance-1.20-1.2.jar tru.e-ending-v1.1.0c.jar v_slab_compat-1.20-2.3.jar vintagedelight-0.0.12.jar vmp-fabric-mc1.20.1-0.2.0+beta.7.101-all.jar voicechat-forge-1.20.1-2.5.11.jar waystones-forge-1.20-14.1.3.jar WI-Zoom-1.5-MC1.20.1-Forge.jar worldedit-mod-7.2.15.jar wsopulence1.2.0_Forge_MC1.20.1-1.20.4.jar xlpackets-1.18.2-2.1.jar YungsApi-1.20-Forge-4.0.4.jar YungsBetterEndIsland-1.20-Forge-2.0.6.jar YungsBetterNetherFortresses-1.20-Forge-2.0.6.jar YungsBetterOceanMonuments-1.20-Forge-3.0.4.jar YungsBetterStrongholds-1.20-Forge-4.0.3.jar
    • Like the title i wanted to render a obj model into minecraft but i cant find any tutorials for this.
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.