diff --git a/build.gradle b/build.gradle index 41b4dfa..cece967 100644 --- a/build.gradle +++ b/build.gradle @@ -88,6 +88,10 @@ java { withSourcesJar() } +loom { + accessWidenerPath = file("src/main/resources/sfcraft.accesswidener") +} + jar { from("LICENSE") { rename { "${it}_${project.archivesBaseName}" } diff --git a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java index 0f83cc6..54359e3 100644 --- a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java +++ b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java @@ -23,6 +23,9 @@ import io.ib67.sfcraft.module.command.ManagementModule; import io.ib67.sfcraft.registry.room.SimpleRoomRegistry; import io.ib67.sfcraft.room.RoomTeleporter; import lombok.extern.log4j.Log4j2; +import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; @Log4j2 @@ -61,6 +64,8 @@ public class SFCraftInitializer extends GuiceModInitializer { registerFeature(RoomModule.class); registerFeature(CreativeRoomModule.class); registerFeature(ChatPrefixModule.class); + registerFeature(CustomItemModule.class); + } @Override diff --git a/src/main/java/io/ib67/sfcraft/SFItemRegistry.java b/src/main/java/io/ib67/sfcraft/SFItemRegistry.java new file mode 100644 index 0000000..ee81330 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/SFItemRegistry.java @@ -0,0 +1,29 @@ +package io.ib67.sfcraft; + +import com.mojang.serialization.Codec; +import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; +import net.fabricmc.fabric.api.event.registry.RegistryAttribute; +import net.minecraft.component.ComponentType; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.Item; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.registry.DefaultedRegistry; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.util.Identifier; + +import java.util.function.UnaryOperator; + +public class SFItemRegistry { + public static final String SF_ITEM_TYPE_KEY = "sf_type"; + public static final Registry ITEMS = FabricRegistryBuilder + .createSimple(RegistryKey.ofRegistry(Identifier.of(SFCraft.MOD_ID, "item"))) + .attribute(RegistryAttribute.MODDED) + .buildAndRegister(); + + public static void init() { + SFItems.init(); + } +} diff --git a/src/main/java/io/ib67/sfcraft/SFItems.java b/src/main/java/io/ib67/sfcraft/SFItems.java new file mode 100644 index 0000000..df106a9 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/SFItems.java @@ -0,0 +1,27 @@ +package io.ib67.sfcraft; + +import io.ib67.sfcraft.item.AeroBackpack; +import io.ib67.sfcraft.mixin.common.bridge.ItemBridge; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.Item; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +public class SFItems { + public static final Item AERO_BACKPACK = register( + new AeroBackpack(new Item.Settings().maxDamage(ArmorItem.Type.CHESTPLATE.getMaxDamage(15))), "aero_backpack"); + + public static void init() { + } + + private static Item register(Item item, String id) { + Identifier itemID = Identifier.of(SFCraft.MOD_ID, id); + Item registeredItem = Registry.register(SFItemRegistry.ITEMS, itemID, item); + ((ItemBridge) registeredItem).setRegistryEntry(SFItemRegistry.ITEMS.getEntry(itemID).get()); + return registeredItem; + } + + public static Item getById(Identifier item) { + return SFItemRegistry.ITEMS.get(item); + } +} diff --git a/src/main/java/io/ib67/sfcraft/item/AeroBackpack.java b/src/main/java/io/ib67/sfcraft/item/AeroBackpack.java new file mode 100644 index 0000000..20b4785 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/item/AeroBackpack.java @@ -0,0 +1,26 @@ +package io.ib67.sfcraft.item; + +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.*; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.text.Text; + +public class AeroBackpack extends ArmorItem implements TickableItem, SFItem { + private static final Text STATUS_MESSAGE = Text.of("You're wearing aero backpack!"); + + public AeroBackpack(Settings settings) { + super(ArmorMaterials.IRON, Type.CHESTPLATE, settings); + } + + @Override + public void onUpdate(PlayerEntity player, ItemStack stack, EquipmentSlot slot) { + if (slot != EquipmentSlot.CHEST) return; + player.sendMessage(STATUS_MESSAGE, true); + } + + @Override + public Item getMappedItem() { + return Items.IRON_CHESTPLATE; + } +} diff --git a/src/main/java/io/ib67/sfcraft/item/SFItem.java b/src/main/java/io/ib67/sfcraft/item/SFItem.java new file mode 100644 index 0000000..dcf7249 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/item/SFItem.java @@ -0,0 +1,8 @@ +package io.ib67.sfcraft.item; + +import net.minecraft.item.Item; +import net.minecraft.registry.entry.RegistryEntry; + +public interface SFItem { + Item getMappedItem(); +} diff --git a/src/main/java/io/ib67/sfcraft/item/TickableItem.java b/src/main/java/io/ib67/sfcraft/item/TickableItem.java new file mode 100644 index 0000000..94f694c --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/item/TickableItem.java @@ -0,0 +1,10 @@ +package io.ib67.sfcraft.item; + +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.server.network.ServerPlayerEntity; + +public interface TickableItem { + void onUpdate(PlayerEntity player, ItemStack stack, EquipmentSlot slot); +} diff --git a/src/main/java/io/ib67/sfcraft/mixin/common/PlayerEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/PlayerEntityMixin.java index 6b5ed9a..2d364ed 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/common/PlayerEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/PlayerEntityMixin.java @@ -1,7 +1,7 @@ package io.ib67.sfcraft.mixin.common; import io.ib67.sfcraft.callback.SFCallbacks; -import io.ib67.sfcraft.mixin.server.bridge.EntityBridge; +import io.ib67.sfcraft.mixin.common.bridge.EntityBridge; import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/bridge/EntityBridge.java b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/EntityBridge.java similarity index 90% rename from src/main/java/io/ib67/sfcraft/mixin/server/bridge/EntityBridge.java rename to src/main/java/io/ib67/sfcraft/mixin/common/bridge/EntityBridge.java index 30d63eb..5f96708 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/bridge/EntityBridge.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/EntityBridge.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server.bridge; +package io.ib67.sfcraft.mixin.common.bridge; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ItemBridge.java b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ItemBridge.java new file mode 100644 index 0000000..6d25b30 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ItemBridge.java @@ -0,0 +1,12 @@ +package io.ib67.sfcraft.mixin.common.bridge; + +import net.minecraft.item.Item; +import net.minecraft.registry.entry.RegistryEntry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Item.class) +public interface ItemBridge { + @Accessor + void setRegistryEntry(RegistryEntry.Reference value); +} diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/bridge/ServerPlayerBridge.java b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerPlayerBridge.java similarity index 85% rename from src/main/java/io/ib67/sfcraft/mixin/server/bridge/ServerPlayerBridge.java rename to src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerPlayerBridge.java index a8560f8..f16c928 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/bridge/ServerPlayerBridge.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerPlayerBridge.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server.bridge; +package io.ib67.sfcraft.mixin.common.bridge; import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/bridge/ServerWorldBridge.java b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerWorldBridge.java similarity index 87% rename from src/main/java/io/ib67/sfcraft/mixin/server/bridge/ServerWorldBridge.java rename to src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerWorldBridge.java index c9c65a2..9648848 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/bridge/ServerWorldBridge.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerWorldBridge.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server.bridge; +package io.ib67.sfcraft.mixin.common.bridge; import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.SleepManager; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java index 3a83819..de9ceb1 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java @@ -1,6 +1,6 @@ package io.ib67.sfcraft.mixin.server; -import io.ib67.sfcraft.mixin.server.bridge.ServerWorldBridge; +import io.ib67.sfcraft.mixin.common.bridge.ServerWorldBridge; import net.minecraft.block.AbstractFurnaceBlock; import net.minecraft.block.BlockState; import net.minecraft.block.BlockWithEntity; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java index 7231b08..0abc16f 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -2,13 +2,9 @@ package io.ib67.sfcraft.mixin.server; import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.callback.SFCallbacks; -import io.ib67.sfcraft.mixin.server.bridge.ServerPlayerBridge; +import io.ib67.sfcraft.mixin.common.bridge.ServerPlayerBridge; import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator; -import net.minecraft.entity.EntityType; -import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.message.MessageDecorator; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.text.Text; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java index b34fe6d..c014fc4 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java @@ -1,6 +1,6 @@ package io.ib67.sfcraft.mixin.server; -import io.ib67.sfcraft.mixin.server.bridge.ServerWorldBridge; +import io.ib67.sfcraft.mixin.common.bridge.ServerWorldBridge; import io.ib67.sfcraft.util.MixinHelper; import net.minecraft.server.world.ServerWorld; import net.minecraft.world.GameRules; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/item/ItemMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/item/ItemMixin.java new file mode 100644 index 0000000..4e1b4f0 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/server/item/ItemMixin.java @@ -0,0 +1,26 @@ +package io.ib67.sfcraft.mixin.server.item; + +import io.ib67.sfcraft.SFItemRegistry; +import io.ib67.sfcraft.item.SFItem; +import net.minecraft.item.Item; +import net.minecraft.registry.DefaultedRegistry; +import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(Item.class) +public abstract class ItemMixin { + @Redirect( + method ="", + at= @At(value = "INVOKE", target = "Lnet/minecraft/registry/DefaultedRegistry;createEntry(Ljava/lang/Object;)Lnet/minecraft/registry/entry/RegistryEntry$Reference;") + ) + public RegistryEntry.Reference sf$redirectCreateEntry(DefaultedRegistry instance, Object o){ + if(this instanceof SFItem) { + return null; + } + return instance.createEntry(o); + } +} diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/item/ItemStackMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/item/ItemStackMixin.java new file mode 100644 index 0000000..b6fcb37 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/server/item/ItemStackMixin.java @@ -0,0 +1,68 @@ +package io.ib67.sfcraft.mixin.server.item; + +import io.ib67.sfcraft.SFCraft; +import io.ib67.sfcraft.SFItemRegistry; +import io.ib67.sfcraft.item.SFItem; +import net.minecraft.component.ComponentHolder; +import net.minecraft.component.ComponentMapImpl; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ItemStack.class) +public abstract class ItemStackMixin implements ComponentHolder { + @Shadow + @Final + @Deprecated + @Nullable + private Item item; + + @Shadow @Final private static Logger LOGGER; + @Unique + private Item sfItem; + + @Inject(method = "(Lnet/minecraft/item/ItemConvertible;ILnet/minecraft/component/ComponentMapImpl;)V", at = @At("TAIL")) + private void initSFItem(ItemConvertible item, int count, ComponentMapImpl components, CallbackInfo ci) { + var _id = get(DataComponentTypes.CUSTOM_DATA); + if (_id != null && _id.contains(SFItemRegistry.SF_ITEM_TYPE_KEY)) { + var id = _id.copyNbt().getString(SFItemRegistry.SF_ITEM_TYPE_KEY); + try { + sfItem = SFItemRegistry.ITEMS.get(Identifier.of(SFCraft.MOD_ID, id)); + }catch(Exception e){ + e.printStackTrace(); + } + if(sfItem == null){ + LOGGER.warn("A invalid sfItem is being created: {}", id); + new IllegalStateException("Just stacktrace").printStackTrace(); + } + } + } + + @Inject(method = "getItem", at = @At("HEAD"), cancellable = true) + private void beforeGetItem(CallbackInfoReturnable cir) { + if (sfItem != null) cir.setReturnValue(sfItem); + } + + @Redirect(method = "getRegistryEntry", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getItem()Lnet/minecraft/item/Item;")) + private Item sf$getMappedEntry(ItemStack instance) { + return item; + } + + @Redirect(method = "copy", at= @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getItem()Lnet/minecraft/item/Item;")) + private Item sf$getCopySubject(ItemStack instance){ + return item; + } +} diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/item/PlayerEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/item/PlayerEntityMixin.java new file mode 100644 index 0000000..3a571dc --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/server/item/PlayerEntityMixin.java @@ -0,0 +1,42 @@ +package io.ib67.sfcraft.mixin.server.item; + +import io.ib67.sfcraft.item.TickableItem; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(PlayerEntity.class) +public abstract class PlayerEntityMixin { + @Shadow + public abstract ItemStack getEquippedStack(EquipmentSlot slot); + + @Inject(method = "updateTurtleHelmet", at = @At("TAIL")) + public void sf$tickMyItems(CallbackInfo ci) { + checkAndUpdate(EquipmentSlot.OFFHAND); + checkAndUpdate(EquipmentSlot.MAINHAND); + checkAndUpdate(EquipmentSlot.HEAD); + checkAndUpdate(EquipmentSlot.CHEST); + checkAndUpdate(EquipmentSlot.LEGS); + checkAndUpdate(EquipmentSlot.FEET); + checkAndUpdate(EquipmentSlot.BODY); + } + + @Unique + private void checkAndUpdate(EquipmentSlot equipmentSlot) { + var item = getEquippedStack(equipmentSlot); + if (item.getItem() instanceof TickableItem tickableItem) { + tickableItem.onUpdate($this(), item, equipmentSlot); + } + } + + @Unique + private PlayerEntity $this() { + return (PlayerEntity) (Object) this; + } +} diff --git a/src/main/java/io/ib67/sfcraft/module/CustomItemModule.java b/src/main/java/io/ib67/sfcraft/module/CustomItemModule.java new file mode 100644 index 0000000..cd8885e --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/module/CustomItemModule.java @@ -0,0 +1,71 @@ +package io.ib67.sfcraft.module; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import io.ib67.sfcraft.SFItemRegistry; +import io.ib67.sfcraft.SFItems; +import io.ib67.sfcraft.ServerModule; +import io.ib67.sfcraft.item.SFItem; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.command.argument.IdentifierArgumentType; +import net.minecraft.command.argument.ItemStackArgument; +import net.minecraft.component.ComponentChanges; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class CustomItemModule extends ServerModule { + @Override + public void onInitialize() { + SFItemRegistry.init(); + CommandRegistrationCallback.EVENT + .register(this::registerCommand); + } + + private void registerCommand(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess, CommandManager.RegistrationEnvironment environment) { + dispatcher.register( + CommandManager.literal("sfgive") + .then( + CommandManager.argument("item", IdentifierArgumentType.identifier()) + .executes(this::performGive) + ) + ); + } + + private static ItemStack getItemByName(Identifier id) throws CommandSyntaxException { + var item = SFItems.getById(id); + if(item == null) return null; + var stack = new ItemStack(((SFItem) item).getMappedItem()); + var cmp = new NbtCompound(); + cmp.putString(SFItemRegistry.SF_ITEM_TYPE_KEY, item.getRegistryEntry().getKey().map(it -> it.getValue().getPath()).orElseThrow()); + stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(cmp)); + return stack.copy(); + } + + + private int performGive(CommandContext context) throws CommandSyntaxException { + var item = IdentifierArgumentType.getIdentifier(context, "item"); + if (!context.getSource().isExecutedByPlayer()) { + context.getSource().sendMessage(Text.of("Can't be executed by non-players")); + return 0; + } + var player = context.getSource().getPlayer(); + var itemStack = getItemByName(item); + if (itemStack != null) { + player.giveItemStack(itemStack); + }else{ + player.sendMessage(Text.of("Item with id "+item.toString()+" not exists.")); + } + return 1; + } +} diff --git a/src/main/resources/sfcraft.accesswidener b/src/main/resources/sfcraft.accesswidener new file mode 100644 index 0000000..2e8c5c9 --- /dev/null +++ b/src/main/resources/sfcraft.accesswidener @@ -0,0 +1,2 @@ +accessWidener v2 named +mutable field net/minecraft/item/Item registryEntry Lnet/minecraft/registry/entry/RegistryEntry$Reference; \ No newline at end of file diff --git a/src/main/resources/sfcraft.mixins.json b/src/main/resources/sfcraft.mixins.json index e5c2636..24a9f7c 100644 --- a/src/main/resources/sfcraft.mixins.json +++ b/src/main/resources/sfcraft.mixins.json @@ -4,39 +4,43 @@ "package": "io.ib67.sfcraft.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "common.bridge.EntityBridge", + "common.bridge.ServerPlayerBridge", + "common.bridge.ServerWorldBridge", + "common.bridge.ItemBridge" ], "client": [ ], "server": [ - "server.AbstractFurnaceBlockMixin", "common.EntityMixin", + "common.MobEntityMixin", + "common.PlayerEntityMixin", + "server.AbstractFurnaceBlockMixin", "server.LegacyQueryHandlerMixin", "server.MinecraftServerMixin", - "common.PlayerEntityMixin", "server.ServerHandshakeNetworkHandlerMixin", "server.ServerLoginNetworkHandlerMixin", "server.ServerPlayerEntityMixin", "server.ServerPlayNetworkHandlerMixin", "server.ServerWorldMixin", "server.SleepManagerMixin", - "server.bridge.EntityBridge", - "server.bridge.ServerPlayerBridge", - "server.bridge.ServerWorldBridge", "server.fixes.EndermanEntityMixin", "server.fixes.ProjectileEntityMixin", - "common.MobEntityMixin", "server.hack.EntitySpawnS2CPacketMixin", - "server.hack.RegistryHandlerMixin", "server.hack.HoverEntityContentMixin", - "server.subserver.ServerLoginNetworkHandlerMixin", + "server.hack.RegistryHandlerMixin", + "server.item.ItemMixin", + "server.item.ItemStackMixin", + "server.item.PlayerEntityMixin", + "server.optimize.LivingEntityMixin", "server.subserver.EntityMixin", + "server.subserver.GameRuleCommandMixin", + "server.subserver.PlayerListS2CPacket$EntryMixin", "server.subserver.PlayerManagerMixin", "server.subserver.PlayerSaveHandlerMixin", + "server.subserver.ServerLoginNetworkHandlerMixin", "server.subserver.ServerPlayerEntityMixin", - "server.subserver.PlayerListS2CPacket$EntryMixin", - "server.subserver.WorldMixin", - "server.subserver.GameRuleCommandMixin", - "server.optimize.LivingEntityMixin" + "server.subserver.WorldMixin" ], "injectors": { "defaultRequire": 1