Jump to content

dyno

Members
  • Posts

    64
  • Joined

  • Last visited

Everything posted by dyno

  1. Please, you all are getting me confused. I just wanna make an item with Energy Capability(and lears something new), and the glowstone generatore should charge It. But please, I am new in modding, so try to don't get confused me. To make that item, what I should do? Last topic that said to attach AttachingCapabilitiesEvent, but I cannot did it And how I should check the Capability of item in the charge slot of Glowstone generator And I say again, if someone could give me some project, It would be easier. So I won't annoy anybody more. Anyway, thanks for support
  2. Could you give me link some project on gitHub, just to understand better? Thanks
  3. When Generator's charge slot contains a battery, crush SettableEnergyStorage: package com.olivemod.energy.SeattableEnergyStorage; import net.minecraftforge.energy.EnergyStorage; public class SettableEnergyStorage extends EnergyStorage{ public SettableEnergyStorage(final int capacity) { super(capacity); // TODO Auto-generated constructor stub } public SettableEnergyStorage(final int capacity, final int maxTransfer) { super(capacity, maxTransfer); // TODO Auto-generated constructor stub } public SettableEnergyStorage(final int capacity, final int maxReceive, final int maxExtract) { super(capacity, maxReceive, maxExtract); // TODO Auto-generated constructor stub } public SettableEnergyStorage(final int capacity, final int maxReceive, final int maxExtract, final int energy) { super(capacity, maxReceive, maxExtract, energy); // TODO Auto-generated constructor stub } //@Return the amount of energy was put into the storage @SuppressWarnings("unused") public int setEnergy(final int maxSet) { return this.energy = Math.min(this.capacity, maxSet); } } TEGenerator: package com.olivemod.blocks.machine.energy.generator.glowstone_generator; import javax.annotation.Nonnull; import com.olivemod.energy.SeattableEnergyStorage.CapabilityProviderEnergy; import com.olivemod.energy.SeattableEnergyStorage.SettableEnergyStorage; import com.olivemod.init.BlockInit; import com.olivemod.utils.ModTileEntityTypes; import com.sun.istack.internal.Nullable; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RangedWrapper; public class TileEntityGlowStoneGenerator extends TileEntity implements ITickableTileEntity, INamedContainerProvider { public static final int INPUT_SLOT = 0; public static final int OUTPUT_SLOT = 1; private int cookTime; private static final String INVENTORY_TAG = "inventory"; private static final String SMELT_TIME_LEFT_TAG = "smeltTimeLeft"; private static final String MAX_SMELT_TIME_TAG = "maxSmeltTime"; private static final String ENERGY_TAG = "energy"; public final ItemStackHandler inventory = new ItemStackHandler(2){ public boolean isItemValid(int slot, net.minecraft.item.ItemStack stack) { if(slot == INPUT_SLOT) return getEnergyFromItem(stack) > 0; else if(slot == OUTPUT_SLOT) return stack.getCapability(CapabilityEnergy.ENERGY) != null; return false; }; protected void onContentsChanged(int slot) { super.onContentsChanged(slot); //Make the tile entiy as having changed whenever its inventory changes //"markDirty()" tells game the chunk contaong tile entity has changed and it will save to disk later TileEntityGlowStoneGenerator.this.markDirty(); } }; public final SettableEnergyStorage energy = new SettableEnergyStorage(10000, 0, 1000); //Store the capability lazy optionals as field to keep the amout of object we use to a minium private final LazyOptional<ItemStackHandler> inventoryCapabilities = LazyOptional.of(() -> this.inventory); //Hoppers and Duct can connect to this generator's top to extract/insert items from Input Slot private final LazyOptional<IItemHandlerModifiable> InventorycapabilitiesUpAndSides = LazyOptional.of(() -> new RangedWrapper(inventory, INPUT_SLOT, INPUT_SLOT+1)); //Hoppers and duct can connect to this generator's bottom to extract/insert items from Output Slot private final LazyOptional<IItemHandlerModifiable> InventoryCapabilitiesDown = LazyOptional.of(() -> new RangedWrapper(inventory, OUTPUT_SLOT, OUTPUT_SLOT+1)); //Duct can connect to all side to extract energy private final LazyOptional<EnergyStorage> energyCapabilitiesExternal = LazyOptional.of(() -> this.energy); public short smeltTimeLeft = -1; public short maxSmeltTime = -1; @SuppressWarnings("unused") private int lastEnergy = -1; public TileEntityGlowStoneGenerator() { super(ModTileEntityTypes.GLOWSTONE_GENERATOR_TE.get()); } public TileEntityGlowStoneGenerator(TileEntityType<?> typeIn) { super(typeIn); } @Override public void tick() { if(world == null && world.isRemote) return; //This method will push out energy passing it to a wire/machine outputEnergy(); produceEnergy(); charge(); } private void charge() { ItemStack itemStack = this.inventory.getStackInSlot(1); if(!itemStack.isEmpty()) { if(this.energy.getEnergyStored() > 0) { IEnergyStorage storageToCharge = (IEnergyStorage) itemStack.getCapability(CapabilityEnergy.ENERGY); if(storageToCharge != null && storageToCharge.getEnergyStored() < storageToCharge.getMaxEnergyStored()) { int accepted = storageToCharge.receiveEnergy(10, false); this.energy.receiveEnergy(this.energy.getEnergyStored() - accepted, false); //let vanilla update chunk this.markDirty(); //Notify client of a block update //This will result in the packet from getUpdatePacket beong sent to the client //Energy will be synced //Flag 2 send change to client world.notifyBlockUpdate(pos, this.getBlockState(), this.getBlockState(), 2); //Update the last energy to the current lastEnergy = energy.getEnergyStored(); } } } } private void produceEnergy() { if(energy.getEnergyStored() < energy.getMaxEnergyStored()) { ItemStack input = inventory.getStackInSlot(0); if(!input.isEmpty() && getEnergyFromItem(input) > 0) { cookTime++; if(cookTime >= 25) { input.shrink(1); this.energy.setEnergy(this.energy.getEnergyStored() + getEnergyFromItem(input)); //let vanilla update chunk this.markDirty(); //Notify client of a block update //This will result in the packet from getUpdatePacket beong sent to the client //Energy will be synced //Flag 2 send change to client world.notifyBlockUpdate(pos, this.getBlockState(), this.getBlockState(), 2); //Update the last energy to the current lastEnergy = energy.getEnergyStored(); } } } } private int getEnergyFromItem(ItemStack input) { if(input.getItem() == Items.GLOWSTONE_DUST) return 200; else if(input.getItem() == Items.GLOWSTONE) return 1800; return 0; } private void outputEnergy() { if(energy.getEnergyStored() > 0) { for(Direction direction : Direction.values()) { if(world.getTileEntity(pos.offset(direction)) != null) { TileEntity tileEntity = world.getTileEntity(pos.offset(direction)); if(tileEntity.getCapability(CapabilityEnergy.ENERGY, direction.getOpposite()) != null) { IEnergyStorage storage = (IEnergyStorage) tileEntity.getCapability(CapabilityEnergy.ENERGY, direction.getOpposite()); if(storage.getEnergyStored() < storage.getMaxEnergyStored()) { int accepted = energy.extractEnergy(10, false); storage.receiveEnergy(accepted, false); //let vanilla update chunk this.markDirty(); //Notify client of a block update //This will result in the packet from getUpdatePacket beong sent to the client //Energy will be synced //Flag 2 send change to client world.notifyBlockUpdate(pos, this.getBlockState(), this.getBlockState(), 2); //Update the last energy to the current lastEnergy = energy.getEnergyStored(); } } } } } } @Override public <T> LazyOptional<T> getCapability(@Nullable final Capability<T> cap, @Nullable final Direction side) { if(cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { if(side == null) return inventoryCapabilities.cast(); else if(side != Direction.DOWN) return InventorycapabilitiesUpAndSides.cast(); else return InventoryCapabilitiesDown.cast(); } if(cap == CapabilityEnergy.ENERGY) return energyCapabilitiesExternal.cast(); return super.getCapability(cap, side); } /* * Handle a packet created in (@link #getUpdatePacket()) */ @Override public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { this.energy.setEnergy(pkt.getNbtCompound().getInt(ENERGY_TAG)); } @Override public void onLoad() { super.onLoad(); //Set this in onLoad instead of the constructor so that TileEntities constructed from NBT(saved tile entities) have this set to the proper value if(world != null && !world.isRemote) this.lastEnergy = this.energy.getEnergyStored(); } /* * Read saved data from disk into the tile entity */ @Override public void read(CompoundNBT compound) { super.read(compound); this.inventory.deserializeNBT(compound.getCompound(INVENTORY_TAG)); this.smeltTimeLeft = compound.getShort(SMELT_TIME_LEFT_TAG); this.maxSmeltTime = compound.getShort(MAX_SMELT_TIME_TAG); this.energy.setEnergy(compound.getInt(ENERGY_TAG)); } /* * Write data from tile entity into a compound for saving to disk */ @Nonnull @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); compound.put(INVENTORY_TAG, this.inventory.serializeNBT()); compound.putInt(ENERGY_TAG, this.energy.getEnergyStored()); compound.putShort(MAX_SMELT_TIME_TAG, this.maxSmeltTime); compound.putShort(SMELT_TIME_LEFT_TAG, smeltTimeLeft); return compound; } /* * Retrieves packet to send to the client whenever this Tile Entity is re-sinced via World#notifyBlockUpdate. * This packet comes back client-side via (@link #onDataPacket) */ @Nullable public SUpdateTileEntityPacket getUpdatePacket() { final CompoundNBT tag = new CompoundNBT(); tag.putInt(ENERGY_TAG, this.energy.getEnergyStored()); //We pass 0 for TileEntityTypesIn because we have a modded TE.See ClientPlayNetHandler#handlerUpdateTileEntity(SUpdateTileEntityPacket) return new SUpdateTileEntityPacket(this.pos, 0, tag); } /* * Get an NBT compount to sync to the client with SPacketChunkData, used to initial loading of the chunk or when many blocks change at once * This compound comes back to the client-side in (@link #handleUpdateTag) * The default implementation ({@link TileEntity#handleUpdateTag}) calls {@link #writeInternal)} * wich doesn't save any of our extra data so we override it to call {@link #write} instead */ @Nonnull public CompoundNBT getUpdateTag() { return this.write(new CompoundNBT()); } /* * Invalidates our Tile Entity */ @Override public void remove() { super.remove(); //We need to invalidate our capability references so that any cached references (by other mod) don't continue to reference our capablities //and try to use them and/or prevent them from being garbage collected inventoryCapabilities.invalidate(); energyCapabilitiesExternal.invalidate(); } @Nonnull @Override public Container createMenu(final int windowID, final PlayerInventory playerInventory, final PlayerEntity player) { return new GlowStoneGeneratorContainer(windowID, playerInventory, this); } @Override public ITextComponent getDisplayName() { return new TranslationTextComponent(BlockInit.GLOWSTONE_GENERATOR.get().getTranslationKey()); } } Battery package com.olivemod.items.battery; import com.olivemod.energy.SeattableEnergyStorage.CapabilityProviderEnergy; import com.olivemod.energy.SeattableEnergyStorage.SettableEnergyStorage; import com.olivemod.utils.Reference.Reference; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; public class Battery extends Item implements ICapabilitySerializable<CompoundNBT>{ private SettableEnergyStorage storage = new SettableEnergyStorage(2500, 100, 100); private final LazyOptional<EnergyStorage> energyCapabilitiesExternal = LazyOptional.of(() -> this.storage); private final ItemStack itemStack; public Battery(Properties properties) { super(properties); this.itemStack = new ItemStack(this); } @SubscribeEvent public void onAttachCapabilities(AttachCapabilitiesEvent<ItemStack> event){ if(event.getObject().hasTag()) { if(event.getObject().getTag().contains("Energy")) { event.addCapability(new ResourceLocation(Reference.MOD_ID + "battery"), new ICapabilityProvider() { @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if(cap == CapabilityEnergy.ENERGY) return energyCapabilitiesExternal.cast(); return null; } } ); } } else { event.getObject().setTag(new CompoundNBT()); } } @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if(cap == CapabilityEnergy.ENERGY) return energyCapabilitiesExternal.cast(); return null; } @Override public CompoundNBT serializeNBT() { if(!itemStack.hasTag()) itemStack.setTag(new CompoundNBT()); CompoundNBT nbt = itemStack.getTag(); assert nbt != null; nbt.putInt("Energy", this.storage.getEnergyStored()); return nbt; } @Override public void deserializeNBT(CompoundNBT nbt) { if(itemStack.hasTag()) this.storage.setEnergy(nbt.getInt("Energy")); } } Console: ---- Minecraft Crash Report ---- // There are four lights! Time: 19/05/20 9.35 Description: Ticking block entity java.lang.ClassCastException: net.minecraftforge.common.util.LazyOptional cannot be cast to net.minecraftforge.energy.IEnergyStorage at com.olivemod.blocks.machine.energy.generator.glowstone_generator.TileEntityGlowStoneGenerator.charge(TileEntityGlowStoneGenerator.java:111) ~[?:?] {re:classloading} at com.olivemod.blocks.machine.energy.generator.glowstone_generator.TileEntityGlowStoneGenerator.tick(TileEntityGlowStoneGenerator.java:102) ~[?:?] {re:classloading} at net.minecraft.world.World.func_217391_K(World.java:671) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.server.ServerWorld.tick(ServerWorld.java:370) ~[?:?] {re:classloading} at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:867) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:802) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[?:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:648) [?:?] {re:classloading,pl:accesstransformer:B} at java.lang.Thread.run(Thread.java:748) [?:1.8.0_231] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace: at com.olivemod.blocks.machine.energy.generator.glowstone_generator.TileEntityGlowStoneGenerator.charge(TileEntityGlowStoneGenerator.java:111) at com.olivemod.blocks.machine.energy.generator.glowstone_generator.TileEntityGlowStoneGenerator.tick(TileEntityGlowStoneGenerator.java:102) -- Block entity being ticked -- Details: Name: olivemod:glowstone_generator // com.olivemod.blocks.machine.energy.generator.glowstone_generator.TileEntityGlowStoneGenerator Block: Block{olivemod:glowstone_generator}[facing=north] Block location: World: (127,4,-196), Chunk: (at 15,0,12 in 7,-13; contains blocks 112,0,-208 to 127,255,-193), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1) Block: Block{olivemod:glowstone_generator}[facing=north] Block location: World: (127,4,-196), Chunk: (at 15,0,12 in 7,-13; contains blocks 112,0,-208 to 127,255,-193), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1) Stacktrace: at net.minecraft.world.World.func_217391_K(World.java:671) at net.minecraft.world.server.ServerWorld.tick(ServerWorld.java:370) -- Affected level -- Details: All players: 0 total; [] Chunk stats: ServerChunkCache: 2025 Level dimension: DimensionType{minecraft:overworld} Level name: New World Level seed: 7690030581214142000 Level generator: ID 01 - flat, ver 0. Features enabled: true Level generator options: {} Level spawn location: World: (128,4,-192), Chunk: (at 0,0,0 in 8,-12; contains blocks 128,0,-192 to 143,255,-177), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1) Level time: 941 game time, 941 day time Level storage version: 0x04ABD - Anvil Level weather: Rain time: 113334 (now: false), thunder time: 79221 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:867) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:802) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:648) at java.lang.Thread.run(Thread.java:748) -- System Details -- Details: Minecraft Version: 1.14.4 Minecraft Version ID: 1.14.4 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_231, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 2652407688 bytes (2529 MB) / 3642753024 bytes (3474 MB) up to 7635730432 bytes (7282 MB) CPUs: 4 JVM Flags: 2 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xmx8G ModLauncher: 4.1.0+62+5bfa59b ModLauncher launch target: fmluserdevclient ModLauncher naming: mcp ModLauncher services: /eventbus-1.0.0-service.jar eventbus PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar object_holder_definalize PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar runtime_enum_extender PLUGINSERVICE /accesstransformers-1.0.5-shadowed.jar accesstransformer PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar capability_inject_definalize PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar runtimedistcleaner PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar fml TRANSFORMATIONSERVICE FML: 28.2 Forge: net.minecraftforge:28.2.10 FML Language Providers: javafml@28.2 minecraft@1 Mod List: client-extra.jar Minecraft {minecraft@1.14.4 DONE} forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar Forge {forge@28.2.10 DONE} main Example Mod {olivemod@NONE DONE} Player Count: 0 / 8; [] Data Packs: vanilla, mod:forge, mod:olivemod Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'forge' Sorry for all topics I am creating in these days, I was learning in 1.12.2 and switch to 1.14.4 seems a nightmare. If someone could give me some gitHub'projects to learn from, too, would be great.
  4. I would post my code, if I had It. I have beginning looking for It since some hours. I have read doc, yet. But if you could link some example from gitHub or something else, I would thank you. If you cannot, thanks anyway
  5. Hello everyone! I would know how ti make an item(battery in this case) with Energy. I suppose to have to use ICapabilitySerializable<CompoundNBT> But It doesn't work. Maybe I am using It wrongly. Could someone sugget me how to do?
  6. I'm learning java in this period. I've been programming for 2 years, but just since January with OOP. I know to have a lot to learn about. Anyway,I have an error when I right click: Description: Unexpected error java.lang.NullPointerException: Unexpected error at com.olivemod.energy.generator.glowstone_generator.GlowStoneGenerator.createTileEntity(GlowStoneGenerator.java:178) ~[main/:?] {re:classloading} at net.minecraftforge.common.extensions.IForgeBlockState.createTileEntity(IForgeBlockState.java:149) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.world.chunk.Chunk.setBlockState(Chunk.java:291) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.world.World.setBlockState(World.java:214) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.item.BlockItem.placeBlock(BlockItem.java:149) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.item.BlockItem.tryPlace(BlockItem.java:57) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.item.BlockItem.onItemUse(BlockItem.java:42) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.item.ItemStack.lambda$onItemUse$0(ItemStack.java:169) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:184) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:169) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading} at net.minecraft.client.multiplayer.PlayerController.func_217292_a(PlayerController.java:310) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.rightClickMouse(Minecraft.java:1286) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.processKeyBinds(Minecraft.java:1544) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.runTick(Minecraft.java:1377) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:904) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.run(Minecraft.java:384) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.main.Main.main(Main.java:128) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] {} at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] {} at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] {} at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] {} at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-4.1.0.jar:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-4.1.0.jar:?] {} at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {} I tried with "return new TileEntity...()" in createTileEntity() and game crushes: ---- Minecraft Crash Report ---- // Why did you do that? Time: 15/05/20 19.22 Description: Ticking block entity java.lang.NullPointerException: Ticking block entity at net.minecraft.world.World.func_217391_K(World.java:670) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.server.ServerWorld.tick(ServerWorld.java:370) ~[?:?] {re:classloading} at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:867) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:802) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[?:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:648) [?:?] {re:classloading,pl:accesstransformer:B} at java.lang.Thread.run(Thread.java:748) [?:1.8.0_231] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace: at net.minecraft.world.World.func_217391_K(World.java:670) -- Block entity being ticked -- Details: Name: null // com.olivemod.energy.generator.glowstone_generator.TileEntityGlowStoneGenerator Block: Block{olivemod:glowstone_generator}[facing=north] Block location: World: (89,4,-36), Chunk: (at 9,0,12 in 5,-3; contains blocks 80,0,-48 to 95,255,-33), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1) Block: Block{olivemod:glowstone_generator}[facing=north] Block location: World: (89,4,-36), Chunk: (at 9,0,12 in 5,-3; contains blocks 80,0,-48 to 95,255,-33), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1) Stacktrace: at net.minecraft.world.World.func_217391_K(World.java:670) at net.minecraft.world.server.ServerWorld.tick(ServerWorld.java:370) -- Affected level -- Details: All players: 1 total; [ServerPlayerEntity['Dev'/199, l='New World', x=89.50, y=4.00, z=-37.50]] Chunk stats: ServerChunkCache: 2025 Level dimension: DimensionType{minecraft:overworld} Level name: New World Level seed: -8990482801704672408 Level generator: ID 01 - flat, ver 0. Features enabled: true Level generator options: {} Level spawn location: World: (80,4,-32), Chunk: (at 0,0,0 in 5,-2; contains blocks 80,0,-32 to 95,255,-17), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1) Level time: 1135 game time, 1135 day time Level storage version: 0x04ABD - Anvil Level weather: Rain time: 178155 (now: false), thunder time: 92761 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:867) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:802) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:648) at java.lang.Thread.run(Thread.java:748) -- System Details -- Details: Minecraft Version: 1.14.4 Minecraft Version ID: 1.14.4 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_231, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 691595152 bytes (659 MB) / 3164602368 bytes (3018 MB) up to 7635730432 bytes (7282 MB) CPUs: 4 JVM Flags: 2 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xmx8G ModLauncher: 4.1.0+62+5bfa59b ModLauncher launch target: fmluserdevclient ModLauncher naming: mcp ModLauncher services: /eventbus-1.0.0-service.jar eventbus PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar object_holder_definalize PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar runtime_enum_extender PLUGINSERVICE /accesstransformers-1.0.5-shadowed.jar accesstransformer PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar capability_inject_definalize PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar runtimedistcleaner PLUGINSERVICE /forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-launcher.jar fml TRANSFORMATIONSERVICE FML: 28.2 Forge: net.minecraftforge:28.2.10 FML Language Providers: javafml@28.2 minecraft@1 Mod List: client-extra.jar Minecraft {minecraft@1.14.4 DONE} forge-1.14.4-28.2.10_mapped_snapshot_20190719-1.14.3-recomp.jar Forge {forge@28.2.10 DONE} main Example Mod {olivemod@NONE DONE} Player Count: 1 / 8; [ServerPlayerEntity['Dev'/199, l='New World', x=89.50, y=4.00, z=-37.50]] Data Packs: vanilla, mod:forge, mod:olivemod Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'forge'
  7. I understood what you said about the block instance in constructor, but I don't understand "construct an instance". I am learning. So I should follow step by step Cadiboo's guide? I mean inside the class. I shouldn't register in that way.
  8. Some days ago I begun modding 1.14.4. I made a block with a tile entity and a container. But when I try to open GUI, nothing happens and no errors appear in console. I am follow Cadiboo's guide, I just change the register method(just wrote in the class of block) and it works, but not for tile entity. I tried to push item with a hopper and it doesn't take. Blockstate json missing for block Block package com.olivemod.energy.generator.glowstone_generator; import java.io.Console; import javax.annotation.Nonnull; import javax.annotation.Nullable; import com.google.common.base.Preconditions; import com.mojang.datafixers.DataFix; import com.mojang.datafixers.DataFixUtils; import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.DataFixerBuilder; import com.mojang.datafixers.types.Type; import com.olivemod.init.BlockInit; import com.olivemod.init.ModItemGroups; import com.olivemod.utils.ModTileEntityTypes; import com.olivemod.utils.Reference; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.HopperBlock; import net.minecraft.block.HorizontalBlock; import net.minecraft.block.material.Material; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.InventoryHelper; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.HopperTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.Mirror; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Rotation; import net.minecraft.util.SharedConstants; import net.minecraft.util.datafix.DataFixesManager; import net.minecraft.util.datafix.TypeReferences; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.registry.Registry; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.ToolType; import net.minecraftforge.common.extensions.IForgeContainerType; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.IForgeRegistryEntry; import net.minecraftforge.registries.RegistryBuilder; @EventBusSubscriber(modid = Reference.MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class GlowStoneGenerator extends HorizontalBlock{ protected static ItemGroup itemGroup; protected static String name; protected static Properties properties = Block.Properties.create(Material.IRON); protected static Block block; public GlowStoneGenerator(final String name, final ItemGroup itemGroup) { super(properties); this.setDefaultState(this.getDefaultState().with(HORIZONTAL_FACING, Direction.NORTH)); GlowStoneGenerator.name = name; GlowStoneGenerator.itemGroup = itemGroup; GlowStoneGenerator.block = new Block(properties).setRegistryName(new ResourceLocation(Reference.MOD_ID, name));; } @SubscribeEvent public static void onRegisterBlock(RegistryEvent.Register<Block> event) { event.getRegistry().register(block); } @SubscribeEvent public static void onRegisterBlockItem(RegistryEvent.Register<Item> event) { event.getRegistry().register(new BlockItem(block, new Item.Properties().group(itemGroup)).setRegistryName(new ResourceLocation(Reference.MOD_ID, name))); } @SuppressWarnings("deprecation") @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if(state != newState) { TileEntity tileEntity = worldIn.getTileEntity(pos); if(tileEntity instanceof TileEntityGlowStoneGenerator) { final ItemStackHandler inventory = ((TileEntityGlowStoneGenerator) tileEntity).inventory; for(int i = 0; i < inventory.getSlots(); i++) { InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), inventory.getStackInSlot(i)); } } } super.onReplaced(state, worldIn, pos, newState, isMoving); } @Override public boolean onBlockActivated( final BlockState state, final World worldIn, final BlockPos pos, final PlayerEntity player, final Hand handIn, final BlockRayTraceResult hit) { System.out.print("Block Activated"); LOGGER.debug("Activated"); if(!worldIn.isRemote) { System.out.print("Client"); final TileEntity tileEntity = worldIn.getTileEntity(pos); if(tileEntity instanceof TileEntityGlowStoneGenerator) { NetworkHooks.openGui((ServerPlayerEntity) player, (TileEntityGlowStoneGenerator)tileEntity, pos); System.out.print("Open"); } } return true; } //Make block faces player @Override public BlockState getStateForPlacement(BlockItemUseContext context) { return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); } //return redstone value calculated from inventory @SuppressWarnings("deprecation") @Override public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { final TileEntity tileEntity = worldIn.getTileEntity(pos); if(tileEntity instanceof TileEntityGlowStoneGenerator) { return ItemHandlerHelper.calcRedstoneFromInventory(((TileEntityGlowStoneGenerator)tileEntity).inventory); } return super.getComparatorInputOverride(blockState, worldIn, pos); } //Called from constructor //Add all properties to blockstate @Override protected void fillStateContainer(Builder<Block, BlockState> builder) { super.fillStateContainer(builder); builder.add(HORIZONTAL_FACING); } //return the blockstate with the given rotation from blockstate passed @Override public BlockState rotate(BlockState state, Rotation rot) { return state.with(HORIZONTAL_FACING, state.get(HORIZONTAL_FACING)); } //return the blockstate with the given mirror from blockstate passed @Override public BlockState mirror(BlockState state, Mirror mirrorIn) { return state.rotate(mirrorIn.toRotation(state.get(HORIZONTAL_FACING))); } @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return ModTileEntityTypes.GLOWSTONE_GENERATOR_TILE_ENTITY.create(); } @Override public boolean hasTileEntity(BlockState state) { // TODO Auto-generated method stub return true; } /** * This method will be called by Forge when it is time for the mod to register its TileEntityType. * This method will always be called after the Block and Item registry methods. */ @SubscribeEvent public static void onRegisterTileEntityTypes(@Nonnull final RegistryEvent.Register<TileEntityType<?>> event) { // Register your TileEntityTypes here if you have them event.getRegistry().registerAll( // We don't have a datafixer for our TileEntity, so we pass null into build setup(TileEntityType.Builder.create(TileEntityGlowStoneGenerator::new, BlockInit.GLOWSTONE_GENERATOR).build(null), "glowstone_generator") ); LOGGER.debug("Registered TileEntityTypes"); } /** * This method will be called by Forge when it is time for the mod to register its ContainerTypes. * This method will always be called after the Block and Item registry methods. */ @SubscribeEvent public static void onRegisterContainerTypes(@Nonnull final RegistryEvent.Register<ContainerType<?>> event) { // Register your ContainerTypes here if you have them event.getRegistry().registerAll( setup(IForgeContainerType.create(GlowStoneGeneratorContainer::new), "heat_collector") ); LOGGER.debug("Registered ContainerTypes"); } /** * Performs setup on a registry entry * * @param name The path of the entry's name. Used to make a name who's domain is our mod's modid */ @Nonnull private static <T extends IForgeRegistryEntry<T>> T setup(@Nonnull final T entry, @Nonnull final String name) { Preconditions.checkNotNull(name, "Name to assign to entry cannot be null!"); return setup(entry, new ResourceLocation(Reference.MOD_ID, name)); } /** * Performs setup on a registry entry * * @param registryName The full registry name of the entry */ @Nonnull private static <T extends IForgeRegistryEntry<T>> T setup(@Nonnull final T entry, @Nonnull final ResourceLocation registryName) { Preconditions.checkNotNull(entry, "Entry cannot be null!"); Preconditions.checkNotNull(registryName, "Registry name to assign to entry cannot be null!"); entry.setRegistryName(registryName); return entry; } } TileEntity package com.olivemod.energy.generator.glowstone_generator; import javax.annotation.Nonnull; import com.olivemod.energy.SeattableEnergyStorage.SettableEnergyStorage; import com.olivemod.init.BlockInit; import com.olivemod.utils.ModTileEntityTypes; import com.sun.istack.internal.Nullable; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RangedWrapper; public class TileEntityGlowStoneGenerator extends TileEntity implements ITickableTileEntity, INamedContainerProvider { public static final int INPUT_SLOT = 0; public static final int OUTPUT_SLOT = 1; private int cookTime; private static final String INVENTORY_TAG = "inventory"; private static final String SMELT_TIME_LEFT_TAG = "smeltTimeLeft"; private static final String MAX_SMELT_TIME_TAG = "maxSmeltTime"; private static final String ENERGY_TAG = "energy"; public final ItemStackHandler inventory = new ItemStackHandler(2){ public boolean isItemValid(int slot, net.minecraft.item.ItemStack stack) { if(slot == INPUT_SLOT) return getEnergyFromItem(stack) > 0; else if(slot == OUTPUT_SLOT) return stack.getCapability(CapabilityEnergy.ENERGY) != null; return false; }; protected void onContentsChanged(int slot) { super.onContentsChanged(slot); //Make the tile entiy as having changed whenever its inventory changes //"markDirty()" tells game the chunk contaong tile entity has changed and it will save to disk later TileEntityGlowStoneGenerator.this.markDirty(); } }; public final SettableEnergyStorage energy = new SettableEnergyStorage(10000, 0, 1000); //Store the capability lazy optionals as field to keep the amout of object we use to a minium private final LazyOptional<ItemStackHandler> inventoryCapabilities = LazyOptional.of(() -> this.inventory); //Hoppers and Duct can connect to this generator's top to extract/insert items from Input Slot private final LazyOptional<IItemHandlerModifiable> InventorycapabilitiesUpAndSides = LazyOptional.of(() -> new RangedWrapper(inventory, INPUT_SLOT, INPUT_SLOT+1)); //Hoppers and duct can connect to this generator's bottom to extract/insert items from Output Slot private final LazyOptional<IItemHandlerModifiable> InventoryCapabilitiesDown = LazyOptional.of(() -> new RangedWrapper(inventory, OUTPUT_SLOT, OUTPUT_SLOT+1)); //Duct can connect to all side to extract energy private final LazyOptional<EnergyStorage> energyCapabilitiesExternal = LazyOptional.of(() -> this.energy); public short smeltTimeLeft = -1; public short maxSmeltTime = -1; @SuppressWarnings("unused") private int lastEnergy = -1; public TileEntityGlowStoneGenerator() { super(ModTileEntityTypes.GLOWSTONE_GENERATOR_TILE_ENTITY); } @Override public void tick() { if(world == null && world.isRemote) return; //This method will push out energy passing it to a wire/machine outputEnergy(); produceEnergy(); } private void produceEnergy() { if(energy.getEnergyStored() < energy.getMaxEnergyStored()) { ItemStack input = inventory.getStackInSlot(0); if(!input.isEmpty() && getEnergyFromItem(input) > 0) { cookTime++; if(cookTime >= 25) { input.shrink(1); energy.receiveEnergy(getEnergyFromItem(input), false); //let vanilla update chunk this.markDirty(); //Notify client of a block update //This will result in the packet from getUpdatePacket beong sent to the client //Energy will be synced //Flag 2 send change to client world.notifyBlockUpdate(pos, this.getBlockState(), this.getBlockState(), 2); //Update the last energy to the current lastEnergy = energy.getEnergyStored(); } } } } private int getEnergyFromItem(ItemStack input) { if(input.getItem() == Items.GLOWSTONE_DUST) return 200; else if(input.getItem() == Items.GLOWSTONE) return 1800; return 0; } private void outputEnergy() { if(energy.getEnergyStored() > 0) { for(Direction direction : Direction.values()) { if(world.getTileEntity(pos.offset(direction)) != null) { TileEntity tileEntity = world.getTileEntity(pos.offset(direction)); if(tileEntity.getCapability(CapabilityEnergy.ENERGY, direction.getOpposite()) != null) { IEnergyStorage storage = (IEnergyStorage) tileEntity.getCapability(CapabilityEnergy.ENERGY, direction.getOpposite()); if(storage.getEnergyStored() < storage.getMaxEnergyStored()) { int accepted = energy.extractEnergy(10, false); storage.receiveEnergy(accepted, false); //let vanilla update chunk this.markDirty(); //Notify client of a block update //This will result in the packet from getUpdatePacket beong sent to the client //Energy will be synced //Flag 2 send change to client world.notifyBlockUpdate(pos, this.getBlockState(), this.getBlockState(), 2); //Update the last energy to the current lastEnergy = energy.getEnergyStored(); } } } } } } @Override public <T> LazyOptional<T> getCapability(@Nullable final Capability<T> cap, @Nullable final Direction side) { if(cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { if(side == null) return inventoryCapabilities.cast(); else if(side != Direction.DOWN) return InventorycapabilitiesUpAndSides.cast(); else return InventoryCapabilitiesDown.cast(); } if(cap == CapabilityEnergy.ENERGY) return energyCapabilitiesExternal.cast(); return super.getCapability(cap, side); } /* * Handle a packet created in (@link #getUpdatePacket()) */ @Override public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { this.energy.setEnergy(pkt.getNbtCompound().getInt(ENERGY_TAG)); } @Override public void onLoad() { super.onLoad(); //Set this in onLoad instead of the constructor so that TileEntities constructed from NBT(saved tile entities) have this set to the proper value if(world != null && !world.isRemote) this.lastEnergy = this.energy.getEnergyStored(); } /* * Read saved data from disk into the tile entity */ @Override public void read(CompoundNBT compound) { super.read(compound); this.inventory.deserializeNBT(compound.getCompound(INVENTORY_TAG)); this.smeltTimeLeft = compound.getShort(SMELT_TIME_LEFT_TAG); this.maxSmeltTime = compound.getShort(MAX_SMELT_TIME_TAG); this.energy.setEnergy(compound.getInt(ENERGY_TAG)); } /* * Write data from tile entity into a compound for saving to disk */ @Nonnull @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); compound.put(INVENTORY_TAG, this.inventory.serializeNBT()); compound.putInt(ENERGY_TAG, this.energy.getEnergyStored()); compound.putShort(MAX_SMELT_TIME_TAG, this.maxSmeltTime); compound.putShort(SMELT_TIME_LEFT_TAG, smeltTimeLeft); return compound; } /* * Retrieves packet to send to the client whenever this Tile Entity is re-sinced via World#notifyBlockUpdate. * This packet comes back client-side via (@link #onDataPacket) */ @Nullable public SUpdateTileEntityPacket getUpdatePacket() { final CompoundNBT tag = new CompoundNBT(); tag.putInt(ENERGY_TAG, this.energy.getEnergyStored()); //We pass 0 for TileEntityTypesIn because we have a modded TE.See ClientPlayNetHandler#handlerUpdateTileEntity(SUpdateTileEntityPacket) return new SUpdateTileEntityPacket(this.pos, 0, tag); } /* * Get an NBT compount to sync to the client with SPacketChunkData, used to initial loading of the chunk or when many blocks change at once * This compound comes back to the client-side in (@link #handleUpdateTag) * The default implementation ({@link TileEntity#handleUpdateTag}) calls {@link #writeInternal)} * wich doesn't save any of our extra data so we override it to call {@link #write} instead */ @Nonnull public CompoundNBT getUpdateTag() { return this.write(new CompoundNBT()); } /* * Invalidates our Tile Entity */ @Override public void remove() { super.remove(); //We need to invalidate our capability references so that any cached references (by other mod) don't continue to reference our capablities //and try to use them and/or prevent them from being garbage collected inventoryCapabilities.invalidate(); energyCapabilitiesExternal.invalidate(); } @Nonnull @Override public Container createMenu(final int windowID, final PlayerInventory playerInventory, final PlayerEntity player) { return new GlowStoneGeneratorContainer(windowID, playerInventory, this); } @Override public ITextComponent getDisplayName() { return new TranslationTextComponent(BlockInit.GLOWSTONE_GENERATOR.getTranslationKey()); } } Container package com.olivemod.energy.generator.glowstone_generator; import java.util.Objects; import javax.annotation.Nonnull; import com.olivemod.init.BlockInit; import com.olivemod.utils.FunctionalIntReferenceHolder; import com.olivemod.utils.ModContainerTypes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IWorldPosCallable; import net.minecraftforge.items.SlotItemHandler; /* * Smelt time is synced with: * Server: each tick {@link #detectAndSendChanges()} is called ({@link ServerPlayerEntity#tick()}) * * Server: The (tracked) value of the tile's energy is updated ({@link #updateprogressBar(int, int)}) * * Server: if the value is different from the value last sent to the client ({@link IntReferenceHolder#isDirty()}), * it is synced to the client ({@link ServerPlayerEntity#senWindowProperty(Container, int, int)}) * * Client: the sync packet is received ({@link ClientPlayNetHandler#handleWindowProperty(SWindowPropertyPacket)}) * and the tracked value of is updated ({@link Container#updateProgressBar(int, int)}) * * Client: the tile's data is updated to the new value */ public class GlowStoneGeneratorContainer extends Container { public final TileEntityGlowStoneGenerator tileEntity; private final IWorldPosCallable canInteractWithCallable; public GlowStoneGeneratorContainer(int windowID, PlayerInventory playerInventory, final PacketBuffer data) { this(windowID, playerInventory, getTileEntity(playerInventory, data)); } public GlowStoneGeneratorContainer(int windowID, PlayerInventory playerInventory, TileEntityGlowStoneGenerator tileEntity) { super(ModContainerTypes.GLOWSTONE_GENERATOR_CONTAINER, windowID); this.tileEntity = tileEntity; this.canInteractWithCallable = IWorldPosCallable.of(tileEntity.getWorld(), tileEntity.getPos()); //Add tracking for data (Syncs client/updates value when it changes) this.trackInt(new FunctionalIntReferenceHolder( () -> tileEntity.smeltTimeLeft, v -> tileEntity.smeltTimeLeft = (short) v)); this.trackInt(new FunctionalIntReferenceHolder(() -> tileEntity.maxSmeltTime, v -> tileEntity.maxSmeltTime = (short) v)); //Add all machine's tile entity's slot and player's //Machine this.addSlot(new SlotItemHandler(tileEntity.inventory, TileEntityGlowStoneGenerator.INPUT_SLOT, 44, 12)); this.addSlot(new SlotItemHandler(tileEntity.inventory, TileEntityGlowStoneGenerator.OUTPUT_SLOT, 132, 163)); final int playerInventoryStartX = 8; final int playerInventoryStartY = 84; final int sizeSlot = 18; //slot is 16*16, but we take care of 2px of spacing/border //Player's top inventory for(int x = 1; x < 4; x++) { for(int y = 1; y < 10; y++) { this.addSlot(new Slot(playerInventory, 9 + (x*9) + y, playerInventoryStartX + (y*sizeSlot), playerInventoryStartY + (x*sizeSlot))); } } final int playerHotbarY = playerInventoryStartY + sizeSlot*3 + 4; for(int i = 1; i < 10; i++) { this.addSlot(new Slot(playerInventory, i, playerInventoryStartX + (i*sizeSlot), playerHotbarY)); } } private static TileEntityGlowStoneGenerator getTileEntity(final PlayerInventory playerInventory, final PacketBuffer data) { Objects.requireNonNull(playerInventory, "Player Inventory can not be null"); Objects.requireNonNull(data, "Data can not be null"); final TileEntity tileEntity = playerInventory.player.world.getTileEntity(data.readBlockPos()); if(tileEntity instanceof TileEntityGlowStoneGenerator) return (TileEntityGlowStoneGenerator) tileEntity; throw new IllegalStateException("Tile Entity invalid at" + tileEntity); } @Nonnull @Override public ItemStack transferStackInSlot(final PlayerEntity player, final int index) { ItemStack returnStack = ItemStack.EMPTY; final Slot slot = this.inventorySlots.get(index); if (slot != null && slot.getHasStack()) { final ItemStack slotStack = slot.getStack(); returnStack = slotStack.copy(); final int containerSlots = this.inventorySlots.size() - player.inventory.mainInventory.size(); if (index < containerSlots) { if (!mergeItemStack(slotStack, containerSlots, this.inventorySlots.size(), true)) { return ItemStack.EMPTY; } } else if (!mergeItemStack(slotStack, 0, containerSlots, false)) { return ItemStack.EMPTY; } if (slotStack.getCount() == 0) { slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } if (slotStack.getCount() == returnStack.getCount()) { return ItemStack.EMPTY; } slot.onTake(player, slotStack); } return returnStack; } @Override public boolean canInteractWith(PlayerEntity playerIn) { return isWithinUsableDistance(canInteractWithCallable, playerIn, BlockInit.GLOWSTONE_GENERATOR); } } Screen package com.olivemod.energy.generator.glowstone_generator; import com.mojang.blaze3d.platform.GlStateManager; import com.olivemod.utils.Reference; import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.energy.EnergyStorage; public class GlowStoneGeneratorScreen extends ContainerScreen<GlowStoneGeneratorContainer>{ private final ResourceLocation guiLocation = new ResourceLocation(Reference.MOD_ID, "textures/gui/generators/glowstone_generator_gui"); public GlowStoneGeneratorScreen(GlowStoneGeneratorContainer screenContainer, PlayerInventory inv, ITextComponent titleIn) { super(screenContainer, inv, titleIn); } @Override public void render(final int mouseX, final int mouseY, final float partialTick) { this.renderBackground(); super.render(mouseX, mouseY, partialTick); this.renderHoveredToolTip(mouseX, mouseY); int relMouseX = mouseX - this.guiLeft; int relMouseY = mouseY - this.guiTop; final TileEntityGlowStoneGenerator tileEntityGlowStoneGenerator = this.container.tileEntity; boolean energyBarHovered = relMouseX > 150 && relMouseX < 170 && relMouseY > 4 && relMouseY < 81; if(energyBarHovered) { String toolTip = new TranslationTextComponent("gui." + Reference.MOD_ID + ".energy", tileEntityGlowStoneGenerator.energy.getEnergyStored()).getFormattedText(); this.renderTooltip(toolTip, mouseX, mouseY); } } @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { super.drawGuiContainerForegroundLayer(mouseX, mouseY); String string = this.title.getFormattedText(); this.font.drawString(string, (float)(this.xSize / 2 - this.font.getStringWidth(string) / 2), 6.0F, 0x404040); this.font.drawString(this.playerInventory.getDisplayName().getFormattedText(), 8.0F, (this.ySize - 96 + 2), 0x404040); } @Override protected void drawGuiContainerBackgroundLayer(final float partialTicks, final int mouseX, final int mouseY) { GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); getMinecraft().getTextureManager().bindTexture(guiLocation); int startX = this.guiLeft; int startY = this.guiTop; // Screen #blit draws a part of the current texture (assumed to be 256x256) to the screen // The parameters are (x, y, u, v, width, height) this.blit(startX, startY, 0, 0, this.xSize, this.ySize); final TileEntityGlowStoneGenerator tileEntityGlowStoneGenerator = container.tileEntity; if(tileEntityGlowStoneGenerator.energy.getEnergyStored() > 0) { this.blit(startX + 150, startY + 4 + 80 - getEnergyProgressScaled(), 177, 18, 17, 91 - getEnergyProgressScaled()); } if(tileEntityGlowStoneGenerator.smeltTimeLeft > 0) this.blit(startX + 68, startY + 30, 177, 0, 24 - getCookProgressScaled(), 17); } final TileEntityGlowStoneGenerator tileEntityGlowStoneGenerator = container.tileEntity; private int getCookProgressScaled() { if(tileEntityGlowStoneGenerator.maxSmeltTime <= 0 || tileEntityGlowStoneGenerator.smeltTimeLeft <= 0) return 0; return Math.round((float)tileEntityGlowStoneGenerator.smeltTimeLeft / (float)tileEntityGlowStoneGenerator.maxSmeltTime * 22); } private int getEnergyProgressScaled() { final EnergyStorage storage = tileEntityGlowStoneGenerator.energy; return Math.round((float)storage.getEnergyStored() / (float)storage.getMaxEnergyStored() * 74); } } TileEntityRender package com.olivemod.energy.generator.glowstone_generator; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.item.ItemStack; public class TileEntityGlowStoneGeneratorRenderer extends TileEntityRenderer<TileEntityGlowStoneGenerator> { /** * Render our TileEntity */ @Override public void render(final TileEntityGlowStoneGenerator tileEntityIn, final double x, final double y, final double z, final float partialTicks, final int destroyStage) { super.render(tileEntityIn, x, y, z, partialTicks, destroyStage); // Set up GL state RenderHelper.enableStandardItemLighting(); GlStateManager.pushMatrix(); // Translate to render pos. The 0.5 is to translate into the centre of the block, rather than to the corner of it GlStateManager.translated(x + 0.5, y, z + 0.5); // Translate to the place the item should be rendered (1/16 = the size of 1 pixel in the model) GlStateManager.translated(0, 1 / 16D, 0); // Render the item final ItemStack stackInInputSlot = tileEntityIn.inventory.getStackInSlot(TileEntityGlowStoneGenerator.INPUT_SLOT); Minecraft.getInstance().getItemRenderer().renderItem(stackInInputSlot, TransformType.FIXED); GlStateManager.popMatrix(); // Clean up GL state RenderHelper.disableStandardItemLighting(); } }
  9. Yes, I know. I had it in another device. I gave it right now.
  10. Hello everyone! When i put battery in generator's charge slot, others battery in inventory get It. It happens in the creative tab, too. Seems like they're a single item. I suppose to fail something in NBT package olivemod.items.BaseItemElectric.battery; import java.util.List; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTPrimitive; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagFloat; import net.minecraft.network.play.client.CPacketAnimation; import net.minecraft.util.EnumFacing; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability.IStorage; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.fml.common.registry.GameRegistry; import olivemod.Main; import olivemod.energy.CustomEnergyStorage; import olivemod.energy.item_energy.ItemEnergy; import olivemod.init.ItemInit; import olivemod.items.ItemBase; import olivemod.util.IHasModels; public class Battery extends ItemBase implements IEnergyStorage, IStorage<IEnergyStorage> { public static final Capability<IEnergyStorage> CAPABILITY_STORAGE = null; public CustomEnergyStorage storage = new CustomEnergyStorage(1000, 100, 100); private final int capacity; private final int maxReceive; private final int maxExtract; public Battery(String name, int capacity, int maxIn, int maxOut) { super(name); setHasSubtypes(true); setMaxStackSize(1); setNoRepair(); this.capacity = capacity; this.maxExtract = maxOut; this.maxReceive = maxIn; } @Override public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) { // TODO Auto-generated method stub return new ICapabilityProvider() { @Override public boolean hasCapability(Capability<?> capability, EnumFacing facing) { if(capability == CapabilityEnergy.ENERGY) return true; return false; } @Override public <T> T getCapability(Capability<T> capability, EnumFacing facing) { if(capability == CapabilityEnergy.ENERGY) return (T) CapabilityEnergy.ENERGY.cast(storage); return null; } }; } @Override public int receiveEnergy(int maxReceive, boolean simulate) { return 0; } @Override public int extractEnergy(int maxExtract, boolean simulate) { // TODO Auto-generated method stub return 0; } @Override public int getEnergyStored() { // TODO Auto-generated method stub return this.storage.getEnergyStored(); } @Override public int getMaxEnergyStored() { return this.storage.getMaxEnergyStored(); } @Override public boolean canExtract() { // TODO Auto-generated method stub return true; } @Override public boolean canReceive() { // TODO Auto-generated method stub return true; } @Override public boolean showDurabilityBar(ItemStack stack) { // TODO Auto-generated method stub return true; } @Override public double getDurabilityForDisplay(ItemStack stack) { if(isInCreativeTab(getCreativeTab())) return 1.0; if(stack.hasCapability(CapabilityEnergy.ENERGY, null)) { IEnergyStorage storage1 = stack.getCapability(CapabilityEnergy.ENERGY, null); return (double)(this.capacity / this.storage.getEnergyStored()); } return 0; } @Override public void addInformation(ItemStack stack, World worldIn, List<String> tooltip, ITooltipFlag flagIn) { tooltip.add(this.storage.getEnergyStored() + "/" + this.capacity); } @Override public NBTBase writeNBT(Capability<IEnergyStorage> capability, IEnergyStorage instance, EnumFacing side) { return new NBTTagFloat(instance.getEnergyStored()); } @Override public void readNBT(Capability<IEnergyStorage> capability, IEnergyStorage instance, EnumFacing side, NBTBase nbt) { instance.receiveEnergy((int) ((NBTPrimitive)nbt).getFloat(), false); } }
  11. Hello everyone! i would know how to begin with Energy and Fluid. I have read something about ForgeEnergy and made a glowstone generator, but now I can't make cable to transfer and how make a machine use energy. About Fluid System, I am stucked on, I don't know where begin from.
  12. Thanks for the answer. Could you suggest a guide to learn It? I am new in forge I would add energy transfer cable and storage Cell, too, and, obviously the Energy procucer and machines.
  13. Can someone tell me how import RF API to my custom mod to make machines work with RF?
  14. I've made a block with a GUI. When I right click it, GUI doesn't appear Block Container GUI TileEntity Gui Handler Register Handler TileEntity Handler
×
×
  • Create New...

Important Information

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