Jump to content

[Solved][1.16] How to sync other player's capability and update it in own client


Recommended Posts

Posted (edited)

It's the first time for me to use capability,  maybe the question looks like so unreadable.

In multiplayer game, the value in capability is displayed correctly on each player's own client,but when I try to get other player's value in client side, the value is not correct,  is the initial value.

In my client, only my player's value is correct, other player's values are wrong.

In server side,  the value from each player is correct.   

I don't know how to sync the value from other player,i want to use the value in a render event.

I have already send packet in PlayerLoggedInEvent、PlayerRespawnEvent、PlayerChangedDimensionEvent

 event.getPlayer().getCapability(GUI_SELECT).ifPresent(t -> 
 		TackleMessage.CHANNEL.send( PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()), 
        new GuiSelectMessage(t.getSelectParam()) )
 );

please help me 

Edited by Homura
Posted
2 minutes ago, diesieben07 said:
  • Whenever the data changes send the data to all tracking players and the player themselves. You can use PacketDistributor.TRACKING_ENTITY_AND_SELF for this, it will send packets to the player themselves as well as all players that are tracking the player (i.e. they are within visual range).
  • In PlayerEvent.StartTracking check if event.getTarget is a player. If so, send the data of event.getTarget to event.getPlayer.

I try to do like this, but when a target player changes the value,  my own player's value has been changed too.

It seems that it sends the value of the target to my player...

I guess that the problem may be in here ... just my guess...

This is a part of GuiSelectMessage.class, used to assign the received value to the value in the capability

    @Override
    public void process(Supplier<NetworkEvent.Context> context) {
        if (context.get().getDirection() == NetworkDirection.PLAY_TO_CLIENT) {
            context.get().enqueueWork(() ->Minecraft.getInstance().player.getCapability(GuiSelectCapability.GUI_SELECT).ifPresent(date -> {
                date.setSelectParam(selectParam);
            }));
        }
    }

 

Posted
20 minutes ago, diesieben07 said:

To achieve this you'll have to augment your packet to include the player that the information is for. You can do this via their entity ID: Entity#getId and World#getEntity.

I must get the entity ID , and assign the value to the specific client player via the entity ID ... is that right?

Posted
55 minutes ago, diesieben07 said:

First I want to remind you that there is almost no difference between "multiplayer" and "singleplayer". If you start a single player world you are basically playing on a server, just alone. Single player uses an integrated server.

Here is what you need for full syncing:

  • In PlayerLoggedInEvent, PlayerRespawnEvent and PlayerChangedDimensionEvent send the player their own data (you already have this).
  • Whenever the data changes send the data to all tracking players and the player themselves. You can use PacketDistributor.TRACKING_ENTITY_AND_SELF for this, it will send packets to the player themselves as well as all players that are tracking the player (i.e. they are within visual range).
  • In PlayerEvent.StartTracking check if event.getTarget is a player. If so, send the data of event.getTarget to event.getPlayer.

To achieve this you'll have to augment your packet to include the player that the information is for. You can do this via their entity ID: Entity#getId and World#getEntity.

I achieved it !! I used the PlayerEvent.StartTracking event and sent the entity ID.

Thank you for your help very much!

  • Homura changed the title to [Solved][1.16] How to sync other player's capability and update it in own client

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

    • I have no idea what the flip is going on, I can load the modpack just fine at forge 42.2.0 but any forge version above it insta-crashes with exit code 1. Can somebody tell me what's going on, this is minecraft 1.20.1 Latest.log: https://pastebin.com/pBUL1ZFa
    • does anyone know how to incorporate custom noise settings into a custom dimension through the use of datagen, I have created a custon json file for the noise settings that I want but I just don't know how to get it to register with the generated json file of the custom dimension.   here is the code for the dimension class package net.hurst.lustria.worldgen.dimension; import com.mojang.datafixers.util.Pair; import net.hurst.lustria.Lustria; import net.hurst.lustria.worldgen.biome.ModBiomes; import net.hurst.lustria.worldgen.registries.LustriaNoiseSettings; import net.minecraft.core.HolderGetter; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.util.valueproviders.ConstantInt; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.*; import net.minecraft.world.level.dimension.BuiltinDimensionTypes; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import java.util.List; import java.util.OptionalLong; public class ModDimensions { public static final ResourceKey<LevelStem> LUSTRIA_KEY = ResourceKey.create(Registries.LEVEL_STEM, ResourceLocation.fromNamespaceAndPath(Lustria.MOD_ID, "lustriadim")); public static final ResourceKey<Level> LUSTRIA_LEVEL_KEY = ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath(Lustria.MOD_ID, "lustriadim")); public static final ResourceKey<DimensionType> LUSTRIA_DIM_TYPE = ResourceKey.create(Registries.DIMENSION_TYPE, ResourceLocation.fromNamespaceAndPath(Lustria.MOD_ID, "lustriadim_type")); public static void bootstrapType(BootstapContext<DimensionType> context) { context.register(LUSTRIA_DIM_TYPE, new DimensionType( OptionalLong.of(12000), // fixedTime false, // hasSkylight true, // hasCeiling false, // ultraWarm false, // natural 1.0, // coordinateScale true, // bedWorks false, // respawnAnchorWorks -64, // minY 256, // height 256, // logicalHeight BlockTags.INFINIBURN_OVERWORLD, // infiniburn BuiltinDimensionTypes.OVERWORLD_EFFECTS, // effectsLocation 0.0f, // ambientLight new DimensionType.MonsterSettings(false, false, ConstantInt.of(0), 0))); } public static void bootstrapStem(BootstapContext<LevelStem> context) { HolderGetter<Biome> biomeRegistry = context.lookup(Registries.BIOME); HolderGetter<DimensionType> dimTypes = context.lookup(Registries.DIMENSION_TYPE); HolderGetter<NoiseGeneratorSettings> noiseGenSettings = context.lookup(Registries.NOISE_SETTINGS); NoiseBasedChunkGenerator wrappedChunkGenerator = new NoiseBasedChunkGenerator( new FixedBiomeSource(biomeRegistry.getOrThrow(Biomes.BEACH)), noiseGenSettings.getOrThrow(NoiseGeneratorSettings.CAVES)); NoiseBasedChunkGenerator noiseBasedChunkGenerator = new NoiseBasedChunkGenerator( MultiNoiseBiomeSource.createFromList( new Climate.ParameterList<>(List.of(Pair.of( Climate.parameters(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(Biomes.BEACH)), Pair.of( Climate.parameters(0.1F, 0.2F, 0.0F, 0.2F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(Biomes.BIRCH_FOREST)), Pair.of( Climate.parameters(0.3F, 0.6F, 0.1F, 0.1F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(Biomes.OCEAN)), Pair.of( Climate.parameters(0.4F, 0.3F, 0.2F, 0.1F, 0.0F, 0.0F, 0.0F), biomeRegistry.getOrThrow(Biomes.DARK_FOREST)) ))), noiseGenSettings.getOrThrow(NoiseGeneratorSettings.CAVES)); LevelStem stem = new LevelStem(dimTypes.getOrThrow(ModDimensions.LUSTRIA_DIM_TYPE), noiseBasedChunkGenerator); context.register(LUSTRIA_KEY, stem); } } minecraft version is 1.20.1
    • Please read the FAQ (https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/) and post logs as described there using a site like https://mclo.gs and post the link to it here. It may have the information required to solve your problem.  
    • the error code comes up when i trry to run it and ive tried to fix it but i cant  
  • Topics

×
×
  • Create New...

Important Information

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