Jump to content

Recommended Posts

Posted

Hey guys,

 

here's my problem, I have a certain block with a tile entity and a menu on right click to change some value on it. Since the menu is client side only, you would want the change to propagate to other player, but I'm not sure what is the correct way. I know that on server side you can call world.markBlockForUpdate(x, y, z) (or some method with similar name, I'm not in front of my code so I'm not sure)  and from there everything should take care of itself.

 

so far my solution is to make a customload packet containing x, y, z of the tile entity and the change but when i arrive server side on the method "handle(manager, packet, player)" the only way I FOUND (I'm sort of hoping there's another method) to get to the world with the tile entity is to cast player as EntityPlayerMP and use the worldObj on it. BUT here's the problem, using this method, were expecting that the player will be in the same world as the Tile Entity when the packet is being processes and if for SOME reason the packet were to be processes much later and the player has had time to switch dimension. the change would not appear.

 

At the moment its not a real problem. In my test the packets were always processes VERY quickly, but i know it's not a good thing that I'm relying on this.

 

so my question is: does anyone know of a good reliable way to update tile entity from client to server to all client ?

 

Thanks

 

-hydroflame, FRev-

 

extra:

I research a bit into packet132TileEntityData and sending this kind of packet from client to server side will just kick the client. because server doesn't want these kind of packets.

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

You need the magic of PACKETS!

And a packet handler!

 

Packet250CustomPayload ahoy!

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.

Posted

TileEntity has this function called...

 

public Packet getDescriptionPacket()
    {
        return null;
    }

 

You need to overide that, have it create a packet with the new data, then PacketDispatcher.sendPacketToServer(packet)

Which then the packet will asrive at the server and you'll need to override

 

public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt)
    {
    }

 

To read the packet, and also send that data back to all players.

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.

Posted

...... getDescriptionPacket is supposed to give a Packet132TileEntity, sending such packet to the server will kick the client. please refer to net.minecraft.client.multiplayer.NetClientHandler, net.minecraft.network.packet.NetHandler and net.minecraft.network.NetServerHandler refering to method handleTileEntityData

 

the method "getDescriptionPacket" is supposed to be called server side and will manage to wich player it needs to be sent. so that player far away will not receive a packet for a tile entity that isnt even loaded.

i wish to NOT overload my network with packet that dont need to be send.

 

-hydroflame, FRev-

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

Then you know more than I do.

I've dealt with packets like twice, both times I used Packet250.

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.

Posted

Don't worry. I do have a working solution (using p250) it's just that there seems to be possible bug in it. I was jsut expecting that there would be a solid solution that doesnt have this kind of flaw

 

may i ask from where you are getting the World variable when you arrive server side ?

mines from a cast of Player to EntityplayerMP and from it i can get worldObj.

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

may i ask from where you are getting the World variable when you arrive server side ?

mines from a cast of Player to EntityplayerMP and from it i can get worldObj.

 

Like I said, twice.

 

Both times server to client.

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.

Posted

hmmmmmmmmm

 

well nevermind all that. Even vanilla does the same thing. I even amde a test to make sure it was a bug.

So since the NetHandler will try to use the world that the player is currently in. Theres a possibliity that the server will not be able to process the packet correctly. It wont make the server crash though because theres a check to see if the variable is not null.

 

If someone ever send a packet changing tile entities to the server and changes world BEFORE the packet is processed (ex, click to send change and jump in the end) the packet will NOT take effect and you will have lost your changes. this is a bug btw but its a vanilla one. i did tested and reproduced it by setting a delay between arrival of the packet and process. used it with sign and command block.

 

 

 

tl;dr version

dont change Tile entity and switch dimension super fast. youll lose your progress (sign text or commands for exemple)

 

 

Cheers,

-hydroflame, author of FRev-

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

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

    • log: https://mclo.gs/QJg3wYX as stated in the title, my game freezes upon loading into the server after i used a far-away waystone in it. The modpack i'm using is better minecraft V18. Issue only comes up in this specific server, singleplayer and other servers are A-okay. i've already experimented with removing possible culprits like modernfix and various others to no effect. i've also attempted a full reinstall of the modpack profile. Issue occurs shortly after the 'cancel' button dissapears on the 'loading world' section of the loading screen.   thanks in advance.
    • 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
    • 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?
  • Topics

×
×
  • Create New...

Important Information

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