Jump to content

1.19.2 Writing and reading HashMap server -> client buf.writeMap() and buf.readMap()


andreybadrey

Recommended Posts

Hello everyone, I'm new, I'm working on an RPG mod and have achieved good results

now I'm working on compressing the package system, namely, I want to combine all the player variable synchronization packages into one multifunctional package

at the moment I have to synchronize each player characteristic with a separate package, because if you combine all the characteristics in one package, then in my opinion this will give a huge load on the server with good online

I want to write a package that will send data to the client in the form of a HashMap()

something like this: if the player's experience is updated, The server sends to the client Map<"exp", 200 000>

If the level of the player has changed during the increase in experience, the server sends to the client Map<"exp", 200 000><"lvl", 3>

The client, having received this packet, reads the entire HashMap in turn, and updates only those data that have been changed and transmitted

 

I am facing the following difficulties:

1. buf.writeMap(Map<K, V> p_236832_, FriendlyByteBuf.Writer<K> p_236833_, FriendlyByteBuf.Writer<V> p_236834_)

as far as I understand Map<K, V> p_236832_  the read source is passed to this parameter, namely the Map() object, I managed to send it

FriendlyByteBuf.Writer<K> & FriendlyByteBuf.Writer<V> I don’t understand how to format it correctly, after many attempts and sorting through everything I already know, it turned out to make these parameters accepted through lambdas and did not cause errors, but most likely it was not correct

2. buf.readMap(FriendlyByteBuf.Reader<K> p_236848_, FriendlyByteBuf.Reader<V> p_236849_)

FriendlyByteBuf.Reader<K> & FriendlyByteBuf.Reader<V> What is it?

because the method returns this.readMap(Maps::newHashMapWithExpectedSize, p_236848_, p_236849_);

I realized that there is a bork in a new map, but again I don’t understand how to count from the transferred map keys & values

please help me to write these two methods in correct syntax

show any example, at least in which it will be clear what data is passed to these methods

Link to comment
Share on other sites

It seems that I won one part, but still not completely

public void toBytes(Map<String, Long> map,FriendlyByteBuf buf) {
          buf.writeMap(map, 
(friendlyByteBuf, s) -> {},   (friendlyByteBuf, aLong) -> {});

}

But it's still not right, is it?

and how to arrange {....} ?

 

following the logic, I wrote this


public void toBytes(Map<String, Long> map,FriendlyByteBuf buf) {
buf.writeMap(map, FriendlyByteBuf::writeUtf, FriendlyByteBuf::writeLong);
}

 

in short, I won

Edited by andreybadrey
Link to comment
Share on other sites

I saw that the forum was also interested in this topic, so I will prescribe the package template


import com.bodryak.gmod.variables.client.PDC;
import com.google.common.collect.Maps;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;

import java.util.Map;
import java.util.function.Supplier;

public class PDSyncS2CPacket {
    private final Map<String, Long> toSync ;

    public PDSyncS2CPacket(Map<String, Long> map) {
        this.toSync = map;
    }

    public PDSyncS2CPacket(FriendlyByteBuf buf) {
        this.toSync = buf.readMap(Maps::newHashMapWithExpectedSize,FriendlyByteBuf::readUtf, FriendlyByteBuf::readLong);
    }

    public void toBytes(FriendlyByteBuf buf) {
        buf.writeMap(this.toSync, FriendlyByteBuf::writeUtf, FriendlyByteBuf::writeLong);
    }

    public boolean handle(Supplier<NetworkEvent.Context> supplier) {
        NetworkEvent.Context context = supplier.get();
        context.enqueueWork(() -> {
            // HERE WE ARE ON THE CLIENT!
            if (this.toSync.get("lvl") != null){
                PDC.setLvl(this.toSync.get("lvl"));
                System.out.println("Server send lvl " + this.toSync.get("lvl"));
            }
            if (this.toSync.get("exp") != null){
                PDC.setExp(this.toSync.get("exp"));
                System.out.println("server send exp " + this.toSync.get("exp"));
            }
            if (this.toSync.get("nlv") != null){
                PDC.setNlv(this.toSync.get("nlv"));
                System.out.println("server send exp to next lvl " + this.toSync.get("nlv"));
            }

        });
        return true;
    }
}

Please, I beg you, if all this is not written correctly, give feedback

Edited by andreybadrey
fix error
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.

×
×
  • Create New...

Important Information

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