Jump to content

Recommended Posts

Posted

Well the title says it all what i'm trying to do is make it so that once I use my bonemeal like item on the tree it is saved on an nbt and counts down from 1200000 (1 minecraft day). uhm, for some reason it's allowing me to continuously use the item without anything holding me back. Please give me some assistance.

 

 

TileEntityTree

 

 

3d8a0bcbd628a1ee527617d3fab30ec7.png

 

 

 

 

Bonemeal Function For Tree

 

 

e3fb44e1a1064a2191e961528881dd04.png

 

 

 

 

 

Posted

Any particular reason why you retrieve the NBT from a packet without ever sending it if you could just as well simply get the property of the TileEntity that you have retrieved nonetheless?

 

uhm, for some reason it's allowing me to continuously use the item without anything holding me back.

 

In your TileEntity.writeToNBT, you use

nbt.setLong("TimeLastWatered", timeLastWatered);

 

while in your custom bonemeal function, you attempt to retrieve this value with

nbt.getLong("TimeLastWatering");

which doesn't exist. Default return value for inexistent NBT sub long tags is 0. Current system time - 0 is always bigger than 10,000.

Posted

so if I simply change my public long to

 

public long timeLastWatered = 10000;

 

it should solve my issue correct? I will that a try. Unless I misread what you said.

Posted

so if I simply change my public long to

 

public long timeLastWatered = 10000;

 

it should solve my issue correct? I will that a try. Unless I misread what you said.

 

You did misread what I said. I said the way you are reading information from the NBT is incorrect. You store the property of your TileEntity under a different tag name than the one you try to read it from. Since that tag name does not exist, Minecraft will return 0 for your timeLastWatering local long variable.

 

I'd suggest that you skip the NBT part for the Bonemeal function completely and just use

if( !world.isRemote && /* your other conditions */ ) {
    TileEntityApricornTree tileEntity = (TileEntityApricornTree)world.getBlockTileEntity(event.X, event.Y, event.Z);
    long currentTime = System.nanoTime(),
        timeLastWatered = tileEntity.timeLastWatered;

    if( (currentTime - timeLastWatered) > MILLISPERDELAY ) {
        tileEntity.timeLastWatered = currentTime;
        world.setBlockMetadataWithNotify( /* Blabla, can't read all your parameters. */ );
        event.setResult(Event.ALLOW);
    }
}

 

Note that when writing to the NBT customly the way you do it in your original code, the changes won't be reflected the next time the item is used because the NBT is never read. TileEntity.readFromNBT is only called when the block is loaded, i.e. on chunk load. You could at the utter most try

 

if( (currentTime - timeLastWatered) > MILLISPERDELAY ) {
    nbt.setLong("TimeLastWatered", currentTime);
    
    // tileEntityApricornTree.writeToNBT(nbt);
    // Don't do this. The NBT still has the old TileEntityApricornTree.timeLastWatered set, so you'll
    // end up overwriting the nbt.setLong("TimeLastWatered", currentTime); that you just used.
    
    tileEntityApricornTree.readFromNBT(nbt);
    
    // ... your other code here.
}

 

but I would still suggest you'd take the other approach since it is more straight-forward.

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

    • You would have better results asking a more specific question. What have you done? What exactly do you need help with? Please also read the FAQ regarding posting logs.
    • Hi, this is my second post with the same content as no one answered this and it's been a long time since I made the last post, I want to make a client-only mod, everything is ok, but when I use shaders, none of the textures rendered in RenderLevelStageEvent nor the crow entity model are rendered, I want them to be visible, because it's a horror themed mod I've already tried it with different shaders, but it didn't work with any of them and I really want to add support for shaders Here is how i render the crow model in the CrowEntityRenderer<CrowEntity>, by the time i use this method, i know is not the right method but i don't think this is the cause of the problem, the renderType i'm using is entityCutout @Override public void render(CrowEntity p_entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { super.render(p_entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); ClientEventHandler.getClient().crow.renderToBuffer(poseStack, bufferSource.getBuffer(ClientEventHandler.getClient().crow .renderType(TEXTURE)), packedLight, OverlayTexture.NO_OVERLAY, Utils.rgb(255, 255, 255)); } Here renderLevelStage @Override public void renderWorld(RenderLevelStageEvent e) { horrorEvents.draw(e); } Here is how i render every event public void draw(RenderLevelStageEvent e) { for (HorrorEvent event : currentHorrorEvents) { event.tick(e.getPartialTick()); event.draw(e); } } Here is how i render the crow model on the event @Override public void draw(RenderLevelStageEvent e) { if(e.getStage() == RenderLevelStageEvent.Stage.AFTER_ENTITIES) { float arcProgress = getArcProgress(0.25f); int alpha = (int) Mth.lerp(arcProgress, 0, 255); int packedLight = LevelRenderer.getLightColor(Minecraft.getInstance().level, blockPos); VertexConsumer builder = ClientEventHandler.bufferSource.getBuffer(crow); Crow<CreepyBirdHorrorEvent> model = ClientEventHandler .getClient().crow; model.setupAnim(this); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, packedLight, OverlayTexture.NO_OVERLAY, alpha); builder = ClientEventHandler.bufferSource.getBuffer(eyes); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, 15728880, OverlayTexture.NO_OVERLAY, alpha); } } How i render the model public static void renderModelInWorld(Model model, Vector3f pos, Vector3f offset, Camera camera, PoseStack matrix, VertexConsumer builder, int light, int overlay, int alpha) { matrix.pushPose(); Vec3 cameraPos = camera.getPosition(); double finalX = pos.x - cameraPos.x + offset.x; double finalY = pos.y - cameraPos.y + offset.y; double finalZ = pos.z - cameraPos.z + offset.z; matrix.pushPose(); matrix.translate(finalX, finalY, finalZ); matrix.mulPose(Axis.XP.rotationDegrees(180f)); model.renderToBuffer(matrix, builder, light, overlay, Utils .rgba(255, 255, 255, alpha)); matrix.popPose(); matrix.popPose(); } Thanks in advance
    • Same issue - I have no idea
    • I am trying to develop a modpack for me and my friends to use on our server. Does anyone know how to develop a modpack for a server or could they help take a look at my modpack to potentially help at all?
    • un server de armas realista.  
  • Topics

×
×
  • Create New...

Important Information

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