DeathSpawn Posted October 3, 2018 Posted October 3, 2018 (edited) 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, 2018 by DeathSpawn Quote
Animefan8888 Posted October 3, 2018 Posted October 3, 2018 On 10/3/2018 at 3:43 PM, DeathSpawn said: Please provide an alternative to this problem. Expand You can recreate those methods in your te or you could just do te.fieldName Quote 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.
DeathSpawn Posted October 3, 2018 Author Posted October 3, 2018 Thanks. Will try it. But is there any like client and server relationship that happens when executing the IInventory te.getField(int) ? Quote
DeathSpawn Posted October 3, 2018 Author Posted October 3, 2018 (edited) On 10/3/2018 at 4:10 PM, diesieben07 said: You need to sync fields that are required in the GUI from your container in either case. Expand Sorry, but I don't understand what this statement means. How am I supposed to this? Edited October 3, 2018 by DeathSpawn Quote
Draco18s Posted October 3, 2018 Posted October 3, 2018 Packets. 1 Quote 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.
Cadiboo Posted October 4, 2018 Posted October 4, 2018 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 1 Quote About Me Reveal hidden contents 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)
DeathSpawn Posted October 4, 2018 Author Posted October 4, 2018 (edited) On 10/4/2018 at 12:19 AM, 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 Expand Thanks! I will read through this and solve the problem... Edited October 4, 2018 by DeathSpawn 1 Quote
Cadiboo Posted October 4, 2018 Posted October 4, 2018 Are you syncing (and saving) your data? By default data is not synced to the client. On 10/4/2018 at 12:19 AM, 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 Expand 1 Quote About Me Reveal hidden contents 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)
DeathSpawn Posted October 4, 2018 Author Posted October 4, 2018 On 10/4/2018 at 11:06 AM, Cadiboo said: Are you syncing (and saving) your data? By default data is not synced to the client. Expand Not now. I am currently trying to do so. This might solve the problem I will update my code and see if it does 1 Quote
DeathSpawn Posted October 4, 2018 Author Posted October 4, 2018 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 1 Quote
Cadiboo Posted October 4, 2018 Posted October 4, 2018 On 10/4/2018 at 11:26 AM, 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 Expand Yeah, just add “[SOLVED] “ to the start of the title (if you want to & if there’s space) 1 Quote About Me Reveal hidden contents 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)
DeathSpawn Posted October 4, 2018 Author Posted October 4, 2018 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 1 Quote
DeathSpawn Posted October 11, 2018 Author Posted October 11, 2018 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... Quote
Recommended Posts
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.