Posted October 3, 20186 yr Since I am using ItemHandlers I am not able to communicate using te.getField(int). Please provide an alternative to this problem. My Gui is working properly, just that I am not able to test whether the funace is active or not. TileEntityGemEnchanter.class public class TileEntityGemEnchanter extends TileEntityBase implements ITickable, ICapabilityProvider { private ItemStackHandler inventory = new ItemStackHandler(4); private DynamicEnergyStorage energy = new DynamicEnergyStorage(1000000); private boolean isEnchanting; private int enchantingTime; private int currentItemEnchantTime; private int enchantTime; private int shouldEnchantTime = 50; private String enchanterCustomName; private int counter = 0; @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setTag("inventory", inventory.serializeNBT()); energy.writeToNBT(compound); compound.setInteger("enchantTime", this.enchantTime); compound.setInteger("currentItemEnchantTime", this.currentItemEnchantTime); compound.setInteger("enchantingTime", this.enchantingTime); compound.setInteger("shouldEnchantTime", this.shouldEnchantTime); compound.setBoolean("isEnchanting", this.isEnchanting); if (this.hasCustomName()) { compound.setString("enchanterCustomName", this.enchanterCustomName); } return compound; } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); inventory.deserializeNBT(compound.getCompoundTag("inventory")); energy.readFromNBT(compound); this.enchantTime = compound.getInteger("enchantTime"); this.currentItemEnchantTime = compound.getInteger("currentItemEnchantTime"); this.enchantingTime = compound.getInteger("enchantingTime"); this.shouldEnchantTime = compound.getInteger("shouldEnchantTime"); this.isEnchanting = compound.getBoolean("isEnchanting"); if (compound.hasKey("CustomName", 8)) { this.enchanterCustomName = compound.getString("CustomName"); } } public boolean isEmpty() { for (int i = 0; i > this.inventory.getSlots(); i++) { if (!this.inventory.getStackInSlot(i).isEmpty()) { return false; } } return true; } public ItemStack decrStackSize(int index, int count) { return index >= 0 && index < this.inventory.getSlots() && !((ItemStack) this.inventory.getStackInSlot(index)).isEmpty() && count > 0 ? ((ItemStack) this.inventory.getStackInSlot(index)).splitStack(count) : ItemStack.EMPTY; } public ItemStack removeStackFromSlot(int index) { if (index >= 0 && index < this.inventory.getSlots()) { this.inventory.setStackInSlot(index, ItemStack.EMPTY); return ItemStack.EMPTY; } return ItemStack.EMPTY; } public String getName() { return this.hasCustomName() ? this.enchanterCustomName : "container.enchanter"; } public boolean hasCustomName() { return this.enchanterCustomName != null && !this.enchanterCustomName.isEmpty(); } public void setCustomInventoryName(String name) { this.enchanterCustomName = name; } public void setInventorySlotContents(int index, ItemStack stack) { ItemStack itemstack = this.inventory.getStackInSlot(index); boolean flag = !stack.isEmpty() && stack.isItemEqual(itemstack) && ItemStack.areItemStackTagsEqual(stack, itemstack); this.inventory.setStackInSlot(index, stack); if (stack.getCount() > 64) { stack.setCount(64); } if (index == 0 && !flag) { this.markDirty(); } } public ItemStack getStackInSlot(int index) { return this.inventory.getStackInSlot(index); } @Override public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) { return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || capability == CapabilityEnergy.ENERGY || super.hasCapability(capability, facing); } @Nullable @Override public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return (T) this.inventory; else if (capability == CapabilityEnergy.ENERGY) return (T) this.energy; else return super.getCapability(capability, facing); } public boolean isEnchanting() { return isEnchanting; } @Override public void update() { if (!this.world.isRemote) { List<EntityItem> items = new ArrayList<EntityItem>(); items.addAll(world.getEntitiesWithinAABB(EntityItem.class, new AxisAlignedBB(pos.add(3, 3, 3), pos.add(-3, -3, -3)))); for (EntityItem item : items) { if (item.getItem().getItem() == Items.STICK) { Utils.getLogger().info("Added Power!"); this.energy.receiveEnergy(1000, false); } } if (this.canSmelt()) { this.currentItemEnchantTime = getEnchantTime(this.inventory.getStackInSlot(0), this.inventory.getStackInSlot(1)); this.shouldEnchantTime = this.currentItemEnchantTime; this.isEnchanting = true; this.smeltItem(); } else { this.enchantTime = 0; this.currentItemEnchantTime = 0; this.enchantingTime = 0; this.shouldEnchantTime = 0; this.isEnchanting = false; } } this.markDirty(); } public int getEnchantTime(ItemStack stack, ItemStack stack2) { return 50; } /** * Returns true if the furnace can smelt an item, i.e. has a source item, * destination stack isn't full, etc. */ private boolean canSmelt() { ItemStack slot0 = this.inventory.getStackInSlot(0); ItemStack slot1 = this.inventory.getStackInSlot(1); ItemStack slot2 = this.inventory.getStackInSlot(2); boolean canSmelt = false; if (!(slot0.isEmpty() && slot1.isEmpty())) { ItemStack recipes = GemEnchanterRecipes.instance().getEnchantingResult(slot0, slot1); if (recipes != ItemStack.EMPTY) { if (((slot2.getItem() == recipes.getItem() && slot2.getCount() < slot2.getItem().getItemStackLimit(slot2)) || slot2.isEmpty()) && this.energy.getEnergyStored() > 10) { canSmelt = true; } } } return canSmelt; } public void smeltItem() { ItemStack slot0 = this.inventory.getStackInSlot(0); ItemStack slot1 = this.inventory.getStackInSlot(1); ItemStack result = GemEnchanterRecipes.instance().getEnchantingResult(slot0, slot1); ItemStack slot2 = this.inventory.getStackInSlot(2); if (this.isEnchanting()) { if (this.enchantTime >= this.getShouldEnchantTime()) { slot0.shrink(1); slot1.shrink(1); if (slot2.isEmpty() || slot2.getItem() == Item.getItemFromBlock(Blocks.AIR)) { this.inventory.setStackInSlot(2, result.copy()); } else { slot2.grow(result.getCount()); } } else { this.enchantTime++; this.energy.extractEnergy(10, false); } } } public int getEnchantingTime() { return this.enchantingTime; } public void setEnchantingTime(int enchantingTime) { this.enchantingTime = enchantingTime; } public int getCurrentItemEnchantTime() { return this.currentItemEnchantTime; } public void setCurrentItemEnchantTime(int currentItemEnchantTime) { this.currentItemEnchantTime = currentItemEnchantTime; } public int getEnchantTime() { return this.enchantTime; } public void setEnchantTime(int enchantTime) { this.enchantTime = enchantTime; } public int getShouldEnchantTime() { return this.shouldEnchantTime; } public void setShouldEnchantTime(int shouldEnchantTime) { this.shouldEnchantTime = shouldEnchantTime; } public void setEnchanting(boolean isEnchanting) { this.isEnchanting = isEnchanting; } public boolean isItemValidForSlot(int index, ItemStack stack) { return index == 1 || index == 2; } } GuiGemEnchanter.class public class GuiGemEnchanter extends GuiContainer{ private TileEntityGemEnchanter te; private IInventory playerInv; public GuiGemEnchanter(InventoryPlayer playerInv, TileEntityGemEnchanter te) { super(new ContainerGemEnchanter(playerInv, te)); this.xSize = 175; this.ySize = 165; this.te = te; this.playerInv = playerInv; } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MOD_ID, "textures/gui/container/gem_enchanter.png")); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize); int s = 0; if(!this.te.getWorld().isRemote) { s = te.getEnchantTime(); Utils.getLogger().info(te.getEnchantTime()); } if(s > 0) { Utils.getLogger().info("Reached here!"); this.drawTexturedModalRect(79, 34, 176, 14, this.getEnchantedAmount(), 17); } } @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { String s = GemEnchantmentMod.proxy.localize(te.getName()); //Gets the formatted name for the block breaker from the language file - NOTE ADD "container.block_breaker=Block Breaker" to the language file (without quotes) and then delete this note this.mc.fontRenderer.drawString(s, this.xSize / 2 - this.mc.fontRenderer.getStringWidth(s) / 2, 6, 4210752); this.mc.fontRenderer.drawString(this.playerInv.getDisplayName().getFormattedText(), 8, 72, 4210752); super.drawGuiContainerForegroundLayer(mouseX, mouseY); } private int getEnchantedAmount() { int currentItemEnchantAmount = this.te.getCurrentItemEnchantTime(); int enchantTime = this.te.getEnchantTime(); float percentage = enchantTime/currentItemEnchantAmount * 100; int amount = Math.round(percentage) * 24; return amount; } } BlockGemEnchanter.class ublic class BlockGemEnchanter extends BlockRotatableBase{ public BlockGemEnchanter(Material materialIn, String registryName, float resistance, float hardness, Class tileEntity) { super(materialIn, registryName, resistance, hardness, tileEntity); } @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if(!worldIn.isRemote) { playerIn.openGui(GemEnchantmentMod.instance, GUI_ID.GEM_ENCHANTER.getGUI_ID(), worldIn, pos.getX(), pos.getY(), pos.getZ()); } return true; } } Edited October 4, 20186 yr by DeathSpawn
October 3, 20186 yr 13 minutes ago, DeathSpawn said: Please provide an alternative to this problem. You can recreate those methods in your te or you could just do te.fieldName VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
October 3, 20186 yr Author Thanks. Will try it. But is there any like client and server relationship that happens when executing the IInventory te.getField(int) ?
October 3, 20186 yr Author 13 minutes ago, diesieben07 said: You need to sync fields that are required in the GUI from your container in either case. Sorry, but I don't understand what this statement means. How am I supposed to this? Edited October 3, 20186 yr by DeathSpawn
October 3, 20186 yr Packets. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
October 4, 20186 yr The getField method from Vanilla creates a level abstraction that I don’t think any Modder wants or needs. You should just use getCapability(ItemHandlerCapability) (read more about capabilities here https://mcforge.readthedocs.io/en/latest/datastorage/capabilities/) or a method that returns your ItemStackHandler (you should still be using capabilities, use of a shorthand method is allowable for internal use though). For syncing you just need to override a couple of methods https://mcforge.readthedocs.io/en/latest/tileentities/tileentity/#synchronizing-the-data-to-the-client About Me Spoiler My Discord - Cadiboo#8887 My Website - Cadiboo.github.io My Mods - Cadiboo.github.io/projects My Tutorials - Cadiboo.github.io/tutorials Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support. When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible. Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)
October 4, 20186 yr Author 10 hours ago, Cadiboo said: For syncing you just need to override a couple of methods https://mcforge.readthedocs.io/en/latest/tileentities/tileentity/#synchronizing-the-data-to-the-client Thanks! I will read through this and solve the problem... Edited October 4, 20186 yr by DeathSpawn
October 4, 20186 yr Are you syncing (and saving) your data? By default data is not synced to the client. 10 hours ago, Cadiboo said: For syncing you just need to override a couple of methods https://mcforge.readthedocs.io/en/latest/tileentities/tileentity/#synchronizing-the-data-to-the-client About Me Spoiler My Discord - Cadiboo#8887 My Website - Cadiboo.github.io My Mods - Cadiboo.github.io/projects My Tutorials - Cadiboo.github.io/tutorials Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support. When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible. Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)
October 4, 20186 yr Author 2 minutes ago, Cadiboo said: Are you syncing (and saving) your data? By default data is not synced to the client. Not now. I am currently trying to do so. This might solve the problem I will update my code and see if it does
October 4, 20186 yr Author The method has fixed the problem. Should I change the title to [Solved]... or something like that? I am new to the Minecraft Forge forums
October 4, 20186 yr 25 minutes ago, DeathSpawn said: The method has fixed the problem. Should I change the title to [Solved]... or something like that? I am new to the Minecraft Forge forums Yeah, just add “[SOLVED] “ to the start of the title (if you want to & if there’s space) About Me Spoiler My Discord - Cadiboo#8887 My Website - Cadiboo.github.io My Mods - Cadiboo.github.io/projects My Tutorials - Cadiboo.github.io/tutorials Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support. When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible. Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)
October 4, 20186 yr Author For people referring to this in the future, Use these methods used in my case : @Override public SPacketUpdateTileEntity getUpdatePacket(){ NBTTagCompound nbtTag = new NBTTagCompound(); nbtTag.setTag("inventory", inventory.serializeNBT()); energy.writeToNBT(nbtTag); nbtTag.setInteger("enchantTime", this.enchantTime); nbtTag.setInteger("currentItemEnchantTime", this.currentItemEnchantTime); nbtTag.setInteger("enchantingTime", this.enchantingTime); nbtTag.setInteger("shouldEnchantTime", this.shouldEnchantTime); nbtTag.setBoolean("isEnchanting", this.isEnchanting); return new SPacketUpdateTileEntity(getPos(), 1, nbtTag); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt){ NBTTagCompound tag = pkt.getNbtCompound(); inventory.deserializeNBT(tag.getCompoundTag("inventory")); energy.readFromNBT(tag); this.enchantTime = tag.getInteger("enchantTime"); this.currentItemEnchantTime = tag.getInteger("currentItemEnchantTime"); this.enchantingTime = tag.getInteger("enchantingTime"); this.shouldEnchantTime = tag.getInteger("shouldEnchantTime"); this.isEnchanting = tag.getBoolean("isEnchanting"); } and also add the following in the update() method: if(this.world.isBlockLoaded(getPos())) { this.world.notifyBlockUpdate(getPos(), this.world.getBlockState(getPos()), this.world.getBlockState(getPos()), 2); } This should fix the problem I had
October 11, 20186 yr Author Ok, so that's the reason why my game was lagging so much... Thank you for the info. I'll see what I can do...
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.