mattbaker
Members-
Posts
3 -
Joined
-
Last visited
mattbaker's Achievements
Tree Puncher (2/8)
0
Reputation
-
Spawn custom mob : Error executing task on Server
mattbaker replied to mattbaker's topic in Modder Support
That works. Thanks you. private void setup(final FMLCommonSetupEvent event) { event.enqueueWork(() -> { GlobalEntityTypeAttributes.put(Registration.BANDIT.get(), BanditEntity.setCustomAttributes().create()); }); } -
Hello, I update my mod from 1.15.2 (which works perfectly) to 1.16.4. In my mod, there are items to spawn different custom mobs. The problem is than they don't spawn and I have message like in the title :"Error executing task on Server" : [16:43:36] [Server thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Server java.lang.NullPointerException: null at net.minecraft.entity.ai.attributes.AttributeModifierManager.getAttributeValue(AttributeModifierManager.java:67) ~[forge:?] {re:classloading} at net.minecraft.entity.LivingEntity.getAttributeValue(LivingEntity.java:1849) ~[forge:?] {re:classloading} at net.minecraft.entity.LivingEntity.getMaxHealth(LivingEntity.java:1610) ~[forge:?] {re:classloading} at net.minecraft.entity.LivingEntity.<init>(LivingEntity.java:209) ~[forge:?] {re:classloading} at net.minecraft.entity.MobEntity.<init>(MobEntity.java:108) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.entity.CreatureEntity.<init>(CreatureEntity.java:13) ~[forge:?] {re:classloading} at net.mattbaker.guardscraft.enemies.bandit.BanditEntity.<init>(BanditEntity.java:39) ~[?:?] {re:classloading} at net.minecraft.entity.EntityType.create(EntityType.java:448) ~[forge:?] {re:classloading} at net.minecraft.entity.EntityType.create(EntityType.java:332) ~[forge:?] {re:classloading} at net.minecraft.entity.EntityType.spawn(EntityType.java:321) ~[forge:?] {re:classloading} at net.minecraft.entity.EntityType.spawn(EntityType.java:316) ~[forge:?] {re:classloading} at net.mattbaker.guardscraft.enemies.bandit.BanditSpawn.onItemUse(BanditSpawn.java:77) ~[?:?] {re:classloading} at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:613) ~[forge:?] {re:classloading} at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:191) ~[forge:?] {re:classloading} at net.minecraft.server.management.PlayerInteractionManager.func_219441_a(PlayerInteractionManager.java:359) ~[forge:?] {re:classloading} at net.minecraft.network.play.ServerPlayNetHandler.processTryUseItemOnBlock(ServerPlayNetHandler.java:986) ~[forge:?] {re:classloading} at net.minecraft.network.play.client.CPlayerTryUseItemOnBlockPacket.processPacket(CPlayerTryUseItemOnBlockPacket.java:45) ~[forge:?] {re:classloading} at net.minecraft.network.play.client.CPlayerTryUseItemOnBlockPacket.processPacket(CPlayerTryUseItemOnBlockPacket.java:12) ~[forge:?] {re:classloading} at net.minecraft.network.PacketThreadUtil.lambda$checkThreadAndEnqueue$0(PacketThreadUtil.java:19) ~[forge:?] {re:classloading} at net.minecraft.util.concurrent.TickDelayedTask.run(TickDelayedTask.java:20) ~[forge:?] {re:classloading} at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:139) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) ~[forge:?] {re:classloading} at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:758) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:159) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:109) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.driveOneInternal(MinecraftServer.java:741) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:735) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(ThreadTaskExecutor.java:97) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:720) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:667) ~[forge:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.lambda$startServer$0(MinecraftServer.java:233) ~[forge:?] {re:classloading,pl:accesstransformer:B} at java.lang.Thread.run(Thread.java:748) [?:1.8.0_271] {} Here my code for the item (based on SpawnEggItem.class) public class BanditSpawn extends Item { public BanditSpawn() { super(new Item.Properties().maxStackSize(1).group(GuardsCraft.setup.itemGroup)); } @Override public ActionResultType onItemUse(ItemUseContext context) { World world = context.getWorld(); if(!(world instanceof ServerWorld)) { return ActionResultType.SUCCESS; } else { ItemStack itemstack = context.getItem(); BlockPos blockpos = context.getPos(); Direction direction = context.getFace(); BlockState blockstate = world.getBlockState(blockpos); TileEntity tileentity = world.getTileEntity(blockpos); if(blockstate.isIn(Blocks.SPAWNER)) { if(tileentity instanceof MobSpawnerTileEntity) { AbstractSpawner abstractspawner = ((MobSpawnerTileEntity)tileentity).getSpawnerBaseLogic(); abstractspawner.setEntityType(Registration.BANDIT.get()); tileentity.markDirty(); world.notifyBlockUpdate(blockpos, blockstate, blockstate, 3); itemstack.shrink(1); return ActionResultType.CONSUME; } } BlockPos blockpos1; if(blockstate.getCollisionShape(world, blockpos).isEmpty()) { blockpos1 = blockpos; } else { blockpos1 = blockpos.offset(direction); } if(Registration.BANDIT.get().spawn((ServerWorld) world, itemstack, context.getPlayer(), blockpos1, SpawnReason.SPAWN_EGG, true, !Objects.equals(blockpos, blockpos1) && direction == Direction.UP) != null) { itemstack.shrink(1); } return ActionResultType.SUCCESS; } } } My Registration : public class Registration { private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, GuardsCraft.MOD_ID); public static void init() { ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus()); } public static final RegistryObject<EntityType<BanditEntity>> BANDIT = ENTITIES.register("bandit", () -> EntityType.Builder.create(BanditEntity::new, EntityClassification.CREATURE).setShouldReceiveVelocityUpdates(false).build("bandit")); public static final RegistryObject<BanditSpawn> BANDIT_EGG = ITEMS.register("bandit_egg", BanditSpawn::new); } Maybe more code if needed. Thanks. mattbaker
-
Hello, I try to open a GUI's custom mob when I right-click on him, but thats crashed directly : java.lang.NullPointerException: null at net.mattbaker.guardscraft.block.containerblock.TestContainer.addOwnSlots(TestContainer.java:52) ~[TestContainer.class:?] at net.mattbaker.guardscraft.block.containerblock.TestContainer.<init>(TestContainer.java:24) ~[TestContainer.class:?] at net.mattbaker.guardscraft.block.pedestal.ModGuiHandler.getServerGuiElement(ModGuiHandler.java:39) ~[ModGuiHandler.class:?] at net.mattbaker.guardscraft.block.pedestal.ModGuiHandler.getClientGuiElement(ModGuiHandler.java:69) ~[ModGuiHandler.class:?] at net.minecraftforge.fml.common.network.NetworkRegistry.getLocalGuiContainer(NetworkRegistry.java:276) ~[NetworkRegistry.class:?] at net.minecraftforge.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:111) ~[FMLNetworkHandler.class:?] at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2809) ~[EntityPlayer.class:?] at net.mattbaker.guardscraft.marchand.EntityMarchand.processInteract(EntityMarchand.java:95) ~[EntityMarchand.class:?] at net.minecraft.entity.EntityLiving.processInitialInteract(EntityLiving.java:1355) ~[EntityLiving.class:?] at net.minecraft.entity.player.EntityPlayer.interactOn(EntityPlayer.java:1299) ~[EntityPlayer.class:?] at net.minecraft.client.multiplayer.PlayerControllerMP.interactWithEntity(PlayerControllerMP.java:587) ~[PlayerControllerMP.class:?] at net.minecraft.client.Minecraft.rightClickMouse(Minecraft.java:1682) ~[Minecraft.class:?] at net.minecraft.client.Minecraft.processKeyBinds(Minecraft.java:2381) ~[Minecraft.class:?] at net.minecraft.client.Minecraft.runTickKeyboard(Minecraft.java:2147) ~[Minecraft.class:?] at net.minecraft.client.Minecraft.runTick(Minecraft.java:1935) ~[Minecraft.class:?] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1188) ~[Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:442) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_201] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_201] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_201] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_201] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_201] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_201] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_201] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_201] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:25) [start/:?] [16:07:18] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:629]: ---- Minecraft Crash Report ---- // Hey, that tickles! Hehehe! Time: 1/23/19 4:07 PM Description: Unexpected error java.lang.NullPointerException: Unexpected error at net.mattbaker.guardscraft.block.containerblock.TestContainer.addOwnSlots(TestContainer.java:52) at net.mattbaker.guardscraft.block.containerblock.TestContainer.<init>(TestContainer.java:24) at net.mattbaker.guardscraft.block.pedestal.ModGuiHandler.getServerGuiElement(ModGuiHandler.java:39) at net.mattbaker.guardscraft.block.pedestal.ModGuiHandler.getClientGuiElement(ModGuiHandler.java:69) at net.minecraftforge.fml.common.network.NetworkRegistry.getLocalGuiContainer(NetworkRegistry.java:276) at net.minecraftforge.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:111) at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2809) at net.mattbaker.guardscraft.marchand.EntityMarchand.processInteract(EntityMarchand.java:95) at net.minecraft.entity.EntityLiving.processInitialInteract(EntityLiving.java:1355) at net.minecraft.entity.player.EntityPlayer.interactOn(EntityPlayer.java:1299) at net.minecraft.client.multiplayer.PlayerControllerMP.interactWithEntity(PlayerControllerMP.java:587) at net.minecraft.client.Minecraft.rightClickMouse(Minecraft.java:1682) at net.minecraft.client.Minecraft.processKeyBinds(Minecraft.java:2381) at net.minecraft.client.Minecraft.runTickKeyboard(Minecraft.java:2147) at net.minecraft.client.Minecraft.runTick(Minecraft.java:1935) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1188) at net.minecraft.client.Minecraft.run(Minecraft.java:442) at net.minecraft.client.main.Main.main(Main.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:25) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Client thread Stacktrace: at net.mattbaker.guardscraft.block.containerblock.TestContainer.addOwnSlots(TestContainer.java:52) at net.mattbaker.guardscraft.block.containerblock.TestContainer.<init>(TestContainer.java:24) at net.mattbaker.guardscraft.block.pedestal.ModGuiHandler.getServerGuiElement(ModGuiHandler.java:39) at net.mattbaker.guardscraft.block.pedestal.ModGuiHandler.getClientGuiElement(ModGuiHandler.java:69) at net.minecraftforge.fml.common.network.NetworkRegistry.getLocalGuiContainer(NetworkRegistry.java:276) at net.minecraftforge.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:111) at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2809) at net.mattbaker.guardscraft.marchand.EntityMarchand.processInteract(EntityMarchand.java:95) at net.minecraft.entity.EntityLiving.processInitialInteract(EntityLiving.java:1355) at net.minecraft.entity.player.EntityPlayer.interactOn(EntityPlayer.java:1299) at net.minecraft.client.multiplayer.PlayerControllerMP.interactWithEntity(PlayerControllerMP.java:587) at net.minecraft.client.Minecraft.rightClickMouse(Minecraft.java:1682) at net.minecraft.client.Minecraft.processKeyBinds(Minecraft.java:2381) at net.minecraft.client.Minecraft.runTickKeyboard(Minecraft.java:2147) The GUI comes from a tutorial to create and open this GUI, but with a block, and this code works. I you put all classes to know if there is a mistake : The Container : package net.mattbaker.guardscraft.block.containerblock; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.SlotItemHandler; public class TestContainer extends Container { private TestContainerTileEntity te; public TestContainer(IInventory playerInventory, TestContainerTileEntity te) { this.te = te; // This container references items out of our own inventory (the 9 slots we hold ourselves) // as well as the slots from the player inventory so that the user can transfer items between // both inventories. The two calls below make sure that slots are defined for both inventories. addOwnSlots(); addPlayerSlots(playerInventory); } private void addPlayerSlots(IInventory playerInventory) { // Slots for the main inventory for(int row = 0; row < 3; ++row) { for(int col = 0; col < 9; ++col) { int x = 9 + col * 18; int y = row * 18 + 70; this.addSlotToContainer(new Slot(playerInventory, col + row * 9 + 10, x, y)); } } // Slots for the hotbar for(int row = 0; row < 9; ++row) { int x = 9 + row * 18; int y = 58 + 70; this.addSlotToContainer(new Slot(playerInventory, row, x, y)); } } private void addOwnSlots() { IItemHandler itemHandler = this.te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); int x = 9; int y = 6; // Add our own slots int slotIndex = 0; for (int i = 0; i < itemHandler.getSlots(); i++) { addSlotToContainer(new SlotItemHandler(itemHandler, slotIndex, x, y)); slotIndex++; x += 18; } } @Override public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); if(slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if(index < TestContainerTileEntity.SIZE) { if(!this.mergeItemStack(itemstack1, TestContainerTileEntity.SIZE, this.inventorySlots.size(), true)) { return ItemStack.EMPTY; } } else if (!this.mergeItemStack(itemstack1, 0, TestContainerTileEntity.SIZE, false)) { return ItemStack.EMPTY; } if (itemstack1.isEmpty()) { slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } } return itemstack; } @Override public boolean canInteractWith(EntityPlayer playerIn) { return te.canInteractWith(playerIn); } } The original block which serves of base for my mob and which works : package net.mattbaker.guardscraft.block.containerblock; import net.mattbaker.guardscraft.GuardsCraft; import net.mattbaker.guardscraft.block.BlockBase; import net.mattbaker.guardscraft.block.pedestal.ModGuiHandler; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.INpc; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TestContainerBlock extends Block implements ITileEntityProvider//, net.minecraft.entity.monster.IMob { public static final int GUI_ID = 1; protected String name; /* public TestContainerBlock(Material material, String unlocalizedName, String registryName) { this(material, SoundType.STONE, unlocalizedName, registryName); } //Constructeur (Avec le son en plus). public TestContainerBlock(Material material, SoundType sound, String unlocalizedName, String registryName) { //"super()" permet d'appeler un constructeur parent." super(material); //Fonction utilisée pour les fichiers de langues. setUnlocalizedName(GuardsCraft.MODID + "." + unlocalizedName); //Fonction qui enregistre l'objet auprès de Forge avec un ID unique. setRegistryName(registryName); //Fonction qui place le bloc dans la table "TUTORIAL_TAB" (En Creative). setCreativeTab(GuardsCraft.TUTORIAL_TAB); //Fonction qui change le son. setSoundType(sound); } */ /* public TestContainerBlock() { super(Material.ROCK); setUnlocalizedName(GuardsCraft.MODID + ".testcontainerblock"); setRegistryName("testcontainerblock"); } */ public TestContainerBlock(String name) { super(Material.ROCK); //super(Material.ROCK, name); } public TestContainerBlock(Material material, String name) { super(material); this.name = name; setUnlocalizedName(name); setRegistryName(name); } public TestContainerBlock(Material material, String name, BlockPos position) { super(material); this.name = name; setUnlocalizedName(name); setRegistryName(name); } public void registerItemModel(Item itemBlock) { GuardsCraft.proxy.registerItemRenderer(itemBlock, 0, name); } public Item createItemBlock() { return new ItemBlock(this).setRegistryName(getRegistryName()); } @Override public TestContainerBlock setCreativeTab(CreativeTabs tab) { super.setCreativeTab(tab); return this; } @SideOnly(Side.CLIENT) public void initModel() { ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory")); } @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TestContainerTileEntity(); } @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { //TestContainerBlock test = new TestContainerBlock(); //BlockPos testPos = new BlockPos(playerIn); if(worldIn.isRemote) { /* System.out.println("Interaction avec le bloc : "); System.out.println("GuardsCraft.instance : " + GuardsCraft.instance); System.out.println("world : " + worldIn); System.out.println("this.getPosition().getX() : " + pos.getX()); System.out.println("this.getPosition().getY() : " + pos.getY()); System.out.println("this.getPosition().getZ() : " + pos.getZ()); playerIn.sendMessage(new TextComponentString("testContainerBlock : ")); playerIn.sendMessage(new TextComponentString("GuardsCraft.instance : " + GuardsCraft.instance)); */ /* playerIn.sendMessage(new TextComponentString("testPos.getX() : " + testPos.getX())); playerIn.sendMessage(new TextComponentString("testPos.getY() : " + testPos.getY())); playerIn.sendMessage(new TextComponentString("testPos.getZ() : " + testPos.getZ())); */ /* playerIn.sendMessage(new TextComponentString("world : " + worldIn)); playerIn.sendMessage(new TextComponentString("pos.getX() : " + pos.getX())); playerIn.sendMessage(new TextComponentString("pos.getY() : " + pos.getY())); playerIn.sendMessage(new TextComponentString("pos.getZ() : " + pos.getZ())); */ //X : "151" Y : "81" Z : "255" //playerIn.openGui(GuardsCraft.instance, GUI_ID, worldIn, 151, 81, 254); //playerIn.openGui(GuardsCraft.instance, 1, worldIn, testPos.getX(), testPos.getY(), testPos.getZ()); playerIn.openGui(GuardsCraft.instance, 1, worldIn, pos.getX(), pos.getY(), pos.getZ()); //playerIn.openGui(GuardsCraft.instance, ModGuiHandler.PEDESTAL, worldIn, pos.getX(), pos.getY(), pos.getZ()); //Only execute on the server /* if (worldIn.isRemote) { return true; } TileEntity te = worldIn.getTileEntity(pos); if(!(te instanceof TestContainerTileEntity)) { return false; } */ //return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); return true; } else { return false ;} } } The GuiContainer : package net.mattbaker.guardscraft.block.containerblock; import net.mattbaker.guardscraft.GuardsCraft; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.util.ResourceLocation; public class TestContainerGui extends GuiContainer { public static final int WIDTH = 180; public static final int HEIGHT = 152; private static final ResourceLocation background = new ResourceLocation(GuardsCraft.MODID, "textures/gui/testcontainer.png"); public TestContainerGui(TestContainerTileEntity tileEntity, TestContainer container) { super(container); xSize = WIDTH; ySize = HEIGHT; } private InventoryPlayer playerInv; public TestContainerGui(Container container, InventoryPlayer playerInv) { super(container); this.playerInv = playerInv; } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { mc.getTextureManager().bindTexture(background); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); } } The TileEntity : package net.mattbaker.guardscraft.block.containerblock; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemStackHandler; public class TestContainerTileEntity extends TileEntity { public static final int SIZE = 9; // This item handler will hold our nine inventory slots private ItemStackHandler itemStackHandler = new ItemStackHandler(SIZE) { @Override protected void onContentsChanged(int slot) { // We need to tell the tile entity that something has changed so // that the chest contents is persisted TestContainerTileEntity.this.markDirty(); } }; @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); if (compound.hasKey("items")) { itemStackHandler.deserializeNBT((NBTTagCompound) compound.getTag("items")); } } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setTag("items", itemStackHandler.serializeNBT()); return compound; } public boolean canInteractWith(EntityPlayer playerIn) { // If we are too far away from this tile entity you cannot use it return !isInvalid() && playerIn.getDistanceSq(pos.add(0.5D, 0.5D, 0.5D)) <= 64D; } @Override public boolean hasCapability(Capability<?> capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return true; } return super.hasCapability(capability, facing); } @Override public <T> T getCapability(Capability<T> capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(itemStackHandler); } return super.getCapability(capability, facing); } } The IGuiHandler : package net.mattbaker.guardscraft.block.pedestal; import net.mattbaker.guardscraft.block.containerblock.TestContainer; import net.mattbaker.guardscraft.block.containerblock.TestContainerGui; import net.mattbaker.guardscraft.block.containerblock.TestContainerTileEntity; import net.mattbaker.guardscraft.block.furnace.ContainerAlloyFurnace; import net.mattbaker.guardscraft.block.furnace.GuiAlloyFurnace; import net.mattbaker.guardscraft.block.furnace.TileEntityAlloyFurnace; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.IGuiHandler; public class ModGuiHandler implements IGuiHandler { public static final int PEDESTAL = 0; public static final int CONTAINER = 1; public static final int ALLOY_FURNACE = 2; @Override public Container getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case PEDESTAL : return new ContainerPedestal(player.inventory, (TileEntityPedestal)world.getTileEntity(new BlockPos(x, y, z))); case CONTAINER : BlockPos pos = new BlockPos(x, y, z); TileEntity te = world.getTileEntity(pos); if(te instanceof TestContainerTileEntity) { return new TestContainer(player.inventory, (TestContainerTileEntity) te); } case ALLOY_FURNACE : return new ContainerAlloyFurnace(player.inventory, (TileEntityAlloyFurnace) world.getTileEntity(new BlockPos(x, y, z))); default : return null; } } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch (ID) { case PEDESTAL : return new GuiPedestal(getServerGuiElement(ID, player, world, x, y, z), player.inventory); //return new GuiPedestal(getServerGuiElement(ID, player, world, x, y, z)); case CONTAINER : BlockPos pos = new BlockPos(x, y, z); TileEntity te = world.getTileEntity(pos); if(te instanceof TestContainerTileEntity) { TestContainerTileEntity containerTileEntity = (TestContainerTileEntity) te; return new TestContainerGui(containerTileEntity, new TestContainer(player.inventory, containerTileEntity)); } case ALLOY_FURNACE : return new GuiAlloyFurnace(getServerGuiElement(ID, player, world, x, y, z), player.inventory); default : return null; } } } The mob : package net.mattbaker.guardscraft.merchant; import javax.annotation.Nullable; //import javax.annotation.Nullable; import net.mattbaker.guardscraft.GuardsCraft; import net.mattbaker.guardscraft.block.containerblock.TestContainerTileEntity; import net.mattbaker.guardscraft.block.pedestal.BlockPedestal; import net.mattbaker.guardscraft.block.pedestal.ModGuiHandler; import net.mattbaker.guardscraft.block.pedestal.TileEntityPedestal; import net.mattbaker.guardscraft.weirdzombie.EntityWeirdZombie; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.*; import net.minecraft.entity.passive.EntityZombieHorse; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.pathfinding.PathNavigate; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; public class EntityMerchant extends EntityMob implements ITileEntityProvider { public static final int GUI_ID = 1; public static final ResourceLocation LOOT = new ResourceLocation(GuardsCraft.MODID, "entities/soldat"); public EntityMerchant(World worldIn) { super(worldIn); setSize(0.6F, 1.95F); } public EntityMerchant setCreativeTab(CreativeTabs tab) { //super.setCreativeTab(tab); return this; } public Class<TestContainerTileEntity> getTileEntityClass() { return TestContainerTileEntity.class; } @Nullable public TestContainerTileEntity createTileEntity(World world, IBlockState state) { return new TestContainerTileEntity(); } @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TestContainerTileEntity(); } @Override public boolean processInteract(EntityPlayer player, EnumHand hand) { if(this.getEntityWorld().isRemote) { player.sendMessage(new TextComponentString("Interaction with the merchant : ")); player.sendMessage(new TextComponentString("GuardsCraft.instance : " + GuardsCraft.instance)); player.sendMessage(new TextComponentString("world : " + world)); player.sendMessage(new TextComponentString("this.getPosition().getX() : " + this.getPosition().getX())); player.sendMessage(new TextComponentString("this.getPosition().getY() : " + this.getPosition().getY())); player.sendMessage(new TextComponentString("this.getPosition().getZ() : " + this.getPosition().getZ())); player.openGui(GuardsCraft.instance, 1, this.getEntityWorld(), this.getPosition().getX(), this.getPosition().getY(), this.getPosition().getZ()); //player.openGui(GuardsCraft.instance, 1, this.getEntityWorld(), 0, 0, 0); //player.openGui(GuardsCraft.instance, GUI_ID, world, this.chunkCoordX, this.chunkCoordY, this.chunkCoordZ); //player.openGui(GuardsCraft.instance, GUI_ID, world, 153, 81, 251); //return super.processInteract(player, hand); return true; } else { return false; } } @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); // Here we set various attributes for our mob. Like maximum health, armor, speed, ... this.getEntityAttribute(SharedMonsterAttributes.FOLLOW_RANGE).setBaseValue(35.0D); this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.35D); this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(3.0D); this.getEntityAttribute(SharedMonsterAttributes.ARMOR).setBaseValue(2.0D); } //Fonction qui regroupe les actions possibles du mob. @Override protected void initEntityAI() { //this.getTileEntity(world, pos); //this.getTileEntityClass(); this.tasks.addTask(0, new EntityAISwimming(this)); //this.tasks.addTask(2, new EntityAISoldatAttack(this, 1.0D, false)); //this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); //this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(8, new EntityAILookIdle(this)); this.applyEntityAI(); } //Fonction qui cible les ennemis. private void applyEntityAI() { //this.tasks.addTask(6, new EntityAIMoveThroughVillage(this, 1.0D, false)); //this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true, new Class[]{EntityPigZombie.class})); //Tue les zombies. //this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<EntityZombie>(this, EntityZombie.class, true)); //Tue les araignées. //this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<EntityCaveSpider>(this, EntityCaveSpider.class, true)); //Tue les chevaux-zombies. //this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<EntityZombieHorse>(this, EntityZombieHorse.class, true)); //Tue les creepers. //this.targetTasks.addTask(1, new EntityAINearestAttackableTarget<EntityCreeper>(this, EntityCreeper.class, true)); //Tue les endermen. //this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<EntityEnderman>(this, EntityEnderman.class, true)); //Tue les squelettes. //this.targetTasks.addTask(3, new EntityAINearestAttackableTarget<EntitySkeleton>(this, EntitySkeleton.class, true)); //Tue les weird zombies. //this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<EntityWeirdZombie>(this, EntityWeirdZombie.class, true)); } @Override //@Nullable protected ResourceLocation getLootTable() { return LOOT; } @Override protected PathNavigate createNavigator(World worldIn) { // TODO Auto-generated method stub return super.createNavigator(worldIn); } } The main class : package net.mattbaker.guardscraft; import net.mattbaker.guardscraft.events.MyForgeEventHandler; import net.mattbaker.guardscraft.item.ModItems; import net.mattbaker.guardscraft.network.PacketRequestUpdatePedestal; import net.mattbaker.guardscraft.network.PacketUpdatePedestal; import net.mattbaker.guardscraft.proxy.ClientProxy; //import net.mattbaker.guardscraft.init.ModItems_autre; import net.mattbaker.guardscraft.proxy.CommonProxy; import net.mattbaker.guardscraft.proxy.IProxy; import net.mattbaker.guardscraft.proxy.ServerProxy; import net.mattbaker.guardscraft.recipes.TutorialRecipes; //import net.mattbaker.guardscraft.soldat.EntitySoldat; import net.mattbaker.guardscraft.tabs.TutorialTab; import net.mattbaker.guardscraft.util.ModEntities; import net.mattbaker.guardscraft.world.gen.TutorialWorldGen; import net.mattbaker.guardscraft.block.containerblock.GuiProxy; import net.mattbaker.guardscraft.block.furnace.GuiHandler; import net.mattbaker.guardscraft.block.pedestal.ModGuiHandler; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; //import net.minecraft.init.Blocks; //import net.minecraft.world.World; import net.minecraft.item.Item; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import org.apache.logging.log4j.core.Logger; @Mod(modid = GuardsCraft.MODID, name = GuardsCraft.NAME, version = GuardsCraft.VERSION) public class GuardsCraft { //Doit être "guardscraft" et non "GuardsCraft". public static final String MODID = "guardscraft"; public static final String NAME = "GuardsCraft"; public static final String VERSION = "1.0"; public static final String MC_VERSION = "[1.12.2]"; public static final String CLIENT = "net.mattbaker.guardscraft.proxy.ClientProxy"; public static final String SERVER = "net.mattbaker.guardscraft.proxy.ServerProxy"; //Ajoute une instance de la table "TUTORIAL_TAB". public static final CreativeTabs TUTORIAL_TAB = new TutorialTab("tabTutorialMod"); @Mod.Instance public static GuardsCraft instance; @SidedProxy(clientSide = GuardsCraft.CLIENT, serverSide = GuardsCraft.SERVER) public static CommonProxy proxy; private static Logger logger; public static SimpleNetworkWrapper network; @EventHandler public void preInit(FMLPreInitializationEvent event) { logger = (Logger) event.getModLog(); proxy.preInit(event); //Appels pour le zombie modifié et le soldat. //ModEntities.init(); //ModEntities.initModels(); //Four //NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); //Pedestal NetworkRegistry.INSTANCE.registerGuiHandler(this, new ModGuiHandler()); //ContainerBlock //NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiProxy()); //Le dernier "NetworkRegistry.INSTANCE.registerGuiHandler()" gagne. network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID); network.registerMessage(new PacketUpdatePedestal.Handler(), PacketUpdatePedestal.class, 0, Side.CLIENT); network.registerMessage(new PacketRequestUpdatePedestal.Handler(), PacketRequestUpdatePedestal.class, 1, Side.SERVER); proxy.registerRenderers(); } @EventHandler public void init(FMLInitializationEvent event) { // some example code //logger.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); //Item.ToolMaterial; //Appel de la fonction de la classe TutorialRecipes pour le four. //TutorialRecipes.initSmelting(); //Appel de la fonction pour la génération de "minerai". //GameRegistry.registerWorldGenerator(new TutorialWorldGen(), 0); proxy.init(event); } @EventHandler public void postInit(FMLPostInitializationEvent event) { //MinecraftForge.EVENT_BUS.register(new MyForgeEventHandler()); proxy.postInit(event); } @Mod.EventBusSubscriber public static class RegistrationHandler { @SubscribeEvent public static void registerItems(RegistryEvent.Register<Item> event) { ModItems.register(event.getRegistry()); } @SubscribeEvent public static void registerItems(ModelRegistryEvent event) { ModItems.registerModels(); } } } I have too tried to open a GUI with an item, but this is the same thing : a crash. Tell me if you need more informations, I searched since 3 weeks, this which explains why there are so codes lines in comments. Regards.