Jump to content

Recommended Posts

Posted

I created a tile entity, that can perform a crafting operation. Everything works as expected, but when I close the screen while working and open it after it has finished, the sceen shows the progress of when I closed the screen. Starting a new craftingoperation solves the problem, but this isn't right. I used the FunctionalIntReferenceHolder to keep track of the values of the tile entity, but I am not sure if this is the right way. Here is my code:

The screen:

	private void drawProgress() {
		RenderSystem.color4f(1F, 1F, 1F, 1F);
		minecraft.getTextureManager().bindTexture(BACKGROUND);
		int up = 0;
		int left = xSize;
		int down = ySizeProgress;
		int currentTime = this.container.currentWorktime.get();
		int maxTime = this.container.maxWorktime.get();
		int right = (int) Math.round(xSizeProgress * currentTime / maxTime);
		int gui_grafic_size = 256;
		blit(guiLeft + 52, guiTop + 56, left, up, right, down, gui_grafic_size, gui_grafic_size);
	}

The container:

	@Override
	public void init() {
		tileEntity.getInventory().ifPresent(handler -> {
			addSlot(new SlotItemHandler(handler, 0, 20, 76));
			addSlot(new SlotItemHandler(handler, 1, 139, 76));
		});
		addPlayerInventory(8, 113);
		
		this.trackInt(currentWorktime =
				new FunctionalIntReferenceHolder(() -> ((FlintFactoryTile_Entity) this.tileEntity).currentWorkTime,
						v -> this.tileEntity.currentWorkTime = v));
		this.trackInt(maxWorktime = new FunctionalIntReferenceHolder(
				() -> ((FlintFactoryTile_Entity) this.tileEntity).maxWorkTime, v -> this.tileEntity.maxWorkTime = v));
		currentWorktime.get();
		maxWorktime.get();
		
	}

And the tile entity ticking part:

 @Override
    public void tick() {
	boolean dirty = false;

	if (world != null && !this.world.isRemote) {
	    boolean work = false;
	    if (this.factoryinventory.isPresent()) {
		Inventory inventory = getinventoryasInventory();
		Inventory inputinv = new Inventory(inventory.getStackInSlot(0));
		Inventory outputinv = new Inventory(inventory.getStackInSlot(1));
		if (this.selectedRecipe != null) {

		    ItemStack output = this.selectedRecipe.getCraftingResult(inputinv);
		    boolean flag = inputinv.getStackInSlot(0).getCount() >= this.selectedRecipe.getIngredientCount();
		    if(!flag) {
			this.selectedRecipe=null;
			currentWorkTime=0;
		    }
		    work = outputinv.isEmpty() && flag;
		    if (!work) {
			ItemStack itemStack = outputinv.getStackInSlot(0);
			boolean equal = itemStack.isItemEqual(output);
			boolean fitting = itemStack.getMaxStackSize() >= output.getCount() + itemStack.getCount();
			work = equal && fitting && flag;
		    }

		    if (work) {
			dirty = true;
			if (this.currentWorkTime < this.maxWorkTime) {
			    this.currentWorkTime++;
			} else {
			    this.currentWorkTime = 0;
			    outputinv.addItem(output);
			    this.selectedRecipe = null;
			    this.factoryinventory.ifPresent(consumer -> {
				consumer.setStackInSlot(1, outputinv.getStackInSlot(0));
				consumer.getStackInSlot(0).shrink(2);
			    });
			    
			}
		    }

		}
	    }
	    this.world.setBlockState(this.getPos(), this.getBlockState().with(FlintFactoryBlock.WORKING, work));
	}
	if (dirty) {
	    this.markDirty();
	    this.world.notifyBlockUpdate(this.pos, this.getBlockState(), this.getBlockState(),
		    Constants.BlockFlags.BLOCK_UPDATE);
	}

 

Thanks for help

 

Posted
  On 4/3/2021 at 6:06 PM, diesieben07 said:

First of all, it seems that while working you call notifyBlockUpdate every tick.

Expand  

So, only call it on start an end of the crafting progress?

  On 4/3/2021 at 6:06 PM, diesieben07 said:

It seems like your TE does not reset maxWorkTime when it stops working.

Expand  

Max work time is the end time and is include in the json of the recipe, the current work time is the time which is ticking and resets at the end. So while no recipe is executed, the current work time is 0 and the progress bar stays at 0%. And when recipe starts, the max work time is defined, so the scaling can be done with every recipe on its own.

 

Posted
  On 4/3/2021 at 6:30 PM, diesieben07 said:

Do you know what this method does? Why are you calling it at all?

Expand  

Yes I know. My block has 2 states, weather it is working or not. See pictures below.

The working state:

image.thumb.png.5370746ab783c891005dce6203d10e4d.png

The default state:

image.thumb.png.fe04025da59c61a14041a66c885c3c1a.png

The gui:

image.thumb.png.9db82dddf9148b8982d51b8a4c96ceb7.png

The Gui in progress:

image.thumb.png.a8d3a8101c92ccf59c7b377f553c0b0d.png

  On 4/3/2021 at 6:30 PM, diesieben07 said:

The logic you have here is hard to grasp just looking at the code. Please post a Git repo so I can use the debugger.

Expand  

The recipes have there own working time, so when you click the recipe you want, the work time is read from the recipe. Here is on example recipe:

{
  "type": "crushing_project:lumbermilling",
  "ingredients": [
    {
      "item": "crushing_project:throable_flint",
      "count": 2
    }
  ],
  "result": "crushing_project:flint_and_flint",
  "count": 1,
  "crafttime": 50
}

 

 

I don't use github at the moment, so posting wont help me so much, especially because my problems are solved. Thanks for the help.

Posted
  On 4/3/2021 at 6:56 PM, diesieben07 said:

notifyBlockUpdate is not how you change block states though. You do that with setBlockState.

Expand  

Ok, I thanks. I will use setBlockState. The code was a bit older, so I don't know why I used notifyBlockUpdate, but I checked setBlockState and it seems to call notifyBlockUpdate finally to. It calls markAndNotifyBlock which calls notifyBlockUpdate after much more other logic. I like to prevent other logics and the the process time comes down. I think this is why I used notifyBlockUpdate  in the first case. But when you say setBlockState is the better way, I will trust you. I work in 1.15, i don't know if there is a difference to other versions.

Posted (edited)

If you are still interested, I uploaded the code to github:

https://github.com/AlmightyAnubis/Crushing_Project

Would be a great honor, if a expert like you will check for mistakes. Many things where I couldn't find a good answer in the internet and looked in the minecraft code to copy similar behavior, which resulted in botching in some cases I guess...

But I know, that you have better thinks to do, so now problem if you don't have time for that.

 

I deleted all the json files, because github forced me to 100 files upload limit. But many of them can be recovered with a run of runData

Edited by Anubis
missing JSON

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • im new to minecraft java modding and I am looking for some help on adding a custom dimension to minecraft java version 1.21.1   I haven't managed to find a good 1.21.1 minecraft dimension turtorial for intellij modding.  all I could find online is how to make the json files for the custom dimension but not how to setup the custom dimension in the game.    im using forge's recommended version for minecraft 1.21.1, any help would be appreciated
    • Thank you for the suggestion if figure that it should be able to support around 40 based on my previous experiences hosting but no one really seems to have a concrete way of figuring it out. You have been alot more helpful than most people and i will probably set up Linux tomorrow.
    • https://mclo.gs/e8nuqSA My friend and I are having the same issue with this pack. We're trying to play on BMC4 with a bunch of extra mods. The game loads up to 'mod gathering' and then crashes. Mod list changes beyond the modpack: Added mods: alexscaves-2.0.2.jar alexsmobsinteraction-5.4-all.jar Apotheosis-1.20.1-7.4.8.jar ApothicAttributes-1.20.1-1.3.7.jar ApothicCombat-1.20.1-1.1.0.jar ApothicCurios-1.20.1-1.0.3e.jar ArmorPoser-forge-1.20.1-2.2.2.jar ars_nouveau-1.20.1-4.12.7-all.jar attributizer-2.1.jar bendy-lib-forge-4.0.0.jar betterarcheology-1.2.1-1.20.1.jar bettercombat-forge-1.8.6+1.20.1.jar BetterThirdPerson-Forge-1.20-1.9.0.jar born_in_chaos_[Forge]1.20.1_1.7.jar cataclysm_ut_lite-AT - 1.20.1.jar celestisynth-1.20.1-1.3.1.jar cobweb-forge-1.20.1-1.0.1.jar common-networking-forge-1.0.5-1.20.1.jar Critters n' Crawlers-2.2.2-mc1.20.1.jar crittersandcompanions-forge-2.2.2.jar domesticationinnovation-1.7.1-1.20.1.jar dummmmmmy-1.20-2.0.6.jar emotecraft-for-MC1.20.1-2.2.7-b.build.50-forge.jar EmoteTweaks-4.0.2.27-forge.jar exposure-1.20.1-1.7.14-forge.jar faunify-forge-1.20.1-1.1.2.jar hallucinatory_plants-2.3.0-1.20.1-forge.jar Icarus-Forge-2.12.0.jar integrated_api-1.5.1+1.20.1-forge.jar irons_spellbooks-1.20.1-3.4.0.9.jar iwannaskate-1.2.0.jar l2library-2.5.1.jar letsdo-API-forge-1.2.15-forge.jar letsdo-bakery-forge-2.0.5.jar letsdo-brewery-forge-2.0.3.jar letsdo-brewery-forge-2.0.5.jar letsdo-candlelight-forge-2.0.2.jar letsdo-farm_and_charm-forge-1.0.4.jar letsdo-herbalbrews-forge-1.0.12.jar letsdo-nethervinery-forge-1.2.17.jar letsdo-vinery-forge-1.4.39.jar modulargolems-2.5.19.jar mutil-1.20.1-6.2.0.jar Pehkui-3.8.2+1.20.1-forge.jar Placebo-1.20.1-8.6.3.jar player-animation-lib-forge-1.0.2-rc1+1.20.jar Powah-5.0.10.jar productivebees-1.20.1-12.6.0.jar Rats-1.20.1-8.1.3.jar refinedstorage-1.12.4.jar refinedstorageaddons-0.10.0.jar RSInfinityBooster-1.20.1-1.0+41.jar rsjukeboxes-1.20.1-1.0.1.0.jar ScorchedGuns-0.4.1-1.20.1.jar simplyswords-forge-1.56.0-1.20.1.jar sophisticatedbackpacks-1.20.1-3.23.23.1281.jar sophisticatedcore-1.20.1-1.2.75.1033.jar soul-fire-d-forge-1.20.1-4.0.11.jar supermartijn642configlib-1.1.8-forge-mc1.20.jar the_bumblezone-7.7.1+1.20.1-forge.jar the_dirty_stuff-2.1-forge-1.20.1.jar traveloptics-4.4.0-1.20.1.jar unusualprehistory-1.5.0.3.jar voicechat-forge-1.20.1-2.5.30.jar wits-1.1.0+1.20.1-forge.jar xercapaint-1.20.1-1.0.1.jar Updated mods: azurelib (3.0.8 > 3.0.9) lithostitched-forge-1.20.1-1.4.10.jar > lithostitched-forge-1.20.1-1.4.11.jar  
    • Graphics are irrelevant for a server. According to google, it should support 20-40. I literally asked it "how many players on a lightly modded minecraft server will a ryzen 5 2600 with 32GB ram support?" Maybe someone with some real world experience has further input. I can say without a doubt that if you run Linux as opposed to windows for the server operating system, you will get better performance and have more resources available to your server.
    • Could someone help me to figure out what's the problem?  I get this crash when I try to enter to a world in forge 1.12.2:  The game crashed: exception in server tick loop Error: java.lang.NullPointerException: Exception in server tick loop Error code: -1 here is the crash report crash-2025-07-15_20.44.02-server333.txt
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
×
×
  • Create New...

Important Information

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