Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

mattbaker

Members
  • Joined

  • Last visited

Everything posted by mattbaker

  1. That works. Thanks you. private void setup(final FMLCommonSetupEvent event) { event.enqueueWork(() -> { GlobalEntityTypeAttributes.put(Registration.BANDIT.get(), BanditEntity.setCustomAttributes().create()); }); }
  2. 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
  3. 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.

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.