mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-27 10:59:07 +00:00
优化component实现
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
package net.momirealms.craftengine.mod;
|
||||
package net.momirealms.craftengine.mod.block;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
@@ -14,6 +14,7 @@ import net.minecraft.world.level.block.*;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import net.momirealms.craftengine.mod.CraftEnginePlugin;
|
||||
import net.momirealms.craftengine.mod.util.NoteBlockUtils;
|
||||
import net.momirealms.craftengine.shared.ObjectHolder;
|
||||
import net.momirealms.craftengine.shared.block.*;
|
||||
@@ -1,4 +1,4 @@
|
||||
package net.momirealms.craftengine.mod;
|
||||
package net.momirealms.craftengine.mod.block;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
@@ -0,0 +1,41 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -11,8 +11,8 @@ import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.momirealms.craftengine.mod.CraftEngineBlock;
|
||||
import net.momirealms.craftengine.mod.CraftEnginePlugin;
|
||||
import net.momirealms.craftengine.mod.block.CraftEngineBlock;
|
||||
import net.momirealms.craftengine.mod.util.NoteBlockUtils;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
@@ -27,7 +27,7 @@ import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Mixin(value = Blocks.class)
|
||||
public abstract class MixinBlocks {
|
||||
public abstract class BlocksMixin {
|
||||
|
||||
@Inject(method = "<clinit>", at = @At("RETURN"))
|
||||
private static void onBlocksInit(CallbackInfo ci) {
|
||||
@@ -0,0 +1,48 @@
|
||||
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,6 +6,7 @@
|
||||
"target": "@env(DEFAULT)",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"server": [
|
||||
"MixinBlocks"
|
||||
"BlocksMixin",
|
||||
"ItemStackMixin"
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user