Skip to content

Commit

Permalink
fix: 去NMS后一些实体数据没有被正确转换
Browse files Browse the repository at this point in the history
misc: More more more Custom Serialize Methods
  • Loading branch information
MATRIX-feather committed Feb 9, 2025
1 parent 421a2ac commit 21a2e25
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import io.papermc.paper.adventure.PaperAdventure;
import io.papermc.paper.math.Rotations;
import net.kyori.adventure.text.Component;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
Expand All @@ -14,8 +15,8 @@
import net.minecraft.world.entity.npc.VillagerData;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerType;
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.entity.*;
import org.joml.Vector3i;
import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.DataWrappers;
import xyz.nifeather.morph.backends.server.renderer.utilties.HolderUtils;

Expand Down Expand Up @@ -113,4 +114,24 @@ public class CustomSerializeMethods

return new WrappedDataValue(sv.index(), POSE_SERIALIZER, nmsPose);
};

private static final WrappedDataWatcher.Serializer SNIFFER_STATE_SERIALIZER = WrappedDataWatcher.Registry.fromHandle(EntityDataSerializers.SNIFFER_STATE);
public static ICustomSerializeMethod<Sniffer.State> SNIFFER_STATE = (sv, val) ->
{
var nmsState = net.minecraft.world.entity.animal.sniffer.Sniffer.State.values()[val.ordinal()];

return new WrappedDataValue(sv.index(), SNIFFER_STATE_SERIALIZER, nmsState);
};

private static final WrappedDataWatcher.Serializer BLOCKPOS_SERIALIZER = WrappedDataWatcher.Registry.getBlockPositionSerializer(true);
public static ICustomSerializeMethod<Optional<Vector3i>> BLOCKPOS = (sv, optional) ->
{
if (optional.isEmpty())
return new WrappedDataValue(sv.index(), BLOCKPOS_SERIALIZER, Optional.empty());

var val = optional.get();
var blockPos = new BlockPos(val.x(), val.y(), val.z());

return new WrappedDataValue(sv.index(), BLOCKPOS_SERIALIZER, Optional.of(blockPos));
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -201,28 +201,37 @@ public PacketContainer rebuildServerMetaPacket(AbstractValues av, SingleWatcher
for (WrappedDataValue w : originalData)
{
var index = w.getIndex();
var rawValue = w.getRawValue();

// 跳过被屏蔽的数据
if (blockedValues.contains(index))
continue;

// 寻找与其匹配的SingleValue
//
// todo: 自从去NMS化之后,一些同一个Index上的值和他们对应的SingleValue用旧办法来看已经不再匹配了
// 因此需要寻找别的方法来更全面地证明某个Index和SingleValue匹配
// 现在我们只能临时删除class验证
var singleValue = values.stream()
.filter(sv -> sv.index() == index && (rawValue == null || rawValue.getClass() == sv.defaultValue().getClass()))
.filter(sv -> sv.index() == index)
.findFirst().orElse(null);

// 如果没有找到,则代表此Index和伪装不兼容,跳过
if (singleValue == null)
continue;

// 从Watcher获取要设定的数据值,如果没有,则从服务器的包里取
// 如果 Watcher 中有覆盖的有对应的值,则重新包装,否则原样返回
var val = watcher.readOr(singleValue.index(), null);
if (val == null) val = w.getRawValue();

var wrapped = ((SingleValue<Object>)singleValue).wrap(val);
if (val != null)
{
var wrapped = ((SingleValue<Object>)singleValue).wrap(val);

valuesToAdd.add(wrapped);
valuesToAdd.add(wrapped);
}
else
{
valuesToAdd.add(w);
}
}

newPacket.getDataValueCollectionModifier().write(0, valuesToAdd);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;

import net.minecraft.world.entity.animal.sniffer.Sniffer;
import org.bukkit.entity.Sniffer;
import xyz.nifeather.morph.backends.server.renderer.network.CustomSerializeMethods;
import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;

public class SnifferValues extends AnimalValues
Expand All @@ -10,6 +11,8 @@ public class SnifferValues extends AnimalValues

public SnifferValues()
{
SNIFFER_STATE.setSerializeMethod(CustomSerializeMethods.SNIFFER_STATE);

registerSingle(SNIFFER_STATE, DROP_SEED_AT_TICK);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;

import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleOptions;
import org.joml.Vector3i;
import xyz.nifeather.morph.backends.server.renderer.network.CustomSerializeMethods;
import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;

Expand All @@ -16,14 +16,16 @@ public class LivingEntityValues extends EntityValues
public final SingleValue<Boolean> POTION_ISAMBIENT = createSingle("living_potion_is_ambient", false);
public final SingleValue<Integer> STUCKED_ARROWS = createSingle("living_stucked_arrows", 0);
public final SingleValue<Integer> BEE_STINGERS = createSingle("living_bee_stingers", 0);
public final SingleValue<Optional<BlockPos>> BED_POS = createSingle("living_bed_pos", Optional.of(new BlockPos(0,0,0)));
public final SingleValue<Optional<Vector3i>> BED_POS = createSingle("living_bed_pos", Optional.of(new Vector3i(0,0,0)));

public LivingEntityValues()
{
super();

POTION_COLOR.setSerializeMethod(CustomSerializeMethods.PARTICLE_OPTIONS);

BED_POS.setSerializeMethod(CustomSerializeMethods.BLOCKPOS);

registerSingle(LIVING_FLAGS, HEALTH, POTION_COLOR, POTION_ISAMBIENT, STUCKED_ARROWS, BED_POS, BEE_STINGERS);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;

import net.minecraft.Util;
import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;

import java.util.Optional;
import java.util.UUID;

public class TameableAnimalValues extends AnimalValues
{
private static final UUID NIL_UUID = new UUID(0L, 0L);

public final SingleValue<Byte> TAMEABLE_FLAGS = createSingle("tameable_flags", (byte)0x00);
public final SingleValue<Optional<UUID>> OWNER = createSingle("tameable_owner", Optional.of(Util.NIL_UUID));
public final SingleValue<Optional<UUID>> OWNER = createSingle("tameable_owner", Optional.of(NIL_UUID));

public TameableAnimalValues()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import it.unimi.dsi.fastutil.Pair;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectObjectMutablePair;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ColorParticleOption;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleTypes;
Expand All @@ -14,6 +13,7 @@
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.potion.PotionEffect;
import org.joml.Vector3i;
import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
import xyz.nifeather.morph.misc.NmsRecord;

Expand Down Expand Up @@ -100,20 +100,13 @@ protected void doSync()
writeTemp(values.STUCKED_ARROWS, player.getArrowsInBody());
writeTemp(values.BEE_STINGERS, player.getBeeStingersInBody());

Optional<BlockPos> bedPos = Optional.empty();
Optional<Vector3i> bedPos = Optional.empty();
if (player.isSleeping())
{
try
{
var bukkitPos = player.getBedLocation();
bedPos = Optional.of(
new BlockPos(bukkitPos.blockX(),bukkitPos.blockY(), bukkitPos.blockZ())
);
}
catch (Throwable t)
{
logger.warn("Error occurred while processing bed pos: " + t.getMessage());
}
var bukkitPos = player.getBedLocation();
bedPos = Optional.of(
new Vector3i(bukkitPos.blockX(), bukkitPos.blockY(), bukkitPos.blockZ())
);
}

writeTemp(values.BED_POS, bedPos);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;

import net.minecraft.world.entity.animal.sniffer.Sniffer;
import org.bukkit.Sound;
import org.bukkit.SoundCategory;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Sniffer;
import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
Expand Down

0 comments on commit 21a2e25

Please sign in to comment.