Jump to content

How would I send a SUpdateTileEntityPacket?


DJ1TJOO

Recommended Posts

I have an tile with an gui and I do all the calculations on the server side then I want to send the nbt data to the client. In another topic I saw someone using the SUpdateTileEntityPacket. This was an old topic from 1.11 and that doesn't work any more does someone have any idea?

 

PacketHandler.INSTANCE.send(PacketDistributor.ALL, this.getUpdatePacket());

This is what I tried but it can't see the getUpdatePacket as a MSG:
The method send(PacketDistributor.PacketTarget, MSG) in the type SimpleChannel is not applicable for the arguments (PacketDistributor<Void>, SUpdateTileEntityPacket)

Link to comment
Share on other sites

Don’t send it yourself, vanilla will send the packet for you.

 

Edit: Yeah, if you only need it for the GUI there is a better way of doing it

Edited by Cadiboo

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.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)

Link to comment
Share on other sites

8 minutes ago, diesieben07 said:

If the data is only needed in a GUI then that packet is the wrong choice. You would need to create your own packet for that case and only send it when then GUI is opened.

 

If the data is needed on the client in general, check out this:

 

So you say that I need to send the notifyBlockUpdate but how would I get the old state and wich flag should I use?

Link to comment
Share on other sites

Or should I use packets then I have the question: how would I get the client world in the handle:
 

private final BlockPos pos;
	private final int completed;
	
	public ResearchTableCompletedUpdatePacket(BlockPos pos, int completed) {
		this.pos = pos;
		this.completed = completed;
	}
	
	public static void encode(ResearchTableCompletedUpdatePacket msg, PacketBuffer buffer) {
		buffer.writeBlockPos(msg.pos);
		buffer.writeByte((byte)msg.completed);
	}
	
	public static ResearchTableCompletedUpdatePacket decode(PacketBuffer buffer) {
		return new ResearchTableCompletedUpdatePacket(buffer.readBlockPos(), buffer.readUnsignedByte());
	}
	
	public static void handle(ResearchTableTile msg, Supplier<NetworkEvent.Context> context) {
		context.get().enqueueWork(() -> {
			TileEntity te = **WORLD**.getTileEntity(msg.pos);
			if(te instanceof ResearchTableTile) {
				ResearchTableTile dtt = (ResearchTableTile) te;
				
			}
		});
		context.get().setPacketHandled(true);
	}

 

Link to comment
Share on other sites

4 minutes ago, diesieben07 said:

For which part of that GUI are you using the update packet? I don't see any reason to use it there.

@Override
	public void tick() {
		if(world.isRemote) {//client
			//Fantasy20.LOGGER.info("ResearchTableTile.tick-client");
		} else {//server
			handler.ifPresent(h -> {
				second++;
				if(second > 19) {
					second = 0;
				//Fantasy20.LOGGER.info("ResearchTableTile.tick-server");
				if(currentRecipe == null) {
						if(h.getStackInSlot(INPUT_SLOT).getItem().equals(ModItems.SCRAP)) {
							ResearchTableRecipe recipe = ResearchTable.getRecipe(h.getStackInSlot(INPUT_SLOT_2));
							if(recipe != null) {
								if(h.getStackInSlot(INPUT_SLOT).getCount() >= recipe.getScrap()) {
									second = 0;
									timer = 0;
									completed = 0;
									currentRecipe = recipe.copy();
									markDirty();
									world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2);
								}
							}
						}
				} else {
						if(h.getStackInSlot(INPUT_SLOT).getCount() < currentRecipe.getScrap() || !h.getStackInSlot(INPUT_SLOT_2).getItem().equals(currentRecipe.getInputItem())) {
							currentRecipe = null;
							second = 0;
							timer = 0;
							completed = 0;
							markDirty();
							world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2);
						} else {
							timer++;
							//System.err.println(timer/100);
						//	System.err.println(timer/currentRecipe.getTime() * 100);
							if(timer > currentRecipe.getTime()) {
								h.extractItem(INPUT_SLOT, currentRecipe.getScrap(), false);
								h.extractItem(INPUT_SLOT_2, 1, false);
								h.insertItem(OUTPUT_SLOT, currentRecipe.getResultBlueprint(), false);
								//System.err.println(" " + currentRecipe.toString());
								
								currentRecipe = null;
								second = 0;
								timer = 0;
								completed = 0;
							}
							if(currentRecipe != null) {
								completed = (int)(((double)((double)timer/(double)currentRecipe.getTime())) * 100);
								//System.err.println(completed);
							}
							//PacketHandler.INSTANCE.send(PacketDistributor.ALL, this.getUpdatePacket());
							markDirty();
							world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2);
						}
					}
				}
				});
		}
	}

In the tileentity
 

private ResearchTableTile tileEntity;
	private PlayerEntity playerEntity;
    private IItemHandler playerInventory;

	public ResearchTableContainer(int id, World world, BlockPos pos, PlayerInventory playerInventory, PlayerEntity playerEntity) {
		super(ModBlocks.RESEARCH_TABLE_CONTAINER, id);
		tileEntity = (ResearchTableTile) world.getTileEntity(pos);
		this.playerEntity = playerEntity;
        this.playerInventory = new InvWrapper(playerInventory);
        
		//tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).ifPresent(h -> {
        tileEntity.getHandler().ifPresent(h -> {
            addSlot(new SlotItemHandler(h, tileEntity.INPUT_SLOT, 19, 33));
            addSlot(new SlotItemHandler(h, tileEntity.INPUT_SLOT_2, 55, 33));
            addSlot(new SlotItemHandler(h, tileEntity.OUTPUT_SLOT, 137, 33));
        });
        //});
        layoutPlayerInventorySlots(8, 83);
	}

	@Override
	public boolean canInteractWith(PlayerEntity player) {
		return isWithinUsableDistance(IWorldPosCallable.of(tileEntity.getWorld(), tileEntity.getPos()), playerEntity, ModBlocks.RESEARCH_TABLE);
	}
	
	 private int addSlotRange(IItemHandler handler, int index, int x, int y, int amount, int dx) {
        for (int i = 0 ; i < amount ; i++) {
            addSlot(new SlotItemHandler(handler, index, x, y));
            x += dx;
            index++;
        }
        return index;
    }

    private int addSlotBox(IItemHandler handler, int index, int x, int y, int horAmount, int dx, int verAmount, int dy) {
        for (int j = 0 ; j < verAmount ; j++) {
            index = addSlotRange(handler, index, x, y, horAmount, dx);
            y += dy;
        }
        return index;
    }

    private void layoutPlayerInventorySlots(int leftCol, int topRow) {
        // Player inventory
        addSlotBox(playerInventory, 9, leftCol, topRow, 9, 18, 3, 18);

        // Hotbar
        topRow += 58;
        addSlotRange(playerInventory, 0, leftCol, topRow, 9, 18);
    }
	
	public ResearchTableTile getTileEntity() {
		return tileEntity;
	}

	public void setTileEntity(ResearchTableTile tileEntity) {
		this.tileEntity = tileEntity;
	}

In the Container
 

private ResearchTableTile tileEntity;
    private ResourceLocation GUI = new ResourceLocation(Fantasy20.MODID, "textures/gui/research_table/gui.png");
	
	public ResearchTableScreen(ResearchTableContainer screenContainer, PlayerInventory inv, ITextComponent titleIn) {
		super(screenContainer, inv, titleIn);
		tileEntity = getContainer().getTileEntity();
	}
	
	@Override
	public boolean mouseDragged(double mouseX, double mouseY, int button,
			double mouseXVel, double mouseYVel) {
		return super.mouseDragged(mouseX, mouseY, button, mouseXVel,
				mouseYVel);
	}
	
	@Override
	public boolean mouseClicked(double mouseX, double mouseY, int button) {
		return super.mouseClicked(mouseX, mouseY, button);
	}
	
	@Override
	public boolean mouseReleased(double mouseX, double mouseY, int button) {
		return super.mouseReleased(mouseX, mouseY, button);
	}
	
	@Override
	public void mouseMoved(double mouseX, double mouseY) {
		super.mouseMoved(mouseX, mouseY);
	}
	
	@Override
	public void render(int mouseX, int mouseY, float partialTicks) {
		this.renderBackground();
		super.render(mouseX, mouseY, partialTicks);
		this.renderHoveredToolTip(mouseX, mouseY);
	}
	
	@Override
	protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
		this.font.drawString(this.title.getFormattedText(), 8.0F, 6.0F, 4210752);
	}

	@Override
	protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
		GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
		this.minecraft.getTextureManager().bindTexture(GUI);
		int relX = (this.width - this.xSize) / 2;
        int relY = (this.height - this.ySize) / 2;
        this.blit(relX, relY, 0, 0, this.xSize, this.ySize);
       // System.err.println(getContainer().getTileEntity().getCompleted());
        if(tileEntity.getCurrentRecipe() != null) {
        	int k = getCompletedLeft(24);
        	//System.err.println(k);
        	this.blit(relX + 91, relY + 33, 176, 0, k, 17);
        }
	}
	
	private int getCompletedLeft(int pixels) {
		int i = tileEntity.getCompleted();
		return (int)(((double)i / (double)100) * (double)pixels);
	}

In the screen

Edit: Its used for the completed int to see the progressbar in the gui
And I know that my code is a mess sometimes

Edited by DJ1TJOO
Anwser
Link to comment
Share on other sites

1 minute ago, diesieben07 said:
  • Items do not need to be synchronized, they are synchronized by the Container infrastructure already.
  • Do not use notifyBlockUpdate for stuff that is needed only in the GUI, especially fast-updating things like the progressbar. notifyBlockUpdate is expensive. Use a custom packet or look at how the vanilla furnace synchronizes it's progressbar.

Then what is the right way to do it
Edit: And how do I remove the disapearing of my items

Edited by DJ1TJOO
Question
Link to comment
Share on other sites

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.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)

Link to comment
Share on other sites

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

    • KLIK DISINI >>> LINK LOGIN & DAFTAR KLIK DISINI >>>   DAFTAR AKUN GACOR KLIK DISINI >>> DAFTAR AKUN VVIP KLIK DISINI >>> DAFTAR AKUN SLOT ANTI RUNGKAD KLIK DISINI >>>  LINK ALTERNATIF KLIK DISINI >>> AKUN GACOR SCATTER HITAM ULTRA88 adalah slot gacor winrate 100% dengan server thailand dan akun pro. Dapatkan akses menuju kemenangan ke puluhan sampai ratusan juta rupiah hanya dalam hitungan menit. 3 web yang kami hadirkan ini adalah yang terbaik dengan histori kemenangan tertinggi di satu Asia Tenggara. Member-member dari web ini selalu kembali karena tim admin dan CS yang profesional serta kemenangan berapapun pasti akan dibayar. RTP slot gacor juga sudah disiapkan agar kalian tidak bingung lagi mau main apa dan di jam berapa. Semua fasilitas seperti deposit dana dan pulsa sudah disiapkan juga untuk kemudahan para slotters. Jadi tunggu apalagi? Raih kemenangan kalian disini sekarang juga!
    • >> DAFTAR KLIK DISINI << >> DAFTAR KLIK DISINI << PROMO SLOT GRATIS kami sangat cocok bagi mereka yang ingin mencoba keberuntungan tanpa mengeluarkan banyak uang. Dengan pilihan IP tanpa batas, slot ini menjamin gameplay yang adil dan tidak memihak. Jangan lewatkan kesempatan untuk menang besar tanpa mengeluarkan uang sepeser pun! Dapatkan slot promo gratis tanpa perlu deposit! Nikmati taruhan gratis dan akses tak terbatas ke IP pilihan Anda. Manfaatkan kesempatan ini untuk mencoba peruntungan dan menang besar. Jangan lewatkan penawaran eksklusif ini. Hanya tersedia untuk waktu terbatas.
    • KLIK DISINI >>> LINK LOGIN & DAFTAR KLIK DISINI >>>   DAFTAR AKUN GACOR KLIK DISINI >>> DAFTAR AKUN VVIP KLIK DISINI >>> DAFTAR AKUN SLOT ANTI RUNGKAD KLIK DISINI >>>  LINK ALTERNATIF KLIK DISINI >>> AKUN GACOR SCATTER HITAM SLOT888 adalah slot gacor winrate 100% dengan server thailand dan akun pro. Dapatkan akses menuju kemenangan ke puluhan sampai ratusan juta rupiah hanya dalam hitungan menit. 3 web yang kami hadirkan ini adalah yang terbaik dengan histori kemenangan tertinggi di satu Asia Tenggara. Member-member dari web ini selalu kembali karena tim admin dan CS yang profesional serta kemenangan berapapun pasti akan dibayar. RTP slot gacor juga sudah disiapkan agar kalian tidak bingung lagi mau main apa dan di jam berapa. Semua fasilitas seperti deposit dana dan pulsa sudah disiapkan juga untuk kemudahan para slotters. Jadi tunggu apalagi? Raih kemenangan kalian disini sekarang juga!
    • Winning303 menyediakan berbagai jenis permainan dengan kemenangan yang tinggi , slot gacor dengan winrate 100% , hanya dengan modal receh sudah bisa meraih jutaan  Nikmati berbagai permainan judi online yang menarik dengan jaminan keamanan dan kenyamanan di WINNING303 LINK ALTERNATIF => https://w303.pink/ref1x    
    • RELATED: Horror Games Inspired By Movies Still, there are some options for a Wizard if it comes to melee combat, and there also are some alternatives on the subject of the catalyst they use to solid Spells. For each, those alternatives are first-class: Spellbook: All three spellcasting options, the Staff, Spellbook, and Crystal Ball can all have a whole lot of extra advantages of Dark And Darker Gold on them depending on rarity. But, at a base degree, the Spellbook is the catalyst option gamers appeared to gravitate to. This spell-casting catalyst will increase a Wizard's movement velocity by using the maximum overall, which clearly makes a large distinction. Crystal Ball: The distinction among the three Spell catalysts is quite easy. The Staff is the default option and has melee assaults of its own, the Spellbook is faster all around however offers no melee alternatives, and the Crystal Ball is the center ground between the 2 in regard to motion velocity, however gamers may also equip a Dagger or something in their other hand at the identical time. Crossbow: That's right, Wizards can really run Crossbows, but it is without a doubt simplest well worth the usage of once or at maximum twice at some stage in a suit, and best as soon as a Wizard is out of Spell casts. Still, tricking an enemy into thinking a Wizard is out of Spells, simplest to tug out a Crossbow and launch a bolt into them is a surprisingly effective strategy. Rondel Dagger: Again, if it ever does come right down to melee combat, a Wizard loses ninety percent of the time. But, having a Rondel Dagger as a secondary or geared up alongside the Crystal Ball improves the ones odds at least a bit bit. The Wizard's Expansive Repertoire Of Spells. Moving on to the category all and sundry became in all likelihood anticipating when studying approximately the Wizard magnificence, the Spells. Which Spells are the quality to use on the Wizard and why? Or, not less than, which of them are the maximum 'meta'? Are those professional kind Wizards, together with ones that use White, Green, Red, or even Blue magic, or are they a piece extra stereotypical? Well, after doing a little research, those appear to be the consequences, listed from least to most used: Slow: Slows an opponent for a duration, maximum of the time is changed by means of Haste, but a few gamers choose to slow others in preference to velocity themselves up. Haste: Speeds the Wizard up by way of a quite noticeable amount for a brief duration. This is the important thing device Wizards use to usually maintain their combatants at variety, and the use of this they can outrun just about everybody in the game (outside of projectile guns or different Spells). Invisibility: One of the fine Spells to apply on Wizard, but only veteran players appear to be utilizing it to the maximum. Basically permits the Wizard to use the identical strategies as a Rogue does with their Hide capability. Fireball: The Spell everyone makes use of before everything, tends to reveal up in each game, and is nearly usually extraordinarily suitable. But, in Dark and Darker, gamers will fast realizes that it is straightforward to hit allies with and there are better options for normal damage. Chain Lightning: Likely the pleasant alternative damage-sensible, and the friendly-fireplace element of it's far a chunk misleading (would not clearly chain to allies find it irresistible says it does). When aimed well, can decimate an unaware foe. Magic Missile: The most iconic 'Wizard Spell', Magic Missile, is tremendously right in Dark and Darker as properly. It's extraordinary for NPC enemies, excellent for region denial in a PvP fight, and it is the pleasant Spell to apply if the enemy manages to shut the space as it may speedy soften via their HP earlier than their swing connects. Last-Second General Wizard Tips. And it is pretty a great deal the whole thing gamers want to realize about constructing Wizards in Dark and Darker. This class, out of all of the instructions the sport currently gives Darker Gold, might be one of the maximum challenging ones to play for a newcomer.
  • Topics

×
×
  • Create New...

Important Information

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