mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-29 20:09:13 +00:00
重构发包物品系统
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
"target": "@env(DEFAULT)",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"server": [
|
||||
"BlocksMixin",
|
||||
"FriendlyByteBufMixin"
|
||||
"BlocksMixin"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
"target": "@env(DEFAULT)",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"server": [
|
||||
"BlocksMixin",
|
||||
"ItemStackMixin"
|
||||
"BlocksMixin"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user