TileEntity type XXX$TileEntityCustom has throw an exception trying to write state. It will not persist.



  • Bonjour
    Je voulais créer un bloc basique qui émet de la lumière et j'ai cette erreur:

    [18:35:27] [Server thread/ERROR] [FML]: A TileEntity type fr.alatrick.admintoolmod.mcreator_megaTorch$TileEntityCustom has throw an exception trying to write state. It will not persist. Report this to the mod author
    java.lang.RuntimeException: class fr.alatrick.admintoolmod.mcreator_megaTorch$TileEntityCustom is missing a mapping! This is a bug!
    	at net.minecraft.tileentity.TileEntity.writeInternal(TileEntity.java:89) ~[TileEntity.class:?]
    	at net.minecraft.tileentity.TileEntity.writeToNBT(TileEntity.java:80) ~[TileEntity.class:?]
    	at net.minecraft.tileentity.TileEntityLockable.writeToNBT(TileEntityLockable.java:22) ~[TileEntityLockable.class:?]
    	at fr.alatrick.admintoolmod.mcreator_megaTorch$TileEntityCustom.writeToNBT(mcreator_megaTorch.java:165) ~[mcreator_megaTorch$TileEntityCustom.class:?]
    	at net.minecraft.world.chunk.storage.AnvilChunkLoader.writeChunkToNBT(AnvilChunkLoader.java:414) [AnvilChunkLoader.class:?]
    	at net.minecraft.world.chunk.storage.AnvilChunkLoader.saveChunk(AnvilChunkLoader.java:185) [AnvilChunkLoader.class:?]
    	at net.minecraft.world.gen.ChunkProviderServer.saveChunkData(ChunkProviderServer.java:214) [ChunkProviderServer.class:?]
    	at net.minecraft.world.gen.ChunkProviderServer.saveChunks(ChunkProviderServer.java:242) [ChunkProviderServer.class:?]
    	at net.minecraft.world.WorldServer.saveAllChunks(WorldServer.java:2730) [WorldServer.class:?]
    	at org.spongepowered.common.world.WorldManager.saveWorld(WorldManager.java:564) [WorldManager.class:?]
    	at net.minecraft.server.MinecraftServer.saveAllWorlds(MinecraftServer.java:4113) [MinecraftServer.class:?]
    	at net.minecraft.server.MinecraftServer.constant$getSaveTickInterval$zjo000(MinecraftServer.java:4065) [MinecraftServer.class:?]
    	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:762) [MinecraftServer.class:?]
    	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592) [MinecraftServer.class:?]
    	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
    

    Comme je code coté plugin que je maîtrise pas trop Forge? c'est un logiciel qui a généré le code:

    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.fml.relauncher.SideOnly;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.common.registry.GameRegistry;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    import net.minecraftforge.client.model.ModelLoader;
    import net.minecraftforge.client.event.ModelRegistryEvent;
    
    import net.minecraft.world.World;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.util.NonNullList;
    import net.minecraft.util.EnumBlockRenderType;
    import net.minecraft.util.BlockRenderLayer;
    import net.minecraft.tileentity.TileEntityLockableLoot;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.ItemBlock;
    import net.minecraft.item.Item;
    import net.minecraft.inventory.ItemStackHelper;
    import net.minecraft.inventory.InventoryHelper;
    import net.minecraft.inventory.ContainerDispenser;
    import net.minecraft.inventory.Container;
    import net.minecraft.entity.player.InventoryPlayer;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.client.renderer.block.model.ModelResourceLocation;
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.block.material.Material;
    import net.minecraft.block.SoundType;
    import net.minecraft.block.ITileEntityProvider;
    import net.minecraft.block.Block;
    
    import java.io.File;
    
    public class mcreator_megaTorch extends admintoolmod.ModElement {
    
    	@GameRegistry.ObjectHolder("admintoolmod:megatorch")
    	public static final Block block = null;
    
    	public mcreator_megaTorch(admintoolmod instance) {
    		super(instance);
    		instance.blocks.add(() -> new BlockCustom());
    		instance.items.add(() -> new ItemBlock(block).setRegistryName(block.getRegistryName()));
    	}
    
    	@Override
    	public void init(FMLInitializationEvent event) {
    		GameRegistry.registerTileEntity(TileEntityCustom.class, "admintoolmod:tileentitymegatorch");
    	}
    
    	@SideOnly(Side.CLIENT)
    	@Override
    	public void registerModels(ModelRegistryEvent event) {
    		ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, new ModelResourceLocation("admintoolmod:megatorch", "inventory"));
    	}
    
    	public static class BlockCustom extends Block implements ITileEntityProvider {
    
    		public BlockCustom() {
    			super(Material.WOOD);
    			setRegistryName("megatorch");
    			setUnlocalizedName("megatorch");
    			setSoundType(SoundType.WOOD);
    			setHarvestLevel("pickaxe", 1);
    			setHardness(2F);
    			setResistance(10F);
    			setLightLevel(1F);
    			setLightOpacity(255);
    			setCreativeTab(mcreator_adminToolMod.tab);
    		}
    
    		@SideOnly(Side.CLIENT)
    		@Override
    		public BlockRenderLayer getBlockLayer() {
    			return BlockRenderLayer.SOLID;
    		}
    
    		@Override
    		public TileEntity createNewTileEntity(World worldIn, int meta) {
    			return new TileEntityCustom();
    		}
    
    		@Override
    		public boolean eventReceived(IBlockState state, World worldIn, BlockPos pos, int eventID, int eventParam) {
    			super.eventReceived(state, worldIn, pos, eventID, eventParam);
    			TileEntity tileentity = worldIn.getTileEntity(pos);
    			return tileentity == null ? false : tileentity.receiveClientEvent(eventID, eventParam);
    		}
    
    		@Override
    		public EnumBlockRenderType getRenderType(IBlockState state) {
    			return EnumBlockRenderType.MODEL;
    		}
    
    		@Override
    		public void breakBlock(World world, BlockPos pos, IBlockState state) {
    			TileEntity tileentity = world.getTileEntity(pos);
    			InventoryHelper.dropInventoryItems(world, pos, (TileEntityCustom) tileentity);
    			world.removeTileEntity(pos);
    			super.breakBlock(world, pos, state);
    		}
    
    		@Override
    		public boolean hasComparatorInputOverride(IBlockState state) {
    			return true;
    		}
    
    		@Override
    		public int getComparatorInputOverride(IBlockState blockState, World worldIn, BlockPos pos) {
    			TileEntity tileentity = worldIn.getTileEntity(pos);
    			if (tileentity instanceof TileEntityCustom)
    				return Container.calcRedstoneFromInventory((TileEntityCustom) tileentity);
    			else
    				return 0;
    		}
    	}
    
    	public static class TileEntityCustom extends TileEntityLockableLoot {
    
    		private NonNullList<ItemStack> stacks = NonNullList.<ItemStack> withSize(9, ItemStack.EMPTY);
    
    		@Override
    		public int getSizeInventory() {
    			return 9;
    		}
    
    		@Override
    		public boolean isEmpty() {
    			for (ItemStack itemstack : this.stacks)
    				if (!itemstack.isEmpty())
    					return false;
    			return true;
    		}
    
    		@Override
    		public boolean isItemValidForSlot(int index, ItemStack stack) {
    			return true;
    		}
    
    		@Override
    		public ItemStack getStackInSlot(int slot) {
    			return stacks.get(slot);
    		}
    
    		@Override
    		public String getName() {
    			return this.hasCustomName() ? this.customName : "container.megatorch";
    		}
    
    		@Override
    		public void readFromNBT(NBTTagCompound compound) {
    			super.readFromNBT(compound);
    			this.stacks = NonNullList.<ItemStack> withSize(this.getSizeInventory(), ItemStack.EMPTY);
    			if (!this.checkLootAndRead(compound))
    				ItemStackHelper.loadAllItems(compound, this.stacks);
    			if (compound.hasKey("CustomName", 8))
    				this.customName = compound.getString("CustomName");
    		}
    
    		@Override
    		public NBTTagCompound writeToNBT(NBTTagCompound compound) {
    			super.writeToNBT(compound);
    			if (!this.checkLootAndWrite(compound))
    				ItemStackHelper.saveAllItems(compound, this.stacks);
    			if (this.hasCustomName())
    				compound.setString("CustomName", this.customName);
    			return compound;
    		}
    
    		@Override
    		public int getInventoryStackLimit() {
    			return 64;
    		}
    
    		@Override
    		public String getGuiID() {
    			return "admintoolmod:megatorch";
    		}
    
    		@Override
    		public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) {
    			this.fillWithLoot(playerIn);
    			return new ContainerDispenser(playerInventory, this);
    		}
    
    		@Override
    		protected NonNullList<ItemStack> getItems() {
    			return this.stacks;
    		}
    	}
    }
    
    

    Quelqu'un sait pourquoi j'ai ce problème ? Je n'ai pas réussi a le résoudre depuis plusieurs heures. J'ai lu que la TileEntity ne serait pas "déclaré", mais il le fait ligne 48
    Pour mon plugin j'ai besoin d'une TileEntity 😢


  • Moddeurs confirmés Rédacteurs Administrateurs

    Bonsoir,

    MCreator est un très mauvais logiciel générant un code erroné, ça ne m'étonnerait pas que ta fonction init ligne 47 ne sont en réalité jamais appelé (d'où le problème).

    Donc soit tu trouves comment déboguer ça (bonne chance) soit tu reprends ton code au propre dans un IDE et ça sera probablement plus simple pour déboguer.



  • En fait je génère le code et je le mets dans IntelliJ et je le modifie, ça m'aide car je code plus des plugins Sponge et quand j'ai besoin d'un item juste pour l'apparence en gros je prends ce MCreator genre pour mettre le jour j'ai un item avec une texture de soleil et c'est bien mieux qu'un bâton^^.

    J'ai besoin de cette TileEntity pour stocker des choses dans le bloc si je peux pas je suis obligé de le faire en conf et c'est assez lourd


  • Moddeurs confirmés Rédacteurs Administrateurs

    Dans ce cas il te reste à trouver pourquoi init n'est pas appelé.
    Mais franchement tu ferais mieux de ne pas utiliser mcreator, car il risque de te causer d'autres soucis.



  • J'ai mit ce code dans l'event FMLPreInitializationEvent de la main class et plus de problème on dirait:
    GameRegistry.registerTileEntity(mcreator_megaTorch.TileEntityCustom.class, "admintoolmod:tileentitymegatorch");

    Je code pas sur forge malheureusement et j'ai pas trop le temps d'apprendre déja que parfois je galère sur Sponge. A moins que quelqu'un me recode tout. Je paye^^.
    Il y a mieux que mcreator?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Il y a mieux que mcreator?

    Développer soi-même le mod. C'est la seule meilleur chose qu'il y a.



  • J’essaierais de regarder cela comme je fais tout coté serveur(même les craft) l’intérêt du mod c'est surtout d'avoir de nouveau item avec une nouvelle texture pour savoir directement en les voyants a quoi ils servent d'ou ma feignantise d'apprendre a coder sur Forge.
    Ca ne devrait pas être difficile a refaire si j'ai un code d'exemple a modifier.

    PS:
    D’ailleurs quand je pose un bloc créé par ce logiciel j'ai pas de Keys.DIRECTION de disponible sur Sponge ce qui est assez embêtant. Je suppose que le bloc doit déclarer cela, mais jamais comprit comment faire:

    Sponge requires block implementations to reveal the key/values available. It does not discover them automatically.
    
    You will need to implement the necessary MixinBlock / IMixinBlock methods.
    See MixinBlockFurnace as an example of a block with a direction: https://github.com/SpongePowered/SpongeCommon/blob/a9423c7ec9f2b423b52c273f7e7a23818a8f3e41/src/main/java/org/spongepowered/common/mixin/core/block/MixinBlockFurnace.java#L69
    

    Donc c'est pas au mod d'implémenter cela ? Je suis pas très bon en anglais


  • Moddeurs confirmés Rédacteurs Administrateurs

    Visiblement il faut implémenter l'interface IMixinBlock et y implémenter la méthode getStateWithValue.


Log in to reply