9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-29 20:09:13 +00:00

重构发包物品系统

This commit is contained in:
XiaoMoMi
2025-05-28 00:29:31 +08:00
parent fb40b49549
commit e491b28722
22 changed files with 364 additions and 372 deletions

View File

@@ -1,25 +0,0 @@
package net.momirealms.craftengine.mod.item;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
public class CustomStreamCodec {
public static Function<ItemStack, ItemStack> clientBoundDataProcessor;
public static Function<ItemStack, ItemStack> serverBoundDataProcessor;
public static @NotNull ItemStack s2c(@NotNull ItemStack itemStack) {
if (clientBoundDataProcessor != null) {
itemStack = clientBoundDataProcessor.apply(itemStack);
}
return itemStack;
}
public static @NotNull ItemStack c2s(@NotNull ItemStack itemStack) {
if (serverBoundDataProcessor != null) {
itemStack = serverBoundDataProcessor.apply(itemStack);
}
return itemStack;
}
}

View File

@@ -1,30 +0,0 @@
package net.momirealms.craftengine.mod.mixin;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.item.ItemStack;
import net.momirealms.craftengine.mod.item.CustomStreamCodec;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
@Mixin(value = FriendlyByteBuf.class)
public class FriendlyByteBufMixin {
@ModifyVariable(
method = "a(Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/network/PacketDataSerializer;",
at = @At("HEAD"),
argsOnly = true
)
private ItemStack modifyWriteItemParam(ItemStack stack) {
return stack.isEmpty() ? stack : CustomStreamCodec.s2c(stack);
}
@ModifyReturnValue(
method = "r()Lnet/minecraft/world/item/ItemStack;",
at = @At("RETURN")
)
private ItemStack modifyReadItemStack(ItemStack original) {
return original.isEmpty() ? original : CustomStreamCodec.c2s(original);
}
}

View File

@@ -6,7 +6,6 @@
"target": "@env(DEFAULT)",
"compatibilityLevel": "JAVA_21",
"server": [
"BlocksMixin",
"FriendlyByteBufMixin"
"BlocksMixin"
]
}

View File

@@ -1,41 +0,0 @@
package net.momirealms.craftengine.mod.item;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import java.util.function.Function;
public class CustomStreamCodec implements StreamCodec<RegistryFriendlyByteBuf, ItemStack> {
public static Function<ItemStack, ItemStack> clientBoundDataProcessor;
public static Function<ItemStack, ItemStack> serverBoundDataProcessor;
private final StreamCodec<RegistryFriendlyByteBuf, ItemStack> original;
public CustomStreamCodec(StreamCodec<RegistryFriendlyByteBuf, ItemStack> original) {
this.original = Objects.requireNonNull(original);
}
@Override
public @NotNull ItemStack decode(@NotNull RegistryFriendlyByteBuf buffer) {
ItemStack itemStack = this.original.decode(buffer);
if (!itemStack.isEmpty()) {
if (serverBoundDataProcessor != null) {
itemStack = serverBoundDataProcessor.apply(itemStack);
}
}
return itemStack;
}
@Override
public void encode(@NotNull RegistryFriendlyByteBuf buffer, @NotNull ItemStack value) {
if (!value.isEmpty()) {
if (clientBoundDataProcessor != null) {
value = clientBoundDataProcessor.apply(value);
}
}
this.original.encode(buffer, value);
}
}

View File

@@ -1,48 +0,0 @@
package net.momirealms.craftengine.mod.mixin;
import net.minecraft.core.NonNullList;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;
import net.momirealms.craftengine.mod.item.CustomStreamCodec;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List;
@Mixin(ItemStack.class)
public abstract class ItemStackMixin {
@Shadow(remap = false)
@Mutable
public static StreamCodec<RegistryFriendlyByteBuf, ItemStack> OPTIONAL_STREAM_CODEC;
@Shadow(remap = false)
@Mutable
public static StreamCodec<RegistryFriendlyByteBuf, List<ItemStack>> OPTIONAL_LIST_STREAM_CODEC;
private static StreamCodec<RegistryFriendlyByteBuf, ItemStack> ORIGINAL_OPTIONAL_STREAM_CODEC;
@Inject(
method = "<clinit>",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/world/item/ItemStack;OPTIONAL_STREAM_CODEC:Lnet/minecraft/network/codec/StreamCodec;",
opcode = Opcodes.PUTSTATIC,
shift = At.Shift.AFTER
)
)
private static void captureOriginalAfterAssignment(CallbackInfo ci) {
ORIGINAL_OPTIONAL_STREAM_CODEC = OPTIONAL_STREAM_CODEC;
}
@Inject(method = "<clinit>", at = @At("RETURN"))
private static void replaceStreamCodec(CallbackInfo ci) {
OPTIONAL_STREAM_CODEC = new CustomStreamCodec(ORIGINAL_OPTIONAL_STREAM_CODEC);
OPTIONAL_LIST_STREAM_CODEC = OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.collection(NonNullList::createWithCapacity));
}
}

View File

@@ -6,7 +6,6 @@
"target": "@env(DEFAULT)",
"compatibilityLevel": "JAVA_21",
"server": [
"BlocksMixin",
"ItemStackMixin"
"BlocksMixin"
]
}

View File

@@ -1,41 +0,0 @@
package net.momirealms.craftengine.mod.item;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import java.util.function.Function;
public class CustomStreamCodec implements StreamCodec<RegistryFriendlyByteBuf, ItemStack> {
public static Function<ItemStack, ItemStack> clientBoundDataProcessor;
public static Function<ItemStack, ItemStack> serverBoundDataProcessor;
private final StreamCodec<RegistryFriendlyByteBuf, ItemStack> original;
public CustomStreamCodec(StreamCodec<RegistryFriendlyByteBuf, ItemStack> original) {
this.original = Objects.requireNonNull(original);
}
@Override
public @NotNull ItemStack decode(@NotNull RegistryFriendlyByteBuf buffer) {
ItemStack itemStack = this.original.decode(buffer);
if (!itemStack.isEmpty()) {
if (serverBoundDataProcessor != null) {
itemStack = serverBoundDataProcessor.apply(itemStack);
}
}
return itemStack;
}
@Override
public void encode(@NotNull RegistryFriendlyByteBuf buffer, @NotNull ItemStack value) {
if (!value.isEmpty()) {
if (clientBoundDataProcessor != null) {
value = clientBoundDataProcessor.apply(value);
}
}
this.original.encode(buffer, value);
}
}

View File

@@ -1,66 +0,0 @@
package net.momirealms.craftengine.mod.mixin;
import net.minecraft.core.NonNullList;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;
import net.momirealms.craftengine.mod.item.CustomStreamCodec;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List;
@Mixin(ItemStack.class)
public abstract class ItemStackMixin {
@Shadow(remap = false)
@Mutable
public static StreamCodec<RegistryFriendlyByteBuf, ItemStack> OPTIONAL_STREAM_CODEC;
@Shadow(remap = false)
@Mutable
public static StreamCodec<RegistryFriendlyByteBuf, List<ItemStack>> OPTIONAL_LIST_STREAM_CODEC;
@Shadow(remap = false)
@Mutable
public static StreamCodec<RegistryFriendlyByteBuf, ItemStack> OPTIONAL_UNTRUSTED_STREAM_CODEC;
private static StreamCodec<RegistryFriendlyByteBuf, ItemStack> ORIGINAL_OPTIONAL_STREAM_CODEC;
private static StreamCodec<RegistryFriendlyByteBuf, ItemStack> ORIGINAL_OPTIONAL_UNTRUSTED_STREAM_CODEC;
@Inject(
method = "<clinit>",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/world/item/ItemStack;OPTIONAL_STREAM_CODEC:Lnet/minecraft/network/codec/StreamCodec;",
opcode = Opcodes.PUTSTATIC,
shift = At.Shift.AFTER
)
)
private static void captureOriginalAfterAssignment0(CallbackInfo ci) {
ORIGINAL_OPTIONAL_STREAM_CODEC = OPTIONAL_STREAM_CODEC;
}
@Inject(
method = "<clinit>",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/world/item/ItemStack;OPTIONAL_UNTRUSTED_STREAM_CODEC:Lnet/minecraft/network/codec/StreamCodec;",
opcode = Opcodes.PUTSTATIC,
shift = At.Shift.AFTER
)
)
private static void captureOriginalAfterAssignment1(CallbackInfo ci) {
ORIGINAL_OPTIONAL_UNTRUSTED_STREAM_CODEC = OPTIONAL_UNTRUSTED_STREAM_CODEC;
}
@Inject(method = "<clinit>", at = @At("RETURN"))
private static void replaceStreamCodec(CallbackInfo ci) {
OPTIONAL_STREAM_CODEC = new CustomStreamCodec(ORIGINAL_OPTIONAL_STREAM_CODEC);
OPTIONAL_UNTRUSTED_STREAM_CODEC = new CustomStreamCodec(ORIGINAL_OPTIONAL_UNTRUSTED_STREAM_CODEC);
OPTIONAL_LIST_STREAM_CODEC = OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.collection(NonNullList::createWithCapacity));
}
}