9
0
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:
XiaoMoMi
2025-04-14 02:27:57 +08:00
parent b63625ba20
commit b327ed11d5
24 changed files with 433 additions and 129 deletions

View File

@@ -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.*;

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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) {

View File

@@ -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));
}
}

View File

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