diff --git a/.gitignore b/.gitignore index cf0b319f6..339b6bd98 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +run_fabric_smoke +tmp_arclight_api_src + # User-specific stuff .idea/ diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/entity/EntityBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/entity/EntityBridge.java index 0d83d4e85..c6153c6d3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/entity/EntityBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/entity/EntityBridge.java @@ -4,9 +4,11 @@ import net.minecraft.core.PositionImpl; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; import org.bukkit.craftbukkit.v.entity.CraftEntity; import org.bukkit.projectiles.ProjectileSource; +import java.util.Collection; import java.util.List; public interface EntityBridge extends ICommandSourceBridge { @@ -52,4 +54,10 @@ public interface EntityBridge extends ICommandSourceBridge { int bridge$getRideCooldown(); boolean bridge$canCollideWith(Entity entity); + + Collection bridge$captureDrops(); + + Collection bridge$captureDrops(Collection value); + + void bridge$revive(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java index 329d301a4..3898a6fe5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java @@ -1,11 +1,9 @@ package io.izzel.arclight.common.mixin.bukkit; -import io.izzel.arclight.common.mod.server.entity.ArclightFakePlayer; import io.izzel.arclight.common.mod.server.entity.EntityClassLookup; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.boss.EnderDragonPart; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; -import net.minecraftforge.common.util.FakePlayer; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.entity.CraftComplexPart; import org.bukkit.craftbukkit.v.entity.CraftEnderDragonPart; @@ -28,17 +26,16 @@ public abstract class CraftEntityMixin implements org.bukkit.entity.Entity { @Inject(method = "getEntity", cancellable = true, at = @At("HEAD")) private static void arclight$fakePlayer(CraftServer server, Entity entity, CallbackInfoReturnable cir) { - if (entity instanceof FakePlayer) { - cir.setReturnValue(new ArclightFakePlayer(server, (FakePlayer) entity)); + if (cir.isCancelled()) { return; } if (entity instanceof EnderDragonPart part) { if (part.parentMob instanceof EnderDragon) { - cir.setReturnValue(new CraftEnderDragonPart(server, (EnderDragonPart) entity)); + cir.setReturnValue(new CraftEnderDragonPart(server, part)); return; } - cir.setReturnValue(new CraftComplexPart(server, (EnderDragonPart) entity)); + cir.setReturnValue(new CraftComplexPart(server, part)); return; } var convert = EntityClassLookup.getConvert(entity); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin_Forge.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin_Forge.java new file mode 100644 index 000000000..4a2342708 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin_Forge.java @@ -0,0 +1,24 @@ +package io.izzel.arclight.common.mixin.bukkit; + +import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod; +import io.izzel.arclight.common.mod.server.entity.ArclightFakePlayer; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.common.util.FakePlayer; +import org.bukkit.craftbukkit.v.CraftServer; +import org.bukkit.craftbukkit.v.entity.CraftEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@LoadIfMod(modid = "forge", condition = LoadIfMod.ModCondition.PRESENT) +@Mixin(value = CraftEntity.class, remap = false) +public abstract class CraftEntityMixin_Forge { + + @Inject(method = "getEntity", cancellable = true, at = @At("HEAD")) + private static void arclight$forge$fakePlayer(CraftServer server, Entity entity, CallbackInfoReturnable cir) { + if (entity instanceof FakePlayer) { + cir.setReturnValue(new ArclightFakePlayer(server, (FakePlayer) entity)); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java index 262be4083..0b12d00ba 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java @@ -52,7 +52,10 @@ public class CraftEventFactoryMixin { @Shadow public static Block blockDamage; - @Inject(method = "handleEntityDamageEvent(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Ljava/util/Map;Ljava/util/Map;Z)Lorg/bukkit/event/entity/EntityDamageEvent;", at = @At("HEAD")) + @Inject(method = { + "handleEntityDamageEvent(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Ljava/util/Map;Ljava/util/Map;Z)Lorg/bukkit/event/entity/EntityDamageEvent;", + "handleEntityDamageEvent(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Ljava/util/Map;Ljava/util/Map;Z)Lorg/bukkit/event/entity/EntityDamageEvent;" + }, at = @At("HEAD")) private static void arclight$captureSource(Entity entity, DamageSource source, Map modifiers, Map> modifierFunctions, boolean cancelled, CallbackInfoReturnable cir) { Entity damageEventEntity = ArclightCaptures.getDamageEventEntity(); BlockPos damageEventBlock = ArclightCaptures.getDamageEventBlock(); @@ -70,7 +73,10 @@ public class CraftEventFactoryMixin { } } - @Inject(method = "handleEntityDamageEvent(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Ljava/util/Map;Ljava/util/Map;Z)Lorg/bukkit/event/entity/EntityDamageEvent;", cancellable = true, at = @At(value = "NEW", target = "java/lang/IllegalStateException")) + @Inject(method = { + "handleEntityDamageEvent(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Ljava/util/Map;Ljava/util/Map;Z)Lorg/bukkit/event/entity/EntityDamageEvent;", + "handleEntityDamageEvent(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Ljava/util/Map;Ljava/util/Map;Z)Lorg/bukkit/event/entity/EntityDamageEvent;" + }, cancellable = true, at = @At(value = "NEW", target = "java/lang/IllegalStateException")) private static void arclight$unhandledDamage(Entity entity, DamageSource source, Map modifiers, Map> modifierFunctions, boolean cancelled, CallbackInfoReturnable cir) { // todo blockDamage is lost EntityDamageEvent event; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftHumanEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftHumanEntityMixin.java index e732f1d24..8df56305a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftHumanEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftHumanEntityMixin.java @@ -1,9 +1,7 @@ package io.izzel.arclight.common.mixin.bukkit; import io.izzel.arclight.common.bridge.core.inventory.container.ContainerBridge; -import io.izzel.arclight.common.mod.server.ArclightForgePermissible; import io.izzel.arclight.common.mod.util.ArclightCaptures; -import io.izzel.arclight.i18n.ArclightConfig; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; @@ -17,13 +15,10 @@ import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; import org.bukkit.craftbukkit.v.inventory.CraftInventoryPlayer; import org.bukkit.inventory.InventoryView; -import org.bukkit.permissions.PermissibleBase; -import org.bukkit.permissions.ServerOperator; import org.spongepowered.asm.mixin.Mixin; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.lang.reflect.Field; @@ -47,15 +42,6 @@ public void setHandle(Entity entity) { this.inventory = new CraftInventoryPlayer(((Player) entity).getInventory()); } - @Redirect(method = "", at = @At(value = "NEW", target = "org/bukkit/permissions/PermissibleBase")) - private PermissibleBase arclight$forwardPerm(ServerOperator opable) { - if (ArclightConfig.spec().getCompat().isForwardPermissionReverse()) { - return new ArclightForgePermissible(opable); - } else { - return new PermissibleBase(opable); - } - } - @Inject(method = "getOpenInventory", at = @At("HEAD")) private void arclight$capturePlayer(CallbackInfoReturnable cir) { ArclightCaptures.captureContainerOwner(this.getHandle()); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftHumanEntityMixin_Forge.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftHumanEntityMixin_Forge.java new file mode 100644 index 000000000..fda2294dc --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftHumanEntityMixin_Forge.java @@ -0,0 +1,25 @@ +package io.izzel.arclight.common.mixin.bukkit; + +import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod; +import io.izzel.arclight.common.mod.server.ArclightForgePermissible; +import io.izzel.arclight.i18n.ArclightConfig; +import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; +import org.bukkit.permissions.PermissibleBase; +import org.bukkit.permissions.ServerOperator; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@LoadIfMod(modid = "forge", condition = LoadIfMod.ModCondition.PRESENT) +@Mixin(value = CraftHumanEntity.class, remap = false) +public abstract class CraftHumanEntityMixin_Forge { + + @Redirect(method = "", at = @At(value = "NEW", target = "(Lorg/bukkit/permissions/ServerOperator;)Lorg/bukkit/permissions/PermissibleBase;")) + private PermissibleBase arclight$forge$forwardPerm(ServerOperator opable) { + if (ArclightConfig.spec().getCompat().isForwardPermissionReverse()) { + return new ArclightForgePermissible(opable); + } else { + return new PermissibleBase(opable); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java index 571db9879..5952c684b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java @@ -27,7 +27,7 @@ public abstract class CraftItemStackMixin implements CraftItemStackBridge { @Shadow static Material getType(ItemStack item) { throw new RuntimeException(); } - @Inject(method = "getItemMeta(Lnet/minecraft/world/item/ItemStack;)Lorg/bukkit/inventory/meta/ItemMeta;", cancellable = true, at = @At(value = "INVOKE", target = "Lorg/bukkit/Material;ordinal()I")) + @Inject(method = "getItemMeta(Lnet/minecraft/class_1799;)Lorg/bukkit/inventory/meta/ItemMeta;", cancellable = true, at = @At(value = "INVOKE", target = "Lorg/bukkit/Material;ordinal()I")) private static void arclight$noTag(ItemStack item, CallbackInfoReturnable cir) { if (item.getTag() == null) { var meta = CraftItemFactory.instance().getItemMeta(getType(item)); @@ -36,7 +36,7 @@ public abstract class CraftItemStackMixin implements CraftItemStackBridge { } } - @Inject(method = "getItemMeta(Lnet/minecraft/world/item/ItemStack;)Lorg/bukkit/inventory/meta/ItemMeta;", at = @At("RETURN")) + @Inject(method = "getItemMeta(Lnet/minecraft/class_1799;)Lorg/bukkit/inventory/meta/ItemMeta;", at = @At("RETURN")) private static void arclight$offerCaps(ItemStack item, CallbackInfoReturnable cir) { if (item == null) return; ItemMeta meta = cir.getReturnValue(); @@ -47,7 +47,7 @@ public abstract class CraftItemStackMixin implements CraftItemStackBridge { ((ItemMetaBridge) meta).bridge$setForgeCaps(((ItemStackBridge) (Object) item).bridge$getForgeCaps()); } - @Inject(method = "setItemMeta(Lnet/minecraft/world/item/ItemStack;Lorg/bukkit/inventory/meta/ItemMeta;)Z", at = @At(value = "INVOKE", ordinal = 1, remap = true, target = "Lnet/minecraft/world/item/ItemStack;getItem()Lnet/minecraft/world/item/Item;")) + @Inject(method = "setItemMeta(Lnet/minecraft/class_1799;Lorg/bukkit/inventory/meta/ItemMeta;)Z", at = @At(value = "INVOKE", ordinal = 1, remap = true, target = "Lnet/minecraft/world/item/ItemStack;getItem()Lnet/minecraft/world/item/Item;")) private static void arclight$setCaps(ItemStack item, ItemMeta itemMeta, CallbackInfoReturnable cir) { CompoundTag forgeCaps = ((ItemMetaBridge) itemMeta).bridge$getForgeCaps(); if (forgeCaps != null) { @@ -56,7 +56,7 @@ public abstract class CraftItemStackMixin implements CraftItemStackBridge { } // @formatter:on - @Inject(method = "hasItemMeta(Lnet/minecraft/world/item/ItemStack;)Z", cancellable = true, at = @At("HEAD")) + @Inject(method = "hasItemMeta(Lnet/minecraft/class_1799;)Z", cancellable = true, at = @At("HEAD")) private static void arclight$hasMeta(ItemStack item, CallbackInfoReturnable cir) { if (item != null) { CompoundTag forgeCaps = ((ItemStackBridge) (Object) item).bridge$getForgeCaps(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java index 6665bdbf6..47f970070 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java @@ -65,7 +65,7 @@ public class CraftMetaItemMixin implements ItemMetaBridge { private CompoundTag internalTag; private CompoundTag forgeCaps; - @ModifyVariable(method = "(Lnet/minecraft/nbt/CompoundTag;)V", at = @At(value = "INVOKE", target = "Lorg/bukkit/UnsafeValues;getDataVersion()I")) + @ModifyVariable(method = "(Lnet/minecraft/nbt/CompoundTag;)V", at = @At(value = "INVOKE", target = "Lorg/bukkit/UnsafeValues;getDataVersion()I"), require = 0) private CompoundTag arclight$provideTag(CompoundTag tag) { return tag == null ? new CompoundTag() : tag; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftServerMixin.java index 7020a4032..a03259bce 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftServerMixin.java @@ -1,27 +1,32 @@ package io.izzel.arclight.common.mixin.bukkit; import com.google.common.collect.Lists; +import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.tree.CommandNode; +import com.mojang.brigadier.tree.LiteralCommandNode; import io.izzel.arclight.common.bridge.bukkit.CraftServerBridge; import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.mod.server.ArclightServer; +import io.izzel.arclight.common.mod.util.PlatformHooks; import jline.console.ConsoleReader; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; import net.minecraft.server.dedicated.DedicatedPlayerList; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.players.PlayerList; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.CommandEvent; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.craftbukkit.v.CraftServer; +import org.bukkit.craftbukkit.v.command.BukkitCommandWrapper; import org.bukkit.craftbukkit.v.command.CraftBlockCommandSender; import org.bukkit.craftbukkit.v.command.CraftCommandMap; +import org.bukkit.craftbukkit.v.command.VanillaCommandWrapper; import org.bukkit.craftbukkit.v.entity.CraftEntity; import org.bukkit.craftbukkit.v.entity.CraftPlayer; import org.bukkit.craftbukkit.v.help.SimpleHelpMap; @@ -43,6 +48,7 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -53,6 +59,9 @@ @Mixin(value = CraftServer.class, remap = false) public abstract class CraftServerMixin implements CraftServerBridge { + @Unique + private static volatile Field arclight$commandDispatcherField; + @Shadow public int reloadCount; @Shadow @@ -135,33 +144,19 @@ public ConsoleReader getReader() { return null; } - @ModifyVariable(method = "dispatchCommand", remap = false, index = 2, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lorg/spigotmc/AsyncCatcher;catchOp(Ljava/lang/String;)V")) - private String arclight$forgeCommandEvent(String commandLine, CommandSender sender) { - CommandSourceStack commandSource; - if (sender instanceof CraftEntity) { - commandSource = ((CraftEntity) sender).getHandle().createCommandSourceStack(); - } else if (sender == Bukkit.getConsoleSender()) { - commandSource = ArclightServer.getMinecraftServer().createCommandSourceStack(); - } else if (sender instanceof CraftBlockCommandSender) { - commandSource = ((CraftBlockCommandSender) sender).getWrapper(); - } else { - return commandLine; - } - StringReader stringreader = new StringReader("/" + commandLine); - if (stringreader.canRead() && stringreader.peek() == '/') { - stringreader.skip(); + @Unique + private static Field arclight$findCommandDispatcherField() { + Field cached = arclight$commandDispatcherField; + if (cached != null) { + return cached; } - ParseResults parse = ArclightServer.getMinecraftServer().getCommands() - .getDispatcher().parse(stringreader, commandSource); - CommandEvent event = new CommandEvent(parse); - if (MinecraftForge.EVENT_BUS.post(event)) { - return null; - } else if (event.getException() != null) { - return null; - } else { - String s = event.getParseResults().getReader().getString(); - return s.startsWith("/") ? s.substring(1) : s; + for (Field field : Commands.class.getDeclaredFields()) { + if (CommandDispatcher.class.isAssignableFrom(field.getType())) { + arclight$commandDispatcherField = field; + return field; + } } + return null; } @Inject(method = "dispatchCommand", remap = false, cancellable = true, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lorg/spigotmc/AsyncCatcher;catchOp(Ljava/lang/String;)V")) @@ -227,4 +222,88 @@ public void reload() { this.enablePlugins(PluginLoadOrder.POSTWORLD); this.getPluginManager().callEvent(new ServerLoadEvent(ServerLoadEvent.LoadType.RELOAD)); } + + @ModifyVariable(method = "dispatchCommand", remap = false, index = 2, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lorg/spigotmc/AsyncCatcher;catchOp(Ljava/lang/String;)V")) + private String arclight$forgeCommandEvent(String commandLine, CommandSender sender) { + CommandSourceStack commandSource; + if (sender instanceof CraftEntity) { + commandSource = ((CraftEntity) sender).getHandle().createCommandSourceStack(); + } else if (sender == Bukkit.getConsoleSender()) { + commandSource = ArclightServer.getMinecraftServer().createCommandSourceStack(); + } else if (sender instanceof CraftBlockCommandSender) { + commandSource = ((CraftBlockCommandSender) sender).getWrapper(); + } else { + return commandLine; + } + StringReader stringreader = new StringReader("/" + commandLine); + if (stringreader.canRead() && stringreader.peek() == '/') { + stringreader.skip(); + } + ParseResults parse = ArclightServer.getMinecraftServer().getCommands() + .getDispatcher().parse(stringreader, commandSource); + String parsed = PlatformHooks.processCommandEvent(parse); + if (parsed == null) { + return null; + } + return parsed.startsWith("/") ? parsed.substring(1) : parsed; + } + + /** + * @author QianMo0721 + * @reason 1.20.1+ no longer has Commands() no-arg constructor; rebuild dispatcher in-place. + */ + @Overwrite(remap = false) + public void syncCommands() { + Commands commands = this.console.getCommands(); + this.arclight$resetCommandDispatcher(commands); + + CommandDispatcher dispatcher = commands.getDispatcher(); + for (Map.Entry entry : this.commandMap.getKnownCommands().entrySet()) { + String label = entry.getKey(); + org.bukkit.command.Command command = entry.getValue(); + if (command instanceof VanillaCommandWrapper vanillaCommand) { + CommandNode rawNode = vanillaCommand.vanillaCommand; + if (!(rawNode instanceof LiteralCommandNode literalRaw)) { + continue; + } + @SuppressWarnings("unchecked") + LiteralCommandNode literal = (LiteralCommandNode) literalRaw; + LiteralCommandNode nodeToAdd = literal; + if (!literal.getLiteral().equals(label)) { + nodeToAdd = new LiteralCommandNode<>( + label, + literal.getCommand(), + literal.getRequirement(), + literal.getRedirect(), + literal.getRedirectModifier(), + literal.isFork() + ); + for (CommandNode child : literal.getChildren()) { + nodeToAdd.addChild(child); + } + } + dispatcher.getRoot().addChild(nodeToAdd); + } else { + new BukkitCommandWrapper((CraftServer) (Object) this, command).register(dispatcher, label); + } + } + + for (var player : this.playerList.players) { + commands.sendCommands(player); + } + } + + @Unique + private void arclight$resetCommandDispatcher(Commands commands) { + try { + Field dispatcherField = arclight$findCommandDispatcherField(); + if (dispatcherField == null) { + return; + } + dispatcherField.setAccessible(true); + dispatcherField.set(commands, new CommandDispatcher<>()); + } catch (Throwable throwable) { + this.logger.log(Level.WARNING, "Failed to reset command dispatcher before syncCommands", throwable); + } + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/commands/CommandsMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/commands/CommandsMixin.java index f3c70fc61..8938692a3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/commands/CommandsMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/commands/CommandsMixin.java @@ -9,13 +9,13 @@ import io.izzel.arclight.common.bridge.core.server.MinecraftServerBridge; import io.izzel.arclight.common.mod.compat.CommandNodeHooks; import io.izzel.arclight.common.mod.util.BukkitDispatcher; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.synchronization.SuggestionProviders; import net.minecraft.network.protocol.game.ClientboundCommandsPacket; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.server.command.CommandHelper; import org.bukkit.Bukkit; import org.bukkit.event.player.PlayerCommandSendEvent; import org.spigotmc.SpigotConfig; @@ -67,12 +67,19 @@ public void sendCommands(ServerPlayer player) { RootCommandNode vanillaRoot = new RootCommandNode<>(); Commands vanillaCommands = ((MinecraftServerBridge) player.server).bridge$getVanillaCommands(); map.put(vanillaCommands.getDispatcher().getRoot(), vanillaRoot); - // FORGE: Use our own command node merging method to handle redirect nodes properly, see issue #7551 - CommandHelper.mergeCommandNode(vanillaCommands.getDispatcher().getRoot(), vanillaRoot, map, player.createCommandSourceStack(), ctx -> 0, suggest -> SuggestionProviders.safelySwap((com.mojang.brigadier.suggestion.SuggestionProvider) (com.mojang.brigadier.suggestion.SuggestionProvider) suggest)); + if (PlatformHooks.isForgePresent()) { + PlatformHooks.mergeCommandNode(vanillaCommands.getDispatcher().getRoot(), vanillaRoot, map, player.createCommandSourceStack(), ctx -> 0, suggest -> SuggestionProviders.safelySwap((com.mojang.brigadier.suggestion.SuggestionProvider) (com.mojang.brigadier.suggestion.SuggestionProvider) suggest)); + } else { + this.fillUsableCommands(vanillaCommands.getDispatcher().getRoot(), vanillaRoot, player.createCommandSourceStack(), map); + } RootCommandNode node = new RootCommandNode<>(); map.put(this.dispatcher.getRoot(), node); - CommandHelper.mergeCommandNode(this.dispatcher.getRoot(), node, map, player.createCommandSourceStack(), ctx -> 0, suggest -> SuggestionProviders.safelySwap((com.mojang.brigadier.suggestion.SuggestionProvider) (com.mojang.brigadier.suggestion.SuggestionProvider) suggest)); + if (PlatformHooks.isForgePresent()) { + PlatformHooks.mergeCommandNode(this.dispatcher.getRoot(), node, map, player.createCommandSourceStack(), ctx -> 0, suggest -> SuggestionProviders.safelySwap((com.mojang.brigadier.suggestion.SuggestionProvider) (com.mojang.brigadier.suggestion.SuggestionProvider) suggest)); + } else { + this.fillUsableCommands(this.dispatcher.getRoot(), node, player.createCommandSourceStack(), map); + } LinkedHashSet set = new LinkedHashSet<>(); for (CommandNode child : node.getChildren()) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerHandshakeNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerHandshakeNetHandlerMixin.java index 8af9c8431..b4e46f179 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerHandshakeNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerHandshakeNetHandlerMixin.java @@ -4,6 +4,7 @@ import com.mojang.authlib.properties.Property; import com.mojang.util.UUIDTypeAdapter; import io.izzel.arclight.common.bridge.core.network.NetworkManagerBridge; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.SharedConstants; import net.minecraft.network.Connection; import net.minecraft.network.ConnectionProtocol; @@ -15,7 +16,6 @@ import net.minecraft.server.network.ServerHandshakePacketListenerImpl; import net.minecraft.server.network.ServerLoginPacketListenerImpl; import net.minecraft.server.network.ServerStatusPacketListenerImpl; -import net.minecraftforge.server.ServerLifecycleHooks; import org.apache.logging.log4j.LogManager; import org.bukkit.Bukkit; import org.spigotmc.SpigotConfig; @@ -49,7 +49,7 @@ public class ServerHandshakeNetHandlerMixin { */ @Overwrite public void handleIntention(ClientIntentionPacket packetIn) { - if (!ServerLifecycleHooks.handleServerLogin(packetIn, this.connection)) return; + if (!PlatformHooks.handleServerLogin(packetIn, this.connection)) return; ((NetworkManagerBridge) this.connection).bridge$setHostname(packetIn.hostName + ":" + packetIn.port); switch (packetIn.getIntention()) { case LOGIN: { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java index fd4a55825..60ec2bf19 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java @@ -15,6 +15,7 @@ import io.izzel.arclight.common.mod.ArclightConstants; import io.izzel.arclight.common.mod.server.ArclightServer; import io.izzel.arclight.common.mod.util.ArclightCaptures; +import io.izzel.arclight.common.mod.util.PlatformHooks; import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import net.minecraft.ChatFormatting; @@ -68,8 +69,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.server.ServerLifecycleHooks; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -629,7 +628,7 @@ public void handleMovePlayer(ServerboundMovePlayerPacket packetplayinflying) { if (!this.player.isChangingDimension() && (!this.player.serverLevel().getGameRules().getBoolean(GameRules.RULE_DISABLE_ELYTRA_MOVEMENT_CHECK) || !this.player.isFallFlying())) { float f2 = this.player.isFallFlying() ? 300.0F : 100.0F; - if (d11 - d10 > Math.max(f2, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { + if (d11 - d10 > Math.max(f2, Math.pow(SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed, 2)) && !this.isSingleplayerOwner()) { // CraftBukkit end ARCLIGHT_LOGGER.warn("moved-too-quickly", this.player.getName().getString(), d7, d8, d9); this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot()); @@ -713,7 +712,7 @@ public void handleMovePlayer(ServerboundMovePlayerPacket packetplayinflying) { } this.player.absMoveTo(d0, d1, d2, f, f1); // Copied from above - this.clientIsFloating = d12 >= -0.03125D && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR && !this.server.isFlightAllowed() && !this.player.getAbilities().mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && this.noBlocksAround((Entity) this.player) && !this.player.isAutoSpinAttack(); + this.clientIsFloating = d12 >= -0.03125D && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR && !this.server.isFlightAllowed() && !this.player.getAbilities().mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && this.noBlocksAround(this.player) && !this.player.isAutoSpinAttack(); // CraftBukkit end this.player.serverLevel().getChunkSource().move(this.player); this.player.doCheckFallDamage(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5, packetplayinflying.isOnGround()); @@ -753,8 +752,8 @@ public void handlePlayerAction(ServerboundPlayerActionPacket packetplayinblockdi // BetterCombat mixin compatibility // https://github.com/ZsoltMolnarrr/BetterCombat/blob/9090f08faf4a3e51256c8a7a13af94a80b6128c0/common/src/main/java/net/bettercombat/mixin/ServerPlayNetworkHandlerMixin.java ItemStack offhandStack = this.player.getItemInHand(InteractionHand.OFF_HAND); - var event = net.minecraftforge.common.ForgeHooks.onLivingSwapHandItems(this.player); - if (event.isCanceled()) return; + var event = PlatformHooks.onLivingSwapHandItems(this.player); + if (event.isCancelled()) return; ItemStack itemstack = event.getItemSwappedToMainHand(); ItemStack originMainHand = event.getItemSwappedToOffHand(); CraftItemStack mainHand = CraftItemStack.asCraftMirror(itemstack); @@ -994,7 +993,7 @@ public void handleChat(ServerboundChatPacket packet) { } CompletableFuture completablefuture = this.filterTextPacket(playerchatmessage.signedContent()); - CompletableFuture completablefuture1 = ForgeHooks.getServerChatSubmittedDecorator().decorate(this.player, playerchatmessage.decoratedContent()); + CompletableFuture completablefuture1 = PlatformHooks.decorateServerChat(this.player, playerchatmessage.decoratedContent()); this.chatMessageChain.append((executor) -> { return CompletableFuture.allOf(completablefuture, completablefuture1).thenAcceptAsync((ovoid) -> { @@ -1271,7 +1270,7 @@ private void performInteraction(InteractionHand hand, ServerGamePacketListenerIm // Fish bucket - SPIGOT-4048 if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || player.getInventory().getSelected() == null || player.getInventory().getSelected().getItem() != origItem)) { - send(new ClientboundAddEntityPacket((LivingEntity) entity)); + send(new ClientboundAddEntityPacket(entity)); player.containerMenu.sendAllDataToRemote(); } @@ -1321,7 +1320,7 @@ public void onInteraction(InteractionHand hand) { @Override public void onInteraction(InteractionHand hand, Vec3 vec) { this.performInteraction(hand, (player, e, h) -> { - var onInteractEntityAtResult = ForgeHooks.onInteractEntityAt(player, entity, vec, hand); + var onInteractEntityAtResult = PlatformHooks.onInteractEntityAt(player, entity, vec, hand); if (onInteractEntityAtResult != null) return onInteractEntityAtResult; return e.interactAt(player, vec, h); }, @@ -1786,75 +1785,73 @@ public void handlePlayerAbilities(ServerboundPlayerAbilitiesPacket packet) { } } - @Inject(method = "handleCustomPayload", at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/network/NetworkHooks;onCustomPayload(Lnet/minecraftforge/network/ICustomPacket;Lnet/minecraft/network/Connection;)Z")) + @Inject(method = "handleCustomPayload", at = @At("HEAD")) private void arclight$customPayload(ServerboundCustomPayloadPacket packet, CallbackInfo ci) { var readerIndex = packet.data.readerIndex(); var buf = new byte[packet.data.readableBytes()]; packet.data.readBytes(buf); packet.data.readerIndex(readerIndex); - ServerLifecycleHooks.getCurrentServer().executeIfPossible(() -> { - if (((MinecraftServerBridge) ServerLifecycleHooks.getCurrentServer()).bridge$hasStopped() || bridge$processedDisconnect()) { - return; - } - if (this.connection.isConnected()) { - if (packet.identifier.equals(CUSTOM_REGISTER)) { - try { - if (buf.length > 32767) { // Reasonable limit for channel names - ARCLIGHT_LOGGER.warn("custom-payload.register-too-large", buf.length); - this.disconnect("Invalid payload REGISTER!"); - return; - } - - String channels = new String(buf, StandardCharsets.UTF_8); - if (channels.length() > 32767) { // Additional safety check - ARCLIGHT_LOGGER.warn("custom-payload.register-string-too-long", channels.length()); - this.disconnect("Invalid payload REGISTER!"); - return; - } + if (((MinecraftServerBridge) this.server).bridge$hasStopped() || bridge$processedDisconnect()) { + return; + } + if (this.connection.isConnected()) { + if (packet.identifier.equals(CUSTOM_REGISTER)) { + try { + if (buf.length > 32767) { // Reasonable limit for channel names + ARCLIGHT_LOGGER.warn("custom-payload.register-too-large", buf.length); + this.disconnect("Invalid payload REGISTER!"); + return; + } - for (String channel : channels.split("\0")) { - if (!StringUtil.isNullOrEmpty(channel) && channel.length() <= 256) { // Validate channel name length - this.getCraftPlayer().addChannel(channel); - } - } - } catch (Exception ex) { - ARCLIGHT_LOGGER.error("custom-payload.register-error", ex); + String channels = new String(buf, StandardCharsets.UTF_8); + if (channels.length() > 32767) { // Additional safety check + ARCLIGHT_LOGGER.warn("custom-payload.register-string-too-long", channels.length()); this.disconnect("Invalid payload REGISTER!"); + return; } - } else if (packet.identifier.equals(CUSTOM_UNREGISTER)) { - try { - if (buf.length > 32767) { // Reasonable limit for channel names - ARCLIGHT_LOGGER.warn("custom-payload.unregister-too-large", buf.length); - this.disconnect("Invalid payload UNREGISTER!"); - return; - } - final String channels = new String(buf, StandardCharsets.UTF_8); - if (channels.length() > 32767) { // Additional safety check - ARCLIGHT_LOGGER.warn("custom-payload.unregister-string-too-long", channels.length()); - this.disconnect("Invalid payload UNREGISTER!"); - return; + for (String channel : channels.split("\0")) { + if (!StringUtil.isNullOrEmpty(channel) && channel.length() <= 256) { // Validate channel name length + this.getCraftPlayer().addChannel(channel); } + } + } catch (Exception ex) { + ARCLIGHT_LOGGER.error("custom-payload.register-error", ex); + this.disconnect("Invalid payload REGISTER!"); + } + } else if (packet.identifier.equals(CUSTOM_UNREGISTER)) { + try { + if (buf.length > 32767) { // Reasonable limit for channel names + ARCLIGHT_LOGGER.warn("custom-payload.unregister-too-large", buf.length); + this.disconnect("Invalid payload UNREGISTER!"); + return; + } - for (String channel : channels.split("\0")) { - if (!StringUtil.isNullOrEmpty(channel) && channel.length() <= 256) { // Validate channel name length - this.getCraftPlayer().removeChannel(channel); - } - } - } catch (Exception ex) { - ARCLIGHT_LOGGER.error("custom-payload.unregister-error", ex); + final String channels = new String(buf, StandardCharsets.UTF_8); + if (channels.length() > 32767) { // Additional safety check + ARCLIGHT_LOGGER.warn("custom-payload.unregister-string-too-long", channels.length()); this.disconnect("Invalid payload UNREGISTER!"); + return; } - } else { - try { - this.cserver.getMessenger().dispatchIncomingMessage(((ServerPlayerEntityBridge) this.player).bridge$getBukkitEntity(), packet.identifier.toString(), buf); - } catch (Exception ex) { - ARCLIGHT_LOGGER.error("custom-payload.dispatch-failed", ex); - this.disconnect("Invalid custom payload!"); + + for (String channel : channels.split("\0")) { + if (!StringUtil.isNullOrEmpty(channel) && channel.length() <= 256) { // Validate channel name length + this.getCraftPlayer().removeChannel(channel); + } } + } catch (Exception ex) { + ARCLIGHT_LOGGER.error("custom-payload.unregister-error", ex); + this.disconnect("Invalid payload UNREGISTER!"); + } + } else { + try { + this.cserver.getMessenger().dispatchIncomingMessage(((ServerPlayerEntityBridge) this.player).bridge$getBukkitEntity(), packet.identifier.toString(), buf); + } catch (Exception ex) { + ARCLIGHT_LOGGER.error("custom-payload.dispatch-failed", ex); + this.disconnect("Invalid custom payload!"); } } - }); + } } public final boolean isDisconnected() { @@ -1954,3 +1951,4 @@ public SocketAddress getRawAddress() { return this.connection.channel.remoteAddress(); } } + diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index fddbab488..dabd61e7a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -7,9 +7,11 @@ import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.mod.ArclightConstants; import io.izzel.arclight.common.mod.metrics.MetricsManager; +import io.izzel.arclight.common.mod.server.ArclightServer; import io.izzel.arclight.common.mod.server.BukkitRegistry; import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.izzel.arclight.common.mod.util.BukkitOptionParser; +import io.izzel.arclight.common.mod.util.PlatformHooks; import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger; import io.izzel.arclight.common.optimization.paper.WorldCreationOptimizer; import it.unimi.dsi.fastutil.longs.LongIterator; @@ -50,10 +52,6 @@ import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.WorldData; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.internal.BrandingControl; -import net.minecraftforge.server.ServerLifecycleHooks; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -196,10 +194,6 @@ private static MinecraftServer getServer() { @Shadow protected abstract void setupDebugLevel(WorldData p_240778_1_); - @Shadow(remap = false) - @Deprecated - public abstract void markWorldsDirty(); - @Shadow public abstract boolean isSpawningMonsters(); @@ -261,6 +255,7 @@ public boolean hasStopped() { } this.vanillaCommandDispatcher = worldStem.dataPackResources().getCommands(); this.worldLoader = ArclightCaptures.getDataLoadContext(); + ArclightServer.setMinecraftServer((MinecraftServer) (Object) this); } /** @@ -274,7 +269,7 @@ protected void runServer() { if (!this.initServer()) { throw new IllegalStateException("Failed to initialize server"); } - ServerLifecycleHooks.handleServerStarted((MinecraftServer) (Object) this); + PlatformHooks.handleServerStarted((MinecraftServer) (Object) this); long endTime = Util.getMillis(); this.nextTickTime = endTime; this.statusIcon = this.loadStatusIcon().orElse(null); @@ -325,8 +320,8 @@ protected void runServer() { JvmProfiler.INSTANCE.onServerTick(this.averageTickTime); } ARCLIGHT_LOGGER.info("server.stopping"); - ServerLifecycleHooks.handleServerStopping((MinecraftServer) (Object) this); - ServerLifecycleHooks.expectServerStopped(); // has to come before finalTick to avoid race conditions + PlatformHooks.handleServerStopping((MinecraftServer) (Object) this); + PlatformHooks.expectServerStopped(); // has to come before finalTick to avoid race conditions } catch (Throwable throwable1) { ARCLIGHT_LOGGER.error("server.unexpected-exception", throwable1); CrashReport crashreport = constructOrExtractCrashReport(throwable1); @@ -351,7 +346,7 @@ protected void runServer() { ARCLIGHT_LOGGER.warn("server.continuing-after-crash"); } - net.minecraftforge.server.ServerLifecycleHooks.expectServerStopped(); // Forge: Has to come before MinecraftServer#onServerCrash to avoid race conditions + PlatformHooks.expectServerStopped(); // Forge: Has to come before MinecraftServer#onServerCrash to avoid race conditions this.onServerCrash(crashreport); } finally { try { @@ -366,7 +361,7 @@ protected void runServer() { WatchdogThread.doStop(); // Shutdown async world save executor arclight$shutdownAsyncSaveExecutor(); - ServerLifecycleHooks.handleServerStopped((MinecraftServer) (Object) this); + PlatformHooks.handleServerStopped((MinecraftServer) (Object) this); ARCLIGHT_LOGGER.info("server.stopped"); this.onServerExit(); } @@ -405,9 +400,13 @@ protected void runServer() { @Inject(method = "createLevels", at = @At("RETURN")) public void arclight$enablePlugins(ChunkProgressListener p_240787_1_, CallbackInfo ci) { - BukkitRegistry.unlockRegistries(); + if (PlatformHooks.isForgePresent()) { + BukkitRegistry.unlockRegistries(); + } this.server.enablePlugins(PluginLoadOrder.POSTWORLD); - BukkitRegistry.lockRegistries(); + if (PlatformHooks.isForgePresent()) { + BukkitRegistry.lockRegistries(); + } this.server.getPluginManager().callEvent(new ServerLoadEvent(ServerLoadEvent.LoadType.STARTUP)); try { @@ -426,6 +425,12 @@ private void executeModerately() { java.util.concurrent.locks.LockSupport.parkNanos("executing tasks", 1000L); } + @Unique + private void arclight$markWorldsDirty() { + // 1.20.1 official mappings on Fabric side do not expose ServerLevel#setUnsaved(boolean). + // Keep this hook as a compatibility no-op to avoid startup crashes from missing shadow targets. + } + @Override public void bridge$drainQueuedTasks() { while (!processQueue.isEmpty()) { @@ -508,7 +513,7 @@ public void prepareLevels(ChunkProgressListener listener) { ChunkPos chunkpos = new ChunkPos(i); serverWorld.getChunkSource().updateChunkForced(chunkpos, true); } - net.minecraftforge.common.world.ForgeChunkManager.reinstatePersistentChunks(serverWorld, forcedchunkssavedata); + PlatformHooks.reinstatePersistentChunks(serverWorld, forcedchunkssavedata); } } Bukkit.getPluginManager().callEvent(new WorldLoadEvent(((WorldBridge) serverWorld).bridge$getWorld())); @@ -565,8 +570,8 @@ public void initWorld(ServerLevel serverWorld, ServerLevelData worldInfo, WorldD // bukkit methods public void prepareLevels(ChunkProgressListener listener, ServerLevel serverWorld) { - this.markWorldsDirty(); - MinecraftForge.EVENT_BUS.post(new LevelEvent.Load(serverWorld)); + this.arclight$markWorldsDirty(); + PlatformHooks.postLevelLoad(serverWorld); if (!((WorldBridge) serverWorld).bridge$getWorld().getKeepSpawnInMemory()) { return; } @@ -593,7 +598,7 @@ public void prepareLevels(ChunkProgressListener listener, ServerLevel serverWorl ChunkPos chunkpos = new ChunkPos(i); serverWorld.getChunkSource().updateChunkForced(chunkpos, true); } - net.minecraftforge.common.world.ForgeChunkManager.reinstatePersistentChunks(serverWorld, forcedchunkssavedata); + PlatformHooks.reinstatePersistentChunks(serverWorld, forcedchunkssavedata); } this.executeModerately(); listener.stop(); @@ -605,13 +610,13 @@ public void prepareLevels(ChunkProgressListener listener, ServerLevel serverWorl // bukkit callbacks public void addLevel(ServerLevel level) { this.levels.put(level.dimension(), level); - this.markWorldsDirty(); + this.arclight$markWorldsDirty(); } public void removeLevel(ServerLevel level) { - MinecraftForge.EVENT_BUS.post(new LevelEvent.Unload(level)); + PlatformHooks.postLevelUnload(level); this.levels.remove(level.dimension()); - this.markWorldsDirty(); + this.arclight$markWorldsDirty(); } @Inject(method = "tickChildren", at = @At("HEAD")) @@ -716,7 +721,7 @@ public void removeLevel(ServerLevel level) { @DontObfuscate @Overwrite public String getServerModName() { - return BrandingControl.getServerBranding() + " luminara/" + ArclightVersion.current().getReleaseName(); + return PlatformHooks.getServerBranding() + " luminara/" + ArclightVersion.current().getReleaseName(); } @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java index 86f76e593..992f9fe63 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java @@ -3,29 +3,26 @@ import io.izzel.arclight.common.mixin.core.server.MinecraftServerMixin; import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.server.BukkitRegistry; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.ConsoleInput; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.rcon.RconConsoleSource; -import net.minecrell.terminalconsole.TerminalConsoleAppender; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.command.CraftRemoteConsoleCommandSender; import org.bukkit.event.server.RemoteServerCommandEvent; import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.plugin.PluginLoadOrder; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.*; 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; -import java.io.IOException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -42,10 +39,14 @@ public DedicatedServerMixin(String name) { @Inject(method = "initServer", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/dedicated/DedicatedServer;setPlayerList(Lnet/minecraft/server/players/PlayerList;)V")) public void arclight$loadPlugins(CallbackInfoReturnable cir) { - BukkitRegistry.unlockRegistries(); + if (PlatformHooks.isForgePresent()) { + BukkitRegistry.unlockRegistries(); + } ((CraftServer) Bukkit.getServer()).loadPlugins(); ((CraftServer) Bukkit.getServer()).enablePlugins(PluginLoadOrder.STARTUP); - BukkitRegistry.lockRegistries(); + if (PlatformHooks.isForgePresent()) { + BukkitRegistry.lockRegistries(); + } } @Inject(method = "initServer", at = @At(value = "FIELD", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties;enableRcon:Z")) @@ -87,16 +88,25 @@ public String runCommand(String command) { @Inject(method = "onServerExit", at = @At("RETURN")) public void arclight$exitNow(CallbackInfo ci) { - try { - TerminalConsoleAppender.close(); - } catch (IOException e) { - e.printStackTrace(); - } + this.arclight$closeTerminalConsoleAppender(); Thread exitThread = new Thread(this::arclight$exit, "Exit Thread"); exitThread.setDaemon(true); exitThread.start(); } + @Unique + private void arclight$closeTerminalConsoleAppender() { + try { + Class appenderClass = Class.forName("net.minecrell.terminalconsole.TerminalConsoleAppender"); + Method closeMethod = appenderClass.getMethod("close"); + closeMethod.invoke(null); + } catch (ClassNotFoundException ignored) { + // Terminal console is optional on Fabric. + } catch (ReflectiveOperationException e) { + ArclightMod.LOGGER.debug("Failed to close TerminalConsoleAppender", e); + } + } + private void arclight$exit() { try { Thread.sleep(5000L); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ChunkHolderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ChunkHolderMixin.java index 017e59c86..5bb4a0631 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ChunkHolderMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ChunkHolderMixin.java @@ -15,10 +15,10 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; -import org.objectweb.asm.Opcodes; 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.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -37,9 +37,16 @@ public abstract class ChunkHolderMixin implements ChunkHolderBridge { @Shadow @Final private ShortSet[] changedBlocksPerSection; @Shadow public abstract CompletableFuture> getFutureIfPresentUnchecked(ChunkStatus p_219301_1_); - - @Override @Accessor("oldTicketLevel") public abstract int bridge$getOldTicketLevel(); // @formatter:on + @Unique + private FullChunkStatus arclight$oldFullStatus; + + @Override + @Accessor("oldTicketLevel") + public abstract int bridge$getOldTicketLevel(); + + @Shadow + public abstract FullChunkStatus getFullStatus(); public LevelChunk getFullChunkNow() { if (!ChunkLevel.fullStatus(this.oldTicketLevel).isOrAfter(FullChunkStatus.FULL)) { @@ -72,49 +79,49 @@ public LevelChunk getFullChunkNowUnchecked() { } } - @Inject(method = "updateFutures", at = @At(value = "JUMP", opcode = Opcodes.IFEQ, ordinal = 0), - locals = LocalCapture.CAPTURE_FAILHARD) - public void arclight$onChunkUnload(ChunkMap chunkManager, Executor executor, CallbackInfo ci, ChunkStatus chunkStatus, - ChunkStatus chunkStatus1, boolean flag, boolean flag1, - FullChunkStatus locationType, FullChunkStatus locationType1) { - if (locationType.isOrAfter(FullChunkStatus.FULL) && !locationType1.isOrAfter(FullChunkStatus.FULL)) { + @Inject(method = "updateFutures", at = @At("HEAD")) + private void arclight$captureOldStatus(ChunkMap chunkManager, Executor executor, CallbackInfo ci) { + this.arclight$oldFullStatus = ChunkLevel.fullStatus(this.oldTicketLevel); + } + + @Inject(method = "updateFutures", at = @At("RETURN")) + private void arclight$onStatusChange(ChunkMap chunkManager, Executor executor, CallbackInfo ci) { + var oldStatus = this.arclight$oldFullStatus; + var newStatus = this.getFullStatus(); + if (oldStatus == null) { + oldStatus = ChunkLevel.fullStatus(this.oldTicketLevel); + } + + if (!oldStatus.isOrAfter(FullChunkStatus.FULL) && newStatus.isOrAfter(FullChunkStatus.FULL)) { this.getFutureIfPresentUnchecked(ChunkStatus.FULL).thenAccept((either) -> { LevelChunk chunk = (LevelChunk) either.left().orElse(null); if (chunk != null) { - ((ChunkMapBridge) chunkManager).bridge$getCallbackExecutor().execute(() -> { - chunk.setUnsaved(true); - ((ChunkBridge) chunk).bridge$unloadCallback(); - }); + ((ChunkMapBridge) chunkManager).bridge$getCallbackExecutor().execute( + ((ChunkBridge) chunk)::bridge$loadCallback + ); } }).exceptionally((throwable) -> { // ensure exceptions are printed, by default this is not the case - ArclightMod.LOGGER.fatal("chunk.unload-callback.failed", this.pos, throwable); + ArclightMod.LOGGER.fatal("chunk.load-callback.failed", this.pos, throwable); return null; }); - // Run callback right away if the future was already done ((ChunkMapBridge) chunkManager).bridge$getCallbackExecutor().run(); } - } - @Inject(method = "updateFutures", at = @At("RETURN"), locals = LocalCapture.CAPTURE_FAILHARD) - public void arclight$onChunkLoad(ChunkMap chunkManager, Executor executor, CallbackInfo ci, ChunkStatus chunkStatus, - ChunkStatus chunkStatus1, boolean flag, boolean flag1, - FullChunkStatus locationType, FullChunkStatus locationType1) { - if (!locationType.isOrAfter(FullChunkStatus.FULL) && locationType1.isOrAfter(FullChunkStatus.FULL)) { + if (oldStatus.isOrAfter(FullChunkStatus.FULL) && !newStatus.isOrAfter(FullChunkStatus.FULL)) { this.getFutureIfPresentUnchecked(ChunkStatus.FULL).thenAccept((either) -> { LevelChunk chunk = (LevelChunk) either.left().orElse(null); if (chunk != null) { - ((ChunkMapBridge) chunkManager).bridge$getCallbackExecutor().execute( - ((ChunkBridge) chunk)::bridge$loadCallback - ); + ((ChunkMapBridge) chunkManager).bridge$getCallbackExecutor().execute(() -> { + chunk.setUnsaved(true); + ((ChunkBridge) chunk).bridge$unloadCallback(); + }); } }).exceptionally((throwable) -> { - // ensure exceptions are printed, by default this is not the case - ArclightMod.LOGGER.fatal("chunk.load-callback.failed", this.pos, throwable); + ArclightMod.LOGGER.fatal("chunk.unload-callback.failed", this.pos, throwable); return null; }); - ((ChunkMapBridge) chunkManager).bridge$getCallbackExecutor().run(); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java index 3310509c3..d5d99d650 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java @@ -11,6 +11,7 @@ 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.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -31,7 +32,7 @@ public abstract class DistanceManagerMixin implements TicketManagerBridge { // @formatter:off @Shadow private long ticketTickCounter; @Shadow @Final private DistanceManager.ChunkTicketTracker ticketTracker; - @Shadow(remap = false) @Final private Long2ObjectOpenHashMap>> forcedTickets; + @Unique private final Long2ObjectOpenHashMap>> arclight$forcedTickets = new Long2ObjectOpenHashMap<>(); @Shadow private static int getTicketLevelAt(SortedArraySet> p_229844_0_) { return 0; } @@ -105,16 +106,13 @@ public boolean removeTicketAtLevel(TicketType type, ChunkPos pos, int lev boolean removeTicket(long chunkPosIn, Ticket ticketIn) { SortedArraySet> ticketSet = this.getTickets(chunkPosIn); - boolean removed = false; - if (ticketSet.remove(ticketIn)) { - removed = true; - } + boolean removed = ticketSet.remove(ticketIn); if (ticketSet.isEmpty()) { this.tickets.remove(chunkPosIn); } this.ticketTracker.update(chunkPosIn, getTicketLevelAt(ticketSet), false); if (ticketIn.isForceTicks()) { - SortedArraySet> tickets = this.forcedTickets.get(chunkPosIn); + SortedArraySet> tickets = this.arclight$forcedTickets.get(chunkPosIn); if (tickets != null) { tickets.remove(ticketIn); } @@ -136,7 +134,7 @@ boolean addTicket(long chunkPosIn, Ticket ticketIn) { this.ticketTracker.update(chunkPosIn, ticketIn.getTicketLevel(), true); } if (ticketIn.isForceTicks()) { - SortedArraySet> tickets = this.forcedTickets.computeIfAbsent(chunkPosIn, e -> SortedArraySet.create(4)); + SortedArraySet> tickets = this.arclight$forcedTickets.computeIfAbsent(chunkPosIn, e -> SortedArraySet.create(4)); tickets.addOrGet(ticketIn); } return ticketIn == ticket; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerChunkCache_MainThreadExecutorMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerChunkCache_MainThreadExecutorMixin.java index 939893146..2116cba29 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerChunkCache_MainThreadExecutorMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerChunkCache_MainThreadExecutorMixin.java @@ -15,7 +15,7 @@ public abstract class ServerChunkCache_MainThreadExecutorMixin extends BlockableEventLoop { // @formatter:off - @Shadow(aliases = {"this$0", "f_8491_"}, remap = false) @Final private ServerChunkCache outer; + @Shadow(aliases = {"this$0", "f_8491_", "field_18810"}, remap = false) @Final private ServerChunkCache outer; // @formatter:on protected ServerChunkCache_MainThreadExecutorMixin(String nameIn) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java index 04d6171c7..8dd7d8508 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java @@ -211,12 +211,12 @@ public ResourceKey getTypeKey() { if (worldInfo instanceof DerivedLevelData data) { ((DerivedWorldInfoBridge) worldInfo).bridge$setDimType(this.getTypeKey()); if (ArclightConfig.spec().getCompat().isSymlinkWorld()) { - WorldSymlink.create(data, levelSave.getDimensionPath(this.dimension()).toFile()); + WorldSymlink.create(data, levelSave.getDimensionPath(dimension).toFile()); } } } this.spigotConfig = new SpigotWorldConfig(worldInfo.getLevelName()); - this.uuid = WorldUUID.getUUID(levelSave.getDimensionPath(this.dimension()).toFile()); + this.uuid = WorldUUID.getUUID(levelSave.getDimensionPath(dimension).toFile()); ((ServerChunkProviderBridge) this.chunkSource).bridge$setViewDistance(spigotConfig.viewDistance); ((WorldInfoBridge) this.K).bridge$setWorld((ServerLevel) (Object) this); var data = this.getDataStorage().computeIfAbsent(LevelPersistentData::new, () -> new LevelPersistentData(null), "bukkit_pdc"); @@ -319,7 +319,7 @@ public boolean strikeLightning(Entity entity, LightningStrikeEvent.Cause cause) @Inject(method = "save", at = @At("RETURN")) private void arclight$saveLevelDat(ProgressListener progress, boolean flush, boolean skipSave, CallbackInfo ci) { if (this.serverLevelData instanceof PrimaryLevelData worldInfo) { - worldInfo.setWorldBorder(this.getWorldBorder().createSettings()); + worldInfo.setWorldBorder(((ServerLevel) (Object) this).getWorldBorder().createSettings()); worldInfo.setCustomBossEvents(this.shadow$getServer().getCustomBossEvents().save()); this.convertable.saveDataTag(this.shadow$getServer().registryAccess(), worldInfo, this.shadow$getServer().getPlayerList().getSingleplayerData()); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java index 9440fe90a..8a3e47383 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java @@ -12,6 +12,7 @@ import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.mod.server.ArclightServer; import io.izzel.arclight.common.mod.util.ArclightCaptures; +import io.izzel.arclight.common.mod.util.PlatformHooks; import io.izzel.arclight.mixin.Eject; import net.minecraft.core.BlockPos; import net.minecraft.core.LayeredRegistryAccess; @@ -45,7 +46,6 @@ import net.minecraft.world.level.storage.LevelResource; import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.event.ForgeEventFactory; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.craftbukkit.v.CraftServer; @@ -279,7 +279,7 @@ public ServerPlayer respawn(ServerPlayer playerIn, ServerLevel worldIn, boolean playerIn.stopRiding(); this.players.remove(playerIn); playerIn.serverLevel().removePlayerImmediately(playerIn, Entity.RemovalReason.DISCARDED); - playerIn.revive(); + ((EntityBridge) playerIn).bridge$revive(); BlockPos pos = playerIn.getRespawnPosition(); float f = playerIn.getRespawnAngle(); boolean flag2 = playerIn.isRespawnForced(); @@ -368,7 +368,7 @@ public ServerPlayer respawn(ServerPlayer playerIn, ServerLevel worldIn, boolean this.playersByUUID.put(playerIn.getUUID(), playerIn); } playerIn.setHealth(playerIn.getHealth()); - ForgeEventFactory.firePlayerChangedDimensionEvent(playerIn, ((CraftWorld) fromWorld).getHandle().dimension, serverWorld.dimension); + PlatformHooks.firePlayerChangedDimensionEvent(playerIn, ((CraftWorld) fromWorld).getHandle().dimension(), serverWorld.dimension()); if (flag3) { playerIn.connection.send(new ClientboundSoundPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, pos.getX(), pos.getY(), pos.getZ(), 1.0f, 1.0f, serverWorld.random.nextLong())); } @@ -519,9 +519,9 @@ public ServerPlayer respawn(ServerPlayer playerIn, boolean conqueredEnd) { } serverplayerentity.initInventoryMenu(); serverplayerentity.setHealth(serverplayerentity.getHealth()); - ForgeEventFactory.firePlayerRespawnEvent(serverplayerentity, conqueredEnd); + PlatformHooks.firePlayerRespawnEvent(serverplayerentity, conqueredEnd); if (flag2) { - serverplayerentity.connection.send(new ClientboundSoundPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, (double) pos.getX(), (double) pos.getY(), (double) pos.getZ(), 1.0F, 1.0F, serverWorld.random.nextLong())); + serverplayerentity.connection.send(new ClientboundSoundPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, pos.getX(), pos.getY(), pos.getZ(), 1.0F, 1.0F, serverWorld.random.nextLong())); } this.sendAllPlayerInfo(serverplayerentity); serverplayerentity.onUpdateAbilities(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin.java index 1338a5883..b5addf1ca 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin.java @@ -4,6 +4,7 @@ import io.izzel.arclight.common.bridge.core.server.management.PlayerInteractionManagerBridge; import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.util.ArclightCaptures; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -28,10 +29,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.ForgeHooks; import org.bukkit.Bukkit; import org.bukkit.GameMode; -import org.bukkit.block.Block; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.Event; @@ -97,8 +96,8 @@ public void handleBlockBreakAction(BlockPos blockPos, ServerboundPlayerActionPac if (!this.level.hasChunkAt(blockPos)) { return; } - net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock forgeEvent = net.minecraftforge.common.ForgeHooks.onLeftClickBlock(player, blockPos, direction, action); - if (forgeEvent.isCanceled() || (!this.isCreative() && forgeEvent.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY)) { // Restore block and te data + PlatformHooks.LeftClickBlockResult forgeEvent = PlatformHooks.onLeftClickBlock(player, blockPos, direction, action); + if (forgeEvent.isCancelled() || (!this.isCreative() && forgeEvent.isUseItemDenied())) { // Restore block and te data level.sendBlockUpdated(blockPos, level.getBlockState(blockPos), level.getBlockState(blockPos), 3); return; } @@ -156,7 +155,7 @@ public void handleBlockBreakAction(BlockPos blockPos, ServerboundPlayerActionPac this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, blockPos)); } } else if (!iblockdata.isAir()) { - if (forgeEvent.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY) { + if (!forgeEvent.isUseBlockDenied()) { iblockdata.attack(this.level, blockPos, this.player); } f = iblockdata.getDestroyProgress(this.player, this.player.level(), blockPos); @@ -223,23 +222,20 @@ public void handleBlockBreakAction(BlockPos blockPos, ServerboundPlayerActionPac } } - @Inject(method = "destroyBlock", remap = true, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/common/ForgeHooks;onBlockBreakEvent(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/GameType;Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/core/BlockPos;)I")) + @Inject(method = "destroyBlock", at = @At("HEAD")) public void arclight$beforePrimaryEventFired(BlockPos pos, CallbackInfoReturnable cir) { ArclightCaptures.captureNextBlockBreakEventAsPrimaryEvent(); } - @Inject(method = "destroyBlock", remap = true, at = @At(value = "INVOKE_ASSIGN", remap = false, target = "Lnet/minecraftforge/common/ForgeHooks;onBlockBreakEvent(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/GameType;Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/core/BlockPos;)I")) - public void arclight$handleSecondaryBlockBreakEvents(BlockPos pos, CallbackInfoReturnable cir) { - ArclightCaptures.BlockBreakEventContext breakEventContext = ArclightCaptures.popSecondaryBlockBreakEvent(); - while (breakEventContext != null) { - Block block = breakEventContext.getEvent().getBlock(); - handleBlockDrop(breakEventContext, new BlockPos(block.getX(), block.getY(), block.getZ())); - breakEventContext = ArclightCaptures.popSecondaryBlockBreakEvent(); - } - } - @Inject(method = "destroyBlock", at = @At("RETURN")) public void arclight$resetBlockBreak(BlockPos pos, CallbackInfoReturnable cir) { + ArclightCaptures.BlockBreakEventContext secondaryContext = ArclightCaptures.popSecondaryBlockBreakEvent(); + while (secondaryContext != null) { + org.bukkit.block.Block block = secondaryContext.getEvent().getBlock(); + handleBlockDrop(secondaryContext, new BlockPos(block.getX(), block.getY(), block.getZ())); + secondaryContext = ArclightCaptures.popSecondaryBlockBreakEvent(); + } + ArclightCaptures.BlockBreakEventContext breakEventContext = ArclightCaptures.popPrimaryBlockBreakEvent(); if (breakEventContext != null) { @@ -335,26 +331,28 @@ public InteractionResult useItemOn(ServerPlayer playerIn, Level worldIn, ItemSta return InteractionResult.PASS; } } else { - net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock event = ForgeHooks.onRightClickBlock(playerIn, handIn, blockpos, blockRaytraceResultIn); - if (event.isCanceled()) return event.getCancellationResult(); + PlatformHooks.RightClickBlockResult event = PlatformHooks.onRightClickBlock(playerIn, handIn, blockpos, blockRaytraceResultIn); + if (event.isCancelled()) return event.getCancellationResult(); UseOnContext itemusecontext = new UseOnContext(playerIn, handIn, blockRaytraceResultIn); - if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) { - InteractionResult result = stackIn.onItemUseFirst(itemusecontext); + if (!event.isUseItemDenied()) { + InteractionResult result = PlatformHooks.onItemUseFirst(stackIn, itemusecontext); if (result != InteractionResult.PASS) return result; } boolean flag = !playerIn.getMainHandItem().isEmpty() || !playerIn.getOffhandItem().isEmpty(); - boolean flag1 = (playerIn.isSecondaryUseActive() && flag) && !(playerIn.getMainHandItem().doesSneakBypassUse(worldIn, blockpos, playerIn) && playerIn.getOffhandItem().doesSneakBypassUse(worldIn, blockpos, playerIn)); + boolean flag1 = (playerIn.isSecondaryUseActive() && flag) + && !(PlatformHooks.doesSneakBypassUse(playerIn.getMainHandItem(), worldIn, blockpos, playerIn) + && PlatformHooks.doesSneakBypassUse(playerIn.getOffhandItem(), worldIn, blockpos, playerIn)); ItemStack itemstack = stackIn.copy(); InteractionResult resultType = InteractionResult.PASS; - if (event.getUseBlock() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY && !flag1)) { + if (event.isUseBlockAllowed() || (!event.isUseBlockDenied() && !flag1)) { resultType = blockstate.use(worldIn, playerIn, handIn, blockRaytraceResultIn); if (resultType.consumesAction()) { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(playerIn, blockpos, itemstack); return resultType; } } - if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (!stackIn.isEmpty() && resultType != InteractionResult.SUCCESS && !bridge$getInteractResult())) { - if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) { + if (event.isUseItemAllowed() || (!stackIn.isEmpty() && resultType != InteractionResult.SUCCESS && !bridge$getInteractResult())) { + if (event.isUseItemDenied()) { return InteractionResult.PASS; } if (this.isCreative()) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/AreaEffectCloudEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/AreaEffectCloudEntityMixin.java index a4c6707d7..4b133f002 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/AreaEffectCloudEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/AreaEffectCloudEntityMixin.java @@ -74,7 +74,7 @@ public abstract class AreaEffectCloudEntityMixin extends EntityMixin implements */ @Overwrite public void tick() { - super.tick(); + ((Entity) (Object) this).baseTick(); boolean flag = this.isWaiting(); float f = this.getRadius(); if (this.level().isClientSide) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java index 5b40511e4..8cef43379 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java @@ -6,7 +6,6 @@ import io.izzel.arclight.common.bridge.core.command.ICommandSourceBridge; import io.izzel.arclight.common.bridge.core.entity.EntityBridge; import io.izzel.arclight.common.bridge.core.entity.InternalEntityBridge; -import io.izzel.arclight.common.bridge.core.entity.LivingEntityBridge; import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.core.network.datasync.SynchedEntityDataBridge; import io.izzel.arclight.common.bridge.core.world.TeleporterBridge; @@ -51,7 +50,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Team; -import net.minecraftforge.common.ForgeHooks; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; @@ -149,6 +147,7 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, @Shadow private Entity vehicle; private CraftEntity bukkitEntity; private transient PositionImpl arclight$tpPos; + private transient Collection arclight$capturedDrops; private static boolean isLevelAtLeast(CompoundTag tag, int level) { return tag.contains("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; @@ -214,10 +213,6 @@ private static boolean isLevelAtLeast(CompoundTag tag, int level) { @Shadow public abstract AABB getBoundingBox(); - @Shadow(remap = false) public abstract Collection captureDrops(); - - @Shadow(remap = false) public abstract Collection captureDrops(Collection value); - @Shadow public abstract BlockPos blockPosition(); @Shadow public abstract boolean isInWater(); @@ -230,8 +225,6 @@ private static boolean isLevelAtLeast(CompoundTag tag, int level) { @Shadow public abstract double distanceToSqr(Entity entityIn); - @Shadow protected abstract void markHurt(); - @Shadow public abstract void ejectPassengers(); @Shadow public abstract boolean hasCustomName(); @@ -284,8 +277,6 @@ private static boolean isLevelAtLeast(CompoundTag tag, int level) { @Shadow public abstract Vec3 position(); - @Shadow(remap = false) public abstract void revive(); - @Shadow public abstract boolean isPushable(); @Shadow protected abstract void removeAfterChangingDimensions(); @@ -520,6 +511,23 @@ public boolean isValid() { this.lastDamageCancelled = cancelled; } + @Override + public Collection bridge$captureDrops() { + return this.arclight$capturedDrops; + } + + @Override + public Collection bridge$captureDrops(Collection value) { + var old = this.arclight$capturedDrops; + this.arclight$capturedDrops = value; + return old; + } + + @Override + public void bridge$revive() { + this.unsetRemoved(); + } + public void postTick() { // No clean way to break out of ticking once the entity has been copied to a new world, so instead we move the portalling later in the tick cycle if (!((Object) this instanceof ServerPlayer)) { @@ -736,15 +744,6 @@ public boolean canCollideWith(Entity entity) { } } - @Redirect(method = "spawnAtLocation(Lnet/minecraft/world/item/ItemStack;F)Lnet/minecraft/world/entity/item/ItemEntity;", at = @At(value = "INVOKE", remap = false, ordinal = 0, target = "Lnet/minecraft/world/entity/Entity;captureDrops()Ljava/util/Collection;")) - public Collection arclight$forceDrops(Entity entity) { - Collection drops = entity.captureDrops(); - if (this instanceof LivingEntityBridge && ((LivingEntityBridge) this).bridge$isForceDrops()) { - drops = null; - } - return drops; - } - @Inject(method = "spawnAtLocation(Lnet/minecraft/world/item/ItemStack;F)Lnet/minecraft/world/entity/item/ItemEntity;", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z")) @@ -983,67 +982,10 @@ public boolean teleportTo(ServerLevel worldserver, double d0, double d1, double return teleportTo(world, blockPos); } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite(remap = false) - @Nullable - public Entity changeDimension(ServerLevel server, net.minecraftforge.common.util.ITeleporter teleporter) { - if (!ForgeHooks.onTravelToDimension((Entity) (Object) this, server.dimension())) - return null; - if (this.level() instanceof ServerLevel && !this.isRemoved()) { - this.level().getProfiler().push("changeDimension"); - if (server == null) { - return null; - } - this.level().getProfiler().push("reposition"); - var bukkitPos = arclight$tpPos; - arclight$tpPos = null; - PortalInfo portalinfo = bukkitPos == null ? teleporter.getPortalInfo((Entity) (Object) this, server, this::findDimensionEntryPoint) - : new PortalInfo(new Vec3(bukkitPos.x(), bukkitPos.y(), bukkitPos.z()), Vec3.ZERO, this.yRot, this.xRot); - if (portalinfo == null) { - return null; - } else { - ServerLevel world = ((PortalInfoBridge) portalinfo).bridge$getWorld() == null ? server : ((PortalInfoBridge) portalinfo).bridge$getWorld(); - if (world == this.level()) { - this.moveTo(portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.yRot, this.getXRot()); - this.setDeltaMovement(portalinfo.speed); - return (Entity) (Object) this; - } - this.unRide(); - Entity transportedEntity = teleporter.placeEntity((Entity) (Object) this, (ServerLevel) this.level(), world, this.getYRot(), spawnPortal -> { //Forge: Start vanilla logic - this.level().getProfiler().popPush("reloading"); - Entity entity = this.getType().create(world); - if (entity != null) { - entity.restoreFrom((Entity) (Object) this); - entity.moveTo(portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.yRot, entity.getXRot()); - entity.setDeltaMovement(portalinfo.speed); - world.addDuringTeleport(entity); - if (((WorldBridge) world).bridge$getTypeKey() == LevelStem.END && Level.END != null /* fabric dimensions v1 */) { - ArclightCaptures.captureEndPortalEntity((Entity) (Object) this, spawnPortal); - ServerLevel.makeObsidianPlatform(world); - } - } - return entity; - }); //Forge: End vanilla logic - - this.removeAfterChangingDimensions(); - this.level().getProfiler().pop(); - ((ServerLevel) this.level()).resetEmptyTime(); - world.resetEmptyTime(); - this.level().getProfiler().pop(); - return transportedEntity; - } - } else { - return null; - } - } - @Inject(method = "restoreFrom", at = @At("HEAD")) private void arclight$forwardHandle(Entity entityIn, CallbackInfo ci) { ((InternalEntityBridge) entityIn).internal$getBukkitEntity().setHandle((Entity) (Object) this); - ((EntityBridge) this).bridge$setBukkitEntity(((InternalEntityBridge) entityIn).internal$getBukkitEntity()); + this.bridge$setBukkitEntity(((InternalEntityBridge) entityIn).internal$getBukkitEntity()); if (entityIn instanceof Mob) { ((Mob) entityIn).dropLeash(true, false); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin_FabricBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin_FabricBridge.java new file mode 100644 index 000000000..6cbc3f1b7 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin_FabricBridge.java @@ -0,0 +1,194 @@ +package io.izzel.arclight.common.mixin.core.world.entity; + +import io.izzel.arclight.common.bridge.core.entity.EntityBridge; +import io.izzel.arclight.common.bridge.core.entity.InternalEntityBridge; +import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.core.PositionImpl; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v.CraftServer; +import org.bukkit.craftbukkit.v.entity.CraftEntity; +import org.bukkit.projectiles.ProjectileSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import java.util.Collection; +import java.util.List; + +@Mixin(Entity.class) +@LoadIfMod(modid = {"forge"}, condition = LoadIfMod.ModCondition.ABSENT) +public abstract class EntityMixin_FabricBridge implements EntityBridge, InternalEntityBridge { + + @Unique + private CraftEntity arclight$bukkitEntity; + @Unique + private boolean arclight$persist = true; + @Unique + private boolean arclight$valid; + @Unique + private ProjectileSource arclight$projectileSource; + @Unique + private boolean arclight$lastDamageCancelled; + @Unique + private int arclight$rideCooldown; + @Unique + private Collection arclight$capturedDrops; + + @Shadow + protected abstract void unsetRemoved(); + + public CraftEntity getBukkitEntity() { + return internal$getBukkitEntity(); + } + + @Override + public CommandSender bridge$getBukkitSender(CommandSourceStack wrapper) { + return internal$getBukkitEntity(); + } + + @Override + public Entity bridge$teleportTo(ServerLevel world, PositionImpl blockPos) { + Entity self = (Entity) (Object) this; + if (self.level() == world) { + self.teleportTo(blockPos.x(), blockPos.y(), blockPos.z()); + return self; + } + return self.changeDimension(world); + } + + @Override + public void bridge$setOnFire(int tick, boolean callEvent) { + ((Entity) (Object) this).setSecondsOnFire(tick); + } + + @Override + public CraftEntity bridge$getBukkitEntity() { + return internal$getBukkitEntity(); + } + + @Override + public void bridge$setBukkitEntity(CraftEntity craftEntity) { + this.arclight$bukkitEntity = craftEntity; + } + + @Override + public boolean bridge$isPersist() { + return this.arclight$persist; + } + + @Override + public void bridge$setPersist(boolean persist) { + this.arclight$persist = persist; + } + + @Override + public boolean bridge$isValid() { + return this.arclight$valid; + } + + @Override + public void bridge$setValid(boolean valid) { + this.arclight$valid = valid; + } + + @Override + public ProjectileSource bridge$getProjectileSource() { + return this.arclight$projectileSource; + } + + @Override + public void bridge$setProjectileSource(ProjectileSource projectileSource) { + this.arclight$projectileSource = projectileSource; + } + + @Override + public float bridge$getBukkitYaw() { + return ((Entity) (Object) this).getYRot(); + } + + @Override + public boolean bridge$isChunkLoaded() { + Entity self = (Entity) (Object) this; + return self.level().hasChunk((int) Math.floor(self.getX()) >> 4, (int) Math.floor(self.getZ()) >> 4); + } + + @Override + public boolean bridge$isLastDamageCancelled() { + return this.arclight$lastDamageCancelled; + } + + @Override + public void bridge$setLastDamageCancelled(boolean cancelled) { + this.arclight$lastDamageCancelled = cancelled; + } + + @Override + public Collection bridge$captureDrops() { + return this.arclight$capturedDrops; + } + + @Override + public Collection bridge$captureDrops(Collection value) { + var old = this.arclight$capturedDrops; + this.arclight$capturedDrops = value; + return old; + } + + @Override + public void bridge$revive() { + this.unsetRemoved(); + } + + @Override + public void bridge$postTick() { + } + + @Override + public boolean bridge$removePassenger(Entity passenger) { + Entity self = (Entity) (Object) this; + if (passenger.getVehicle() == self) { + passenger.stopRiding(); + return true; + } + return false; + } + + @Override + public boolean bridge$addPassenger(Entity entity) { + return entity.startRiding((Entity) (Object) this, true); + } + + @Override + public List bridge$getPassengers() { + return ((Entity) (Object) this).getPassengers(); + } + + @Override + public void bridge$setRideCooldown(int rideCooldown) { + this.arclight$rideCooldown = rideCooldown; + } + + @Override + public int bridge$getRideCooldown() { + return this.arclight$rideCooldown; + } + + @Override + public boolean bridge$canCollideWith(Entity entity) { + Entity self = (Entity) (Object) this; + return self.isPushable() && entity.isPushable() && !self.isPassengerOfSameVehicle(entity); + } + + @Override + public CraftEntity internal$getBukkitEntity() { + if (this.arclight$bukkitEntity == null) { + this.arclight$bukkitEntity = CraftEntity.getEntity((CraftServer) Bukkit.getServer(), (Entity) (Object) this); + } + return this.arclight$bukkitEntity; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java index d098acdf6..806c8a592 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java @@ -9,6 +9,7 @@ import io.izzel.arclight.common.bridge.core.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge; +import io.izzel.arclight.common.mod.util.PlatformHooks; import io.izzel.arclight.mixin.Eject; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; @@ -47,10 +48,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.event.entity.living.MobEffectEvent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.craftbukkit.v.CraftEquipmentSlot; @@ -322,7 +319,7 @@ public static EquipmentSlot getEquipmentSlotForItem(ItemStack p_147234_) { private void arclight$init(EntityType type, Level worldIn, CallbackInfo ci) { this.collides = true; this.craftAttributes = new CraftAttributeMap(this.attributes); - this.entityData.set(DATA_HEALTH_ID, (float) this.getAttributeValue(Attributes.MAX_HEALTH)); + ((Entity) (Object) this).getEntityData().set(DATA_HEALTH_ID, (float) this.getAttributeValue(Attributes.MAX_HEALTH)); } public SoundEvent getHurtSound0(DamageSource damagesource) { @@ -362,8 +359,8 @@ public SoundEvent getEatingSound0(ItemStack itemstack) { protected void dropExperience() { // if (!this.world.isRemote && (this.isPlayer() || this.recentlyHit > 0 && this.canDropLoot() && this.world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT))) { if (!((Object) this instanceof EnderDragon)) { - int reward = ForgeEventFactory.getExperienceDrop((LivingEntity) (Object) this, this.lastHurtByPlayer, this.expToDrop); - ExperienceOrb.award((ServerLevel) this.level(), this.position(), reward); + int reward = PlatformHooks.getExperienceDrop((LivingEntity) (Object) this, this.lastHurtByPlayer, this.expToDrop); + ExperienceOrb.award((ServerLevel) ((Entity) (Object) this).level(), ((Entity) (Object) this).position(), reward); bridge$setExpToDrop(0); } } @@ -384,7 +381,7 @@ protected void tickEffects() { if (!effectinstance.tick((LivingEntity) (Object) this, () -> { onEffectUpdated(effectinstance, true, null); })) { - if (!this.level().isClientSide && !MinecraftForge.EVENT_BUS.post(new MobEffectEvent.Expired((LivingEntity) (Object) this, effectinstance))) { + if (!((Entity) (Object) this).level().isClientSide && !PlatformHooks.postMobEffectExpired((LivingEntity) (Object) this, effectinstance)) { EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent((LivingEntity) (Object) this, effectinstance, null, EntityPotionEffectEvent.Cause.EXPIRATION); if (event.isCancelled()) { @@ -415,7 +412,7 @@ protected void tickEffects() { effectsToProcess.clear(); if (this.effectsDirty) { - if (!this.level().isClientSide) { + if (!((Entity) (Object) this).level().isClientSide) { this.updateInvisibilityStatus(); this.updateGlowingStatus(); } @@ -423,25 +420,25 @@ protected void tickEffects() { this.effectsDirty = false; } - int i = this.entityData.get(DATA_EFFECT_COLOR_ID); - boolean flag1 = this.entityData.get(DATA_EFFECT_AMBIENCE_ID); + int i = ((Entity) (Object) this).getEntityData().get(DATA_EFFECT_COLOR_ID); + boolean flag1 = ((Entity) (Object) this).getEntityData().get(DATA_EFFECT_AMBIENCE_ID); if (i > 0) { boolean flag; - if (this.isInvisible()) { - flag = this.random.nextInt(15) == 0; + if (((Entity) (Object) this).isInvisible()) { + flag = this.getRandom().nextInt(15) == 0; } else { - flag = this.random.nextBoolean(); + flag = this.getRandom().nextBoolean(); } if (flag1) { - flag &= this.random.nextInt(5) == 0; + flag &= this.getRandom().nextInt(5) == 0; } if (flag && i > 0) { double d0 = (double) (i >> 16 & 255) / 255.0D; double d1 = (double) (i >> 8 & 255) / 255.0D; double d2 = (double) (i >> 0 & 255) / 255.0D; - this.level().addParticle(flag1 ? ParticleTypes.AMBIENT_ENTITY_EFFECT : ParticleTypes.ENTITY_EFFECT, this.getX() + (this.random.nextDouble() - 0.5D) * (double) this.getBbWidth(), this.getY() + this.random.nextDouble() * (double) this.getBbHeight(), this.getZ() + (this.random.nextDouble() - 0.5D) * (double) this.getBbWidth(), d0, d1, d2); + ((Entity) (Object) this).level().addParticle(flag1 ? ParticleTypes.AMBIENT_ENTITY_EFFECT : ParticleTypes.ENTITY_EFFECT, ((Entity) (Object) this).getX() + (this.getRandom().nextDouble() - 0.5D) * (double) ((Entity) (Object) this).getBbWidth(), ((Entity) (Object) this).getY() + this.getRandom().nextDouble() * (double) ((Entity) (Object) this).getBbHeight(), ((Entity) (Object) this).getZ() + (this.getRandom().nextDouble() - 0.5D) * (double) ((Entity) (Object) this).getBbWidth(), d0, d1, d2); } } } @@ -473,7 +470,7 @@ public boolean addEffect(MobEffectInstance effectInstanceIn, Entity entity) { return false; } - MinecraftForge.EVENT_BUS.post(new MobEffectEvent.Added((LivingEntity) (Object) this, effectinstance, effectInstanceIn, entity)); + PlatformHooks.postMobEffectAdded((LivingEntity) (Object) this, effectinstance, effectInstanceIn, entity); if (effectinstance == null) { this.activeEffects.put(effectInstanceIn.getEffect(), effectInstanceIn); this.onEffectAdded(effectInstanceIn, entity); @@ -526,9 +523,9 @@ public float getBukkitYaw() { } public int getExpReward() { - if (this.level() instanceof ServerLevel && !this.wasExperienceConsumed() && (this.isAlwaysExperienceDropper() || this.lastHurtByPlayerTime > 0 && this.shouldDropExperience() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) { + if (((Entity) (Object) this).level() instanceof ServerLevel && !this.wasExperienceConsumed() && (this.isAlwaysExperienceDropper() || this.lastHurtByPlayerTime > 0 && this.shouldDropExperience() && ((Entity) (Object) this).level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) { int exp = this.getExperienceReward(); - return ForgeEventFactory.getExperienceDrop((LivingEntity) (Object) this, this.lastHurtByPlayer, exp); + return PlatformHooks.getExperienceDrop((LivingEntity) (Object) this, this.lastHurtByPlayer, exp); } else { return 0; } @@ -566,7 +563,7 @@ public int getExpReward() { } } - @Inject(method = "removeAllEffects", at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z")) + @Inject(method = "removeAllEffects", at = @At("HEAD")) public void arclight$clearReason(CallbackInfoReturnable cir) { arclight$action = EntityPotionEffectEvent.Action.CLEARED; } @@ -586,7 +583,7 @@ public int getExpReward() { */ @Overwrite public boolean isAlive() { - return !this.isRemoved() && this.entityData.get(DATA_HEALTH_ID) > 0.0F; + return !((Entity) (Object) this).isRemoved() && ((Entity) (Object) this).getEntityData().get(DATA_HEALTH_ID) > 0.0F; } @Inject(method = "getHealth", cancellable = true, at = @At("HEAD")) @@ -640,20 +637,20 @@ protected double applyKnockbackResistance(double originalStrength, DamageSource @Inject(method = "hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z", at = @At("HEAD"), cancellable = true) public void arclight$hurt(DamageSource source, float amount, CallbackInfoReturnable cir) { - if (!ForgeHooks.onLivingAttack((LivingEntity) (Object) this, source, amount)) { + if (!PlatformHooks.onLivingAttack((LivingEntity) (Object) this, source, amount)) { cir.cancel(); cir.setReturnValue(false); return; } - if (this.isInvulnerableTo(source)) { + if (((Entity) (Object) this).isInvulnerableTo(source)) { cir.cancel(); cir.setReturnValue(false); return; - } else if (this.level().isClientSide) { + } else if (((Entity) (Object) this).level().isClientSide) { cir.cancel(); cir.setReturnValue(false); return; - } else if (this.dead || this.isRemoved() || this.isDeadOrDying()) { + } else if (this.dead || ((Entity) (Object) this).isRemoved() || this.isDeadOrDying()) { cir.cancel(); cir.setReturnValue(false); return; @@ -663,7 +660,7 @@ protected double applyKnockbackResistance(double originalStrength, DamageSource return; } - if (this.isSleeping() && !this.level().isClientSide) { + if (this.isSleeping() && !((Entity) (Object) this).level().isClientSide) { this.stopSleeping(); } @@ -671,23 +668,14 @@ protected double applyKnockbackResistance(double originalStrength, DamageSource float f = amount; boolean flag = f > 0.0F && this.isDamageSourceBlocked(source); // Copied from below float f1 = 0.0F; - // ShieldBlockEvent implemented in damageEntity0 - - if (false) { - this.hurtCurrentlyUsedShield(amount); + // Shield side effects are handled in damageEntity0, but hurt flow still + // needs the blocked-damage state for cooldown/stat/result logic. + if (flag) { f1 = amount; amount = 0.0F; - if (!source.is(DamageTypeTags.IS_PROJECTILE)) { - Entity entity = source.getDirectEntity(); - if (entity instanceof LivingEntity) { - this.blockUsingShield((LivingEntity) entity); - } - } - - flag = true; } - if (source.is(DamageTypeTags.IS_FREEZING) && this.getType().is(EntityTypeTags.FREEZE_HURTS_EXTRA_TYPES)) { + if (source.is(DamageTypeTags.IS_FREEZING) && ((Entity) (Object) this).getType().is(EntityTypeTags.FREEZE_HURTS_EXTRA_TYPES)) { f *= 5.0F; } @@ -752,20 +740,20 @@ protected double applyKnockbackResistance(double originalStrength, DamageSource if (flag1) { if (flag) { - this.level().broadcastEntityEvent((LivingEntity) (Object) this, (byte) 29); + ((Entity) (Object) this).level().broadcastEntityEvent((LivingEntity) (Object) this, (byte) 29); } else { - this.level().broadcastDamageEvent((LivingEntity) (Object) this, source); + ((Entity) (Object) this).level().broadcastDamageEvent((LivingEntity) (Object) this, source); } if (!source.is(DamageTypeTags.NO_IMPACT) && (!flag || amount > 0.0F)) { - this.markHurt(); + ((Entity) (Object) this).hurtMarked = true; } if (entity1 != null && !source.is(DamageTypeTags.IS_EXPLOSION)) { - double d1 = entity1.getX() - this.getX(); + double d1 = entity1.getX() - ((Entity) (Object) this).getX(); double d0; - for (d0 = entity1.getZ() - this.getZ(); d1 * d1 + d0 * d0 < 1.0E-4D; d0 = (Math.random() - Math.random()) * 0.01D) { + for (d0 = entity1.getZ() - ((Entity) (Object) this).getZ(); d1 * d1 + d0 * d0 < 1.0E-4D; d0 = (Math.random() - Math.random()) * 0.01D) { d1 = (Math.random() - Math.random()) * 0.01D; } @@ -778,7 +766,7 @@ protected double applyKnockbackResistance(double originalStrength, DamageSource if (!this.checkTotemDeathProtection(source)) { SoundEvent soundevent = this.getDeathSound(); if (flag1 && soundevent != null) { - this.playSound(soundevent, this.getSoundVolume(), this.getVoicePitch()); + ((Entity) (Object) this).playSound(soundevent, this.getSoundVolume(), this.getVoicePitch()); } this.die(source); @@ -790,7 +778,7 @@ protected double applyKnockbackResistance(double originalStrength, DamageSource boolean flag2 = !flag || amount > 0.0F; if (flag2) { this.lastDamageSource = source; - this.lastDamageStamp = this.level().getGameTime(); + this.lastDamageStamp = ((Entity) (Object) this).level().getGameTime(); } if ((Object) this instanceof ServerPlayer) { @@ -827,10 +815,10 @@ protected double applyKnockbackResistance(double originalStrength, DamageSource } protected boolean damageEntity0(DamageSource damagesource, float f) { - if (!this.isInvulnerableTo(damagesource)) { + if (!((Entity) (Object) this).isInvulnerableTo(damagesource)) { final boolean human = (Object) this instanceof net.minecraft.world.entity.player.Player; - f = net.minecraftforge.common.ForgeHooks.onLivingHurt((LivingEntity) (Object) this, damagesource, f); + f = PlatformHooks.onLivingHurt((LivingEntity) (Object) this, damagesource, f); if (f <= 0) return arclight$damageResult = true; float originalDamage = f; @@ -846,9 +834,9 @@ protected boolean damageEntity0(DamageSource damagesource, float f) { Function blocking; var shieldTakesDamage = false; if (this.isDamageSourceBlocked(damagesource)) { - var shieldEvent = ForgeHooks.onShieldBlock((LivingEntity) (Object) this, damagesource, f); - if (!shieldEvent.isCanceled()) { - var blocked = shieldEvent.getBlockedDamage(); + var shieldEvent = PlatformHooks.onShieldBlock((LivingEntity) (Object) this, damagesource, f); + if (!shieldEvent.cancelled()) { + var blocked = shieldEvent.blockedDamage(); shieldTakesDamage = shieldEvent.shieldTakesDamage(); blocking = f13 -> -(double) blocked; } else { @@ -919,7 +907,7 @@ protected boolean damageEntity0(DamageSource damagesource, float f) { // Apply blocking code // PAIL: steal from above if (event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING) < 0) { - this.level().broadcastEntityEvent((Entity) (Object) this, (byte) 29); // SPIGOT-4635 - shield damage sound + ((Entity) (Object) this).level().broadcastEntityEvent((Entity) (Object) this, (byte) 29); // SPIGOT-4635 - shield damage sound if (shieldTakesDamage) { this.hurtCurrentlyUsedShield((float) -event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING)); } @@ -941,7 +929,7 @@ protected boolean damageEntity0(DamageSource damagesource, float f) { ((net.minecraft.world.entity.player.Player) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f2 * 10.0F)); } - f = net.minecraftforge.common.ForgeHooks.onLivingDamage((LivingEntity) (Object) this, damagesource, f); + f = PlatformHooks.onLivingDamage((LivingEntity) (Object) this, damagesource, f); if (f > 0 || !human) { if (human) { @@ -961,7 +949,7 @@ protected boolean damageEntity0(DamageSource damagesource, float f) { if (!human) { this.setAbsorptionAmount(this.getAbsorptionAmount() - f); } - this.gameEvent(GameEvent.ENTITY_DAMAGE, damagesource.getEntity()); + ((Entity) (Object) this).gameEvent(GameEvent.ENTITY_DAMAGE, damagesource.getEntity()); return arclight$damageResult = true; } else { @@ -1063,7 +1051,7 @@ private boolean checkTotemDeathProtection(DamageSource damageSourceIn) { org.bukkit.inventory.EquipmentSlot bukkitHand = null; for (InteractionHand hand : InteractionHand.values()) { itemstack1 = this.getItemInHand(hand); - if (itemstack1.is(Items.TOTEM_OF_UNDYING) && ForgeHooks.onLivingUseTotem((LivingEntity) (Object) this, damageSourceIn, itemstack1, hand)) { + if (itemstack1.is(Items.TOTEM_OF_UNDYING) && PlatformHooks.onLivingUseTotem((LivingEntity) (Object) this, damageSourceIn, itemstack1, hand)) { itemstack = itemstack1.copy(); bukkitHand = CraftEquipmentSlot.getHand(hand); // itemstack1.shrink(1); @@ -1090,7 +1078,7 @@ private boolean checkTotemDeathProtection(DamageSource damageSourceIn) { bridge$pushEffectCause(EntityPotionEffectEvent.Cause.TOTEM); this.addEffect(new MobEffectInstance(MobEffects.ABSORPTION, 100, 1), EntityPotionEffectEvent.Cause.TOTEM); this.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 800, 1), EntityPotionEffectEvent.Cause.TOTEM); - this.level().broadcastEntityEvent((Entity) (Object) this, (byte) 35); + ((Entity) (Object) this).level().broadcastEntityEvent((Entity) (Object) this, (byte) 35); } return !event.isCancelled(); } @@ -1131,7 +1119,7 @@ private boolean checkTotemDeathProtection(DamageSource damageSourceIn) { */ @Overwrite public boolean isPickable() { - return !this.isRemoved() && this.collides; + return !((Entity) (Object) this).isRemoved() && this.collides; } /** @@ -1145,7 +1133,7 @@ public boolean isPushable() { @Override public boolean canCollideWith(Entity entity) { - return this.isPushable() && this.collides != this.collidableExemptions.contains(entity.getUUID()); + return ((Entity) (Object) this).isPushable() && this.collides != this.collidableExemptions.contains(entity.getUUID()); } @Eject(method = "completeUsingItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;finishUsingItem(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;)Lnet/minecraft/world/item/ItemStack;")) @@ -1170,13 +1158,13 @@ public boolean canCollideWith(Entity entity) { @Eject(method = "randomTeleport", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/entity/LivingEntity;teleportTo(DDD)V")) private void arclight$entityTeleport(LivingEntity entity, double x, double y, double z, CallbackInfoReturnable< Boolean> cir) { - EntityTeleportEvent event = new EntityTeleportEvent(getBukkitEntity(), new Location(((WorldBridge) this.level()).bridge$getWorld(), this.getX(), this.getY(), this.getZ()), - new Location(((WorldBridge) this.level()).bridge$getWorld(), x, y, z)); + EntityTeleportEvent event = new EntityTeleportEvent(getBukkitEntity(), new Location(((WorldBridge) ((Entity) (Object) this).level()).bridge$getWorld(), ((Entity) (Object) this).getX(), ((Entity) (Object) this).getY(), ((Entity) (Object) this).getZ()), + new Location(((WorldBridge) ((Entity) (Object) this).level()).bridge$getWorld(), x, y, z)); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { - this.teleportTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()); + ((Entity) (Object) this).teleportTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()); } else { - this.teleportTo(this.getX(), this.getY(), this.getZ()); + ((Entity) (Object) this).teleportTo(((Entity) (Object) this).getX(), ((Entity) (Object) this).getY(), ((Entity) (Object) this).getZ()); cir.setReturnValue(false); } } @@ -1184,16 +1172,17 @@ public boolean canCollideWith(Entity entity) { @Redirect(method = "dropAllDeathLoot", at = @At(value = "INVOKE", ordinal = 0, remap = false, target = "Lnet/minecraft/world/entity/LivingEntity;captureDrops(Ljava/util/Collection;)Ljava/util/Collection;")) private Collection arclight$captureIfNeed(LivingEntity livingEntity, Collection value) { - Collection drops = livingEntity.captureDrops(); + var bridge = (EntityBridge) livingEntity; + Collection drops = bridge.bridge$captureDrops(); // todo this instanceof ArmorStandEntity - return drops == null ? livingEntity.captureDrops(value) : drops; + return drops == null ? bridge.bridge$captureDrops(value) : drops; } @Redirect(method = "dropAllDeathLoot", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Collection;forEach(Ljava/util/function/Consumer;)V")) private void arclight$cancelEvent(Collection collection, Consumer action) { if (this instanceof ServerPlayerEntityBridge) { // recapture for ServerPlayerEntityMixin#onDeath - this.captureDrops(collection); + this.bridge$captureDrops(collection); } else { collection.forEach(action); } @@ -1245,7 +1234,7 @@ public final void setArrowCount(int count, boolean reset) { if (arclight$callArrowCountChange(count, reset)) { return; } - this.entityData.set(DATA_ARROW_COUNT_ID, count); + ((Entity) (Object) this).getEntityData().set(DATA_ARROW_COUNT_ID, count); } private boolean arclight$callArrowCountChange(int newCount, boolean reset) { @@ -1266,12 +1255,12 @@ protected void equipEventAndSound(EquipmentSlot slot, ItemStack oldItem, ItemSta if (!flag && !ItemStack.isSameItemSameTags(oldItem, newItem) && !this.firstTick) { Equipable equipable = Equipable.get(newItem); if (equipable != null && !this.isSpectator() && equipable.getEquipmentSlot() == slot) { - if (!this.level().isClientSide() && !this.isSilent() && !silent) { - this.level().playSound(null, this.getX(), this.getY(), this.getZ(), equipable.getEquipSound(), this.getSoundSource(), 1.0F, 1.0F); + if (!((Entity) (Object) this).level().isClientSide() && !((Entity) (Object) this).isSilent() && !silent) { + ((Entity) (Object) this).level().playSound(null, ((Entity) (Object) this).getX(), ((Entity) (Object) this).getY(), ((Entity) (Object) this).getZ(), equipable.getEquipSound(), this.getSoundSource(), 1.0F, 1.0F); } if (this.doesEmitEquipEvent(slot)) { - this.gameEvent(GameEvent.EQUIP); + ((Entity) (Object) this).gameEvent(GameEvent.EQUIP); } } @@ -1302,3 +1291,4 @@ public static class ApotheosisCompatMixin { } } } + diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin_FabricBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin_FabricBridge.java new file mode 100644 index 000000000..a1b97d7ba --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin_FabricBridge.java @@ -0,0 +1,152 @@ +package io.izzel.arclight.common.mixin.core.world.entity; + +import io.izzel.arclight.common.bridge.core.entity.LivingEntityBridge; +import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.ItemStack; +import org.bukkit.craftbukkit.v.entity.CraftLivingEntity; +import org.bukkit.event.entity.EntityPotionEffectEvent; +import org.bukkit.event.entity.EntityRegainHealthEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import java.util.Optional; + +@Mixin(LivingEntity.class) +@LoadIfMod(modid = {"forge"}, condition = LoadIfMod.ModCondition.ABSENT) +public abstract class LivingEntityMixin_FabricBridge extends EntityMixin_FabricBridge implements LivingEntityBridge { + + @Unique + private int arclight$expToDrop; + @Unique + private boolean arclight$forceDrops; + @Unique + private transient EntityRegainHealthEvent.RegainReason arclight$regainReason; + @Unique + private transient EntityPotionEffectEvent.Cause arclight$effectCause; + @Unique + private transient EntityPotionEffectEvent.Action arclight$action; + + // @formatter:off + @Shadow public abstract int getExperienceReward(); + @Shadow public abstract void heal(float healAmount); + @Shadow public abstract boolean addEffect(MobEffectInstance effectInstance); + @Shadow public abstract boolean removeEffect(MobEffect effect); + @Shadow public abstract boolean removeAllEffects(); + // @formatter:on + + public CraftLivingEntity getBukkitEntity() { + return (CraftLivingEntity) internal$getBukkitEntity(); + } + + @Override + public CraftLivingEntity bridge$getBukkitEntity() { + return (CraftLivingEntity) internal$getBukkitEntity(); + } + + @Override + public void bridge$setSlot(EquipmentSlot slotIn, ItemStack stack, boolean silent) { + if ((Object) this instanceof Mob mob) { + mob.setItemSlot(slotIn, stack); + } + } + + @Override + public void bridge$playEquipSound(EquipmentSlot slot, ItemStack oldItem, ItemStack newItem, boolean silent) { + } + + @Override + public boolean bridge$canPickUpLoot() { + return (Object) this instanceof Mob mob && mob.canPickUpLoot(); + } + + @Override + public boolean bridge$isForceDrops() { + return this.arclight$forceDrops; + } + + @Override + public int bridge$getExpReward() { + return this.getExperienceReward(); + } + + @Override + public void bridge$setExpToDrop(int amount) { + this.arclight$expToDrop = amount; + } + + @Override + public int bridge$getExpToDrop() { + return this.arclight$expToDrop; + } + + @Override + public void bridge$pushHealReason(EntityRegainHealthEvent.RegainReason regainReason) { + this.arclight$regainReason = regainReason; + } + + @Override + public void bridge$heal(float healAmount, EntityRegainHealthEvent.RegainReason regainReason) { + this.arclight$regainReason = regainReason; + this.heal(healAmount); + this.arclight$regainReason = null; + } + + @Override + public void bridge$pushEffectCause(EntityPotionEffectEvent.Cause cause) { + this.arclight$effectCause = cause; + } + + @Override + public boolean bridge$addEffect(MobEffectInstance effect, EntityPotionEffectEvent.Cause cause) { + this.arclight$effectCause = cause; + var result = this.addEffect(effect); + if (result) { + this.arclight$action = EntityPotionEffectEvent.Action.ADDED; + } + return result; + } + + @Override + public boolean bridge$removeEffect(MobEffect effect, EntityPotionEffectEvent.Cause cause) { + this.arclight$effectCause = cause; + var result = this.removeEffect(effect); + if (result) { + this.arclight$action = EntityPotionEffectEvent.Action.REMOVED; + } + return result; + } + + @Override + public boolean bridge$removeAllEffects(EntityPotionEffectEvent.Cause cause) { + this.arclight$effectCause = cause; + var result = this.removeAllEffects(); + if (result) { + this.arclight$action = EntityPotionEffectEvent.Action.CLEARED; + } + return result; + } + + @Override + public Optional bridge$getEffectCause() { + try { + return Optional.ofNullable(this.arclight$effectCause); + } finally { + this.arclight$effectCause = null; + } + } + + @Override + public EntityPotionEffectEvent.Action bridge$getAndResetAction() { + try { + return this.arclight$action; + } finally { + this.arclight$action = null; + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java index e48d63ff2..28c95abf2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java @@ -5,6 +5,7 @@ import io.izzel.arclight.common.bridge.core.entity.MobEntityBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.mod.ArclightMod; +import io.izzel.arclight.common.mod.util.PlatformHooks; import io.izzel.arclight.mixin.Eject; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket; @@ -17,8 +18,6 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.event.entity.living.LivingChangeTargetEvent; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.entity.CraftLivingEntity; import org.bukkit.craftbukkit.v.event.CraftEventFactory; @@ -90,12 +89,12 @@ public void setTarget(@Nullable LivingEntity livingEntity) { } else { livingEntity = null; } - var changeTargetEvent = ForgeHooks.onLivingChangeTarget((LivingEntity) (Object) this, livingEntity, LivingChangeTargetEvent.LivingTargetType.MOB_TARGET); - if (changeTargetEvent.isCanceled()) { + var changeTargetEvent = PlatformHooks.onLivingChangeTarget((LivingEntity) (Object) this, livingEntity); + if (changeTargetEvent.cancelled()) { arclight$targetSuccess = false; return; } - livingEntity = changeTargetEvent.getNewTarget(); + livingEntity = changeTargetEvent.newTarget(); } this.target = livingEntity; arclight$targetSuccess = true; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin_FabricBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin_FabricBridge.java new file mode 100644 index 000000000..40428e7e5 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin_FabricBridge.java @@ -0,0 +1,94 @@ +package io.izzel.arclight.common.mixin.core.world.entity; + +import io.izzel.arclight.common.bridge.core.entity.MobEntityBridge; +import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.item.ItemEntity; +import org.bukkit.craftbukkit.v.entity.CraftLivingEntity; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.EntityTransformEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(Mob.class) +@LoadIfMod(modid = {"forge"}, condition = LoadIfMod.ModCondition.ABSENT) +public abstract class MobMixin_FabricBridge extends LivingEntityMixin_FabricBridge implements MobEntityBridge { + + @Unique + private transient EntityTargetEvent.TargetReason arclight$targetReason; + @Unique + private transient boolean arclight$fireTargetEvent; + @Unique + private transient boolean arclight$lastTargetResult; + @Unique + private transient EntityTransformEvent.TransformReason arclight$transformReason; + @Unique + private boolean arclight$aware = true; + + @Override + public void bridge$pushGoalTargetReason(EntityTargetEvent.TargetReason reason, boolean fireEvent) { + this.arclight$targetReason = reason; + this.arclight$fireTargetEvent = fireEvent; + } + + @Override + public void bridge$pushTransformReason(EntityTransformEvent.TransformReason transformReason) { + this.arclight$transformReason = transformReason; + } + + @Override + public boolean bridge$setGoalTarget(LivingEntity livingEntity, EntityTargetEvent.TargetReason reason, boolean fireEvent) { + var self = (Mob) (Object) this; + bridge$pushGoalTargetReason(reason, fireEvent); + if (self.getTarget() == livingEntity) { + this.arclight$lastTargetResult = false; + return false; + } + if (fireEvent) { + var event = CraftEventFactory.callEntityTargetLivingEvent(self, livingEntity, reason); + if (event.isCancelled()) { + this.arclight$lastTargetResult = false; + return false; + } + var target = event.getTarget(); + livingEntity = target == null ? null : ((CraftLivingEntity) target).getHandle(); + } + self.setTarget(livingEntity); + this.arclight$lastTargetResult = true; + return true; + } + + @Override + public boolean bridge$lastGoalTargetResult() { + return this.arclight$lastTargetResult; + } + + @Override + public ResourceLocation bridge$getLootTable() { + return ((Mob) (Object) this).getLootTable(); + } + + @Override + public boolean bridge$isPersistenceRequired() { + return ((Mob) (Object) this).isPersistenceRequired(); + } + + @Override + public void bridge$setPersistenceRequired(boolean value) { + if (value) { + ((Mob) (Object) this).setPersistenceRequired(); + } + } + + @Override + public void bridge$setAware(boolean aware) { + this.arclight$aware = aware; + } + + @Override + public void bridge$captureItemDrop(ItemEntity itemEntity) { + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/AllayMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/AllayMixin.java index 36014ad67..8e450465b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/AllayMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/AllayMixin.java @@ -34,7 +34,7 @@ public abstract class AllayMixin extends MobMixin { } public void setCanDuplicate(boolean canDuplicate) { - this.entityData.set(DATA_CAN_DUPLICATE, canDuplicate); + ((Entity) (Object) this).getEntityData().set(DATA_CAN_DUPLICATE, canDuplicate); } @Inject(method = "aiStep", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/world/entity/animal/allay/Allay;heal(F)V")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_GrowCropGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_GrowCropGoalMixin.java index 7f6bdb525..1e28f7992 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_GrowCropGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_GrowCropGoalMixin.java @@ -16,7 +16,7 @@ public class Bee_GrowCropGoalMixin { @SuppressWarnings("target") - @Shadow(aliases = {"this$0", "f_28021_"}, remap = false) + @Shadow(aliases = {"this$0", "f_28021_", "field_20373"}, remap = false) private Bee outerThis; @Inject(method = "tick", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;levelEvent(ILnet/minecraft/core/BlockPos;I)V")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/CowMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/CowMixin.java index 684cc967e..0aa6c99b9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/CowMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/CowMixin.java @@ -4,6 +4,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -14,9 +15,41 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + @Mixin(Cow.class) public abstract class CowMixin extends AnimalMixin { + private static final MethodHandle ARCLIGHT$ANIMAL_MOB_INTERACT = arclight$findAnimalMobInteract(); + + private static MethodHandle arclight$findAnimalMobInteract() { + var lookup = MethodHandles.lookup(); + var type = MethodType.methodType(InteractionResult.class, Player.class, InteractionHand.class); + ReflectiveOperationException error = null; + for (String name : new String[]{"mobInteract", "method_5992"}) { + try { + return lookup.findSpecial(Animal.class, name, type, Cow.class); + } catch (NoSuchMethodException | IllegalAccessException ex) { + if (error == null) { + error = ex; + } else { + error.addSuppressed(ex); + } + } + } + throw new ExceptionInInitializerError(error); + } + + private InteractionResult arclight$invokeAnimalMobInteract(Player player, InteractionHand hand) { + try { + return (InteractionResult) ARCLIGHT$ANIMAL_MOB_INTERACT.invokeExact((Cow) (Object) this, player, hand); + } catch (Throwable throwable) { + throw new RuntimeException("Failed to invoke Animal#mobInteract super implementation", throwable); + } + } + /** * @author IzzelAliz * @reason @@ -35,7 +68,7 @@ public InteractionResult mobInteract(Player playerEntity, InteractionHand hand) playerEntity.setItemInHand(hand, itemstack1); return InteractionResult.sidedSuccess(this.level().isClientSide); } else { - return super.mobInteract(playerEntity, hand); + return this.arclight$invokeAnimalMobInteract(playerEntity, hand); } } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_EatBerriesGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_EatBerriesGoalMixin.java index e36ab2770..d65611a24 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_EatBerriesGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_EatBerriesGoalMixin.java @@ -17,7 +17,7 @@ public abstract class Fox_EatBerriesGoalMixin extends MoveToBlockGoal { @SuppressWarnings("target") - @Shadow(aliases = {"this$0", "f_28672_"}, remap = false) + @Shadow(aliases = {"this$0", "f_28672_", "field_17975"}, remap = false) private Fox outerThis; public Fox_EatBerriesGoalMixin(PathfinderMob creature, double speedIn, int length) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/MushroomCowMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/MushroomCowMixin.java index fcc07dd26..e83e7b747 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/MushroomCowMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/MushroomCowMixin.java @@ -3,62 +3,65 @@ import io.izzel.arclight.common.bridge.core.entity.EntityBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge; import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.animal.MushroomCow; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDropItemEvent; import org.bukkit.event.entity.EntityTransformEvent; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.Collections; -import java.util.List; - @Mixin(MushroomCow.class) public abstract class MushroomCowMixin extends AnimalMixin { - // @formatter:off - @Shadow protected abstract List shearInternal(SoundSource pCategory); - // @formatter:on + // Forge: ShearsItem#interactLivingEntity + @Inject(method = "mobInteract", require = 0, cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/animal/MushroomCow;shear(Lnet/minecraft/sounds/SoundSource;)V")) + private void arclight$onShear(Player player, InteractionHand hand, CallbackInfoReturnable cir, ItemStack stack) { + if (!CraftEventFactory.handlePlayerShearEntityEvent(player, (Entity) (Object) this, stack, hand)) { + cir.setReturnValue(InteractionResult.PASS); + } + } - @Redirect(method = "shearInternal", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/animal/MushroomCow;discard()V")) + @Redirect(method = "shear", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/animal/MushroomCow;discard()V")) private void arclight$animalTransformPre(MushroomCow mushroomCow) { } - @Inject(method = "shearInternal", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z")) - private void arclight$animalTransform(SoundSource p_28924_, CallbackInfoReturnable> cir, Cow cowEntity) { + @Inject(method = "shear", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z")) + private void arclight$animalTransform(SoundSource category, CallbackInfo ci, Cow cowEntity) { if (CraftEventFactory.callEntityTransformEvent((MushroomCow) (Object) this, cowEntity, EntityTransformEvent.TransformReason.SHEARED).isCancelled()) { - cir.setReturnValue(Collections.emptyList()); + ci.cancel(); } else { ((WorldBridge) this.level()).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.SHEARED); this.discard(); } } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - public void shear(SoundSource pCategory) { - for (ItemStack s : shearInternal(pCategory)) { - var itemEntity = new ItemEntity(this.level(), this.getX(), this.getY(1.0D), this.getZ(), s); + @Redirect(method = "shear", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z", ordinal = 1)) + private boolean arclight$entityDropItemEvent(Level level, Entity entity) { + if (entity instanceof ItemEntity itemEntity) { EntityDropItemEvent event = new EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) ((EntityBridge) itemEntity).bridge$getBukkitEntity()); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { - continue; + return false; } - this.level().addFreshEntity(itemEntity); } + return level.addFreshEntity(entity); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/ParrotMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/ParrotMixin.java index 5da0b7437..7efd69abf 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/ParrotMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/ParrotMixin.java @@ -30,7 +30,7 @@ public abstract class ParrotMixin extends AnimalMixin { */ @Overwrite public boolean isPushable() { - return super.isPushable(); // CraftBukkit - collidable API + return this.isAlive() && !this.onClimbable() && this.collides; // CraftBukkit - collidable API } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ArmorStandMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ArmorStandMixin.java index 21fa2bb59..8de86b2bb 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ArmorStandMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ArmorStandMixin.java @@ -118,10 +118,10 @@ protected boolean shouldDropExperience() { } private Collection arclight$drops() { - Collection drops = this.captureDrops(); + Collection drops = this.bridge$captureDrops(); if (drops == null) { ArrayList list = new ArrayList<>(); - this.captureDrops(list); + this.bridge$captureDrops(list); return list; } else { return drops; @@ -129,7 +129,7 @@ protected boolean shouldDropExperience() { } private void arclight$callEntityDeath() { - Collection captureDrops = this.captureDrops(null); + Collection captureDrops = this.bridge$captureDrops(null); List drops; if (captureDrops == null) { drops = new ArrayList<>(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/CreeperMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/CreeperMixin.java index 4a8171288..e0e4d3e98 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/CreeperMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/CreeperMixin.java @@ -7,6 +7,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.AreaEffectCloud; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LightningBolt; import net.minecraft.world.entity.monster.Creeper; import net.minecraft.world.level.Level; @@ -40,7 +41,7 @@ public abstract class CreeperMixin extends PathfinderMobMixin implements Creeper // @formatter:on public void setPowered(boolean power) { - this.entityData.set(DATA_IS_POWERED, power); + ((Entity) (Object) this).getEntityData().set(DATA_IS_POWERED, power); } @Inject(method = "thunderHit", cancellable = true, at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/monster/Creeper;entityData:Lnet/minecraft/network/syncher/SynchedEntityData;")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/EnderManMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/EnderManMixin.java index 849e68102..ae491cf39 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/EnderManMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/EnderManMixin.java @@ -3,6 +3,7 @@ import io.izzel.arclight.common.bridge.core.entity.monster.EndermanEntityBridge; import io.izzel.arclight.common.mixin.core.world.entity.PathfinderMobMixin; import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -37,12 +38,12 @@ public abstract class EnderManMixin extends PathfinderMobMixin implements Enderm AttributeInstance modifiableattributeinstance = this.getAttribute(Attributes.MOVEMENT_SPEED); if (livingEntity == null) { this.targetChangeTime = 0; - this.entityData.set(DATA_CREEPY, false); - this.entityData.set(DATA_STARED_AT, false); + ((Entity) (Object) this).getEntityData().set(DATA_CREEPY, false); + ((Entity) (Object) this).getEntityData().set(DATA_STARED_AT, false); modifiableattributeinstance.removeModifier(SPEED_MODIFIER_ATTACKING); } else { this.targetChangeTime = this.tickCount; - this.entityData.set(DATA_CREEPY, true); + ((Entity) (Object) this).getEntityData().set(DATA_CREEPY, true); if (!modifiableattributeinstance.hasModifier(SPEED_MODIFIER_ATTACKING)) { modifiableattributeinstance.addTransientModifier(SPEED_MODIFIER_ATTACKING); } @@ -51,7 +52,7 @@ public abstract class EnderManMixin extends PathfinderMobMixin implements Enderm @Override public boolean setTarget(LivingEntity livingEntity, EntityTargetEvent.TargetReason reason, boolean fireEvent) { - if (!super.setTarget(livingEntity, reason, fireEvent)) { + if (!this.bridge$setGoalTarget(livingEntity, reason, fireEvent)) { return false; } bridge$updateTarget(getTarget()); @@ -64,8 +65,7 @@ public boolean setTarget(LivingEntity livingEntity, EntityTargetEvent.TargetReas */ @Overwrite public void setTarget(@Nullable LivingEntity entity) { - this.bridge$pushGoalTargetReason(EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); - super.setTarget(entity); + this.bridge$setGoalTarget(entity, EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); if (arclight$targetSuccess) { bridge$updateTarget(getTarget()); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_BlindnessSpellGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_BlindnessSpellGoalMixin.java index 8b6e915d8..ec7fd3cea 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_BlindnessSpellGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_BlindnessSpellGoalMixin.java @@ -13,7 +13,7 @@ public class Illusioner_BlindnessSpellGoalMixin { @SuppressWarnings("target") - @Shadow(aliases = {"this$0", "f_32941_"}, remap = false) + @Shadow(aliases = {"this$0", "f_32941_", "field_7299"}, remap = false) private Illusioner outerThis; @Inject(method = "performSpellCasting", at = @At("HEAD")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_MirrorSpellGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_MirrorSpellGoalMixin.java index 6fe8a3d38..0ee9ba0d5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_MirrorSpellGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_MirrorSpellGoalMixin.java @@ -13,7 +13,7 @@ public class Illusioner_MirrorSpellGoalMixin { @SuppressWarnings("target") - @Shadow(aliases = {"this$0", "f_32955_"}, remap = false) + @Shadow(aliases = {"this$0", "f_32955_", "field_7300"}, remap = false) private Illusioner outerThis; @Inject(method = "performSpellCasting", at = @At("HEAD")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Phantom_AttackPlayerTargetGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Phantom_AttackPlayerTargetGoalMixin.java index de24cdaa0..469b3c4ae 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Phantom_AttackPlayerTargetGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Phantom_AttackPlayerTargetGoalMixin.java @@ -13,11 +13,11 @@ public abstract class Phantom_AttackPlayerTargetGoalMixin { @SuppressWarnings("target") - @Shadow(aliases = {"this$0", "f_33191_"}, remap = false) + @Shadow(aliases = {"this$0", "f_33191_", "field_7319"}, remap = false) private Phantom outerThis; // canUse setTarget - @Inject(method = "m_8036_()Z", remap = false, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Phantom;m_6710_(Lnet/minecraft/world/entity/LivingEntity;)V")) + @Inject(method = "canUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/Phantom;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V")) private void arclight$reason(CallbackInfoReturnable cir) { ((MobEntityBridge) outerThis).bridge$pushGoalTargetReason(EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SlimeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SlimeMixin.java index 0b60a3550..350c6b07b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SlimeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SlimeMixin.java @@ -13,9 +13,14 @@ import org.bukkit.event.entity.EntityTransformEvent; import org.bukkit.event.entity.SlimeSplitEvent; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; 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.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.util.ArrayList; import java.util.List; @@ -23,6 +28,7 @@ public abstract class SlimeMixin extends MobMixin { private transient List arclight$slimes; + private static final MethodHandle ARCLIGHT$ENTITY_REMOVE = arclight$findEntityRemove(); // @formatter:off @Shadow public abstract int getSize(); @@ -31,13 +37,34 @@ public abstract class SlimeMixin extends MobMixin { @Shadow public abstract EntityType getType(); - /** - * @author IzzelAliz - * @reason - */ - @Overwrite(remap = false) - @Override - public void remove(Entity.RemovalReason p_149847_) { + private static MethodHandle arclight$findEntityRemove() { + var lookup = MethodHandles.lookup(); + var type = MethodType.methodType(void.class, Entity.RemovalReason.class); + ReflectiveOperationException error = null; + for (String name : new String[]{"remove", "method_5650"}) { + try { + return lookup.findSpecial(Entity.class, name, type, net.minecraft.world.entity.monster.Slime.class); + } catch (NoSuchMethodException | IllegalAccessException ex) { + if (error == null) { + error = ex; + } else { + error.addSuppressed(ex); + } + } + } + throw new ExceptionInInitializerError(error); + } + + private void arclight$invokeEntityRemove(Entity.RemovalReason reason) { + try { + ARCLIGHT$ENTITY_REMOVE.invokeExact((net.minecraft.world.entity.monster.Slime) (Object) this, reason); + } catch (Throwable throwable) { + throw new RuntimeException("Failed to invoke Entity#remove super implementation", throwable); + } + } + + @Inject(method = "remove", at = @At("HEAD"), cancellable = true) + private void arclight$removeWithSplitEvent(Entity.RemovalReason p_149847_, CallbackInfo ci) { int i = this.getSize(); if (!this.level().isClientSide && i > 1 && this.isDeadOrDying()) { Component itextcomponent = this.getCustomName(); @@ -50,7 +77,8 @@ public void remove(Entity.RemovalReason p_149847_) { SlimeSplitEvent event = new SlimeSplitEvent((Slime) this.getBukkitEntity(), k); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled() || event.getCount() <= 0) { - super.remove(p_149847_); + this.arclight$invokeEntityRemove(p_149847_); + ci.cancel(); return; } k = event.getCount(); @@ -74,8 +102,9 @@ public void remove(Entity.RemovalReason p_149847_) { arclight$slimes.add(slimeentity); } if (CraftEventFactory.callEntityTransformEvent((net.minecraft.world.entity.monster.Slime) (Object) this, arclight$slimes, EntityTransformEvent.TransformReason.SPLIT).isCancelled()) { - super.remove(p_149847_); + this.arclight$invokeEntityRemove(p_149847_); arclight$slimes = null; + ci.cancel(); return; } for (int l = 0; l < arclight$slimes.size(); l++) { @@ -88,6 +117,7 @@ public void remove(Entity.RemovalReason p_149847_) { } arclight$slimes = null; } - super.remove(p_149847_); + this.arclight$invokeEntityRemove(p_149847_); + ci.cancel(); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SpellcastingIllager_UseSpellGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SpellcastingIllager_UseSpellGoalMixin.java index 43756d0a9..a4c1bf623 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SpellcastingIllager_UseSpellGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/SpellcastingIllager_UseSpellGoalMixin.java @@ -12,13 +12,13 @@ public abstract class SpellcastingIllager_UseSpellGoalMixin { // @formatter:off - @SuppressWarnings("target") @Shadow(aliases = {"this$0", "f_33776_"}, remap = false) private SpellcasterIllager outerThis; - @Shadow(aliases = "m_7269_") protected abstract SpellcasterIllager.IllagerSpell getSpell(); + @Shadow(aliases = {"this$0", "f_33776_", "field_7386"}, remap = false) private SpellcasterIllager field_7386; + @Shadow(aliases = {"m_7269_", "method_7147"}, remap = false) protected abstract SpellcasterIllager.IllagerSpell getSpell(); // @formatter:on @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/monster/SpellcasterIllager$SpellcasterUseSpellGoal;performSpellCasting()V")) private void arclight$castSpell(CallbackInfo ci) { - if (!CraftEventFactory.handleEntitySpellCastEvent(outerThis, this.getSpell())) { + if (!CraftEventFactory.handleEntitySpellCastEvent(this.field_7386, this.getSpell())) { ci.cancel(); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Vex_CopyOwnerTargetGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Vex_CopyOwnerTargetGoalMixin.java index 08dcef046..bf611a9fd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Vex_CopyOwnerTargetGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/monster/Vex_CopyOwnerTargetGoalMixin.java @@ -13,7 +13,7 @@ public abstract class Vex_CopyOwnerTargetGoalMixin { @SuppressWarnings("target") - @Shadow(aliases = {"this$0", "f_34052_"}, remap = false) + @Shadow(aliases = {"this$0", "f_34052_", "field_7413"}, remap = false) private Vex outerThis; @Inject(method = "start", at = @At("HEAD")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java index edd6a182e..7c4f0bdb3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java @@ -11,6 +11,7 @@ import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.bridge.core.world.server.ServerWorldBridge; import io.izzel.arclight.common.mixin.core.world.entity.LivingEntityMixin; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.core.BlockPos; import net.minecraft.core.GlobalPos; import net.minecraft.core.particles.ParticleTypes; @@ -43,9 +44,6 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Scoreboard; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.extensions.IForgePlayer; -import net.minecraftforge.entity.PartEntity; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; @@ -78,7 +76,7 @@ import java.util.Optional; @Mixin(net.minecraft.world.entity.player.Player.class) -public abstract class PlayerMixin extends LivingEntityMixin implements PlayerEntityBridge, IForgePlayer { +public abstract class PlayerMixin extends LivingEntityMixin implements PlayerEntityBridge { @Shadow public int experienceLevel; @@ -220,7 +218,7 @@ public abstract class PlayerMixin extends LivingEntityMixin implements PlayerEnt @Inject(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/damagesource/DamageSource;scalesWithDifficulty()Z", shift = At.Shift.BEFORE), cancellable = true) private void arclight$playerHurt(DamageSource source, float amount, CallbackInfoReturnable cir) { - if (!ForgeHooks.onPlayerAttack((net.minecraft.world.entity.player.Player) (Object) this, source, amount)) { + if (!PlatformHooks.onPlayerAttack((net.minecraft.world.entity.player.Player) (Object) this, source, amount)) { cir.setReturnValue(false); cir.cancel(); } @@ -263,7 +261,7 @@ public boolean canHarmPlayer(final net.minecraft.world.entity.player.Player enti */ @Overwrite public void attack(final Entity entity) { - if (!net.minecraftforge.common.ForgeHooks.onPlayerAttackTarget((net.minecraft.world.entity.player.Player) (Object) this, entity)) + if (!PlatformHooks.onPlayerAttackTarget((net.minecraft.world.entity.player.Player) (Object) this, entity)) return; if (entity.isAttackable() && !entity.skipAttackInteraction((net.minecraft.world.entity.player.Player) (Object) this)) { float f = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); @@ -289,17 +287,17 @@ public void attack(final Entity entity) { } boolean flag3 = flag && this.fallDistance > 0.0f && !this.onGround && !this.onClimbable() && !this.isInWater() && !this.hasEffect(MobEffects.BLINDNESS) && !this.isPassenger() && entity instanceof LivingEntity; flag3 = flag3 && !this.isSprinting(); - net.minecraftforge.event.entity.player.CriticalHitEvent hitResult = net.minecraftforge.common.ForgeHooks.getCriticalHit((net.minecraft.world.entity.player.Player) (Object) this, entity, flag3, flag3 ? 1.5F : 1.0F); - flag3 = hitResult != null; + Float criticalModifier = PlatformHooks.getCriticalHitDamageModifier((net.minecraft.world.entity.player.Player) (Object) this, entity, flag3, flag3 ? 1.5F : 1.0F); + flag3 = criticalModifier != null; if (flag3) { - f *= hitResult.getDamageModifier(); + f *= criticalModifier; } f += f2; boolean flag4 = false; final double d0 = this.walkDist - this.walkDistO; if (flag && !flag3 && !flag2 && this.onGround && d0 < this.getSpeed()) { final ItemStack itemstack = this.getItemInHand(InteractionHand.MAIN_HAND); - flag4 = itemstack.canPerformAction(net.minecraftforge.common.ToolActions.SWORD_SWEEP); + flag4 = PlatformHooks.canPerformSweepAttack(itemstack); } float f4 = 0.0f; boolean flag5 = false; @@ -329,8 +327,8 @@ public void attack(final Entity entity) { } if (flag4) { final float f5 = 1.0f + EnchantmentHelper.getSweepingDamageRatio((net.minecraft.world.entity.player.Player) (Object) this) * f; - final List list = this.level().getEntitiesOfClass(LivingEntity.class, this.getItemInHand(InteractionHand.MAIN_HAND).getSweepHitBox((net.minecraft.world.entity.player.Player) (Object) this, entity)); - double entityReachSq = Mth.square(this.getEntityReach()); // Use entity reach instead of constant 9.0. Vanilla uses bottom center-to-center checks here, so don't update this to use canReach, since it uses closest-corner checks. + final List list = this.level().getEntitiesOfClass(LivingEntity.class, PlatformHooks.getSweepHitBox(this.getItemInHand(InteractionHand.MAIN_HAND), (net.minecraft.world.entity.player.Player) (Object) this, entity)); + double entityReachSq = Mth.square(PlatformHooks.getEntityReach((net.minecraft.world.entity.player.Player) (Object) this)); // Use entity reach instead of constant 9.0. Vanilla uses bottom center-to-center checks here, so don't update this to use canReach, since it uses closest-corner checks. for (final LivingEntity entityliving : list) { if (entityliving != (Object) this && entityliving != entity && !this.isAlliedTo(entityliving) && (!(entityliving instanceof ArmorStand) || !((ArmorStand) entityliving).isMarker()) && this.distanceToSqr(entityliving) < entityReachSq && entityliving.hurt(((DamageSourceBridge) this.damageSources().playerAttack((net.minecraft.world.entity.player.Player) (Object) this)).bridge$sweep(), f5)) { entityliving.knockback(0.4f, Mth.sin(this.getYRot() * 0.017453292f), -Mth.cos(this.getYRot() * 0.017453292f)); @@ -376,15 +374,12 @@ public void attack(final Entity entity) { } EnchantmentHelper.doPostDamageEffects((net.minecraft.world.entity.player.Player) (Object) this, entity); final ItemStack itemstack2 = this.getMainHandItem(); - Entity object = entity; - if (entity instanceof PartEntity) { - object = ((PartEntity) entity).getParent(); - } + Entity object = PlatformHooks.getMultipartParent(entity); if (!this.level().isClientSide && !itemstack2.isEmpty() && object instanceof LivingEntity) { ItemStack copy = itemstack2.copy(); itemstack2.hurtEnemy((LivingEntity) object, (net.minecraft.world.entity.player.Player) (Object) this); if (itemstack2.isEmpty()) { - net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem((net.minecraft.world.entity.player.Player) (Object) this, copy, InteractionHand.MAIN_HAND); + PlatformHooks.onPlayerDestroyItem((net.minecraft.world.entity.player.Player) (Object) this, copy, InteractionHand.MAIN_HAND); this.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java index 7ac0cd76f..25fa04d95 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java @@ -3,7 +3,6 @@ import com.mojang.datafixers.util.Either; import io.izzel.arclight.common.bridge.core.block.PortalInfoBridge; import io.izzel.arclight.common.bridge.core.entity.EntityBridge; -import io.izzel.arclight.common.bridge.core.entity.InternalEntityBridge; import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.core.inventory.container.ContainerBridge; import io.izzel.arclight.common.bridge.core.network.play.ServerPlayNetHandlerBridge; @@ -13,6 +12,7 @@ import io.izzel.arclight.common.bridge.core.world.server.ServerWorldBridge; import io.izzel.arclight.common.mod.server.block.ChestBlockDoubleInventoryHacks; import io.izzel.arclight.common.mod.util.ArclightCaptures; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.BlockUtil; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; @@ -32,7 +32,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayerGameMode; import net.minecraft.server.network.ServerGamePacketListenerImpl; -import net.minecraft.server.players.PlayerList; import net.minecraft.stats.Stat; import net.minecraft.stats.Stats; import net.minecraft.util.Mth; @@ -41,7 +40,6 @@ import net.minecraft.world.MenuProvider; import net.minecraft.world.damagesource.CombatTracker; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; @@ -57,24 +55,21 @@ import net.minecraft.world.level.GameRules; import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.block.NetherPortalBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.border.WorldBorder; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.portal.PortalInfo; -import net.minecraft.world.level.storage.LevelData; +import net.minecraft.world.level.portal.PortalShape; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Score; import net.minecraft.world.scores.Scoreboard; import net.minecraft.world.scores.Team; import net.minecraft.world.scores.criteria.ObjectiveCriteria; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.util.ITeleporter; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.server.ServerLifecycleHooks; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.WeatherType; @@ -140,10 +135,7 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla @Shadow @Nullable private Vec3 enteredNetherPosition; @Shadow private float lastSentHealth; @Shadow private int lastSentFood; - @Shadow(remap = false) private String language; @Shadow private ResourceKey respawnDimension; - @Shadow(remap = false) private boolean hasTabListName; - @Shadow(remap = false) private Component tabListDisplayName; @Shadow @Nullable private BlockPos respawnPosition; @Shadow private float respawnAngle; @Shadow private boolean respawnForced; @@ -153,6 +145,9 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla private transient PlayerTeleportEvent.TeleportCause arclight$cause; private transient BlockStateListPopulator arclight$populator; private transient PlayerSpawnChangeEvent.Cause arclight$spawnChangeCause; + private String arclight$language = "en_us"; + private boolean arclight$hasTabListName; + private Component arclight$tabListDisplayName; @Shadow protected abstract int getCoprime(int p_205735_1_); // @formatter:on @@ -212,7 +207,7 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla @Shadow public abstract void initMenu(AbstractContainerMenu p_143400_); - @Shadow + @Shadow(aliases = {"method_48105", "m_264318"}) public abstract boolean teleportTo(ServerLevel p_265564_, double p_265424_, double p_265680_, double p_265312_, Set p_265192_, float p_265059_, float p_265266_); @Shadow @@ -247,7 +242,7 @@ public final BlockPos getSpawnPoint(ServerLevel worldserver) { if (j <= 1) { i = 1; } - int i1 = (l = (k = (long) (i * 2 + 1)) * k) > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) l; + int i1 = (l = (k = i * 2L + 1) * k) > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) l; int j1 = this.getCoprime(i1); int k1 = new Random().nextInt(i1); for (int l1 = 0; l1 < i1; ++l1) { @@ -301,14 +296,15 @@ public final BlockPos getSpawnPoint(ServerLevel worldserver) { public void spawnIn(Level world) { this.setLevel(world); if (world == null) { - this.revive(); + this.bridge$revive(); Vec3 position = null; - if (this.respawnDimension != null && (world = ServerLifecycleHooks.getCurrentServer().getLevel(this.respawnDimension)) != null && this.getRespawnPosition() != null) { + var currentServer = PlatformHooks.getCurrentServer(); + if (this.respawnDimension != null && currentServer != null && (world = currentServer.getLevel(this.respawnDimension)) != null && this.getRespawnPosition() != null) { position = Player.findRespawnPositionAndUseSpawnBlock((ServerLevel) world, this.getRespawnPosition(), this.getRespawnAngle(), false, false).orElse(null); } if (world == null || position == null) { world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); - position = Vec3.atCenterOf(((ServerLevel) world).getSharedSpawnPos()); + position = Vec3.atCenterOf(world.getSharedSpawnPos()); } this.setLevel(world); this.setPos(position.x(), position.y(), position.z()); @@ -352,7 +348,7 @@ public void spawnIn(Level world) { @Overwrite public void die(DamageSource damagesource) { this.gameEvent(GameEvent.ENTITY_DIE); - if (net.minecraftforge.common.ForgeHooks.onLivingDeath((ServerPlayer) (Object) this, damagesource)) + if (PlatformHooks.onLivingDeath((ServerPlayer) (Object) this, damagesource)) return; boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); boolean keepInventory = this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator(); @@ -368,7 +364,7 @@ public void die(DamageSource damagesource) { Component defaultMessage = this.getCombatTracker().getDeathMessage(); String deathmessage = defaultMessage.getString(); List loot = new ArrayList<>(); - Collection drops = this.captureDrops(null); + Collection drops = this.bridge$captureDrops(null); if (drops != null) { for (ItemEntity entity : drops) { CraftItemStack craftItemStack = CraftItemStack.asCraftMirror(entity.getItem()); @@ -477,12 +473,62 @@ public void die(DamageSource damagesource) { @Nullable @Overwrite protected PortalInfo findDimensionEntryPoint(ServerLevel level) { - PortalInfo portalinfo = super.findDimensionEntryPoint(level); - level = portalinfo == null || ((PortalInfoBridge) portalinfo).bridge$getWorld() == null ? level : ((PortalInfoBridge) portalinfo).bridge$getWorld(); - if (portalinfo != null && ((WorldBridge) this.level()).bridge$getTypeKey() == LevelStem.OVERWORLD && ((WorldBridge) level).bridge$getTypeKey() == LevelStem.END) { + if (level == null) { + return null; + } + PortalInfo portalinfo; + boolean fromEndToOverworld = ((WorldBridge) this.level()).bridge$getTypeKey() == LevelStem.END && ((WorldBridge) level).bridge$getTypeKey() == LevelStem.OVERWORLD; + boolean toEnd = ((WorldBridge) level).bridge$getTypeKey() == LevelStem.END; + if (!fromEndToOverworld && !toEnd) { + boolean toNether = ((WorldBridge) level).bridge$getTypeKey() == LevelStem.NETHER; + if (this.level().dimension() != Level.NETHER && !toNether) { + return null; + } + WorldBorder worldBorder = level.getWorldBorder(); + double d0 = DimensionType.getTeleportationScale(this.level().dimensionType(), level.dimensionType()); + BlockPos targetPos = worldBorder.clampToBounds(this.getX() * d0, this.getY(), this.getZ() * d0); + CraftPortalEvent event = this.callPortalEvent((Entity) (Object) this, level, new PositionImpl(targetPos.getX(), targetPos.getY(), targetPos.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, toNether ? 16 : 128, 16); + if (event == null) { + return null; + } + ServerLevel worldFinal = ((CraftWorld) event.getTo().getWorld()).getHandle(); + targetPos = worldFinal.getWorldBorder().clampToBounds(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()); + portalinfo = this.getExitPortal(worldFinal, targetPos, toNether, worldBorder, event.getSearchRadius(), event.getCanCreatePortal(), event.getCreationRadius()).map((result) -> { + BlockState blockstate = this.level().getBlockState(this.portalEntrancePos); + Direction.Axis axis; + Vec3 relativePos; + if (blockstate.hasProperty(BlockStateProperties.HORIZONTAL_AXIS)) { + axis = blockstate.getValue(BlockStateProperties.HORIZONTAL_AXIS); + BlockUtil.FoundRectangle portalRect = BlockUtil.getLargestRectangleAround(this.portalEntrancePos, axis, 21, Direction.Axis.Y, 21, pos -> this.level().getBlockState(pos) == blockstate); + relativePos = this.getRelativePortalPosition(axis, portalRect); + } else { + axis = Direction.Axis.X; + relativePos = new Vec3(0.5D, 0.0D, 0.0D); + } + ArclightCaptures.captureCraftPortalEvent(event); + return PortalShape.createPortalInfo(worldFinal, result, axis, relativePos, (Entity) (Object) this, this.getDeltaMovement(), this.getYRot(), this.getXRot()); + }).orElse(null); + } else { + BlockPos blockPos; + if (toEnd) { + blockPos = ServerLevel.END_SPAWN_POINT; + } else { + blockPos = level.getHeightmapPos(net.minecraft.world.level.levelgen.Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, level.getSharedSpawnPos()); + } + CraftPortalEvent event = this.callPortalEvent((Entity) (Object) this, level, new PositionImpl(blockPos.getX() + 0.5D, blockPos.getY(), blockPos.getZ() + 0.5D), PlayerTeleportEvent.TeleportCause.END_PORTAL, 0, 0); + if (event == null) { + return null; + } + portalinfo = new PortalInfo(new Vec3(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()), this.getDeltaMovement(), this.getYRot(), this.getXRot()); + ((PortalInfoBridge) portalinfo).bridge$setWorld(((CraftWorld) event.getTo().getWorld()).getHandle()); + ((PortalInfoBridge) portalinfo).bridge$setPortalEventInfo(event); + } + + ServerLevel targetLevel = portalinfo == null || ((PortalInfoBridge) portalinfo).bridge$getWorld() == null ? level : ((PortalInfoBridge) portalinfo).bridge$getWorld(); + if (portalinfo != null && ((WorldBridge) this.level()).bridge$getTypeKey() == LevelStem.OVERWORLD && ((WorldBridge) targetLevel).bridge$getTypeKey() == LevelStem.END) { Vec3 vector3d = portalinfo.pos.add(0.0D, -1.0D, 0.0D); PortalInfo newInfo = new PortalInfo(vector3d, Vec3.ZERO, 90.0F, 0.0F); - ((PortalInfoBridge) newInfo).bridge$setWorld(level); + ((PortalInfoBridge) newInfo).bridge$setWorld(targetLevel); ((PortalInfoBridge) newInfo).bridge$setPortalEventInfo(((PortalInfoBridge) portalinfo).bridge$getPortalEventInfo()); return newInfo; } else { @@ -508,122 +554,6 @@ public boolean teleportTo(ServerLevel worldserver, double d0, double d1, double ((ServerPlayNetHandlerBridge) this.connection).bridge$pushTeleportCause(teleportCause); } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite(remap = false) - @Nullable - public Entity changeDimension(ServerLevel server, ITeleporter teleporter) { - if (this.isSleeping()) { - return (ServerPlayer) (Object) this; - } - if (!ForgeHooks.onTravelToDimension((ServerPlayer) (Object) this, server.dimension())) return null; - - PlayerTeleportEvent.TeleportCause cause = arclight$cause == null ? PlayerTeleportEvent.TeleportCause.UNKNOWN : arclight$cause; - arclight$cause = null; - - // this.invulnerableDimensionChange = true; - ServerLevel serverworld = this.serverLevel(); - ResourceKey registrykey = ((WorldBridge) serverworld).bridge$getTypeKey(); - if (registrykey == LevelStem.END && ((WorldBridge) server).bridge$getTypeKey() == LevelStem.OVERWORLD && teleporter.isVanilla()) { //Forge: Fix non-vanilla teleporters triggering end credits - this.isChangingDimension = true; - this.unRide(); - this.serverLevel().removePlayerImmediately((ServerPlayer) (Object) this, Entity.RemovalReason.CHANGED_DIMENSION); - if (!this.wonGame) { - this.wonGame = true; - this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.WIN_GAME, this.seenCredits ? 0.0F : 1.0F)); - this.seenCredits = true; - } - - return (ServerPlayer) (Object) this; - } else { - PortalInfo portalinfo = teleporter.getPortalInfo((ServerPlayer) (Object) this, server, this::findDimensionEntryPoint); - if (portalinfo != null) { - if (((PortalInfoBridge) portalinfo).bridge$getWorld() != null) { - server = ((PortalInfoBridge) portalinfo).bridge$getWorld(); - } - ServerLevel[] exitWorld = new ServerLevel[]{server}; - LevelData iworldinfo = server.getLevelData(); - this.connection.send(new ClientboundRespawnPacket(server.dimensionTypeId(), server.dimension(), BiomeManager.obfuscateSeed(server.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), server.isDebug(), server.isFlat(), (byte) 3, this.getLastDeathLocation(), this.getPortalCooldown())); - this.connection.send(new ClientboundChangeDifficultyPacket(iworldinfo.getDifficulty(), iworldinfo.isDifficultyLocked())); - PlayerList playerlist = this.server.getPlayerList(); - playerlist.sendPlayerPermissionLevel((ServerPlayer) (Object) this); - this.serverLevel().removePlayerImmediately((ServerPlayer) (Object) this, Entity.RemovalReason.CHANGED_DIMENSION); - this.revive(); - Entity e = teleporter.placeEntity((ServerPlayer) (Object) this, serverworld, exitWorld[0], this.getYRot(), spawnPortal -> {//Forge: Start vanilla logic - serverworld.getProfiler().push("moving"); - if (exitWorld[0] != null) { - if (registrykey == LevelStem.OVERWORLD && ((WorldBridge) exitWorld[0]).bridge$getTypeKey() == LevelStem.NETHER) { - this.enteredNetherPosition = this.position(); - } else if (spawnPortal && ((WorldBridge) exitWorld[0]).bridge$getTypeKey() == LevelStem.END - && (((PortalInfoBridge) portalinfo).bridge$getPortalEventInfo() == null || ((PortalInfoBridge) portalinfo).bridge$getPortalEventInfo().getCanCreatePortal())) { - this.createEndPlatform(exitWorld[0], BlockPos.containing(portalinfo.pos)); - } - } - - Location enter = this.getBukkitEntity().getLocation(); - Location exit = (exitWorld[0] == null) ? null : new Location(((WorldBridge) exitWorld[0]).bridge$getWorld(), portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.yRot, portalinfo.xRot); - PlayerTeleportEvent tpEvent = new PlayerTeleportEvent(this.getBukkitEntity(), enter, exit, cause); - Bukkit.getServer().getPluginManager().callEvent(tpEvent); - if (tpEvent.isCancelled() || tpEvent.getTo() == null) { - return null; - } - exit = tpEvent.getTo(); - - serverworld.getProfiler().pop(); - serverworld.getProfiler().push("placing"); - - this.isChangingDimension = true; - ServerLevel newWorld = ((CraftWorld) exit.getWorld()).getHandle(); - if (newWorld != exitWorld[0]) { - exitWorld[0] = newWorld; - LevelData newWorldInfo = exitWorld[0].getLevelData(); - this.connection.send(new ClientboundRespawnPacket(exitWorld[0].dimensionTypeId(), exitWorld[0].dimension(), BiomeManager.obfuscateSeed(exitWorld[0].getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), exitWorld[0].isDebug(), exitWorld[0].isFlat(), (byte) 3, this.getLastDeathLocation(), this.getPortalCooldown())); - this.connection.send(new ClientboundChangeDifficultyPacket(newWorldInfo.getDifficulty(), newWorldInfo.isDifficultyLocked())); - } - - this.setServerLevel(exitWorld[0]); - exitWorld[0].addDuringPortalTeleport((ServerPlayer) (Object) this); - - ((ServerPlayNetHandlerBridge) this.connection).bridge$teleport(exit); - this.connection.resetPosition(); - - serverworld.getProfiler().pop(); - this.triggerDimensionChangeTriggers(exitWorld[0]); - return (ServerPlayer) (Object) this;//forge: this is part of the ITeleporter patch - });//Forge: End vanilla logic - if (e == null) { - serverworld.addDuringPortalTeleport((ServerPlayer) (Object) this); - return (ServerPlayer) (Object) this; - } else if (e != (Object) this) { - throw new IllegalArgumentException(String.format("Teleporter %s returned not the player entity but instead %s, expected PlayerEntity %s", teleporter, e, this)); - } - - this.gameMode.setLevel(exitWorld[0]); - this.connection.send(new ClientboundPlayerAbilitiesPacket(this.getAbilities())); - playerlist.sendLevelInfo((ServerPlayer) (Object) this, exitWorld[0]); - playerlist.sendAllPlayerInfo((ServerPlayer) (Object) this); - - for (MobEffectInstance effectinstance : this.getActiveEffects()) { - this.connection.send(new ClientboundUpdateMobEffectPacket(this.getId(), effectinstance)); - } - - if (teleporter.playTeleportSound((ServerPlayer) (Object) this, serverworld, exitWorld[0])) { - this.connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); - } - this.lastSentExp = -1; - this.lastSentHealth = -1.0F; - this.lastSentFood = -1; - ForgeEventFactory.firePlayerChangedDimensionEvent((ServerPlayer) (Object) this, serverworld.dimension(), exitWorld[0].dimension()); - PlayerChangedWorldEvent changeEvent = new PlayerChangedWorldEvent(this.getBukkitEntity(), ((WorldBridge) serverworld).bridge$getWorld()); - Bukkit.getPluginManager().callEvent(changeEvent); - } - - return (ServerPlayer) (Object) this; - } - } - @Override protected CraftPortalEvent callPortalEvent(Entity entity, ServerLevel exitWorldServer, PositionImpl exitPosition, PlayerTeleportEvent.TeleportCause cause, int searchRadius, int creationRadius) { Location enter = this.getBukkitEntity().getLocation(); @@ -638,7 +568,7 @@ protected CraftPortalEvent callPortalEvent(Entity entity, ServerLevel exitWorldS @Override protected Optional getExitPortal(ServerLevel worldserver, BlockPos blockposition, boolean flag, WorldBorder worldborder, int searchRadius, boolean canCreatePortal, int createRadius) { - Optional optional = super.getExitPortal(worldserver, blockposition, flag, worldborder, searchRadius, canCreatePortal, createRadius); + Optional optional = ((TeleporterBridge) worldserver.getPortalForcer()).bridge$findPortal(blockposition, worldborder, searchRadius); if (optional.isPresent() || !canCreatePortal) { return optional; } @@ -804,7 +734,7 @@ public void openHorseInventory(final AbstractHorse entityhorseabstract, final Co this.connection.send(new ClientboundHorseScreenOpenPacket(this.containerCounter, iinventory.getContainerSize(), entityhorseabstract.getId())); this.containerMenu = container; this.initMenu(this.containerMenu); - net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.PlayerContainerEvent.Open((ServerPlayer) (Object) this, this.containerMenu)); + PlatformHooks.postPlayerContainerOpen((ServerPlayer) (Object) this, this.containerMenu); } @Inject(method = "doCloseContainer", at = @At("HEAD")) @@ -850,11 +780,12 @@ public void openHorseInventory(final AbstractHorse entityhorseabstract, final Co PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), (this.getMainArm() == HumanoidArm.LEFT) ? MainHand.LEFT : MainHand.RIGHT); Bukkit.getPluginManager().callEvent(event); } - if (!this.language.equals(packetIn.language())) { + if (!this.arclight$language.equals(packetIn.language())) { PlayerLocaleChangeEvent event2 = new PlayerLocaleChangeEvent(this.getBukkitEntity(), packetIn.language()); Bukkit.getPluginManager().callEvent(event2); } this.locale = packetIn.language(); + this.arclight$language = packetIn.language(); this.clientViewDistance = packetIn.viewDistance(); } @@ -873,11 +804,11 @@ public Component getTabListDisplayName() { if (this.listName != null) { return this.listName; } - if (!this.hasTabListName) { - this.tabListDisplayName = net.minecraftforge.event.ForgeEventFactory.getPlayerTabListDisplayName((ServerPlayer) (Object) this); - this.hasTabListName = true; + if (!this.arclight$hasTabListName) { + this.arclight$tabListDisplayName = PlatformHooks.getPlayerTabListDisplayName((ServerPlayer) (Object) this); + this.arclight$hasTabListName = true; } - return tabListDisplayName; + return arclight$tabListDisplayName; } @Inject(method = "teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDFF)V", cancellable = true, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/level/ServerPlayer;stopRiding()V")) @@ -894,12 +825,12 @@ public void teleportTo(ServerLevel worldserver, double d0, double d1, double d2, } public CraftPlayer getBukkitEntity() { - return (CraftPlayer) ((InternalEntityBridge) this).internal$getBukkitEntity(); + return (CraftPlayer) this.internal$getBukkitEntity(); } @Override public CraftPlayer bridge$getBukkitEntity() { - return (CraftPlayer) ((InternalEntityBridge) this).internal$getBukkitEntity(); + return (CraftPlayer) this.internal$getBukkitEntity(); } @Override @@ -988,7 +919,7 @@ public void forceSetPositionRotation(double x, double y, double z, float yaw, fl @Override public boolean isImmobile() { - return super.isImmobile() || !this.getBukkitEntity().isOnline(); + return this.isRemoved() || !this.getBukkitEntity().isOnline(); } @Override @@ -1007,7 +938,7 @@ public void setRespawnPosition(ResourceKey p_9159_, @Nullable BlockPos p_ */ @Overwrite public void setRespawnPosition(ResourceKey p_9159_, @Nullable BlockPos p_9160_, float p_9161_, boolean p_9162_, boolean p_9163_) { - if (ForgeEventFactory.onPlayerSpawnSet((ServerPlayer) (Object) this, p_9160_ == null ? Level.OVERWORLD : p_9159_, p_9160_, p_9162_)) + if (PlatformHooks.onPlayerSpawnSet((ServerPlayer) (Object) this, p_9160_ == null ? Level.OVERWORLD : p_9159_, p_9160_, p_9162_)) return; var cause = arclight$spawnChangeCause == null ? PlayerSpawnChangeEvent.Cause.UNKNOWN : arclight$spawnChangeCause; arclight$spawnChangeCause = null; @@ -1147,3 +1078,4 @@ public void reset() { this.server.getCommands().sendCommands((ServerPlayer) (Object) this); } } + diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin_FabricBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin_FabricBridge.java new file mode 100644 index 000000000..12f91d6b0 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin_FabricBridge.java @@ -0,0 +1,233 @@ +package io.izzel.arclight.common.mixin.core.world.entity.player; + +import com.mojang.datafixers.util.Either; +import io.izzel.arclight.common.adventure.PaperAdventure; +import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; +import io.izzel.arclight.common.bridge.core.network.play.ServerPlayNetHandlerBridge; +import io.izzel.arclight.common.mixin.core.world.entity.LivingEntityMixin_FabricBridge; +import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.util.Unit; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v.entity.CraftPlayer; +import org.bukkit.event.entity.EntityExhaustionEvent; +import org.bukkit.event.player.PlayerSpawnChangeEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +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.callback.CallbackInfo; + +import javax.annotation.Nullable; +import java.util.Optional; + +@Mixin(ServerPlayer.class) +@LoadIfMod(modid = {"forge"}, condition = LoadIfMod.ModCondition.ABSENT) +public abstract class ServerPlayerMixin_FabricBridge extends LivingEntityMixin_FabricBridge implements ServerPlayerEntityBridge { + + // @formatter:off + @Shadow @Final public MinecraftServer server; + @Shadow @Final public ServerPlayerGameMode gameMode; + @Shadow public ServerGamePacketListenerImpl connection; + @Shadow public int lastSentExp; + @Unique + private transient PlayerTeleportEvent.TeleportCause arclight$teleportCause; + @Unique + private transient PlayerSpawnChangeEvent.Cause arclight$spawnCause; + @Unique + private transient EntityExhaustionEvent.ExhaustionReason arclight$exhaustReason; + @Unique + private Location arclight$compassTarget; + @Unique + private boolean arclight$trackerDirty; + @Unique + private boolean arclight$joining = true; + @Unique + private boolean arclight$initialized; + @Unique + private boolean arclight$fauxSleeping; + + @Shadow public abstract void setServerLevel(ServerLevel world); + @Shadow public abstract void triggerDimensionChangeTriggers(ServerLevel world); + @Shadow @Nullable public abstract BlockPos getRespawnPosition(); + @Shadow public abstract ResourceKey getRespawnDimension(); + // @formatter:on + + @Inject(method = "", at = @At("RETURN")) + private void arclight$fabricInit(MinecraftServer server, ServerLevel world, com.mojang.authlib.GameProfile profile, CallbackInfo ci) { + this.arclight$initialized = true; + } + + @Inject(method = "tick", at = @At("HEAD")) + private void arclight$fabricJoinState(CallbackInfo ci) { + if (this.arclight$joining) { + this.arclight$joining = false; + } + } + + public CraftPlayer getBukkitEntity() { + return (CraftPlayer) internal$getBukkitEntity(); + } + + @Override + public CraftPlayer bridge$getBukkitEntity() { + return (CraftPlayer) internal$getBukkitEntity(); + } + + @Override + public boolean bridge$isFauxSleeping() { + return this.arclight$fauxSleeping; + } + + @Override + public Either bridge$trySleep(BlockPos at, boolean force) { + return ((ServerPlayer) (Object) this).startSleepInBed(at); + } + + @Override + public void bridge$pushExhaustReason(EntityExhaustionEvent.ExhaustionReason reason) { + this.arclight$exhaustReason = reason; + } + + @Override + public float bridge$getAttackCooldown() { + return ((Player) (Object) this).getAttackStrengthScale(0.5f); + } + + @Override + public void bridge$resetAttackCooldown() { + ((Player) (Object) this).resetAttackStrengthTicker(); + } + + @Override + public Location bridge$getCompassTarget() { + if (this.arclight$compassTarget != null) { + return this.arclight$compassTarget; + } + var respawnPos = this.getRespawnPosition(); + var respawnDim = this.getRespawnDimension(); + if (respawnPos != null && respawnDim != null) { + var world = this.server.getLevel(respawnDim); + if (world != null) { + return new Location(bridge$getBukkitEntity().getWorld(), respawnPos.getX(), respawnPos.getY(), respawnPos.getZ()); + } + } + return bridge$getBukkitEntity().getWorld().getSpawnLocation(); + } + + @Override + public void bridge$pushChangeDimensionCause(PlayerTeleportEvent.TeleportCause cause) { + this.arclight$teleportCause = cause; + } + + @Override + public void bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause cause) { + this.arclight$spawnCause = cause; + } + + @Override + public Optional bridge$getTeleportCause() { + try { + return Optional.ofNullable(this.arclight$teleportCause); + } finally { + this.arclight$teleportCause = null; + } + } + + @Override + public BlockPos bridge$getSpawnPoint(ServerLevel world) { + return world.getSharedSpawnPos(); + } + + @Override + public boolean bridge$isMovementBlocked() { + var self = (ServerPlayer) (Object) this; + return !self.isAlive() || self.isSleeping() || self.isRemoved(); + } + + @Override + public void bridge$setCompassTarget(Location location) { + this.arclight$compassTarget = location; + } + + @Override + public boolean bridge$isJoining() { + return this.arclight$joining; + } + + @Override + public void bridge$reset() { + var self = (ServerPlayer) (Object) this; + self.setHealth(self.getMaxHealth()); + self.stopUsingItem(); + self.setRemainingFireTicks(0); + self.resetFallDistance(); + self.setArrowCount(0); + self.removeAllEffects(); + this.lastSentExp = -1; + self.setDeltaMovement(0.0, 0.0, 0.0); + } + + @Override + public Entity bridge$changeDimension(ServerLevel world, PlayerTeleportEvent.TeleportCause cause) { + this.arclight$teleportCause = cause; + return ((ServerPlayer) (Object) this).changeDimension(world); + } + + @Override + public boolean bridge$initialized() { + return this.arclight$initialized; + } + + @Override + public boolean bridge$isTrackerDirty() { + return this.arclight$trackerDirty; + } + + @Override + public void bridge$setTrackerDirty(boolean flag) { + this.arclight$trackerDirty = flag; + } + + @Override + public void bridge$sendActionBar(net.kyori.adventure.text.Component message) { + var vanilla = PaperAdventure.asVanilla(message); + this.connection.send(new net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket(vanilla)); + } + + @Override + public void bridge$sendTitle(net.kyori.adventure.title.Title title) { + var times = title.times(); + if (times != null) { + this.connection.send(new net.minecraft.network.protocol.game.ClientboundSetTitlesAnimationPacket( + (int) (times.fadeIn().toMillis() / 50L), + (int) (times.stay().toMillis() / 50L), + (int) (times.fadeOut().toMillis() / 50L) + )); + } + this.connection.send(new net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket(PaperAdventure.asVanilla(title.title()))); + this.connection.send(new net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket(PaperAdventure.asVanilla(title.subtitle()))); + } + + @Override + public int bridge$getPing() { + return ((ServerPlayNetHandlerBridge) this.connection).bridge$getLatency(); + } + + @Override + public void bridge$updateCommands() { + this.server.getCommands().sendCommands((ServerPlayer) (Object) this); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableItemProjectileMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableItemProjectileMixin.java index ee72a9e42..619190e4d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableItemProjectileMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableItemProjectileMixin.java @@ -2,6 +2,7 @@ import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; +import net.minecraft.world.phys.HitResult; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -12,6 +13,10 @@ public abstract class ThrowableItemProjectileMixin extends ThrowableProjectileMi @Shadow protected abstract Item getDefaultItem(); // @formatter:on + protected void onHit(HitResult result) { + super.onHit(result); + } + public Item getDefaultItemPublic() { return this.getDefaultItem(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableProjectileMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableProjectileMixin.java index e14841749..8c824c05c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableProjectileMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableProjectileMixin.java @@ -3,6 +3,7 @@ import io.izzel.arclight.common.bridge.core.entity.LivingEntityBridge; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrowableProjectile; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; @@ -12,9 +13,36 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + @Mixin(ThrowableProjectile.class) public abstract class ThrowableProjectileMixin extends ProjectileMixin { + private static final MethodHandle ARCLIGHT$PROJECTILE_ON_HIT = arclight$findProjectileOnHit(); + + private static MethodHandle arclight$findProjectileOnHit() { + try { + return MethodHandles.lookup().findSpecial( + Projectile.class, + "onHit", + MethodType.methodType(void.class, HitResult.class), + ThrowableProjectile.class + ); + } catch (ReflectiveOperationException e) { + throw new ExceptionInInitializerError(e); + } + } + + protected void onHit(HitResult result) { + try { + ARCLIGHT$PROJECTILE_ON_HIT.invokeExact((ThrowableProjectile) (Object) this, result); + } catch (Throwable throwable) { + throw new RuntimeException("Failed to invoke Projectile#onHit super implementation", throwable); + } + } + @Inject(method = "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/level/Level;)V", at = @At("RETURN")) private void arclight$init(EntityType type, LivingEntity livingEntityIn, Level worldIn, CallbackInfo ci) { this.projectileSource = ((LivingEntityBridge) livingEntityIn).bridge$getBukkitEntity(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownEggMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownEggMixin.java index f386f30b1..3b62c0b84 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownEggMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownEggMixin.java @@ -8,6 +8,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.animal.Chicken; +import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrownEgg; import net.minecraft.world.phys.HitResult; import org.bukkit.Bukkit; @@ -18,16 +19,43 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + @Mixin(ThrownEgg.class) public abstract class ThrownEggMixin extends ThrowableProjectileMixin { + private static final MethodHandle ARCLIGHT$PROJECTILE_ON_HIT = arclight$findProjectileOnHit(); + + private static MethodHandle arclight$findProjectileOnHit() { + try { + return MethodHandles.lookup().findSpecial( + Projectile.class, + "onHit", + MethodType.methodType(void.class, HitResult.class), + ThrownEgg.class + ); + } catch (ReflectiveOperationException e) { + throw new ExceptionInInitializerError(e); + } + } + + private void arclight$invokeProjectileOnHit(HitResult result) { + try { + ARCLIGHT$PROJECTILE_ON_HIT.invokeExact((ThrownEgg) (Object) this, result); + } catch (Throwable throwable) { + throw new RuntimeException("Failed to invoke Projectile#onHit super implementation", throwable); + } + } + /** * @author IzzelAliz * @reason */ @Overwrite protected void onHit(final HitResult result) { - super.onHit(result); + this.arclight$invokeProjectileOnHit(result); if (!this.level().isClientSide) { boolean hatching = this.random.nextInt(8) == 0; byte b0 = 1; @@ -53,8 +81,7 @@ protected void onHit(final HitResult result) { var entityType = ((EntityTypeBridge) (Object) hatchingType).bridge$getHandle(); var entity = entityType.create(this.level()); // Let's do: Meadow mixin compatibility https://github.com/IzzelAliz/Arclight/issues/1149 - if (entity instanceof Chicken) { - Chicken chicken = (Chicken) entity; + if (entity instanceof Chicken chicken) { Blackhole.consume(chicken); } if (entity != null) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownExperienceBottleMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownExperienceBottleMixin.java index 19a38ce1a..5d6062b08 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownExperienceBottleMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownExperienceBottleMixin.java @@ -2,6 +2,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.ExperienceOrb; +import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrownExperienceBottle; import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; @@ -11,16 +12,43 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + @Mixin(ThrownExperienceBottle.class) public abstract class ThrownExperienceBottleMixin extends ThrowableItemProjectileMixin { + private static final MethodHandle ARCLIGHT$PROJECTILE_ON_HIT = arclight$findProjectileOnHit(); + + private static MethodHandle arclight$findProjectileOnHit() { + try { + return MethodHandles.lookup().findSpecial( + Projectile.class, + "onHit", + MethodType.methodType(void.class, HitResult.class), + ThrownExperienceBottle.class + ); + } catch (ReflectiveOperationException e) { + throw new ExceptionInInitializerError(e); + } + } + + private void arclight$invokeProjectileOnHit(HitResult result) { + try { + ARCLIGHT$PROJECTILE_ON_HIT.invokeExact((ThrownExperienceBottle) (Object) this, result); + } catch (Throwable throwable) { + throw new RuntimeException("Failed to invoke Projectile#onHit super implementation", throwable); + } + } + /** * @author IzzelAliz * @reason */ @Overwrite protected void onHit(HitResult result) { - super.onHit(result); + this.arclight$invokeProjectileOnHit(result); if (!this.level().isClientSide) { int i = 3 + this.level().random.nextInt(5) + this.level().random.nextInt(5); ExpBottleEvent event = CraftEventFactory.callExpBottleEvent((ThrownExperienceBottle) (Object) this, i); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartMixin.java index b3ceb4941..4b035f2ea 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartMixin.java @@ -115,7 +115,7 @@ public boolean hurt(DamageSource source, float amount) { amount = (float) event.getDamage(); this.setHurtDir(-this.getHurtDir()); this.setHurtTime(10); - this.markHurt(); + ((Entity) (Object) this).hurtMarked = true; this.setDamage(this.getDamage() + amount * 10.0f); this.gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity()); boolean flag = source.getEntity() instanceof Player && ((Player) source.getEntity()).getAbilities().instabuild; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/MinecartCommandBlock_MinecartCommandBaseMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/MinecartCommandBlock_MinecartCommandBaseMixin.java index 787c4251e..ee214fb07 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/MinecartCommandBlock_MinecartCommandBaseMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/vehicle/MinecartCommandBlock_MinecartCommandBaseMixin.java @@ -12,7 +12,7 @@ public abstract class MinecartCommandBlock_MinecartCommandBaseMixin implements ICommandSourceBridge { @SuppressWarnings("target") - @Shadow(aliases = {"this$0", "f_38537_"}, remap = false) + @Shadow(aliases = {"this$0", "f_38537_", "field_7745"}, remap = false) private MinecartCommandBlock outerThis; public CommandSender getBukkitSender(CommandSourceStack wrapper) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java index 635a721cd..839082944 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java @@ -4,7 +4,9 @@ import io.izzel.arclight.common.bridge.core.inventory.container.ContainerBridge; import io.izzel.arclight.common.bridge.core.inventory.container.SlotBridge; import io.izzel.arclight.common.mod.server.ArclightContainer; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; @@ -13,8 +15,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.registries.ForgeRegistries; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; import org.bukkit.craftbukkit.v.inventory.CraftInventory; @@ -134,7 +134,7 @@ public void transferTo(AbstractContainerMenu other, CraftHumanEntity player) { public Component getTitle() { if (this.title == null) { if (this.menuType != null) { - var key = ForgeRegistries.MENU_TYPES.getKey(this.menuType); + var key = BuiltInRegistries.MENU.getKey(this.menuType); return Component.translatable(Optional.ofNullable(key).map(Object::toString).orElseGet(this::toString)); } else { return Component.translatable(this.toString()); @@ -190,7 +190,7 @@ private void doClick(int slotId, int dragType, ClickType clickType, Player playe } } else if (this.quickcraftStatus == 2) { if (!this.quickcraftSlots.isEmpty()) { - if (false && this.quickcraftSlots.size() == 1) { + if (false) { int l = (this.quickcraftSlots.iterator().next()).index; this.resetQuickCraft(); this.doClick(l, this.quickcraftType, ClickType.PICKUP, player); @@ -285,7 +285,7 @@ private void doClick(int slotId, int dragType, ClickType clickType, Player playe ItemStack itemstack10 = slot7.getItem(); ItemStack itemstack11 = this.getCarried(); player.updateTutorialInventoryAction(itemstack11, slot7.getItem(), clickaction); - if (!this.tryItemClickBehaviourOverride(player, clickaction, slot7, itemstack10, itemstack11) && !ForgeHooks.onItemStackedOn(itemstack10, itemstack11, slot7, clickaction, player, this.createCarriedSlotAccess())) { + if (!this.tryItemClickBehaviourOverride(player, clickaction, slot7, itemstack10, itemstack11) && !PlatformHooks.onItemStackedOn(itemstack10, itemstack11, slot7, clickaction, player, this.createCarriedSlotAccess())) { if (itemstack10.isEmpty()) { if (!itemstack11.isEmpty()) { int l2 = clickaction == ClickAction.PRIMARY ? itemstack11.getCount() : 1; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin.java index 341ef2b48..3d411ab15 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin.java @@ -43,8 +43,6 @@ public abstract class BucketItemMixin { // @formatter:off @Shadow public abstract boolean emptyContents(@Nullable Player player, Level worldIn, BlockPos posIn, @javax.annotation.Nullable BlockHitResult rayTrace); - @Shadow(remap = false) public abstract boolean emptyContents(@Nullable Player p_150716_, Level p_150717_, BlockPos p_150718_, @Nullable BlockHitResult p_150719_, @Nullable ItemStack container); - @Inject(method = "use", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/BucketPickup;pickupBlock(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/world/item/ItemStack;")) private void arclight$bucketFill(Level worldIn, Player playerIn, InteractionHand handIn, CallbackInfoReturnable> cir, ItemStack stack, BlockHitResult result) { if (!DistValidate.isValid(worldIn)) return; @@ -61,7 +59,7 @@ public abstract class BucketItemMixin { } } - @Inject(method = "use", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraft/world/item/BucketItem;emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/item/ItemStack;)Z")) + @Inject(method = "use", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/BucketItem;emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;)Z")) private void arclight$capture(Level worldIn, Player playerIn, InteractionHand handIn, CallbackInfoReturnable> cir, ItemStack stack, BlockHitResult result) { arclight$direction = result.getDirection(); arclight$click = result.getBlockPos(); @@ -85,18 +83,20 @@ public boolean emptyContents(Player entity, Level world, BlockPos pos, @Nullable arclight$click = clicked; arclight$hand = hand; try { - return this.emptyContents(entity, world, pos, result, itemstack); + return this.emptyContents(entity, world, pos, result); } finally { arclight$direction = null; arclight$click = null; } } - @Inject(method = "emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/item/ItemStack;)Z", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z")) - private void arclight$bucketEmpty(Player player, Level worldIn, BlockPos posIn, BlockHitResult rayTrace, ItemStack stack, CallbackInfoReturnable cir) { + @Inject(method = "emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;)Z", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z")) + private void arclight$bucketEmpty(Player player, Level worldIn, BlockPos posIn, BlockHitResult rayTrace, CallbackInfoReturnable cir) { if (!DistValidate.isValid(worldIn)) return; - if (player != null && stack != null) { - PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((ServerLevel) worldIn, player, posIn, arclight$click, arclight$direction, stack, arclight$hand == null ? InteractionHand.MAIN_HAND : arclight$hand); + if (player != null) { + var hand = arclight$hand == null ? InteractionHand.MAIN_HAND : arclight$hand; + ItemStack stack = player.getItemInHand(hand); + PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((ServerLevel) worldIn, player, posIn, arclight$click, arclight$direction, stack, hand); if (event.isCancelled()) { ((ServerPlayer) player).connection.send(new ClientboundBlockUpdatePacket(worldIn, posIn)); ((ServerPlayerEntityBridge) player).bridge$getBukkitEntity().updateInventory(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/LevelMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/LevelMixin.java index f14f3e340..6578f9045 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/LevelMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/LevelMixin.java @@ -19,13 +19,11 @@ import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelWriter; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.border.WorldBorder; -import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.storage.LevelData; @@ -34,15 +32,12 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.CraftWorld; -import org.bukkit.craftbukkit.v.block.CraftBlock; -import org.bukkit.craftbukkit.v.block.data.CraftBlockData; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.craftbukkit.v.generator.CraftWorldInfo; import org.bukkit.craftbukkit.v.generator.CustomChunkGenerator; import org.bukkit.craftbukkit.v.generator.CustomWorldChunkManager; import org.bukkit.craftbukkit.v.util.CraftSpawnCategory; import org.bukkit.entity.SpawnCategory; -import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.generator.ChunkGenerator; import org.spigotmc.SpigotWorldConfig; @@ -95,7 +90,7 @@ public abstract class LevelMixin implements WorldBridge, LevelWriter { @Shadow public abstract ResourceKey dimension(); - @Shadow(remap = false) public abstract void markAndNotifyBlock(BlockPos p_46605_,@org.jetbrains.annotations.Nullable LevelChunk levelchunk, BlockState blockstate, BlockState p_46606_, int p_46607_, int p_46608_); + @Shadow public abstract void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags); @Shadow public abstract DimensionType dimensionType(); @@ -156,37 +151,13 @@ public abstract class LevelMixin implements WorldBridge, LevelWriter { private boolean processCaptures(BlockPos pos, BlockState newState, int flags) { Entity entityChangeBlock = ArclightCaptures.getEntityChangeBlock(); if (entityChangeBlock != null) { - if (!CraftEventFactory.callEntityChangeBlockEvent(entityChangeBlock, pos, newState)) { - return false; - } + return CraftEventFactory.callEntityChangeBlockEvent(entityChangeBlock, pos, newState); } return true; } - @Inject(method = "markAndNotifyBlock", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;updateNeighbourShapes(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;II)V")) - private void arclight$callBlockPhysics(BlockPos pos, LevelChunk chunk, BlockState blockstate, BlockState state, int flags, int recursionLeft, CallbackInfo ci) { - try { - if (this.world != null) { - BlockPhysicsEvent event = new BlockPhysicsEvent(CraftBlock.at((LevelAccessor) this, pos), CraftBlockData.fromData(state)); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - ci.cancel(); - } - } - } catch (StackOverflowError e) { - lastPhysicsProblem = pos; - } - } - - @Inject(method = "markAndNotifyBlock", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;onBlockStateChange(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;)V")) - private void arclight$preventPoiUpdate(BlockPos p_46605_, LevelChunk levelchunk, BlockState blockstate, BlockState p_46606_, int p_46607_, int p_46608_, CallbackInfo ci) { - if (this.preventPoiUpdated) { - ci.cancel(); - } - } - - public void notifyAndUpdatePhysics(BlockPos blockposition, LevelChunk chunk, BlockState oldBlock, BlockState newBlock, BlockState actualBlock, int i, int j) { - this.markAndNotifyBlock(blockposition, chunk, oldBlock, newBlock, i, j); + public void notifyAndUpdatePhysics(BlockPos blockposition, @Nullable Object chunk, BlockState oldBlock, BlockState newBlock, BlockState actualBlock, int i, int j) { + this.sendBlockUpdated(blockposition, oldBlock, newBlock, i); } public CraftServer getCraftServer() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/BlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/BlockMixin.java index 52670772c..c7f4ae07e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/BlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/BlockMixin.java @@ -5,7 +5,9 @@ import io.izzel.arclight.common.mixin.core.world.level.block.state.BlockBehaviourMixin; import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.izzel.arclight.common.mod.util.DistValidate; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.valueproviders.IntProvider; @@ -17,10 +19,10 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.extensions.IForgeBlock; import org.bukkit.craftbukkit.v.CraftWorld; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.event.CraftEventFactory; @@ -63,6 +65,7 @@ public static void popResource(Level worldIn, BlockPos pos, ItemStack stack) { // @formatter:off @Shadow public abstract BlockState defaultBlockState(); + public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, LevelAccessor worldIn, BlockPos currentPos, BlockPos facingPos) { return stateIn; } // @formatter:on @Shadow @@ -72,9 +75,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { } public int getExpDrop(BlockState blockState, ServerLevel world, BlockPos blockPos, ItemStack itemStack, boolean flag) { - int silkTouch = itemStack.getEnchantmentLevel(Enchantments.SILK_TOUCH); - int fortune = itemStack.getEnchantmentLevel(Enchantments.BLOCK_FORTUNE); - return ((IForgeBlock) this).getExpDrop(blockState, world, world.random, blockPos, fortune, silkTouch); + return PlatformHooks.getBlockExpDrop((Block) (Object) this, blockState, world, blockPos, itemStack, flag); } protected int tryDropExperience(ServerLevel worldserver, BlockPos blockposition, ItemStack itemstack, IntProvider intprovider) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java index c916bf24e..358d7b647 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java @@ -11,7 +11,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.WorldlyContainer; import net.minecraft.world.entity.ExperienceOrb; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -94,6 +93,16 @@ public abstract class AbstractFurnaceBlockEntityMixin extends LockableBlockEntit } } + @Inject(method = "serverTick", at = @At("HEAD")) + private static void arclight$captureFurnace(Level level, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity furnace, CallbackInfo ci) { + arclight$captureFurnace = furnace; + } + + @Inject(method = "serverTick", at = @At("RETURN")) + private static void arclight$resetFurnace(Level level, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity furnace, CallbackInfo ci) { + arclight$captureFurnace = null; + } + @Redirect(method = "createExperience", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/ExperienceOrb;award(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/phys/Vec3;I)V")) private static void arclight$expEvent(ServerLevel level, Vec3 vec3, int amount) { if (arclight$capturePlayer != null && arclight$captureAmount != 0) { @@ -115,35 +124,39 @@ public abstract class AbstractFurnaceBlockEntityMixin extends LockableBlockEntit public abstract List> getRecipesToAwardAndPopExperience(ServerLevel p_154996_, Vec3 p_154997_); @Shadow - protected abstract boolean canBurn(RegistryAccess p_266924_, @org.jetbrains.annotations.Nullable Recipe p_155006_, NonNullList p_155007_, int p_155008_); + private static boolean canBurn(RegistryAccess p_266924_, @org.jetbrains.annotations.Nullable Recipe p_155006_, NonNullList p_155007_, int p_155008_) { + return false; + } /** * @author IzzelAliz * @reason */ @Overwrite - private boolean burn(RegistryAccess registryAccess, @Nullable Recipe recipe, NonNullList items, int i) { - if (recipe != null && this.canBurn(registryAccess, recipe, items, i)) { + private static boolean burn(RegistryAccess registryAccess, @Nullable Recipe recipe, NonNullList items, int i) { + if (recipe != null && canBurn(registryAccess, recipe, items, i)) { ItemStack itemstack = items.get(0); - ItemStack itemstack1 = ((Recipe) recipe).assemble((AbstractFurnaceBlockEntity) (Object) this, registryAccess); + ItemStack itemstack1 = recipe.getResultItem(registryAccess); ItemStack itemstack2 = items.get(2); - CraftItemStack source = CraftItemStack.asCraftMirror(itemstack); - org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack1); - - FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(CraftBlock.at(level, worldPosition), source, result); - Bukkit.getPluginManager().callEvent(furnaceSmeltEvent); + var furnace = arclight$captureFurnace; + if (furnace != null && furnace.getLevel() != null) { + CraftItemStack source = CraftItemStack.asCraftMirror(itemstack); + org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack1); + FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(CraftBlock.at(furnace.getLevel(), furnace.getBlockPos()), source, result); + Bukkit.getPluginManager().callEvent(furnaceSmeltEvent); + + if (furnaceSmeltEvent.isCancelled()) { + return false; + } - if (furnaceSmeltEvent.isCancelled()) { - return false; + result = furnaceSmeltEvent.getResult(); + itemstack1 = CraftItemStack.asNMSCopy(result); } - result = furnaceSmeltEvent.getResult(); - itemstack1 = CraftItemStack.asNMSCopy(result); - if (!itemstack1.isEmpty()) { if (itemstack2.isEmpty()) { items.set(2, itemstack1.copy()); - } else if (CraftItemStack.asCraftMirror(itemstack2).isSimilar(result)) { + } else if (CraftItemStack.asCraftMirror(itemstack2).isSimilar(CraftItemStack.asBukkitCopy(itemstack1))) { itemstack2.grow(itemstack1.getCount()); } else { return false; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java index 8cee00aef..cf756cef4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java @@ -48,6 +48,10 @@ public abstract class BlockEntityMixin implements TileEntityBridge { @Inject(method = "load", at = @At("RETURN")) public void arclight$loadPersistent(CompoundTag compound, CallbackInfo ci) { + this.arclight$readPersistentData(compound); + } + + protected void arclight$readPersistentData(CompoundTag compound) { this.persistentDataContainer = new CraftPersistentDataContainer(DATA_TYPE_REGISTRY); CompoundTag persistentDataTag = compound.getCompound("PublicBukkitValues"); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BrushableBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BrushableBlockEntityMixin.java index 1d7308854..827bf45e0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BrushableBlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BrushableBlockEntityMixin.java @@ -27,8 +27,8 @@ public abstract class BrushableBlockEntityMixin extends BlockEntityMixin { return true; } - @Inject(method = "load", at = @At("HEAD")) + @Inject(method = "load", at = @At("RETURN")) private void arclight$load(CompoundTag p_277597_, CallbackInfo ci) { - super.load(p_277597_); + this.arclight$readPersistentData(p_277597_); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/ChiseledBookShelfBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/ChiseledBookShelfBlockEntityMixin.java index 05e1b5f6a..fe7e120b2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/ChiseledBookShelfBlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/ChiseledBookShelfBlockEntityMixin.java @@ -78,8 +78,8 @@ public Location getLocation() { } } - @Inject(method = "load", at = @At("HEAD")) + @Inject(method = "load", at = @At("RETURN")) private void arclight$load(CompoundTag p_277597_, CallbackInfo ci) { - super.load(p_277597_); + this.arclight$readPersistentData(p_277597_); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/EndGatewayBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/EndGatewayBlockEntityMixin.java index 31a97ec79..843d62c7a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/EndGatewayBlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/EndGatewayBlockEntityMixin.java @@ -4,7 +4,6 @@ import io.izzel.arclight.common.bridge.core.network.play.ServerPlayNetHandlerBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -28,11 +27,14 @@ public abstract class EndGatewayBlockEntityMixin extends BlockEntityMixin { @Shadow private static void triggerCooldown(Level p_155850_, BlockPos p_155851_, BlockState p_155852_, TheEndGatewayBlockEntity p_155853_) { } // @formatter:on - @Inject(method = "teleportEntity", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setPortalCooldown()V")) + @Inject(method = "teleportEntity", cancellable = true, locals = LocalCapture.CAPTURE_FAILSOFT, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setPortalCooldown()V")) private static void arclight$portal(Level level, BlockPos pos, BlockState state, Entity entityIn, TheEndGatewayBlockEntity entity, CallbackInfo ci, - ServerLevel serverLevel, BlockPos dest) { + BlockPos dest, Entity ignored) { if (entityIn instanceof ServerPlayer) { CraftPlayer player = ((ServerPlayerEntityBridge) entityIn).bridge$getBukkitEntity(); + if (dest == null) { + dest = pos; + } Location location = new Location(((WorldBridge) level).bridge$getWorld(), dest.getX() + 0.5D, dest.getY() + 0.5D, dest.getZ() + 0.5D); location.setPitch(player.getLocation().getPitch()); location.setYaw(player.getLocation().getYaw()); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java index c503dc2d3..ad310df6b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java @@ -31,14 +31,13 @@ public abstract class SculkCatalystBlockEntityMixin extends BlockEntityMixin { CraftEventFactory.sourceBlockOverride = null; } - @Override - public void setLevel(Level p_155231_) { - super.setLevel(p_155231_); + @Inject(method = "setLevel", at = @At("RETURN")) + private void arclight$setLevel(Level p_155231_, CallbackInfo ci) { ((SculkCatalystListenerBridge) this.catalystListener).bridge$setLevel(p_155231_); } - @Inject(method = "load", at = @At("HEAD")) + @Inject(method = "load", at = @At("RETURN")) private void arclight$load(CompoundTag p_277597_, CallbackInfo ci) { - super.load(p_277597_); + this.arclight$readPersistentData(p_277597_); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java index 1db68938f..d9997c1c4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java @@ -29,6 +29,7 @@ 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; import javax.annotation.Nullable; @@ -138,7 +139,8 @@ public void loadCallback() { random.setSeed(((ServerLevel) level).getSeed()); long xRand = random.nextLong() / 2L * 2L + 1L; long zRand = random.nextLong() / 2L * 2L + 1L; - random.setSeed((long) this.chunkPos.x * xRand + (long) this.chunkPos.z * zRand ^ ((ServerLevel) level).getSeed()); + ChunkPos chunkPos = ((LevelChunk) (Object) this).getPos(); + random.setSeed((long) chunkPos.x * xRand + (long) chunkPos.z * zRand ^ ((ServerLevel) level).getSeed()); org.bukkit.World world = ((WorldBridge) this.level).bridge$getWorld(); if (world != null) { @@ -159,7 +161,8 @@ public void loadCallback() { public void unloadCallback() { org.bukkit.Server server = Bukkit.getServer(); var bukkitChunk = new CraftChunk((LevelChunk) (Object) this); - org.bukkit.event.world.ChunkUnloadEvent unloadEvent = new org.bukkit.event.world.ChunkUnloadEvent(bukkitChunk, this.isUnsaved()); + // 1.20.1 intermediary on Fabric may not expose LevelChunk#isUnsaved() reliably. + org.bukkit.event.world.ChunkUnloadEvent unloadEvent = new org.bukkit.event.world.ChunkUnloadEvent(bukkitChunk, true); server.getPluginManager().callEvent(unloadEvent); // note: saving can be prevented, but not forced if no saving is actually required this.mustNotSave = !unloadEvent.isSaveChunk(); @@ -170,8 +173,8 @@ public void unloadCallback() { return world.isClientSide && this.arclight$doPlace; } - @Override - public boolean isUnsaved() { - return super.isUnsaved() && !this.mustNotSave; + @Inject(method = "isUnsaved", at = @At("RETURN"), cancellable = true) + private void arclight$mustNotSave(CallbackInfoReturnable cir) { + cir.setReturnValue(cir.getReturnValueZ() && !this.mustNotSave); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/parameters/LootParametersMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/parameters/LootParametersMixin.java index a4593d118..3d281b92e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/parameters/LootParametersMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/parameters/LootParametersMixin.java @@ -8,5 +8,5 @@ @Mixin(LootContextParams.class) public class LootParametersMixin { - private static final LootContextParam LOOTING_MOD = new LootContextParam<>(ResourceLocation.fromNamespaceAndPath("bukkit", "looting_mod")); + private static final LootContextParam LOOTING_MOD = new LootContextParam<>(new ResourceLocation("bukkit", "looting_mod")); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightCommon.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightCommon.java new file mode 100644 index 000000000..5eef9814a --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightCommon.java @@ -0,0 +1,23 @@ +package io.izzel.arclight.common.mod; + +public class ArclightCommon { + + private static Api instance; + + public static Api api() { + return instance; + } + + public static void setInstance(Api instance) { + ArclightCommon.instance = instance; + } + + public interface Api { + + default byte[] platformRemapClass(byte[] cl) { + return cl; + } + + boolean isModLoaded(String modid); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConnector.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConnector.java index e1bc851d1..da035b7ac 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConnector.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConnector.java @@ -1,7 +1,6 @@ package io.izzel.arclight.common.mod; import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger; -import io.izzel.arclight.mixin.injector.EjectorInfo; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.mixin.connect.IMixinConnector; @@ -10,14 +9,44 @@ public class ArclightConnector implements IMixinConnector { public static final Logger LOGGER = ArclightI18nLogger.getLogger("Arclight"); + private static volatile boolean connected; + + @SuppressWarnings("unchecked") + private static void registerEjectorInfo() { + try { + Class clazz = Class.forName("io.izzel.arclight.mixin.injector.EjectorInfo", false, ArclightConnector.class.getClassLoader()); + if (InjectionInfo.class.isAssignableFrom(clazz)) { + InjectionInfo.register((Class) clazz); + } + } catch (Throwable t) { + LOGGER.debug("Skip EjectorInfo registration: {}", t.toString()); + } + } + + private static boolean isClassPresent(String name) { + try { + Class.forName(name, false, ArclightConnector.class.getClassLoader()); + return true; + } catch (Throwable t) { + return false; + } + } @Override public void connect() { - InjectionInfo.register(EjectorInfo.class); + if (connected) { + return; + } + connected = true; + registerEjectorInfo(); Mixins.addConfiguration("mixins.arclight.core.json"); Mixins.addConfiguration("mixins.arclight.bukkit.json"); - Mixins.addConfiguration("mixins.arclight.forge.json"); Mixins.addConfiguration("mixins.arclight.compat.json"); + if (isClassPresent("net.fabricmc.loader.api.FabricLoader")) { + LOGGER.info("mixin-load.core.fabric"); + return; + } + Mixins.addConfiguration("mixins.arclight.forge.json"); LOGGER.info("mixin-load.core"); Mixins.addConfiguration("mixins.arclight.impl.forge.optimization.json"); LOGGER.info("mixin-load.optimization"); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java index f8d23b837..6dd493065 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java @@ -32,9 +32,28 @@ public class ArclightMixinPlugin implements IMixinConfigPlugin { new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "getServer", "()Lnet/minecraft/server/MinecraftServer;", null, null) ) )) + .put("net.minecraft.server.players.PlayerList", + Maps.immutableEntry( + ImmutableList.of( + new FieldNode(Opcodes.ACC_PUBLIC, "f_11193_", "I", null, null), + new FieldNode(Opcodes.ACC_PUBLIC, "f_11196_", "Ljava/util/List;", null, null), + new FieldNode(Opcodes.ACC_PUBLIC, "f_11204_", "Ljava/util/Map;", null, null) + ), + ImmutableList.of() + )) + .put("net.minecraft.class_3324", + Maps.immutableEntry( + ImmutableList.of( + new FieldNode(Opcodes.ACC_PUBLIC, "field_14347", "I", null, null), + new FieldNode(Opcodes.ACC_PUBLIC, "field_14351", "Ljava/util/List;", null, null), + new FieldNode(Opcodes.ACC_PUBLIC, "field_14354", "Ljava/util/Map;", null, null) + ), + ImmutableList.of() + )) .put("net.minecraft.server.level.TicketType", Maps.immutableEntry( ImmutableList.of( + new FieldNode(Opcodes.ACC_PUBLIC, "f_9434_", "J", null, null), new FieldNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "PLUGIN", "Lnet/minecraft/server/level/TicketType;", null, null), new FieldNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "PLUGIN_TICKET", @@ -42,6 +61,17 @@ public class ArclightMixinPlugin implements IMixinConfigPlugin { ), ImmutableList.of() )) + .put("net.minecraft.class_3230", + Maps.immutableEntry( + ImmutableList.of( + new FieldNode(Opcodes.ACC_PUBLIC, "field_19348", "J", null, null), + new FieldNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "PLUGIN", + "Lnet/minecraft/class_3230;", null, null), + new FieldNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, "PLUGIN_TICKET", + "Lnet/minecraft/class_3230;", null, null) + ), + ImmutableList.of() + )) .put("net.minecraft.world.level.storage.loot.parameters.LootContextParams", Maps.immutableEntry( ImmutableList.of( diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java index 10712b81f..3829d6e88 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java @@ -5,11 +5,9 @@ import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger; import io.izzel.arclight.i18n.ArclightConfig; import net.minecraftforge.fml.IExtensionPoint; -import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.network.NetworkConstants; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -42,7 +40,28 @@ public ArclightMod(FMLJavaModLoadingContext context) { } public static boolean isModLoaded(String modid) { - return ModList.get() != null ? ModList.get().isLoaded(modid) : FMLLoader.getLoadingModList().getModFileById(modid) != null; + var api = ArclightCommon.api(); + if (api != null) { + return api.isModLoaded(modid); + } + try { + Class modListClass = Class.forName("net.minecraftforge.fml.ModList"); + Object modList = modListClass.getMethod("get").invoke(null); + if (modList != null) { + Object loaded = modListClass.getMethod("isLoaded", String.class).invoke(modList, modid); + if (loaded instanceof Boolean b) { + return b; + } + } + Class fmlLoaderClass = Class.forName("net.minecraftforge.fml.loading.FMLLoader"); + Object loadingModList = fmlLoaderClass.getMethod("getLoadingModList").invoke(null); + if (loadingModList != null) { + Object modFile = loadingModList.getClass().getMethod("getModFileById", String.class).invoke(loadingModList, modid); + return modFile != null; + } + } catch (Throwable ignored) { + } + return false; } private void onCommonSetup(FMLCommonSetupEvent event) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/LoadIfModProcessor.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/LoadIfModProcessor.java index db88c48de..76bd33947 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/LoadIfModProcessor.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/LoadIfModProcessor.java @@ -1,5 +1,6 @@ package io.izzel.arclight.common.mod.mixins; +import io.izzel.arclight.common.mod.ArclightCommon; import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod; import org.objectweb.asm.Type; @@ -14,13 +15,16 @@ public class LoadIfModProcessor { private static final String TYPE = Type.getDescriptor(LoadIfMod.class); static boolean shouldApply(ClassNode node) { + if (node.invisibleAnnotations == null || node.invisibleAnnotations.isEmpty()) { + return true; + } for (var ann : node.invisibleAnnotations) { if (ann.desc.equals(TYPE)) { var loadIfModData = parse(ann); return switch (loadIfModData.condition()) { case ABSENT -> { for (var modid : loadIfModData.modids()) { - if (ArclightMod.isModLoaded(modid)) { + if (isModLoaded(modid)) { yield false; } } @@ -28,7 +32,7 @@ static boolean shouldApply(ClassNode node) { } case PRESENT -> { for (var modid : loadIfModData.modids()) { - if (ArclightMod.isModLoaded(modid)) { + if (isModLoaded(modid)) { yield true; } } @@ -40,6 +44,14 @@ static boolean shouldApply(ClassNode node) { return true; } + private static boolean isModLoaded(String modid) { + var api = ArclightCommon.api(); + if (api != null) { + return api.isModLoaded(modid); + } + return ArclightMod.isModLoaded(modid); + } + @SuppressWarnings("unchecked") private static LoadIfModData parse(AnnotationNode ann) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/ShouldApplyProcessor.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/ShouldApplyProcessor.java index 673f3de8b..3c93fe1a6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/ShouldApplyProcessor.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/mixins/ShouldApplyProcessor.java @@ -3,26 +3,113 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.objectweb.asm.ClassReader; -import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.ConstantDynamic; +import org.objectweb.asm.Handle; +import org.objectweb.asm.Type; +import org.objectweb.asm.tree.*; import java.io.IOException; -import java.util.List; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; public class ShouldApplyProcessor { private static final Logger LOGGER = LogManager.getLogger("Luminara"); + private static final boolean FABRIC = isClassPresent("net.fabricmc.loader.api.FabricLoader"); + private static final String MIXIN_ROOT = "io/izzel/arclight/common/mixin/"; + private static final String MIXIN_ROOT_DOT = "io.izzel.arclight.common.mixin."; + private static final List FABRIC_BLOCKED_INTERNAL_PREFIX = List.of( + "net/minecraftforge/", + "cpw/mods/" + ); + private static final Set FABRIC_EXCLUDES = Set.of( + "io.izzel.arclight.common.mixin.core.network.chat.StyleMixin", + "io.izzel.arclight.common.mixin.core.world.level.block.WitherSkullBlockMixin", + "io.izzel.arclight.common.mixin.core.world.level.block.BlockMixin", + "io.izzel.arclight.common.mixin.core.world.entity.EntityMixin_FabricBridge", + "io.izzel.arclight.common.mixin.core.world.entity.LivingEntityMixin_FabricBridge", + "io.izzel.arclight.common.mixin.core.world.entity.MobMixin_FabricBridge", + "io.izzel.arclight.common.mixin.core.world.entity.player.ServerPlayerMixin_FabricBridge", + "io.izzel.arclight.common.mixin.core.world.entity.projectile.ThrowableProjectileMixin", + "io.izzel.arclight.common.mixin.core.world.entity.projectile.ThrowableItemProjectileMixin", + "io.izzel.arclight.common.mixin.core.server.level.ServerChunkCache_MainThreadExecutorMixin", + "io.izzel.arclight.common.mixin.core.commands.CommandSource1Mixin", + "io.izzel.arclight.common.mixin.core.world.entity.animal.Sheep1Mixin", + "io.izzel.arclight.common.mixin.core.world.inventory.CartographyContainer1Mixin", + "io.izzel.arclight.common.mixin.core.world.inventory.CartographyContainer2Mixin", + "io.izzel.arclight.common.mixin.core.world.inventory.EnchantmentContainer1Mixin", + "io.izzel.arclight.common.mixin.core.world.inventory.GrindstoneContainer1Mixin", + "io.izzel.arclight.common.mixin.core.world.inventory.LoomContainer1Mixin", + "io.izzel.arclight.common.mixin.core.world.inventory.LoomContainer2Mixin", + "io.izzel.arclight.common.mixin.core.world.inventory.StonecutterContainer1Mixin", + "io.izzel.arclight.common.mixin.core.world.level.block.ChestBlock2_1Mixin", + "io.izzel.arclight.common.mixin.core.world.level.block.ComposterBlock_InputContainerMixin", + "io.izzel.arclight.common.mixin.core.world.level.block.entity.CommandBlockTileEntity1Mixin", + "io.izzel.arclight.common.mixin.core.world.level.block.entity.LecternTileEntity1Mixin", + "io.izzel.arclight.common.mixin.core.world.level.chunk.LevelChunk_BoundTickingBlockEntityMixin" + ); private static final List> PREDICATES = List.of( LoadIfModProcessor::shouldApply ); + private static final Map DECISION_CACHE = new ConcurrentHashMap<>(); + private static final ThreadLocal> EVALUATING = ThreadLocal.withInitial(HashSet::new); public static boolean shouldApply(String mixinClass) { + var cached = DECISION_CACHE.get(mixinClass); + if (cached != null) { + return cached; + } + var evaluating = EVALUATING.get(); + if (!evaluating.add(mixinClass)) { + LOGGER.warn("Detected recursive shouldApply evaluation for {}, allowing by default", mixinClass); + return true; + } + try { + boolean decision = computeShouldApply(mixinClass); + DECISION_CACHE.put(mixinClass, decision); + return decision; + } finally { + evaluating.remove(mixinClass); + if (evaluating.isEmpty()) { + EVALUATING.remove(); + } + } + } + + private static boolean computeShouldApply(String mixinClass) { try (var stream = LoadIfModProcessor.class.getClassLoader().getResourceAsStream(mixinClass.replace('.', '/') + ".class")) { if (stream != null) { - var bytes = stream.readAllBytes(); - var cr = new ClassReader(bytes); + var cr = new ClassReader(stream); var node = new ClassNode(); - cr.accept(node, ClassReader.SKIP_CODE); + cr.accept(node, ClassReader.SKIP_FRAMES); + if (FABRIC) { + if (mixinClass.endsWith("ServerChunkCache_MainThreadExecutorMixin")) { + LOGGER.info("Skipping Fabric-incompatible mixin {}", mixinClass); + return false; + } + if (FABRIC_EXCLUDES.contains(mixinClass)) { + LOGGER.info("Skipping Fabric-incompatible mixin {}", mixinClass); + return false; + } + var parent = node.superName; + if (parent != null && parent.startsWith(MIXIN_ROOT)) { + var parentMixin = parent.replace('/', '.'); + if (!parentMixin.equals(mixinClass) && parentMixin.startsWith(MIXIN_ROOT_DOT) && !shouldApply(parentMixin)) { + LOGGER.info("Skipping mixin {} because parent mixin {} is disabled on Fabric", mixinClass, parentMixin); + return false; + } + } + if (node.superName != null && node.superName.startsWith("net/minecraftforge/")) { + LOGGER.info("Skipping Forge-super mixin {} -> {}", mixinClass, node.superName); + return false; + } + var reason = findFabricBlockedReference(node); + if (reason != null) { + LOGGER.info("Skipping Forge-linked mixin {} ({})", mixinClass, reason); + return false; + } + } for (var predicate : PREDICATES) { if (!predicate.test(node)) { return false; @@ -37,4 +124,316 @@ public static boolean shouldApply(String mixinClass) { return true; } } + + private static String findFabricBlockedReference(ClassNode node) { + var classRef = firstBlockedRef(node.name); + if (classRef != null) { + return "class " + classRef; + } + var superRef = firstBlockedRef(node.superName); + if (superRef != null) { + return "super " + superRef; + } + if (node.interfaces != null) { + for (String iface : node.interfaces) { + var ifaceRef = firstBlockedRef(iface); + if (ifaceRef != null) { + return "interface " + ifaceRef; + } + } + } + var sigRef = firstBlockedRef(node.signature); + if (sigRef != null) { + return "signature " + sigRef; + } + var outerClassRef = firstBlockedRef(node.outerClass); + if (outerClassRef != null) { + return "outer class " + outerClassRef; + } + var outerDescRef = firstBlockedRef(node.outerMethodDesc); + if (outerDescRef != null) { + return "outer method desc " + outerDescRef; + } + var annRef = firstBlockedInAnnotations(node.visibleAnnotations); + if (annRef == null) { + annRef = firstBlockedInAnnotations(node.invisibleAnnotations); + } + if (annRef != null) { + return "annotation " + annRef; + } + if (node.innerClasses != null) { + for (InnerClassNode inner : node.innerClasses) { + var nameRef = firstBlockedRef(inner.name); + if (nameRef != null) { + return "inner class " + nameRef; + } + var outerRef = firstBlockedRef(inner.outerName); + if (outerRef != null) { + return "inner outer " + outerRef; + } + } + } + if (node.fields != null) { + for (FieldNode field : node.fields) { + var fieldDescRef = firstBlockedRef(field.desc); + if (fieldDescRef != null) { + return "field desc " + fieldDescRef; + } + var fieldSigRef = firstBlockedRef(field.signature); + if (fieldSigRef != null) { + return "field signature " + fieldSigRef; + } + var fieldAnnRef = firstBlockedInAnnotations(field.visibleAnnotations); + if (fieldAnnRef == null) { + fieldAnnRef = firstBlockedInAnnotations(field.invisibleAnnotations); + } + if (fieldAnnRef != null) { + return "field annotation " + fieldAnnRef; + } + var valueRef = firstBlockedInAnnotationValue(field.value); + if (valueRef != null) { + return "field value " + valueRef; + } + } + } + if (node.methods != null) { + for (MethodNode method : node.methods) { + var methodDescRef = firstBlockedRef(method.desc); + if (methodDescRef != null) { + return "method desc " + methodDescRef; + } + var methodSigRef = firstBlockedRef(method.signature); + if (methodSigRef != null) { + return "method signature " + methodSigRef; + } + if (method.exceptions != null) { + for (String ex : method.exceptions) { + var exRef = firstBlockedRef(ex); + if (exRef != null) { + return "throws " + exRef; + } + } + } + var methodAnnRef = firstBlockedInAnnotations(method.visibleAnnotations); + if (methodAnnRef == null) { + methodAnnRef = firstBlockedInAnnotations(method.invisibleAnnotations); + } + if (methodAnnRef == null) { + methodAnnRef = firstBlockedInAnnotations(method.visibleTypeAnnotations); + } + if (methodAnnRef == null) { + methodAnnRef = firstBlockedInAnnotations(method.invisibleTypeAnnotations); + } + if (methodAnnRef == null) { + methodAnnRef = firstBlockedInAnnotations(method.visibleLocalVariableAnnotations); + } + if (methodAnnRef == null) { + methodAnnRef = firstBlockedInAnnotations(method.invisibleLocalVariableAnnotations); + } + if (methodAnnRef != null) { + return "method annotation " + methodAnnRef; + } + if (method.localVariables != null) { + for (var local : method.localVariables) { + var localDescRef = firstBlockedRef(local.desc); + if (localDescRef != null) { + return "local desc " + localDescRef; + } + var localSigRef = firstBlockedRef(local.signature); + if (localSigRef != null) { + return "local signature " + localSigRef; + } + } + } + if (method.tryCatchBlocks != null) { + for (TryCatchBlockNode tcb : method.tryCatchBlocks) { + var typeRef = firstBlockedRef(tcb.type); + if (typeRef != null) { + return "catch type " + typeRef; + } + var tcbAnnRef = firstBlockedInAnnotations(tcb.visibleTypeAnnotations); + if (tcbAnnRef == null) { + tcbAnnRef = firstBlockedInAnnotations(tcb.invisibleTypeAnnotations); + } + if (tcbAnnRef != null) { + return "try/catch annotation " + tcbAnnRef; + } + } + } + if (method.instructions != null) { + for (var insn : method.instructions) { + String insnRef = null; + if (insn instanceof MethodInsnNode methodInsn) { + insnRef = firstBlockedRef(methodInsn.owner); + if (insnRef == null) { + insnRef = firstBlockedRef(methodInsn.desc); + } + } else if (insn instanceof FieldInsnNode fieldInsn) { + insnRef = firstBlockedRef(fieldInsn.owner); + if (insnRef == null) { + insnRef = firstBlockedRef(fieldInsn.desc); + } + } else if (insn instanceof TypeInsnNode typeInsn) { + insnRef = firstBlockedRef(typeInsn.desc); + } else if (insn instanceof InvokeDynamicInsnNode indy) { + insnRef = firstBlockedRef(indy.desc); + if (insnRef == null) { + insnRef = firstBlockedInAnnotationValue(indy.bsm); + } + if (insnRef == null && indy.bsmArgs != null) { + for (Object arg : indy.bsmArgs) { + insnRef = firstBlockedInAnnotationValue(arg); + if (insnRef != null) { + break; + } + } + } + } else if (insn instanceof MultiANewArrayInsnNode multiArrayInsn) { + insnRef = firstBlockedRef(multiArrayInsn.desc); + } else if (insn instanceof LdcInsnNode ldcInsn) { + insnRef = firstBlockedInAnnotationValue(ldcInsn.cst); + } else if (insn instanceof FrameNode + || insn instanceof LabelNode + || insn instanceof LineNumberNode + || insn instanceof JumpInsnNode + || insn instanceof LookupSwitchInsnNode + || insn instanceof TableSwitchInsnNode + || insn instanceof IincInsnNode) { + // no-op + } + if (insnRef != null) { + return "instruction " + insnRef; + } + } + } + } + } + return null; + } + + private static String firstBlockedInAnnotations(Collection annotations) { + if (annotations == null) { + return null; + } + for (AnnotationNode annotation : annotations) { + if (annotation == null) { + continue; + } + var descRef = firstBlockedRef(annotation.desc); + if (descRef != null) { + return descRef; + } + var valueRef = firstBlockedInAnnotationValues(annotation.values); + if (valueRef != null) { + return valueRef; + } + } + return null; + } + + private static String firstBlockedInAnnotationValues(List values) { + if (values == null) { + return null; + } + for (Object value : values) { + var ref = firstBlockedInAnnotationValue(value); + if (ref != null) { + return ref; + } + } + return null; + } + + @SuppressWarnings("unchecked") + private static String firstBlockedInAnnotationValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof String text) { + return firstBlockedRef(text); + } + if (value instanceof Type type) { + var descRef = firstBlockedRef(type.getDescriptor()); + if (descRef != null) { + return descRef; + } + return firstBlockedRef(type.getInternalName()); + } + if (value instanceof Handle handle) { + var ownerRef = firstBlockedRef(handle.getOwner()); + if (ownerRef != null) { + return ownerRef; + } + return firstBlockedRef(handle.getDesc()); + } + if (value instanceof ConstantDynamic constantDynamic) { + var nameRef = firstBlockedRef(constantDynamic.getName()); + if (nameRef != null) { + return nameRef; + } + var descRef = firstBlockedRef(constantDynamic.getDescriptor()); + if (descRef != null) { + return descRef; + } + var bsmRef = firstBlockedInAnnotationValue(constantDynamic.getBootstrapMethod()); + if (bsmRef != null) { + return bsmRef; + } + for (int i = 0; i < constantDynamic.getBootstrapMethodArgumentCount(); i++) { + var argRef = firstBlockedInAnnotationValue(constantDynamic.getBootstrapMethodArgument(i)); + if (argRef != null) { + return argRef; + } + } + return null; + } + if (value instanceof AnnotationNode annotationNode) { + var descRef = firstBlockedRef(annotationNode.desc); + if (descRef != null) { + return descRef; + } + return firstBlockedInAnnotationValues(annotationNode.values); + } + if (value instanceof List list) { + for (Object o : list) { + var listRef = firstBlockedInAnnotationValue(o); + if (listRef != null) { + return listRef; + } + } + return null; + } + if (value instanceof String[] arrayPair && arrayPair.length > 0) { + for (String entry : arrayPair) { + var pairRef = firstBlockedRef(entry); + if (pairRef != null) { + return pairRef; + } + } + return null; + } + return null; + } + + private static String firstBlockedRef(String text) { + if (text == null || text.isEmpty()) { + return null; + } + var normalized = text.replace('.', '/'); + for (String prefix : FABRIC_BLOCKED_INTERNAL_PREFIX) { + if (normalized.contains(prefix)) { + return prefix; + } + } + return null; + } + + private static boolean isClassPresent(String name) { + try { + Class.forName(name, false, ShouldApplyProcessor.class.getClassLoader()); + return true; + } catch (Throwable t) { + return false; + } + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java index 3570d3c8c..f7437efd4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java @@ -6,12 +6,12 @@ import io.izzel.arclight.common.bridge.core.server.MinecraftServerBridge; import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.server.api.DefaultArclightServer; +import io.izzel.arclight.common.mod.util.PlatformHooks; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.players.PlayerList; import net.minecraft.world.level.dimension.LevelStem; -import net.minecraftforge.server.ServerLifecycleHooks; import org.bukkit.World; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.command.ColouredConsoleSender; @@ -43,6 +43,7 @@ public Thread get() { new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Async Chat Thread - #%d") .setThreadFactory(chatFactory()).build()); private static CraftServer server; + private static volatile MinecraftServer vanillaServer; private static ThreadFactory chatFactory() { var group = Thread.currentThread().getThreadGroup(); @@ -57,7 +58,9 @@ private static ThreadFactory chatFactory() { @SuppressWarnings("ConstantConditions") public static CraftServer createOrLoad(DedicatedServer console, PlayerList playerList) { if (server == null) { - Arclight.setServer(new DefaultArclightServer()); + if (PlatformHooks.isForgePresent()) { + Arclight.setServer(new DefaultArclightServer()); + } try { server = new CraftServer(console, playerList); ((MinecraftServerBridge) console).bridge$setServer(server); @@ -69,8 +72,10 @@ public static CraftServer createOrLoad(DedicatedServer console, PlayerList playe throw new RuntimeException("Error initializing Arclight", t); } try { - ArclightMod.LOGGER.info("registry.begin"); - BukkitRegistry.registerAll(console); + if (PlatformHooks.isForgePresent()) { + ArclightMod.LOGGER.info("registry.begin"); + BukkitRegistry.registerAll(console); + } org.spigotmc.SpigotConfig.init(new File("./spigot.yml")); org.spigotmc.SpigotConfig.registerCommands(); } catch (Throwable t) { @@ -96,7 +101,14 @@ public static boolean isPrimaryThread() { } public static MinecraftServer getMinecraftServer() { - return ServerLifecycleHooks.getCurrentServer(); + if (vanillaServer != null) { + return vanillaServer; + } + return PlatformHooks.getCurrentServer(); + } + + public static void setMinecraftServer(MinecraftServer server) { + vanillaServer = server; } public static void executeOnMainThread(Runnable runnable) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/PlatformHooks.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/PlatformHooks.java new file mode 100644 index 000000000..5ccfbd30f --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/PlatformHooks.java @@ -0,0 +1,907 @@ +package io.izzel.arclight.common.mod.util; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.ParseResults; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import com.mojang.brigadier.tree.CommandNode; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.Connection; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; +import net.minecraft.network.protocol.handshake.ClientIntentionPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.ForcedChunksSavedData; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public final class PlatformHooks { + + private static final boolean FORGE_PRESENT = isClassPresent("net.minecraftforge.server.ServerLifecycleHooks"); + + private PlatformHooks() { + } + + public static boolean isForgePresent() { + return FORGE_PRESENT; + } + + public static boolean handleServerLogin(ClientIntentionPacket packet, Connection connection) { + Object ret = invokeStatic( + "net.minecraftforge.server.ServerLifecycleHooks", + "handleServerLogin", + new Class[]{ClientIntentionPacket.class, Connection.class}, + packet, + connection + ); + if (ret instanceof Boolean result) { + return result; + } + return true; + } + + @Nullable + public static MinecraftServer getCurrentServer() { + Object ret = invokeStatic( + "net.minecraftforge.server.ServerLifecycleHooks", + "getCurrentServer", + new Class[0] + ); + return ret instanceof MinecraftServer server ? server : null; + } + + public static void handleServerStarted(MinecraftServer server) { + invokeStatic( + "net.minecraftforge.server.ServerLifecycleHooks", + "handleServerStarted", + new Class[]{MinecraftServer.class}, + server + ); + } + + public static void handleServerStopping(MinecraftServer server) { + invokeStatic( + "net.minecraftforge.server.ServerLifecycleHooks", + "handleServerStopping", + new Class[]{MinecraftServer.class}, + server + ); + } + + public static void expectServerStopped() { + invokeStatic( + "net.minecraftforge.server.ServerLifecycleHooks", + "expectServerStopped", + new Class[0] + ); + } + + public static void handleServerStopped(MinecraftServer server) { + invokeStatic( + "net.minecraftforge.server.ServerLifecycleHooks", + "handleServerStopped", + new Class[]{MinecraftServer.class}, + server + ); + } + + public static void postLevelLoad(ServerLevel level) { + postForgeLevelEvent("net.minecraftforge.event.level.LevelEvent$Load", level); + } + + public static void postLevelUnload(ServerLevel level) { + postForgeLevelEvent("net.minecraftforge.event.level.LevelEvent$Unload", level); + } + + public static void reinstatePersistentChunks(ServerLevel level, ForcedChunksSavedData data) { + invokeStatic( + "net.minecraftforge.common.world.ForgeChunkManager", + "reinstatePersistentChunks", + new Class[]{ServerLevel.class, ForcedChunksSavedData.class}, + level, + data + ); + } + + public static void firePlayerRespawnEvent(ServerPlayer player, boolean conqueredEnd) { + invokeStatic( + "net.minecraftforge.event.ForgeEventFactory", + "firePlayerRespawnEvent", + new Class[]{ServerPlayer.class, boolean.class}, + player, + conqueredEnd + ); + } + + public static void firePlayerChangedDimensionEvent(ServerPlayer player, ResourceKey from, ResourceKey to) { + invokeStatic( + "net.minecraftforge.event.ForgeEventFactory", + "firePlayerChangedDimensionEvent", + new Class[]{ServerPlayer.class, ResourceKey.class, ResourceKey.class}, + player, + from, + to + ); + } + + @Nullable + public static String processCommandEvent(ParseResults parse) { + if (!FORGE_PRESENT) { + return parse.getReader().getString(); + } + try { + Class eventClass = Class.forName("net.minecraftforge.event.CommandEvent"); + Constructor constructor = eventClass.getConstructor(ParseResults.class); + Object event = constructor.newInstance(parse); + if (postForgeEvent(event)) { + return null; + } + Method getException = eventClass.getMethod("getException"); + if (getException.invoke(event) != null) { + return null; + } + Method getParseResults = eventClass.getMethod("getParseResults"); + Object result = getParseResults.invoke(event); + if (result instanceof ParseResults parseResults) { + return parseResults.getReader().getString(); + } + return parse.getReader().getString(); + } catch (Throwable t) { + return parse.getReader().getString(); + } + } + + public static String getServerBranding() { + Object branding = invokeStatic( + "net.minecraftforge.internal.BrandingControl", + "getServerBranding", + new Class[0] + ); + if (branding instanceof String value && !value.isBlank()) { + return value; + } + return "fabric"; + } + + public static int getExperienceDrop(LivingEntity entity, @Nullable Player attackingPlayer, int exp) { + Object ret = invokeStatic( + "net.minecraftforge.event.ForgeEventFactory", + "getExperienceDrop", + new Class[]{LivingEntity.class, Player.class, int.class}, + entity, + attackingPlayer, + exp + ); + if (ret instanceof Integer value) { + return value; + } + return exp; + } + + public static boolean postMobEffectExpired(LivingEntity entity, MobEffectInstance effect) { + if (!FORGE_PRESENT) { + return false; + } + try { + Class eventClass = Class.forName("net.minecraftforge.event.entity.living.MobEffectEvent$Expired"); + Constructor ctor = eventClass.getConstructor(LivingEntity.class, MobEffectInstance.class); + Object event = ctor.newInstance(entity, effect); + return postForgeEvent(event); + } catch (Throwable ignored) { + return false; + } + } + + public static void postMobEffectAdded(LivingEntity entity, @Nullable MobEffectInstance oldEffect, MobEffectInstance newEffect, @Nullable Entity source) { + if (!FORGE_PRESENT) { + return; + } + try { + Class eventClass = Class.forName("net.minecraftforge.event.entity.living.MobEffectEvent$Added"); + Constructor ctor = eventClass.getConstructor(LivingEntity.class, MobEffectInstance.class, MobEffectInstance.class, Entity.class); + Object event = ctor.newInstance(entity, oldEffect, newEffect, source); + postForgeEvent(event); + } catch (Throwable ignored) { + } + } + + public static boolean onLivingAttack(LivingEntity entity, DamageSource source, float amount) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onLivingAttack", + new Class[]{LivingEntity.class, DamageSource.class, float.class}, + entity, + source, + amount + ); + if (ret instanceof Boolean value) { + return value; + } + return true; + } + + public static float onLivingHurt(LivingEntity entity, DamageSource source, float amount) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onLivingHurt", + new Class[]{LivingEntity.class, DamageSource.class, float.class}, + entity, + source, + amount + ); + if (ret instanceof Float value) { + return value; + } + return amount; + } + + public static float onLivingDamage(LivingEntity entity, DamageSource source, float amount) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onLivingDamage", + new Class[]{LivingEntity.class, DamageSource.class, float.class}, + entity, + source, + amount + ); + if (ret instanceof Float value) { + return value; + } + return amount; + } + + public static boolean onLivingUseTotem(LivingEntity entity, DamageSource source, ItemStack stack, InteractionHand hand) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onLivingUseTotem", + new Class[]{LivingEntity.class, DamageSource.class, ItemStack.class, InteractionHand.class}, + entity, + source, + stack, + hand + ); + if (ret instanceof Boolean value) { + return value; + } + return true; + } + + public static boolean onLivingDeath(ServerPlayer player, DamageSource source) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onLivingDeath", + new Class[]{LivingEntity.class, DamageSource.class}, + player, + source + ); + if (ret instanceof Boolean value) { + return value; + } + return false; + } + + public static boolean onPlayerAttack(Player player, DamageSource source, float amount) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onPlayerAttack", + new Class[]{Player.class, DamageSource.class, float.class}, + player, + source, + amount + ); + if (ret instanceof Boolean value) { + return value; + } + return true; + } + + public static boolean onPlayerAttackTarget(Player player, Entity target) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onPlayerAttackTarget", + new Class[]{Player.class, Entity.class}, + player, + target + ); + if (ret instanceof Boolean value) { + return value; + } + return true; + } + + @Nullable + public static Float getCriticalHitDamageModifier(Player player, Entity target, boolean vanillaCritical, float damageModifier) { + if (!FORGE_PRESENT) { + return vanillaCritical ? damageModifier : null; + } + try { + Class hooks = Class.forName("net.minecraftforge.common.ForgeHooks"); + Method method = hooks.getMethod("getCriticalHit", Player.class, Entity.class, boolean.class, float.class); + Object event = method.invoke(null, player, target, vanillaCritical, damageModifier); + if (event == null) { + return null; + } + Object modifier = event.getClass().getMethod("getDamageModifier").invoke(event); + if (modifier instanceof Number value) { + return value.floatValue(); + } + } catch (Throwable ignored) { + } + return vanillaCritical ? damageModifier : null; + } + + public static boolean canPerformSweepAttack(ItemStack stack) { + if (FORGE_PRESENT) { + try { + Class toolActions = Class.forName("net.minecraftforge.common.ToolActions"); + Class toolAction = Class.forName("net.minecraftforge.common.ToolAction"); + Object sweepAction = toolActions.getField("SWORD_SWEEP").get(null); + Method method = ItemStack.class.getMethod("canPerformAction", toolAction); + Object ret = method.invoke(stack, sweepAction); + if (ret instanceof Boolean value) { + return value; + } + } catch (Throwable ignored) { + } + } + return stack.getItem() instanceof SwordItem; + } + + public static double getEntityReach(Player player) { + if (FORGE_PRESENT) { + try { + Method method = player.getClass().getMethod("getEntityReach"); + Object ret = method.invoke(player); + if (ret instanceof Number value) { + return value.doubleValue(); + } + } catch (Throwable ignored) { + } + } + return 3.0D; + } + + public static AABB getSweepHitBox(ItemStack stack, Player player, Entity target) { + if (FORGE_PRESENT) { + try { + Method method = ItemStack.class.getMethod("getSweepHitBox", Player.class, Entity.class); + Object ret = method.invoke(stack, player, target); + if (ret instanceof AABB aabb) { + return aabb; + } + } catch (Throwable ignored) { + } + } + return target.getBoundingBox().inflate(1.0D, 0.25D, 1.0D); + } + + public static boolean doesSneakBypassUse(ItemStack stack, Level level, BlockPos pos, Player player) { + if (FORGE_PRESENT) { + try { + Method method = ItemStack.class.getMethod("doesSneakBypassUse", Level.class, BlockPos.class, Player.class); + Object ret = method.invoke(stack, level, pos, player); + if (ret instanceof Boolean value) { + return value; + } + } catch (Throwable ignored) { + } + } + return false; + } + + public static InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + if (FORGE_PRESENT) { + try { + Method method = ItemStack.class.getMethod("onItemUseFirst", UseOnContext.class); + Object ret = method.invoke(stack, context); + if (ret instanceof InteractionResult result) { + return result; + } + } catch (Throwable ignored) { + } + } + return InteractionResult.PASS; + } + + public static Entity getMultipartParent(Entity entity) { + if (FORGE_PRESENT) { + try { + Class partEntity = Class.forName("net.minecraftforge.entity.PartEntity"); + if (partEntity.isInstance(entity)) { + Object parent = partEntity.getMethod("getParent").invoke(entity); + if (parent instanceof Entity parentEntity) { + return parentEntity; + } + } + } catch (Throwable ignored) { + } + } + return entity; + } + + public static void onPlayerDestroyItem(Player player, ItemStack original, InteractionHand hand) { + invokeStatic( + "net.minecraftforge.event.ForgeEventFactory", + "onPlayerDestroyItem", + new Class[]{Player.class, ItemStack.class, InteractionHand.class}, + player, + original, + hand + ); + } + + public static LeftClickBlockResult onLeftClickBlock(ServerPlayer player, BlockPos pos, Direction direction, ServerboundPlayerActionPacket.Action action) { + if (!FORGE_PRESENT) { + return LeftClickBlockResult.DEFAULT; + } + try { + Class hooks = Class.forName("net.minecraftforge.common.ForgeHooks"); + Method method = hooks.getMethod("onLeftClickBlock", Player.class, BlockPos.class, Direction.class, ServerboundPlayerActionPacket.Action.class); + Object event = method.invoke(null, player, pos, direction, action); + if (event == null) { + return LeftClickBlockResult.DEFAULT; + } + Class type = event.getClass(); + boolean cancelled = Boolean.TRUE.equals(type.getMethod("isCanceled").invoke(event)); + EventDecision useItem = mapEventDecision(type.getMethod("getUseItem").invoke(event)); + EventDecision useBlock = mapEventDecision(type.getMethod("getUseBlock").invoke(event)); + return new LeftClickBlockResult(cancelled, useItem, useBlock); + } catch (Throwable ignored) { + return LeftClickBlockResult.DEFAULT; + } + } + + public static RightClickBlockResult onRightClickBlock(ServerPlayer player, InteractionHand hand, BlockPos pos, BlockHitResult hitResult) { + if (!FORGE_PRESENT) { + return RightClickBlockResult.DEFAULT; + } + try { + Class hooks = Class.forName("net.minecraftforge.common.ForgeHooks"); + Method method = hooks.getMethod("onRightClickBlock", Player.class, InteractionHand.class, BlockPos.class, BlockHitResult.class); + Object event = method.invoke(null, player, hand, pos, hitResult); + if (event == null) { + return RightClickBlockResult.DEFAULT; + } + Class type = event.getClass(); + boolean cancelled = Boolean.TRUE.equals(type.getMethod("isCanceled").invoke(event)); + Object cancellationResult = type.getMethod("getCancellationResult").invoke(event); + InteractionResult result = cancellationResult instanceof InteractionResult interactionResult ? interactionResult : InteractionResult.PASS; + EventDecision useItem = mapEventDecision(type.getMethod("getUseItem").invoke(event)); + EventDecision useBlock = mapEventDecision(type.getMethod("getUseBlock").invoke(event)); + return new RightClickBlockResult(cancelled, result, useItem, useBlock); + } catch (Throwable ignored) { + return RightClickBlockResult.DEFAULT; + } + } + + public static ShieldBlockResult onShieldBlock(LivingEntity entity, DamageSource source, float amount) { + if (!FORGE_PRESENT) { + return new ShieldBlockResult(false, amount, true); + } + try { + Class hooks = Class.forName("net.minecraftforge.common.ForgeHooks"); + Method method = hooks.getMethod("onShieldBlock", LivingEntity.class, DamageSource.class, float.class); + Object event = method.invoke(null, entity, source, amount); + if (event == null) { + return new ShieldBlockResult(false, amount, true); + } + Class type = event.getClass(); + boolean cancelled = Boolean.TRUE.equals(type.getMethod("isCanceled").invoke(event)); + float blocked = ((Number) type.getMethod("getBlockedDamage").invoke(event)).floatValue(); + boolean shieldTakesDamage = Boolean.TRUE.equals(type.getMethod("shieldTakesDamage").invoke(event)); + return new ShieldBlockResult(cancelled, blocked, shieldTakesDamage); + } catch (Throwable ignored) { + return new ShieldBlockResult(false, amount, true); + } + } + + public static LivingChangeTargetResult onLivingChangeTarget(LivingEntity entity, @Nullable LivingEntity newTarget) { + if (!FORGE_PRESENT) { + return new LivingChangeTargetResult(false, newTarget); + } + try { + Class hooks = Class.forName("net.minecraftforge.common.ForgeHooks"); + Class targetType = Class.forName("net.minecraftforge.event.entity.living.LivingChangeTargetEvent$LivingTargetType"); + Object mobTarget = Enum.valueOf((Class) targetType.asSubclass(Enum.class), "MOB_TARGET"); + Method method = hooks.getMethod("onLivingChangeTarget", LivingEntity.class, LivingEntity.class, targetType); + Object event = method.invoke(null, entity, newTarget, mobTarget); + if (event == null) { + return new LivingChangeTargetResult(false, newTarget); + } + Class type = event.getClass(); + boolean cancelled = Boolean.TRUE.equals(type.getMethod("isCanceled").invoke(event)); + Object target = type.getMethod("getNewTarget").invoke(event); + return new LivingChangeTargetResult(cancelled, target instanceof LivingEntity living ? living : newTarget); + } catch (Throwable ignored) { + return new LivingChangeTargetResult(false, newTarget); + } + } + + public static LivingSwapHandItemsResult onLivingSwapHandItems(ServerPlayer player) { + ItemStack mainHand = player.getMainHandItem(); + ItemStack offHand = player.getOffhandItem(); + if (!FORGE_PRESENT) { + return new LivingSwapHandItemsResult(false, offHand, mainHand); + } + try { + Class hooks = Class.forName("net.minecraftforge.common.ForgeHooks"); + Method method = hooks.getMethod("onLivingSwapHandItems", LivingEntity.class); + Object event = method.invoke(null, player); + if (event == null) { + return new LivingSwapHandItemsResult(false, offHand, mainHand); + } + Class type = event.getClass(); + boolean cancelled = Boolean.TRUE.equals(type.getMethod("isCanceled").invoke(event)); + Object swappedMain = type.getMethod("getItemSwappedToMainHand").invoke(event); + Object swappedOff = type.getMethod("getItemSwappedToOffHand").invoke(event); + ItemStack newMain = swappedMain instanceof ItemStack stack ? stack : offHand; + ItemStack newOff = swappedOff instanceof ItemStack stack ? stack : mainHand; + return new LivingSwapHandItemsResult(cancelled, newMain, newOff); + } catch (Throwable ignored) { + return new LivingSwapHandItemsResult(false, offHand, mainHand); + } + } + + public static CompletableFuture decorateServerChat(ServerPlayer player, Component decoratedContent) { + if (!FORGE_PRESENT) { + return CompletableFuture.completedFuture(decoratedContent); + } + try { + Class hooks = Class.forName("net.minecraftforge.common.ForgeHooks"); + Method getter = hooks.getMethod("getServerChatSubmittedDecorator"); + Object decorator = getter.invoke(null); + if (decorator == null) { + return CompletableFuture.completedFuture(decoratedContent); + } + Method decorate = decorator.getClass().getMethod("decorate", ServerPlayer.class, Component.class); + Object result = decorate.invoke(decorator, player, decoratedContent); + if (result instanceof CompletableFuture future) { + return future.thenApply(component -> component instanceof Component c ? c : decoratedContent); + } + } catch (Throwable ignored) { + } + return CompletableFuture.completedFuture(decoratedContent); + } + + @Nullable + public static InteractionResult onInteractEntityAt(Player player, Entity entity, Vec3 vec, InteractionHand hand) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onInteractEntityAt", + new Class[]{Player.class, Entity.class, Vec3.class, InteractionHand.class}, + player, + entity, + vec, + hand + ); + if (ret instanceof InteractionResult result) { + return result; + } + return null; + } + + public static void postPlayerContainerOpen(ServerPlayer player, AbstractContainerMenu menu) { + if (!FORGE_PRESENT) { + return; + } + try { + Class eventClass = Class.forName("net.minecraftforge.event.entity.player.PlayerContainerEvent$Open"); + Constructor ctor = eventClass.getConstructor(Player.class, AbstractContainerMenu.class); + Object event = ctor.newInstance(player, menu); + postForgeEvent(event); + } catch (Throwable ignored) { + } + } + + @Nullable + public static Component getPlayerTabListDisplayName(ServerPlayer player) { + Object ret = invokeStatic( + "net.minecraftforge.event.ForgeEventFactory", + "getPlayerTabListDisplayName", + new Class[]{ServerPlayer.class}, + player + ); + if (ret instanceof Component component) { + return component; + } + return null; + } + + public static boolean onPlayerSpawnSet(ServerPlayer player, ResourceKey dimension, @Nullable BlockPos pos, boolean forced) { + Object ret = invokeStatic( + "net.minecraftforge.event.ForgeEventFactory", + "onPlayerSpawnSet", + new Class[]{ServerPlayer.class, ResourceKey.class, BlockPos.class, boolean.class}, + player, + dimension, + pos, + forced + ); + if (ret instanceof Boolean value) { + return value; + } + return false; + } + + public static boolean onItemStackedOn(ItemStack stackOnSlot, ItemStack carriedStack, Slot slot, ClickAction action, Player player, SlotAccess access) { + Object ret = invokeStatic( + "net.minecraftforge.common.ForgeHooks", + "onItemStackedOn", + new Class[]{ItemStack.class, ItemStack.class, Slot.class, ClickAction.class, Player.class, SlotAccess.class}, + stackOnSlot, + carriedStack, + slot, + action, + player, + access + ); + if (ret instanceof Boolean value) { + return value; + } + return false; + } + + @Nullable + public static String getMenuTypeTranslationKey(@Nullable MenuType menuType) { + if (menuType == null) { + return null; + } + var key = BuiltInRegistries.MENU.getKey(menuType); + return key == null ? null : key.toString(); + } + + public static int getBlockExpDrop(Block block, BlockState state, ServerLevel world, BlockPos pos, ItemStack stack, boolean ignoredDropFlag) { + int silkTouch = stack.getEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH); + int fortune = stack.getEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.BLOCK_FORTUNE); + if (FORGE_PRESENT) { + try { + Method method = block.getClass().getMethod("getExpDrop", BlockState.class, ServerLevel.class, net.minecraft.util.RandomSource.class, BlockPos.class, int.class, int.class); + Object ret = method.invoke(block, state, world, world.random, pos, fortune, silkTouch); + if (ret instanceof Integer value) { + return value; + } + } catch (Throwable ignored) { + } + } + return 0; + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public static void mergeCommandNode( + CommandNode source, + CommandNode target, + Map, CommandNode> map, + S context, + Command command, + java.util.function.Function, SuggestionProvider> suggestionMapper + ) { + if (!FORGE_PRESENT) { + return; + } + try { + Class helperClass = Class.forName("net.minecraftforge.server.command.CommandHelper"); + Method method = helperClass.getMethod("mergeCommandNode", CommandNode.class, CommandNode.class, Map.class, Object.class, Command.class, java.util.function.Function.class); + method.invoke(null, source, target, map, context, command, suggestionMapper); + } catch (Throwable ignored) { + } + } + + private static void postForgeLevelEvent(String eventClassName, ServerLevel level) { + if (!FORGE_PRESENT) { + return; + } + try { + Class eventClass = Class.forName(eventClassName); + Constructor ctor = findSingleArgCtor(eventClass, level.getClass()); + if (ctor == null) { + return; + } + Object event = ctor.newInstance(level); + postForgeEvent(event); + } catch (Throwable ignored) { + } + } + + private static boolean postForgeEvent(Object event) { + if (!FORGE_PRESENT) { + return false; + } + try { + Class minecraftForge = Class.forName("net.minecraftforge.common.MinecraftForge"); + Field busField = minecraftForge.getField("EVENT_BUS"); + Object bus = busField.get(null); + Method post = bus.getClass().getMethod("post", Class.forName("net.minecraftforge.eventbus.api.Event")); + Object cancelled = post.invoke(bus, event); + return cancelled instanceof Boolean b && b; + } catch (Throwable ignored) { + return false; + } + } + + @Nullable + private static Constructor findSingleArgCtor(Class type, Class argType) { + for (Constructor ctor : type.getConstructors()) { + if (ctor.getParameterCount() == 1 && ctor.getParameterTypes()[0].isAssignableFrom(argType)) { + return ctor; + } + } + return null; + } + + @Nullable + private static Object invokeStatic(String className, String methodName, Class[] paramTypes, Object... args) { + if (!FORGE_PRESENT) { + return null; + } + try { + Class type = Class.forName(className); + Method method = type.getMethod(methodName, paramTypes); + return method.invoke(null, args); + } catch (Throwable ignored) { + return null; + } + } + + private static EventDecision mapEventDecision(Object result) { + if (result instanceof Enum enumValue) { + return switch (enumValue.name()) { + case "ALLOW" -> EventDecision.ALLOW; + case "DENY" -> EventDecision.DENY; + default -> EventDecision.DEFAULT; + }; + } + return EventDecision.DEFAULT; + } + + private static boolean isClassPresent(String name) { + try { + Class.forName(name, false, PlatformHooks.class.getClassLoader()); + return true; + } catch (Throwable t) { + return false; + } + } + + public enum EventDecision { + DEFAULT, + ALLOW, + DENY + } + + public record ShieldBlockResult(boolean cancelled, float blockedDamage, boolean shieldTakesDamage) { + } + + public record LivingChangeTargetResult(boolean cancelled, LivingEntity newTarget) { + public LivingChangeTargetResult(boolean cancelled, @Nullable LivingEntity newTarget) { + this.cancelled = cancelled; + this.newTarget = newTarget; + } + + @Override + @Nullable + public LivingEntity newTarget() { + return newTarget; + } + } + + public static final class LivingSwapHandItemsResult { + private final boolean cancelled; + private final ItemStack swappedToMainHand; + private final ItemStack swappedToOffHand; + + public LivingSwapHandItemsResult(boolean cancelled, ItemStack swappedToMainHand, ItemStack swappedToOffHand) { + this.cancelled = cancelled; + this.swappedToMainHand = swappedToMainHand; + this.swappedToOffHand = swappedToOffHand; + } + + public boolean isCancelled() { + return cancelled; + } + + public ItemStack getItemSwappedToMainHand() { + return swappedToMainHand; + } + + public ItemStack getItemSwappedToOffHand() { + return swappedToOffHand; + } + } + + public static final class LeftClickBlockResult { + private static final LeftClickBlockResult DEFAULT = new LeftClickBlockResult(false, EventDecision.DEFAULT, EventDecision.DEFAULT); + + private final boolean cancelled; + private final EventDecision useItem; + private final EventDecision useBlock; + + public LeftClickBlockResult(boolean cancelled, EventDecision useItem, EventDecision useBlock) { + this.cancelled = cancelled; + this.useItem = useItem; + this.useBlock = useBlock; + } + + public boolean isCancelled() { + return cancelled; + } + + public boolean isUseItemDenied() { + return useItem == EventDecision.DENY; + } + + public boolean isUseBlockDenied() { + return useBlock == EventDecision.DENY; + } + } + + public static final class RightClickBlockResult { + private static final RightClickBlockResult DEFAULT = new RightClickBlockResult(false, InteractionResult.PASS, EventDecision.DEFAULT, EventDecision.DEFAULT); + + private final boolean cancelled; + private final InteractionResult cancellationResult; + private final EventDecision useItem; + private final EventDecision useBlock; + + public RightClickBlockResult(boolean cancelled, InteractionResult cancellationResult, EventDecision useItem, EventDecision useBlock) { + this.cancelled = cancelled; + this.cancellationResult = cancellationResult; + this.useItem = useItem; + this.useBlock = useBlock; + } + + public boolean isCancelled() { + return cancelled; + } + + public InteractionResult getCancellationResult() { + return cancellationResult; + } + + public boolean isUseItemDenied() { + return useItem == EventDecision.DENY; + } + + public boolean isUseItemAllowed() { + return useItem == EventDecision.ALLOW; + } + + public boolean isUseBlockDenied() { + return useBlock == EventDecision.DENY; + } + + public boolean isUseBlockAllowed() { + return useBlock == EventDecision.ALLOW; + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/log/ArclightI18nLogger.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/log/ArclightI18nLogger.java index 520eba659..1c980736c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/log/ArclightI18nLogger.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/log/ArclightI18nLogger.java @@ -1,28 +1,148 @@ package io.izzel.arclight.common.mod.util.log; import io.izzel.arclight.api.Unsafe; +import io.izzel.arclight.i18n.ArclightLocale; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.spi.ExtendedLogger; +import org.apache.logging.log4j.spi.ExtendedLoggerWrapper; +import org.apache.logging.log4j.util.MessageSupplier; +import org.apache.logging.log4j.util.Supplier; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodType; public class ArclightI18nLogger { - private static final MethodHandle MH_GET_LOGGER; + private static final MethodHandle MH_GET_LOGGER_BOOT; static { + MethodHandle method = null; try { - MH_GET_LOGGER = Unsafe.lookup().findStatic(Class.forName("io.izzel.arclight.boot.log.ArclightI18nLogger"), "getLogger", MethodType.methodType(Logger.class, String.class)); - } catch (Throwable e) { - throw new RuntimeException(e); + method = Unsafe.lookup().findStatic(Class.forName("io.izzel.arclight.boot.log.ArclightI18nLogger"), "getLogger", MethodType.methodType(Logger.class, String.class)); + } catch (Throwable ignored) { + // Fabric runtime has no boot logger bridge; use in-process i18n fallback logger. } + MH_GET_LOGGER_BOOT = method; } public static Logger getLogger(String name) { + if (MH_GET_LOGGER_BOOT != null) { + try { + return (Logger) MH_GET_LOGGER_BOOT.invokeExact(name); + } catch (Throwable ignored) { + } + } + return new FallbackI18nLogger((ExtendedLogger) LogManager.getLogger(name)); + } + + private static String localize(String key) { + if (key == null) { + return null; + } try { - return (Logger) MH_GET_LOGGER.invokeExact(name); - } catch (Throwable throwable) { - throw new RuntimeException(throwable); + return ArclightLocale.getInstance().get(key); + } catch (Throwable ignored) { + return key; + } + } + + private static final class FallbackI18nLogger extends ExtendedLoggerWrapper { + + private FallbackI18nLogger(ExtendedLogger logger) { + super(logger, logger.getName(), logger.getMessageFactory()); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, CharSequence message, Throwable t) { + super.logMessage(fqcn, level, marker, localize(message == null ? null : message.toString()), t); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, Object message, Throwable t) { + super.logMessage(fqcn, level, marker, localize(message == null ? null : message.toString()), t); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, MessageSupplier msgSupplier, Throwable t) { + super.logMessage(fqcn, level, marker, msgSupplier, t); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, Supplier msgSupplier, Throwable t) { + super.logMessage(fqcn, level, marker, msgSupplier, t); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Throwable t) { + super.logMessage(fqcn, level, marker, localize(message), t); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message) { + super.logMessage(fqcn, level, marker, localize(message)); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object... params) { + super.logMessage(fqcn, level, marker, localize(message), params); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0) { + super.logMessage(fqcn, level, marker, localize(message), p0); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2, Object p3) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2, p3); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2, Object p3, Object p4) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2, p3, p4); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2, p3, p4, p5); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2, p3, p4, p5, p6); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2, p3, p4, p5, p6, p7); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2, p3, p4, p5, p6, p7, p8); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8, Object p9) { + super.logMessage(fqcn, level, marker, localize(message), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); + } + + @Override + protected void logMessage(String fqcn, Level level, Marker marker, String message, Supplier... paramSuppliers) { + super.logMessage(fqcn, level, marker, localize(message), paramSuppliers); } } } diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index 3f3b84ce4..0f55832a6 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -19,8 +19,10 @@ "CraftConsoleCommandSenderMixin", "CraftEnderDragonMixin", "CraftEntityMixin", + "CraftEntityMixin_Forge", "CraftEventFactoryMixin", "CraftHumanEntityMixin", + "CraftHumanEntityMixin_Forge", "CraftInventoryMixin", "CraftInventoryViewMixin", "CraftItemFactoryMixin", diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index ee2273f94..c995b29a1 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -93,6 +93,7 @@ "world.entity.AgeableMobMixin", "world.entity.AreaEffectCloudEntityMixin", "world.entity.EntityMixin", + "world.entity.EntityMixin_FabricBridge", "world.entity.EntityTypeMixin", "world.entity.ExperienceOrbMixin", "world.entity.IAngerableMixin", @@ -102,7 +103,9 @@ "world.entity.LivingEntityMixin", "world.entity.LivingEntityMixin$ApotheosisCompatMixin", "world.entity.LivingEntityMixin$ObscureApiCompat", + "world.entity.LivingEntityMixin_FabricBridge", "world.entity.MobMixin", + "world.entity.MobMixin_FabricBridge", "world.entity.PathfinderMobMixin", "world.entity.ai.behavior.AssignProfessionFromJobSiteMixin", "world.entity.ai.behavior.BabyFollowAdultMixin", @@ -217,6 +220,7 @@ "world.entity.player.InventoryMixin", "world.entity.player.PlayerMixin", "world.entity.player.ServerPlayerMixin", + "world.entity.player.ServerPlayerMixin_FabricBridge", "world.entity.projectile.AbstractArrowMixin", "world.entity.projectile.AbstractHurtingProjectileMixin", "world.entity.projectile.ArrowEntityMixin", @@ -503,4 +507,4 @@ "world.storage.PlayerDataMixin", "world.storage.PrimaryLevelDataMixin" ] -} \ No newline at end of file +} diff --git a/arclight-fabric/build.gradle b/arclight-fabric/build.gradle new file mode 100644 index 000000000..5dc6c9169 --- /dev/null +++ b/arclight-fabric/build.gradle @@ -0,0 +1,913 @@ +import org.objectweb.asm.ClassReader +import org.objectweb.asm.ClassWriter +import org.objectweb.asm.Handle +import org.objectweb.asm.tree.ClassNode +import org.objectweb.asm.tree.FieldInsnNode +import org.objectweb.asm.tree.InvokeDynamicInsnNode +import org.objectweb.asm.tree.MethodInsnNode + +import java.security.MessageDigest +import java.util.zip.ZipFile + +plugins { + id 'fabric-loom' version "${fabric_loom_version}" + id 'java' + id 'idea' +} + +archivesBaseName = 'luminara-fabric-' + minecraftVersion + +configurations { + launcherEmbed +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +repositories { + maven { url = 'https://repo.spongepowered.org/repository/maven-public' } + maven { url = 'https://oss.sonatype.org/content/repositories/snapshots/' } + maven { url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } + maven { url = 'https://files.minecraftforge.net/maven/' } + maven { url = 'https://maven.izzel.io/releases' } + maven { url = 'https://jitpack.io/' } + mavenCentral() +} + +dependencies { + minecraft "com.mojang:minecraft:$minecraftVersion" + mappings loom.officialMojangMappings() + modImplementation "net.fabricmc:fabric-loader:$fabricLoaderVersion" + modImplementation "net.fabricmc.fabric-api:fabric-api:$fabricApiVersion" + + implementation(project(':arclight-common')) { + transitive = false + } + launcherEmbed(project(':arclight-common')) { + transitive = false + } + implementation(project(':i18n-config')) { + transitive = false + } + launcherEmbed(project(':i18n-config')) { + transitive = false + } + launcherEmbed("org.spongepowered:configurate-yaml:3.6.1") { + transitive = true + exclude group: "com.google.guava", module: "guava" + exclude group: "org.checkerframework", module: "checker-qual" + exclude group: "org.yaml", module: "snakeyaml" + } + launcherEmbed "org.yaml:snakeyaml:2.0" + implementation "io.izzel.arclight:arclight-api:$apiVersion" + include "io.izzel.arclight:arclight-api:$apiVersion" + implementation(project(':forge-installer')) { + transitive = false + } + launcherEmbed(project(':forge-installer')) { + transitive = false + } + implementation("io.izzel.arclight:mixin-tools:1.2.3") { + transitive = false + } + launcherEmbed("io.izzel.arclight:mixin-tools:1.2.3") { + transitive = false + } + launcherEmbed 'jline:jline:2.12.1' + launcherEmbed('net.minecrell:terminalconsoleappender:1.2.0') { + transitive = false + } + launcherEmbed 'org.jline:jline-terminal:3.12.1' + launcherEmbed('org.jline:jline-terminal-jna:3.12.1') { + transitive = false + } + launcherEmbed 'org.jline:jline-reader:3.12.1' + launcherEmbed 'org.fusesource.jansi:jansi:1.18' + launcherEmbed 'net.java.dev.jna:jna:5.12.1' + launcherEmbed 'net.java.dev.jna:jna-platform:5.12.1' + launcherEmbed 'org.xerial:sqlite-jdbc:3.42.0.0' + launcherEmbed 'com.mysql:mysql-connector-j:8.0.33' + launcherEmbed 'commons-codec:commons-codec:1.15' + implementation 'com.google.code.gson:gson:2.10.1' + launcherEmbed 'com.google.code.gson:gson:2.10.1' + implementation 'org.jetbrains:annotations:23.0.0' + + compileOnly 'net.minecraftforge:eventbus:6.0.5' +} + +processResources { + def ver = "${project.version}+$gitHash" + inputs.property 'version', ver + filesMatching('fabric.mod.json') { + expand 'version': ver + } +} + +tasks.register('generateFabricInstallerInfo') { + inputs.property('minecraftVersion', minecraftVersion) + inputs.property('fabricLoaderVersion', fabricLoaderVersion) + inputs.property('bootstrapLog4jVersion', '2.19.0') + def installer = file("${project.buildDir}/arclight_installer/META-INF/installer.json") + outputs.file(installer) + doLast { + def sha1 = { File file -> + MessageDigest md = MessageDigest.getInstance('SHA-1') + file.eachByte(4096) { bytes, size -> + md.update(bytes, 0, size) + } + return md.digest().collect { String.format("%02x", it) }.join() + } + def loaderCfg = project.configurations.detachedConfiguration( + project.dependencies.create("net.fabricmc:fabric-loader:$fabricLoaderVersion") + ) + loaderCfg.transitive = false + def loaderFile = loaderCfg.singleFile + def intermediaryCfg = project.configurations.detachedConfiguration( + project.dependencies.create("net.fabricmc:intermediary:$minecraftVersion") + ) + intermediaryCfg.transitive = false + def intermediaryFile = intermediaryCfg.singleFile + def artifacts = { List coords -> + def resolved = [:] + def cfg = project.configurations.detachedConfiguration( + coords.collect { project.dependencies.create(it) } as org.gradle.api.artifacts.Dependency[] + ) + cfg.transitive = false + cfg.resolvedConfiguration.resolvedArtifacts.each { artifact -> + def coord = "${artifact.moduleVersion.id.group}:${artifact.moduleVersion.id.name}:${artifact.moduleVersion.id.version}" + if (artifact.classifier != null) { + coord += ":${artifact.classifier}" + } + if (artifact.extension != 'jar') { + coord += "@${artifact.extension}" + } + resolved[coord] = sha1(artifact.file) + } + return coords.collectEntries { [(it): resolved[it]] } + } + def bootstrapLibraries = [ + "org.apache.logging.log4j:log4j-api:2.19.0", + "org.apache.logging.log4j:log4j-core:2.19.0" + ] + def fabricExtra = [:] + fabricExtra["net.fabricmc:intermediary:$minecraftVersion"] = sha1(intermediaryFile) + def output = [ + installer : [ + minecraft : minecraftVersion, + fabricLoader : fabricLoaderVersion, + fabricLoaderHash: sha1(loaderFile) + ], + libraries: artifacts(bootstrapLibraries), + fabricExtra: fabricExtra + ] + installer.parentFile.mkdirs() + installer.text = groovy.json.JsonOutput.toJson(output) + } +} + +tasks.register('generateFabricRefmap') { + def outputFile = file("${project.buildDir}/generated/fabric-refmap/mixins.arclight.refmap.json") + outputs.file(outputFile) + outputs.upToDateWhen { false } + dependsOn(':arclight-common:jar', ':arclight-common:createSrgToMcp') + doLast { + def commonJarFile = project(':arclight-common').tasks.named('jar').get().archiveFile.get().asFile + def mixinTargetOwnerByMixin = [:] + new ZipFile(commonJarFile).withCloseable { zip -> + zip.entries().each { entry -> + if (entry.directory || !entry.name.endsWith('.class') || !entry.name.startsWith('io/izzel/arclight/common/mixin/')) { + return + } + def node = new ClassNode() + new ClassReader(zip.getInputStream(entry).bytes).accept(node, ClassReader.SKIP_CODE) + def mixinAnn = ((node.visibleAnnotations ?: []) + (node.invisibleAnnotations ?: [])) + .find { it.desc == 'Lorg/spongepowered/asm/mixin/Mixin;' } + if (mixinAnn == null || mixinAnn.values == null) { + return + } + def targets = [] + for (int i = 0; i < mixinAnn.values.size() - 1; i += 2) { + def key = mixinAnn.values[i] + def value = mixinAnn.values[i + 1] + if (key == 'value' && value instanceof List) { + value.each { v -> + if (v instanceof org.objectweb.asm.Type) { + targets << v.internalName + } + } + } else if (key == 'targets' && value instanceof List) { + value.each { v -> + if (v instanceof String) { + targets << v.replace('.', '/') + } + } + } + } + if (!targets.isEmpty()) { + mixinTargetOwnerByMixin[node.name] = targets.first() + } + } + } + + String refmapText + new ZipFile(commonJarFile).withCloseable { zip -> + def entry = zip.getEntry('mixins.arclight.refmap.json') + if (entry == null) { + throw new GradleException("mixins.arclight.refmap.json was not found in ${commonJarFile}") + } + refmapText = zip.getInputStream(entry).getText('UTF-8') + } + + def srgFile = project(':arclight-common').file('build/createSrgToMcp/output.srg') + if (!srgFile.exists()) { + throw new GradleException("Missing SRG mapping file: ${srgFile}") + } + + def loomCacheRoot = new File(gradle.gradleUserHomeDir, "caches/fabric-loom/${minecraftVersion}") + def mappingsTiny = fileTree(loomCacheRoot) { + include '**/mappings.tiny' + }.files.find { it.parentFile.name.startsWith('loom.mappings.') } + if (mappingsTiny == null || !mappingsTiny.exists()) { + throw new GradleException("Cannot find loom mappings.tiny under ${loomCacheRoot}") + } + + def remapDesc = { String desc, Map classMap -> + if (desc == null) { + return null + } + desc.replaceAll(/L([^;]+);/) { full, cls -> + def key = cls.toString() + "L${classMap.getOrDefault(key, key)};" + } + } + + def srgMethodToNamed = [:] + def srgFieldToNamed = [:] + srgFile.eachLine('UTF-8') { line -> + if (line.startsWith('MD: ')) { + def parts = line.split(' ') + if (parts.length >= 5) { + def fromMember = parts[1] + def fromDesc = parts[2] + def toMember = parts[3] + def fromSep = fromMember.lastIndexOf('/') + def toSep = toMember.lastIndexOf('/') + if (fromSep > 0 && toSep > 0) { + def ownerNamed = toMember.substring(0, toSep) + def srgName = fromMember.substring(fromSep + 1) + def namedName = toMember.substring(toSep + 1) + srgMethodToNamed["${ownerNamed}|${srgName}|${fromDesc}"] = namedName + } + } + } else if (line.startsWith('FD: ')) { + def parts = line.split(' ') + if (parts.length >= 3) { + def fromMember = parts[1] + def toMember = parts[2] + def fromSep = fromMember.lastIndexOf('/') + def toSep = toMember.lastIndexOf('/') + if (fromSep > 0 && toSep > 0) { + def ownerNamed = toMember.substring(0, toSep) + def srgName = fromMember.substring(fromSep + 1) + def namedName = toMember.substring(toSep + 1) + srgFieldToNamed["${ownerNamed}|${srgName}"] = namedName + } + } + } + } + + def namedToIntermediary = [:] + def namedToOfficial = [:] + def methodNamedToInter = [:] + def fieldNamedToInter = [:] + def methodOfficialToInter = [:] + def fieldOfficialToInter = [:] + def methodFallback = [:] + def fieldFallback = [:] + def methodOfficialFallback = [:] + def fieldOfficialFallback = [:] + String currentNamed = null + mappingsTiny.eachLine('UTF-8') { line -> + if (line.startsWith('c\t')) { + def parts = line.split('\t') + if (parts.length >= 4) { + def official = parts[1] + def intermediary = parts[2] + def named = parts[3] + currentNamed = named + namedToIntermediary[named] = intermediary + namedToOfficial[named] = official + } + } else if (currentNamed != null && line.startsWith('\tf\t')) { + def parts = line.split('\t') + if (parts.length >= 6) { + def descOfficial = parts[2] + def officialName = parts[3] + def intermediaryName = parts[4] + def namedName = parts[5] + fieldNamedToInter["${currentNamed}|${namedName}|${descOfficial}"] = intermediaryName + fieldOfficialToInter["${currentNamed}|${officialName}|${descOfficial}"] = intermediaryName + def fallbackKey = "${currentNamed}|${namedName}" + if (!fieldFallback.containsKey(fallbackKey)) { + fieldFallback[fallbackKey] = intermediaryName + } else if (fieldFallback[fallbackKey] != intermediaryName) { + fieldFallback[fallbackKey] = '__AMBIG__' + } + def officialFallbackKey = "${currentNamed}|${officialName}" + if (!fieldOfficialFallback.containsKey(officialFallbackKey)) { + fieldOfficialFallback[officialFallbackKey] = intermediaryName + } else if (fieldOfficialFallback[officialFallbackKey] != intermediaryName) { + fieldOfficialFallback[officialFallbackKey] = '__AMBIG__' + } + } + } else if (currentNamed != null && line.startsWith('\tm\t')) { + def parts = line.split('\t') + if (parts.length >= 6) { + def descOfficial = parts[2] + def officialName = parts[3] + def intermediaryName = parts[4] + def namedName = parts[5] + methodNamedToInter["${currentNamed}|${namedName}|${descOfficial}"] = intermediaryName + methodOfficialToInter["${currentNamed}|${officialName}|${descOfficial}"] = intermediaryName + def fallbackKey = "${currentNamed}|${namedName}" + if (!methodFallback.containsKey(fallbackKey)) { + methodFallback[fallbackKey] = intermediaryName + } else if (methodFallback[fallbackKey] != intermediaryName) { + methodFallback[fallbackKey] = '__AMBIG__' + } + def officialFallbackKey = "${currentNamed}|${officialName}" + if (!methodOfficialFallback.containsKey(officialFallbackKey)) { + methodOfficialFallback[officialFallbackKey] = intermediaryName + } else if (methodOfficialFallback[officialFallbackKey] != intermediaryName) { + methodOfficialFallback[officialFallbackKey] = '__AMBIG__' + } + } + } + } + + int unresolved = 0 + def convertValue = { String value, String defaultOwner -> + def methodMatcher = value =~ /^L([^;]+);([^(:]+)(\(.*)$/ + if (methodMatcher.matches()) { + def ownerNamed = methodMatcher[0][1] + def srgOrNamed = methodMatcher[0][2] + def descNamed = methodMatcher[0][3] + def ownerInter = namedToIntermediary.getOrDefault(ownerNamed, ownerNamed) + def descInter = remapDesc(descNamed, namedToIntermediary) + if (srgOrNamed == '' || srgOrNamed == '') { + return "L${ownerInter};${srgOrNamed}${descInter}" + } + def namedName = srgMethodToNamed["${ownerNamed}|${srgOrNamed}|${descNamed}"] ?: srgOrNamed + def descOfficial = remapDesc(descNamed, namedToOfficial) + def interName = methodNamedToInter["${ownerNamed}|${namedName}|${descOfficial}"] + if (interName == null) { + def fallback = methodFallback["${ownerNamed}|${namedName}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + if (interName == null) { + interName = methodOfficialToInter["${ownerNamed}|${srgOrNamed}|${descOfficial}"] + if (interName == null) { + def fallback = methodOfficialFallback["${ownerNamed}|${srgOrNamed}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + } + if (interName == null) { + unresolved++ + interName = namedName + } + return "L${ownerInter};${interName}${descInter}" + } + + def fieldMatcher = value =~ /^L([^;]+);([^:]+):(.+)$/ + if (fieldMatcher.matches()) { + def ownerNamed = fieldMatcher[0][1] + def srgOrNamed = fieldMatcher[0][2] + def descNamed = fieldMatcher[0][3] + def ownerInter = namedToIntermediary.getOrDefault(ownerNamed, ownerNamed) + def descInter = remapDesc(descNamed, namedToIntermediary) + def namedName = srgFieldToNamed["${ownerNamed}|${srgOrNamed}"] ?: srgOrNamed + def descOfficial = remapDesc(descNamed, namedToOfficial) + def interName = fieldNamedToInter["${ownerNamed}|${namedName}|${descOfficial}"] + if (interName == null) { + def fallback = fieldFallback["${ownerNamed}|${namedName}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + if (interName == null) { + interName = fieldOfficialToInter["${ownerNamed}|${srgOrNamed}|${descOfficial}"] + if (interName == null) { + def fallback = fieldOfficialFallback["${ownerNamed}|${srgOrNamed}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + } + if (interName == null) { + unresolved++ + interName = namedName + } + return "L${ownerInter};${interName}:${descInter}" + } + + def bareMethodMatcher = value =~ /^([^(:]+)(\(.*)$/ + if (bareMethodMatcher.matches() && defaultOwner != null) { + def ownerNamed = defaultOwner + def srgOrNamed = bareMethodMatcher[0][1] + def descNamed = bareMethodMatcher[0][2] + def descInter = remapDesc(descNamed, namedToIntermediary) + if (srgOrNamed == '' || srgOrNamed == '') { + return "${srgOrNamed}${descInter}" + } + def namedName = srgMethodToNamed["${ownerNamed}|${srgOrNamed}|${descNamed}"] ?: srgOrNamed + def descOfficial = remapDesc(descNamed, namedToOfficial) + def interName = methodNamedToInter["${ownerNamed}|${namedName}|${descOfficial}"] + if (interName == null) { + def fallback = methodFallback["${ownerNamed}|${namedName}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + if (interName == null) { + interName = methodOfficialToInter["${ownerNamed}|${srgOrNamed}|${descOfficial}"] + if (interName == null) { + def fallback = methodOfficialFallback["${ownerNamed}|${srgOrNamed}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + } + if (interName == null) { + unresolved++ + interName = namedName + } + return "${interName}${descInter}" + } + + def bareFieldMatcher = value =~ /^([^:]+):(.+)$/ + if (bareFieldMatcher.matches() && defaultOwner != null) { + def ownerNamed = defaultOwner + def srgOrNamed = bareFieldMatcher[0][1] + def descNamed = bareFieldMatcher[0][2] + def descInter = remapDesc(descNamed, namedToIntermediary) + def namedName = srgFieldToNamed["${ownerNamed}|${srgOrNamed}"] ?: srgOrNamed + def descOfficial = remapDesc(descNamed, namedToOfficial) + def interName = fieldNamedToInter["${ownerNamed}|${namedName}|${descOfficial}"] + if (interName == null) { + def fallback = fieldFallback["${ownerNamed}|${namedName}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + if (interName == null) { + interName = fieldOfficialToInter["${ownerNamed}|${srgOrNamed}|${descOfficial}"] + if (interName == null) { + def fallback = fieldOfficialFallback["${ownerNamed}|${srgOrNamed}"] + if (fallback != null && fallback != '__AMBIG__') { + interName = fallback + } + } + } + if (interName == null) { + unresolved++ + interName = namedName + } + return "${interName}:${descInter}" + } + + if (value.contains('/') && !value.contains(';')) { + return namedToIntermediary.getOrDefault(value, value) + } + if (value.contains('.') && !value.contains(';')) { + def slashed = value.replace('.', '/') + def mapped = namedToIntermediary[slashed] + return mapped == null ? value : mapped.replace('/', '.') + } + return value + } + + def parser = new groovy.json.JsonSlurper() + def sourceRefmap = parser.parseText(refmapText) + def sourceMappings = sourceRefmap.mappings instanceof Map ? sourceRefmap.mappings : [:] + def convertedMappings = [:] + sourceMappings.each { mixinClass, remapData -> + def converted = [:] + def defaultOwner = mixinTargetOwnerByMixin[mixinClass.toString()] + if (remapData instanceof Map) { + remapData.each { key, value -> + if (value instanceof String) { + converted[key] = convertValue(value, defaultOwner) + } else { + converted[key] = value + } + } + } + convertedMappings[mixinClass] = converted + } + + def mixinMapFile = fileTree(project(':arclight-common').file('build/loom-cache')) { + include 'mixin-map-*.tiny' + }.files.find() + if (mixinMapFile != null && mixinMapFile.exists()) { + mixinMapFile.eachLine('UTF-8') { line -> + if (line.startsWith('FIELD\t')) { + def parts = line.split('\t') + if (parts.length >= 5) { + def mixinClass = parts[1] + def descNamed = parts[2] + def namedName = parts[3] + def interName = parts[4] + def mixinData = convertedMappings.computeIfAbsent(mixinClass) { [:] } + if (!mixinData.containsKey(namedName)) { + mixinData[namedName] = "${interName}:${remapDesc(descNamed, namedToIntermediary)}" + } + } + } else if (line.startsWith('METHOD\t')) { + def parts = line.split('\t') + if (parts.length >= 5) { + def mixinClass = parts[1] + def descNamed = parts[2] + def namedName = parts[3] + def interName = parts[4] + def mixinData = convertedMappings.computeIfAbsent(mixinClass) { [:] } + if (!mixinData.containsKey(namedName)) { + mixinData[namedName] = "${interName}${remapDesc(descNamed, namedToIntermediary)}" + } + } + } + } + } else { + logger.lifecycle('generateFabricRefmap: mixin-map-*.tiny not found, skipped shadow fallback generation') + } + + def levelMixin = convertedMappings['io/izzel/arclight/common/mixin/core/world/level/LevelMixin'] + if (levelMixin instanceof Map && levelMixin['thread'] == 'f_46423_:Ljava/lang/Thread;') { + levelMixin['thread'] = 'field_17086:Ljava/lang/Thread;' + } + + def out = [ + mappings: convertedMappings, + data : ['named:intermediary': convertedMappings] + ] + outputFile.parentFile.mkdirs() + outputFile.text = groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(out)) + if (unresolved > 0) { + logger.lifecycle("generateFabricRefmap: unresolved entries kept as-is: ${unresolved}") + } + } +} + +tasks.register('generateFabricMixinClasses') { + def outputDir = file("${project.buildDir}/generated/fabric-mixin-classes") + outputs.dir(outputDir) + outputs.upToDateWhen { false } + dependsOn(':arclight-common:jar') + dependsOn(tasks.generateFabricRefmap) + doLast { + def mixinMapFile = fileTree(project(':arclight-common').file('build/loom-cache')) { + include 'mixin-map-*.tiny' + }.files.find() + if (mixinMapFile == null || !mixinMapFile.exists()) { + logger.lifecycle('generateFabricMixinClasses: mixin-map-*.tiny not found, skipping bytecode rewrite') + outputDir.mkdirs() + return + } + + def fieldRenames = [:].withDefault { [:] } + def methodRenames = [:].withDefault { [:] } + mixinMapFile.eachLine('UTF-8') { line -> + if (line.startsWith('FIELD\t')) { + def parts = line.split('\t') + if (parts.length >= 5) { + def owner = parts[1] + def desc = parts[2] + def oldName = parts[3] + def newName = parts[4] + if (oldName != newName) { + fieldRenames[owner]["${oldName}#${desc}"] = newName + } + } + } else if (line.startsWith('METHOD\t')) { + def parts = line.split('\t') + if (parts.length >= 5) { + def owner = parts[1] + def desc = parts[2] + def oldName = parts[3] + def newName = parts[4] + if (oldName != newName) { + methodRenames[owner]["${oldName}#${desc}"] = newName + } + } + } + } + + def convertedRefmapFile = file("${project.buildDir}/generated/fabric-refmap/mixins.arclight.refmap.json") + if (convertedRefmapFile.exists()) { + def parser = new groovy.json.JsonSlurper() + def refmap = parser.parse(convertedRefmapFile) + def mappings = refmap?.mappings instanceof Map ? refmap.mappings : [:] + def commonJarFile = project(':arclight-common').tasks.named('jar').get().archiveFile.get().asFile + + def classMemberIndex = [:].withDefault { [fields: [:].withDefault { [] }, methods: [:].withDefault { [] }] } + new ZipFile(commonJarFile).withCloseable { zip -> + mappings.keySet().each { mixinClass -> + def owner = mixinClass.toString() + def entry = zip.getEntry("${owner}.class") + if (entry == null) { + return + } + def classNode = new ClassNode() + new ClassReader(zip.getInputStream(entry).bytes).accept(classNode, ClassReader.SKIP_CODE) + classNode.fields.each { field -> + classMemberIndex[owner].fields[field.name] << field.desc + } + classNode.methods.each { method -> + classMemberIndex[owner].methods[method.name] << method.desc + } + } + } + + mappings.each { mixinClass, remapData -> + if (!(remapData instanceof Map)) { + return + } + def owner = mixinClass.toString() + def memberIndex = classMemberIndex[owner] + remapData.each { key, value -> + if (!(value instanceof String)) { + return + } + def target = value.toString() + def methodMatcher = target =~ /^L[^;]+;([^(:]+)\((.*)$/ + def fieldMatcher = target =~ /^L[^;]+;([^:]+):(.+)$/ + if (methodMatcher.matches()) { + def newName = methodMatcher[0][1] + def oldName = key.toString().contains('(') ? key.toString().substring(0, key.toString().indexOf('(')) : key.toString() + if (oldName == newName) { + return + } + def oldDesc = null + if (key.toString().contains('(')) { + oldDesc = key.toString().substring(key.toString().indexOf('(')) + } + memberIndex.methods[oldName].each { desc -> + if (oldDesc == null || oldDesc == desc) { + methodRenames[owner]["${oldName}#${desc}"] = newName + } + } + } else if (fieldMatcher.matches()) { + def newName = fieldMatcher[0][1] + def oldName = key.toString().contains(':') ? key.toString().substring(0, key.toString().indexOf(':')) : key.toString() + if (oldName == newName) { + return + } + def oldDesc = null + if (key.toString().contains(':')) { + oldDesc = key.toString().substring(key.toString().indexOf(':') + 1) + } + memberIndex.fields[oldName].each { desc -> + if (oldDesc == null || oldDesc == desc) { + fieldRenames[owner]["${oldName}#${desc}"] = newName + } + } + } + } + } + } + + def loomCacheRoot = new File(gradle.gradleUserHomeDir, "caches/fabric-loom/${minecraftVersion}") + def mappingsTiny = fileTree(loomCacheRoot) { + include '**/mappings.tiny' + }.files.find { it.parentFile.name.startsWith('loom.mappings.') } + if (mappingsTiny != null && mappingsTiny.exists()) { + def namedToOfficial = [:] + def methodNamedToInter = [:] + def fieldNamedToInter = [:] + String currentNamed = null + mappingsTiny.eachLine('UTF-8') { line -> + if (line.startsWith('c\t')) { + def parts = line.split('\t') + if (parts.length >= 4) { + currentNamed = parts[3] + namedToOfficial[currentNamed] = parts[1] + } + } else if (currentNamed != null && line.startsWith('\tm\t')) { + def parts = line.split('\t') + if (parts.length >= 6) { + methodNamedToInter["${currentNamed}|${parts[5]}|${parts[2]}"] = parts[4] + } + } else if (currentNamed != null && line.startsWith('\tf\t')) { + def parts = line.split('\t') + if (parts.length >= 6) { + fieldNamedToInter["${currentNamed}|${parts[5]}|${parts[2]}"] = parts[4] + } + } + } + + def remapDescToOfficial = { String desc -> + if (desc == null) { + return null + } + desc.replaceAll(/L([^;]+);/) { full, cls -> + def key = cls.toString() + "L${namedToOfficial.getOrDefault(key, key)};" + } + } + def hasAnnotation = { List annotations, String desc -> + annotations != null && annotations.any { it?.desc == desc } + } + def readMixinTargets = { ClassNode node -> + def targets = [] + def mixinAnn = ((node.visibleAnnotations ?: []) + (node.invisibleAnnotations ?: [])) + .find { it.desc == 'Lorg/spongepowered/asm/mixin/Mixin;' } + if (mixinAnn != null && mixinAnn.values != null) { + for (int i = 0; i < mixinAnn.values.size() - 1; i += 2) { + def key = mixinAnn.values[i] + def value = mixinAnn.values[i + 1] + if (key == 'value' && value instanceof List) { + value.each { v -> + if (v instanceof org.objectweb.asm.Type) { + targets << v.internalName + } + } + } else if (key == 'targets' && value instanceof List) { + value.each { v -> + if (v instanceof String) { + targets << v.replace('.', '/') + } + } + } + } + } + return targets + } + + def commonJarFile = project(':arclight-common').tasks.named('jar').get().archiveFile.get().asFile + new ZipFile(commonJarFile).withCloseable { zip -> + zip.entries().each { entry -> + if (entry.directory || !entry.name.endsWith('.class') || !entry.name.startsWith('io/izzel/arclight/common/mixin/')) { + return + } + def classNode = new ClassNode() + new ClassReader(zip.getInputStream(entry).bytes).accept(classNode, ClassReader.SKIP_CODE) + def mixinTargets = readMixinTargets(classNode) + if (mixinTargets.isEmpty()) { + return + } + def owner = classNode.name + classNode.fields.each { field -> + if (!hasAnnotation(field.visibleAnnotations, 'Lorg/spongepowered/asm/mixin/Shadow;') + && !hasAnnotation(field.invisibleAnnotations, 'Lorg/spongepowered/asm/mixin/Shadow;')) { + return + } + def oldName = field.name + def descOfficial = remapDescToOfficial(field.desc) + for (String targetOwner : mixinTargets) { + def interName = fieldNamedToInter["${targetOwner}|${oldName}|${descOfficial}"] + if (interName != null && interName != oldName) { + fieldRenames[owner]["${oldName}#${field.desc}"] = interName + break + } + } + } + classNode.methods.each { method -> + if (!hasAnnotation(method.visibleAnnotations, 'Lorg/spongepowered/asm/mixin/Shadow;') + && !hasAnnotation(method.invisibleAnnotations, 'Lorg/spongepowered/asm/mixin/Shadow;')) { + return + } + def oldName = method.name + def descOfficial = remapDescToOfficial(method.desc) + for (String targetOwner : mixinTargets) { + def interName = methodNamedToInter["${targetOwner}|${oldName}|${descOfficial}"] + if (interName != null && interName != oldName) { + methodRenames[owner]["${oldName}#${method.desc}"] = interName + break + } + } + } + } + } + } + + // Some common mixins intentionally use Forge-style names that are absent from mixin-map. + methodRenames['io/izzel/arclight/common/mixin/core/world/level/LevelMixin'][ + 'sendBlockUpdated#(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;I)V' + ] = 'method_8413' + + def targetClasses = (fieldRenames.keySet() + methodRenames.keySet()) as Set + if (targetClasses.isEmpty()) { + outputDir.mkdirs() + return + } + + outputDir.deleteDir() + outputDir.mkdirs() + + def commonJarFile = project(':arclight-common').tasks.named('jar').get().archiveFile.get().asFile + def transform = { byte[] bytes, String owner -> + def classNode = new ClassNode() + new ClassReader(bytes).accept(classNode, 0) + def classFieldRenames = fieldRenames[owner] + def classMethodRenames = methodRenames[owner] + + classNode.fields.each { field -> + def renamed = classFieldRenames["${field.name}#${field.desc}"] + if (renamed != null) { + field.name = renamed + } + } + classNode.methods.each { method -> + def renamed = classMethodRenames["${method.name}#${method.desc}"] + if (renamed != null) { + method.name = renamed + } + } + classNode.methods.each { method -> + method.instructions?.each { insn -> + if (insn instanceof FieldInsnNode && insn.owner == owner) { + def renamed = classFieldRenames["${insn.name}#${insn.desc}"] + if (renamed != null) { + insn.name = renamed + } + } else if (insn instanceof MethodInsnNode && insn.owner == owner) { + def renamed = classMethodRenames["${insn.name}#${insn.desc}"] + if (renamed != null) { + insn.name = renamed + } + } else if (insn instanceof InvokeDynamicInsnNode) { + for (int i = 0; i < insn.bsmArgs.length; i++) { + def arg = insn.bsmArgs[i] + if (arg instanceof Handle && arg.owner == owner) { + def renamed = classMethodRenames["${arg.name}#${arg.desc}"] + if (renamed != null) { + insn.bsmArgs[i] = new Handle(arg.tag, arg.owner, renamed, arg.desc, arg.isInterface()) + } + } + } + } + } + } + + def writer = new ClassWriter(0) + classNode.accept(writer) + return writer.toByteArray() + } + + new ZipFile(commonJarFile).withCloseable { zip -> + targetClasses.each { owner -> + def entryName = "${owner}.class" + def entry = zip.getEntry(entryName) + if (entry == null) { + return + } + def bytes = zip.getInputStream(entry).bytes + def transformed = transform(bytes, owner) + def out = new File(outputDir, entryName) + out.parentFile.mkdirs() + out.bytes = transformed + } + } + } +} + +project.sourceSets.main.output.dir file("${project.buildDir}/arclight_installer"), builtBy: tasks.generateFabricInstallerInfo + +jar { + dependsOn tasks.generateFabricRefmap + dependsOn tasks.generateFabricMixinClasses + from("${project.buildDir}/generated/fabric-mixin-classes") { + include "**/*.class" + } + from({ + configurations.launcherEmbed.collect { it.isDirectory() ? it : zipTree(it) } + }) { + exclude "org/apache/logging/log4j/**" + exclude "META-INF/org/apache/logging/log4j/**" + exclude "META-INF/services/org.apache.logging.log4j.spi.Provider" + exclude "META-INF/log4j-provider.properties" + exclude "Log4j-*.xsd" + exclude "Log4j-*.dtd" + exclude "Log4j-config.xsd" + exclude "META-INF/MANIFEST.MF" + exclude "META-INF/*.SF" + exclude "META-INF/*.DSA" + exclude "META-INF/*.RSA" + exclude "mixins.arclight.refmap.json" + } + from("${project.buildDir}/generated/fabric-refmap") { + include "mixins.arclight.refmap.json" + } + manifest.attributes 'Main-Class': 'io.izzel.arclight.fabric.launch.FabricJarMain' + manifest.attributes 'Implementation-Title': 'Luminara' + manifest.attributes 'Implementation-Version': "luminara-$minecraftVersion-${project.version}-$gitHash" + manifest.attributes 'Implementation-Vendor': 'Luminara Team' + manifest.attributes 'Implementation-Timestamp': new Date().format("yyyy-MM-dd HH:mm:ss") + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/ArclightFabricPreLaunch.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/ArclightFabricPreLaunch.java new file mode 100644 index 000000000..ef10ed99a --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/ArclightFabricPreLaunch.java @@ -0,0 +1,15 @@ +package io.izzel.arclight.fabric; + +import io.izzel.arclight.common.mod.ArclightCommon; +import io.izzel.arclight.common.mod.ArclightConnector; +import io.izzel.arclight.fabric.mod.FabricCommonImpl; +import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; + +public final class ArclightFabricPreLaunch implements PreLaunchEntrypoint { + + @Override + public void onPreLaunch() { + ArclightCommon.setInstance(new FabricCommonImpl()); + new ArclightConnector().connect(); + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/ArclightModEntrypoint.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/ArclightModEntrypoint.java new file mode 100644 index 000000000..3c77656c2 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/ArclightModEntrypoint.java @@ -0,0 +1,15 @@ +package io.izzel.arclight.fabric; + +import io.izzel.arclight.api.Arclight; +import io.izzel.arclight.api.ArclightVersion; +import io.izzel.arclight.fabric.mod.FabricArclightServer; +import net.fabricmc.api.ModInitializer; + +public class ArclightModEntrypoint implements ModInitializer { + + @Override + public void onInitialize() { + ArclightVersion.setVersion(ArclightVersion.TRIALS); + Arclight.setServer(new FabricArclightServer()); + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/launch/FabricJarMain.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/launch/FabricJarMain.java new file mode 100644 index 000000000..55bac6912 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/launch/FabricJarMain.java @@ -0,0 +1,492 @@ +package io.izzel.arclight.fabric.launch; + +import io.izzel.arclight.api.ArclightVersion; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +public final class FabricJarMain { + + private static final int MIN_CLASS_VERSION = 61; + private static final int MIN_JAVA_VERSION = 17; + private static final String EULA_URL = "https://account.mojang.com/documents/minecraft_eula"; + private static final String EULA_FILE = "eula.txt"; + private static final String CONFIG_FILE = "luminara.yml"; + private static final String LOG4J_CONFIG_PROPERTY = "log4j.configurationFile"; + private static final String LOG4J_CONFIG_SIMPLE = "arclight-log4j2.xml"; + private static final String LOG4J_CONFIG_DETAILED = "arclight-log4j2-detailed.xml"; + private static final String LOG4J_SKIP_JANSI_PROPERTY = "log4j.skipJansi"; + private static final String JUL_FORMAT_PROPERTY = "java.util.logging.SimpleFormatter.format"; + private static final String JUL_FORMAT_VALUE = "[%1$tT] [JUL] %5$s%6$s%n"; + private static final String TERMINAL_JLINE_PROPERTY = "terminal.jline"; + private static final String TERMINAL_ANSI_PROPERTY = "terminal.ansi"; + private static final String TERMINAL_PROVIDER_PROPERTY = "org.jline.terminal.provider"; + private static final String TERMINAL_PROVIDER_JNA = "jna"; + private static final String TERMINAL_ENCODING_PROPERTY = "org.jline.terminal.encoding"; + private static final String CONSOLE_CHARSET_PROPERTY = "luminara.console.charset"; + private static final String STDOUT_ENCODING_PROPERTY = "stdout.encoding"; + private static final String SUN_STDOUT_ENCODING_PROPERTY = "sun.stdout.encoding"; + private static final String NATIVE_ENCODING_PROPERTY = "native.encoding"; + private static final String FILE_ENCODING_PROPERTY = "file.encoding"; + private static final String ANSI_FLAG_PROPERTY = "terminal.ansi"; + private static final String ANSI_RESET = "\u001B[0m"; + private static final String ANSI_BLACK = "\u001B[30m"; + private static final String ANSI_RED = "\u001B[31m"; + private static final String ANSI_GREEN = "\u001B[32m"; + private static final String ANSI_GOLD = "\u001B[33m"; + private static final String ANSI_BLUE = "\u001B[34m"; + private static final String ANSI_MAGENTA = "\u001B[35m"; + private static final String ANSI_CYAN = "\u001B[36m"; + private static final String ANSI_WHITE = "\u001B[37m"; + private static final String ANSI_BRIGHT_BLACK = "\u001B[90m"; + private static final String ANSI_BRIGHT_RED = "\u001B[91m"; + private static final String ANSI_BRIGHT_GREEN = "\u001B[92m"; + private static final String ANSI_BRIGHT_YELLOW = "\u001B[93m"; + private static final String ANSI_BRIGHT_BLUE = "\u001B[94m"; + private static final String ANSI_BRIGHT_MAGENTA = "\u001B[95m"; + private static final String ANSI_AQUA = "\u001B[96m"; + private static final String ANSI_BRIGHT_WHITE = "\u001B[97m"; + private static final String DEFAULT_FALLBACK_LOCALE = "zh_cn"; + private static final String I18N_RESOURCE_PREFIX = "/META-INF/i18n/"; + + private FabricJarMain() { + } + + public static void main(String[] args) throws Throwable { + configureLoggingDefaults(); + printEarlyBanner(); + + int javaVersion = (int) Float.parseFloat(System.getProperty("java.class.version")); + if (javaVersion < MIN_CLASS_VERSION) { + System.err.println("Luminara Fabric requires Java " + MIN_JAVA_VERSION); + System.err.println("Current: " + System.getProperty("java.version")); + System.exit(-1); + return; + } + + if (!checkEula()) { + System.err.println("You need to agree to the EULA to run the server."); + System.exit(-1); + return; + } + + Main_Fabric.main(args); + } + + static void configureLoggingDefaults() { + if (System.getProperty(LOG4J_SKIP_JANSI_PROPERTY) == null) { + System.setProperty(LOG4J_SKIP_JANSI_PROPERTY, "false"); + } + if (System.getProperty(JUL_FORMAT_PROPERTY) == null) { + System.setProperty(JUL_FORMAT_PROPERTY, JUL_FORMAT_VALUE); + } + if (System.getProperty(TERMINAL_JLINE_PROPERTY) == null) { + System.setProperty(TERMINAL_JLINE_PROPERTY, "true"); + } + if (System.getProperty(TERMINAL_ANSI_PROPERTY) == null) { + System.setProperty(TERMINAL_ANSI_PROPERTY, "true"); + } + if (System.getProperty(TERMINAL_PROVIDER_PROPERTY) == null) { + System.setProperty(TERMINAL_PROVIDER_PROPERTY, TERMINAL_PROVIDER_JNA); + } + String charset = detectConsoleCharset(); + if (System.getProperty(CONSOLE_CHARSET_PROPERTY) == null) { + System.setProperty(CONSOLE_CHARSET_PROPERTY, charset); + } + if (System.getProperty(TERMINAL_ENCODING_PROPERTY) == null) { + System.setProperty(TERMINAL_ENCODING_PROPERTY, charset); + } + if (System.getProperty(LOG4J_CONFIG_PROPERTY) == null) { + System.setProperty(LOG4J_CONFIG_PROPERTY, resolveInitialLog4jConfig()); + } + } + + private static String detectConsoleCharset() { + List keys = List.of(STDOUT_ENCODING_PROPERTY, SUN_STDOUT_ENCODING_PROPERTY, NATIVE_ENCODING_PROPERTY, FILE_ENCODING_PROPERTY); + for (String key : keys) { + String value = System.getProperty(key); + if (value != null && !value.isBlank()) { + return value; + } + } + return StandardCharsets.UTF_8.name(); + } + + private static String resolveInitialLog4jConfig() { + return readUseSimpleFormatFromConfig() ? LOG4J_CONFIG_SIMPLE : LOG4J_CONFIG_DETAILED; + } + + private static boolean readUseSimpleFormatFromConfig() { + Path configPath = Paths.get(CONFIG_FILE); + if (!Files.exists(configPath)) { + return false; + } + try { + List lines = Files.readAllLines(configPath, StandardCharsets.UTF_8); + boolean inLogging = false; + for (String line : lines) { + if (line == null || line.isEmpty()) { + continue; + } + String trimmed = line.trim(); + if (trimmed.isEmpty() || trimmed.startsWith("#")) { + continue; + } + if (!Character.isWhitespace(line.charAt(0))) { + inLogging = false; + } + if ("logging:".equals(trimmed)) { + inLogging = true; + continue; + } + if (inLogging && trimmed.startsWith("use-simple-format:")) { + String value = trimmed.substring("use-simple-format:".length()).trim(); + int commentIndex = value.indexOf('#'); + if (commentIndex >= 0) { + value = value.substring(0, commentIndex).trim(); + } + return "true".equalsIgnoreCase(value); + } + } + } catch (Exception ignored) { + } + return false; + } + + private static void printEarlyBanner() { + String version = "unknown"; + String buildTime = "unknown"; + try (InputStream stream = FabricJarMain.class.getModule().getResourceAsStream("/META-INF/MANIFEST.MF")) { + if (stream != null) { + Manifest manifest = new Manifest(stream); + Attributes attributes = manifest.getMainAttributes(); + String v = attributes.getValue(Attributes.Name.IMPLEMENTATION_VERSION); + String t = attributes.getValue("Implementation-Timestamp"); + if (v != null && !v.isBlank()) { + version = v; + } + if (t != null && !t.isBlank()) { + buildTime = t; + } + } + } catch (Exception ignored) { + } + var localeSetting = resolveLocaleSetting(); + String release = resolveReleaseName(localeSetting.current(), localeSetting.fallback()); + List logoLines = resolveLogoLines(localeSetting.current(), localeSetting.fallback()); + List renderedLogo = renderLogoLines(logoLines, release, version, buildTime); + boolean ansi = !"false".equalsIgnoreCase(System.getProperty(ANSI_FLAG_PROPERTY, "true")); + for (String line : renderedLogo) { + System.out.println(ansi ? renderMinecraftColors(line) : stripMinecraftColors(line)); + } + } + + private static LocaleSetting resolveLocaleSetting() { + String current = systemLocale(); + String fallback = DEFAULT_FALLBACK_LOCALE; + Path configPath = Paths.get(CONFIG_FILE); + if (!Files.exists(configPath)) { + return new LocaleSetting(current, fallback); + } + try { + List lines = Files.readAllLines(configPath, StandardCharsets.UTF_8); + boolean inLocale = false; + for (String line : lines) { + if (line == null || line.isEmpty()) { + continue; + } + String trimmed = line.trim(); + if (trimmed.isEmpty() || trimmed.startsWith("#")) { + continue; + } + if (!Character.isWhitespace(line.charAt(0))) { + inLocale = false; + } + if ("locale:".equals(trimmed)) { + inLocale = true; + continue; + } + if (inLocale && trimmed.startsWith("current:")) { + String value = normalizeYamlValue(trimmed.substring("current:".length())); + if (!value.isBlank()) { + current = value; + } + continue; + } + if (inLocale && trimmed.startsWith("fallback:")) { + String value = normalizeYamlValue(trimmed.substring("fallback:".length())); + if (!value.isBlank()) { + fallback = value; + } + } + } + } catch (Exception ignored) { + } + return new LocaleSetting(current, fallback); + } + + private static String resolveReleaseName(String currentLocale, String fallbackLocale) { + String key; + try { + key = ArclightVersion.current().getReleaseName(); + } catch (Throwable ignored) { + key = "Trials"; + } + String value = readReleaseName(currentLocale, key); + if ((value == null || value.isBlank()) && !fallbackLocale.equalsIgnoreCase(currentLocale)) { + value = readReleaseName(fallbackLocale, key); + } + if (value == null || value.isBlank()) { + value = key; + } + return value; + } + + private static List resolveLogoLines(String currentLocale, String fallbackLocale) { + List lines = readLogoLines(currentLocale); + if (lines.isEmpty() && !fallbackLocale.equalsIgnoreCase(currentLocale)) { + lines = readLogoLines(fallbackLocale); + } + if (lines.isEmpty()) { + lines = List.of( + "", + "Luminara", + "" + ); + } + return lines; + } + + private static List readLogoLines(String locale) { + String resource = I18N_RESOURCE_PREFIX + locale + ".yml"; + List lines = new ArrayList<>(); + try (InputStream stream = FabricJarMain.class.getResourceAsStream(resource)) { + if (stream == null) { + return List.of(); + } + List content = readAllLines(stream); + boolean inLogo = false; + for (String line : content) { + if (line == null) { + continue; + } + String trimmed = line.trim(); + if (trimmed.isEmpty() || trimmed.startsWith("#")) { + continue; + } + if (!Character.isWhitespace(line.charAt(0))) { + if (inLogo) { + break; + } + inLogo = "logo:".equals(trimmed); + continue; + } + if (!inLogo) { + continue; + } + String indented = line.stripLeading(); + if (!indented.startsWith("-")) { + continue; + } + String value = indented.substring(1).trim(); + lines.add(normalizeYamlValue(value)); + } + } catch (Exception ignored) { + } + return lines; + } + + private static String readReleaseName(String locale, String releaseKey) { + String resource = I18N_RESOURCE_PREFIX + locale + ".yml"; + try (InputStream stream = FabricJarMain.class.getResourceAsStream(resource)) { + if (stream == null) { + return null; + } + List content = readAllLines(stream); + boolean inRelease = false; + for (String line : content) { + if (line == null) { + continue; + } + String trimmed = line.trim(); + if (trimmed.isEmpty() || trimmed.startsWith("#")) { + continue; + } + if (!Character.isWhitespace(line.charAt(0))) { + if (inRelease) { + break; + } + inRelease = "release-name:".equals(trimmed); + continue; + } + if (!inRelease) { + continue; + } + String indented = line.stripLeading(); + int colon = indented.indexOf(':'); + if (colon <= 0) { + continue; + } + String key = indented.substring(0, colon).trim(); + if (!key.equalsIgnoreCase(releaseKey)) { + continue; + } + return normalizeYamlValue(indented.substring(colon + 1)); + } + } catch (Exception ignored) { + } + return null; + } + + private static List readAllLines(InputStream stream) throws IOException { + List lines = new ArrayList<>(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + lines.add(line); + } + } + return lines; + } + + private static String normalizeYamlValue(String value) { + if (value == null) { + return ""; + } + String normalized = value.trim(); + int comment = normalized.indexOf('#'); + if (comment >= 0) { + normalized = normalized.substring(0, comment).trim(); + } + if (normalized.length() >= 2) { + if ((normalized.startsWith("'") && normalized.endsWith("'")) || (normalized.startsWith("\"") && normalized.endsWith("\""))) { + normalized = normalized.substring(1, normalized.length() - 1); + } + } + return normalized.replace("''", "'"); + } + + private static String systemLocale() { + Locale locale = Locale.getDefault(); + if (locale == null) { + return "en_us"; + } + return locale.getLanguage().toLowerCase(Locale.ROOT) + "_" + locale.getCountry().toLowerCase(Locale.ROOT); + } + + private static List renderLogoLines(List lines, String release, String version, String buildTime) { + if (lines.isEmpty()) { + return lines; + } + String joined = String.join("\n", lines); + joined = joined.replaceFirst("\\{}", release == null ? "" : release); + joined = joined.replaceFirst("\\{}", version == null ? "" : version); + joined = joined.replaceFirst("\\{}", buildTime == null ? "" : buildTime); + return List.of(joined.split("\n", -1)); + } + + private static String stripMinecraftColors(String line) { + StringBuilder sb = new StringBuilder(line.length()); + for (int i = 0; i < line.length(); i++) { + char c = line.charAt(i); + if (c == '\u00A7' && i + 1 < line.length()) { + i++; + continue; + } + sb.append(c); + } + return sb.toString(); + } + + private static String renderMinecraftColors(String line) { + StringBuilder sb = new StringBuilder(line.length() + 16); + sb.append(ANSI_RESET); + for (int i = 0; i < line.length(); i++) { + char c = line.charAt(i); + if (c == '\u00A7' && i + 1 < line.length()) { + String mapped = mapColorCode(line.charAt(++i)); + if (mapped != null) { + sb.append(mapped); + } + continue; + } + sb.append(c); + } + sb.append(ANSI_RESET); + return sb.toString(); + } + + private static String mapColorCode(char code) { + return switch (Character.toLowerCase(code)) { + case '0' -> ANSI_BLACK; + case '1' -> ANSI_BLUE; + case '2' -> ANSI_GREEN; + case '3' -> ANSI_CYAN; + case '4' -> ANSI_RED; + case '5' -> ANSI_MAGENTA; + case '6' -> ANSI_GOLD; + case '7' -> ANSI_WHITE; + case '8' -> ANSI_BRIGHT_BLACK; + case '9' -> ANSI_BRIGHT_BLUE; + case 'a' -> ANSI_BRIGHT_GREEN; + case 'b' -> ANSI_AQUA; + case 'c' -> ANSI_BRIGHT_RED; + case 'd' -> ANSI_BRIGHT_MAGENTA; + case 'e' -> ANSI_BRIGHT_YELLOW; + case 'f' -> ANSI_BRIGHT_WHITE; + case 'r' -> ANSI_RESET; + default -> null; + }; + } + + private record LocaleSetting(String current, String fallback) { + } + + private static boolean checkEula() throws IOException { + File eulaFile = new File(EULA_FILE); + if (eulaFile.exists()) { + try (BufferedReader reader = new BufferedReader(new FileReader(eulaFile))) { + String line; + while ((line = reader.readLine()) != null) { + if (line.trim().startsWith("eula=")) { + String value = line.trim().substring(5); + if (value.trim().equalsIgnoreCase("true")) { + return true; + } + System.out.println("EULA is currently set to \"" + value.trim() + "\" and must be accepted."); + return promptUserForEula(eulaFile, true); + } + } + } + } + return promptUserForEula(eulaFile, false); + } + + private static boolean promptUserForEula(File eulaFile, boolean isUpdating) throws IOException { + System.out.println("By running this server, you agree to the Minecraft EULA."); + System.out.println("Read the EULA at: " + EULA_URL); + System.out.print("Do you agree to the EULA? (y/N): "); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + String input = reader.readLine(); + if (input != null && input.trim().toLowerCase().startsWith("y")) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(eulaFile))) { + writer.write("# By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).\n"); + writer.write("# Generated via Luminara Fabric launcher\n"); + writer.write("eula=true\n"); + } + System.out.println("EULA has been " + (isUpdating ? "updated" : "accepted") + " and saved."); + return true; + } + System.out.println("EULA not accepted. Server will not start."); + return false; + } + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/launch/Main_Fabric.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/launch/Main_Fabric.java new file mode 100644 index 000000000..73ac25b2f --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/launch/Main_Fabric.java @@ -0,0 +1,50 @@ +package io.izzel.arclight.fabric.launch; + +import io.izzel.arclight.forgeinstaller.FabricInstaller; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +public final class Main_Fabric { + + private Main_Fabric() { + } + + public static void main(String[] args) throws Throwable { + FabricJarMain.configureLoggingDefaults(); + + try { + var install = FabricInstaller.applicationInstall(); + var self = Paths.get(Main_Fabric.class.getProtectionDomain().getCodeSource().getLocation().toURI()).toAbsolutePath(); + + URL[] urls = Stream.concat(Stream.of(self), install.getValue().stream()) + .map(Main_Fabric::toUrl) + .toArray(URL[]::new); + + var classLoader = new URLClassLoader(urls, ClassLoader.getPlatformClassLoader()); + Thread.currentThread().setContextClassLoader(classLoader); + System.setProperty("fabric.addMods", self.toString()); + var mainClass = Class.forName(install.getKey(), false, classLoader); + var main = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); + main.invoke((Object) args); + } catch (Throwable t) { + t.printStackTrace(); + System.err.println("Fail to launch Luminara Fabric server."); + System.exit(-1); + } + } + + private static URL toUrl(Path path) { + try { + return path.toUri().toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/bukkit/CraftHumanEntityMixin_Fabric.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/bukkit/CraftHumanEntityMixin_Fabric.java new file mode 100644 index 000000000..c959b1478 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/bukkit/CraftHumanEntityMixin_Fabric.java @@ -0,0 +1,21 @@ +package io.izzel.arclight.fabric.mixin.bukkit; + +import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; +import org.bukkit.permissions.PermissibleBase; +import org.bukkit.permissions.ServerOperator; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = CraftHumanEntity.class, remap = false) +public abstract class CraftHumanEntityMixin_Fabric { + + @Redirect( + method = "", + at = @At(value = "NEW", target = "(Lorg/bukkit/permissions/ServerOperator;)Lorg/bukkit/permissions/PermissibleBase;"), + require = 0 + ) + private PermissibleBase luminara$fabricPermissible(ServerOperator opable) { + return new PermissibleBase(opable); + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/bukkit/VanillaCommandWrapperMixin_Fabric.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/bukkit/VanillaCommandWrapperMixin_Fabric.java new file mode 100644 index 000000000..79fecc864 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/bukkit/VanillaCommandWrapperMixin_Fabric.java @@ -0,0 +1,81 @@ +package io.izzel.arclight.fabric.mixin.bukkit; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import org.bukkit.craftbukkit.v.command.VanillaCommandWrapper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.lang.reflect.Method; +import java.util.Arrays; + +@Mixin(value = VanillaCommandWrapper.class, remap = false) +public abstract class VanillaCommandWrapperMixin_Fabric { + + @Unique + private static volatile Method luminara$prefixed3; + @Unique + private static volatile Method luminara$prefixed2; + + @Unique + private static int luminara$invokePrefixed(Commands commands, CommandSourceStack source, String parsed, String full) { + try { + Method m3 = luminara$prefixed3; + if (m3 == null) { + m3 = commands.getClass().getMethod("performPrefixedCommand", CommandSourceStack.class, String.class, String.class); + m3.setAccessible(true); + luminara$prefixed3 = m3; + } + return (int) m3.invoke(commands, source, parsed, full); + } catch (NoSuchMethodException ignored) { + // fall through to 2-arg lookup + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to invoke 3-arg performPrefixedCommand", e); + } + + try { + Method m2 = luminara$prefixed2; + if (m2 == null) { + m2 = commands.getClass().getMethod("performPrefixedCommand", CommandSourceStack.class, String.class); + m2.setAccessible(true); + luminara$prefixed2 = m2; + } + return (int) m2.invoke(commands, source, parsed); + } catch (NoSuchMethodException ignored) { + // scan for obfuscated variant with same shape + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to invoke 2-arg performPrefixedCommand", e); + } + + Method fallback = Arrays.stream(commands.getClass().getMethods()) + .filter(it -> it.getReturnType() == int.class) + .filter(it -> it.getParameterCount() == 2) + .filter(it -> it.getParameterTypes()[0] == CommandSourceStack.class) + .filter(it -> it.getParameterTypes()[1] == String.class) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Cannot find compatible command execution method on " + commands.getClass().getName())); + + try { + fallback.setAccessible(true); + luminara$prefixed2 = fallback; + return (int) fallback.invoke(commands, source, parsed); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to invoke fallback command execution method: " + fallback, e); + } + } + + @Redirect( + method = "execute", + remap = false, + at = @At( + value = "INVOKE", + remap = false, + target = "Lnet/minecraft/class_2170;performPrefixedCommand(Lnet/minecraft/class_2168;Ljava/lang/String;Ljava/lang/String;)I" + ) + ) + private int luminara$fabricCompatPrefixed(Commands commands, CommandSourceStack source, String parsed, String full) { + return luminara$invokePrefixed(commands, source, parsed, full); + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/core/world/item/ItemStackMixin_Fabric.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/core/world/item/ItemStackMixin_Fabric.java new file mode 100644 index 000000000..e4eba4db6 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mixin/core/world/item/ItemStackMixin_Fabric.java @@ -0,0 +1,29 @@ +package io.izzel.arclight.fabric.mixin.core.world.item; + +import io.izzel.arclight.common.bridge.core.item.ItemStackBridge; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(ItemStack.class) +public abstract class ItemStackMixin_Fabric implements ItemStackBridge { + + @Unique + private CompoundTag arclight$forgeCaps; + + @Override + public void bridge$convertStack(int version) { + // Fabric has no Forge data fixer path for forgeCaps. + } + + @Override + public CompoundTag bridge$getForgeCaps() { + return this.arclight$forgeCaps; + } + + @Override + public void bridge$setForgeCaps(CompoundTag caps) { + this.arclight$forgeCaps = caps; + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricArclightServer.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricArclightServer.java new file mode 100644 index 000000000..bbc589e20 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricArclightServer.java @@ -0,0 +1,21 @@ +package io.izzel.arclight.fabric.mod; + +import io.izzel.arclight.api.ArclightServer; +import io.izzel.arclight.api.TickingTracker; +import net.minecraftforge.eventbus.api.IEventBus; +import org.bukkit.plugin.Plugin; + +public class FabricArclightServer implements ArclightServer { + + private final TickingTracker tickingTracker = new FabricTickingTracker(); + + @Override + public void registerForgeEvent(Plugin plugin, IEventBus eventBus, Object target) { + // Fabric has no Forge event bus; keep this as a no-op for plugin compatibility. + } + + @Override + public TickingTracker getTickingTracker() { + return this.tickingTracker; + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricCommonImpl.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricCommonImpl.java new file mode 100644 index 000000000..0f5318608 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricCommonImpl.java @@ -0,0 +1,12 @@ +package io.izzel.arclight.fabric.mod; + +import io.izzel.arclight.common.mod.ArclightCommon; +import net.fabricmc.loader.api.FabricLoader; + +public class FabricCommonImpl implements ArclightCommon.Api { + + @Override + public boolean isModLoaded(String modid) { + return FabricLoader.getInstance().isModLoaded(modid); + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricMixinPlugin.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricMixinPlugin.java new file mode 100644 index 000000000..7929385a5 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricMixinPlugin.java @@ -0,0 +1,15 @@ +package io.izzel.arclight.fabric.mod; + +import io.izzel.arclight.common.mod.ArclightCommon; +import io.izzel.arclight.common.mod.ArclightMixinPlugin; +import io.izzel.arclight.mixin.MixinTools; + +public class FabricMixinPlugin extends ArclightMixinPlugin { + + @Override + public void onLoad(String mixinPackage) { + ArclightCommon.setInstance(new FabricCommonImpl()); + MixinTools.setup(); + super.onLoad(mixinPackage); + } +} diff --git a/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricTickingTracker.java b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricTickingTracker.java new file mode 100644 index 000000000..19f9052a5 --- /dev/null +++ b/arclight-fabric/src/main/java/io/izzel/arclight/fabric/mod/FabricTickingTracker.java @@ -0,0 +1,34 @@ +package io.izzel.arclight.fabric.mod; + +import io.izzel.arclight.api.TickingTracker; +import org.bukkit.block.Block; +import org.bukkit.block.TileState; +import org.bukkit.entity.Entity; +import org.jetbrains.annotations.Nullable; + +public final class FabricTickingTracker implements TickingTracker { + + @Nullable + @Override + public Object getTickingSource() { + return null; + } + + @Nullable + @Override + public Entity getTickingEntity() { + return null; + } + + @Nullable + @Override + public Block getTickingBlock() { + return null; + } + + @Nullable + @Override + public TileState getTickingBlockEntity() { + return null; + } +} diff --git a/arclight-fabric/src/main/resources/arclight-log4j2-detailed.xml b/arclight-fabric/src/main/resources/arclight-log4j2-detailed.xml new file mode 100644 index 000000000..6bfd60ee3 --- /dev/null +++ b/arclight-fabric/src/main/resources/arclight-log4j2-detailed.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/arclight-fabric/src/main/resources/arclight-log4j2.xml b/arclight-fabric/src/main/resources/arclight-log4j2.xml new file mode 100644 index 000000000..0ca155d5b --- /dev/null +++ b/arclight-fabric/src/main/resources/arclight-log4j2.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/arclight-fabric/src/main/resources/fabric.mod.json b/arclight-fabric/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..cd2456dda --- /dev/null +++ b/arclight-fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,28 @@ +{ + "id": "luminara", + "version": "${version}", + "schemaVersion": 1, + "name": "Luminara", + "authors": [ + "Luminara Team" + ], + "description": "Luminara bukkit layer for Fabric", + "license": "GNU GENERAL PUBLIC LICENSE Version 3", + "environment": "server", + "accessWidener": "luminara.accesswidener", + "mixins": [ + "mixins.arclight.fabric.json", + "mixins.arclight.core.json", + "mixins.arclight.bukkit.json", + "mixins.arclight.compat.json" + ], + "depends": { + "fabricloader": ">=0.15", + "minecraft": "1.20.1" + }, + "entrypoints": { + "main": [ + "io.izzel.arclight.fabric.ArclightModEntrypoint" + ] + } +} diff --git a/arclight-fabric/src/main/resources/luminara.accesswidener b/arclight-fabric/src/main/resources/luminara.accesswidener new file mode 100644 index 000000000..bd6ce1938 --- /dev/null +++ b/arclight-fabric/src/main/resources/luminara.accesswidener @@ -0,0 +1,633 @@ +accessWidener v2 named + +accessible class net/minecraft/commands/synchronization/ArgumentTypes$Entry +accessible class net/minecraft/server/MinecraftServer$ReloadableResources +accessible class net/minecraft/server/MinecraftServer$TimeProfiler +accessible class net/minecraft/server/commands/TeleportCommand$LookAt +accessible class net/minecraft/server/dedicated/DedicatedServerProperties$WorldDimensionData +accessible class net/minecraft/server/level/ChunkMap$TrackedEntity +accessible class net/minecraft/server/level/DistanceManager$ChunkTicketTracker +accessible class net/minecraft/server/level/DistanceManager$FixedPlayerDistanceChunkTracker +accessible class net/minecraft/server/level/DistanceManager$PlayerTicketTracker +accessible class net/minecraft/server/network/ServerGamePacketListenerImpl$EntityInteraction +accessible class net/minecraft/server/network/ServerLoginPacketListenerImpl$State +accessible class net/minecraft/world/entity/Interaction$PlayerAction +accessible class net/minecraft/world/entity/animal/Bee$BeePollinateGoal +accessible class net/minecraft/world/entity/monster/Guardian$GuardianAttackGoal +accessible class net/minecraft/world/entity/monster/SpellcasterIllager$IllagerSpell +accessible class net/minecraft/world/entity/monster/SpellcasterIllager$SpellcasterUseSpellGoal +accessible class net/minecraft/world/entity/projectile/FishingHook$FishHookState +accessible class net/minecraft/world/entity/raid/Raider$HoldGroundAttackGoal +accessible class net/minecraft/world/item/ItemCooldowns$CooldownInstance +accessible class net/minecraft/world/item/crafting/Ingredient$ItemValue +accessible class net/minecraft/world/item/crafting/Ingredient$Value +accessible class net/minecraft/world/level/biome/Biome$ClimateSettings +accessible class net/minecraft/world/level/block/ChestBlock$2$1 +accessible class net/minecraft/world/level/block/ComposterBlock$EmptyContainer +accessible class net/minecraft/world/level/block/ComposterBlock$InputContainer +accessible class net/minecraft/world/level/block/ComposterBlock$OutputContainer +accessible class net/minecraft/world/level/block/entity/BeehiveBlockEntity$BeeData +accessible class net/minecraft/world/level/block/entity/LecternBlockEntity$1 +accessible class net/minecraft/world/level/entity/PersistentEntitySectionManager$ChunkLoadStatus +accessible class net/minecraft/world/phys/shapes/IndexMerger +accessible field net/minecraft/ChatFormatting code C +accessible field net/minecraft/advancements/AdvancementList advancements Ljava/util/Map; +accessible field net/minecraft/commands/CommandSourceStack source Lnet/minecraft/commands/CommandSource; +accessible field net/minecraft/network/Connection address Ljava/net/SocketAddress; +accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; +accessible field net/minecraft/network/chat/TextColor name Ljava/lang/String; +accessible field net/minecraft/network/protocol/game/ClientboundBlockUpdatePacket blockState Lnet/minecraft/world/level/block/state/BlockState; +accessible field net/minecraft/network/protocol/game/ClientboundSetDefaultSpawnPositionPacket pos Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/network/protocol/game/ClientboundTabListPacket footer Lnet/minecraft/network/chat/Component; +accessible field net/minecraft/network/protocol/game/ClientboundTabListPacket header Lnet/minecraft/network/chat/Component; +accessible field net/minecraft/network/protocol/game/ServerboundCustomPayloadPacket data Lnet/minecraft/network/FriendlyByteBuf; +accessible field net/minecraft/network/protocol/game/ServerboundCustomPayloadPacket identifier Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/network/protocol/game/ServerboundMovePlayerPacket hasPos Z +accessible field net/minecraft/network/protocol/game/ServerboundMovePlayerPacket hasRot Z +accessible field net/minecraft/network/protocol/game/ServerboundMovePlayerPacket x D +accessible field net/minecraft/network/protocol/game/ServerboundMovePlayerPacket xRot F +accessible field net/minecraft/network/protocol/game/ServerboundMovePlayerPacket y D +accessible field net/minecraft/network/protocol/game/ServerboundMovePlayerPacket yRot F +accessible field net/minecraft/network/protocol/game/ServerboundMovePlayerPacket z D +accessible field net/minecraft/network/protocol/game/ServerboundResourcePackPacket action Lnet/minecraft/network/protocol/game/ServerboundResourcePackPacket$Action; +accessible field net/minecraft/network/protocol/handshake/ClientIntentionPacket hostName Ljava/lang/String; +accessible field net/minecraft/network/protocol/handshake/ClientIntentionPacket port I +accessible field net/minecraft/server/MinecraftServer LOGGER Lorg/slf4j/Logger; +accessible field net/minecraft/server/MinecraftServer executor Ljava/util/concurrent/Executor; +accessible field net/minecraft/server/MinecraftServer fixerUpper Lcom/mojang/datafixers/DataFixer; +accessible field net/minecraft/server/MinecraftServer playerDataStorage Lnet/minecraft/world/level/storage/PlayerDataStorage; +accessible field net/minecraft/server/MinecraftServer progressListenerFactory Lnet/minecraft/server/level/progress/ChunkProgressListenerFactory; +accessible field net/minecraft/server/MinecraftServer resources Lnet/minecraft/server/MinecraftServer$ReloadableResources; +accessible field net/minecraft/server/MinecraftServer serverThread Ljava/lang/Thread; +accessible field net/minecraft/server/MinecraftServer storageSource Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess; +accessible field net/minecraft/server/MinecraftServer worldData Lnet/minecraft/world/level/storage/WorldData; +accessible field net/minecraft/server/ReloadableServerResources commands Lnet/minecraft/commands/Commands; +accessible field net/minecraft/server/ServerAdvancementManager GSON Lcom/google/gson/Gson; +accessible field net/minecraft/server/ServerAdvancementManager advancements Lnet/minecraft/advancements/AdvancementList; +accessible field net/minecraft/server/dedicated/DedicatedServer rconConsoleSource Lnet/minecraft/server/rcon/RconConsoleSource; +accessible field net/minecraft/server/dedicated/DedicatedServer settings Lnet/minecraft/server/dedicated/DedicatedServerSettings; +accessible field net/minecraft/server/dedicated/Settings properties Ljava/util/Properties; +accessible field net/minecraft/server/level/ChunkHolder oldTicketLevel I +accessible field net/minecraft/server/level/ChunkHolder playerProvider Lnet/minecraft/server/level/ChunkHolder$PlayerProvider; +accessible field net/minecraft/server/level/ChunkMap distanceManager Lnet/minecraft/server/level/ChunkMap$DistanceManager; +accessible field net/minecraft/server/level/ChunkMap entityMap Lit/unimi/dsi/fastutil/ints/Int2ObjectMap; +accessible field net/minecraft/server/level/ChunkMap generator Lnet/minecraft/world/level/chunk/ChunkGenerator; +accessible field net/minecraft/server/level/ChunkMap level Lnet/minecraft/server/level/ServerLevel; +accessible field net/minecraft/server/level/ChunkMap progressListener Lnet/minecraft/server/level/progress/ChunkProgressListener; +accessible field net/minecraft/server/level/ChunkMap toDrop Lit/unimi/dsi/fastutil/longs/LongSet; +accessible field net/minecraft/server/level/ChunkMap updatingChunkMap Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/server/level/ChunkMap visibleChunkMap Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/server/level/ChunkMap$TrackedEntity seenBy Ljava/util/Set; +accessible field net/minecraft/server/level/DistanceManager tickets Lit/unimi/dsi/fastutil/longs/Long2ObjectOpenHashMap; +accessible field net/minecraft/server/level/ServerBossEvent visible Z +accessible field net/minecraft/server/level/ServerChunkCache spawnEnemies Z +accessible field net/minecraft/server/level/ServerChunkCache spawnFriendlies Z +accessible field net/minecraft/server/level/ServerLevel entityManager Lnet/minecraft/world/level/entity/PersistentEntitySectionManager; +accessible field net/minecraft/server/level/ServerLevel serverLevelData Lnet/minecraft/world/level/storage/ServerLevelData; +accessible field net/minecraft/server/level/ServerPlayer isChangingDimension Z +accessible field net/minecraft/server/level/ServerPlayer lastSentExp I +accessible field net/minecraft/server/level/ServerPlayer spawnInvulnerableTime I +accessible field net/minecraft/server/level/Ticket key Ljava/lang/Object; +accessible field net/minecraft/server/level/TicketType timeout J +accessible field net/minecraft/server/network/ServerLoginPacketListenerImpl connection Lnet/minecraft/network/Connection; +accessible field net/minecraft/server/packs/repository/Pack resources Lnet/minecraft/server/packs/repository/Pack$ResourcesSupplier; +accessible field net/minecraft/server/players/PlayerList maxPlayers I +accessible field net/minecraft/server/players/PlayerList playerIo Lnet/minecraft/world/level/storage/PlayerDataStorage; +accessible field net/minecraft/server/players/PlayerList players Ljava/util/List; +accessible field net/minecraft/stats/RecipeBook known Ljava/util/Set; +accessible field net/minecraft/util/datafix/fixes/ItemIdFix ITEM_NAMES Lit/unimi/dsi/fastutil/ints/Int2ObjectMap; +accessible field net/minecraft/util/datafix/fixes/ItemSpawnEggFix ID_TO_ENTITY [Ljava/lang/String; +accessible field net/minecraft/world/BossEvent color Lnet/minecraft/world/BossEvent$BossBarColor; +accessible field net/minecraft/world/BossEvent name Lnet/minecraft/network/chat/Component; +accessible field net/minecraft/world/BossEvent overlay Lnet/minecraft/world/BossEvent$BossBarOverlay; +accessible field net/minecraft/world/CompoundContainer container1 Lnet/minecraft/world/Container; +accessible field net/minecraft/world/CompoundContainer container2 Lnet/minecraft/world/Container; +accessible field net/minecraft/world/LockCode key Ljava/lang/String; +accessible field net/minecraft/world/SimpleContainer items Lnet/minecraft/core/NonNullList; +accessible field net/minecraft/world/entity/AreaEffectCloud durationOnUse I +accessible field net/minecraft/world/entity/AreaEffectCloud effects Ljava/util/List; +accessible field net/minecraft/world/entity/AreaEffectCloud potion Lnet/minecraft/world/item/alchemy/Potion; +accessible field net/minecraft/world/entity/AreaEffectCloud radiusOnUse F +accessible field net/minecraft/world/entity/AreaEffectCloud radiusPerTick F +accessible field net/minecraft/world/entity/AreaEffectCloud reapplicationDelay I +accessible field net/minecraft/world/entity/AreaEffectCloud waitTime I +accessible field net/minecraft/world/entity/Display$TextDisplay DATA_BACKGROUND_COLOR_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/Display$TextDisplay DATA_LINE_WIDTH_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/Entity boardingCooldown I +accessible field net/minecraft/world/entity/Entity hasVisualFire Z +accessible field net/minecraft/world/entity/Entity onGround Z +accessible field net/minecraft/world/entity/Entity passengers Lcom/google/common/collect/ImmutableList; +accessible field net/minecraft/world/entity/Entity portalCooldown I +accessible field net/minecraft/world/entity/Entity remainingFireTicks I +accessible field net/minecraft/world/entity/Entity wasTouchingWater Z +accessible field net/minecraft/world/entity/ExperienceOrb value I +accessible field net/minecraft/world/entity/Interaction attack Lnet/minecraft/world/entity/Interaction$PlayerAction; +accessible field net/minecraft/world/entity/Interaction interaction Lnet/minecraft/world/entity/Interaction$PlayerAction; +accessible field net/minecraft/world/entity/ItemBasedSteering boostTime I +accessible field net/minecraft/world/entity/ItemBasedSteering boosting Z +accessible field net/minecraft/world/entity/LightningBolt visualOnly Z +accessible field net/minecraft/world/entity/LivingEntity DATA_ARROW_COUNT_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/LivingEntity DATA_HEALTH_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/LivingEntity activeEffects Ljava/util/Map; +accessible field net/minecraft/world/entity/LivingEntity combatTracker Lnet/minecraft/world/damagesource/CombatTracker; +accessible field net/minecraft/world/entity/LivingEntity effectsDirty Z +accessible field net/minecraft/world/entity/LivingEntity invulnerableDuration I +accessible field net/minecraft/world/entity/LivingEntity lastHurt F +accessible field net/minecraft/world/entity/LivingEntity lastHurtByMob Lnet/minecraft/world/entity/LivingEntity; +accessible field net/minecraft/world/entity/LivingEntity lastHurtByMobTimestamp I +accessible field net/minecraft/world/entity/LivingEntity lastHurtByPlayer Lnet/minecraft/world/entity/player/Player; +accessible field net/minecraft/world/entity/Mob armorDropChances [F +accessible field net/minecraft/world/entity/Mob goalSelector Lnet/minecraft/world/entity/ai/goal/GoalSelector; +accessible field net/minecraft/world/entity/Mob handDropChances [F +accessible field net/minecraft/world/entity/Mob lootTable Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/world/entity/Mob lootTableSeed J +accessible field net/minecraft/world/entity/Mob persistenceRequired Z +accessible field net/minecraft/world/entity/Mob targetSelector Lnet/minecraft/world/entity/ai/goal/GoalSelector; +accessible field net/minecraft/world/entity/ai/attributes/RangedAttribute maxValue D +accessible field net/minecraft/world/entity/animal/Animal inLove I +accessible field net/minecraft/world/entity/animal/Animal loveCause Ljava/util/UUID; +accessible field net/minecraft/world/entity/animal/Bee hivePos Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/entity/animal/Bee stayOutOfHiveCountdown I +accessible field net/minecraft/world/entity/animal/Fox DATA_TRUSTED_ID_0 Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/animal/Fox DATA_TRUSTED_ID_1 Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/animal/Pig steering Lnet/minecraft/world/entity/ItemBasedSteering; +accessible field net/minecraft/world/entity/animal/allay/Allay duplicationCooldown J +accessible field net/minecraft/world/entity/animal/allay/Allay jukeboxPos Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/entity/animal/frog/Tadpole age I +accessible field net/minecraft/world/entity/animal/goat/Goat DATA_HAS_LEFT_HORN Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/animal/goat/Goat DATA_HAS_RIGHT_HORN Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/animal/horse/AbstractHorse inventory Lnet/minecraft/world/SimpleContainer; +accessible field net/minecraft/world/entity/animal/horse/SkeletonHorse trapTime I +accessible field net/minecraft/world/entity/boss/enderdragon/EnderDragon subEntities [Lnet/minecraft/world/entity/boss/EnderDragonPart; +accessible field net/minecraft/world/entity/boss/wither/WitherBoss bossEvent Lnet/minecraft/server/level/ServerBossEvent; +accessible field net/minecraft/world/entity/decoration/ArmorStand bodyPose Lnet/minecraft/core/Rotations; +accessible field net/minecraft/world/entity/decoration/ArmorStand disabledSlots I +accessible field net/minecraft/world/entity/decoration/ArmorStand headPose Lnet/minecraft/core/Rotations; +accessible field net/minecraft/world/entity/decoration/ArmorStand leftArmPose Lnet/minecraft/core/Rotations; +accessible field net/minecraft/world/entity/decoration/ArmorStand leftLegPose Lnet/minecraft/core/Rotations; +accessible field net/minecraft/world/entity/decoration/ArmorStand rightArmPose Lnet/minecraft/core/Rotations; +accessible field net/minecraft/world/entity/decoration/ArmorStand rightLegPose Lnet/minecraft/core/Rotations; +accessible field net/minecraft/world/entity/decoration/HangingEntity pos Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/entity/decoration/ItemFrame DATA_ITEM Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/decoration/ItemFrame DATA_ROTATION Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/decoration/ItemFrame dropChance F +accessible field net/minecraft/world/entity/decoration/ItemFrame fixed Z +accessible field net/minecraft/world/entity/item/FallingBlockEntity cancelDrop Z +accessible field net/minecraft/world/entity/item/FallingBlockEntity fallDamageMax I +accessible field net/minecraft/world/entity/item/FallingBlockEntity fallDamagePerDistance F +accessible field net/minecraft/world/entity/item/FallingBlockEntity hurtEntities Z +accessible field net/minecraft/world/entity/item/ItemEntity age I +accessible field net/minecraft/world/entity/item/ItemEntity pickupDelay I +accessible field net/minecraft/world/entity/item/ItemEntity target Ljava/util/UUID; +accessible field net/minecraft/world/entity/item/ItemEntity thrower Ljava/util/UUID; +accessible field net/minecraft/world/entity/item/PrimedTnt owner Lnet/minecraft/world/entity/LivingEntity; +accessible field net/minecraft/world/entity/monster/Creeper explosionRadius I +accessible field net/minecraft/world/entity/monster/Creeper maxSwell I +accessible field net/minecraft/world/entity/monster/Creeper swell I +accessible field net/minecraft/world/entity/monster/Drowned groundNavigation Lnet/minecraft/world/entity/ai/navigation/GroundPathNavigation; +accessible field net/minecraft/world/entity/monster/Drowned waterNavigation Lnet/minecraft/world/entity/ai/navigation/WaterBoundPathNavigation; +accessible field net/minecraft/world/entity/monster/Guardian randomStrollGoal Lnet/minecraft/world/entity/ai/goal/RandomStrollGoal; +accessible field net/minecraft/world/entity/monster/Guardian$GuardianAttackGoal attackTime I +accessible field net/minecraft/world/entity/monster/Pillager inventory Lnet/minecraft/world/SimpleContainer; +accessible field net/minecraft/world/entity/monster/Shulker DATA_COLOR_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/monster/Skeleton DATA_STRAY_CONVERSION_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/monster/Skeleton conversionTime I +accessible field net/minecraft/world/entity/monster/Strider steering Lnet/minecraft/world/entity/ItemBasedSteering; +accessible field net/minecraft/world/entity/monster/Vex hasLimitedLife Z +accessible field net/minecraft/world/entity/monster/Vex limitedLifeTicks I +accessible field net/minecraft/world/entity/monster/Vindicator isJohnny Z +accessible field net/minecraft/world/entity/monster/Zombie DATA_DROWNED_CONVERSION_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/monster/Zombie conversionTime I +accessible field net/minecraft/world/entity/monster/ZombieVillager DATA_CONVERTING_ID Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/monster/ZombieVillager conversionStarter Ljava/util/UUID; +accessible field net/minecraft/world/entity/monster/ZombieVillager villagerConversionTime I +accessible field net/minecraft/world/entity/monster/hoglin/Hoglin cannotBeHunted Z +accessible field net/minecraft/world/entity/monster/hoglin/Hoglin timeInOverworld I +accessible field net/minecraft/world/entity/monster/piglin/AbstractPiglin timeInOverworld I +accessible field net/minecraft/world/entity/monster/piglin/Piglin cannotHunt Z +accessible field net/minecraft/world/entity/monster/piglin/Piglin inventory Lnet/minecraft/world/SimpleContainer; +accessible field net/minecraft/world/entity/player/Abilities flyingSpeed F +accessible field net/minecraft/world/entity/player/Abilities walkingSpeed F +accessible field net/minecraft/world/entity/player/Player enchantmentSeed I +accessible field net/minecraft/world/entity/player/Player sleepCounter I +accessible field net/minecraft/world/entity/projectile/AbstractArrow inGround Z +accessible field net/minecraft/world/entity/projectile/AbstractArrow knockback I +accessible field net/minecraft/world/entity/projectile/AbstractArrow life I +accessible field net/minecraft/world/entity/projectile/Arrow effects Ljava/util/Set; +accessible field net/minecraft/world/entity/projectile/Arrow potion Lnet/minecraft/world/item/alchemy/Potion; +accessible field net/minecraft/world/entity/projectile/EyeOfEnder life I +accessible field net/minecraft/world/entity/projectile/EyeOfEnder surviveAfterDeath Z +accessible field net/minecraft/world/entity/projectile/EyeOfEnder tx D +accessible field net/minecraft/world/entity/projectile/EyeOfEnder ty D +accessible field net/minecraft/world/entity/projectile/EyeOfEnder tz D +accessible field net/minecraft/world/entity/projectile/FireworkRocketEntity DATA_ID_FIREWORKS_ITEM Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/projectile/FireworkRocketEntity DATA_SHOT_AT_ANGLE Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/projectile/FireworkRocketEntity attachedToEntity Lnet/minecraft/world/entity/LivingEntity; +accessible field net/minecraft/world/entity/projectile/FireworkRocketEntity life I +accessible field net/minecraft/world/entity/projectile/FireworkRocketEntity lifetime I +accessible field net/minecraft/world/entity/projectile/FishingHook DATA_HOOKED_ENTITY Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/projectile/FishingHook currentState Lnet/minecraft/world/entity/projectile/FishingHook$FishHookState; +accessible field net/minecraft/world/entity/projectile/FishingHook hookedIn Lnet/minecraft/world/entity/Entity; +accessible field net/minecraft/world/entity/projectile/LargeFireball explosionPower I +accessible field net/minecraft/world/entity/projectile/SpectralArrow duration I +accessible field net/minecraft/world/entity/projectile/ThrownTrident tridentItem Lnet/minecraft/world/item/ItemStack; +accessible field net/minecraft/world/entity/raid/Raid badOmenLevel I +accessible field net/minecraft/world/entity/raid/Raid heroesOfTheVillage Ljava/util/Set; +accessible field net/minecraft/world/entity/raid/Raid numGroups I +accessible field net/minecraft/world/entity/raid/Raid ticksActive J +accessible field net/minecraft/world/entity/raid/Raid totalHealth F +accessible field net/minecraft/world/entity/raid/Raids raidMap Ljava/util/Map; +accessible field net/minecraft/world/entity/vehicle/AbstractMinecartContainer lootTable Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/world/entity/vehicle/AbstractMinecartContainer lootTableSeed J +accessible field net/minecraft/world/entity/vehicle/Boat status Lnet/minecraft/world/entity/vehicle/Boat$Status; +accessible field net/minecraft/world/entity/vehicle/MinecartCommandBlock DATA_ID_COMMAND_NAME Lnet/minecraft/network/syncher/EntityDataAccessor; +accessible field net/minecraft/world/entity/vehicle/MinecartFurnace fuel I +accessible field net/minecraft/world/entity/vehicle/MinecartTNT fuse I +accessible field net/minecraft/world/flag/FeatureFlag mask J +accessible field net/minecraft/world/flag/FeatureFlag universe Lnet/minecraft/world/flag/FeatureFlagUniverse; +accessible field net/minecraft/world/flag/FeatureFlagRegistry names Ljava/util/Map; +accessible field net/minecraft/world/food/FoodData exhaustionLevel F +accessible field net/minecraft/world/food/FoodData foodLevel I +accessible field net/minecraft/world/food/FoodData saturationLevel F +accessible field net/minecraft/world/inventory/AbstractContainerMenu lastSlots Lnet/minecraft/core/NonNullList; +accessible field net/minecraft/world/inventory/AbstractContainerMenu remoteSlots Lnet/minecraft/core/NonNullList; +accessible field net/minecraft/world/inventory/AbstractContainerMenu slots Lnet/minecraft/core/NonNullList; +accessible field net/minecraft/world/inventory/AnvilMenu cost Lnet/minecraft/world/inventory/DataSlot; +accessible field net/minecraft/world/inventory/AnvilMenu itemName Ljava/lang/String; +accessible field net/minecraft/world/inventory/AnvilMenu repairItemCountCost I +accessible field net/minecraft/world/inventory/CraftingMenu access Lnet/minecraft/world/inventory/ContainerLevelAccess; +accessible field net/minecraft/world/inventory/CraftingMenu craftSlots Lnet/minecraft/world/inventory/CraftingContainer; +accessible field net/minecraft/world/inventory/CraftingMenu resultSlots Lnet/minecraft/world/inventory/ResultContainer; +accessible field net/minecraft/world/inventory/DispenserMenu dispenser Lnet/minecraft/world/Container; +accessible field net/minecraft/world/inventory/MerchantContainer selectionHint I +accessible field net/minecraft/world/inventory/Slot slot I +accessible field net/minecraft/world/item/ItemCooldowns cooldowns Ljava/util/Map; +accessible field net/minecraft/world/item/ItemCooldowns tickCount I +accessible field net/minecraft/world/item/ItemCooldowns$CooldownInstance endTime I +accessible field net/minecraft/world/item/StandingAndWallBlockItem wallBlock Lnet/minecraft/world/level/block/Block; +accessible field net/minecraft/world/item/crafting/Ingredient itemStacks [Lnet/minecraft/world/item/ItemStack; +accessible field net/minecraft/world/item/crafting/RecipeManager recipes Ljava/util/Map; +accessible field net/minecraft/world/item/trading/MerchantOffer baseCostA Lnet/minecraft/world/item/ItemStack; +accessible field net/minecraft/world/item/trading/MerchantOffer costB Lnet/minecraft/world/item/ItemStack; +accessible field net/minecraft/world/item/trading/MerchantOffer demand I +accessible field net/minecraft/world/item/trading/MerchantOffer maxUses I +accessible field net/minecraft/world/item/trading/MerchantOffer priceMultiplier F +accessible field net/minecraft/world/item/trading/MerchantOffer result Lnet/minecraft/world/item/ItemStack; +accessible field net/minecraft/world/item/trading/MerchantOffer rewardExp Z +accessible field net/minecraft/world/item/trading/MerchantOffer specialPriceDiff I +accessible field net/minecraft/world/item/trading/MerchantOffer uses I +accessible field net/minecraft/world/item/trading/MerchantOffer xp I +accessible field net/minecraft/world/level/BaseSpawner maxNearbyEntities I +accessible field net/minecraft/world/level/BaseSpawner maxSpawnDelay I +accessible field net/minecraft/world/level/BaseSpawner minSpawnDelay I +accessible field net/minecraft/world/level/BaseSpawner nextSpawnData Lnet/minecraft/world/level/SpawnData; +accessible field net/minecraft/world/level/BaseSpawner requiredPlayerRange I +accessible field net/minecraft/world/level/BaseSpawner spawnCount I +accessible field net/minecraft/world/level/BaseSpawner spawnDelay I +accessible field net/minecraft/world/level/BaseSpawner spawnPotentials Lnet/minecraft/util/random/SimpleWeightedRandomList; +accessible field net/minecraft/world/level/BaseSpawner spawnRange I +accessible field net/minecraft/world/level/Explosion source Lnet/minecraft/world/entity/Entity; +accessible field net/minecraft/world/level/Level dimension Lnet/minecraft/resources/ResourceKey; +accessible field net/minecraft/world/level/Level levelData Lnet/minecraft/world/level/storage/WritableLevelData; +accessible field net/minecraft/world/level/Level rainLevel F +accessible field net/minecraft/world/level/Level thread Ljava/lang/Thread; +accessible field net/minecraft/world/level/Level thunderLevel F +accessible field net/minecraft/world/level/LevelSettings hardcore Z +accessible field net/minecraft/world/level/LevelSettings levelName Ljava/lang/String; +accessible field net/minecraft/world/level/StructureManager level Lnet/minecraft/world/level/LevelAccessor; +accessible field net/minecraft/world/level/block/DispenserBlock DISPENSER_REGISTRY Ljava/util/Map; +accessible field net/minecraft/world/level/block/FireBlock igniteOdds Lit/unimi/dsi/fastutil/objects/Object2IntMap; +accessible field net/minecraft/world/level/block/SculkSpreader$ChargeCursor charge I +accessible field net/minecraft/world/level/block/SculkSpreader$ChargeCursor pos Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/level/block/ShulkerBoxBlock color Lnet/minecraft/world/item/DyeColor; +accessible field net/minecraft/world/level/block/SoundType breakSound Lnet/minecraft/sounds/SoundEvent; +accessible field net/minecraft/world/level/block/SoundType hitSound Lnet/minecraft/sounds/SoundEvent; +accessible field net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity cookingProgress I +accessible field net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity cookingTotalTime I +accessible field net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity litTime I +accessible field net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity recipesUsed Lit/unimi/dsi/fastutil/objects/Object2IntOpenHashMap; +accessible field net/minecraft/world/level/block/entity/BannerBlockEntity baseColor Lnet/minecraft/world/item/DyeColor; +accessible field net/minecraft/world/level/block/entity/BannerBlockEntity itemPatterns Lnet/minecraft/nbt/ListTag; +accessible field net/minecraft/world/level/block/entity/BarrelBlockEntity openersCounter Lnet/minecraft/world/level/block/entity/ContainerOpenersCounter; +accessible field net/minecraft/world/level/block/entity/BaseContainerBlockEntity lockKey Lnet/minecraft/world/LockCode; +accessible field net/minecraft/world/level/block/entity/BaseContainerBlockEntity name Lnet/minecraft/network/chat/Component; +accessible field net/minecraft/world/level/block/entity/BeaconBlockEntity levels I +accessible field net/minecraft/world/level/block/entity/BeaconBlockEntity lockKey Lnet/minecraft/world/LockCode; +accessible field net/minecraft/world/level/block/entity/BeaconBlockEntity name Lnet/minecraft/network/chat/Component; +accessible field net/minecraft/world/level/block/entity/BeaconBlockEntity primaryPower Lnet/minecraft/world/effect/MobEffect; +accessible field net/minecraft/world/level/block/entity/BeaconBlockEntity secondaryPower Lnet/minecraft/world/effect/MobEffect; +accessible field net/minecraft/world/level/block/entity/BedBlockEntity color Lnet/minecraft/world/item/DyeColor; +accessible field net/minecraft/world/level/block/entity/BeehiveBlockEntity savedFlowerPos Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/level/block/entity/BeehiveBlockEntity$BeeData entityData Lnet/minecraft/nbt/CompoundTag; +accessible field net/minecraft/world/level/block/entity/BellBlockEntity resonating Z +accessible field net/minecraft/world/level/block/entity/BellBlockEntity resonationTicks I +accessible field net/minecraft/world/level/block/entity/BlockEntity level Lnet/minecraft/world/level/Level; +accessible field net/minecraft/world/level/block/entity/BrewingStandBlockEntity brewTime I +accessible field net/minecraft/world/level/block/entity/BrewingStandBlockEntity fuel I +accessible field net/minecraft/world/level/block/entity/BrushableBlockEntity item Lnet/minecraft/world/item/ItemStack; +accessible field net/minecraft/world/level/block/entity/BrushableBlockEntity lootTable Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/world/level/block/entity/BrushableBlockEntity lootTableSeed J +accessible field net/minecraft/world/level/block/entity/CampfireBlockEntity cookingProgress [I +accessible field net/minecraft/world/level/block/entity/CampfireBlockEntity cookingTime [I +accessible field net/minecraft/world/level/block/entity/ChestBlockEntity openersCounter Lnet/minecraft/world/level/block/entity/ContainerOpenersCounter; +accessible field net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity lastInteractedSlot I +accessible field net/minecraft/world/level/block/entity/DecoratedPotBlockEntity decorations Lnet/minecraft/world/level/block/entity/DecoratedPotBlockEntity$Decorations; +accessible field net/minecraft/world/level/block/entity/EnderChestBlockEntity openersCounter Lnet/minecraft/world/level/block/entity/ContainerOpenersCounter; +accessible field net/minecraft/world/level/block/entity/JukeboxBlockEntity isPlaying Z +accessible field net/minecraft/world/level/block/entity/JukeboxBlockEntity recordStartedTick J +accessible field net/minecraft/world/level/block/entity/JukeboxBlockEntity tickCount J +accessible field net/minecraft/world/level/block/entity/LecternBlockEntity bookAccess Lnet/minecraft/world/Container; +accessible field net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity lootTable Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity lootTableSeed J +accessible field net/minecraft/world/level/block/entity/SculkSensorBlockEntity lastVibrationFrequency I +accessible field net/minecraft/world/level/block/entity/SculkShriekerBlockEntity warningLevel I +accessible field net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity openCount I +accessible field net/minecraft/world/level/block/entity/SignBlockEntity playerWhoMayEdit Ljava/util/UUID; +accessible field net/minecraft/world/level/block/entity/SkullBlockEntity noteBlockSound Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/world/level/block/entity/SkullBlockEntity owner Lcom/mojang/authlib/GameProfile; +accessible field net/minecraft/world/level/block/entity/SkullBlockEntity sessionService Lcom/mojang/authlib/minecraft/MinecraftSessionService; +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity author Ljava/lang/String; +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity ignoreEntities Z +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity integrity F +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity metaData Ljava/lang/String; +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity mirror Lnet/minecraft/world/level/block/Mirror; +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity mode Lnet/minecraft/world/level/block/state/properties/StructureMode; +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity rotation Lnet/minecraft/world/level/block/Rotation; +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity seed J +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity showAir Z +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity showBoundingBox Z +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity structurePos Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/level/block/entity/StructureBlockEntity structureSize Lnet/minecraft/core/Vec3i; +accessible field net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity age J +accessible field net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity exactTeleport Z +accessible field net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity exitPortal Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase destroySpeed F +accessible field net/minecraft/world/level/block/state/StateHolder PROPERTY_ENTRY_TO_STRING_FUNCTION Ljava/util/function/Function; +accessible field net/minecraft/world/level/block/state/properties/IntegerProperty max I +accessible field net/minecraft/world/level/block/state/properties/IntegerProperty min I +accessible field net/minecraft/world/level/chunk/ChunkAccess blockEntities Ljava/util/Map; +accessible field net/minecraft/world/level/chunk/ChunkAccess heightmaps Ljava/util/Map; +accessible field net/minecraft/world/level/chunk/ChunkGenerator generationSettingsGetter Ljava/util/function/Function; +accessible field net/minecraft/world/level/chunk/LevelChunk level Lnet/minecraft/world/level/Level; +accessible field net/minecraft/world/level/chunk/LevelChunk loaded Z +accessible field net/minecraft/world/level/chunk/PalettedContainer registry Lnet/minecraft/core/IdMap; +accessible field net/minecraft/world/level/chunk/storage/ChunkSerializer BLOCK_STATE_CODEC Lcom/mojang/serialization/Codec; +accessible field net/minecraft/world/level/chunk/storage/EntityStorage entityDeserializerQueue Lnet/minecraft/util/thread/ProcessorMailbox; +accessible field net/minecraft/world/level/chunk/storage/EntityStorage level Lnet/minecraft/server/level/ServerLevel; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage regionCache Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/world/level/dimension/end/EndDragonFight dragonEvent Lnet/minecraft/server/level/ServerBossEvent; +accessible field net/minecraft/world/level/dimension/end/EndDragonFight dragonUUID Ljava/util/UUID; +accessible field net/minecraft/world/level/dimension/end/EndDragonFight level Lnet/minecraft/server/level/ServerLevel; +accessible field net/minecraft/world/level/dimension/end/EndDragonFight portalLocation Lnet/minecraft/core/BlockPos; +accessible field net/minecraft/world/level/dimension/end/EndDragonFight respawnStage Lnet/minecraft/world/level/dimension/end/DragonRespawnAnimation; +accessible field net/minecraft/world/level/entity/PersistentEntitySectionManager permanentStorage Lnet/minecraft/world/level/entity/EntityPersistentStorage; +accessible field net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator settings Lnet/minecraft/core/Holder; +accessible field net/minecraft/world/level/levelgen/structure/placement/StructurePlacement exclusionZone Ljava/util/Optional; +accessible field net/minecraft/world/level/levelgen/structure/placement/StructurePlacement frequency F +accessible field net/minecraft/world/level/levelgen/structure/placement/StructurePlacement frequencyReductionMethod Lnet/minecraft/world/level/levelgen/structure/placement/StructurePlacement$FrequencyReductionMethod; +accessible field net/minecraft/world/level/levelgen/structure/placement/StructurePlacement locateOffset Lnet/minecraft/core/Vec3i; +accessible field net/minecraft/world/level/levelgen/structure/placement/StructurePlacement salt I +accessible field net/minecraft/world/level/levelgen/structure/templatesystem/StructurePlaceSettings palette I +accessible field net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate entityInfoList Ljava/util/List; +accessible field net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate palettes Ljava/util/List; +accessible field net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager structureRepository Ljava/util/Map; +accessible field net/minecraft/world/level/material/MapColor MATERIAL_COLORS [Lnet/minecraft/world/level/material/MapColor; +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData carriedBy Ljava/util/List; +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData carriedByPlayers Ljava/util/Map; +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData centerX I +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData centerZ I +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData decorations Ljava/util/Map; +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData dimension Lnet/minecraft/resources/ResourceKey; +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData locked Z +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData scale B +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData trackingPosition Z +accessible field net/minecraft/world/level/saveddata/maps/MapItemSavedData unlimitedTracking Z +accessible field net/minecraft/world/level/storage/DimensionDataStorage cache Ljava/util/Map; +accessible field net/minecraft/world/level/storage/LevelStorageSource baseDir Ljava/nio/file/Path; +accessible field net/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess levelDirectory Lnet/minecraft/world/level/storage/LevelStorageSource$LevelDirectory; +accessible field net/minecraft/world/level/storage/PrimaryLevelData settings Lnet/minecraft/world/level/LevelSettings; +accessible field net/minecraft/world/scores/Objective displayName Lnet/minecraft/network/chat/Component; +accessible field net/minecraft/world/scores/criteria/ObjectiveCriteria CRITERIA_CACHE Ljava/util/Map; +accessible method net/minecraft/client/multiplayer/ClientLevel getEntities ()Lnet/minecraft/world/level/entity/LevelEntityGetter; +accessible method net/minecraft/nbt/TagParser readArrayTag ()Lnet/minecraft/nbt/Tag; +accessible method net/minecraft/nbt/TagParser type (Ljava/lang/String;)Lnet/minecraft/nbt/Tag; +accessible method net/minecraft/network/chat/Style (Lnet/minecraft/network/chat/TextColor;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Lnet/minecraft/network/chat/ClickEvent;Lnet/minecraft/network/chat/HoverEvent;Ljava/lang/String;Lnet/minecraft/resources/ResourceLocation;)V +accessible method net/minecraft/server/Main forceUpgrade (Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lcom/mojang/datafixers/DataFixer;ZLjava/util/function/BooleanSupplier;Lnet/minecraft/core/Registry;)V +accessible method net/minecraft/server/Main m_129674_ (Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lcom/mojang/datafixers/DataFixer;ZLjava/util/function/BooleanSupplier;Lcom/google/common/collect/ImmutableSet;)V +accessible method net/minecraft/server/Main m_195488_ (Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lcom/mojang/datafixers/DataFixer;ZLjava/util/function/BooleanSupplier;Lnet/minecraft/world/level/levelgen/WorldGenSettings;)V +accessible method net/minecraft/server/MinecraftServer prepareLevels (Lnet/minecraft/server/level/progress/ChunkProgressListener;)V +accessible method net/minecraft/server/MinecraftServer wrapRunnable (Ljava/lang/Runnable;)Ljava/lang/Runnable; +accessible method net/minecraft/server/MinecraftServer wrapRunnable (Ljava/lang/Runnable;)Lnet/minecraft/server/TickTask; +accessible method net/minecraft/server/MinecraftServer$TimeProfiler (JI)V +accessible method net/minecraft/server/WorldLoader loadAndReplaceLayer (Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/core/LayeredRegistryAccess;Lnet/minecraft/server/RegistryLayer;Ljava/util/List;)Lnet/minecraft/core/LayeredRegistryAccess; +accessible method net/minecraft/server/dedicated/DedicatedServerProperties$WorldDimensionData (Lcom/google/gson/JsonObject;Ljava/lang/String;)V +accessible method net/minecraft/server/level/ChunkMap save (Lnet/minecraft/world/level/chunk/ChunkAccess;)Z +accessible method net/minecraft/server/level/PlayerRespawnLogic getOverworldRespawnPos (Lnet/minecraft/server/level/ServerLevel;II)Lnet/minecraft/core/BlockPos; +accessible method net/minecraft/server/level/PlayerRespawnLogic m_8264_ (Lnet/minecraft/server/level/ServerLevel;IIZ)Lnet/minecraft/core/BlockPos; +accessible method net/minecraft/server/level/ServerBossEvent broadcast (Ljava/util/function/Function;)V +accessible method net/minecraft/server/level/ServerLevel getEntities ()Lnet/minecraft/world/level/entity/LevelEntityGetter; +accessible method net/minecraft/server/level/ServerLevel getEntities (Lnet/minecraft/world/level/entity/EntityTypeTest;Ljava/util/function/Predicate;Ljava/util/List;)V +accessible method net/minecraft/server/level/ServerLevel getEntities (Lnet/minecraft/world/level/entity/EntityTypeTest;Ljava/util/function/Predicate;Ljava/util/List;I)V +accessible method net/minecraft/server/level/ServerPlayer initMenu (Lnet/minecraft/world/inventory/AbstractContainerMenu;)V +accessible method net/minecraft/server/level/ServerPlayer nextContainerCounter ()V +accessible method net/minecraft/server/level/ServerPlayer triggerDimensionChangeTriggers (Lnet/minecraft/server/level/ServerLevel;)V +accessible method net/minecraft/server/level/Ticket (Lnet/minecraft/server/level/TicketType;ILjava/lang/Object;)V +accessible method net/minecraft/server/level/Ticket (Lnet/minecraft/world/server/TicketType;ILjava/lang/Object;J)V +accessible method net/minecraft/server/level/Ticket setCreatedTick (J)V +accessible method net/minecraft/server/players/BanListEntry hasExpired ()Z +accessible method net/minecraft/server/players/PlayerList updateEntireScoreboard (Lnet/minecraft/server/ServerScoreboard;Lnet/minecraft/server/level/ServerPlayer;)V +accessible method net/minecraft/server/players/StoredUserEntry getUser ()Ljava/lang/Object; +accessible method net/minecraft/util/datafix/fixes/BlockStateData register (ILjava/lang/String;[Ljava/lang/String;)V +accessible method net/minecraft/world/dimension/DimensionType (ILjava/lang/String;Ljava/lang/String;Ljava/util/function/BiFunction;ZLnet/minecraft/world/biome/IBiomeMagnifier;)V +accessible method net/minecraft/world/entity/Display createTransformation (Lnet/minecraft/network/syncher/SynchedEntityData;)Lcom/mojang/math/Transformation; +accessible method net/minecraft/world/entity/Display getBillboardConstraints ()Lnet/minecraft/world/entity/Display$BillboardConstraints; +accessible method net/minecraft/world/entity/Display getBrightnessOverride ()Lnet/minecraft/util/Brightness; +accessible method net/minecraft/world/entity/Display getGlowColorOverride ()I +accessible method net/minecraft/world/entity/Display getHeight ()F +accessible method net/minecraft/world/entity/Display getInterpolationDelay ()I +accessible method net/minecraft/world/entity/Display getInterpolationDuration ()I +accessible method net/minecraft/world/entity/Display getShadowRadius ()F +accessible method net/minecraft/world/entity/Display getShadowStrength ()F +accessible method net/minecraft/world/entity/Display getViewRange ()F +accessible method net/minecraft/world/entity/Display getWidth ()F +accessible method net/minecraft/world/entity/Display m_269072_ (F)F +accessible method net/minecraft/world/entity/Display setBillboardConstraints (Lnet/minecraft/world/entity/Display$BillboardConstraints;)V +accessible method net/minecraft/world/entity/Display setBrightnessOverride (Lnet/minecraft/util/Brightness;)V +accessible method net/minecraft/world/entity/Display setGlowColorOverride (I)V +accessible method net/minecraft/world/entity/Display setHeight (F)V +accessible method net/minecraft/world/entity/Display setInterpolationDelay (I)V +accessible method net/minecraft/world/entity/Display setInterpolationDuration (I)V +accessible method net/minecraft/world/entity/Display setShadowRadius (F)V +accessible method net/minecraft/world/entity/Display setShadowStrength (F)V +accessible method net/minecraft/world/entity/Display setTransformation (Lcom/mojang/math/Transformation;)V +accessible method net/minecraft/world/entity/Display setViewRange (F)V +accessible method net/minecraft/world/entity/Display setWidth (F)V +accessible method net/minecraft/world/entity/Display$BlockDisplay getBlockState ()Lnet/minecraft/world/level/block/state/BlockState; +accessible method net/minecraft/world/entity/Display$BlockDisplay setBlockState (Lnet/minecraft/world/level/block/state/BlockState;)V +accessible method net/minecraft/world/entity/Display$ItemDisplay getItemStack ()Lnet/minecraft/world/item/ItemStack; +accessible method net/minecraft/world/entity/Display$ItemDisplay getItemTransform ()Lnet/minecraft/world/item/ItemDisplayContext; +accessible method net/minecraft/world/entity/Display$ItemDisplay setItemStack (Lnet/minecraft/world/item/ItemStack;)V +accessible method net/minecraft/world/entity/Display$ItemDisplay setItemTransform (Lnet/minecraft/world/item/ItemDisplayContext;)V +accessible method net/minecraft/world/entity/Display$TextDisplay getBackgroundColor ()I +accessible method net/minecraft/world/entity/Display$TextDisplay getFlags ()B +accessible method net/minecraft/world/entity/Display$TextDisplay getLineWidth ()I +accessible method net/minecraft/world/entity/Display$TextDisplay getText ()Lnet/minecraft/network/chat/Component; +accessible method net/minecraft/world/entity/Display$TextDisplay getTextOpacity ()B +accessible method net/minecraft/world/entity/Display$TextDisplay m_269173_ (F)I +accessible method net/minecraft/world/entity/Display$TextDisplay setBackgroundColor (I)V +accessible method net/minecraft/world/entity/Display$TextDisplay setFlags (B)V +accessible method net/minecraft/world/entity/Display$TextDisplay setLineWidth (I)V +accessible method net/minecraft/world/entity/Display$TextDisplay setText (Lnet/minecraft/network/chat/Component;)V +accessible method net/minecraft/world/entity/Display$TextDisplay setTextOpacity (B)V +accessible method net/minecraft/world/entity/Entity getEncodeId ()Ljava/lang/String; +accessible method net/minecraft/world/entity/Entity getFireImmuneTicks ()I +accessible method net/minecraft/world/entity/Entity getSharedFlag (I)Z +accessible method net/minecraft/world/entity/Entity setSharedFlag (IZ)V +accessible method net/minecraft/world/entity/Entity unsetRemoved ()V +accessible method net/minecraft/world/entity/GlowSquid setDarkTicks (I)V +accessible method net/minecraft/world/entity/Interaction getHeight ()F +accessible method net/minecraft/world/entity/Interaction getResponse ()Z +accessible method net/minecraft/world/entity/Interaction getWidth ()F +accessible method net/minecraft/world/entity/Interaction setHeight (F)V +accessible method net/minecraft/world/entity/Interaction setResponse (Z)V +accessible method net/minecraft/world/entity/Interaction setWidth (F)V +accessible method net/minecraft/world/entity/ItemBasedSteering boostTimeTotal ()I +accessible method net/minecraft/world/entity/LivingEntity detectEquipmentUpdates ()V +accessible method net/minecraft/world/entity/Mob getDefaultLootTable ()Lnet/minecraft/resources/ResourceLocation; +accessible method net/minecraft/world/entity/animal/AbstractFish m_142392_ ()Z +accessible method net/minecraft/world/entity/animal/Bee setHasNectar (Z)V +accessible method net/minecraft/world/entity/animal/Bee setHasStung (Z)V +accessible method net/minecraft/world/entity/animal/Bee$BeePollinateGoal stopPollinating ()V +accessible method net/minecraft/world/entity/animal/Fox setSleeping (Z)V +accessible method net/minecraft/world/entity/animal/Fox setVariant (Lnet/minecraft/world/entity/animal/Fox$Type;)V +accessible method net/minecraft/world/entity/animal/MushroomCow m_28928_ (Lnet/minecraft/world/entity/animal/MushroomCow$MushroomType;)V +accessible method net/minecraft/world/entity/animal/Ocelot isTrusting ()Z +accessible method net/minecraft/world/entity/animal/Ocelot setTrusting (Z)V +accessible method net/minecraft/world/entity/animal/Rabbit registerGoals ()V +accessible method net/minecraft/world/entity/animal/TropicalFish getPackedVariant ()I +accessible method net/minecraft/world/entity/animal/TropicalFish setPackedVariant (I)V +accessible method net/minecraft/world/entity/animal/allay/Allay canDuplicate ()Z +accessible method net/minecraft/world/entity/animal/allay/Allay resetDuplicationCooldown ()V +accessible method net/minecraft/world/entity/animal/axolotl/Axolotl m_149117_ (Lnet/minecraft/world/entity/animal/axolotl/Axolotl$Variant;)V +accessible method net/minecraft/world/entity/animal/horse/AbstractHorse createInventory ()V +accessible method net/minecraft/world/entity/animal/horse/Horse setVariantAndMarkings (Lnet/minecraft/world/entity/animal/horse/Variant;Lnet/minecraft/world/entity/animal/horse/Markings;)V +accessible method net/minecraft/world/entity/animal/sniffer/Sniffer calculateDigPosition ()Ljava/util/Optional; +accessible method net/minecraft/world/entity/animal/sniffer/Sniffer canDig ()Z +accessible method net/minecraft/world/entity/animal/sniffer/Sniffer getExploredPositions ()Ljava/util/stream/Stream; +accessible method net/minecraft/world/entity/animal/sniffer/Sniffer getState ()Lnet/minecraft/world/entity/animal/sniffer/Sniffer$State; +accessible method net/minecraft/world/entity/animal/sniffer/Sniffer storeExploredPosition (Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/entity/animal/sniffer/Sniffer; +accessible method net/minecraft/world/entity/decoration/ArmorStand setMarker (Z)V +accessible method net/minecraft/world/entity/decoration/ArmorStand setNoBasePlate (Z)V +accessible method net/minecraft/world/entity/decoration/ArmorStand setShowArms (Z)V +accessible method net/minecraft/world/entity/decoration/ArmorStand setSmall (Z)V +accessible method net/minecraft/world/entity/decoration/HangingEntity setDirection (Lnet/minecraft/core/Direction;)V +accessible method net/minecraft/world/entity/decoration/ItemFrame setDirection (Lnet/minecraft/core/Direction;)V +accessible method net/minecraft/world/entity/decoration/Painting m_218891_ (Lnet/minecraft/core/Holder;)V +accessible method net/minecraft/world/entity/monster/Creeper explodeCreeper ()V +accessible method net/minecraft/world/entity/monster/Guardian setActiveAttackTarget (I)V +accessible method net/minecraft/world/entity/monster/MagmaCube m_7582_ ()Lnet/minecraft/resources/ResourceLocation; +accessible method net/minecraft/world/entity/monster/MagmaCube setSize (IZ)V +accessible method net/minecraft/world/entity/monster/Shulker getRawPeekAmount ()I +accessible method net/minecraft/world/entity/monster/Shulker setAttachFace (Lnet/minecraft/core/Direction;)V +accessible method net/minecraft/world/entity/monster/Shulker setRawPeekAmount (I)V +accessible method net/minecraft/world/entity/monster/Skeleton startFreezeConversion (I)V +accessible method net/minecraft/world/entity/monster/Slime m_7582_ ()Lnet/minecraft/resources/ResourceLocation; +accessible method net/minecraft/world/entity/monster/Slime setSize (IZ)V +accessible method net/minecraft/world/entity/monster/SpellcasterIllager getCurrentSpell ()Lnet/minecraft/world/entity/monster/SpellcasterIllager$IllagerSpell; +accessible method net/minecraft/world/entity/monster/Zombie startUnderWaterConversion (I)V +accessible method net/minecraft/world/entity/monster/ZombieVillager startConverting (Ljava/util/UUID;I)V +accessible method net/minecraft/world/entity/monster/hoglin/Hoglin isImmuneToZombification ()Z +accessible method net/minecraft/world/entity/monster/piglin/AbstractPiglin isImmuneToZombification ()Z +accessible method net/minecraft/world/entity/monster/piglin/PiglinAi isLovedItem (Lnet/minecraft/world/item/ItemStack;)Z +accessible method net/minecraft/world/entity/npc/Villager increaseMerchantCareer ()V +accessible method net/minecraft/world/entity/npc/Villager releaseAllPois ()V +accessible method net/minecraft/world/entity/npc/Villager setUnhappy ()V +accessible method net/minecraft/world/entity/player/Player closeContainer ()V +accessible method net/minecraft/world/entity/player/Player getFireImmuneTicks ()I +accessible method net/minecraft/world/entity/player/Player isImmobile ()Z +accessible method net/minecraft/world/entity/player/Player setShoulderEntityLeft (Lnet/minecraft/nbt/CompoundTag;)V +accessible method net/minecraft/world/entity/player/Player setShoulderEntityRight (Lnet/minecraft/nbt/CompoundTag;)V +accessible method net/minecraft/world/entity/projectile/Arrow setFixedColor (I)V +accessible method net/minecraft/world/entity/projectile/Fireball getItemRaw ()Lnet/minecraft/world/item/ItemStack; +accessible method net/minecraft/world/entity/projectile/FishingHook pullEntity (Lnet/minecraft/world/entity/Entity;)V +accessible method net/minecraft/world/entity/projectile/FishingHook setHookedEntity (Lnet/minecraft/world/entity/Entity;)V +accessible method net/minecraft/world/entity/projectile/ThrowableItemProjectile getItemRaw ()Lnet/minecraft/world/item/ItemStack; +accessible method net/minecraft/world/entity/projectile/ThrownPotion isLingering ()Z +accessible method net/minecraft/world/entity/vehicle/MinecartTNT explode (D)V +accessible method net/minecraft/world/item/DebugStickItem handleInteraction (Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/item/ItemStack;)Z +accessible method net/minecraft/world/item/MapItem createNewSavedData (Lnet/minecraft/world/level/Level;IIIZZLnet/minecraft/resources/ResourceKey;)I +accessible method net/minecraft/world/item/context/UseOnContext (Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/phys/BlockHitResult;)V +accessible method net/minecraft/world/item/context/UseOnContext (Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/phys/BlockHitResult;)V +accessible method net/minecraft/world/item/crafting/Ingredient (Ljava/util/stream/Stream;)V +accessible method net/minecraft/world/item/crafting/Ingredient m_43948_ ()V +accessible method net/minecraft/world/item/crafting/Ingredient$ItemValue (Lnet/minecraft/world/item/ItemStack;)V +accessible method net/minecraft/world/level/BaseSpawner m_151332_ (Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/resources/ResourceLocation; +accessible method net/minecraft/world/level/GameRules$BooleanValue deserialize (Ljava/lang/String;)V +accessible method net/minecraft/world/level/GameRules$IntegerValue deserialize (Ljava/lang/String;)V +accessible method net/minecraft/world/level/GameRules$Value deserialize (Ljava/lang/String;)V +accessible method net/minecraft/world/level/GameRules$Value onChanged (Lnet/minecraft/server/MinecraftServer;)V +accessible method net/minecraft/world/level/Level getEntities ()Lnet/minecraft/world/level/entity/LevelEntityGetter; +accessible method net/minecraft/world/level/Level getEntities (Lnet/minecraft/world/level/entity/EntityTypeTest;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;)Ljava/util/List; +accessible method net/minecraft/world/level/biome/Biome getTemperature (Lnet/minecraft/core/BlockPos;)F +accessible method net/minecraft/world/level/block/Block popExperience (Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;I)V +accessible method net/minecraft/world/level/block/ChiseledBookShelfBlock getHitSlot (Lnet/minecraft/world/phys/Vec2;)I +accessible method net/minecraft/world/level/block/ComposterBlock empty (Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState; +accessible method net/minecraft/world/level/block/ComposterBlock m_52002_ (Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState; +accessible method net/minecraft/world/level/block/DispenserBlock dispenseFrom (Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;)V +accessible method net/minecraft/world/level/block/DropperBlock dispenseFrom (Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;)V +accessible method net/minecraft/world/level/block/JukeboxBlock m_54260_ (Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V +accessible method net/minecraft/world/level/block/entity/BarrelBlockEntity playSound (Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/sounds/SoundEvent;)V +accessible method net/minecraft/world/level/block/entity/BarrelBlockEntity updateBlockState (Lnet/minecraft/world/level/block/state/BlockState;Z)V +accessible method net/minecraft/world/level/block/entity/ChestBlockEntity playSound (Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/sounds/SoundEvent;)V +accessible method net/minecraft/world/level/block/entity/LecternBlockEntity setPage (I)V +accessible method net/minecraft/world/level/block/entity/SculkCatalystBlockEntity$CatalystListener bloom (Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/util/RandomSource;)V +accessible method net/minecraft/world/level/chunk/DataLayer set (II)V +accessible method net/minecraft/world/level/dimension/end/EndDragonFight findExitPortal ()Lnet/minecraft/world/level/block/state/pattern/BlockPattern$BlockPatternMatch; +accessible method net/minecraft/world/level/dimension/end/EndDragonFight setRespawnStage (Lnet/minecraft/world/level/dimension/end/DragonRespawnAnimation;)V +accessible method net/minecraft/world/level/dimension/end/EndDragonFight spawnExitPortal (Z)V +accessible method net/minecraft/world/level/entity/PersistentEntitySectionManager ensureChunkQueuedForLoad (J)V +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureManager m_163776_ (Lnet/minecraft/resources/ResourceLocation;)Ljava/util/Optional; +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureManager m_163778_ (Lnet/minecraft/resources/ResourceLocation;)Ljava/util/Optional; +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureManager m_74337_ (Ljava/io/InputStream;)Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate; +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureManager m_74348_ (Lnet/minecraft/resources/ResourceLocation;Ljava/lang/String;)Ljava/nio/file/Path; +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager createAndValidatePathToStructure (Ljava/nio/file/Path;Lnet/minecraft/resources/ResourceLocation;Ljava/lang/String;)Ljava/nio/file/Path; +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager loadFromGenerated (Lnet/minecraft/resources/ResourceLocation;)Ljava/util/Optional; +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager loadFromResource (Lnet/minecraft/resources/ResourceLocation;)Ljava/util/Optional; +accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager readStructure (Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate; +accessible method net/minecraft/world/level/saveddata/maps/MapItemSavedData setColorsDirty (II)V +accessible method net/minecraft/world/level/saveddata/maps/MapItemSavedData setDecorationsDirty ()V +accessible method net/minecraft/world/phys/shapes/DiscreteCubeMerger (II)V +accessible method net/minecraft/world/phys/shapes/IndirectMerger (Lit/unimi/dsi/fastutil/doubles/DoubleList;Lit/unimi/dsi/fastutil/doubles/DoubleList;ZZ)V +mutable field net/minecraft/network/protocol/handshake/ClientIntentionPacket hostName Ljava/lang/String; +mutable field net/minecraft/server/MinecraftServer connection Lnet/minecraft/server/network/ServerConnectionListener; +mutable field net/minecraft/server/MinecraftServer levels Ljava/util/Map; +mutable field net/minecraft/server/MinecraftServer storageSource Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess; +mutable field net/minecraft/server/MinecraftServer worldData Lnet/minecraft/world/level/storage/WorldData; +mutable field net/minecraft/server/ReloadableServerResources commands Lnet/minecraft/commands/Commands; +mutable field net/minecraft/server/dedicated/DedicatedServer settings Lnet/minecraft/server/dedicated/DedicatedServerSettings; +mutable field net/minecraft/server/level/TicketType timeout J +mutable field net/minecraft/server/players/PlayerList maxPlayers I +mutable field net/minecraft/world/entity/AreaEffectCloud effects Ljava/util/List; +mutable field net/minecraft/world/entity/LivingEntity combatTracker Lnet/minecraft/world/damagesource/CombatTracker; +mutable field net/minecraft/world/entity/LivingEntity invulnerableDuration I +mutable field net/minecraft/world/entity/Mob goalSelector Lnet/minecraft/world/entity/ai/goal/GoalSelector; +mutable field net/minecraft/world/entity/Mob targetSelector Lnet/minecraft/world/entity/ai/goal/GoalSelector; +mutable field net/minecraft/world/entity/ai/attributes/RangedAttribute maxValue D +mutable field net/minecraft/world/inventory/AbstractContainerMenu lastSlots Lnet/minecraft/core/NonNullList; +mutable field net/minecraft/world/inventory/AbstractContainerMenu remoteSlots Lnet/minecraft/core/NonNullList; +mutable field net/minecraft/world/inventory/AbstractContainerMenu slots Lnet/minecraft/core/NonNullList; +mutable field net/minecraft/world/item/ItemStack item Lnet/minecraft/world/item/Item; +mutable field net/minecraft/world/item/crafting/RecipeManager recipes Ljava/util/Map; +mutable field net/minecraft/world/item/trading/MerchantOffer baseCostA Lnet/minecraft/world/item/ItemStack; +mutable field net/minecraft/world/item/trading/MerchantOffer costB Lnet/minecraft/world/item/ItemStack; +mutable field net/minecraft/world/item/trading/MerchantOffer maxUses I +mutable field net/minecraft/world/level/Level dimension Lnet/minecraft/resources/ResourceKey; +mutable field net/minecraft/world/level/LevelSettings hardcore Z +mutable field net/minecraft/world/level/LevelSettings levelName Ljava/lang/String; +mutable field net/minecraft/world/level/saveddata/maps/MapItemSavedData centerX I +mutable field net/minecraft/world/level/saveddata/maps/MapItemSavedData centerZ I +mutable field net/minecraft/world/level/saveddata/maps/MapItemSavedData dimension Lnet/minecraft/resources/ResourceKey; +mutable field net/minecraft/world/level/saveddata/maps/MapItemSavedData locked Z +mutable field net/minecraft/world/level/saveddata/maps/MapItemSavedData scale B +mutable field net/minecraft/world/level/saveddata/maps/MapItemSavedData trackingPosition Z +mutable field net/minecraft/world/level/saveddata/maps/MapItemSavedData unlimitedTracking Z diff --git a/arclight-fabric/src/main/resources/mixins.arclight.fabric.json b/arclight-fabric/src/main/resources/mixins.arclight.fabric.json new file mode 100644 index 000000000..599582a87 --- /dev/null +++ b/arclight-fabric/src/main/resources/mixins.arclight.fabric.json @@ -0,0 +1,22 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.izzel.arclight.fabric.mixin", + "target": "@env(DEFAULT)", + "plugin": "io.izzel.arclight.fabric.mod.FabricMixinPlugin", + "setSourceFile": true, + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "conformVisibility": true, + "requireAnnotations": false + }, + "mixinPriority": 555, + "compatibilityLevel": "JAVA_17", + "mixins": [ + "bukkit.CraftHumanEntityMixin_Fabric", + "bukkit.VanillaCommandWrapperMixin_Fabric", + "core.world.item.ItemStackMixin_Fabric" + ] +} diff --git a/build.gradle b/build.gradle index 271ab7f02..9610986ed 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ import io.izzel.arclight.gradle.tasks.UploadFilesTask allprojects { group 'io.izzel.luminara' - version '1.0.14' + version '1.0.15-alpha.1' def getGitHash = { -> def stdout = new ByteArrayOutputStream() @@ -22,6 +22,8 @@ allprojects { agpVersion = '1.23' minecraftVersion = '1.20.1' forgeVersion = '47.4.16' + fabricLoaderVersion = '0.16.10' + fabricApiVersion = '0.92.6+1.20.1' apiVersion = '1.5.4' toolsVersion = '1.3.0' mixinVersion = project.ext.mixinVersion @@ -39,7 +41,9 @@ allprojects { task collect(type: Copy) { destinationDir = file('build/libs') from { project(':arclight-forge').tasks.jar.outputs } + from { project(':arclight-fabric').tasks.remapJar.outputs } dependsOn { project(':arclight-forge').tasks.jar } + dependsOn { project(':arclight-fabric').tasks.remapJar } } def gitBranch() { diff --git a/forge-installer/build.gradle b/forge-installer/build.gradle index a6d9933bf..ed44020ef 100644 --- a/forge-installer/build.gradle +++ b/forge-installer/build.gradle @@ -4,6 +4,12 @@ plugins { archivesBaseName = 'luminara-forge-installer' +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + repositories { mavenCentral() maven { diff --git a/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/FabricInstaller.java b/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/FabricInstaller.java new file mode 100644 index 000000000..5d74981d9 --- /dev/null +++ b/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/FabricInstaller.java @@ -0,0 +1,198 @@ +package io.izzel.arclight.forgeinstaller; + +import com.google.gson.Gson; +import com.google.gson.JsonParser; + +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.jar.Attributes; +import java.util.jar.JarFile; +import java.util.stream.Collectors; + +public class FabricInstaller { + + private static final String DEFAULT_FABRIC_MAIN_CLASS = "net.fabricmc.loader.impl.launch.server.FabricServerLauncher"; + + @SuppressWarnings("unused") + public static Map.Entry> applicationInstall() throws Exception { + try (InputStream stream = FabricInstaller.class.getResourceAsStream("/META-INF/installer.json")) { + if (stream == null) { + throw new IllegalStateException("Missing /META-INF/installer.json"); + } + InstallInfo installInfo = new Gson().fromJson(new InputStreamReader(stream), InstallInfo.class); + if (installInfo == null || installInfo.installer == null || installInfo.installer.fabricLoader == null) { + throw new IllegalStateException("Invalid installer metadata for Fabric"); + } + + var logger = (Consumer) System.out::println; + Path loaderPath = Paths.get("libraries", "net", "fabricmc", "fabric-loader", + installInfo.installer.fabricLoader, "fabric-loader-" + installInfo.installer.fabricLoader + ".jar"); + Path serverPath = Paths.get("libraries", "net", "minecraft", "server", + installInfo.installer.minecraft, "server-" + installInfo.installer.minecraft + ".jar"); + + // Optional extra coordinates (kept for forward compatibility with richer metadata). + downloadAll(checkMavenNoSource(installInfo.fabricDeps()), logger); + + boolean installLoader = !Files.exists(loaderPath) || fabricClasspathMissing(loaderPath); + if (installLoader) { + logger.accept("Installing Fabric loader..."); + String coord = "net.fabricmc:fabric-loader:" + installInfo.installer.fabricLoader; + String target = "libraries/" + Util.mavenToPath(coord); + Path downloadedLoader = new MavenDownloader( + Mirrors.getMavenRepo(), coord, target, installInfo.installer.fabricLoaderHash + ).get(); + logger.accept("Downloaded " + downloadedLoader); + downloadAll(checkMaven(fabricDeps(downloadedLoader)), logger); + } + + if (!Files.exists(serverPath)) { + logger.accept("Downloading Minecraft server jar..."); + MinecraftData data = downloadMinecraftData(installInfo.installer.minecraft, logger); + if (data == null) { + throw new IllegalStateException("Failed to resolve Minecraft version metadata: " + installInfo.installer.minecraft); + } + Path downloadedServer = new FileDownloader( + String.format(data.serverUrl(), installInfo.installer.minecraft), + serverPath.toString(), + data.serverHash() + ).get(); + logger.accept("Downloaded " + downloadedServer); + } + + return classpath(installInfo, loaderPath); + } + } + + private static Map.Entry> classpath(InstallInfo info, Path loaderPath) throws Exception { + Path serverPath = Paths.get("libraries", "net", "minecraft", "server", + info.installer.minecraft, "server-" + info.installer.minecraft + ".jar").toAbsolutePath(); + System.setProperty("fabric.gameJarPath", serverPath.toString()); + + List libs = new ArrayList<>(); + for (String dep : fabricDeps(loaderPath).keySet()) { + libs.add(Paths.get("libraries", Util.mavenToPath(dep))); + } + for (String dep : info.fabricDeps().keySet()) { + libs.add(Paths.get("libraries", Util.mavenToPath(dep))); + } + libs.add(loaderPath.toAbsolutePath()); + libs = libs.stream().distinct().collect(Collectors.toList()); + + try (var file = new JarFile(loaderPath.toFile())) { + String mainClass = file.getManifest().getMainAttributes().getValue(Attributes.Name.MAIN_CLASS); + if (mainClass == null || mainClass.isBlank()) { + mainClass = DEFAULT_FABRIC_MAIN_CLASS; + } + return Map.entry(mainClass, libs); + } + } + + private static boolean fabricClasspathMissing(Path loaderPath) throws Exception { + for (String dep : fabricDeps(loaderPath).keySet()) { + if (!Files.exists(Paths.get("libraries", Util.mavenToPath(dep)))) { + return true; + } + } + return false; + } + + private static Map> fabricDeps(Path loaderPath) throws Exception { + var result = new LinkedHashMap>(); + try (var file = new JarFile(loaderPath.toFile())) { + var entry = file.getEntry("fabric-installer.json"); + if (entry == null) { + throw new IllegalStateException("fabric-installer.json missing in " + loaderPath); + } + try (var stream = file.getInputStream(entry)) { + var root = JsonParser.parseReader(new InputStreamReader(stream)).getAsJsonObject(); + var libs = root.getAsJsonObject("libraries"); + for (var blockName : List.of("common", "server")) { + var block = libs.getAsJsonArray(blockName); + for (var element : block) { + var obj = element.getAsJsonObject(); + var name = obj.get("name").getAsString(); + var url = obj.get("url").getAsString() + Util.mavenToPath(name); + var sha1 = obj.get("sha1").getAsString(); + result.put(name, new AbstractMap.SimpleImmutableEntry<>(sha1, url)); + } + } + } + } + return result; + } + + private static MinecraftData downloadMinecraftData(String minecraftVersion, Consumer logger) { + logger.accept("Resolving Minecraft version manifest..."); + for (Map.Entry mirror : Mirrors.getVersionManifest()) { + try (var stream = FileDownloader.read(mirror.getValue())) { + var manifest = JsonParser.parseString(new String(stream.readAllBytes(), StandardCharsets.UTF_8)).getAsJsonObject(); + var versions = manifest.getAsJsonArray("versions"); + for (var version : versions) { + var obj = version.getAsJsonObject(); + if (Objects.equals(obj.get("id").getAsString(), minecraftVersion)) { + var detailUrl = obj.get("url").getAsString(); + try (var detailStream = FileDownloader.read(detailUrl)) { + var detail = JsonParser.parseString(new String(detailStream.readAllBytes(), StandardCharsets.UTF_8)).getAsJsonObject(); + var server = detail.getAsJsonObject("downloads").getAsJsonObject("server"); + return new MinecraftData( + mirror.getKey(), + Mirrors.mapMojangMirror(server.get("url").getAsString(), mirror.getKey()), + server.get("sha1").getAsString() + ); + } + } + } + } catch (Exception ex) { + logger.accept("Failed to load version manifest from " + mirror.getKey() + ": " + ex.getMessage()); + } + } + return null; + } + + private static void downloadAll(List> suppliers, Consumer logger) { + for (Supplier supplier : suppliers) { + Path path = supplier.get(); + logger.accept("Downloaded " + path); + } + } + + private static List> checkMavenNoSource(Map map) { + var deps = new LinkedHashMap>(); + if (map == null) { + return List.of(); + } + for (var entry : map.entrySet()) { + deps.put(entry.getKey(), new AbstractMap.SimpleImmutableEntry<>(entry.getValue(), null)); + } + return checkMaven(deps); + } + + private static List> checkMaven(Map> map) { + var incomplete = new ArrayList>(); + for (var entry : map.entrySet()) { + String maven = entry.getKey(); + String hash = entry.getValue().getKey(); + String sourceUrl = entry.getValue().getValue(); + String path = "libraries/" + Util.mavenToPath(maven); + try { + if (new File(path).exists() && Util.hash(path).equalsIgnoreCase(hash)) { + continue; + } + } catch (Exception ignored) { + } + incomplete.add(new MavenDownloader(Mirrors.getMavenRepo(), maven, path, hash, sourceUrl)); + } + return incomplete; + } + + private record MinecraftData(String mirror, String serverUrl, String serverHash) { + } +} diff --git a/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/FileDownloader.java b/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/FileDownloader.java index 56c6319c3..b8cf8579b 100644 --- a/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/FileDownloader.java +++ b/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/FileDownloader.java @@ -1,7 +1,5 @@ package io.izzel.arclight.forgeinstaller; -import io.izzel.arclight.api.Unsafe; - import javax.net.ssl.SSLException; import java.io.File; import java.io.IOException; @@ -93,8 +91,7 @@ public Path get() { } catch (AccessDeniedException e) { throw new RuntimeException("Access denied for file " + e.getFile(), e); } catch (Exception e) { - Unsafe.throwException(e); - return null; + throw new RuntimeException(e); } } } diff --git a/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/InstallInfo.java b/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/InstallInfo.java index 7846e7544..7012cada7 100644 --- a/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/InstallInfo.java +++ b/forge-installer/src/main/java/io/izzel/arclight/forgeinstaller/InstallInfo.java @@ -1,16 +1,31 @@ package io.izzel.arclight.forgeinstaller; +import java.util.HashMap; import java.util.Map; public class InstallInfo { public Installer installer; public Map libraries; + public Map fabricExtra; + + public Map fabricDeps() { + var map = new HashMap(); + if (this.libraries != null) { + map.putAll(this.libraries); + } + if (this.fabricExtra != null) { + map.putAll(this.fabricExtra); + } + return map; + } public static class Installer { public String minecraft; public String forge; public String hash; + public String fabricLoader; + public String fabricLoaderHash; } } diff --git a/gradle.properties b/gradle.properties index b4ec59881..9e3960926 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,4 @@ org.gradle.jvmargs=-Xmx4g -Dfile.encoding=utf-8 forge_gradle_version=6.0.+ -mixinVersion=0.8.7 \ No newline at end of file +mixinVersion=0.8.7 +fabric_loom_version=1.6-SNAPSHOT diff --git a/i18n-config/build.gradle b/i18n-config/build.gradle index 4d3f6dff5..09e4fd9ad 100644 --- a/i18n-config/build.gradle +++ b/i18n-config/build.gradle @@ -4,6 +4,12 @@ plugins { archivesBaseName = 'luminara-i18n-config' +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + repositories { mavenCentral() maven { diff --git a/i18n-config/src/main/java/io/izzel/arclight/i18n/LoggingConfigurator.java b/i18n-config/src/main/java/io/izzel/arclight/i18n/LoggingConfigurator.java index c4f0df599..ec54420d0 100644 --- a/i18n-config/src/main/java/io/izzel/arclight/i18n/LoggingConfigurator.java +++ b/i18n-config/src/main/java/io/izzel/arclight/i18n/LoggingConfigurator.java @@ -4,11 +4,46 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; +import java.io.PrintWriter; +import java.io.StringWriter; import java.net.URI; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Enumeration; import java.util.Objects; +import java.util.logging.Formatter; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; final class LoggingConfigurator { + private static final String JUL_FORMAT_PROPERTY = "java.util.logging.SimpleFormatter.format"; + private static final String JUL_SIMPLE_FORMAT = "[%1$tT] [JUL] %5$s%6$s%n"; + private static final String JUL_DETAILED_FORMAT = "[%1$tT] [JUL/%4$s] [%3$s] %5$s%6$s%n"; + private static final String CONSOLE_CHARSET_PROPERTY = "luminara.console.charset"; + private static final String ANSI_FLAG_PROPERTY = "terminal.ansi"; + private static final String COLOR_RESET = "\u001B[0m"; + private static final String COLOR_BOLD = "\u001B[1m"; + private static final String COLOR_CYAN = "\u001B[36m"; + private static final String COLOR_MAGENTA = "\u001B[35m"; + private static final String COLOR_GREEN = "\u001B[32m"; + private static final String COLOR_YELLOW = "\u001B[33m"; + private static final String COLOR_RED = "\u001B[31m"; + private static final String COLOR_BLUE = "\u001B[34m"; + private static final String COLOR_AQUA = "\u001B[36m"; + private static final String COLOR_GRAY = "\u001B[37m"; + private static final String COLOR_DARK_GRAY = "\u001B[90m"; + private static final String COLOR_LIGHT_RED = "\u001B[91m"; + private static final String COLOR_LIGHT_GREEN = "\u001B[92m"; + private static final String COLOR_LIGHT_YELLOW = "\u001B[93m"; + private static final String COLOR_LIGHT_BLUE = "\u001B[94m"; + private static final String COLOR_LIGHT_MAGENTA = "\u001B[95m"; + private static final String COLOR_LIGHT_AQUA = "\u001B[96m"; + private static final String COLOR_WHITE = "\u001B[37m"; + private static final DateTimeFormatter JUL_TIME = DateTimeFormatter.ofPattern("HH:mm:ss"); + private LoggingConfigurator() { } @@ -24,6 +59,7 @@ static void apply(ConfigSpec spec) { } String configFile = useSimpleFormat ? "arclight-log4j2.xml" : "arclight-log4j2-detailed.xml"; + reconfigureJulLogging(useSimpleFormat); reconfigureLogging(configFile); System.out.println("[Luminara] Applied logging configuration: " + @@ -48,5 +84,153 @@ private static void reconfigureLogging(String configFile) { System.setProperty("log4j.configurationFile", configFile); } } -} + private static void reconfigureJulLogging(boolean useSimpleFormat) { + String format = useSimpleFormat ? JUL_SIMPLE_FORMAT : JUL_DETAILED_FORMAT; + System.setProperty(JUL_FORMAT_PROPERTY, format); + try { + String outputEncoding = resolveOutputEncoding(); + Formatter formatter = new ColoredJulFormatter(!useSimpleFormat); + refreshAllJulHandlers(formatter, outputEncoding); + // Some JUL handlers are created after bootstrap; refresh once more shortly after startup. + Thread refresher = new Thread(() -> { + try { + Thread.sleep(2500L); + refreshAllJulHandlers(formatter, outputEncoding); + } catch (Throwable ignored) { + } + }, "Luminara-JUL-Refresher"); + refresher.setDaemon(true); + refresher.start(); + } catch (Throwable ignored) { + } + } + + private static void refreshAllJulHandlers(Formatter formatter, String outputEncoding) { + java.util.logging.LogManager manager = java.util.logging.LogManager.getLogManager(); + refreshJulHandlers(manager.getLogger(""), formatter, outputEncoding); + refreshJulHandlers(manager.getLogger("global"), formatter, outputEncoding); + Enumeration names = manager.getLoggerNames(); + while (names.hasMoreElements()) { + String name = names.nextElement(); + refreshJulHandlers(manager.getLogger(name), formatter, outputEncoding); + } + } + + private static String resolveOutputEncoding() { + String[] keys = new String[]{ + CONSOLE_CHARSET_PROPERTY, + "stdout.encoding", + "sun.stdout.encoding", + "native.encoding", + "file.encoding" + }; + for (String key : keys) { + String value = System.getProperty(key); + if (value != null && !value.isBlank()) { + return value; + } + } + return null; + } + + private static void refreshJulHandlers(java.util.logging.Logger logger, Formatter formatter, String outputEncoding) { + if (logger == null) { + return; + } + for (Handler handler : logger.getHandlers()) { + try { + handler.setFormatter(formatter); + } catch (Exception ignored) { + } + if (outputEncoding != null && !outputEncoding.isEmpty()) { + try { + handler.setEncoding(outputEncoding); + } catch (Exception ignored) { + } + } + } + } + + private static final class ColoredJulFormatter extends Formatter { + + private final boolean detailed; + private final boolean useAnsi; + + private ColoredJulFormatter(boolean detailed) { + this.detailed = detailed; + this.useAnsi = !"false".equalsIgnoreCase(System.getProperty(ANSI_FLAG_PROPERTY, "true")); + } + + private static String stripMinecraftFormatting(String message) { + if (message == null || message.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder(message.length()); + for (int i = 0; i < message.length(); i++) { + char c = message.charAt(i); + if (c == '\u00A7' && i + 1 < message.length()) { + i++; + continue; + } + sb.append(c); + } + return sb.toString(); + } + + private static String colorFor(Level level) { + if (level == null) { + return COLOR_GREEN; + } + int value = level.intValue(); + if (value >= Level.SEVERE.intValue()) { + return COLOR_RED; + } + if (value >= Level.WARNING.intValue()) { + return COLOR_YELLOW; + } + return COLOR_GREEN; + } + + @Override + public String format(LogRecord record) { + String time = JUL_TIME.format(Instant.ofEpochMilli(record.getMillis()).atZone(ZoneId.systemDefault()).toLocalTime()); + String level = record.getLevel() == null ? "INFO" : record.getLevel().getLocalizedName(); + String loggerName = record.getLoggerName() == null ? "global" : record.getLoggerName(); + String message = formatMessage(record); + String throwable = ""; + if (record.getThrown() != null) { + StringWriter sw = new StringWriter(); + record.getThrown().printStackTrace(new PrintWriter(sw)); + throwable = sw.toString(); + } + + if (!useAnsi) { + if (detailed) { + return "[" + time + "] [JUL/" + level + "] [" + loggerName + "] " + message + System.lineSeparator() + throwable; + } + return "[" + time + "] [JUL/" + level + "] " + message + System.lineSeparator() + throwable; + } + + String levelColor = colorFor(record.getLevel()); + String coloredMessage = COLOR_WHITE + stripMinecraftFormatting(message); + StringBuilder sb = new StringBuilder(256); + sb.append(COLOR_WHITE).append('[').append(COLOR_RESET) + .append(COLOR_CYAN).append(time).append(COLOR_RESET) + .append(COLOR_WHITE).append(']').append(COLOR_RESET).append(' ') + .append(COLOR_WHITE).append('[').append(COLOR_RESET) + .append(COLOR_BOLD).append(COLOR_LIGHT_MAGENTA).append("JUL").append(COLOR_RESET) + .append(COLOR_WHITE).append('/').append(COLOR_RESET) + .append(levelColor).append(level).append(COLOR_RESET) + .append(COLOR_WHITE).append(']').append(COLOR_RESET); + if (detailed) { + sb.append(' ').append('[').append(COLOR_MAGENTA).append(loggerName).append(COLOR_RESET).append(']'); + } + sb.append(' ').append(coloredMessage).append(COLOR_RESET).append(System.lineSeparator()); + if (!throwable.isEmpty()) { + sb.append(throwable); + } + return sb.toString(); + } + } +} diff --git a/mixins.arclight.refmap.json b/mixins.arclight.refmap.json new file mode 100644 index 000000000..17bd4fb4d --- /dev/null +++ b/mixins.arclight.refmap.json @@ -0,0 +1,3942 @@ +{ + "mappings": { + "io/izzel/arclight/common/mixin/core/world/inventory/ChestContainerMixin": { + "stillValid": "Lnet/minecraft/class_1707;stillValid(Lnet/minecraft/class_1657;)Z", + "(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;I)V": "Lnet/minecraft/class_1707;(Lnet/minecraft/class_3917;ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/PatrolSpawnerMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawnPatrolMember": "Lnet/minecraft/class_3769;method_16575(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;Z)Z" + }, + "io/izzel/arclight/common/mixin/optimization/general/MobMixin_Optimization": { + "serverAiStep": "Lnet/minecraft/class_1308;serverAiStep()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/EntityMixin": { + "setSwimming": "Lnet/minecraft/class_1297;method_5796(Z)V", + "Lnet/minecraft/world/entity/Entity;removePassenger(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5793(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/world/entity/Entity;getEncodeId()Ljava/lang/String;": "Lnet/minecraft/class_1297;method_5653()Ljava/lang/String;", + "handleNetherPortal": "Lnet/minecraft/class_1297;method_18379()V", + "Lnet/minecraft/world/entity/Entity;handleNetherPortal()V": "Lnet/minecraft/class_1297;method_18379()V", + "spawnAtLocation(Lnet/minecraft/world/item/ItemStack;F)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1297;method_5699(Lnet/minecraft/class_1799;F)Lnet/minecraft/class_1542;", + "Lnet/minecraft/world/entity/Entity;isInLava()Z": "Lnet/minecraft/class_1297;method_5771()Z", + "Lnet/minecraft/world/level/block/Block;stepOn(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_2248;method_9591(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "absMoveTo(DDDFF)V": "Lnet/minecraft/class_1297;method_5641(DDDFF)V", + "saveWithoutId": "Lnet/minecraft/class_1297;method_5647(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;", + "saveAsPassenger": "Lnet/minecraft/class_1297;method_5786(Lnet/minecraft/class_2487;)Z", + "setInvisible": "Lnet/minecraft/class_1297;method_5648(Z)V", + "Lnet/minecraft/world/entity/Entity;changeDimension(Lnet/minecraft/server/level/ServerLevel;)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1297;method_5731(Lnet/minecraft/class_3218;)Lnet/minecraft/class_1297;", + "setAirSupply": "Lnet/minecraft/class_1297;method_5855(I)V", + "startRiding(Lnet/minecraft/world/entity/Entity;Z)Z": "Lnet/minecraft/class_1297;method_5873(Lnet/minecraft/class_1297;Z)Z", + "Lnet/minecraft/network/syncher/SynchedEntityData;set(Lnet/minecraft/network/syncher/EntityDataAccessor;Ljava/lang/Object;)V": "Lnet/minecraft/class_2945;method_12778(Lnet/minecraft/class_2940;Ljava/lang/Object;)V", + "load": "Lnet/minecraft/class_1297;method_5651(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "setRot": "Lnet/minecraft/class_1297;method_5710(FF)V", + "thunderHit": "Lnet/minecraft/class_1297;method_5800(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "setPose": "Lnet/minecraft/class_1297;method_18380(Lnet/minecraft/class_4050;)V", + "lavaHurt": "Lnet/minecraft/class_1297;method_5730()V", + "move": "Lnet/minecraft/class_1297;method_5784(Lnet/minecraft/class_1313;Lnet/minecraft/class_243;)V", + "Lnet/minecraft/nbt/CompoundTag;putUUID(Ljava/lang/String;Ljava/util/UUID;)V": "Lnet/minecraft/class_2487;method_25927(Ljava/lang/String;Ljava/util/UUID;)V", + "Lnet/minecraft/world/entity/Entity;addPassenger(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5627(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "Lnet/minecraft/world/entity/Entity;onGround()Z": "Lnet/minecraft/class_1297;method_24828()Z", + "baseTick": "Lnet/minecraft/class_1297;method_5670()V", + "removeVehicle": "Lnet/minecraft/class_1297;method_29239()V", + "Lnet/minecraft/world/level/material/FluidState;getFlow(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_3610;method_15758(Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;)Lnet/minecraft/class_243;", + "Lnet/minecraft/world/level/block/Block;updateEntityAfterFallOn(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_2248;method_9502(Lnet/minecraft/class_1922;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/nbt/CompoundTag;put(Ljava/lang/String;Lnet/minecraft/nbt/Tag;)Lnet/minecraft/nbt/Tag;": "Lnet/minecraft/class_2487;method_10566(Ljava/lang/String;Lnet/minecraft/class_2520;)Lnet/minecraft/class_2520;", + "restoreFrom": "Lnet/minecraft/class_1297;method_5878(Lnet/minecraft/class_1297;)V", + "getMaxAirSupply": "Lnet/minecraft/class_1297;method_5748()I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ZombifiedPiglinMixin": { + "Lnet/minecraft/world/entity/monster/ZombifiedPiglin;setRemainingPersistentAngerTime(I)V": "Lnet/minecraft/class_1590;setRemainingPersistentAngerTime(I)V", + "startPersistentAngerTimer": "Lnet/minecraft/class_1590;startPersistentAngerTimer()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NoteBlockMixin": { + "Lnet/minecraft/world/level/Level;blockEvent(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;II)V": "Lnet/minecraft/class_1937;method_8427(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;II)V", + "playNote": "Lnet/minecraft/class_2428;method_10367(Lnet/minecraft/class_1297;Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/NaturalSpawnerMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawnMobsForChunkGeneration": "Lnet/minecraft/class_1948;method_8661(Lnet/minecraft/class_5425;Lnet/minecraft/class_6880;Lnet/minecraft/class_1923;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/ServerLevelAccessor;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_5425;method_30771(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;run(Lnet/minecraft/world/entity/Mob;Lnet/minecraft/world/level/chunk/ChunkAccess;)V": "Lnet/minecraft/class_1948$class_5259;run(Lnet/minecraft/class_1308;Lnet/minecraft/class_2791;)V", + "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V": "Lnet/minecraft/class_1948;method_24930(Lnet/minecraft/class_1311;Lnet/minecraft/class_3218;Lnet/minecraft/class_2791;Lnet/minecraft/class_2338;Lnet/minecraft/class_1948$class_5261;Lnet/minecraft/class_1948$class_5259;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/WeightedPressurePlateBlockMixin": { + "Lnet/minecraft/world/level/block/WeightedPressurePlateBlock;getEntityCount(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/phys/AABB;Ljava/lang/Class;)I": "Lnet/minecraft/class_2557;m_289607_(Lnet/minecraft/class_1937;Lnet/minecraft/class_238;Ljava/lang/Class;)I", + "getSignalStrength": "Lnet/minecraft/class_2557;getSignalStrength(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneLampBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "neighborChanged": "Lnet/minecraft/class_2453;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2453;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BambooStalkBlockMixin": { + "performBonemeal": "Lnet/minecraft/class_2211;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;": "Lnet/minecraft/class_2680;m_61143_(Lnet/minecraft/class_2769;)Ljava/lang/Comparable;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LayeredCauldronBlockMixin": { + "lowerFillLevel": "Lnet/minecraft/class_5556;method_31650(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "handlePrecipitation": "Lnet/minecraft/class_5556;handlePrecipitation(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1959$class_1963;)V", + "receiveStalactiteDrip": "Lnet/minecraft/class_5556;receiveStalactiteDrip(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3611;)V", + "Lnet/minecraft/world/level/block/LayeredCauldronBlock;handleEntityOnFireInside(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_5556;method_36994(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/entity/Entity;clearFire()V": "Lnet/minecraft/class_1297;method_5646()V", + "entityInside": "Lnet/minecraft/class_5556;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/IceBlockMixin": { + "melt": "Lnet/minecraft/class_2386;method_10275(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NyliumBlockMixin": { + "randomTick": "Lnet/minecraft/class_4849;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/EvokerFangsMixin": { + "dealDamageTo": "Lnet/minecraft/class_1669;method_7471(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/state/BlockBehaviour_BlockStateBaseMixin": { + "entityInside": "Lnet/minecraft/class_4970$class_4971;method_26178(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Turtle_LayEggGoalMixin": { + "net.minecraft.world.entity.animal.Turtle$TurtleLayEggGoal": "net/minecraft/class_1481$class_1485" + }, + "io/izzel/arclight/common/mixin/core/stats/StatisticsCounterMixin": { + "Lnet/minecraft/stats/StatsCounter;setValue(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/stats/Stat;I)V": "Lnet/minecraft/class_3469;method_15023(Lnet/minecraft/class_1657;Lnet/minecraft/class_3445;I)V", + "increment": "Lnet/minecraft/class_3469;method_15022(Lnet/minecraft/class_1657;Lnet/minecraft/class_3445;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/AbstractFurnaceContainerMixin": { + "stillValid": "Lnet/minecraft/class_1720;stillValid(Lnet/minecraft/class_1657;)Z", + "(Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/world/item/crafting/RecipeType;Lnet/minecraft/world/inventory/RecipeBookType;ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;)V": "Lnet/minecraft/class_1720;(Lnet/minecraft/class_3917;Lnet/minecraft/class_3956;Lnet/minecraft/class_5421;ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;Lnet/minecraft/class_3913;)V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/WanderingTraderSpawnerMixin": { + "spawn": "Lnet/minecraft/class_3990;method_18018(Lnet/minecraft/class_3218;)Z", + "Lnet/minecraft/world/entity/EntityType;spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_47821(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;)Lnet/minecraft/class_1297;", + "tryToSpawnLlamaFor": "Lnet/minecraft/class_3990;method_18016(Lnet/minecraft/class_3218;Lnet/minecraft/class_3989;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownEnderpearlMixin": { + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "onHit": "Lnet/minecraft/class_1684;onHit(Lnet/minecraft/class_239;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ExperienceOrbMixin": { + "Lnet/minecraft/world/entity/player/Player;giveExperiencePoints(I)V": "Lnet/minecraft/class_1657;method_7255(I)V", + "Lnet/minecraft/world/entity/player/Player;takeXpDelay:I": "Lnet/minecraft/class_1657;field_7504:I", + "getExperienceValue": "Lnet/minecraft/class_1303;method_5918(I)I", + "playerTouch": "Lnet/minecraft/class_1303;playerTouch(Lnet/minecraft/class_1657;)V", + "tick": "Lnet/minecraft/class_1303;tick()V", + "Lnet/minecraft/world/entity/ExperienceOrb;followingPlayer:Lnet/minecraft/world/entity/player/Player;": "Lnet/minecraft/class_1303;field_6162:Lnet/minecraft/class_1657;", + "Lnet/minecraft/world/entity/Entity;tick()V": "Lnet/minecraft/class_1297;method_5773()V" + }, + "io/izzel/arclight/common/mixin/core/world/effect/MobEffectMixin": { + "applyEffectTick": "Lnet/minecraft/class_1291;method_5572(Lnet/minecraft/class_1309;I)V", + "Lnet/minecraft/world/food/FoodData;eat(IF)V": "Lnet/minecraft/class_1702;method_7585(IF)V", + "Lnet/minecraft/world/entity/LivingEntity;heal(F)V": "Lnet/minecraft/class_1309;method_6025(F)V", + "applyInstantenousEffect": "Lnet/minecraft/class_1291;method_5564(Lnet/minecraft/class_1297;Lnet/minecraft/class_1297;Lnet/minecraft/class_1309;ID)V", + "Lnet/minecraft/world/damagesource/DamageSources;magic()Lnet/minecraft/world/damagesource/DamageSource;": "Lnet/minecraft/class_8109;method_48831()Lnet/minecraft/class_1282;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin$ObscureApiCompat": { + "Lnet/minecraft/world/entity/LivingEntity;hurtArmor(Lnet/minecraft/world/damagesource/DamageSource;F)V": "Lnet/minecraft/class_1309;method_6105(Lnet/minecraft/class_1282;F)V", + "getDamageAfterArmorAbsorb": "Lnet/minecraft/class_1309;method_6132(Lnet/minecraft/class_1282;F)F" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/ClientboundCommandsPacket_ArgumentNodeStubMixin": { + "net.minecraft.network.protocol.game.ClientboundCommandsPacket$ArgumentNodeStub": "net/minecraft/class_2641$class_7232", + "serializeCap(Lnet/minecraft/network/FriendlyByteBuf;Lnet/minecraft/commands/synchronization/ArgumentTypeInfo;Lnet/minecraft/commands/synchronization/ArgumentTypeInfo$Template;)V": "Lnet/minecraft/class_2641$class_7232;method_42073(Lnet/minecraft/class_2540;Lnet/minecraft/class_2314;Lnet/minecraft/class_2314$class_7217;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SnowBlockMixin": { + "randomTick": "Lnet/minecraft/class_2488;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/block/SnowLayerBlock;dropResources(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_2488;m_49950_(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/BreakDoorGoalMixin": { + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "tick": "Lnet/minecraft/class_1339;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/DolphinEntity_SwimWithPlayerGoalMixin": { + "start": "Lnet/minecraft/class_1433$class_1436;start()V", + "net.minecraft.world.entity.animal.Dolphin$DolphinSwimWithPlayerGoal": "net/minecraft/class_1433$class_1436", + "tick": "Lnet/minecraft/class_1433$class_1436;tick()V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1657;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/fluid/LavaFluidMixin": { + "spreadTo": "Lnet/minecraft/class_3616;spreadTo(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_3610;)V", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin": { + "Lnet/minecraft/server/level/ServerLevel;addNewPlayer(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3218;method_18213(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;viewDistance:I": "Lnet/minecraft/class_3324;field_14359:I", + "Lnet/minecraft/server/MinecraftServer;getCommands()Lnet/minecraft/commands/Commands;": "Lnet/minecraft/server/MinecraftServer;method_3734()Lnet/minecraft/class_2170;", + "players": "f_11196_:Ljava/util/List;", + "save": "Lnet/minecraft/class_3324;method_14577(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/level/ServerPlayer;resetSentInfo()V": "Lnet/minecraft/class_3222;method_14217()V", + "Lnet/minecraft/server/players/PlayerList;save(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3324;method_14577(Lnet/minecraft/class_3222;)V", + "remove": "Lnet/minecraft/class_3324;method_14611(Lnet/minecraft/class_3222;)V", + "sendPlayerPermissionLevel(Lnet/minecraft/server/level/ServerPlayer;I)V": "Lnet/minecraft/class_3324;method_14596(Lnet/minecraft/class_3222;I)V", + "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V": "Lnet/minecraft/class_3324;method_43514(Lnet/minecraft/class_2561;Z)V", + "placeNewPlayer": "Lnet/minecraft/class_3324;method_14570(Lnet/minecraft/class_2535;Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/MinecraftServer;getLevel(Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/server/MinecraftServer;method_3847(Lnet/minecraft/class_5321;)Lnet/minecraft/class_3218;", + "sendAllPlayerInfo": "Lnet/minecraft/class_3324;method_14594(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;simulationDistance:I": "Lnet/minecraft/class_3324;field_34895:I" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/handshake/CHandshakePacketMixin": { + "Lnet/minecraft/network/FriendlyByteBuf;readUtf(I)Ljava/lang/String;": "Lnet/minecraft/class_2540;method_10800(I)Ljava/lang/String;", + "(Lnet/minecraft/network/FriendlyByteBuf;)V": "Lnet/minecraft/class_2889;(Lnet/minecraft/class_2540;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ZombieMixin": { + "killedEntity": "Lnet/minecraft/class_1642;killedEntity(Lnet/minecraft/class_3218;Lnet/minecraft/class_1309;)Z", + "finalizeSpawn": "Lnet/minecraft/class_1642;finalizeSpawn(Lnet/minecraft/class_5425;Lnet/minecraft/class_1266;Lnet/minecraft/class_3730;Lnet/minecraft/class_1315;Lnet/minecraft/class_2487;)Lnet/minecraft/class_1315;", + "doHurtTarget": "Lnet/minecraft/class_1642;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "convertToZombieType": "Lnet/minecraft/class_1642;method_7200(Lnet/minecraft/class_1299;)V", + "Lnet/minecraft/world/entity/npc/Villager;convertTo(Lnet/minecraft/world/entity/EntityType;Z)Lnet/minecraft/world/entity/Mob;": "Lnet/minecraft/class_1646;m_21406_(Lnet/minecraft/class_1299;Z)Lnet/minecraft/class_1308;", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "Lnet/minecraft/world/entity/monster/Zombie;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1642;m_6710_(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/level/ServerLevelAccessor;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_5425;m_7967_(Lnet/minecraft/class_1297;)Z", + "hurt": "Lnet/minecraft/class_1642;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_OutputContainerMixin": { + "(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_3962$class_3964;(Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/server/commands/EffectCommandMixin": { + "clearEffects": "Lnet/minecraft/class_3043;method_13230(Lnet/minecraft/class_2168;Ljava/util/Collection;)I", + "giveEffect": "Lnet/minecraft/class_3043;method_13227(Lnet/minecraft/class_2168;Ljava/util/Collection;Lnet/minecraft/class_6880;Ljava/lang/Integer;IZ)I", + "clearEffect": "Lnet/minecraft/class_3043;method_13231(Lnet/minecraft/class_2168;Ljava/util/Collection;Lnet/minecraft/class_6880;)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/IronGolemMixin": { + "doPush": "Lnet/minecraft/class_1439;doPush(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/animal/IronGolem;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1439;m_6710_(Lnet/minecraft/class_1309;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ChiseledBookShelfBlockEntityMixin": { + "updateState": "Lnet/minecraft/class_7716;method_47585(I)V", + "load": "Lnet/minecraft/class_7716;load(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemPacketMixin": { + "(Lnet/minecraft/network/FriendlyByteBuf;)V": "Lnet/minecraft/class_2886;(Lnet/minecraft/class_2540;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkSensorBlockMixin": { + "stepOn": "Lnet/minecraft/class_5703;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "activate": "Lnet/minecraft/class_5703;method_32904(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;II)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/world/level/Level;getBlockEntity(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/entity/BlockEntity;": "Lnet/minecraft/class_1937;getBlockEntity(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2586;", + "deactivate": "Lnet/minecraft/class_5703;method_32903(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin": { + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;teleport(DDDFFLjava/util/Set;)V": "Lnet/minecraft/class_3244;method_14360(DDDFFLjava/util/Set;)V", + "teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDFF)V": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDFF)V", + "Lnet/minecraft/server/level/ServerPlayer;tickCount:I": "Lnet/minecraft/class_3222;f_19797_:I", + "updateOptions": "Lnet/minecraft/class_3222;method_14213(Lnet/minecraft/class_2803;)V", + "addAdditionalSaveData": "Lnet/minecraft/class_3222;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/server/level/ServerPlayer;closeContainer()V": "Lnet/minecraft/class_3222;closeContainer()V", + "Lnet/minecraft/server/level/ServerPlayer;setRespawnPosition(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/BlockPos;FZZ)V": "Lnet/minecraft/class_3222;method_26284(Lnet/minecraft/class_5321;Lnet/minecraft/class_2338;FZZ)V", + "awardStat": "Lnet/minecraft/class_3222;awardStat(Lnet/minecraft/class_3445;I)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "setPlayerInput": "Lnet/minecraft/class_3222;method_14218(FFZZ)V", + "doTick": "Lnet/minecraft/class_3222;method_14226()V", + "stopSleepInBed": "Lnet/minecraft/class_3222;stopSleepInBed(ZZ)V", + "openMenu": "Lnet/minecraft/class_3222;openMenu(Lnet/minecraft/class_3908;)Ljava/util/OptionalInt;", + "setCamera": "Lnet/minecraft/class_3222;method_14224(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/server/level/ServerPlayer;setShiftKeyDown(Z)V": "Lnet/minecraft/class_3222;m_20260_(Z)V", + "resetStat": "Lnet/minecraft/class_3222;resetStat(Lnet/minecraft/class_3445;)V", + "startSleepInBed": "Lnet/minecraft/class_3222;startSleepInBed(Lnet/minecraft/class_2338;)Lcom/mojang/datafixers/util/Either;", + "handleTeamKill": "Lnet/minecraft/class_3222;method_14227(Ljava/lang/String;Ljava/lang/String;[Lnet/minecraft/class_274;)V", + "isPvpAllowed": "Lnet/minecraft/class_3222;method_14230()Z", + "createEndPlatform": "Lnet/minecraft/class_3222;method_30313(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/server/level/ServerPlayer;teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDLjava/util/Set;FF)Z": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDLjava/util/Set;FF)Z", + "awardKillScore": "Lnet/minecraft/class_3222;awardKillScore(Lnet/minecraft/class_1297;ILnet/minecraft/class_1282;)V", + "tick": "Lnet/minecraft/class_3222;tick()V", + "Lnet/minecraft/world/MenuProvider;createMenu(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/entity/player/Player;)Lnet/minecraft/world/inventory/AbstractContainerMenu;": "Lnet/minecraft/class_3908;m_7208_(ILnet/minecraft/class_1661;Lnet/minecraft/class_1657;)Lnet/minecraft/class_1703;", + "readAdditionalSaveData": "Lnet/minecraft/class_3222;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "resetSentInfo": "Lnet/minecraft/class_3222;method_14217()V", + "doCloseContainer": "Lnet/minecraft/class_3222;doCloseContainer()V", + "Lnet/minecraft/server/level/ServerPlayer;stopRiding()V": "Lnet/minecraft/class_3222;stopRiding()V", + "Lnet/minecraft/world/scores/Scoreboard;forAllObjectives(Lnet/minecraft/world/scores/criteria/ObjectiveCriteria;Ljava/lang/String;Ljava/util/function/Consumer;)V": "Lnet/minecraft/class_269;method_1162(Lnet/minecraft/class_274;Ljava/lang/String;Ljava/util/function/Consumer;)V", + "Lnet/minecraft/world/entity/Entity;hasExactlyOnePlayerPassenger()Z": "Lnet/minecraft/class_1297;method_5817()Z", + "teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDLjava/util/Set;FF)Z": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDLjava/util/Set;FF)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/MerchantOfferMixin": { + "getCostA": "Lnet/minecraft/class_1914;method_19272()Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/MultifaceSpreaderMixin": { + "getSpreadFromFaceTowardDirection": "Lnet/minecraft/class_7118;method_41445(Lnet/minecraft/class_2680;Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;Lnet/minecraft/class_2350;Lnet/minecraft/class_7118$class_7122;)Ljava/util/Optional;", + "spreadToFace": "Lnet/minecraft/class_7118;method_41441(Lnet/minecraft/class_1936;Lnet/minecraft/class_7118$class_7121;Z)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/piglin/PiglinAiMixin": { + "canAdmire": "Lnet/minecraft/class_4838;method_27086(Lnet/minecraft/class_4836;Lnet/minecraft/class_1799;)Z", + "stopHoldingOffHandItem": "Lnet/minecraft/class_4838;method_24741(Lnet/minecraft/class_4836;Z)V", + "isNotHoldingLovedItemInOffHand": "Lnet/minecraft/class_4838;method_24850(Lnet/minecraft/class_4836;)Z", + "Lnet/minecraft/world/entity/monster/piglin/PiglinAi;throwItems(Lnet/minecraft/world/entity/monster/piglin/Piglin;Ljava/util/List;)V": "Lnet/minecraft/class_4838;method_24772(Lnet/minecraft/class_4836;Ljava/util/List;)V", + "Lnet/minecraft/world/entity/monster/piglin/PiglinAi;isLovedItem(Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4838;method_24735(Lnet/minecraft/class_1799;)Z", + "wantsToPickup": "Lnet/minecraft/class_4838;method_24730(Lnet/minecraft/class_4836;Lnet/minecraft/class_1799;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/SmallFireballMixin": { + "onHitBlock": "Lnet/minecraft/class_1677;onHitBlock(Lnet/minecraft/class_3965;)V", + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;DDD)V": "Lnet/minecraft/class_1677;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;DDD)V", + "onHitEntity": "Lnet/minecraft/class_1677;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkVeinBlockMixin": { + "attemptUseCharge": "Lnet/minecraft/class_7130;attemptUseCharge(Lnet/minecraft/class_7128$class_7129;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;Lnet/minecraft/class_7128;Z)I", + "attemptPlaceSculk": "Lnet/minecraft/class_7130;method_41515(Lnet/minecraft/class_7128;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)Z", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_MirrorSpellGoalMixin": { + "performSpellCasting": "Lnet/minecraft/class_1581$class_1583;performSpellCasting()V", + "net.minecraft.world.entity.monster.Illusioner$IllusionerMirrorSpellGoal": "net/minecraft/class_1581$class_1583" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raid/RaidManagerMixin": { + "createOrExtendRaid": "Lnet/minecraft/class_3767;method_16540(Lnet/minecraft/class_3222;)Lnet/minecraft/class_3765;", + "Lnet/minecraft/world/entity/raid/Raid;absorbBadOmen(Lnet/minecraft/world/entity/player/Player;)V": "Lnet/minecraft/class_3765;method_16518(Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/WitherSkullBlockMixin": { + "checkSpawn": "Lnet/minecraft/class_2570;method_10898(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2631;)V", + "Lnet/minecraft/world/level/block/CarvedPumpkinBlock;clearPatternBlocks(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/block/state/pattern/BlockPattern$BlockPatternMatch;)V": "Lnet/minecraft/class_2276;method_45454(Lnet/minecraft/class_1937;Lnet/minecraft/class_2700$class_2702;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/boss/wither/WitherBoss;makeInvulnerable()V": "Lnet/minecraft/class_1528;method_6885()V" + }, + "io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin": { + "Lnet/minecraft/world/inventory/MerchantMenu;setSelectionHint(I)V": "Lnet/minecraft/class_1728;method_7650(I)V", + "Lnet/minecraft/server/level/ServerPlayer;serverLevel()Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/class_3222;method_51469()Lnet/minecraft/class_3218;", + "handleResourcePackResponse": "Lnet/minecraft/class_3244;handleResourcePackResponse(Lnet/minecraft/class_2856;)V", + "handlePlayerCommand": "Lnet/minecraft/class_3244;handlePlayerCommand(Lnet/minecraft/class_2848;)V", + "handleTeleportToEntityPacket": "Lnet/minecraft/class_3244;handleTeleportToEntityPacket(Lnet/minecraft/class_2884;)V", + "Lnet/minecraft/server/level/ServerPlayer;resetLastActionTime()V": "Lnet/minecraft/class_3222;method_14234()V", + "handleContainerClose": "Lnet/minecraft/class_3244;handleContainerClose(Lnet/minecraft/class_2815;)V", + "handleUseItemOn": "Lnet/minecraft/class_3244;handleUseItemOn(Lnet/minecraft/class_2885;)V", + "handleContainerButtonClick": "Lnet/minecraft/class_3244;handleContainerButtonClick(Lnet/minecraft/class_2811;)V", + "updateSignText": "Lnet/minecraft/class_3244;method_31282(Lnet/minecraft/class_2877;Ljava/util/List;)V", + "onDisconnect": "Lnet/minecraft/class_3244;onDisconnect(Lnet/minecraft/class_2561;)V", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;unpackAndApplyLastSeen(Lnet/minecraft/network/chat/LastSeenMessages$Update;)Ljava/util/Optional;": "Lnet/minecraft/class_3244;method_45169(Lnet/minecraft/class_7635$class_7636;)Ljava/util/Optional;", + "handleAcceptTeleportPacket": "Lnet/minecraft/class_3244;handleAcceptTeleportPacket(Lnet/minecraft/class_2793;)V", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;performChatCommand(Lnet/minecraft/network/protocol/game/ServerboundChatCommandPacket;Lnet/minecraft/network/chat/LastSeenMessages;)V": "Lnet/minecraft/class_3244;method_45010(Lnet/minecraft/class_7472;Lnet/minecraft/class_7635;)V", + "Lnet/minecraft/server/level/ServerPlayer;doCloseContainer()V": "Lnet/minecraft/class_3222;doCloseContainer()V", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;awaitingPositionFromClient:Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_3244;field_14119:Lnet/minecraft/class_243;", + "handlePlaceRecipe": "Lnet/minecraft/class_3244;handlePlaceRecipe(Lnet/minecraft/class_2840;)V", + "Lnet/minecraft/server/level/ServerPlayer;isChangingDimension()Z": "Lnet/minecraft/class_3222;method_14208()Z", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;awaitingTeleport:I": "Lnet/minecraft/class_3244;field_14123:I", + "handleEditBook": "Lnet/minecraft/class_3244;handleEditBook(Lnet/minecraft/class_2820;)V", + "tryHandleChat": "Lnet/minecraft/class_3244;method_44337(Ljava/lang/String;Ljava/time/Instant;Lnet/minecraft/class_7635$class_7636;)Ljava/util/Optional;", + "handleCustomPayload": "Lnet/minecraft/class_3244;handleCustomPayload(Lnet/minecraft/class_2817;)V", + "handleSelectTrade": "Lnet/minecraft/class_3244;handleSelectTrade(Lnet/minecraft/class_2863;)V", + "Lnet/minecraft/server/players/PlayerList;remove(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3324;method_14611(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V": "Lnet/minecraft/class_3324;method_43514(Lnet/minecraft/class_2561;Z)V", + "send(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketSendListener;)V": "Lnet/minecraft/class_3244;method_14369(Lnet/minecraft/class_2596;Lnet/minecraft/class_7648;)V", + "Lnet/minecraft/network/protocol/game/ServerboundPlaceRecipePacket;getRecipe()Lnet/minecraft/resources/ResourceLocation;": "Lnet/minecraft/class_2840;method_12320()Lnet/minecraft/class_2960;", + "Lnet/minecraft/server/level/ServerPlayer;teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDFF)V": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDFF)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ObserverBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2426;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/frog/TadpoleMixin": { + "ageUp()V": "Lnet/minecraft/class_7110;method_41397()V", + "Lnet/minecraft/world/entity/animal/frog/Tadpole;playSound(Lnet/minecraft/sounds/SoundEvent;FF)V": "Lnet/minecraft/class_7110;m_5496_(Lnet/minecraft/class_3414;FF)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Cat_CatRelaxOnOwnerGoalMixin": { + "net.minecraft.world.entity.animal.Cat$CatRelaxOnOwnerGoal": "net/minecraft/class_1451$class_3699", + "giveMorningGift": "Lnet/minecraft/class_1451$class_3699;method_16097()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/effect/MobEffectUtilMixin": { + "addEffectToPlayersAround": "Lnet/minecraft/class_1292;method_42143(Lnet/minecraft/class_3218;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;DLnet/minecraft/class_1293;I)Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SpreadableSnowyDirtBlockMixin": { + "randomTick": "Lnet/minecraft/class_2500;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/PlayerContainerMixin": { + "slotsChanged": "Lnet/minecraft/class_1723;slotsChanged(Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/InteractWithDoorMixin": { + "Lnet/minecraft/world/level/block/DoorBlock;setOpen(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Z)V": "Lnet/minecraft/class_2323;method_10033(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_2338;Z)V" + }, + "io/izzel/arclight/common/mixin/forge/NetworkHooksMixin": { + "Lnet/minecraft/world/inventory/AbstractContainerMenu;getType()Lnet/minecraft/world/inventory/MenuType;": "Lnet/minecraft/class_1703;method_17358()Lnet/minecraft/class_3917;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/SignBlockEntityMixin": { + "Lnet/minecraft/world/level/Level;sendBlockUpdated(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;I)V": "Lnet/minecraft/class_1937;method_8413(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2680;I)V", + "markUpdated": "Lnet/minecraft/class_2625;method_34272()V", + "Lnet/minecraft/world/level/block/entity/SignBlockEntity;createCommandSourceStack(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/commands/CommandSourceStack;": "Lnet/minecraft/class_2625;method_50006(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2168;", + "executeClickCommandsIfPresent": "Lnet/minecraft/class_2625;method_50007(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Z)Z" + }, + "io/izzel/arclight/common/mixin/core/network/ServerStatusNetHandlerMixin": { + "handleStatusRequest": "Lnet/minecraft/class_3251;handleStatusRequest(Lnet/minecraft/class_2937;)V", + "Lnet/minecraft/network/Connection;send(Lnet/minecraft/network/protocol/Packet;)V": "Lnet/minecraft/class_2535;method_10743(Lnet/minecraft/class_2596;)V" + }, + "io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin": { + "Lnet/minecraft/server/packs/repository/PackRepository;setSelected(Ljava/util/Collection;)V": "Lnet/minecraft/class_3283;method_14447(Ljava/util/Collection;)V", + "stopServer": "Lnet/minecraft/server/MinecraftServer;method_3782()V", + "Lnet/minecraft/server/MinecraftServer;saveAllChunks(ZZZ)Z": "Lnet/minecraft/server/MinecraftServer;method_3723(ZZZ)Z", + "haveTime": "Lnet/minecraft/server/MinecraftServer;method_3866()Z", + "createLevels": "Lnet/minecraft/server/MinecraftServer;method_3786(Lnet/minecraft/class_3949;)V", + "tickChildren": "Lnet/minecraft/server/MinecraftServer;method_3813(Ljava/util/function/BooleanSupplier;)V", + "saveAllChunks": "Lnet/minecraft/server/MinecraftServer;method_3723(ZZZ)Z", + "Lnet/minecraft/server/MinecraftServer;overworld()Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/server/MinecraftServer;method_30002()Lnet/minecraft/class_3218;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/CampfireBlockEntityMixin": { + "Lnet/minecraft/world/level/block/entity/CampfireBlockEntity;cookingProgress:[I": "Lnet/minecraft/class_3924;field_17384:[I", + "placeFood": "Lnet/minecraft/class_3924;method_17503(Lnet/minecraft/class_1297;Lnet/minecraft/class_1799;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/CommandBlockLogicMixin": { + "setName": "Lnet/minecraft/class_1918;method_8290(Lnet/minecraft/class_2561;)V", + "Lnet/minecraft/commands/Commands;performPrefixedCommand(Lnet/minecraft/commands/CommandSourceStack;Ljava/lang/String;)I": "Lnet/minecraft/class_2170;method_44252(Lnet/minecraft/class_2168;Ljava/lang/String;)I", + "performCommand": "Lnet/minecraft/class_1918;method_8301(Lnet/minecraft/class_1937;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BrushableBlockEntityMixin": { + "dropContent": "Lnet/minecraft/class_8174;method_49220(Lnet/minecraft/class_1657;)V", + "load": "Lnet/minecraft/class_8174;load(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/bukkit/CraftWorldMixin": { + "Lnet/minecraft/world/level/biome/Biome;climateSettings:Lnet/minecraft/world/level/biome/Biome$ClimateSettings;": "Lnet/minecraft/class_1959;field_26393:Lnet/minecraft/class_1959$class_5482;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/DolphinMixin": { + "pickUpItem": "Lnet/minecraft/class_1433;pickUpItem(Lnet/minecraft/class_1542;)V", + "Lnet/minecraft/world/entity/animal/Dolphin;setItemSlot(Lnet/minecraft/world/entity/EquipmentSlot;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1433;m_8061_(Lnet/minecraft/class_1304;Lnet/minecraft/class_1799;)V", + "getMaxAirSupply": "Lnet/minecraft/class_1433;getMaxAirSupply()I" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PistonBlockMixin": { + "moveBlocks": "Lnet/minecraft/class_2665;method_11481(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;Z)Z", + "Lnet/minecraft/world/level/block/piston/PistonStructureResolver;getToDestroy()Ljava/util/List;": "Lnet/minecraft/class_2674;method_11536()Ljava/util/List;", + "checkIfExtend": "Lnet/minecraft/class_2665;method_11483(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/Level;blockEvent(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;II)V": "Lnet/minecraft/class_1937;method_8427(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;II)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/FallingBlockEntityMixin": { + "causeFallDamage": "Lnet/minecraft/class_1540;causeFallDamage(FFLnet/minecraft/class_1282;)Z", + "fall": "Lnet/minecraft/class_1540;method_40005(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Lnet/minecraft/class_1540;", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_1540;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/BrewingStandContainerMixin": { + "stillValid": "Lnet/minecraft/class_1708;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;)V": "Lnet/minecraft/class_1708;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;Lnet/minecraft/class_3913;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/OwnerHurtByTargetGoalMixin": { + "start": "Lnet/minecraft/class_1403;start()V" + }, + "io/izzel/arclight/common/mixin/optimization/general/ServerLevelMixin_Optimize": { + "tickChunk": "Lnet/minecraft/class_3218;method_18203(Lnet/minecraft/class_2818;I)V" + }, + "io/izzel/arclight/common/mixin/core/server/WorldLoaderMixin": { + "Lnet/minecraft/server/WorldLoader$WorldDataSupplier;get(Lnet/minecraft/server/WorldLoader$DataLoadContext;)Lnet/minecraft/server/WorldLoader$DataLoadOutput;": "Lnet/minecraft/class_7237$class_6907;get(Lnet/minecraft/class_7237$class_7660;)Lnet/minecraft/class_7237$class_7661;", + "load": "Lnet/minecraft/class_7237;method_42098(Lnet/minecraft/class_7237$class_6906;Lnet/minecraft/class_7237$class_6907;Lnet/minecraft/class_7237$class_7239;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/npc/VillagerMixin": { + "customServerAiStep": "Lnet/minecraft/class_1646;customServerAiStep()V", + "Lnet/minecraft/util/SpawnUtil;trySpawnMob(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/MobSpawnType;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;IIILnet/minecraft/util/SpawnUtil$Strategy;)Ljava/util/Optional;": "Lnet/minecraft/class_7244;method_42122(Lnet/minecraft/class_1299;Lnet/minecraft/class_3730;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;IIILnet/minecraft/class_7244$class_7502;)Ljava/util/Optional;", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "catchUpDemand": "Lnet/minecraft/class_1646;method_21723()V", + "restock": "Lnet/minecraft/class_1646;method_19182()V", + "spawnGolemIfNeeded": "Lnet/minecraft/class_1646;method_20688(Lnet/minecraft/class_3218;JI)V", + "Lnet/minecraft/world/item/trading/MerchantOffer;resetUses()V": "Lnet/minecraft/class_1914;method_19275()V", + "thunderHit": "Lnet/minecraft/class_1646;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "Lnet/minecraft/world/entity/npc/Villager;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1646;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/BoatMixin": { + "Lnet/minecraft/world/entity/vehicle/Boat;isRemoved()Z": "Lnet/minecraft/class_1690;m_213877_()Z", + "checkFallDamage": "Lnet/minecraft/class_1690;checkFallDamage(DZLnet/minecraft/class_2680;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/entity/vehicle/Boat;setHurtDir(I)V": "Lnet/minecraft/class_1690;method_7540(I)V", + "Lnet/minecraft/world/entity/vehicle/Boat;getDamage()F": "Lnet/minecraft/class_1690;method_7554()F", + "tick": "Lnet/minecraft/class_1690;tick()V", + "hurt": "Lnet/minecraft/class_1690;hurt(Lnet/minecraft/class_1282;F)Z", + "push": "Lnet/minecraft/class_1690;push(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/vehicle/Boat;tickBubbleColumn()V": "Lnet/minecraft/class_1690;method_7550()V", + "Lnet/minecraft/world/entity/Entity;push(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5697(Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/LargeFireballMixin": { + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;DDDI)V": "Lnet/minecraft/class_1674;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;DDDI)V", + "Lnet/minecraft/nbt/CompoundTag;getByte(Ljava/lang/String;)B": "Lnet/minecraft/class_2487;method_10571(Ljava/lang/String;)B", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1674;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "onHit": "Lnet/minecraft/class_1674;onHit(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8537(Lnet/minecraft/class_1297;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "readAdditionalSaveData": "Lnet/minecraft/class_1674;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/EnderCrystalItemMixin": { + "useOn": "Lnet/minecraft/class_1774;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;setShowBottom(Z)V": "Lnet/minecraft/class_1511;method_6839(Z)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/gameevent/GameEventDispatcherMixin": { + "Lnet/minecraft/world/level/gameevent/GameEvent;getNotificationRadius()I": "Lnet/minecraft/class_5712;method_32941()I", + "post": "Lnet/minecraft/class_7719;method_45490(Lnet/minecraft/class_5712;Lnet/minecraft/class_243;Lnet/minecraft/class_5712$class_7397;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeManagerMixin": { + "apply": "Lnet/minecraft/class_1863;method_20705(Ljava/util/Map;Lnet/minecraft/class_3300;Lnet/minecraft/class_3695;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/HangingEntityItemMixin": { + "useOn": "Lnet/minecraft/class_1790;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/decoration/HangingEntity;playPlacementSound()V": "Lnet/minecraft/class_1530;method_6894()V" + }, + "io/izzel/arclight/common/mixin/core/server/ServerScoreboardMixin": { + "startTrackingObjective": "Lnet/minecraft/class_2995;method_12939(Lnet/minecraft/class_266;)V", + "stopTrackingObjective": "Lnet/minecraft/class_2995;method_12938(Lnet/minecraft/class_266;)V", + "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V": "Lnet/minecraft/class_3324;method_14581(Lnet/minecraft/class_2596;)V", + "Lnet/minecraft/server/players/PlayerList;getPlayers()Ljava/util/List;": "Lnet/minecraft/class_3324;method_14571()Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DaylightDetectorBlockMixin": { + "updateSignalStrength": "Lnet/minecraft/class_2309;method_9983(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_BlindnessSpellGoalMixin": { + "net.minecraft.world.entity.monster.Illusioner$IllusionerBlindnessSpellGoal": "net/minecraft/class_1581$class_1582", + "performSpellCasting": "Lnet/minecraft/class_1581$class_1582;performSpellCasting()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/ResetProfessionMixin": { + "Lnet/minecraft/world/entity/npc/Villager;setVillagerData(Lnet/minecraft/world/entity/npc/VillagerData;)V": "Lnet/minecraft/class_1646;setVillagerData(Lnet/minecraft/class_3850;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/MinecartTNTMixin": { + "explode(Lnet/minecraft/world/damagesource/DamageSource;D)V": "Lnet/minecraft/class_1701;method_7576(Lnet/minecraft/class_1282;D)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8454(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Lnet/minecraft/class_5362;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_HurtByOtherGoalMixin": { + "net.minecraft.world.entity.animal.Bee$BeeHurtByOtherGoal": "net/minecraft/class_4466$class_4475", + "alertOther": "Lnet/minecraft/class_4466$class_4475;alertOther(Lnet/minecraft/class_1308;Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/Mob;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1308;method_5980(Lnet/minecraft/class_1309;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/LoomContainerMixin": { + "stillValid": "Lnet/minecraft/class_1726;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1726;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SnowLayerBlockMixin": { + "randomTick": "Lnet/minecraft/class_2488;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/block/SnowLayerBlock;dropResources(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_2488;m_49950_(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/storage/ChunkSerializerMixin": { + "Lnet/minecraft/world/level/chunk/ChunkAccess;setLightCorrect(Z)V": "Lnet/minecraft/class_2791;method_12020(Z)V", + "read": "Lnet/minecraft/class_2852;method_12395(Lnet/minecraft/class_3218;Lnet/minecraft/class_4153;Lnet/minecraft/class_1923;Lnet/minecraft/class_2487;)Lnet/minecraft/class_2839;", + "write": "Lnet/minecraft/class_2852;method_12410(Lnet/minecraft/class_3218;Lnet/minecraft/class_2791;)Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/AnimalMixin": { + "spawnChildFromBreeding": "Lnet/minecraft/class_1429;method_24650(Lnet/minecraft/class_3218;Lnet/minecraft/class_1429;)V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "setInLove(Lnet/minecraft/world/entity/player/Player;)V": "Lnet/minecraft/class_1429;method_6480(Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/entity/animal/Animal;inLove:I": "Lnet/minecraft/class_1429;field_6745:I" + }, + "io/izzel/arclight/common/mixin/core/world/level/portal/PortalForcerMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/core/BlockPos;spiralAround(Lnet/minecraft/core/BlockPos;ILnet/minecraft/core/Direction;Lnet/minecraft/core/Direction;)Ljava/lang/Iterable;": "Lnet/minecraft/class_2338;method_30512(Lnet/minecraft/class_2338;ILnet/minecraft/class_2350;Lnet/minecraft/class_2350;)Ljava/lang/Iterable;", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "createPortal": "Lnet/minecraft/class_1946;method_30482(Lnet/minecraft/class_2338;Lnet/minecraft/class_2350$class_2351;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/EntityTypeMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/nbt/CompoundTag;Ljava/util/function/Consumer;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;ZZ)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_5899(Lnet/minecraft/class_3218;Lnet/minecraft/class_2487;Ljava/util/function/Consumer;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;ZZ)Lnet/minecraft/class_1297;", + "spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;ZZ)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_5894(Lnet/minecraft/class_3218;Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;ZZ)Lnet/minecraft/class_1297;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BambooSaplingBlockMixin": { + "growBamboo": "Lnet/minecraft/class_2202;method_9351(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/PrepareRamNearestTargetMixin": { + "start(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/PathfinderMob;J)V": "Lnet/minecraft/class_6336;method_36260(Lnet/minecraft/class_3218;Lnet/minecraft/class_1314;J)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/RemoveBlockGoalMixin": { + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "tick": "Lnet/minecraft/class_1382;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ComparatorBlockMixin": { + "refreshOutputState": "Lnet/minecraft/class_2286;method_9775(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlockMixin": { + "extractProduce": "Lnet/minecraft/class_3962;method_26374(Lnet/minecraft/class_1297;Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;", + "getContainer": "Lnet/minecraft/class_3962;getContainer(Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)Lnet/minecraft/class_1278;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralPlantBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2301;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/entity/PersistentEntitySectionManagerMixin": { + "Lnet/minecraft/world/level/entity/EntityPersistentStorage;storeEntities(Lnet/minecraft/world/level/entity/ChunkEntities;)V": "Lnet/minecraft/class_5571;method_31760(Lnet/minecraft/class_5566;)V", + "processPendingLoads": "Lnet/minecraft/class_5579;method_31853()V", + "processChunkUnload": "Lnet/minecraft/class_5579;method_31837(J)Z", + "storeChunkSections": "Lnet/minecraft/class_5579;method_31812(JLjava/util/function/Consumer;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CauldronBlockMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "receiveStalactiteDrip": "Lnet/minecraft/class_5546;receiveStalactiteDrip(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3611;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/DyeItemMixin": { + "Lnet/minecraft/world/entity/animal/Sheep;setColor(Lnet/minecraft/world/item/DyeColor;)V": "Lnet/minecraft/class_1472;method_6631(Lnet/minecraft/class_1767;)V", + "interactLivingEntity": "Lnet/minecraft/class_1769;interactLivingEntity(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1309;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/MagmaBlockMixin": { + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "stepOn": "Lnet/minecraft/class_2413;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/fluid/FlowingFluidMixin": { + "Lnet/minecraft/world/level/material/FlowingFluid;spreadTo(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/world/level/material/FluidState;)V": "Lnet/minecraft/class_3609;method_15745(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_3610;)V", + "Lnet/minecraft/world/level/material/FlowingFluid;canSpreadTo(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;Lnet/minecraft/world/level/material/Fluid;)Z": "Lnet/minecraft/class_3609;method_15738(Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;Lnet/minecraft/class_3611;)Z", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_3609;tick(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3610;)V", + "spread": "Lnet/minecraft/class_3609;method_15725(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3610;)V", + "spreadToSides": "Lnet/minecraft/class_3609;method_15744(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3610;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PowderSnowBlockMixin": { + "entityInside": "Lnet/minecraft/class_5635;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;m_46961_(Lnet/minecraft/class_2338;Z)Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/MerchantContainerMixin": { + "playTradeSound": "Lnet/minecraft/class_1728;method_20595()V", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/item/trading/Merchant;)V": "Lnet/minecraft/class_1728;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1915;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin": { + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;isLit()Z": "Lnet/minecraft/class_2609;method_11201()Z", + "createExperience": "Lnet/minecraft/class_2609;method_17760(Lnet/minecraft/class_3218;Lnet/minecraft/class_243;IF)V", + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;cookingProgress:I": "Lnet/minecraft/class_2609;field_11989:I", + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;litDuration:I": "Lnet/minecraft/class_2609;field_11980:I", + "serverTick": "Lnet/minecraft/class_2609;method_31651(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2609;)V", + "Lnet/minecraft/world/entity/ExperienceOrb;award(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/phys/Vec3;I)V": "Lnet/minecraft/class_1303;method_31493(Lnet/minecraft/class_3218;Lnet/minecraft/class_243;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CocoaBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "performBonemeal": "Lnet/minecraft/class_2282;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "randomTick": "Lnet/minecraft/class_2282;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/StemBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "performBonemeal": "Lnet/minecraft/class_2513;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "randomTick": "Lnet/minecraft/class_2513;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_GrowCropGoalMixin": { + "Lnet/minecraft/world/level/Level;levelEvent(ILnet/minecraft/core/BlockPos;I)V": "Lnet/minecraft/class_1937;m_46796_(ILnet/minecraft/class_2338;I)V", + "tick": "Lnet/minecraft/class_4466$class_4474;tick()V", + "net.minecraft.world.entity.animal.Bee$BeeGrowCropGoal": "net/minecraft/class_4466$class_4474" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LightningRodBlockMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "onLightningStrike": "Lnet/minecraft/class_5554;method_31648(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "onProjectileHit": "Lnet/minecraft/class_5554;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/server/Main_ServerShutdownThreadMixin": { + "Lnet/minecraft/server/MinecraftServer;halt(Z)V": "Lnet/minecraft/server/MinecraftServer;method_3747(Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/warden/WardenMixin": { + "applyDarknessAround": "Lnet/minecraft/class_7260;method_42204(Lnet/minecraft/class_3218;Lnet/minecraft/class_243;Lnet/minecraft/class_1297;I)V", + "Lnet/minecraft/world/effect/MobEffectUtil;addEffectToPlayersAround(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;DLnet/minecraft/world/effect/MobEffectInstance;I)Ljava/util/List;": "Lnet/minecraft/class_1292;method_42143(Lnet/minecraft/class_3218;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;DLnet/minecraft/class_1293;I)Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/server/level/TicketTypeMixin": { + "timeout": "f_9452_:J" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemOnBlockPacketMixin": { + "(Lnet/minecraft/network/FriendlyByteBuf;)V": "Lnet/minecraft/class_2885;(Lnet/minecraft/class_2540;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ArrowEntityMixin": { + "doPostHurtEffects": "Lnet/minecraft/class_1667;doPostHurtEffects(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/npc/WanderingTraderMixin": { + "updateTrades": "Lnet/minecraft/class_3989;updateTrades()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/OwnerHurtTargetGoalMixin": { + "start": "Lnet/minecraft/class_1406;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/levelgen/structure/templatesystem/StructureTemplateMixin": { + "load": "Lnet/minecraft/class_3499;method_15183(Lnet/minecraft/class_7871;Lnet/minecraft/class_2487;)V", + "save": "Lnet/minecraft/class_3499;method_15175(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FireBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/server/level/ServerLevel;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_3218;m_7471_(Lnet/minecraft/class_2338;Z)Z", + "Lnet/minecraft/world/level/block/Block;defaultBlockState()Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2248;method_9564()Lnet/minecraft/class_2680;", + "tick": "Lnet/minecraft/class_2358;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "updateShape": "Lnet/minecraft/class_2358;updateShape(Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/Level;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_1937;getBlockState(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/storage/PrimaryLevelDataMixin": { + "setTagData": "Lnet/minecraft/class_31;method_158(Lnet/minecraft/class_5455;Lnet/minecraft/class_2487;Lnet/minecraft/class_2487;)V", + "setThundering": "Lnet/minecraft/class_31;setThundering(Z)V", + "setRaining": "Lnet/minecraft/class_31;setRaining(Z)V", + "Lnet/minecraft/world/level/levelgen/WorldGenSettings;encode(Lcom/mojang/serialization/DynamicOps;Lnet/minecraft/world/level/levelgen/WorldOptions;Lnet/minecraft/core/RegistryAccess;)Lcom/mojang/serialization/DataResult;": "Lnet/minecraft/class_7726;method_45539(Lcom/mojang/serialization/DynamicOps;Lnet/minecraft/class_5285;Lnet/minecraft/class_5455;)Lcom/mojang/serialization/DataResult;", + "setDifficulty": "Lnet/minecraft/class_31;setDifficulty(Lnet/minecraft/class_1267;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/AssignProfessionFromJobSiteMixin": { + "Lnet/minecraft/world/entity/npc/Villager;setVillagerData(Lnet/minecraft/world/entity/npc/VillagerData;)V": "Lnet/minecraft/class_1646;setVillagerData(Lnet/minecraft/class_3850;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/SnowGolemMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "aiStep": "Lnet/minecraft/class_1473;aiStep()V", + "shear": "Lnet/minecraft/class_1473;shear(Lnet/minecraft/class_3419;)V", + "Lnet/minecraft/world/damagesource/DamageSources;onFire()Lnet/minecraft/world/damagesource/DamageSource;": "Lnet/minecraft/class_8109;method_48813()Lnet/minecraft/class_1282;", + "Lnet/minecraft/world/entity/animal/SnowGolem;spawnAtLocation(Lnet/minecraft/world/item/ItemStack;F)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1473;m_5552_(Lnet/minecraft/class_1799;F)Lnet/minecraft/class_1542;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/WitherSkullMixin": { + "Lnet/minecraft/world/entity/LivingEntity;heal(F)V": "Lnet/minecraft/class_1309;method_6025(F)V", + "onHit": "Lnet/minecraft/class_1687;onHit(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8537(Lnet/minecraft/class_1297;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "onHitEntity": "Lnet/minecraft/class_1687;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/ShulkerBoxContainerMixin": { + "stillValid": "Lnet/minecraft/class_1733;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;)V": "Lnet/minecraft/class_1733;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FenceGateBlockMixin": { + "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_276867_(Lnet/minecraft/class_2338;)Z", + "neighborChanged": "Lnet/minecraft/class_2349;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ButtonBlockMixin": { + "checkPressed": "Lnet/minecraft/class_2269;method_9715(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "use": "Lnet/minecraft/class_2269;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;": "Lnet/minecraft/class_2680;m_61143_(Lnet/minecraft/class_2769;)Ljava/lang/Comparable;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownPotionMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "dowseFire": "Lnet/minecraft/class_1686;method_7499(Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "Lnet/minecraft/world/level/block/AbstractCandleBlock;extinguish(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_5540;method_31614(Lnet/minecraft/class_1657;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)V", + "onHit": "Lnet/minecraft/class_1686;onHit(Lnet/minecraft/class_239;)V", + "makeAreaOfEffectCloud": "Lnet/minecraft/class_1686;method_7497(Lnet/minecraft/class_1799;Lnet/minecraft/class_1842;)V", + "Lnet/minecraft/world/level/Level;levelEvent(Lnet/minecraft/world/entity/player/Player;ILnet/minecraft/core/BlockPos;I)V": "Lnet/minecraft/class_1937;m_5898_(Lnet/minecraft/class_1657;ILnet/minecraft/class_2338;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/AbstractHurtingProjectileMixin": { + "Lnet/minecraft/world/entity/Entity;getLookAngle()Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_1297;method_5720()Lnet/minecraft/class_243;", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1668;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "Lnet/minecraft/world/entity/projectile/AbstractHurtingProjectile;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1668;m_6532_(Lnet/minecraft/class_239;)V", + "tick": "Lnet/minecraft/class_1668;tick()V", + "hurt": "Lnet/minecraft/class_1668;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/server/BootstrapMixin": { + "bootStrap": "Lnet/minecraft/class_2966;method_12851()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TntBlockMixin": { + "use": "Lnet/minecraft/class_2530;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "playerWillDestroy": "Lnet/minecraft/class_2530;playerWillDestroy(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_276867_(Lnet/minecraft/class_2338;)Z", + "neighborChanged": "Lnet/minecraft/class_2530;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V", + "onPlace": "Lnet/minecraft/class_2530;onPlace(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Z)V", + "onProjectileHit": "Lnet/minecraft/class_2530;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BellBlockEntityMixin": { + "makeRaidersGlow": "Lnet/minecraft/class_3721;method_20521(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Ljava/util/List;)V" + }, + "io/izzel/arclight/common/mixin/optimization/paper/MinecraftServerMixin_PaperWorldCreation": { + "tickChildren": "Lnet/minecraft/server/MinecraftServer;method_3813(Ljava/util/function/BooleanSupplier;)V" + }, + "io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin": { + "Lnet/minecraft/world/item/ItemStack;getItem()Lnet/minecraft/world/item/Item;": "Lnet/minecraft/class_1799;method_7909()Lnet/minecraft/class_1792;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Vex_CopyOwnerTargetGoalMixin": { + "net.minecraft.world.entity.monster.Vex$VexCopyOwnerTargetGoal": "net/minecraft/class_1634$class_1636", + "start": "Lnet/minecraft/class_1634$class_1636;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/FurnaceResultSlotMixin": { + "checkTakeAchievements(Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1719;checkTakeAchievements(Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;awardUsedRecipesAndPopExperience(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_2609;method_17763(Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PoweredRailBlockMixin": { + "updateState": "Lnet/minecraft/class_2442;updateState(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin": { + "Lnet/minecraft/world/level/Level;isClientSide:Z": "Lnet/minecraft/class_1937;field_9236:Z", + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/world/level/chunk/UpgradeData;Lnet/minecraft/world/ticks/LevelChunkTicks;Lnet/minecraft/world/ticks/LevelChunkTicks;J[Lnet/minecraft/world/level/chunk/LevelChunkSection;Lnet/minecraft/world/level/chunk/LevelChunk$PostLoadProcessor;Lnet/minecraft/world/level/levelgen/blending/BlendingData;)V": "Lnet/minecraft/class_2818;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1923;Lnet/minecraft/class_2843;Lnet/minecraft/class_6755;Lnet/minecraft/class_6755;J[Lnet/minecraft/class_2826;Lnet/minecraft/class_2818$class_6829;Lnet/minecraft/class_6749;)V", + "(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ProtoChunk;Lnet/minecraft/world/level/chunk/LevelChunk$PostLoadProcessor;)V": "Lnet/minecraft/class_2818;(Lnet/minecraft/class_3218;Lnet/minecraft/class_2839;Lnet/minecraft/class_2818$class_6829;)V", + "setBlockState": "Lnet/minecraft/class_2818;setBlockState(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Z)Lnet/minecraft/class_2680;", + "removeBlockEntity": "Lnet/minecraft/class_2818;removeBlockEntity(Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/trackingrange/ChunkManagerMixin_TrackingRange": { + "addEntity": "Lnet/minecraft/class_3898;method_18701(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/EntityType;updateInterval()I": "Lnet/minecraft/class_1299;method_18388()I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/TurtleMixin": { + "ageBoundaryReached": "Lnet/minecraft/class_1481;ageBoundaryReached()V", + "Lnet/minecraft/world/entity/animal/Turtle;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;I)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1481;m_20000_(Lnet/minecraft/class_1935;I)Lnet/minecraft/class_1542;", + "layEggCounter": "f_30129_:I", + "thunderHit": "Lnet/minecraft/class_1481;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "setLayingEgg": "m_30236_(Z)V", + "setHasEgg": "m_30234_(Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/HangingEntityMixin": { + "move": "Lnet/minecraft/class_1530;move(Lnet/minecraft/class_1313;Lnet/minecraft/class_243;)V", + "Lnet/minecraft/world/entity/decoration/HangingEntity;discard()V": "Lnet/minecraft/class_1530;m_146870_()V", + "Lnet/minecraft/world/entity/decoration/HangingEntity;kill()V": "Lnet/minecraft/class_1530;m_6074_()V", + "tick": "Lnet/minecraft/class_1530;tick()V", + "hurt": "Lnet/minecraft/class_1530;hurt(Lnet/minecraft/class_1282;F)Z", + "push": "Lnet/minecraft/class_1530;push(DDD)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/ShearsItemMixin": { + "interactLivingEntity": "Lnet/minecraft/class_1820;m_6880_(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1309;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Silverfish_MergeWithStoneGoalMixin": { + "net.minecraft.world.entity.monster.Silverfish$SilverfishMergeWithStoneGoal": "net/minecraft/class_1614$class_1615", + "start": "Lnet/minecraft/class_1614$class_1615;start()V", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/server/level/ChunkMapMixin": { + "upgradeChunkTag": "Lnet/minecraft/class_3898;method_43381(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;", + "Lnet/minecraft/server/level/ServerLevel;dimension()Lnet/minecraft/resources/ResourceKey;": "Lnet/minecraft/class_3218;m_46472_()Lnet/minecraft/class_5321;", + "tick": "m_140280_(Ljava/util/function/BooleanSupplier;)V", + "setViewDistance": "m_140167_(I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LeavesBlockMixin": { + "randomTick": "Lnet/minecraft/class_2397;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/block/LeavesBlock;dropResources(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_2397;m_49950_(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SignBlockMixin": { + "use": "Lnet/minecraft/class_2478;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "openTextEdit": "Lnet/minecraft/class_2478;method_49825(Lnet/minecraft/class_1657;Lnet/minecraft/class_2625;Z)V", + "Lnet/minecraft/world/level/block/SignBlock;openTextEdit(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/entity/SignBlockEntity;Z)V": "Lnet/minecraft/class_2478;method_49825(Lnet/minecraft/class_1657;Lnet/minecraft/class_2625;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CakeBlockMixin": { + "Lnet/minecraft/world/food/FoodData;eat(IF)V": "Lnet/minecraft/class_1702;method_7585(IF)V", + "eat": "Lnet/minecraft/class_2272;method_9719(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1657;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/EndGatewayBlockEntityMixin": { + "teleportEntity": "Lnet/minecraft/class_2643;method_11409(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;Lnet/minecraft/class_2643;)V", + "Lnet/minecraft/world/entity/Entity;setPortalCooldown()V": "Lnet/minecraft/class_1297;method_30229()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DispenserBlockMixin_Accessor": { + "DISPENSER_REGISTRY": "f_52661_:Ljava/util/Map;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/brain/BrainUtilMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "throwItem(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;F)V": "Lnet/minecraft/class_4215;method_43392(Lnet/minecraft/class_1309;Lnet/minecraft/class_1799;Lnet/minecraft/class_243;Lnet/minecraft/class_243;F)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/EatBlockGoalMixin": { + "tick": "Lnet/minecraft/class_1345;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/ExplosionMixin": { + "explode": "Lnet/minecraft/class_1927;method_8348()V", + "blockInteraction": "f_46010_:Lnet/minecraft/world/level/Explosion$BlockInteraction;", + "addBlockDrops": "Lnet/minecraft/class_1927;method_24023(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;Lnet/minecraft/class_1799;Lnet/minecraft/class_2338;)V", + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;DDDFZLnet/minecraft/world/level/Explosion$BlockInteraction;)V": "Lnet/minecraft/class_1927;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1297;DDDFZLnet/minecraft/class_1927$class_4179;)V", + "source": "f_46016_:Lnet/minecraft/world/entity/Entity;", + "radius": "f_46017_:F" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ZombieVillagerMixin": { + "Lnet/minecraft/world/entity/monster/ZombieVillager;removeEffect(Lnet/minecraft/world/effect/MobEffect;)Z": "Lnet/minecraft/class_1641;m_21195_(Lnet/minecraft/class_1291;)Z", + "finishConversion": "Lnet/minecraft/class_1641;method_7197(Lnet/minecraft/class_3218;)V", + "Lnet/minecraft/world/entity/monster/ZombieVillager;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1641;m_7292_(Lnet/minecraft/class_1293;)Z", + "Lnet/minecraft/world/entity/monster/ZombieVillager;convertTo(Lnet/minecraft/world/entity/EntityType;Z)Lnet/minecraft/world/entity/Mob;": "Lnet/minecraft/class_1641;m_21406_(Lnet/minecraft/class_1299;Z)Lnet/minecraft/class_1308;", + "Lnet/minecraft/world/entity/monster/ZombieVillager;spawnAtLocation(Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1641;m_19983_(Lnet/minecraft/class_1799;)Lnet/minecraft/class_1542;", + "startConverting": "Lnet/minecraft/class_1641;method_7199(Ljava/util/UUID;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BushBlockMixin": { + "Lnet/minecraft/world/level/block/Block;defaultBlockState()Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2248;method_9564()Lnet/minecraft/class_2680;", + "updateShape": "Lnet/minecraft/class_2261;updateShape(Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/HopperContainerMixin": { + "stillValid": "Lnet/minecraft/class_1722;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;)V": "Lnet/minecraft/class_1722;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TurtleEggBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2542;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;playSound(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V": "Lnet/minecraft/class_3218;m_5594_(Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_3414;Lnet/minecraft/class_3419;FF)V", + "Lnet/minecraft/world/level/block/TurtleEggBlock;decreaseEggs(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_2542;method_10833(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "destroyEgg": "Lnet/minecraft/class_2542;method_10834(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;I)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/VoxelShapesMixin": { + "createIndexMerger": "Lnet/minecraft/class_259;method_1069(ILit/unimi/dsi/fastutil/doubles/DoubleList;Lit/unimi/dsi/fastutil/doubles/DoubleList;ZZ)Lnet/minecraft/class_255;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/InteractionMixin": { + "Lnet/minecraft/advancements/critereon/PlayerHurtEntityTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;FFZ)V": "Lnet/minecraft/class_2115;method_9097(Lnet/minecraft/class_3222;Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;FFZ)V", + "skipAttackInteraction": "Lnet/minecraft/class_8150;skipAttackInteraction(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Interaction;attack:Lnet/minecraft/world/entity/Interaction$PlayerAction;": "Lnet/minecraft/class_8150;field_42633:Lnet/minecraft/class_8150$class_8151;" + }, + "io/izzel/arclight/common/mixin/core/world/item/FireChargeItemMixin": { + "useOn": "Lnet/minecraft/class_1778;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/item/FireChargeItem;playSound(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_1778;method_18453(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/SpellcastingIllager_UseSpellGoalMixin": { + "Lnet/minecraft/world/entity/monster/SpellcasterIllager$SpellcasterUseSpellGoal;performSpellCasting()V": "Lnet/minecraft/class_1617$class_1620;method_7148()V", + "tick": "Lnet/minecraft/class_1617$class_1620;tick()V" + }, + "io/izzel/arclight/common/mixin/core/commands/arguments/selector/EntitySelectorParserMixin": { + "parseSelector": "Lnet/minecraft/class_2303;method_9917()V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/BaseSpawnerMixin": { + "setEntityId": "Lnet/minecraft/class_1917;method_8274(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/sensing/TemptingSensorMixin": { + "doTick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/PathfinderMob;)V": "Lnet/minecraft/class_5760;method_33213(Lnet/minecraft/class_3218;Lnet/minecraft/class_1314;)V", + "Lnet/minecraft/world/entity/ai/Brain;setMemory(Lnet/minecraft/world/entity/ai/memory/MemoryModuleType;Ljava/lang/Object;)V": "Lnet/minecraft/class_4095;method_18878(Lnet/minecraft/class_4140;Ljava/lang/Object;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/EndPortalBlockMixin": { + "Lnet/minecraft/server/MinecraftServer;getLevel(Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/server/MinecraftServer;method_3847(Lnet/minecraft/class_5321;)Lnet/minecraft/class_3218;", + "entityInside": "Lnet/minecraft/class_2334;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Silverfish_WakeUpFriendsGoalMixin": { + "net.minecraft.world.entity.monster.Silverfish$SilverfishWakeUpFriendsGoal": "net/minecraft/class_1614$class_1616" + }, + "io/izzel/arclight/common/mixin/core/world/entity/PathfinderMobMixin": { + "Lnet/minecraft/world/entity/PathfinderMob;dropLeash(ZZ)V": "Lnet/minecraft/class_1314;m_21455_(ZZ)V", + "tickLeash": "Lnet/minecraft/class_1314;tickLeash()V" + }, + "io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin": { + "onServerExit": "Lnet/minecraft/class_3176;onServerExit()V", + "Lnet/minecraft/commands/Commands;performPrefixedCommand(Lnet/minecraft/commands/CommandSourceStack;Ljava/lang/String;)I": "Lnet/minecraft/class_2170;method_44252(Lnet/minecraft/class_2168;Ljava/lang/String;)I", + "handleConsoleInputs": "Lnet/minecraft/class_3176;method_13941()V", + "Lnet/minecraft/server/dedicated/DedicatedServer;setPlayerList(Lnet/minecraft/server/players/PlayerList;)V": "Lnet/minecraft/class_3176;m_129823_(Lnet/minecraft/class_3324;)V", + "Lnet/minecraft/server/dedicated/DedicatedServerProperties;enableRcon:Z": "Lnet/minecraft/class_3806;field_16818:Z", + "initServer": "Lnet/minecraft/class_3176;initServer()Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RootedDirtBlockMixin": { + "performBonemeal": "Lnet/minecraft/class_5954;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/GuardianMixin": { + "Lnet/minecraft/world/entity/ai/goal/GoalSelector;addGoal(ILnet/minecraft/world/entity/ai/goal/Goal;)V": "Lnet/minecraft/class_1355;method_6277(ILnet/minecraft/class_1352;)V", + "registerGoals": "Lnet/minecraft/class_1577;registerGoals()V" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/ClientboundSystemChatPacketMixin": { + "(Lnet/minecraft/network/chat/Component;Z)V": "Lnet/minecraft/class_7439;(Lnet/minecraft/class_2561;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raider/RaiderMixin": { + "die": "Lnet/minecraft/class_3763;die(Lnet/minecraft/class_1282;)V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1657;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneOreBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "stepOn": "Lnet/minecraft/class_2449;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "randomTick": "Lnet/minecraft/class_2449;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "attack": "Lnet/minecraft/class_2449;attack(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;)V", + "use": "Lnet/minecraft/class_2449;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "interact": "Lnet/minecraft/class_2449;method_10441(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/levelgen/structure/templatesystem/StructurePlaceSettingsMixin": { + "getRandomPalette": "Lnet/minecraft/class_3492;method_15121(Ljava/util/List;Lnet/minecraft/class_2338;)Lnet/minecraft/class_3499$class_5162;", + "Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructurePlaceSettings;getRandom(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/util/RandomSource;": "Lnet/minecraft/class_3492;method_15115(Lnet/minecraft/class_2338;)Lnet/minecraft/class_5819;" + }, + "io/izzel/arclight/common/mixin/core/world/item/PotionItemMixin": { + "finishUsingItem": "Lnet/minecraft/class_1812;finishUsingItem(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)Lnet/minecraft/class_1799;", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BasePressurePlateBlockMixin": { + "checkPressed": "Lnet/minecraft/class_2231;method_9433(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)V", + "Lnet/minecraft/world/level/block/BasePressurePlateBlock;getSignalStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)I": "Lnet/minecraft/class_2231;method_9434(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/LevelMixin": { + "Lnet/minecraft/world/level/block/state/BlockState;updateNeighbourShapes(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;II)V": "Lnet/minecraft/class_2680;m_60705_(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;II)V", + "Lnet/minecraft/world/level/Level;onBlockStateChange(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_1937;method_19282(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2680;)V", + "setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "thread": "f_46423_:Ljava/lang/Thread;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/GrowingPlantHeadBlockMixin": { + "randomTick": "Lnet/minecraft/class_4865;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/server/network/ServerGamePacketListenerImplMixin_Paper": { + "broadcastChatMessage": "Lnet/minecraft/class_3244;method_44155(Lnet/minecraft/class_7471;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/CrossbowItemMixin": { + "shootProjectile": "Lnet/minecraft/class_1764;method_7763(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;Lnet/minecraft/class_1268;Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;FZFFF)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/item/ItemStack;hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Ljava/util/function/Consumer;)V": "Lnet/minecraft/class_1799;method_7956(ILnet/minecraft/class_1309;Ljava/util/function/Consumer;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/WitherRoseBlockMixin": { + "entityInside": "Lnet/minecraft/class_2563;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainerMixin": { + "Lnet/minecraft/world/Container;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1263;method_5447(ILnet/minecraft/class_1799;)V", + "createResult": "Lnet/minecraft/class_3803;method_16695()V", + "Lnet/minecraft/world/inventory/GrindstoneMenu;broadcastChanges()V": "Lnet/minecraft/class_3803;m_38946_()V", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_3803;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/LeadItemMixin": { + "useOn": "Lnet/minecraft/class_1804;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/item/LeadItem;bindPlayerMobs(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/InteractionResult;": "Lnet/minecraft/class_1804;method_7994(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/optimization/general/realtime/ItemEntityMixin_Realtime": { + "tick": "Lnet/minecraft/class_1542;tick()V", + "Lnet/minecraft/world/entity/Entity;tick()V": "Lnet/minecraft/class_1297;method_5773()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/MinecartItemMixin": { + "useOn": "Lnet/minecraft/class_1808;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/saveddata/maps/MapDataMixin": { + "load": "Lnet/minecraft/class_22;method_32371(Lnet/minecraft/class_2487;)Lnet/minecraft/class_22;", + "save": "Lnet/minecraft/class_22;save(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/StriderMixin": { + "Lnet/minecraft/world/entity/monster/Strider;setSuffocating(Z)V": "Lnet/minecraft/class_4985;method_26349(Z)V", + "tick": "Lnet/minecraft/class_4985;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/EggItemMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "use": "Lnet/minecraft/class_1771;use(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1271;", + "Lnet/minecraft/world/level/Level;playSound(Lnet/minecraft/world/entity/player/Player;DDDLnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V": "Lnet/minecraft/class_1937;method_43128(Lnet/minecraft/class_1657;DDDLnet/minecraft/class_3414;Lnet/minecraft/class_3419;FF)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/InfestedBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z", + "spawnInfestation": "Lnet/minecraft/class_2384;method_24797(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/WitchMixin": { + "aiStep": "Lnet/minecraft/class_1640;aiStep()V", + "Lnet/minecraft/world/entity/monster/Witch;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1640;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Ghast_GhastShootFireballGoalMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "net.minecraft.world.entity.monster.Ghast$GhastShootFireballGoal": "net/minecraft/class_1571$class_1574", + "tick": "Lnet/minecraft/class_1571$class_1574;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/FollowOwnerGoalMixin": { + "maybeTeleportTo": "Lnet/minecraft/class_1350;method_23343(III)Z", + "Lnet/minecraft/world/entity/ai/navigation/PathNavigation;stop()V": "Lnet/minecraft/class_1408;method_6340()V", + "Lnet/minecraft/world/entity/TamableAnimal;moveTo(DDDFF)V": "Lnet/minecraft/class_1321;m_7678_(DDDFF)V" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerChunkCache_MainThreadExecutorMixin": { + "net.minecraft.server.level.ServerChunkCache$MainThreadExecutor": "net/minecraft/class_3215$class_4212" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/FireballMixin": { + "Lnet/minecraft/world/entity/projectile/Fireball;setItem(Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_3855;method_16936(Lnet/minecraft/class_1799;)V", + "readAdditionalSaveData": "Lnet/minecraft/class_3855;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/MilkBucketItemMixin": { + "finishUsingItem": "Lnet/minecraft/class_1805;finishUsingItem(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/VillagerMakeLoveMixin": { + "Lnet/minecraft/world/entity/npc/Villager;getBreedOffspring(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/AgeableMob;)Lnet/minecraft/world/entity/npc/Villager;": "Lnet/minecraft/class_1646;method_7225(Lnet/minecraft/class_3218;Lnet/minecraft/class_1296;)Lnet/minecraft/class_1646;", + "breed": "Lnet/minecraft/class_4111;method_18970(Lnet/minecraft/class_3218;Lnet/minecraft/class_1646;Lnet/minecraft/class_1646;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/network/SynchedEntityDataMixin": { + "set(Lnet/minecraft/network/syncher/EntityDataAccessor;Ljava/lang/Object;Z)V": "Lnet/minecraft/class_2945;method_49743(Lnet/minecraft/class_2940;Ljava/lang/Object;Z)V" + }, + "io/izzel/arclight/common/mixin/core/server/PlayerAdvancementsMixin": { + "Lnet/minecraft/advancements/Advancement;getRewards()Lnet/minecraft/advancements/AdvancementRewards;": "Lnet/minecraft/class_161;method_691()Lnet/minecraft/class_170;", + "award": "Lnet/minecraft/class_2985;method_12878(Lnet/minecraft/class_161;Ljava/lang/String;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/gen/feature/structure/SwampHutPieceMixin": { + "Lnet/minecraft/world/level/WorldGenLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_5281;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/ServerLevelAccessor;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_5425;method_30771(Lnet/minecraft/class_1297;)V", + "spawnCat": "Lnet/minecraft/class_3447;method_16181(Lnet/minecraft/class_5425;Lnet/minecraft/class_3341;)V", + "postProcess": "Lnet/minecraft/class_3447;postProcess(Lnet/minecraft/class_5281;Lnet/minecraft/class_5138;Lnet/minecraft/class_2794;Lnet/minecraft/class_5819;Lnet/minecraft/class_3341;Lnet/minecraft/class_1923;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/ItemCombinerMixin": { + "stillValid": "Lnet/minecraft/class_4861;stillValid(Lnet/minecraft/class_1657;)Z" + }, + "io/izzel/arclight/common/mixin/core/server/commands/GameRuleCommandMixin": { + "setRule": "Lnet/minecraft/class_3065;method_13394(Lcom/mojang/brigadier/context/CommandContext;Lnet/minecraft/class_1928$class_4313;)I", + "Lnet/minecraft/server/MinecraftServer;getGameRules()Lnet/minecraft/world/level/GameRules;": "Lnet/minecraft/server/MinecraftServer;method_3767()Lnet/minecraft/class_1928;", + "queryRule": "Lnet/minecraft/class_3065;method_13397(Lnet/minecraft/class_2168;Lnet/minecraft/class_1928$class_4313;)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/axolotl/AxolotlMixin": { + "applySupportingEffects": "Lnet/minecraft/class_5762;method_33223(Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1657;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "getMaxAirSupply": "Lnet/minecraft/class_5762;getMaxAirSupply()I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Evoker_EvokerSummonSpellGoalMixin": { + "performSpellCasting": "Lnet/minecraft/class_1564$class_1567;performSpellCasting()V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "net.minecraft.world.entity.monster.Evoker$EvokerSummonSpellGoal": "net/minecraft/class_1564$class_1567" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/ChickenMixin": { + "aiStep": "Lnet/minecraft/class_1428;aiStep()V", + "Lnet/minecraft/world/entity/animal/Chicken;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1428;m_19998_(Lnet/minecraft/class_1935;)Lnet/minecraft/class_1542;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SweetBerryBushBlockMixin": { + "Lnet/minecraft/world/level/block/SweetBerryBushBlock;popResource(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_3830;m_49840_(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_3830;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "use": "Lnet/minecraft/class_3830;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "entityInside": "Lnet/minecraft/class_3830;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CarvedPumpkinBlockMixin": { + "spawnGolemInWorld": "Lnet/minecraft/class_2276;method_45455(Lnet/minecraft/class_1937;Lnet/minecraft/class_2700$class_2702;Lnet/minecraft/class_1297;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/level/block/CarvedPumpkinBlock;clearPatternBlocks(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/block/state/pattern/BlockPattern$BlockPatternMatch;)V": "Lnet/minecraft/class_2276;method_45454(Lnet/minecraft/class_1937;Lnet/minecraft/class_2700$class_2702;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Phantom_AttackPlayerTargetGoalMixin": { + "net.minecraft.world.entity.monster.Phantom$PhantomAttackPlayerTargetGoal": "net/minecraft/class_1593$class_1595" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/SheepMixin": { + "ate": "Lnet/minecraft/class_1472;ate()V", + "shear": "Lnet/minecraft/class_1472;shear(Lnet/minecraft/class_3419;)V", + "Lnet/minecraft/world/entity/animal/Sheep;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;I)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1472;m_20000_(Lnet/minecraft/class_1935;I)Lnet/minecraft/class_1542;", + "makeContainer": "Lnet/minecraft/class_1472;method_17690(Lnet/minecraft/class_1767;Lnet/minecraft/class_1767;)Lnet/minecraft/class_8566;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BeehiveBlockMixin": { + "Lnet/minecraft/world/entity/animal/Bee;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_4466;m_6710_(Lnet/minecraft/class_1309;)V", + "angerNearbyBees": "Lnet/minecraft/class_4481;method_23893(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/DispenserContainerMixin": { + "stillValid": "Lnet/minecraft/class_1716;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;)V": "Lnet/minecraft/class_1716;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin": { + "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z": "Lnet/minecraft/class_2874;comp_644()Z", + "use": "Lnet/minecraft/class_1755;use(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1271;", + "Lnet/minecraft/world/level/block/BucketPickup;pickupBlock(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_2263;method_9700(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Lnet/minecraft/class_1799;", + "Lnet/minecraft/world/item/ItemUtils;createFilledResult(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_5328;method_30012(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1799;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/server/level/ChunkHolderMixin": { + "updateFutures": "Lnet/minecraft/class_3193;method_14007(Lnet/minecraft/class_3898;Ljava/util/concurrent/Executor;)V", + "blockChanged": "Lnet/minecraft/class_3193;method_14002(Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/server/level/ChunkHolder;changedBlocksPerSection:[Lit/unimi/dsi/fastutil/shorts/ShortSet;": "Lnet/minecraft/class_3193;field_25804:[Lit/unimi/dsi/fastutil/shorts/ShortSet;", + "oldTicketLevel": "f_140006_:I" + }, + "io/izzel/arclight/common/mixin/core/server/commands/TimeCommandMixin": { + "Lnet/minecraft/server/level/ServerLevel;setDayTime(J)V": "Lnet/minecraft/class_3218;method_29199(J)V", + "addTime": "Lnet/minecraft/class_3149;method_13788(Lnet/minecraft/class_2168;I)I", + "Lnet/minecraft/server/MinecraftServer;getAllLevels()Ljava/lang/Iterable;": "Lnet/minecraft/server/MinecraftServer;method_3738()Ljava/lang/Iterable;", + "setTime": "Lnet/minecraft/class_3149;method_13784(Lnet/minecraft/class_2168;I)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/EnderMan_EndermanLeaveBlockGoalMixin": { + "net.minecraft.world.entity.monster.EnderMan$EndermanLeaveBlockGoal": "net/minecraft/class_1560$class_1561", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_1560$class_1561;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/SkeletonTrapGoalMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/animal/horse/SkeletonTrapGoal;createHorse(Lnet/minecraft/world/DifficultyInstance;)Lnet/minecraft/world/entity/animal/horse/AbstractHorse;": "Lnet/minecraft/class_1505;method_6810(Lnet/minecraft/class_1266;)Lnet/minecraft/class_1496;", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/storage/LevelStorageSource_LevelStorageAccessMixin": { + "getDimensionPath": "Lnet/minecraft/class_32$class_5143;method_27424(Lnet/minecraft/class_5321;)Ljava/nio/file/Path;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkSpreaderMixin": { + "addCursor": "Lnet/minecraft/class_7128;method_41480(Lnet/minecraft/class_7128$class_7129;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/ParrotMixin": { + "mobInteract": "Lnet/minecraft/class_1453;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/animal/Parrot;setOrderedToSit(Z)V": "Lnet/minecraft/class_1453;m_21839_(Z)V", + "Lnet/minecraft/world/entity/animal/Parrot;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1453;m_7292_(Lnet/minecraft/class_1293;)Z", + "hurt": "Lnet/minecraft/class_1453;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/FlintAndSteelItemMixin": { + "useOn": "Lnet/minecraft/class_1786;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;playSound(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V": "Lnet/minecraft/class_1937;method_43129(Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_3414;Lnet/minecraft/class_3419;FF)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/WolfMixin": { + "mobInteract": "Lnet/minecraft/class_1493;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/animal/Wolf;heal(F)V": "Lnet/minecraft/class_1493;m_5634_(F)V", + "setTame": "Lnet/minecraft/class_1493;setTame(Z)V", + "Lnet/minecraft/world/entity/animal/Wolf;setOrderedToSit(Z)V": "Lnet/minecraft/class_1493;m_21839_(Z)V", + "Lnet/minecraft/world/entity/animal/Wolf;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1493;m_6710_(Lnet/minecraft/class_1309;)V", + "hurt": "Lnet/minecraft/class_1493;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/horse/AbstractHorseMixin": { + "aiStep": "Lnet/minecraft/class_1496;aiStep()V", + "addAdditionalSaveData": "Lnet/minecraft/class_1496;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "createInventory": "Lnet/minecraft/class_1496;method_6721()V", + "Lnet/minecraft/world/entity/animal/horse/AbstractHorse;heal(F)V": "Lnet/minecraft/class_1496;m_5634_(F)V", + "readAdditionalSaveData": "Lnet/minecraft/class_1496;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "handleEating": "Lnet/minecraft/class_1496;method_6742(Lnet/minecraft/class_1657;Lnet/minecraft/class_1799;)Z", + "handleStartJump": "Lnet/minecraft/class_1496;handleStartJump(I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/FoxMixin": { + "pickUpItem": "Lnet/minecraft/class_4019;pickUpItem(Lnet/minecraft/class_1542;)V", + "Lnet/minecraft/world/entity/animal/Fox;canHoldItem(Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4019;canHoldItem(Lnet/minecraft/class_1799;)Z", + "addTrustedUUID": "m_28515_(Ljava/util/UUID;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/network/ChunkMapMixin_Optimize": { + "move": "Lnet/minecraft/class_3898;method_18713(Lnet/minecraft/class_3222;)V", + "tick()V": "Lnet/minecraft/class_3898;method_18727()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raid/RaidMixin": { + "Lnet/minecraft/world/entity/raid/Raid;getTotalRaidersAlive()I": "Lnet/minecraft/class_3765;method_16517()I", + "Lnet/minecraft/world/entity/raid/Raid;setDirty()V": "Lnet/minecraft/class_3765;method_16520()V", + "Lnet/minecraft/server/level/ServerLevel;isVillage(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_3218;method_19500(Lnet/minecraft/class_2338;)Z", + "joinRaid(ILnet/minecraft/world/entity/raid/Raider;Lnet/minecraft/core/BlockPos;Z)V": "Lnet/minecraft/class_3765;method_16516(ILnet/minecraft/class_3763;Lnet/minecraft/class_2338;Z)V", + "Lnet/minecraft/world/entity/raid/Raid;isStarted()Z": "Lnet/minecraft/class_3765;method_16524()Z", + "Lnet/minecraft/world/entity/raid/Raid;isOver()Z": "Lnet/minecraft/class_3765;method_16832()Z", + "tick": "Lnet/minecraft/class_3765;method_16509()V", + "Lnet/minecraft/advancements/critereon/PlayerTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_2135;method_9141(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/world/entity/raid/Raid;joinRaid(ILnet/minecraft/world/entity/raid/Raider;Lnet/minecraft/core/BlockPos;Z)V": "Lnet/minecraft/class_3765;method_16516(ILnet/minecraft/class_3763;Lnet/minecraft/class_2338;Z)V", + "Lnet/minecraft/world/entity/raid/Raid;setLeader(ILnet/minecraft/world/entity/raid/Raider;)V": "Lnet/minecraft/class_3765;method_16491(ILnet/minecraft/class_3763;)V", + "Lnet/minecraft/world/entity/raid/Raid;ticksActive:J": "Lnet/minecraft/class_3765;field_16605:J", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/raid/Raid;stop()V": "Lnet/minecraft/class_3765;method_16506()V", + "Lnet/minecraft/world/entity/raid/Raid;shouldSpawnGroup()Z": "Lnet/minecraft/class_3765;method_16519()Z", + "spawnGroup": "Lnet/minecraft/class_3765;method_16522(Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BeaconTileEntityMixin": { + "load": "Lnet/minecraft/class_2580;load(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/MapItemMixin": { + "createNewSavedData": "Lnet/minecraft/class_1806;method_32349(Lnet/minecraft/class_1937;IIIZZLnet/minecraft/class_5321;)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LightningBoltMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "Lnet/minecraft/world/entity/LightningBolt;life:I": "Lnet/minecraft/class_1538;field_7185:I", + "Lnet/minecraft/world/entity/Entity;thunderHit(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/LightningBolt;)V": "Lnet/minecraft/class_1297;method_5800(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "tick": "Lnet/minecraft/class_1538;tick()V", + "spawnFire": "Lnet/minecraft/class_1538;method_6960(I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/FishingHookMixin": { + "Lnet/minecraft/world/entity/projectile/FishingHook;timeUntilHooked:I": "Lnet/minecraft/class_1536;field_7172:I", + "checkCollision": "Lnet/minecraft/class_1536;method_6958()V", + "Lnet/minecraft/world/entity/projectile/FishingHook;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1536;m_6532_(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/entity/projectile/FishingHook;playSound(Lnet/minecraft/sounds/SoundEvent;FF)V": "Lnet/minecraft/class_1536;m_5496_(Lnet/minecraft/class_3414;FF)V", + "Lnet/minecraft/util/Mth;nextFloat(Lnet/minecraft/util/RandomSource;FF)F": "Lnet/minecraft/class_3532;method_15344(Lnet/minecraft/class_5819;FF)F", + "Lnet/minecraft/world/level/Level;canSeeSky(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_45527_(Lnet/minecraft/class_2338;)Z", + "catchingFish": "Lnet/minecraft/class_1536;method_6949(Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;isRainingAt(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;method_8520(Lnet/minecraft/class_2338;)Z", + "Lnet/minecraft/util/Mth;nextInt(Lnet/minecraft/util/RandomSource;II)I": "Lnet/minecraft/class_3532;method_15395(Lnet/minecraft/class_5819;II)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ambient/BatMixin": { + "Lnet/minecraft/world/entity/ambient/Bat;setResting(Z)V": "Lnet/minecraft/class_1420;method_6449(Z)V", + "customServerAiStep": "Lnet/minecraft/class_1420;customServerAiStep()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin": { + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1657;m_7292_(Lnet/minecraft/class_1293;)Z", + "aiStep": "Lnet/minecraft/class_1657;aiStep()V", + "stopSleepInBed": "Lnet/minecraft/class_1657;method_7358(ZZ)V", + "Lnet/minecraft/world/entity/player/Player;causeFoodExhaustion(F)V": "Lnet/minecraft/class_1657;method_7322(F)V", + "Lnet/minecraft/world/entity/player/Player;setSharedFlag(IZ)V": "Lnet/minecraft/class_1657;m_20115_(IZ)V", + "turtleHelmetTick": "Lnet/minecraft/class_1657;method_7330()V", + "actuallyHurt": "Lnet/minecraft/class_1657;actuallyHurt(Lnet/minecraft/class_1282;F)V", + "Lnet/minecraft/world/entity/player/Player;sleepCounter:I": "Lnet/minecraft/class_1657;field_7487:I", + "Lnet/minecraft/world/food/FoodData;addExhaustion(F)V": "Lnet/minecraft/class_1702;method_7583(F)V", + "Lnet/minecraft/world/entity/player/Player;heal(F)V": "Lnet/minecraft/class_1657;m_5634_(F)V", + "Lnet/minecraft/world/damagesource/DamageSource;scalesWithDifficulty()Z": "Lnet/minecraft/class_1282;method_5514()Z", + "checkMovementStatistics": "Lnet/minecraft/class_1657;method_7282(DDD)V", + "stopFallFlying": "Lnet/minecraft/class_1657;method_23670()V", + "causeFoodExhaustion": "Lnet/minecraft/class_1657;method_7322(F)V", + "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1657;method_7329(Lnet/minecraft/class_1799;ZZ)Lnet/minecraft/class_1542;", + "jumpFromGround": "Lnet/minecraft/class_1657;jumpFromGround()V", + "travel": "Lnet/minecraft/class_1657;travel(Lnet/minecraft/class_243;)V", + "hurt": "Lnet/minecraft/class_1657;hurt(Lnet/minecraft/class_1282;F)Z", + "startFallFlying": "Lnet/minecraft/class_1657;method_23669()V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/PhantomSpawnerMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "tick": "Lnet/minecraft/class_2910;tick(Lnet/minecraft/class_3218;ZZ)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableProjectileMixin": { + "Lnet/minecraft/world/entity/projectile/ThrowableProjectile;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1682;m_6532_(Lnet/minecraft/class_239;)V", + "tick": "Lnet/minecraft/class_1682;tick()V", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1682;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1309;Lnet/minecraft/class_1937;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/PufferfishEntityMixin": { + "touch": "Lnet/minecraft/class_1454;method_6593(Lnet/minecraft/class_1308;)V", + "playerTouch": "Lnet/minecraft/class_1454;playerTouch(Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/entity/Mob;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1308;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1657;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/MobMixin": { + "checkAndHandleImportantInteractions": "Lnet/minecraft/class_1308;method_29506(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/Mob;setCanPickUpLoot(Z)V": "Lnet/minecraft/class_1308;method_5952(Z)V", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "serverAiStep": "Lnet/minecraft/class_1308;serverAiStep()V", + "interact": "Lnet/minecraft/class_1308;interact(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "convertTo": "Lnet/minecraft/class_1308;method_29243(Lnet/minecraft/class_1299;Z)Lnet/minecraft/class_1308;", + "readAdditionalSaveData": "Lnet/minecraft/class_1308;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "restoreLeashFromSave": "Lnet/minecraft/class_1308;method_5940()V", + "addAdditionalSaveData": "Lnet/minecraft/class_1308;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "doHurtTarget": "Lnet/minecraft/class_1308;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "pickUpItem": "Lnet/minecraft/class_1308;method_5949(Lnet/minecraft/class_1542;)V", + "Lnet/minecraft/world/entity/Mob;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1308;m_19998_(Lnet/minecraft/class_1935;)Lnet/minecraft/class_1542;", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Mob;setLeashedTo(Lnet/minecraft/world/entity/Entity;Z)V": "Lnet/minecraft/class_1308;method_5954(Lnet/minecraft/class_1297;Z)V", + "setCanPickUpLoot": "Lnet/minecraft/class_1308;method_5952(Z)V", + "startRiding": "Lnet/minecraft/class_1308;startRiding(Lnet/minecraft/class_1297;Z)Z", + "removeAfterChangingDimensions": "Lnet/minecraft/class_1308;removeAfterChangingDimensions()V", + "tickLeash": "Lnet/minecraft/class_1308;method_5995()V", + "dropLeash": "Lnet/minecraft/class_1308;method_5932(ZZ)V", + "Lnet/minecraft/world/entity/Mob;dropLeash(ZZ)V": "Lnet/minecraft/class_1308;method_5932(ZZ)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/DefendVillageTargetGoalMixin": { + "start": "Lnet/minecraft/class_1397;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/BlockItemMixin": { + "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_1747;method_7707(Lnet/minecraft/class_1750;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/block/Block;setPlacedBy(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_2248;method_9567(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1309;Lnet/minecraft/class_1799;)V", + "place": "Lnet/minecraft/class_1747;method_7712(Lnet/minecraft/class_1750;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkAccessMixin": { + "setUnsaved": "Lnet/minecraft/class_2791;method_12008(Z)V", + "isUnsaved": "Lnet/minecraft/class_2791;method_12044()Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Panda_HurtByTargetGoalMixin": { + "alertOther": "Lnet/minecraft/class_1440$class_1444;alertOther(Lnet/minecraft/class_1308;Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/Mob;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1308;method_5980(Lnet/minecraft/class_1309;)V", + "net.minecraft.world.entity.animal.Panda$PandaHurtByTargetGoal": "net/minecraft/class_1440$class_1444" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin": { + "Lnet/minecraft/world/entity/LivingEntity;setHealth(F)V": "Lnet/minecraft/class_1309;method_6033(F)V", + "removeAllEffects": "Lnet/minecraft/class_1309;method_6012()Z", + "setArrowCount": "Lnet/minecraft/class_1309;method_6097(I)V", + "Lnet/minecraft/world/entity/LivingEntity;teleportTo(DDD)V": "Lnet/minecraft/class_1309;m_6021_(DDD)V", + "addEatEffect": "Lnet/minecraft/class_1309;method_18865(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)V", + "actuallyHurt": "Lnet/minecraft/class_1309;method_6074(Lnet/minecraft/class_1282;F)V", + "completeUsingItem": "Lnet/minecraft/class_1309;method_6040()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "heal": "Lnet/minecraft/class_1309;method_6025(F)V", + "randomTeleport": "Lnet/minecraft/class_1309;method_6082(DDDZ)Z", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "getHealth": "Lnet/minecraft/class_1309;method_6032()F", + "Lnet/minecraft/world/entity/LivingEntity;setSharedFlag(IZ)V": "Lnet/minecraft/class_1309;m_20115_(IZ)V", + "setHealth": "Lnet/minecraft/class_1309;method_6033(F)V", + "dropAllDeathLoot": "Lnet/minecraft/class_1309;method_16080(Lnet/minecraft/class_1282;)V", + "createWitherRose": "Lnet/minecraft/class_1309;method_23733(Lnet/minecraft/class_1309;)V", + "removeEffectNoUpdate": "Lnet/minecraft/class_1309;method_6111(Lnet/minecraft/class_1291;)Lnet/minecraft/class_1293;", + "readAdditionalSaveData": "Lnet/minecraft/class_1309;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z", + "updateFallFlying": "Lnet/minecraft/class_1309;method_6053()V", + "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V": "Lnet/minecraft/class_1309;method_6005(DDD)V", + "Lnet/minecraft/world/entity/LivingEntity;dropExperience()V": "Lnet/minecraft/class_1309;method_23883()V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z", + "travel": "Lnet/minecraft/class_1309;method_6091(Lnet/minecraft/class_243;)V", + "Lnet/minecraft/world/item/ItemStack;finishUsingItem(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_1799;method_7910(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/SpiderMixin": { + "finalizeSpawn": "Lnet/minecraft/class_1628;finalizeSpawn(Lnet/minecraft/class_5425;Lnet/minecraft/class_1266;Lnet/minecraft/class_3730;Lnet/minecraft/class_1315;Lnet/minecraft/class_2487;)Lnet/minecraft/class_1315;", + "Lnet/minecraft/world/entity/monster/Spider;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1628;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/decoration/ArmorStandMixin": { + "Lnet/minecraft/world/level/block/Block;popResource(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_2248;method_9577(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1799;)V", + "causeDamage": "Lnet/minecraft/class_1531;method_6905(Lnet/minecraft/class_1282;F)V", + "Lnet/minecraft/world/entity/decoration/ArmorStand;invisible:Z": "Lnet/minecraft/class_1531;field_7111:Z", + "Lnet/minecraft/world/entity/player/Player;getAbilities()Lnet/minecraft/world/entity/player/Abilities;": "Lnet/minecraft/class_1657;method_31549()Lnet/minecraft/class_1656;", + "Lnet/minecraft/world/entity/decoration/ArmorStand;dropAllDeathLoot(Lnet/minecraft/world/damagesource/DamageSource;)V": "Lnet/minecraft/class_1531;m_6668_(Lnet/minecraft/class_1282;)V", + "swapItem": "Lnet/minecraft/class_1531;method_6904(Lnet/minecraft/class_1657;Lnet/minecraft/class_1304;Lnet/minecraft/class_1799;Lnet/minecraft/class_1268;)Z", + "Lnet/minecraft/tags/DamageTypeTags;IS_EXPLOSION:Lnet/minecraft/tags/TagKey;": "Lnet/minecraft/class_8103;field_42249:Lnet/minecraft/class_6862;", + "brokenByAnything": "Lnet/minecraft/class_1531;method_6908(Lnet/minecraft/class_1282;)V", + "Lnet/minecraft/world/entity/decoration/ArmorStand;kill()V": "Lnet/minecraft/class_1531;kill()V", + "kill": "Lnet/minecraft/class_1531;kill()V", + "hurt": "Lnet/minecraft/class_1531;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/StandingAndWallBlockItemMixin": { + "getPlacementState": "Lnet/minecraft/class_1827;getPlacementState(Lnet/minecraft/class_1750;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralWallFanBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2299;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/HopperBlockEntityMixin": { + "pushItemsTick": "Lnet/minecraft/class_2614;method_31692(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2614;)V", + "getAttachedContainer": "Lnet/minecraft/class_2614;method_11255(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Lnet/minecraft/class_1263;", + "Lnet/minecraft/world/level/block/entity/HopperBlockEntity;tryMoveItems(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/entity/HopperBlockEntity;Ljava/util/function/BooleanSupplier;)Z": "Lnet/minecraft/class_2614;method_11243(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2614;Ljava/util/function/BooleanSupplier;)Z", + "addItem(Lnet/minecraft/world/Container;Lnet/minecraft/world/entity/item/ItemEntity;)Z": "Lnet/minecraft/class_2614;method_11247(Lnet/minecraft/class_1263;Lnet/minecraft/class_1542;)Z", + "getSourceContainer": "Lnet/minecraft/class_2614;method_11248(Lnet/minecraft/class_1937;Lnet/minecraft/class_2615;)Lnet/minecraft/class_1263;", + "tryTakeInItemFromSlot": "Lnet/minecraft/class_2614;method_11261(Lnet/minecraft/class_2615;Lnet/minecraft/class_1263;ILnet/minecraft/class_2350;)Z", + "Lnet/minecraft/world/level/block/entity/HopperBlockEntity;addItem(Lnet/minecraft/world/Container;Lnet/minecraft/world/Container;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/core/Direction;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_2614;method_11260(Lnet/minecraft/class_1263;Lnet/minecraft/class_1263;Lnet/minecraft/class_1799;Lnet/minecraft/class_2350;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/optimization/paper/PlayerListMixin_PaperWorldCreation": { + "placeNewPlayer": "Lnet/minecraft/class_3324;method_14570(Lnet/minecraft/class_2535;Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;updateEntireScoreboard(Lnet/minecraft/server/ServerScoreboard;Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3324;method_14588(Lnet/minecraft/class_2995;Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ConcretePowderBlockMixin": { + "onLand": "Lnet/minecraft/class_2292;onLand(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2680;Lnet/minecraft/class_1540;)V", + "getStateForPlacement": "Lnet/minecraft/class_2292;getStateForPlacement(Lnet/minecraft/class_1750;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "updateShape": "Lnet/minecraft/class_2292;updateShape(Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/block/ConcretePowderBlock;concrete:Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2292;field_10810:Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/optimization/general/EntityMixin_Optimize": { + "getIndirectPassengersStream": "Lnet/minecraft/class_1297;method_31484()Ljava/util/stream/Stream;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BaseFireBlockMixin": { + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "onPlace": "Lnet/minecraft/class_4770;onPlace(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Z)V", + "entityInside": "Lnet/minecraft/class_4770;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartMixin": { + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;isVehicle()Z": "Lnet/minecraft/class_1688;m_20160_()Z", + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;setRot(FF)V": "Lnet/minecraft/class_1688;m_19915_(FF)V", + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;hasPassenger(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1688;m_20363_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Entity;startRiding(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1297;method_5804(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;handleNetherPortal()V": "Lnet/minecraft/class_1688;m_20157_()V", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1688;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "tick": "Lnet/minecraft/class_1688;tick()V", + "push": "Lnet/minecraft/class_1688;push(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/Entity;push(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5697(Lnet/minecraft/class_1297;)V", + "applyNaturalSlowdown": "Lnet/minecraft/class_1688;method_7525()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FungusBlockMixin": { + "performBonemeal": "Lnet/minecraft/class_4771;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LecternBlockMixin": { + "popBook": "Lnet/minecraft/class_3715;method_17477(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/core/Direction;getStepX()I": "Lnet/minecraft/class_2350;method_10148()I", + "Lnet/minecraft/world/level/Level;getBlockEntity(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/entity/BlockEntity;": "Lnet/minecraft/class_1937;getBlockEntity(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2586;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/piglin/PiglinMixin": { + "addAdditionalSaveData": "Lnet/minecraft/class_4836;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "canReplaceCurrentItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4836;method_24846(Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;)Z", + "holdInOffHand": "Lnet/minecraft/class_4836;method_24845(Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/entity/monster/piglin/PiglinAi;isLovedItem(Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4838;method_24735(Lnet/minecraft/class_1799;)Z", + "readAdditionalSaveData": "Lnet/minecraft/class_4836;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/SmithingTableContainerMixin": { + "Lnet/minecraft/world/inventory/ResultContainer;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1731;setItem(ILnet/minecraft/class_1799;)V", + "createResult": "Lnet/minecraft/class_4862;createResult()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin": { + "Lnet/minecraft/world/item/ItemStack;shrink(I)V": "Lnet/minecraft/class_1799;method_7934(I)V", + "hurtAndBreak": "Lnet/minecraft/class_1799;method_7956(ILnet/minecraft/class_1309;Ljava/util/function/Consumer;)V", + "isSameItemSameTags": "Lnet/minecraft/class_1799;method_31577(Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;)Z", + "hurt": "Lnet/minecraft/class_1799;method_7970(ILnet/minecraft/class_5819;Lnet/minecraft/class_3222;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DirtPathBlockMixin": { + "tick": "Lnet/minecraft/class_2369;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/storage/RegionFileCacheMixin": { + "Lnet/minecraft/world/level/chunk/storage/RegionFile;getChunkDataInputStream(Lnet/minecraft/world/level/ChunkPos;)Ljava/io/DataInputStream;": "Lnet/minecraft/class_2861;method_21873(Lnet/minecraft/class_1923;)Ljava/io/DataInputStream;", + "getRegionFile": "Lnet/minecraft/class_2867;method_12440(Lnet/minecraft/class_1923;)Lnet/minecraft/class_2861;", + "read": "Lnet/minecraft/class_2867;method_17911(Lnet/minecraft/class_1923;)Lnet/minecraft/class_2487;", + "scanChunk": "Lnet/minecraft/class_2867;method_39802(Lnet/minecraft/class_1923;Lnet/minecraft/class_6836;)V", + "write": "Lnet/minecraft/class_2867;method_23726(Lnet/minecraft/class_1923;Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/network/ServerGamePacketListenerImplMixin_Optimize": { + "handleMovePlayer": "Lnet/minecraft/class_3244;handleMovePlayer(Lnet/minecraft/class_2828;)V", + "Lnet/minecraft/server/level/ServerChunkCache;move(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3215;method_14096(Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/CraftingMenuMixin": { + "slotChangedCraftingGrid": "Lnet/minecraft/class_1714;method_17399(Lnet/minecraft/class_1703;Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_8566;Lnet/minecraft/class_1731;)V", + "slotsChanged": "Lnet/minecraft/class_1714;slotsChanged(Lnet/minecraft/class_1263;)V", + "access": "f_39350_:Lnet/minecraft/world/inventory/ContainerLevelAccess;", + "stillValid": "Lnet/minecraft/class_1714;stillValid(Lnet/minecraft/class_1657;)Z", + "Lnet/minecraft/world/inventory/ResultContainer;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1731;setItem(ILnet/minecraft/class_1799;)V", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1714;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BrewingStandBlockEntityMixin": { + "Lnet/minecraft/world/item/ItemStack;shrink(I)V": "Lnet/minecraft/class_1799;method_7934(I)V", + "serverTick": "Lnet/minecraft/class_2589;method_31665(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2589;)V", + "Lnet/minecraft/world/level/block/entity/BrewingStandBlockEntity;ingredient:Lnet/minecraft/world/item/Item;": "Lnet/minecraft/class_2589;field_11881:Lnet/minecraft/class_1792;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DiodeBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2312;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneTorchBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2459;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/boss/enderdragon/EnderCrystalMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "tick": "Lnet/minecraft/class_1511;tick()V", + "Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;remove(Lnet/minecraft/world/entity/Entity$RemovalReason;)V": "Lnet/minecraft/class_1511;m_142687_(Lnet/minecraft/class_1297$class_5529;)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8454(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Lnet/minecraft/class_5362;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "hurt": "Lnet/minecraft/class_1511;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/HarvestFarmlandMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/npc/Villager;J)V": "Lnet/minecraft/class_4217;method_19565(Lnet/minecraft/class_3218;Lnet/minecraft/class_1646;J)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/TargetGoalMixin": { + "stop": "Lnet/minecraft/class_1405;stop()V", + "Lnet/minecraft/world/entity/Mob;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1308;method_5980(Lnet/minecraft/class_1309;)V", + "canContinueToUse": "Lnet/minecraft/class_1405;canContinueToUse()Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/HuskMixin": { + "doHurtTarget": "Lnet/minecraft/class_1576;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkBlockMixin": { + "attemptUseCharge": "Lnet/minecraft/class_7125;attemptUseCharge(Lnet/minecraft/class_7128$class_7129;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;Lnet/minecraft/class_7128;Z)I", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/npc/AbstractVillagerMixin": { + "addOffersFromItemListings": "Lnet/minecraft/class_3988;method_19170(Lnet/minecraft/class_1916;[Lnet/minecraft/class_3853$class_1652;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/MushroomBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "growMushroom": "Lnet/minecraft/class_2420;method_10349(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_5819;)Z", + "randomTick": "Lnet/minecraft/class_2420;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/levelgen/feature/ConfiguredFeature;place(Lnet/minecraft/world/level/WorldGenLevel;Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/util/RandomSource;Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_2975;method_12862(Lnet/minecraft/class_5281;Lnet/minecraft/class_2794;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartContainerMixin": { + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1693;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "(Lnet/minecraft/world/entity/EntityType;DDDLnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1693;(Lnet/minecraft/class_1299;DDDLnet/minecraft/class_1937;)V" + }, + "io/izzel/arclight/common/mixin/core/world/storage/PlayerDataMixin": { + "load": "Lnet/minecraft/class_29;method_261(Lnet/minecraft/class_1657;)Lnet/minecraft/class_2487;", + "Lnet/minecraft/nbt/NbtUtils;getDataVersion(Lnet/minecraft/nbt/CompoundTag;I)I": "Lnet/minecraft/class_2512;method_48309(Lnet/minecraft/class_2487;I)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CropBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2302;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "growCrops(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_2302;method_9826(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "entityInside": "Lnet/minecraft/class_2302;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "getGrowthSpeed": "Lnet/minecraft/class_2302;method_9830(Lnet/minecraft/class_2248;Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;)F" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ConduitBlockEntityMixin": { + "applyEffects": "Lnet/minecraft/class_2597;method_11055(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Ljava/util/List;)V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1657;m_7292_(Lnet/minecraft/class_1293;)Z", + "updateDestroyTarget": "Lnet/minecraft/class_2597;method_11068(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Ljava/util/List;Lnet/minecraft/class_2597;)V", + "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/crafting/ServerRecipeBookMixin": { + "addRecipes": "Lnet/minecraft/class_3441;method_14903(Ljava/util/Collection;Lnet/minecraft/class_3222;)I", + "Lnet/minecraft/world/item/crafting/Recipe;isSpecial()Z": "Lnet/minecraft/class_1860;method_8118()Z", + "sendRecipes": "Lnet/minecraft/class_3441;method_14899(Lnet/minecraft/class_2713$class_2714;Lnet/minecraft/class_3222;Ljava/util/List;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin": { + "load": "Lnet/minecraft/class_2586;method_11014(Lnet/minecraft/class_2487;)V", + "saveWithoutMetadata": "Lnet/minecraft/class_2586;method_38244()Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2298;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NetherPortalBlockMixin": { + "randomTick": "Lnet/minecraft/class_2423;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/entity/EntityType;spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_47821(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;)Lnet/minecraft/class_1297;", + "Lnet/minecraft/world/entity/Entity;handleInsidePortal(Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_1297;method_5717(Lnet/minecraft/class_2338;)V", + "entityInside": "Lnet/minecraft/class_2423;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/RepairContainerMixin": { + "Lnet/minecraft/world/inventory/ResultContainer;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1731;setItem(ILnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/inventory/AnvilMenu;broadcastChanges()V": "Lnet/minecraft/class_1706;m_38946_()V", + "createResult": "Lnet/minecraft/class_1706;createResult()V" + }, + "io/izzel/arclight/common/mixin/core/commands/CommandSourceStackMixin": { + "Lnet/minecraft/server/players/PlayerList;isOp(Lcom/mojang/authlib/GameProfile;)Z": "Lnet/minecraft/class_3324;method_14569(Lcom/mojang/authlib/GameProfile;)Z", + "hasPermission": "Lnet/minecraft/class_2168;hasPermission(I)Z", + "broadcastToAdmins": "Lnet/minecraft/class_2168;method_9212(Lnet/minecraft/class_2561;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainerMixin": { + "stillValid": "Lnet/minecraft/class_3910;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_3910;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/SpawnEggItemMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawnOffspringFromSpawnEgg": "Lnet/minecraft/class_1826;method_24793(Lnet/minecraft/class_1657;Lnet/minecraft/class_1308;Lnet/minecraft/class_1299;Lnet/minecraft/class_3218;Lnet/minecraft/class_243;Lnet/minecraft/class_1799;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralFanBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2297;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/server/ServerFunctionManagerMixin": { + "getDispatcher": "Lnet/minecraft/class_2991;method_12900()Lcom/mojang/brigadier/CommandDispatcher;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Rabbit_RaidGardenGoalMixin": { + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_1463$class_1470;tick()V", + "net.minecraft.world.entity.animal.Rabbit$RaidGardenGoal": "net/minecraft/class_1463$class_1470" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerLevel_EntityCallbacksMixin": { + "onTrackingStart(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218$class_5526;method_31436(Lnet/minecraft/class_1297;)V", + "onTrackingEnd(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218$class_5526;method_31437(Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/WitherSkeletonMixin": { + "doHurtTarget": "Lnet/minecraft/class_1639;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/CaveSpiderMixin": { + "doHurtTarget": "Lnet/minecraft/class_1549;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunk_BoundTickingBlockEntityMixin": { + "Lnet/minecraft/world/level/block/entity/BlockEntityTicker;tick(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/entity/BlockEntity;)V": "Lnet/minecraft/class_5558;tick(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2586;)V", + "tick": "Lnet/minecraft/class_2818$class_5563;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/HurtByTargetGoalMixin": { + "alertOther": "Lnet/minecraft/class_1399;method_6319(Lnet/minecraft/class_1308;Lnet/minecraft/class_1309;)V", + "start": "Lnet/minecraft/class_1399;start()V" + }, + "io/izzel/arclight/common/mixin/optimization/general/chunkload/SleepInBedMixin_Optimize": { + "checkExtraStartConditions": "Lnet/minecraft/class_4123;checkExtraStartConditions(Lnet/minecraft/class_3218;Lnet/minecraft/class_1309;)Z", + "Lnet/minecraft/server/level/ServerLevel;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_3218;m_8055_(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LilyPadBlockMixin": { + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_46953_(Lnet/minecraft/class_2338;ZLnet/minecraft/class_1297;)Z", + "entityInside": "Lnet/minecraft/class_2553;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/horse/TraderLlamaEntity_FollowTraderGoalMixin": { + "start": "Lnet/minecraft/class_3986$class_3987;start()V", + "net.minecraft.world.entity.animal.horse.TraderLlama$TraderLlamaDefendWanderingTraderGoal": "net/minecraft/class_3986$class_3987" + }, + "io/izzel/arclight/common/mixin/core/world/food/FoodDataMixin": { + "Lnet/minecraft/world/food/FoodData;eat(IF)V": "Lnet/minecraft/class_1702;method_7585(IF)V", + "Lnet/minecraft/world/entity/player/Player;heal(F)V": "Lnet/minecraft/class_1657;m_5634_(F)V", + "tick": "Lnet/minecraft/class_1702;method_7588(Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/goat/GoatMixin": { + "mobInteract": "Lnet/minecraft/class_6053;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/item/ItemUtils;createFilledResult(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_5328;method_30012(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1799;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerChunkCacheMixin": { + "Lnet/minecraft/server/level/ChunkHolder;getTicketLevel()I": "Lnet/minecraft/class_3193;method_14005()I", + "runDistanceManagerUpdates": "m_8489_()Z", + "lightEngine": "f_8331_:Lnet/minecraft/server/level/ThreadedLevelLightEngine;", + "Lnet/minecraft/world/level/storage/LevelData;getGameTime()J": "Lnet/minecraft/class_5217;method_188()J", + "getChunkFutureMainThread": "Lnet/minecraft/class_3215;method_14134(IILnet/minecraft/class_2806;Z)Ljava/util/concurrent/CompletableFuture;", + "chunkAbsent": "Lnet/minecraft/class_3215;method_18752(Lnet/minecraft/class_3193;I)Z", + "Lnet/minecraft/world/level/GameRules;getBoolean(Lnet/minecraft/world/level/GameRules$Key;)Z": "Lnet/minecraft/class_1928;method_8355(Lnet/minecraft/class_1928$class_4313;)Z", + "tickChunks": "Lnet/minecraft/class_3215;method_14161()V" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin": { + "blockUpdated": "Lnet/minecraft/class_3218;blockUpdated(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "save": "Lnet/minecraft/class_3218;method_14176(Lnet/minecraft/class_3536;ZZ)V", + "tickChunk": "Lnet/minecraft/class_3218;method_18203(Lnet/minecraft/class_2818;I)V", + "saveLevelData": "Lnet/minecraft/class_3218;method_14188()V", + "tickNonPassenger": "Lnet/minecraft/class_3218;method_18762(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/server/level/ServerLevel;setDayTime(J)V": "Lnet/minecraft/class_3218;method_29199(J)V", + "explode": "Lnet/minecraft/class_3218;explode(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Lnet/minecraft/class_5362;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "unload": "Lnet/minecraft/class_3218;method_18764(Lnet/minecraft/class_2818;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "sendParticles(Lnet/minecraft/core/particles/ParticleOptions;DDDIDDDD)I": "Lnet/minecraft/class_3218;method_14199(Lnet/minecraft/class_2394;DDDIDDDD)I", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Entity;rideTick()V": "Lnet/minecraft/class_1297;method_5842()V", + "tickBlock": "Lnet/minecraft/class_3218;method_14189(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;addNewEntity(Lnet/minecraft/world/level/entity/EntityAccess;)Z": "Lnet/minecraft/class_5579;method_31818(Lnet/minecraft/class_5568;)Z", + "Lnet/minecraft/server/level/ServerLevel;sendParticles(Lnet/minecraft/server/level/ServerPlayer;ZDDDLnet/minecraft/network/protocol/Packet;)Z": "Lnet/minecraft/class_3218;method_14191(Lnet/minecraft/class_3222;ZDDDLnet/minecraft/class_2596;)Z", + "Lnet/minecraft/server/level/ServerLevel;wakeUpAllPlayers()V": "Lnet/minecraft/class_3218;method_23660()V", + "Lnet/minecraft/world/level/block/state/BlockState;tick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/util/RandomSource;)V": "Lnet/minecraft/class_2680;m_222963_(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/Explosion;interactsWithBlocks()Z": "Lnet/minecraft/class_1927;method_46667()Z", + "tick": "Lnet/minecraft/class_3218;method_18765(Ljava/util/function/BooleanSupplier;)V", + "Lnet/minecraft/world/level/block/state/BlockState;randomTick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/util/RandomSource;)V": "Lnet/minecraft/class_2680;m_222972_(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/entity/Entity;tick()V": "Lnet/minecraft/class_1297;method_5773()V", + "addEntity": "Lnet/minecraft/class_3218;method_14175(Lnet/minecraft/class_1297;)Z", + "setMapData": "Lnet/minecraft/class_3218;setMapData(Ljava/lang/String;Lnet/minecraft/class_22;)V", + "gameEvent": "Lnet/minecraft/class_3218;gameEvent(Lnet/minecraft/class_5712;Lnet/minecraft/class_243;Lnet/minecraft/class_5712$class_7397;)V", + "Lnet/minecraft/server/level/ServerLevel;updateNeighborsAt(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V": "Lnet/minecraft/class_3218;updateNeighborsAt(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "tickPassenger": "Lnet/minecraft/class_3218;method_18763(Lnet/minecraft/class_1297;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/decoration/ItemFrameMixin": { + "hurt": "Lnet/minecraft/class_1533;hurt(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/world/entity/decoration/ItemFrame;dropItem(Lnet/minecraft/world/entity/Entity;Z)V": "Lnet/minecraft/class_1533;method_6936(Lnet/minecraft/class_1297;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DetectorRailBlockMixin": { + "checkPressed": "Lnet/minecraft/class_2313;method_10002(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneWireBlockMixin": { + "updatePowerStrength": "Lnet/minecraft/class_2457;method_10485(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/block/RedStoneWireBlock;calculateTargetStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)I": "Lnet/minecraft/class_2457;method_27842(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)I" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/SWorldBorderPacketMixin": { + "(Lnet/minecraft/world/level/border/WorldBorder;)V": "Lnet/minecraft/class_5895;(Lnet/minecraft/class_2784;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/AbstractArrowMixin": { + "Lnet/minecraft/world/entity/projectile/AbstractArrow;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1665;m_6532_(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "tick": "Lnet/minecraft/class_1665;tick()V", + "setOwner": "Lnet/minecraft/class_1665;setOwner(Lnet/minecraft/class_1297;)V", + "onHitEntity": "Lnet/minecraft/class_1665;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/network/ServerLoginNetHandlerMixin": { + "handleCustomQueryPacket": "Lnet/minecraft/class_3248;handleCustomQueryPacket(Lnet/minecraft/class_2913;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/TemptGoalMixin": { + "Lnet/minecraft/world/entity/ai/goal/TemptGoal;player:Lnet/minecraft/world/entity/player/Player;": "Lnet/minecraft/class_1391;field_6617:Lnet/minecraft/class_1657;", + "canUse": "Lnet/minecraft/class_1391;canUse()Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainerMixin": { + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_3971;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CactusBlockMixin": { + "randomTick": "Lnet/minecraft/class_2266;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "entityInside": "Lnet/minecraft/class_2266;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerEntityMixin": { + "sendDirtyEntityData": "Lnet/minecraft/class_3231;method_14306()V", + "Lnet/minecraft/server/level/ServerEntity;broadcastAndSend(Lnet/minecraft/network/protocol/Packet;)V": "Lnet/minecraft/class_3231;method_18758(Lnet/minecraft/class_2596;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainerMixin": { + "stillValid": "Lnet/minecraft/class_1718;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1718;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CampfireBlockMixin": { + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "onProjectileHit": "Lnet/minecraft/class_3922;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ShulkerMixin": { + "hitByShulkerBullet": "Lnet/minecraft/class_1606;method_31547()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BeehiveBlockEntityMixin": { + "emptyAllLivingFromHive": "Lnet/minecraft/class_4482;method_21850(Lnet/minecraft/class_1657;Lnet/minecraft/class_2680;Lnet/minecraft/class_4482$class_4484;)V", + "saveAdditional": "Lnet/minecraft/class_4482;saveAdditional(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/entity/Entity;getType()Lnet/minecraft/world/entity/EntityType;": "Lnet/minecraft/class_1297;method_5864()Lnet/minecraft/class_1299;", + "Lnet/minecraft/world/entity/animal/Bee;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_4466;m_6710_(Lnet/minecraft/class_1309;)V", + "load": "Lnet/minecraft/class_4482;load(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/level/Level;isNight()Z": "Lnet/minecraft/class_1937;method_23886()Z", + "releaseOccupant": "Lnet/minecraft/class_4482;method_21855(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_4482$class_4483;Ljava/util/List;Lnet/minecraft/class_4482$class_4484;Lnet/minecraft/class_2338;)Z", + "addOccupantWithPresetTicks": "Lnet/minecraft/class_4482;method_21849(Lnet/minecraft/class_1297;ZI)V", + "Lnet/minecraft/world/entity/Entity;stopRiding()V": "Lnet/minecraft/class_1297;method_5848()V", + "addOccupantWithPresetTicks(Lnet/minecraft/world/entity/Entity;ZI)V": "Lnet/minecraft/class_4482;method_21849(Lnet/minecraft/class_1297;ZI)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/RavagerMixin": { + "aiStep": "Lnet/minecraft/class_1584;aiStep()V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_46953_(Lnet/minecraft/class_2338;ZLnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/MushroomCowMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/animal/MushroomCow;discard()V": "Lnet/minecraft/class_1438;m_146870_()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TrapDoorBlockMixin": { + "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_276867_(Lnet/minecraft/class_2338;)Z", + "neighborChanged": "Lnet/minecraft/class_2533;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NetherWartBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2421;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ContainerOpenersCounterMixin": { + "Lnet/minecraft/world/level/block/entity/ContainerOpenersCounter;openCount:I": "Lnet/minecraft/class_5561;field_27215:I", + "incrementOpeners": "Lnet/minecraft/class_5561;method_31684(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "recheckOpeners": "Lnet/minecraft/class_5561;method_31686(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "decrementOpeners": "Lnet/minecraft/class_5561;method_31685(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin": { + "load": "Lnet/minecraft/class_7132;load(Lnet/minecraft/class_2487;)V", + "serverTick": "Lnet/minecraft/class_7132;method_41517(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_7132;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FarmBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2344;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "turnToDirt": "Lnet/minecraft/class_2344;method_10125(Lnet/minecraft/class_1297;Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/AgeableMobMixin": { + "addAdditionalSaveData": "Lnet/minecraft/class_1296;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "aiStep": "Lnet/minecraft/class_1296;aiStep()V", + "Lnet/minecraft/world/level/Level;isClientSide:Z": "Lnet/minecraft/class_1937;field_9236:Z", + "readAdditionalSaveData": "Lnet/minecraft/class_1296;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin$ApotheosisCompatMixin": { + "getDamageAfterMagicAbsorb": "Lnet/minecraft/class_1309;method_6036(Lnet/minecraft/class_1282;F)F", + "Lnet/minecraft/world/entity/LivingEntity;hasEffect(Lnet/minecraft/world/effect/MobEffect;)Z": "Lnet/minecraft/class_1309;method_6059(Lnet/minecraft/class_1291;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ElderGuardianMixin": { + "customServerAiStep": "Lnet/minecraft/class_1550;customServerAiStep()V", + "Lnet/minecraft/world/effect/MobEffectUtil;addEffectToPlayersAround(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;DLnet/minecraft/world/effect/MobEffectInstance;I)Ljava/util/List;": "Lnet/minecraft/class_1292;method_42143(Lnet/minecraft/class_3218;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;DLnet/minecraft/class_1293;I)Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownTridentMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "onHitEntity": "Lnet/minecraft/class_1685;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/LecternBlockEntityMixin": { + "createCommandSourceStack": "Lnet/minecraft/class_3722;method_17512(Lnet/minecraft/class_1657;)Lnet/minecraft/class_2168;" + }, + "io/izzel/arclight/common/mixin/core/world/item/ArmorStandItemMixin": { + "useOn": "Lnet/minecraft/class_1742;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/decoration/ArmorStand;moveTo(DDDFF)V": "Lnet/minecraft/class_1531;m_7678_(DDDFF)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkGeneratorMixin": { + "applyBiomeDecoration": "Lnet/minecraft/class_2794;method_12102(Lnet/minecraft/class_5281;Lnet/minecraft/class_2791;Lnet/minecraft/class_5138;)V", + "tryGenerateStructure": "Lnet/minecraft/class_2794;method_41044(Lnet/minecraft/class_7059$class_7060;Lnet/minecraft/class_5138;Lnet/minecraft/class_5455;Lnet/minecraft/class_7138;Lnet/minecraft/class_3485;JLnet/minecraft/class_2791;Lnet/minecraft/class_1923;Lnet/minecraft/class_4076;)Z", + "Lnet/minecraft/world/level/StructureManager;setStartForStructure(Lnet/minecraft/core/SectionPos;Lnet/minecraft/world/level/levelgen/structure/Structure;Lnet/minecraft/world/level/levelgen/structure/StructureStart;Lnet/minecraft/world/level/chunk/StructureAccess;)V": "Lnet/minecraft/class_5138;method_26976(Lnet/minecraft/class_4076;Lnet/minecraft/class_3195;Lnet/minecraft/class_3449;Lnet/minecraft/class_2810;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ScaffoldingBlockMixin": { + "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;": "Lnet/minecraft/class_2680;m_61143_(Lnet/minecraft/class_2769;)Ljava/lang/Comparable;", + "tick": "Lnet/minecraft/class_3736;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raider/Raider_HoldGroundAttackGoalMixin": { + "stop": "Lnet/minecraft/class_3763$class_4223;stop()V", + "start": "Lnet/minecraft/class_3763$class_4223;start()V", + "Lnet/minecraft/world/entity/raid/Raider;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_3763;m_6710_(Lnet/minecraft/class_1309;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/EnderEyeItemMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "use": "Lnet/minecraft/class_1777;use(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1271;" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/ContainerTypeMixin": { + "register(Ljava/lang/String;Lnet/minecraft/world/inventory/MenuType$MenuSupplier;)Lnet/minecraft/world/inventory/MenuType;": "Lnet/minecraft/class_3917;method_17435(Ljava/lang/String;Lnet/minecraft/class_3917$class_3918;)Lnet/minecraft/class_3917;" + }, + "io/izzel/arclight/common/mixin/core/world/item/enchantment/DamageEnchantmentMixin": { + "doPostAttack": "Lnet/minecraft/class_1882;doPostAttack(Lnet/minecraft/class_1309;Lnet/minecraft/class_1297;I)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/AllayMixin": { + "aiStep": "Lnet/minecraft/class_7298;aiStep()V", + "mobInteract": "Lnet/minecraft/class_7298;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "shouldStopDancing": "Lnet/minecraft/class_7298;method_44361()Z", + "Lnet/minecraft/world/entity/animal/allay/Allay;heal(F)V": "Lnet/minecraft/class_7298;m_5634_(F)V", + "duplicateAllay": "Lnet/minecraft/class_7298;method_44363()V", + "Lnet/minecraft/world/entity/animal/allay/Allay;duplicateAllay()V": "Lnet/minecraft/class_7298;method_44363()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ShulkerBulletMixin": { + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/core/Direction$Axis;)V": "Lnet/minecraft/class_1678;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;Lnet/minecraft/class_1297;Lnet/minecraft/class_2350$class_2351;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "hurt": "Lnet/minecraft/class_1678;hurt(Lnet/minecraft/class_1282;F)Z", + "onHitEntity": "Lnet/minecraft/class_1678;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin": { + "destroyAndAck": "Lnet/minecraft/class_3225;method_21717(Lnet/minecraft/class_2338;ILjava/lang/String;)V", + "changeGameModeForPlayer": "Lnet/minecraft/class_3225;method_30118(Lnet/minecraft/class_1934;)Z", + "destroyBlock": "Lnet/minecraft/class_3225;method_14266(Lnet/minecraft/class_2338;)Z", + "tick": "Lnet/minecraft/class_3225;method_14264()V", + "Lnet/minecraft/server/level/ServerPlayerGameMode;destroyBlock(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_3225;method_14266(Lnet/minecraft/class_2338;)Z", + "Lnet/minecraft/server/level/ServerPlayerGameMode;setGameModeForPlayer(Lnet/minecraft/world/level/GameType;Lnet/minecraft/world/level/GameType;)V": "Lnet/minecraft/class_3225;method_14261(Lnet/minecraft/class_1934;Lnet/minecraft/class_1934;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/CreeperMixin": { + "spawnLingeringCloud": "Lnet/minecraft/class_1548;method_7001()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/monster/Creeper;entityData:Lnet/minecraft/network/syncher/SynchedEntityData;": "Lnet/minecraft/class_1548;f_19804_:Lnet/minecraft/class_2945;", + "thunderHit": "Lnet/minecraft/class_1548;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/TridentItemMixin": { + "releaseUsing": "Lnet/minecraft/class_1835;releaseUsing(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;I)V", + "Lnet/minecraft/world/entity/player/Player;getYRot()F": "Lnet/minecraft/class_1657;m_146908_()F", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/item/ItemStack;hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Ljava/util/function/Consumer;)V": "Lnet/minecraft/class_1799;method_7956(ILnet/minecraft/class_1309;Ljava/util/function/Consumer;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BigDripleafBlockMixin": { + "entityInside": "Lnet/minecraft/class_5801;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/block/BigDripleafBlock;setTiltAndScheduleTick(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/properties/Tilt;Lnet/minecraft/sounds/SoundEvent;)V": "Lnet/minecraft/class_5801;method_33605(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_5816;Lnet/minecraft/class_3414;)V", + "onProjectileHit": "Lnet/minecraft/class_5801;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SugarCaneBlockMixin": { + "randomTick": "Lnet/minecraft/class_2523;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/PrimedTntMixin": { + "(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1541;(Lnet/minecraft/class_1937;DDDLnet/minecraft/class_1309;)V", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1541;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/BeaconContainerMixin": { + "stillValid": "Lnet/minecraft/class_1704;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1704;(ILnet/minecraft/class_1263;Lnet/minecraft/class_3913;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ChorusFlowerBlockMixin": { + "randomTick": "Lnet/minecraft/class_2279;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_46953_(Lnet/minecraft/class_2338;ZLnet/minecraft/class_1297;)Z", + "onProjectileHit": "Lnet/minecraft/class_2279;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootDataManagerMixin": { + "apply": "Lnet/minecraft/class_60;method_20712(Ljava/util/Map;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/GoalMixin": { + "reducedTickDelay": "Lnet/minecraft/class_1352;method_38848(I)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableMixin": { + "Lnet/minecraft/world/level/storage/loot/LootTable;getRandomItems(Lnet/minecraft/world/level/storage/loot/LootContext;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;": "Lnet/minecraft/class_52;method_319(Lnet/minecraft/class_47;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;", + "fill": "Lnet/minecraft/class_52;method_329(Lnet/minecraft/class_1263;Lnet/minecraft/class_8567;J)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/SpectralArrowMixin": { + "doPostHurtEffects": "Lnet/minecraft/class_1679;doPostHurtEffects(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkShriekerBlockMixin": { + "stepOn": "Lnet/minecraft/class_7268;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/server/level/ServerLevel;getBlockEntity(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/BlockEntityType;)Ljava/util/Optional;": "Lnet/minecraft/class_3218;m_141902_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2591;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/commands/CommandsMixin": { + "fillUsableCommands": "Lnet/minecraft/class_2170;method_9239(Lcom/mojang/brigadier/tree/CommandNode;Lcom/mojang/brigadier/tree/CommandNode;Lnet/minecraft/class_2168;Ljava/util/Map;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_EatBerriesGoalMixin": { + "Lnet/minecraft/util/RandomSource;nextInt(I)I": "Lnet/minecraft/class_5819;method_43048(I)I", + "pickSweetBerries": "Lnet/minecraft/class_4019$class_4025;method_33587(Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/boss/enderdragon/EnderDragonMixin": { + "aiStep": "Lnet/minecraft/class_1510;aiStep()V", + "Lnet/minecraft/world/entity/boss/enderdragon/phases/DragonPhaseInstance;getFlyTargetLocation()Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_1521;method_6851()Lnet/minecraft/class_243;", + "checkCrystals": "Lnet/minecraft/class_1510;method_6830()V", + "Lnet/minecraft/world/entity/boss/enderdragon/EnderDragon;setHealth(F)V": "Lnet/minecraft/class_1510;m_21153_(F)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BuddingAmethystBlockMixin": { + "randomTick": "Lnet/minecraft/class_5543;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/JukeboxBlockEntityMixin": { + "setRecordWithoutPlaying": "Lnet/minecraft/class_2619;method_49210(Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/level/Level;updateNeighborsAt(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V": "Lnet/minecraft/class_1937;method_8452(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/LecternContainerMixin": { + "clickMenuButton": "Lnet/minecraft/class_3916;clickMenuButton(Lnet/minecraft/class_1657;I)Z", + "stillValid": "Lnet/minecraft/class_3916;stillValid(Lnet/minecraft/class_1657;)Z", + "Lnet/minecraft/world/Container;removeItemNoUpdate(I)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_1263;method_5441(I)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/NearestAttackableTargetGoalMixin": { + "start": "Lnet/minecraft/class_1400;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/BeeMixin": { + "doHurtTarget": "Lnet/minecraft/class_4466;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ShulkerBoxBlockEntityMixin": { + "Lnet/minecraft/world/level/Level;blockEvent(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;II)V": "Lnet/minecraft/class_1937;method_8427(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;II)V", + "startOpen": "Lnet/minecraft/class_2627;startOpen(Lnet/minecraft/class_1657;)V", + "stopOpen": "Lnet/minecraft/class_2627;stopOpen(Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/server/commands/SummonCommandMixin": { + "Lnet/minecraft/server/level/ServerLevel;tryAddFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;method_30736(Lnet/minecraft/class_1297;)Z", + "createEntity": "Lnet/minecraft/class_3138;method_48758(Lnet/minecraft/class_2168;Lnet/minecraft/class_6880$class_6883;Lnet/minecraft/class_243;Lnet/minecraft/class_2487;Z)Lnet/minecraft/class_1297;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DoublePlantBlockMixin": { + "playerWillDestroy": "Lnet/minecraft/class_2320;playerWillDestroy(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/network/chat/TextColorMixin": { + "(ILjava/lang/String;)V": "Lnet/minecraft/class_5251;(ILjava/lang/String;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/realtime/PlayerInteractionManagerMixin_Realtime": { + "Lnet/minecraft/server/level/ServerPlayerGameMode;gameTicks:I": "Lnet/minecraft/class_3225;field_14000:I", + "tick": "Lnet/minecraft/class_3225;method_14264()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/PigMixin": { + "thunderHit": "Lnet/minecraft/class_1452;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin": { + "runAllUpdates": "Lnet/minecraft/class_3204;method_15892(Lnet/minecraft/class_3898;)Z", + "purgeStaleTickets": "m_140776_()V", + "removePlayer": "Lnet/minecraft/class_3204;method_14051(Lnet/minecraft/class_4076;Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/EnderMan_EndermanTakeBlockGoalMixin": { + "net.minecraft.world.entity.monster.EnderMan$EndermanTakeBlockGoal": "net/minecraft/class_1560$class_1563", + "Lnet/minecraft/world/entity/monster/EnderMan;setCarriedBlock(Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_1560;method_7032(Lnet/minecraft/class_2680;)V", + "tick": "Lnet/minecraft/class_1560$class_1563;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/village/VillageSiegeMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "trySpawn": "Lnet/minecraft/class_1419;method_6447(Lnet/minecraft/class_3218;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin": { + "explode": "Lnet/minecraft/class_1671;method_16830()V", + "dealExplosionDamage": "Lnet/minecraft/class_1671;method_7475()V", + "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/AbstractSkeletonMixin": { + "Lnet/minecraft/world/entity/monster/AbstractSkeleton;playSound(Lnet/minecraft/sounds/SoundEvent;FF)V": "Lnet/minecraft/class_1547;m_5496_(Lnet/minecraft/class_3414;FF)V", + "performRangedAttack": "Lnet/minecraft/class_1547;performRangedAttack(Lnet/minecraft/class_1309;F)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BellBlockMixin": { + "Lnet/minecraft/world/level/block/entity/BellBlockEntity;onHit(Lnet/minecraft/core/Direction;)V": "Lnet/minecraft/class_3721;method_17031(Lnet/minecraft/class_2350;)V", + "attemptToRing(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;)Z": "Lnet/minecraft/class_3709;method_17026(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/ItemEntityMixin": { + "merge(Lnet/minecraft/world/entity/item/ItemEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/item/ItemEntity;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;method_18006(Lnet/minecraft/class_1542;Lnet/minecraft/class_1799;Lnet/minecraft/class_1542;Lnet/minecraft/class_1799;)V", + "merge(Lnet/minecraft/world/entity/item/ItemEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;method_24016(Lnet/minecraft/class_1542;Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/entity/item/ItemEntity;markHurt()V": "Lnet/minecraft/class_1542;m_5834_()V", + "Lnet/minecraft/world/entity/item/ItemEntity;setItem(Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;method_6979(Lnet/minecraft/class_1799;)V", + "mergeWithNeighbours": "Lnet/minecraft/class_1542;method_6973()V", + "Lnet/minecraft/world/phys/AABB;inflate(DDD)Lnet/minecraft/world/phys/AABB;": "Lnet/minecraft/class_238;method_1009(DDD)Lnet/minecraft/class_238;", + "hurt": "Lnet/minecraft/class_1542;hurt(Lnet/minecraft/class_1282;F)Z", + "setItem": "Lnet/minecraft/class_1542;method_6979(Lnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/SnifferMixin": { + "dropSeed": "Lnet/minecraft/class_8153;method_49142()V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LeverBlockMixin": { + "use": "Lnet/minecraft/class_2401;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/block/LeverBlock;pull(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2401;method_21846(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PointedDripstoneBlockMixin": { + "Lnet/minecraft/world/level/block/PointedDripstoneBlock;createDripstone(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Lnet/minecraft/world/level/block/state/properties/DripstoneThickness;)V": "Lnet/minecraft/class_5689;method_36370(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;Lnet/minecraft/class_5691;)V", + "grow": "Lnet/minecraft/class_5689;method_36369(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;)V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;m_46961_(Lnet/minecraft/class_2338;Z)Z", + "fallOn": "Lnet/minecraft/class_5689;fallOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;F)V", + "Lnet/minecraft/world/entity/Entity;causeFallDamage(FFLnet/minecraft/world/damagesource/DamageSource;)Z": "Lnet/minecraft/class_1297;method_5747(FFLnet/minecraft/class_1282;)Z", + "createMergedTips": "Lnet/minecraft/class_5689;method_36376(Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)V", + "onProjectileHit": "Lnet/minecraft/class_5689;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TripWireHookBlockMixin": { + "calculateState": "Lnet/minecraft/class_2537;method_10776(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;ZZILnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/block/TripWireHookBlock;emitState(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;ZZZZ)V": "Lnet/minecraft/class_2537;method_10777(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;ZZZZ)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/activationrange/ServerWorldMixin_ActivationRange": { + "tickNonPassenger": "Lnet/minecraft/class_3218;method_18762(Lnet/minecraft/class_1297;)V", + "tick": "Lnet/minecraft/class_3218;method_18765(Ljava/util/function/BooleanSupplier;)V", + "Lnet/minecraft/server/level/ServerLevel;entityTickList:Lnet/minecraft/world/level/entity/EntityTickList;": "Lnet/minecraft/class_3218;field_26934:Lnet/minecraft/class_5574;" + }, + "io/izzel/arclight/common/mixin/core/server/commands/SetSpawnCommandMixin": { + "setSpawn": "Lnet/minecraft/class_3127;method_13645(Lnet/minecraft/class_2168;Ljava/util/Collection;Lnet/minecraft/class_2338;F)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ProjectileMixin": { + "onHitBlock": "Lnet/minecraft/class_1676;method_24920(Lnet/minecraft/class_3965;)V", + "setOwner": "Lnet/minecraft/class_1676;method_7432(Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BlockMixin": { + "Lnet/minecraft/world/entity/player/Player;causeFoodExhaustion(F)V": "Lnet/minecraft/class_1657;method_7322(F)V", + "playerDestroy": "Lnet/minecraft/class_2248;method_9556(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2586;Lnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LiquidBlockMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "shouldSpreadLiquid": "Lnet/minecraft/class_2404;method_10316(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "fizz": "Lnet/minecraft/class_2404;method_10318(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PortalShapeMixin": { + "createPortalBlocks": "Lnet/minecraft/class_2424;method_10363()V", + "createPortalInfo": "Lnet/minecraft/class_2424;method_30484(Lnet/minecraft/class_3218;Lnet/minecraft/class_5459$class_5460;Lnet/minecraft/class_2350$class_2351;Lnet/minecraft/class_243;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;FF)Lnet/minecraft/class_5454;", + "getDistanceUntilEdgeAboveFrame": "Lnet/minecraft/class_2424;method_30493(Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;)I", + "Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate;test(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_4970$class_4973;test(Lnet/minecraft/class_2680;Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;)Z" + }, + "io/izzel/arclight/common/mixin/optimization/general/activationrange/entity/ItemEntityMixin_ActivationRange": { + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1542;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;(Lnet/minecraft/class_1937;DDDLnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_BreedGoalMixin": { + "net.minecraft.world.entity.animal.Fox$FoxBreedGoal": "net/minecraft/class_4019$class_4024" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RespawnAnchorBlockMixin": { + "use": "Lnet/minecraft/class_4969;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/server/level/ServerPlayer;setRespawnPosition(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/BlockPos;FZZ)V": "Lnet/minecraft/class_3222;method_26284(Lnet/minecraft/class_5321;Lnet/minecraft/class_2338;FZZ)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/storage/ChunkLoaderMixin": { + "Lnet/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler;getLegacyStructureHandler(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/storage/DimensionDataStorage;)Lnet/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler;": "Lnet/minecraft/class_3360;method_14745(Lnet/minecraft/class_5321;Lnet/minecraft/class_26;)Lnet/minecraft/class_3360;", + "getLegacyStructureHandler": "Lnet/minecraft/class_3977;method_43411(Lnet/minecraft/class_5321;Ljava/util/function/Supplier;)Lnet/minecraft/class_3360;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DragonEggBlockMixin": { + "Lnet/minecraft/world/level/Level;isClientSide:Z": "Lnet/minecraft/class_1937;field_9236:Z", + "teleport": "Lnet/minecraft/class_2328;method_10047(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + } + }, + "data": { + "named:intermediary": { + "io/izzel/arclight/common/mixin/core/world/inventory/ChestContainerMixin": { + "stillValid": "Lnet/minecraft/class_1707;stillValid(Lnet/minecraft/class_1657;)Z", + "(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;I)V": "Lnet/minecraft/class_1707;(Lnet/minecraft/class_3917;ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/PatrolSpawnerMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawnPatrolMember": "Lnet/minecraft/class_3769;method_16575(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;Z)Z" + }, + "io/izzel/arclight/common/mixin/optimization/general/MobMixin_Optimization": { + "serverAiStep": "Lnet/minecraft/class_1308;serverAiStep()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/EntityMixin": { + "setSwimming": "Lnet/minecraft/class_1297;method_5796(Z)V", + "Lnet/minecraft/world/entity/Entity;removePassenger(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5793(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/world/entity/Entity;getEncodeId()Ljava/lang/String;": "Lnet/minecraft/class_1297;method_5653()Ljava/lang/String;", + "handleNetherPortal": "Lnet/minecraft/class_1297;method_18379()V", + "Lnet/minecraft/world/entity/Entity;handleNetherPortal()V": "Lnet/minecraft/class_1297;method_18379()V", + "spawnAtLocation(Lnet/minecraft/world/item/ItemStack;F)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1297;method_5699(Lnet/minecraft/class_1799;F)Lnet/minecraft/class_1542;", + "Lnet/minecraft/world/entity/Entity;isInLava()Z": "Lnet/minecraft/class_1297;method_5771()Z", + "Lnet/minecraft/world/level/block/Block;stepOn(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_2248;method_9591(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "absMoveTo(DDDFF)V": "Lnet/minecraft/class_1297;method_5641(DDDFF)V", + "saveWithoutId": "Lnet/minecraft/class_1297;method_5647(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;", + "saveAsPassenger": "Lnet/minecraft/class_1297;method_5786(Lnet/minecraft/class_2487;)Z", + "setInvisible": "Lnet/minecraft/class_1297;method_5648(Z)V", + "Lnet/minecraft/world/entity/Entity;changeDimension(Lnet/minecraft/server/level/ServerLevel;)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1297;method_5731(Lnet/minecraft/class_3218;)Lnet/minecraft/class_1297;", + "setAirSupply": "Lnet/minecraft/class_1297;method_5855(I)V", + "startRiding(Lnet/minecraft/world/entity/Entity;Z)Z": "Lnet/minecraft/class_1297;method_5873(Lnet/minecraft/class_1297;Z)Z", + "Lnet/minecraft/network/syncher/SynchedEntityData;set(Lnet/minecraft/network/syncher/EntityDataAccessor;Ljava/lang/Object;)V": "Lnet/minecraft/class_2945;method_12778(Lnet/minecraft/class_2940;Ljava/lang/Object;)V", + "load": "Lnet/minecraft/class_1297;method_5651(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "setRot": "Lnet/minecraft/class_1297;method_5710(FF)V", + "thunderHit": "Lnet/minecraft/class_1297;method_5800(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "setPose": "Lnet/minecraft/class_1297;method_18380(Lnet/minecraft/class_4050;)V", + "lavaHurt": "Lnet/minecraft/class_1297;method_5730()V", + "move": "Lnet/minecraft/class_1297;method_5784(Lnet/minecraft/class_1313;Lnet/minecraft/class_243;)V", + "Lnet/minecraft/nbt/CompoundTag;putUUID(Ljava/lang/String;Ljava/util/UUID;)V": "Lnet/minecraft/class_2487;method_25927(Ljava/lang/String;Ljava/util/UUID;)V", + "Lnet/minecraft/world/entity/Entity;addPassenger(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5627(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "Lnet/minecraft/world/entity/Entity;onGround()Z": "Lnet/minecraft/class_1297;method_24828()Z", + "baseTick": "Lnet/minecraft/class_1297;method_5670()V", + "removeVehicle": "Lnet/minecraft/class_1297;method_29239()V", + "Lnet/minecraft/world/level/material/FluidState;getFlow(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_3610;method_15758(Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;)Lnet/minecraft/class_243;", + "Lnet/minecraft/world/level/block/Block;updateEntityAfterFallOn(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_2248;method_9502(Lnet/minecraft/class_1922;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/nbt/CompoundTag;put(Ljava/lang/String;Lnet/minecraft/nbt/Tag;)Lnet/minecraft/nbt/Tag;": "Lnet/minecraft/class_2487;method_10566(Ljava/lang/String;Lnet/minecraft/class_2520;)Lnet/minecraft/class_2520;", + "restoreFrom": "Lnet/minecraft/class_1297;method_5878(Lnet/minecraft/class_1297;)V", + "getMaxAirSupply": "Lnet/minecraft/class_1297;method_5748()I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ZombifiedPiglinMixin": { + "Lnet/minecraft/world/entity/monster/ZombifiedPiglin;setRemainingPersistentAngerTime(I)V": "Lnet/minecraft/class_1590;setRemainingPersistentAngerTime(I)V", + "startPersistentAngerTimer": "Lnet/minecraft/class_1590;startPersistentAngerTimer()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NoteBlockMixin": { + "Lnet/minecraft/world/level/Level;blockEvent(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;II)V": "Lnet/minecraft/class_1937;method_8427(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;II)V", + "playNote": "Lnet/minecraft/class_2428;method_10367(Lnet/minecraft/class_1297;Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/NaturalSpawnerMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawnMobsForChunkGeneration": "Lnet/minecraft/class_1948;method_8661(Lnet/minecraft/class_5425;Lnet/minecraft/class_6880;Lnet/minecraft/class_1923;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/ServerLevelAccessor;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_5425;method_30771(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;run(Lnet/minecraft/world/entity/Mob;Lnet/minecraft/world/level/chunk/ChunkAccess;)V": "Lnet/minecraft/class_1948$class_5259;run(Lnet/minecraft/class_1308;Lnet/minecraft/class_2791;)V", + "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V": "Lnet/minecraft/class_1948;method_24930(Lnet/minecraft/class_1311;Lnet/minecraft/class_3218;Lnet/minecraft/class_2791;Lnet/minecraft/class_2338;Lnet/minecraft/class_1948$class_5261;Lnet/minecraft/class_1948$class_5259;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/WeightedPressurePlateBlockMixin": { + "Lnet/minecraft/world/level/block/WeightedPressurePlateBlock;getEntityCount(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/phys/AABB;Ljava/lang/Class;)I": "Lnet/minecraft/class_2557;m_289607_(Lnet/minecraft/class_1937;Lnet/minecraft/class_238;Ljava/lang/Class;)I", + "getSignalStrength": "Lnet/minecraft/class_2557;getSignalStrength(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneLampBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "neighborChanged": "Lnet/minecraft/class_2453;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2453;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BambooStalkBlockMixin": { + "performBonemeal": "Lnet/minecraft/class_2211;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;": "Lnet/minecraft/class_2680;m_61143_(Lnet/minecraft/class_2769;)Ljava/lang/Comparable;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LayeredCauldronBlockMixin": { + "lowerFillLevel": "Lnet/minecraft/class_5556;method_31650(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "handlePrecipitation": "Lnet/minecraft/class_5556;handlePrecipitation(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1959$class_1963;)V", + "receiveStalactiteDrip": "Lnet/minecraft/class_5556;receiveStalactiteDrip(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3611;)V", + "Lnet/minecraft/world/level/block/LayeredCauldronBlock;handleEntityOnFireInside(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_5556;method_36994(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/entity/Entity;clearFire()V": "Lnet/minecraft/class_1297;method_5646()V", + "entityInside": "Lnet/minecraft/class_5556;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/IceBlockMixin": { + "melt": "Lnet/minecraft/class_2386;method_10275(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NyliumBlockMixin": { + "randomTick": "Lnet/minecraft/class_4849;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/EvokerFangsMixin": { + "dealDamageTo": "Lnet/minecraft/class_1669;method_7471(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/state/BlockBehaviour_BlockStateBaseMixin": { + "entityInside": "Lnet/minecraft/class_4970$class_4971;method_26178(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Turtle_LayEggGoalMixin": { + "net.minecraft.world.entity.animal.Turtle$TurtleLayEggGoal": "net/minecraft/class_1481$class_1485" + }, + "io/izzel/arclight/common/mixin/core/stats/StatisticsCounterMixin": { + "Lnet/minecraft/stats/StatsCounter;setValue(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/stats/Stat;I)V": "Lnet/minecraft/class_3469;method_15023(Lnet/minecraft/class_1657;Lnet/minecraft/class_3445;I)V", + "increment": "Lnet/minecraft/class_3469;method_15022(Lnet/minecraft/class_1657;Lnet/minecraft/class_3445;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/AbstractFurnaceContainerMixin": { + "stillValid": "Lnet/minecraft/class_1720;stillValid(Lnet/minecraft/class_1657;)Z", + "(Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/world/item/crafting/RecipeType;Lnet/minecraft/world/inventory/RecipeBookType;ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;)V": "Lnet/minecraft/class_1720;(Lnet/minecraft/class_3917;Lnet/minecraft/class_3956;Lnet/minecraft/class_5421;ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;Lnet/minecraft/class_3913;)V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/WanderingTraderSpawnerMixin": { + "spawn": "Lnet/minecraft/class_3990;method_18018(Lnet/minecraft/class_3218;)Z", + "Lnet/minecraft/world/entity/EntityType;spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_47821(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;)Lnet/minecraft/class_1297;", + "tryToSpawnLlamaFor": "Lnet/minecraft/class_3990;method_18016(Lnet/minecraft/class_3218;Lnet/minecraft/class_3989;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownEnderpearlMixin": { + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "onHit": "Lnet/minecraft/class_1684;onHit(Lnet/minecraft/class_239;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ExperienceOrbMixin": { + "Lnet/minecraft/world/entity/player/Player;giveExperiencePoints(I)V": "Lnet/minecraft/class_1657;method_7255(I)V", + "Lnet/minecraft/world/entity/player/Player;takeXpDelay:I": "Lnet/minecraft/class_1657;field_7504:I", + "getExperienceValue": "Lnet/minecraft/class_1303;method_5918(I)I", + "playerTouch": "Lnet/minecraft/class_1303;playerTouch(Lnet/minecraft/class_1657;)V", + "tick": "Lnet/minecraft/class_1303;tick()V", + "Lnet/minecraft/world/entity/ExperienceOrb;followingPlayer:Lnet/minecraft/world/entity/player/Player;": "Lnet/minecraft/class_1303;field_6162:Lnet/minecraft/class_1657;", + "Lnet/minecraft/world/entity/Entity;tick()V": "Lnet/minecraft/class_1297;method_5773()V" + }, + "io/izzel/arclight/common/mixin/core/world/effect/MobEffectMixin": { + "applyEffectTick": "Lnet/minecraft/class_1291;method_5572(Lnet/minecraft/class_1309;I)V", + "Lnet/minecraft/world/food/FoodData;eat(IF)V": "Lnet/minecraft/class_1702;method_7585(IF)V", + "Lnet/minecraft/world/entity/LivingEntity;heal(F)V": "Lnet/minecraft/class_1309;method_6025(F)V", + "applyInstantenousEffect": "Lnet/minecraft/class_1291;method_5564(Lnet/minecraft/class_1297;Lnet/minecraft/class_1297;Lnet/minecraft/class_1309;ID)V", + "Lnet/minecraft/world/damagesource/DamageSources;magic()Lnet/minecraft/world/damagesource/DamageSource;": "Lnet/minecraft/class_8109;method_48831()Lnet/minecraft/class_1282;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin$ObscureApiCompat": { + "Lnet/minecraft/world/entity/LivingEntity;hurtArmor(Lnet/minecraft/world/damagesource/DamageSource;F)V": "Lnet/minecraft/class_1309;method_6105(Lnet/minecraft/class_1282;F)V", + "getDamageAfterArmorAbsorb": "Lnet/minecraft/class_1309;method_6132(Lnet/minecraft/class_1282;F)F" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/ClientboundCommandsPacket_ArgumentNodeStubMixin": { + "net.minecraft.network.protocol.game.ClientboundCommandsPacket$ArgumentNodeStub": "net/minecraft/class_2641$class_7232", + "serializeCap(Lnet/minecraft/network/FriendlyByteBuf;Lnet/minecraft/commands/synchronization/ArgumentTypeInfo;Lnet/minecraft/commands/synchronization/ArgumentTypeInfo$Template;)V": "Lnet/minecraft/class_2641$class_7232;method_42073(Lnet/minecraft/class_2540;Lnet/minecraft/class_2314;Lnet/minecraft/class_2314$class_7217;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SnowBlockMixin": { + "randomTick": "Lnet/minecraft/class_2488;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/block/SnowLayerBlock;dropResources(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_2488;m_49950_(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/BreakDoorGoalMixin": { + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "tick": "Lnet/minecraft/class_1339;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/DolphinEntity_SwimWithPlayerGoalMixin": { + "start": "Lnet/minecraft/class_1433$class_1436;start()V", + "net.minecraft.world.entity.animal.Dolphin$DolphinSwimWithPlayerGoal": "net/minecraft/class_1433$class_1436", + "tick": "Lnet/minecraft/class_1433$class_1436;tick()V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1657;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/fluid/LavaFluidMixin": { + "spreadTo": "Lnet/minecraft/class_3616;spreadTo(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_3610;)V", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin": { + "Lnet/minecraft/server/level/ServerLevel;addNewPlayer(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3218;method_18213(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;viewDistance:I": "Lnet/minecraft/class_3324;field_14359:I", + "Lnet/minecraft/server/MinecraftServer;getCommands()Lnet/minecraft/commands/Commands;": "Lnet/minecraft/server/MinecraftServer;method_3734()Lnet/minecraft/class_2170;", + "players": "f_11196_:Ljava/util/List;", + "save": "Lnet/minecraft/class_3324;method_14577(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/level/ServerPlayer;resetSentInfo()V": "Lnet/minecraft/class_3222;method_14217()V", + "Lnet/minecraft/server/players/PlayerList;save(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3324;method_14577(Lnet/minecraft/class_3222;)V", + "remove": "Lnet/minecraft/class_3324;method_14611(Lnet/minecraft/class_3222;)V", + "sendPlayerPermissionLevel(Lnet/minecraft/server/level/ServerPlayer;I)V": "Lnet/minecraft/class_3324;method_14596(Lnet/minecraft/class_3222;I)V", + "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V": "Lnet/minecraft/class_3324;method_43514(Lnet/minecraft/class_2561;Z)V", + "placeNewPlayer": "Lnet/minecraft/class_3324;method_14570(Lnet/minecraft/class_2535;Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/MinecraftServer;getLevel(Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/server/MinecraftServer;method_3847(Lnet/minecraft/class_5321;)Lnet/minecraft/class_3218;", + "sendAllPlayerInfo": "Lnet/minecraft/class_3324;method_14594(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;simulationDistance:I": "Lnet/minecraft/class_3324;field_34895:I" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/handshake/CHandshakePacketMixin": { + "Lnet/minecraft/network/FriendlyByteBuf;readUtf(I)Ljava/lang/String;": "Lnet/minecraft/class_2540;method_10800(I)Ljava/lang/String;", + "(Lnet/minecraft/network/FriendlyByteBuf;)V": "Lnet/minecraft/class_2889;(Lnet/minecraft/class_2540;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ZombieMixin": { + "killedEntity": "Lnet/minecraft/class_1642;killedEntity(Lnet/minecraft/class_3218;Lnet/minecraft/class_1309;)Z", + "finalizeSpawn": "Lnet/minecraft/class_1642;finalizeSpawn(Lnet/minecraft/class_5425;Lnet/minecraft/class_1266;Lnet/minecraft/class_3730;Lnet/minecraft/class_1315;Lnet/minecraft/class_2487;)Lnet/minecraft/class_1315;", + "doHurtTarget": "Lnet/minecraft/class_1642;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "convertToZombieType": "Lnet/minecraft/class_1642;method_7200(Lnet/minecraft/class_1299;)V", + "Lnet/minecraft/world/entity/npc/Villager;convertTo(Lnet/minecraft/world/entity/EntityType;Z)Lnet/minecraft/world/entity/Mob;": "Lnet/minecraft/class_1646;m_21406_(Lnet/minecraft/class_1299;Z)Lnet/minecraft/class_1308;", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "Lnet/minecraft/world/entity/monster/Zombie;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1642;m_6710_(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/level/ServerLevelAccessor;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_5425;m_7967_(Lnet/minecraft/class_1297;)Z", + "hurt": "Lnet/minecraft/class_1642;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_OutputContainerMixin": { + "(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_3962$class_3964;(Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/server/commands/EffectCommandMixin": { + "clearEffects": "Lnet/minecraft/class_3043;method_13230(Lnet/minecraft/class_2168;Ljava/util/Collection;)I", + "giveEffect": "Lnet/minecraft/class_3043;method_13227(Lnet/minecraft/class_2168;Ljava/util/Collection;Lnet/minecraft/class_6880;Ljava/lang/Integer;IZ)I", + "clearEffect": "Lnet/minecraft/class_3043;method_13231(Lnet/minecraft/class_2168;Ljava/util/Collection;Lnet/minecraft/class_6880;)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/IronGolemMixin": { + "doPush": "Lnet/minecraft/class_1439;doPush(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/animal/IronGolem;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1439;m_6710_(Lnet/minecraft/class_1309;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ChiseledBookShelfBlockEntityMixin": { + "updateState": "Lnet/minecraft/class_7716;method_47585(I)V", + "load": "Lnet/minecraft/class_7716;load(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemPacketMixin": { + "(Lnet/minecraft/network/FriendlyByteBuf;)V": "Lnet/minecraft/class_2886;(Lnet/minecraft/class_2540;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkSensorBlockMixin": { + "stepOn": "Lnet/minecraft/class_5703;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "activate": "Lnet/minecraft/class_5703;method_32904(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;II)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/world/level/Level;getBlockEntity(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/entity/BlockEntity;": "Lnet/minecraft/class_1937;getBlockEntity(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2586;", + "deactivate": "Lnet/minecraft/class_5703;method_32903(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin": { + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;teleport(DDDFFLjava/util/Set;)V": "Lnet/minecraft/class_3244;method_14360(DDDFFLjava/util/Set;)V", + "teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDFF)V": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDFF)V", + "Lnet/minecraft/server/level/ServerPlayer;tickCount:I": "Lnet/minecraft/class_3222;f_19797_:I", + "updateOptions": "Lnet/minecraft/class_3222;method_14213(Lnet/minecraft/class_2803;)V", + "addAdditionalSaveData": "Lnet/minecraft/class_3222;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/server/level/ServerPlayer;closeContainer()V": "Lnet/minecraft/class_3222;closeContainer()V", + "Lnet/minecraft/server/level/ServerPlayer;setRespawnPosition(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/BlockPos;FZZ)V": "Lnet/minecraft/class_3222;method_26284(Lnet/minecraft/class_5321;Lnet/minecraft/class_2338;FZZ)V", + "awardStat": "Lnet/minecraft/class_3222;awardStat(Lnet/minecraft/class_3445;I)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "setPlayerInput": "Lnet/minecraft/class_3222;method_14218(FFZZ)V", + "doTick": "Lnet/minecraft/class_3222;method_14226()V", + "stopSleepInBed": "Lnet/minecraft/class_3222;stopSleepInBed(ZZ)V", + "openMenu": "Lnet/minecraft/class_3222;openMenu(Lnet/minecraft/class_3908;)Ljava/util/OptionalInt;", + "setCamera": "Lnet/minecraft/class_3222;method_14224(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/server/level/ServerPlayer;setShiftKeyDown(Z)V": "Lnet/minecraft/class_3222;m_20260_(Z)V", + "resetStat": "Lnet/minecraft/class_3222;resetStat(Lnet/minecraft/class_3445;)V", + "startSleepInBed": "Lnet/minecraft/class_3222;startSleepInBed(Lnet/minecraft/class_2338;)Lcom/mojang/datafixers/util/Either;", + "handleTeamKill": "Lnet/minecraft/class_3222;method_14227(Ljava/lang/String;Ljava/lang/String;[Lnet/minecraft/class_274;)V", + "isPvpAllowed": "Lnet/minecraft/class_3222;method_14230()Z", + "createEndPlatform": "Lnet/minecraft/class_3222;method_30313(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/server/level/ServerPlayer;teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDLjava/util/Set;FF)Z": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDLjava/util/Set;FF)Z", + "awardKillScore": "Lnet/minecraft/class_3222;awardKillScore(Lnet/minecraft/class_1297;ILnet/minecraft/class_1282;)V", + "tick": "Lnet/minecraft/class_3222;tick()V", + "Lnet/minecraft/world/MenuProvider;createMenu(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/entity/player/Player;)Lnet/minecraft/world/inventory/AbstractContainerMenu;": "Lnet/minecraft/class_3908;m_7208_(ILnet/minecraft/class_1661;Lnet/minecraft/class_1657;)Lnet/minecraft/class_1703;", + "readAdditionalSaveData": "Lnet/minecraft/class_3222;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "resetSentInfo": "Lnet/minecraft/class_3222;method_14217()V", + "doCloseContainer": "Lnet/minecraft/class_3222;doCloseContainer()V", + "Lnet/minecraft/server/level/ServerPlayer;stopRiding()V": "Lnet/minecraft/class_3222;stopRiding()V", + "Lnet/minecraft/world/scores/Scoreboard;forAllObjectives(Lnet/minecraft/world/scores/criteria/ObjectiveCriteria;Ljava/lang/String;Ljava/util/function/Consumer;)V": "Lnet/minecraft/class_269;method_1162(Lnet/minecraft/class_274;Ljava/lang/String;Ljava/util/function/Consumer;)V", + "Lnet/minecraft/world/entity/Entity;hasExactlyOnePlayerPassenger()Z": "Lnet/minecraft/class_1297;method_5817()Z", + "teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDLjava/util/Set;FF)Z": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDLjava/util/Set;FF)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/MerchantOfferMixin": { + "getCostA": "Lnet/minecraft/class_1914;method_19272()Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/MultifaceSpreaderMixin": { + "getSpreadFromFaceTowardDirection": "Lnet/minecraft/class_7118;method_41445(Lnet/minecraft/class_2680;Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;Lnet/minecraft/class_2350;Lnet/minecraft/class_7118$class_7122;)Ljava/util/Optional;", + "spreadToFace": "Lnet/minecraft/class_7118;method_41441(Lnet/minecraft/class_1936;Lnet/minecraft/class_7118$class_7121;Z)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/piglin/PiglinAiMixin": { + "canAdmire": "Lnet/minecraft/class_4838;method_27086(Lnet/minecraft/class_4836;Lnet/minecraft/class_1799;)Z", + "stopHoldingOffHandItem": "Lnet/minecraft/class_4838;method_24741(Lnet/minecraft/class_4836;Z)V", + "isNotHoldingLovedItemInOffHand": "Lnet/minecraft/class_4838;method_24850(Lnet/minecraft/class_4836;)Z", + "Lnet/minecraft/world/entity/monster/piglin/PiglinAi;throwItems(Lnet/minecraft/world/entity/monster/piglin/Piglin;Ljava/util/List;)V": "Lnet/minecraft/class_4838;method_24772(Lnet/minecraft/class_4836;Ljava/util/List;)V", + "Lnet/minecraft/world/entity/monster/piglin/PiglinAi;isLovedItem(Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4838;method_24735(Lnet/minecraft/class_1799;)Z", + "wantsToPickup": "Lnet/minecraft/class_4838;method_24730(Lnet/minecraft/class_4836;Lnet/minecraft/class_1799;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/SmallFireballMixin": { + "onHitBlock": "Lnet/minecraft/class_1677;onHitBlock(Lnet/minecraft/class_3965;)V", + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;DDD)V": "Lnet/minecraft/class_1677;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;DDD)V", + "onHitEntity": "Lnet/minecraft/class_1677;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkVeinBlockMixin": { + "attemptUseCharge": "Lnet/minecraft/class_7130;attemptUseCharge(Lnet/minecraft/class_7128$class_7129;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;Lnet/minecraft/class_7128;Z)I", + "attemptPlaceSculk": "Lnet/minecraft/class_7130;method_41515(Lnet/minecraft/class_7128;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)Z", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_MirrorSpellGoalMixin": { + "performSpellCasting": "Lnet/minecraft/class_1581$class_1583;performSpellCasting()V", + "net.minecraft.world.entity.monster.Illusioner$IllusionerMirrorSpellGoal": "net/minecraft/class_1581$class_1583" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raid/RaidManagerMixin": { + "createOrExtendRaid": "Lnet/minecraft/class_3767;method_16540(Lnet/minecraft/class_3222;)Lnet/minecraft/class_3765;", + "Lnet/minecraft/world/entity/raid/Raid;absorbBadOmen(Lnet/minecraft/world/entity/player/Player;)V": "Lnet/minecraft/class_3765;method_16518(Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/WitherSkullBlockMixin": { + "checkSpawn": "Lnet/minecraft/class_2570;method_10898(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2631;)V", + "Lnet/minecraft/world/level/block/CarvedPumpkinBlock;clearPatternBlocks(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/block/state/pattern/BlockPattern$BlockPatternMatch;)V": "Lnet/minecraft/class_2276;method_45454(Lnet/minecraft/class_1937;Lnet/minecraft/class_2700$class_2702;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/boss/wither/WitherBoss;makeInvulnerable()V": "Lnet/minecraft/class_1528;method_6885()V" + }, + "io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin": { + "Lnet/minecraft/world/inventory/MerchantMenu;setSelectionHint(I)V": "Lnet/minecraft/class_1728;method_7650(I)V", + "Lnet/minecraft/server/level/ServerPlayer;serverLevel()Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/class_3222;method_51469()Lnet/minecraft/class_3218;", + "handleResourcePackResponse": "Lnet/minecraft/class_3244;handleResourcePackResponse(Lnet/minecraft/class_2856;)V", + "handlePlayerCommand": "Lnet/minecraft/class_3244;handlePlayerCommand(Lnet/minecraft/class_2848;)V", + "handleTeleportToEntityPacket": "Lnet/minecraft/class_3244;handleTeleportToEntityPacket(Lnet/minecraft/class_2884;)V", + "Lnet/minecraft/server/level/ServerPlayer;resetLastActionTime()V": "Lnet/minecraft/class_3222;method_14234()V", + "handleContainerClose": "Lnet/minecraft/class_3244;handleContainerClose(Lnet/minecraft/class_2815;)V", + "handleUseItemOn": "Lnet/minecraft/class_3244;handleUseItemOn(Lnet/minecraft/class_2885;)V", + "handleContainerButtonClick": "Lnet/minecraft/class_3244;handleContainerButtonClick(Lnet/minecraft/class_2811;)V", + "updateSignText": "Lnet/minecraft/class_3244;method_31282(Lnet/minecraft/class_2877;Ljava/util/List;)V", + "onDisconnect": "Lnet/minecraft/class_3244;onDisconnect(Lnet/minecraft/class_2561;)V", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;unpackAndApplyLastSeen(Lnet/minecraft/network/chat/LastSeenMessages$Update;)Ljava/util/Optional;": "Lnet/minecraft/class_3244;method_45169(Lnet/minecraft/class_7635$class_7636;)Ljava/util/Optional;", + "handleAcceptTeleportPacket": "Lnet/minecraft/class_3244;handleAcceptTeleportPacket(Lnet/minecraft/class_2793;)V", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;performChatCommand(Lnet/minecraft/network/protocol/game/ServerboundChatCommandPacket;Lnet/minecraft/network/chat/LastSeenMessages;)V": "Lnet/minecraft/class_3244;method_45010(Lnet/minecraft/class_7472;Lnet/minecraft/class_7635;)V", + "Lnet/minecraft/server/level/ServerPlayer;doCloseContainer()V": "Lnet/minecraft/class_3222;doCloseContainer()V", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;awaitingPositionFromClient:Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_3244;field_14119:Lnet/minecraft/class_243;", + "handlePlaceRecipe": "Lnet/minecraft/class_3244;handlePlaceRecipe(Lnet/minecraft/class_2840;)V", + "Lnet/minecraft/server/level/ServerPlayer;isChangingDimension()Z": "Lnet/minecraft/class_3222;method_14208()Z", + "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;awaitingTeleport:I": "Lnet/minecraft/class_3244;field_14123:I", + "handleEditBook": "Lnet/minecraft/class_3244;handleEditBook(Lnet/minecraft/class_2820;)V", + "tryHandleChat": "Lnet/minecraft/class_3244;method_44337(Ljava/lang/String;Ljava/time/Instant;Lnet/minecraft/class_7635$class_7636;)Ljava/util/Optional;", + "handleCustomPayload": "Lnet/minecraft/class_3244;handleCustomPayload(Lnet/minecraft/class_2817;)V", + "handleSelectTrade": "Lnet/minecraft/class_3244;handleSelectTrade(Lnet/minecraft/class_2863;)V", + "Lnet/minecraft/server/players/PlayerList;remove(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3324;method_14611(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V": "Lnet/minecraft/class_3324;method_43514(Lnet/minecraft/class_2561;Z)V", + "send(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketSendListener;)V": "Lnet/minecraft/class_3244;method_14369(Lnet/minecraft/class_2596;Lnet/minecraft/class_7648;)V", + "Lnet/minecraft/network/protocol/game/ServerboundPlaceRecipePacket;getRecipe()Lnet/minecraft/resources/ResourceLocation;": "Lnet/minecraft/class_2840;method_12320()Lnet/minecraft/class_2960;", + "Lnet/minecraft/server/level/ServerPlayer;teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDFF)V": "Lnet/minecraft/class_3222;method_14251(Lnet/minecraft/class_3218;DDDFF)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ObserverBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2426;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/frog/TadpoleMixin": { + "ageUp()V": "Lnet/minecraft/class_7110;method_41397()V", + "Lnet/minecraft/world/entity/animal/frog/Tadpole;playSound(Lnet/minecraft/sounds/SoundEvent;FF)V": "Lnet/minecraft/class_7110;m_5496_(Lnet/minecraft/class_3414;FF)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Cat_CatRelaxOnOwnerGoalMixin": { + "net.minecraft.world.entity.animal.Cat$CatRelaxOnOwnerGoal": "net/minecraft/class_1451$class_3699", + "giveMorningGift": "Lnet/minecraft/class_1451$class_3699;method_16097()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/effect/MobEffectUtilMixin": { + "addEffectToPlayersAround": "Lnet/minecraft/class_1292;method_42143(Lnet/minecraft/class_3218;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;DLnet/minecraft/class_1293;I)Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SpreadableSnowyDirtBlockMixin": { + "randomTick": "Lnet/minecraft/class_2500;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/PlayerContainerMixin": { + "slotsChanged": "Lnet/minecraft/class_1723;slotsChanged(Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/InteractWithDoorMixin": { + "Lnet/minecraft/world/level/block/DoorBlock;setOpen(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Z)V": "Lnet/minecraft/class_2323;method_10033(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_2338;Z)V" + }, + "io/izzel/arclight/common/mixin/forge/NetworkHooksMixin": { + "Lnet/minecraft/world/inventory/AbstractContainerMenu;getType()Lnet/minecraft/world/inventory/MenuType;": "Lnet/minecraft/class_1703;method_17358()Lnet/minecraft/class_3917;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/SignBlockEntityMixin": { + "Lnet/minecraft/world/level/Level;sendBlockUpdated(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;I)V": "Lnet/minecraft/class_1937;method_8413(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2680;I)V", + "markUpdated": "Lnet/minecraft/class_2625;method_34272()V", + "Lnet/minecraft/world/level/block/entity/SignBlockEntity;createCommandSourceStack(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/commands/CommandSourceStack;": "Lnet/minecraft/class_2625;method_50006(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2168;", + "executeClickCommandsIfPresent": "Lnet/minecraft/class_2625;method_50007(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Z)Z" + }, + "io/izzel/arclight/common/mixin/core/network/ServerStatusNetHandlerMixin": { + "handleStatusRequest": "Lnet/minecraft/class_3251;handleStatusRequest(Lnet/minecraft/class_2937;)V", + "Lnet/minecraft/network/Connection;send(Lnet/minecraft/network/protocol/Packet;)V": "Lnet/minecraft/class_2535;method_10743(Lnet/minecraft/class_2596;)V" + }, + "io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin": { + "Lnet/minecraft/server/packs/repository/PackRepository;setSelected(Ljava/util/Collection;)V": "Lnet/minecraft/class_3283;method_14447(Ljava/util/Collection;)V", + "stopServer": "Lnet/minecraft/server/MinecraftServer;method_3782()V", + "Lnet/minecraft/server/MinecraftServer;saveAllChunks(ZZZ)Z": "Lnet/minecraft/server/MinecraftServer;method_3723(ZZZ)Z", + "haveTime": "Lnet/minecraft/server/MinecraftServer;method_3866()Z", + "createLevels": "Lnet/minecraft/server/MinecraftServer;method_3786(Lnet/minecraft/class_3949;)V", + "tickChildren": "Lnet/minecraft/server/MinecraftServer;method_3813(Ljava/util/function/BooleanSupplier;)V", + "saveAllChunks": "Lnet/minecraft/server/MinecraftServer;method_3723(ZZZ)Z", + "Lnet/minecraft/server/MinecraftServer;overworld()Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/server/MinecraftServer;method_30002()Lnet/minecraft/class_3218;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/CampfireBlockEntityMixin": { + "Lnet/minecraft/world/level/block/entity/CampfireBlockEntity;cookingProgress:[I": "Lnet/minecraft/class_3924;field_17384:[I", + "placeFood": "Lnet/minecraft/class_3924;method_17503(Lnet/minecraft/class_1297;Lnet/minecraft/class_1799;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/CommandBlockLogicMixin": { + "setName": "Lnet/minecraft/class_1918;method_8290(Lnet/minecraft/class_2561;)V", + "Lnet/minecraft/commands/Commands;performPrefixedCommand(Lnet/minecraft/commands/CommandSourceStack;Ljava/lang/String;)I": "Lnet/minecraft/class_2170;method_44252(Lnet/minecraft/class_2168;Ljava/lang/String;)I", + "performCommand": "Lnet/minecraft/class_1918;method_8301(Lnet/minecraft/class_1937;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BrushableBlockEntityMixin": { + "dropContent": "Lnet/minecraft/class_8174;method_49220(Lnet/minecraft/class_1657;)V", + "load": "Lnet/minecraft/class_8174;load(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/bukkit/CraftWorldMixin": { + "Lnet/minecraft/world/level/biome/Biome;climateSettings:Lnet/minecraft/world/level/biome/Biome$ClimateSettings;": "Lnet/minecraft/class_1959;field_26393:Lnet/minecraft/class_1959$class_5482;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/DolphinMixin": { + "pickUpItem": "Lnet/minecraft/class_1433;pickUpItem(Lnet/minecraft/class_1542;)V", + "Lnet/minecraft/world/entity/animal/Dolphin;setItemSlot(Lnet/minecraft/world/entity/EquipmentSlot;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1433;m_8061_(Lnet/minecraft/class_1304;Lnet/minecraft/class_1799;)V", + "getMaxAirSupply": "Lnet/minecraft/class_1433;getMaxAirSupply()I" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PistonBlockMixin": { + "moveBlocks": "Lnet/minecraft/class_2665;method_11481(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;Z)Z", + "Lnet/minecraft/world/level/block/piston/PistonStructureResolver;getToDestroy()Ljava/util/List;": "Lnet/minecraft/class_2674;method_11536()Ljava/util/List;", + "checkIfExtend": "Lnet/minecraft/class_2665;method_11483(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/Level;blockEvent(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;II)V": "Lnet/minecraft/class_1937;method_8427(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;II)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/FallingBlockEntityMixin": { + "causeFallDamage": "Lnet/minecraft/class_1540;causeFallDamage(FFLnet/minecraft/class_1282;)Z", + "fall": "Lnet/minecraft/class_1540;method_40005(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Lnet/minecraft/class_1540;", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_1540;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/BrewingStandContainerMixin": { + "stillValid": "Lnet/minecraft/class_1708;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;)V": "Lnet/minecraft/class_1708;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;Lnet/minecraft/class_3913;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/OwnerHurtByTargetGoalMixin": { + "start": "Lnet/minecraft/class_1403;start()V" + }, + "io/izzel/arclight/common/mixin/optimization/general/ServerLevelMixin_Optimize": { + "tickChunk": "Lnet/minecraft/class_3218;method_18203(Lnet/minecraft/class_2818;I)V" + }, + "io/izzel/arclight/common/mixin/core/server/WorldLoaderMixin": { + "Lnet/minecraft/server/WorldLoader$WorldDataSupplier;get(Lnet/minecraft/server/WorldLoader$DataLoadContext;)Lnet/minecraft/server/WorldLoader$DataLoadOutput;": "Lnet/minecraft/class_7237$class_6907;get(Lnet/minecraft/class_7237$class_7660;)Lnet/minecraft/class_7237$class_7661;", + "load": "Lnet/minecraft/class_7237;method_42098(Lnet/minecraft/class_7237$class_6906;Lnet/minecraft/class_7237$class_6907;Lnet/minecraft/class_7237$class_7239;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/npc/VillagerMixin": { + "customServerAiStep": "Lnet/minecraft/class_1646;customServerAiStep()V", + "Lnet/minecraft/util/SpawnUtil;trySpawnMob(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/MobSpawnType;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;IIILnet/minecraft/util/SpawnUtil$Strategy;)Ljava/util/Optional;": "Lnet/minecraft/class_7244;method_42122(Lnet/minecraft/class_1299;Lnet/minecraft/class_3730;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;IIILnet/minecraft/class_7244$class_7502;)Ljava/util/Optional;", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "catchUpDemand": "Lnet/minecraft/class_1646;method_21723()V", + "restock": "Lnet/minecraft/class_1646;method_19182()V", + "spawnGolemIfNeeded": "Lnet/minecraft/class_1646;method_20688(Lnet/minecraft/class_3218;JI)V", + "Lnet/minecraft/world/item/trading/MerchantOffer;resetUses()V": "Lnet/minecraft/class_1914;method_19275()V", + "thunderHit": "Lnet/minecraft/class_1646;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "Lnet/minecraft/world/entity/npc/Villager;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1646;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/BoatMixin": { + "Lnet/minecraft/world/entity/vehicle/Boat;isRemoved()Z": "Lnet/minecraft/class_1690;m_213877_()Z", + "checkFallDamage": "Lnet/minecraft/class_1690;checkFallDamage(DZLnet/minecraft/class_2680;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/entity/vehicle/Boat;setHurtDir(I)V": "Lnet/minecraft/class_1690;method_7540(I)V", + "Lnet/minecraft/world/entity/vehicle/Boat;getDamage()F": "Lnet/minecraft/class_1690;method_7554()F", + "tick": "Lnet/minecraft/class_1690;tick()V", + "hurt": "Lnet/minecraft/class_1690;hurt(Lnet/minecraft/class_1282;F)Z", + "push": "Lnet/minecraft/class_1690;push(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/vehicle/Boat;tickBubbleColumn()V": "Lnet/minecraft/class_1690;method_7550()V", + "Lnet/minecraft/world/entity/Entity;push(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5697(Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/LargeFireballMixin": { + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;DDDI)V": "Lnet/minecraft/class_1674;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;DDDI)V", + "Lnet/minecraft/nbt/CompoundTag;getByte(Ljava/lang/String;)B": "Lnet/minecraft/class_2487;method_10571(Ljava/lang/String;)B", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1674;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "onHit": "Lnet/minecraft/class_1674;onHit(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8537(Lnet/minecraft/class_1297;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "readAdditionalSaveData": "Lnet/minecraft/class_1674;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/EnderCrystalItemMixin": { + "useOn": "Lnet/minecraft/class_1774;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;setShowBottom(Z)V": "Lnet/minecraft/class_1511;method_6839(Z)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/gameevent/GameEventDispatcherMixin": { + "Lnet/minecraft/world/level/gameevent/GameEvent;getNotificationRadius()I": "Lnet/minecraft/class_5712;method_32941()I", + "post": "Lnet/minecraft/class_7719;method_45490(Lnet/minecraft/class_5712;Lnet/minecraft/class_243;Lnet/minecraft/class_5712$class_7397;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeManagerMixin": { + "apply": "Lnet/minecraft/class_1863;method_20705(Ljava/util/Map;Lnet/minecraft/class_3300;Lnet/minecraft/class_3695;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/HangingEntityItemMixin": { + "useOn": "Lnet/minecraft/class_1790;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/decoration/HangingEntity;playPlacementSound()V": "Lnet/minecraft/class_1530;method_6894()V" + }, + "io/izzel/arclight/common/mixin/core/server/ServerScoreboardMixin": { + "startTrackingObjective": "Lnet/minecraft/class_2995;method_12939(Lnet/minecraft/class_266;)V", + "stopTrackingObjective": "Lnet/minecraft/class_2995;method_12938(Lnet/minecraft/class_266;)V", + "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V": "Lnet/minecraft/class_3324;method_14581(Lnet/minecraft/class_2596;)V", + "Lnet/minecraft/server/players/PlayerList;getPlayers()Ljava/util/List;": "Lnet/minecraft/class_3324;method_14571()Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DaylightDetectorBlockMixin": { + "updateSignalStrength": "Lnet/minecraft/class_2309;method_9983(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Illusioner_BlindnessSpellGoalMixin": { + "net.minecraft.world.entity.monster.Illusioner$IllusionerBlindnessSpellGoal": "net/minecraft/class_1581$class_1582", + "performSpellCasting": "Lnet/minecraft/class_1581$class_1582;performSpellCasting()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/ResetProfessionMixin": { + "Lnet/minecraft/world/entity/npc/Villager;setVillagerData(Lnet/minecraft/world/entity/npc/VillagerData;)V": "Lnet/minecraft/class_1646;setVillagerData(Lnet/minecraft/class_3850;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/MinecartTNTMixin": { + "explode(Lnet/minecraft/world/damagesource/DamageSource;D)V": "Lnet/minecraft/class_1701;method_7576(Lnet/minecraft/class_1282;D)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8454(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Lnet/minecraft/class_5362;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_HurtByOtherGoalMixin": { + "net.minecraft.world.entity.animal.Bee$BeeHurtByOtherGoal": "net/minecraft/class_4466$class_4475", + "alertOther": "Lnet/minecraft/class_4466$class_4475;alertOther(Lnet/minecraft/class_1308;Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/Mob;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1308;method_5980(Lnet/minecraft/class_1309;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/LoomContainerMixin": { + "stillValid": "Lnet/minecraft/class_1726;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1726;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SnowLayerBlockMixin": { + "randomTick": "Lnet/minecraft/class_2488;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/block/SnowLayerBlock;dropResources(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_2488;m_49950_(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/storage/ChunkSerializerMixin": { + "Lnet/minecraft/world/level/chunk/ChunkAccess;setLightCorrect(Z)V": "Lnet/minecraft/class_2791;method_12020(Z)V", + "read": "Lnet/minecraft/class_2852;method_12395(Lnet/minecraft/class_3218;Lnet/minecraft/class_4153;Lnet/minecraft/class_1923;Lnet/minecraft/class_2487;)Lnet/minecraft/class_2839;", + "write": "Lnet/minecraft/class_2852;method_12410(Lnet/minecraft/class_3218;Lnet/minecraft/class_2791;)Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/AnimalMixin": { + "spawnChildFromBreeding": "Lnet/minecraft/class_1429;method_24650(Lnet/minecraft/class_3218;Lnet/minecraft/class_1429;)V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "setInLove(Lnet/minecraft/world/entity/player/Player;)V": "Lnet/minecraft/class_1429;method_6480(Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/entity/animal/Animal;inLove:I": "Lnet/minecraft/class_1429;field_6745:I" + }, + "io/izzel/arclight/common/mixin/core/world/level/portal/PortalForcerMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/core/BlockPos;spiralAround(Lnet/minecraft/core/BlockPos;ILnet/minecraft/core/Direction;Lnet/minecraft/core/Direction;)Ljava/lang/Iterable;": "Lnet/minecraft/class_2338;method_30512(Lnet/minecraft/class_2338;ILnet/minecraft/class_2350;Lnet/minecraft/class_2350;)Ljava/lang/Iterable;", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "createPortal": "Lnet/minecraft/class_1946;method_30482(Lnet/minecraft/class_2338;Lnet/minecraft/class_2350$class_2351;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/EntityTypeMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/nbt/CompoundTag;Ljava/util/function/Consumer;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;ZZ)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_5899(Lnet/minecraft/class_3218;Lnet/minecraft/class_2487;Ljava/util/function/Consumer;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;ZZ)Lnet/minecraft/class_1297;", + "spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;ZZ)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_5894(Lnet/minecraft/class_3218;Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;ZZ)Lnet/minecraft/class_1297;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BambooSaplingBlockMixin": { + "growBamboo": "Lnet/minecraft/class_2202;method_9351(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/PrepareRamNearestTargetMixin": { + "start(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/PathfinderMob;J)V": "Lnet/minecraft/class_6336;method_36260(Lnet/minecraft/class_3218;Lnet/minecraft/class_1314;J)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/RemoveBlockGoalMixin": { + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "tick": "Lnet/minecraft/class_1382;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ComparatorBlockMixin": { + "refreshOutputState": "Lnet/minecraft/class_2286;method_9775(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlockMixin": { + "extractProduce": "Lnet/minecraft/class_3962;method_26374(Lnet/minecraft/class_1297;Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;", + "getContainer": "Lnet/minecraft/class_3962;getContainer(Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)Lnet/minecraft/class_1278;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralPlantBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2301;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/entity/PersistentEntitySectionManagerMixin": { + "Lnet/minecraft/world/level/entity/EntityPersistentStorage;storeEntities(Lnet/minecraft/world/level/entity/ChunkEntities;)V": "Lnet/minecraft/class_5571;method_31760(Lnet/minecraft/class_5566;)V", + "processPendingLoads": "Lnet/minecraft/class_5579;method_31853()V", + "processChunkUnload": "Lnet/minecraft/class_5579;method_31837(J)Z", + "storeChunkSections": "Lnet/minecraft/class_5579;method_31812(JLjava/util/function/Consumer;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CauldronBlockMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "receiveStalactiteDrip": "Lnet/minecraft/class_5546;receiveStalactiteDrip(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3611;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/DyeItemMixin": { + "Lnet/minecraft/world/entity/animal/Sheep;setColor(Lnet/minecraft/world/item/DyeColor;)V": "Lnet/minecraft/class_1472;method_6631(Lnet/minecraft/class_1767;)V", + "interactLivingEntity": "Lnet/minecraft/class_1769;interactLivingEntity(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1309;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/MagmaBlockMixin": { + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "stepOn": "Lnet/minecraft/class_2413;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/fluid/FlowingFluidMixin": { + "Lnet/minecraft/world/level/material/FlowingFluid;spreadTo(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/world/level/material/FluidState;)V": "Lnet/minecraft/class_3609;method_15745(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_3610;)V", + "Lnet/minecraft/world/level/material/FlowingFluid;canSpreadTo(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;Lnet/minecraft/world/level/material/Fluid;)Z": "Lnet/minecraft/class_3609;method_15738(Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_3610;Lnet/minecraft/class_3611;)Z", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_3609;tick(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3610;)V", + "spread": "Lnet/minecraft/class_3609;method_15725(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3610;)V", + "spreadToSides": "Lnet/minecraft/class_3609;method_15744(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_3610;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PowderSnowBlockMixin": { + "entityInside": "Lnet/minecraft/class_5635;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;m_46961_(Lnet/minecraft/class_2338;Z)Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/MerchantContainerMixin": { + "playTradeSound": "Lnet/minecraft/class_1728;method_20595()V", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/item/trading/Merchant;)V": "Lnet/minecraft/class_1728;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1915;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin": { + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;isLit()Z": "Lnet/minecraft/class_2609;method_11201()Z", + "createExperience": "Lnet/minecraft/class_2609;method_17760(Lnet/minecraft/class_3218;Lnet/minecraft/class_243;IF)V", + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;cookingProgress:I": "Lnet/minecraft/class_2609;field_11989:I", + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;litDuration:I": "Lnet/minecraft/class_2609;field_11980:I", + "serverTick": "Lnet/minecraft/class_2609;method_31651(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2609;)V", + "Lnet/minecraft/world/entity/ExperienceOrb;award(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/phys/Vec3;I)V": "Lnet/minecraft/class_1303;method_31493(Lnet/minecraft/class_3218;Lnet/minecraft/class_243;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CocoaBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "performBonemeal": "Lnet/minecraft/class_2282;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "randomTick": "Lnet/minecraft/class_2282;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/StemBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "performBonemeal": "Lnet/minecraft/class_2513;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "randomTick": "Lnet/minecraft/class_2513;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Bee_GrowCropGoalMixin": { + "Lnet/minecraft/world/level/Level;levelEvent(ILnet/minecraft/core/BlockPos;I)V": "Lnet/minecraft/class_1937;m_46796_(ILnet/minecraft/class_2338;I)V", + "tick": "Lnet/minecraft/class_4466$class_4474;tick()V", + "net.minecraft.world.entity.animal.Bee$BeeGrowCropGoal": "net/minecraft/class_4466$class_4474" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LightningRodBlockMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "onLightningStrike": "Lnet/minecraft/class_5554;method_31648(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "onProjectileHit": "Lnet/minecraft/class_5554;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/server/Main_ServerShutdownThreadMixin": { + "Lnet/minecraft/server/MinecraftServer;halt(Z)V": "Lnet/minecraft/server/MinecraftServer;method_3747(Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/warden/WardenMixin": { + "applyDarknessAround": "Lnet/minecraft/class_7260;method_42204(Lnet/minecraft/class_3218;Lnet/minecraft/class_243;Lnet/minecraft/class_1297;I)V", + "Lnet/minecraft/world/effect/MobEffectUtil;addEffectToPlayersAround(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;DLnet/minecraft/world/effect/MobEffectInstance;I)Ljava/util/List;": "Lnet/minecraft/class_1292;method_42143(Lnet/minecraft/class_3218;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;DLnet/minecraft/class_1293;I)Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/server/level/TicketTypeMixin": { + "timeout": "f_9452_:J" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemOnBlockPacketMixin": { + "(Lnet/minecraft/network/FriendlyByteBuf;)V": "Lnet/minecraft/class_2885;(Lnet/minecraft/class_2540;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ArrowEntityMixin": { + "doPostHurtEffects": "Lnet/minecraft/class_1667;doPostHurtEffects(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/npc/WanderingTraderMixin": { + "updateTrades": "Lnet/minecraft/class_3989;updateTrades()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/OwnerHurtTargetGoalMixin": { + "start": "Lnet/minecraft/class_1406;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/levelgen/structure/templatesystem/StructureTemplateMixin": { + "load": "Lnet/minecraft/class_3499;method_15183(Lnet/minecraft/class_7871;Lnet/minecraft/class_2487;)V", + "save": "Lnet/minecraft/class_3499;method_15175(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FireBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/server/level/ServerLevel;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_3218;m_7471_(Lnet/minecraft/class_2338;Z)Z", + "Lnet/minecraft/world/level/block/Block;defaultBlockState()Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2248;method_9564()Lnet/minecraft/class_2680;", + "tick": "Lnet/minecraft/class_2358;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "updateShape": "Lnet/minecraft/class_2358;updateShape(Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/Level;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_1937;getBlockState(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/storage/PrimaryLevelDataMixin": { + "setTagData": "Lnet/minecraft/class_31;method_158(Lnet/minecraft/class_5455;Lnet/minecraft/class_2487;Lnet/minecraft/class_2487;)V", + "setThundering": "Lnet/minecraft/class_31;setThundering(Z)V", + "setRaining": "Lnet/minecraft/class_31;setRaining(Z)V", + "Lnet/minecraft/world/level/levelgen/WorldGenSettings;encode(Lcom/mojang/serialization/DynamicOps;Lnet/minecraft/world/level/levelgen/WorldOptions;Lnet/minecraft/core/RegistryAccess;)Lcom/mojang/serialization/DataResult;": "Lnet/minecraft/class_7726;method_45539(Lcom/mojang/serialization/DynamicOps;Lnet/minecraft/class_5285;Lnet/minecraft/class_5455;)Lcom/mojang/serialization/DataResult;", + "setDifficulty": "Lnet/minecraft/class_31;setDifficulty(Lnet/minecraft/class_1267;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/AssignProfessionFromJobSiteMixin": { + "Lnet/minecraft/world/entity/npc/Villager;setVillagerData(Lnet/minecraft/world/entity/npc/VillagerData;)V": "Lnet/minecraft/class_1646;setVillagerData(Lnet/minecraft/class_3850;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/SnowGolemMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "aiStep": "Lnet/minecraft/class_1473;aiStep()V", + "shear": "Lnet/minecraft/class_1473;shear(Lnet/minecraft/class_3419;)V", + "Lnet/minecraft/world/damagesource/DamageSources;onFire()Lnet/minecraft/world/damagesource/DamageSource;": "Lnet/minecraft/class_8109;method_48813()Lnet/minecraft/class_1282;", + "Lnet/minecraft/world/entity/animal/SnowGolem;spawnAtLocation(Lnet/minecraft/world/item/ItemStack;F)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1473;m_5552_(Lnet/minecraft/class_1799;F)Lnet/minecraft/class_1542;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/WitherSkullMixin": { + "Lnet/minecraft/world/entity/LivingEntity;heal(F)V": "Lnet/minecraft/class_1309;method_6025(F)V", + "onHit": "Lnet/minecraft/class_1687;onHit(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8537(Lnet/minecraft/class_1297;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "onHitEntity": "Lnet/minecraft/class_1687;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/ShulkerBoxContainerMixin": { + "stillValid": "Lnet/minecraft/class_1733;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;)V": "Lnet/minecraft/class_1733;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FenceGateBlockMixin": { + "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_276867_(Lnet/minecraft/class_2338;)Z", + "neighborChanged": "Lnet/minecraft/class_2349;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ButtonBlockMixin": { + "checkPressed": "Lnet/minecraft/class_2269;method_9715(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "use": "Lnet/minecraft/class_2269;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;": "Lnet/minecraft/class_2680;m_61143_(Lnet/minecraft/class_2769;)Ljava/lang/Comparable;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownPotionMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "dowseFire": "Lnet/minecraft/class_1686;method_7499(Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "Lnet/minecraft/world/level/block/AbstractCandleBlock;extinguish(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_5540;method_31614(Lnet/minecraft/class_1657;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)V", + "onHit": "Lnet/minecraft/class_1686;onHit(Lnet/minecraft/class_239;)V", + "makeAreaOfEffectCloud": "Lnet/minecraft/class_1686;method_7497(Lnet/minecraft/class_1799;Lnet/minecraft/class_1842;)V", + "Lnet/minecraft/world/level/Level;levelEvent(Lnet/minecraft/world/entity/player/Player;ILnet/minecraft/core/BlockPos;I)V": "Lnet/minecraft/class_1937;m_5898_(Lnet/minecraft/class_1657;ILnet/minecraft/class_2338;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/AbstractHurtingProjectileMixin": { + "Lnet/minecraft/world/entity/Entity;getLookAngle()Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_1297;method_5720()Lnet/minecraft/class_243;", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1668;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "Lnet/minecraft/world/entity/projectile/AbstractHurtingProjectile;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1668;m_6532_(Lnet/minecraft/class_239;)V", + "tick": "Lnet/minecraft/class_1668;tick()V", + "hurt": "Lnet/minecraft/class_1668;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/server/BootstrapMixin": { + "bootStrap": "Lnet/minecraft/class_2966;method_12851()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TntBlockMixin": { + "use": "Lnet/minecraft/class_2530;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "playerWillDestroy": "Lnet/minecraft/class_2530;playerWillDestroy(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_276867_(Lnet/minecraft/class_2338;)Z", + "neighborChanged": "Lnet/minecraft/class_2530;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V", + "onPlace": "Lnet/minecraft/class_2530;onPlace(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Z)V", + "onProjectileHit": "Lnet/minecraft/class_2530;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BellBlockEntityMixin": { + "makeRaidersGlow": "Lnet/minecraft/class_3721;method_20521(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Ljava/util/List;)V" + }, + "io/izzel/arclight/common/mixin/optimization/paper/MinecraftServerMixin_PaperWorldCreation": { + "tickChildren": "Lnet/minecraft/server/MinecraftServer;method_3813(Ljava/util/function/BooleanSupplier;)V" + }, + "io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin": { + "Lnet/minecraft/world/item/ItemStack;getItem()Lnet/minecraft/world/item/Item;": "Lnet/minecraft/class_1799;method_7909()Lnet/minecraft/class_1792;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Vex_CopyOwnerTargetGoalMixin": { + "net.minecraft.world.entity.monster.Vex$VexCopyOwnerTargetGoal": "net/minecraft/class_1634$class_1636", + "start": "Lnet/minecraft/class_1634$class_1636;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/FurnaceResultSlotMixin": { + "checkTakeAchievements(Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1719;checkTakeAchievements(Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;awardUsedRecipesAndPopExperience(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_2609;method_17763(Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PoweredRailBlockMixin": { + "updateState": "Lnet/minecraft/class_2442;updateState(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin": { + "Lnet/minecraft/world/level/Level;isClientSide:Z": "Lnet/minecraft/class_1937;field_9236:Z", + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/world/level/chunk/UpgradeData;Lnet/minecraft/world/ticks/LevelChunkTicks;Lnet/minecraft/world/ticks/LevelChunkTicks;J[Lnet/minecraft/world/level/chunk/LevelChunkSection;Lnet/minecraft/world/level/chunk/LevelChunk$PostLoadProcessor;Lnet/minecraft/world/level/levelgen/blending/BlendingData;)V": "Lnet/minecraft/class_2818;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1923;Lnet/minecraft/class_2843;Lnet/minecraft/class_6755;Lnet/minecraft/class_6755;J[Lnet/minecraft/class_2826;Lnet/minecraft/class_2818$class_6829;Lnet/minecraft/class_6749;)V", + "(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ProtoChunk;Lnet/minecraft/world/level/chunk/LevelChunk$PostLoadProcessor;)V": "Lnet/minecraft/class_2818;(Lnet/minecraft/class_3218;Lnet/minecraft/class_2839;Lnet/minecraft/class_2818$class_6829;)V", + "setBlockState": "Lnet/minecraft/class_2818;setBlockState(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Z)Lnet/minecraft/class_2680;", + "removeBlockEntity": "Lnet/minecraft/class_2818;removeBlockEntity(Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/trackingrange/ChunkManagerMixin_TrackingRange": { + "addEntity": "Lnet/minecraft/class_3898;method_18701(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/EntityType;updateInterval()I": "Lnet/minecraft/class_1299;method_18388()I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/TurtleMixin": { + "ageBoundaryReached": "Lnet/minecraft/class_1481;ageBoundaryReached()V", + "Lnet/minecraft/world/entity/animal/Turtle;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;I)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1481;m_20000_(Lnet/minecraft/class_1935;I)Lnet/minecraft/class_1542;", + "layEggCounter": "f_30129_:I", + "thunderHit": "Lnet/minecraft/class_1481;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "setLayingEgg": "m_30236_(Z)V", + "setHasEgg": "m_30234_(Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/HangingEntityMixin": { + "move": "Lnet/minecraft/class_1530;move(Lnet/minecraft/class_1313;Lnet/minecraft/class_243;)V", + "Lnet/minecraft/world/entity/decoration/HangingEntity;discard()V": "Lnet/minecraft/class_1530;m_146870_()V", + "Lnet/minecraft/world/entity/decoration/HangingEntity;kill()V": "Lnet/minecraft/class_1530;m_6074_()V", + "tick": "Lnet/minecraft/class_1530;tick()V", + "hurt": "Lnet/minecraft/class_1530;hurt(Lnet/minecraft/class_1282;F)Z", + "push": "Lnet/minecraft/class_1530;push(DDD)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/ShearsItemMixin": { + "interactLivingEntity": "Lnet/minecraft/class_1820;m_6880_(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1309;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Silverfish_MergeWithStoneGoalMixin": { + "net.minecraft.world.entity.monster.Silverfish$SilverfishMergeWithStoneGoal": "net/minecraft/class_1614$class_1615", + "start": "Lnet/minecraft/class_1614$class_1615;start()V", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/server/level/ChunkMapMixin": { + "upgradeChunkTag": "Lnet/minecraft/class_3898;method_43381(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;", + "Lnet/minecraft/server/level/ServerLevel;dimension()Lnet/minecraft/resources/ResourceKey;": "Lnet/minecraft/class_3218;m_46472_()Lnet/minecraft/class_5321;", + "tick": "m_140280_(Ljava/util/function/BooleanSupplier;)V", + "setViewDistance": "m_140167_(I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LeavesBlockMixin": { + "randomTick": "Lnet/minecraft/class_2397;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/block/LeavesBlock;dropResources(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_2397;m_49950_(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SignBlockMixin": { + "use": "Lnet/minecraft/class_2478;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "openTextEdit": "Lnet/minecraft/class_2478;method_49825(Lnet/minecraft/class_1657;Lnet/minecraft/class_2625;Z)V", + "Lnet/minecraft/world/level/block/SignBlock;openTextEdit(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/entity/SignBlockEntity;Z)V": "Lnet/minecraft/class_2478;method_49825(Lnet/minecraft/class_1657;Lnet/minecraft/class_2625;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CakeBlockMixin": { + "Lnet/minecraft/world/food/FoodData;eat(IF)V": "Lnet/minecraft/class_1702;method_7585(IF)V", + "eat": "Lnet/minecraft/class_2272;method_9719(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1657;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/EndGatewayBlockEntityMixin": { + "teleportEntity": "Lnet/minecraft/class_2643;method_11409(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;Lnet/minecraft/class_2643;)V", + "Lnet/minecraft/world/entity/Entity;setPortalCooldown()V": "Lnet/minecraft/class_1297;method_30229()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DispenserBlockMixin_Accessor": { + "DISPENSER_REGISTRY": "f_52661_:Ljava/util/Map;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/brain/BrainUtilMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "throwItem(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;F)V": "Lnet/minecraft/class_4215;method_43392(Lnet/minecraft/class_1309;Lnet/minecraft/class_1799;Lnet/minecraft/class_243;Lnet/minecraft/class_243;F)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/EatBlockGoalMixin": { + "tick": "Lnet/minecraft/class_1345;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/ExplosionMixin": { + "explode": "Lnet/minecraft/class_1927;method_8348()V", + "blockInteraction": "f_46010_:Lnet/minecraft/world/level/Explosion$BlockInteraction;", + "addBlockDrops": "Lnet/minecraft/class_1927;method_24023(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;Lnet/minecraft/class_1799;Lnet/minecraft/class_2338;)V", + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;DDDFZLnet/minecraft/world/level/Explosion$BlockInteraction;)V": "Lnet/minecraft/class_1927;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1297;DDDFZLnet/minecraft/class_1927$class_4179;)V", + "source": "f_46016_:Lnet/minecraft/world/entity/Entity;", + "radius": "f_46017_:F" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ZombieVillagerMixin": { + "Lnet/minecraft/world/entity/monster/ZombieVillager;removeEffect(Lnet/minecraft/world/effect/MobEffect;)Z": "Lnet/minecraft/class_1641;m_21195_(Lnet/minecraft/class_1291;)Z", + "finishConversion": "Lnet/minecraft/class_1641;method_7197(Lnet/minecraft/class_3218;)V", + "Lnet/minecraft/world/entity/monster/ZombieVillager;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1641;m_7292_(Lnet/minecraft/class_1293;)Z", + "Lnet/minecraft/world/entity/monster/ZombieVillager;convertTo(Lnet/minecraft/world/entity/EntityType;Z)Lnet/minecraft/world/entity/Mob;": "Lnet/minecraft/class_1641;m_21406_(Lnet/minecraft/class_1299;Z)Lnet/minecraft/class_1308;", + "Lnet/minecraft/world/entity/monster/ZombieVillager;spawnAtLocation(Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1641;m_19983_(Lnet/minecraft/class_1799;)Lnet/minecraft/class_1542;", + "startConverting": "Lnet/minecraft/class_1641;method_7199(Ljava/util/UUID;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BushBlockMixin": { + "Lnet/minecraft/world/level/block/Block;defaultBlockState()Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2248;method_9564()Lnet/minecraft/class_2680;", + "updateShape": "Lnet/minecraft/class_2261;updateShape(Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/HopperContainerMixin": { + "stillValid": "Lnet/minecraft/class_1722;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;)V": "Lnet/minecraft/class_1722;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TurtleEggBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2542;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;playSound(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V": "Lnet/minecraft/class_3218;m_5594_(Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_3414;Lnet/minecraft/class_3419;FF)V", + "Lnet/minecraft/world/level/block/TurtleEggBlock;decreaseEggs(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_2542;method_10833(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "destroyEgg": "Lnet/minecraft/class_2542;method_10834(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;I)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/VoxelShapesMixin": { + "createIndexMerger": "Lnet/minecraft/class_259;method_1069(ILit/unimi/dsi/fastutil/doubles/DoubleList;Lit/unimi/dsi/fastutil/doubles/DoubleList;ZZ)Lnet/minecraft/class_255;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/InteractionMixin": { + "Lnet/minecraft/advancements/critereon/PlayerHurtEntityTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;FFZ)V": "Lnet/minecraft/class_2115;method_9097(Lnet/minecraft/class_3222;Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;FFZ)V", + "skipAttackInteraction": "Lnet/minecraft/class_8150;skipAttackInteraction(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Interaction;attack:Lnet/minecraft/world/entity/Interaction$PlayerAction;": "Lnet/minecraft/class_8150;field_42633:Lnet/minecraft/class_8150$class_8151;" + }, + "io/izzel/arclight/common/mixin/core/world/item/FireChargeItemMixin": { + "useOn": "Lnet/minecraft/class_1778;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/item/FireChargeItem;playSound(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_1778;method_18453(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/SpellcastingIllager_UseSpellGoalMixin": { + "Lnet/minecraft/world/entity/monster/SpellcasterIllager$SpellcasterUseSpellGoal;performSpellCasting()V": "Lnet/minecraft/class_1617$class_1620;method_7148()V", + "tick": "Lnet/minecraft/class_1617$class_1620;tick()V" + }, + "io/izzel/arclight/common/mixin/core/commands/arguments/selector/EntitySelectorParserMixin": { + "parseSelector": "Lnet/minecraft/class_2303;method_9917()V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/BaseSpawnerMixin": { + "setEntityId": "Lnet/minecraft/class_1917;method_8274(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/sensing/TemptingSensorMixin": { + "doTick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/PathfinderMob;)V": "Lnet/minecraft/class_5760;method_33213(Lnet/minecraft/class_3218;Lnet/minecraft/class_1314;)V", + "Lnet/minecraft/world/entity/ai/Brain;setMemory(Lnet/minecraft/world/entity/ai/memory/MemoryModuleType;Ljava/lang/Object;)V": "Lnet/minecraft/class_4095;method_18878(Lnet/minecraft/class_4140;Ljava/lang/Object;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/EndPortalBlockMixin": { + "Lnet/minecraft/server/MinecraftServer;getLevel(Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/server/level/ServerLevel;": "Lnet/minecraft/server/MinecraftServer;method_3847(Lnet/minecraft/class_5321;)Lnet/minecraft/class_3218;", + "entityInside": "Lnet/minecraft/class_2334;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Silverfish_WakeUpFriendsGoalMixin": { + "net.minecraft.world.entity.monster.Silverfish$SilverfishWakeUpFriendsGoal": "net/minecraft/class_1614$class_1616" + }, + "io/izzel/arclight/common/mixin/core/world/entity/PathfinderMobMixin": { + "Lnet/minecraft/world/entity/PathfinderMob;dropLeash(ZZ)V": "Lnet/minecraft/class_1314;m_21455_(ZZ)V", + "tickLeash": "Lnet/minecraft/class_1314;tickLeash()V" + }, + "io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin": { + "onServerExit": "Lnet/minecraft/class_3176;onServerExit()V", + "Lnet/minecraft/commands/Commands;performPrefixedCommand(Lnet/minecraft/commands/CommandSourceStack;Ljava/lang/String;)I": "Lnet/minecraft/class_2170;method_44252(Lnet/minecraft/class_2168;Ljava/lang/String;)I", + "handleConsoleInputs": "Lnet/minecraft/class_3176;method_13941()V", + "Lnet/minecraft/server/dedicated/DedicatedServer;setPlayerList(Lnet/minecraft/server/players/PlayerList;)V": "Lnet/minecraft/class_3176;m_129823_(Lnet/minecraft/class_3324;)V", + "Lnet/minecraft/server/dedicated/DedicatedServerProperties;enableRcon:Z": "Lnet/minecraft/class_3806;field_16818:Z", + "initServer": "Lnet/minecraft/class_3176;initServer()Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RootedDirtBlockMixin": { + "performBonemeal": "Lnet/minecraft/class_5954;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/GuardianMixin": { + "Lnet/minecraft/world/entity/ai/goal/GoalSelector;addGoal(ILnet/minecraft/world/entity/ai/goal/Goal;)V": "Lnet/minecraft/class_1355;method_6277(ILnet/minecraft/class_1352;)V", + "registerGoals": "Lnet/minecraft/class_1577;registerGoals()V" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/ClientboundSystemChatPacketMixin": { + "(Lnet/minecraft/network/chat/Component;Z)V": "Lnet/minecraft/class_7439;(Lnet/minecraft/class_2561;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raider/RaiderMixin": { + "die": "Lnet/minecraft/class_3763;die(Lnet/minecraft/class_1282;)V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1657;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneOreBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "stepOn": "Lnet/minecraft/class_2449;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "randomTick": "Lnet/minecraft/class_2449;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "attack": "Lnet/minecraft/class_2449;attack(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;)V", + "use": "Lnet/minecraft/class_2449;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "interact": "Lnet/minecraft/class_2449;method_10441(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/levelgen/structure/templatesystem/StructurePlaceSettingsMixin": { + "getRandomPalette": "Lnet/minecraft/class_3492;method_15121(Ljava/util/List;Lnet/minecraft/class_2338;)Lnet/minecraft/class_3499$class_5162;", + "Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructurePlaceSettings;getRandom(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/util/RandomSource;": "Lnet/minecraft/class_3492;method_15115(Lnet/minecraft/class_2338;)Lnet/minecraft/class_5819;" + }, + "io/izzel/arclight/common/mixin/core/world/item/PotionItemMixin": { + "finishUsingItem": "Lnet/minecraft/class_1812;finishUsingItem(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)Lnet/minecraft/class_1799;", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BasePressurePlateBlockMixin": { + "checkPressed": "Lnet/minecraft/class_2231;method_9433(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)V", + "Lnet/minecraft/world/level/block/BasePressurePlateBlock;getSignalStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)I": "Lnet/minecraft/class_2231;method_9434(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/LevelMixin": { + "Lnet/minecraft/world/level/block/state/BlockState;updateNeighbourShapes(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;II)V": "Lnet/minecraft/class_2680;m_60705_(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;II)V", + "Lnet/minecraft/world/level/Level;onBlockStateChange(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_1937;method_19282(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2680;)V", + "setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "thread": "f_46423_:Ljava/lang/Thread;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/GrowingPlantHeadBlockMixin": { + "randomTick": "Lnet/minecraft/class_4865;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/server/network/ServerGamePacketListenerImplMixin_Paper": { + "broadcastChatMessage": "Lnet/minecraft/class_3244;method_44155(Lnet/minecraft/class_7471;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/CrossbowItemMixin": { + "shootProjectile": "Lnet/minecraft/class_1764;method_7763(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;Lnet/minecraft/class_1268;Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;FZFFF)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/item/ItemStack;hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Ljava/util/function/Consumer;)V": "Lnet/minecraft/class_1799;method_7956(ILnet/minecraft/class_1309;Ljava/util/function/Consumer;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/WitherRoseBlockMixin": { + "entityInside": "Lnet/minecraft/class_2563;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainerMixin": { + "Lnet/minecraft/world/Container;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1263;method_5447(ILnet/minecraft/class_1799;)V", + "createResult": "Lnet/minecraft/class_3803;method_16695()V", + "Lnet/minecraft/world/inventory/GrindstoneMenu;broadcastChanges()V": "Lnet/minecraft/class_3803;m_38946_()V", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_3803;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/LeadItemMixin": { + "useOn": "Lnet/minecraft/class_1804;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/item/LeadItem;bindPlayerMobs(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/InteractionResult;": "Lnet/minecraft/class_1804;method_7994(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/optimization/general/realtime/ItemEntityMixin_Realtime": { + "tick": "Lnet/minecraft/class_1542;tick()V", + "Lnet/minecraft/world/entity/Entity;tick()V": "Lnet/minecraft/class_1297;method_5773()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/MinecartItemMixin": { + "useOn": "Lnet/minecraft/class_1808;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/saveddata/maps/MapDataMixin": { + "load": "Lnet/minecraft/class_22;method_32371(Lnet/minecraft/class_2487;)Lnet/minecraft/class_22;", + "save": "Lnet/minecraft/class_22;save(Lnet/minecraft/class_2487;)Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/StriderMixin": { + "Lnet/minecraft/world/entity/monster/Strider;setSuffocating(Z)V": "Lnet/minecraft/class_4985;method_26349(Z)V", + "tick": "Lnet/minecraft/class_4985;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/EggItemMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "use": "Lnet/minecraft/class_1771;use(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1271;", + "Lnet/minecraft/world/level/Level;playSound(Lnet/minecraft/world/entity/player/Player;DDDLnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V": "Lnet/minecraft/class_1937;method_43128(Lnet/minecraft/class_1657;DDDLnet/minecraft/class_3414;Lnet/minecraft/class_3419;FF)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/InfestedBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z", + "spawnInfestation": "Lnet/minecraft/class_2384;method_24797(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/WitchMixin": { + "aiStep": "Lnet/minecraft/class_1640;aiStep()V", + "Lnet/minecraft/world/entity/monster/Witch;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1640;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Ghast_GhastShootFireballGoalMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "net.minecraft.world.entity.monster.Ghast$GhastShootFireballGoal": "net/minecraft/class_1571$class_1574", + "tick": "Lnet/minecraft/class_1571$class_1574;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/FollowOwnerGoalMixin": { + "maybeTeleportTo": "Lnet/minecraft/class_1350;method_23343(III)Z", + "Lnet/minecraft/world/entity/ai/navigation/PathNavigation;stop()V": "Lnet/minecraft/class_1408;method_6340()V", + "Lnet/minecraft/world/entity/TamableAnimal;moveTo(DDDFF)V": "Lnet/minecraft/class_1321;m_7678_(DDDFF)V" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerChunkCache_MainThreadExecutorMixin": { + "net.minecraft.server.level.ServerChunkCache$MainThreadExecutor": "net/minecraft/class_3215$class_4212" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/FireballMixin": { + "Lnet/minecraft/world/entity/projectile/Fireball;setItem(Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_3855;method_16936(Lnet/minecraft/class_1799;)V", + "readAdditionalSaveData": "Lnet/minecraft/class_3855;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/MilkBucketItemMixin": { + "finishUsingItem": "Lnet/minecraft/class_1805;finishUsingItem(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/VillagerMakeLoveMixin": { + "Lnet/minecraft/world/entity/npc/Villager;getBreedOffspring(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/AgeableMob;)Lnet/minecraft/world/entity/npc/Villager;": "Lnet/minecraft/class_1646;method_7225(Lnet/minecraft/class_3218;Lnet/minecraft/class_1296;)Lnet/minecraft/class_1646;", + "breed": "Lnet/minecraft/class_4111;method_18970(Lnet/minecraft/class_3218;Lnet/minecraft/class_1646;Lnet/minecraft/class_1646;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/network/SynchedEntityDataMixin": { + "set(Lnet/minecraft/network/syncher/EntityDataAccessor;Ljava/lang/Object;Z)V": "Lnet/minecraft/class_2945;method_49743(Lnet/minecraft/class_2940;Ljava/lang/Object;Z)V" + }, + "io/izzel/arclight/common/mixin/core/server/PlayerAdvancementsMixin": { + "Lnet/minecraft/advancements/Advancement;getRewards()Lnet/minecraft/advancements/AdvancementRewards;": "Lnet/minecraft/class_161;method_691()Lnet/minecraft/class_170;", + "award": "Lnet/minecraft/class_2985;method_12878(Lnet/minecraft/class_161;Ljava/lang/String;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/gen/feature/structure/SwampHutPieceMixin": { + "Lnet/minecraft/world/level/WorldGenLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_5281;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/ServerLevelAccessor;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_5425;method_30771(Lnet/minecraft/class_1297;)V", + "spawnCat": "Lnet/minecraft/class_3447;method_16181(Lnet/minecraft/class_5425;Lnet/minecraft/class_3341;)V", + "postProcess": "Lnet/minecraft/class_3447;postProcess(Lnet/minecraft/class_5281;Lnet/minecraft/class_5138;Lnet/minecraft/class_2794;Lnet/minecraft/class_5819;Lnet/minecraft/class_3341;Lnet/minecraft/class_1923;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/ItemCombinerMixin": { + "stillValid": "Lnet/minecraft/class_4861;stillValid(Lnet/minecraft/class_1657;)Z" + }, + "io/izzel/arclight/common/mixin/core/server/commands/GameRuleCommandMixin": { + "setRule": "Lnet/minecraft/class_3065;method_13394(Lcom/mojang/brigadier/context/CommandContext;Lnet/minecraft/class_1928$class_4313;)I", + "Lnet/minecraft/server/MinecraftServer;getGameRules()Lnet/minecraft/world/level/GameRules;": "Lnet/minecraft/server/MinecraftServer;method_3767()Lnet/minecraft/class_1928;", + "queryRule": "Lnet/minecraft/class_3065;method_13397(Lnet/minecraft/class_2168;Lnet/minecraft/class_1928$class_4313;)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/axolotl/AxolotlMixin": { + "applySupportingEffects": "Lnet/minecraft/class_5762;method_33223(Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1657;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "getMaxAirSupply": "Lnet/minecraft/class_5762;getMaxAirSupply()I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Evoker_EvokerSummonSpellGoalMixin": { + "performSpellCasting": "Lnet/minecraft/class_1564$class_1567;performSpellCasting()V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "net.minecraft.world.entity.monster.Evoker$EvokerSummonSpellGoal": "net/minecraft/class_1564$class_1567" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/ChickenMixin": { + "aiStep": "Lnet/minecraft/class_1428;aiStep()V", + "Lnet/minecraft/world/entity/animal/Chicken;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1428;m_19998_(Lnet/minecraft/class_1935;)Lnet/minecraft/class_1542;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SweetBerryBushBlockMixin": { + "Lnet/minecraft/world/level/block/SweetBerryBushBlock;popResource(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_3830;m_49840_(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1297;method_5643(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_3830;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "use": "Lnet/minecraft/class_3830;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "entityInside": "Lnet/minecraft/class_3830;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CarvedPumpkinBlockMixin": { + "spawnGolemInWorld": "Lnet/minecraft/class_2276;method_45455(Lnet/minecraft/class_1937;Lnet/minecraft/class_2700$class_2702;Lnet/minecraft/class_1297;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/level/block/CarvedPumpkinBlock;clearPatternBlocks(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/block/state/pattern/BlockPattern$BlockPatternMatch;)V": "Lnet/minecraft/class_2276;method_45454(Lnet/minecraft/class_1937;Lnet/minecraft/class_2700$class_2702;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/Phantom_AttackPlayerTargetGoalMixin": { + "net.minecraft.world.entity.monster.Phantom$PhantomAttackPlayerTargetGoal": "net/minecraft/class_1593$class_1595" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/SheepMixin": { + "ate": "Lnet/minecraft/class_1472;ate()V", + "shear": "Lnet/minecraft/class_1472;shear(Lnet/minecraft/class_3419;)V", + "Lnet/minecraft/world/entity/animal/Sheep;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;I)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1472;m_20000_(Lnet/minecraft/class_1935;I)Lnet/minecraft/class_1542;", + "makeContainer": "Lnet/minecraft/class_1472;method_17690(Lnet/minecraft/class_1767;Lnet/minecraft/class_1767;)Lnet/minecraft/class_8566;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BeehiveBlockMixin": { + "Lnet/minecraft/world/entity/animal/Bee;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_4466;m_6710_(Lnet/minecraft/class_1309;)V", + "angerNearbyBees": "Lnet/minecraft/class_4481;method_23893(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/DispenserContainerMixin": { + "stillValid": "Lnet/minecraft/class_1716;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;)V": "Lnet/minecraft/class_1716;(ILnet/minecraft/class_1661;Lnet/minecraft/class_1263;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin": { + "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z": "Lnet/minecraft/class_2874;comp_644()Z", + "use": "Lnet/minecraft/class_1755;use(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1271;", + "Lnet/minecraft/world/level/block/BucketPickup;pickupBlock(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_2263;method_9700(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Lnet/minecraft/class_1799;", + "Lnet/minecraft/world/item/ItemUtils;createFilledResult(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_5328;method_30012(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1799;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/server/level/ChunkHolderMixin": { + "updateFutures": "Lnet/minecraft/class_3193;method_14007(Lnet/minecraft/class_3898;Ljava/util/concurrent/Executor;)V", + "blockChanged": "Lnet/minecraft/class_3193;method_14002(Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/server/level/ChunkHolder;changedBlocksPerSection:[Lit/unimi/dsi/fastutil/shorts/ShortSet;": "Lnet/minecraft/class_3193;field_25804:[Lit/unimi/dsi/fastutil/shorts/ShortSet;", + "oldTicketLevel": "f_140006_:I" + }, + "io/izzel/arclight/common/mixin/core/server/commands/TimeCommandMixin": { + "Lnet/minecraft/server/level/ServerLevel;setDayTime(J)V": "Lnet/minecraft/class_3218;method_29199(J)V", + "addTime": "Lnet/minecraft/class_3149;method_13788(Lnet/minecraft/class_2168;I)I", + "Lnet/minecraft/server/MinecraftServer;getAllLevels()Ljava/lang/Iterable;": "Lnet/minecraft/server/MinecraftServer;method_3738()Ljava/lang/Iterable;", + "setTime": "Lnet/minecraft/class_3149;method_13784(Lnet/minecraft/class_2168;I)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/EnderMan_EndermanLeaveBlockGoalMixin": { + "net.minecraft.world.entity.monster.EnderMan$EndermanLeaveBlockGoal": "net/minecraft/class_1560$class_1561", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_1560$class_1561;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/SkeletonTrapGoalMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/animal/horse/SkeletonTrapGoal;createHorse(Lnet/minecraft/world/DifficultyInstance;)Lnet/minecraft/world/entity/animal/horse/AbstractHorse;": "Lnet/minecraft/class_1505;method_6810(Lnet/minecraft/class_1266;)Lnet/minecraft/class_1496;", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/storage/LevelStorageSource_LevelStorageAccessMixin": { + "getDimensionPath": "Lnet/minecraft/class_32$class_5143;method_27424(Lnet/minecraft/class_5321;)Ljava/nio/file/Path;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkSpreaderMixin": { + "addCursor": "Lnet/minecraft/class_7128;method_41480(Lnet/minecraft/class_7128$class_7129;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/ParrotMixin": { + "mobInteract": "Lnet/minecraft/class_1453;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/animal/Parrot;setOrderedToSit(Z)V": "Lnet/minecraft/class_1453;m_21839_(Z)V", + "Lnet/minecraft/world/entity/animal/Parrot;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1453;m_7292_(Lnet/minecraft/class_1293;)Z", + "hurt": "Lnet/minecraft/class_1453;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/FlintAndSteelItemMixin": { + "useOn": "Lnet/minecraft/class_1786;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;playSound(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V": "Lnet/minecraft/class_1937;method_43129(Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_3414;Lnet/minecraft/class_3419;FF)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/WolfMixin": { + "mobInteract": "Lnet/minecraft/class_1493;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/animal/Wolf;heal(F)V": "Lnet/minecraft/class_1493;m_5634_(F)V", + "setTame": "Lnet/minecraft/class_1493;setTame(Z)V", + "Lnet/minecraft/world/entity/animal/Wolf;setOrderedToSit(Z)V": "Lnet/minecraft/class_1493;m_21839_(Z)V", + "Lnet/minecraft/world/entity/animal/Wolf;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1493;m_6710_(Lnet/minecraft/class_1309;)V", + "hurt": "Lnet/minecraft/class_1493;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/horse/AbstractHorseMixin": { + "aiStep": "Lnet/minecraft/class_1496;aiStep()V", + "addAdditionalSaveData": "Lnet/minecraft/class_1496;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "createInventory": "Lnet/minecraft/class_1496;method_6721()V", + "Lnet/minecraft/world/entity/animal/horse/AbstractHorse;heal(F)V": "Lnet/minecraft/class_1496;m_5634_(F)V", + "readAdditionalSaveData": "Lnet/minecraft/class_1496;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "handleEating": "Lnet/minecraft/class_1496;method_6742(Lnet/minecraft/class_1657;Lnet/minecraft/class_1799;)Z", + "handleStartJump": "Lnet/minecraft/class_1496;handleStartJump(I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/FoxMixin": { + "pickUpItem": "Lnet/minecraft/class_4019;pickUpItem(Lnet/minecraft/class_1542;)V", + "Lnet/minecraft/world/entity/animal/Fox;canHoldItem(Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4019;canHoldItem(Lnet/minecraft/class_1799;)Z", + "addTrustedUUID": "m_28515_(Ljava/util/UUID;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/network/ChunkMapMixin_Optimize": { + "move": "Lnet/minecraft/class_3898;method_18713(Lnet/minecraft/class_3222;)V", + "tick()V": "Lnet/minecraft/class_3898;method_18727()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raid/RaidMixin": { + "Lnet/minecraft/world/entity/raid/Raid;getTotalRaidersAlive()I": "Lnet/minecraft/class_3765;method_16517()I", + "Lnet/minecraft/world/entity/raid/Raid;setDirty()V": "Lnet/minecraft/class_3765;method_16520()V", + "Lnet/minecraft/server/level/ServerLevel;isVillage(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_3218;method_19500(Lnet/minecraft/class_2338;)Z", + "joinRaid(ILnet/minecraft/world/entity/raid/Raider;Lnet/minecraft/core/BlockPos;Z)V": "Lnet/minecraft/class_3765;method_16516(ILnet/minecraft/class_3763;Lnet/minecraft/class_2338;Z)V", + "Lnet/minecraft/world/entity/raid/Raid;isStarted()Z": "Lnet/minecraft/class_3765;method_16524()Z", + "Lnet/minecraft/world/entity/raid/Raid;isOver()Z": "Lnet/minecraft/class_3765;method_16832()Z", + "tick": "Lnet/minecraft/class_3765;method_16509()V", + "Lnet/minecraft/advancements/critereon/PlayerTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_2135;method_9141(Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/world/entity/raid/Raid;joinRaid(ILnet/minecraft/world/entity/raid/Raider;Lnet/minecraft/core/BlockPos;Z)V": "Lnet/minecraft/class_3765;method_16516(ILnet/minecraft/class_3763;Lnet/minecraft/class_2338;Z)V", + "Lnet/minecraft/world/entity/raid/Raid;setLeader(ILnet/minecraft/world/entity/raid/Raider;)V": "Lnet/minecraft/class_3765;method_16491(ILnet/minecraft/class_3763;)V", + "Lnet/minecraft/world/entity/raid/Raid;ticksActive:J": "Lnet/minecraft/class_3765;field_16605:J", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/raid/Raid;stop()V": "Lnet/minecraft/class_3765;method_16506()V", + "Lnet/minecraft/world/entity/raid/Raid;shouldSpawnGroup()Z": "Lnet/minecraft/class_3765;method_16519()Z", + "spawnGroup": "Lnet/minecraft/class_3765;method_16522(Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BeaconTileEntityMixin": { + "load": "Lnet/minecraft/class_2580;load(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/MapItemMixin": { + "createNewSavedData": "Lnet/minecraft/class_1806;method_32349(Lnet/minecraft/class_1937;IIIZZLnet/minecraft/class_5321;)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LightningBoltMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "Lnet/minecraft/world/entity/LightningBolt;life:I": "Lnet/minecraft/class_1538;field_7185:I", + "Lnet/minecraft/world/entity/Entity;thunderHit(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/LightningBolt;)V": "Lnet/minecraft/class_1297;method_5800(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "tick": "Lnet/minecraft/class_1538;tick()V", + "spawnFire": "Lnet/minecraft/class_1538;method_6960(I)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/FishingHookMixin": { + "Lnet/minecraft/world/entity/projectile/FishingHook;timeUntilHooked:I": "Lnet/minecraft/class_1536;field_7172:I", + "checkCollision": "Lnet/minecraft/class_1536;method_6958()V", + "Lnet/minecraft/world/entity/projectile/FishingHook;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1536;m_6532_(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/entity/projectile/FishingHook;playSound(Lnet/minecraft/sounds/SoundEvent;FF)V": "Lnet/minecraft/class_1536;m_5496_(Lnet/minecraft/class_3414;FF)V", + "Lnet/minecraft/util/Mth;nextFloat(Lnet/minecraft/util/RandomSource;FF)F": "Lnet/minecraft/class_3532;method_15344(Lnet/minecraft/class_5819;FF)F", + "Lnet/minecraft/world/level/Level;canSeeSky(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_45527_(Lnet/minecraft/class_2338;)Z", + "catchingFish": "Lnet/minecraft/class_1536;method_6949(Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/world/level/Level;isRainingAt(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;method_8520(Lnet/minecraft/class_2338;)Z", + "Lnet/minecraft/util/Mth;nextInt(Lnet/minecraft/util/RandomSource;II)I": "Lnet/minecraft/class_3532;method_15395(Lnet/minecraft/class_5819;II)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ambient/BatMixin": { + "Lnet/minecraft/world/entity/ambient/Bat;setResting(Z)V": "Lnet/minecraft/class_1420;method_6449(Z)V", + "customServerAiStep": "Lnet/minecraft/class_1420;customServerAiStep()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin": { + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1657;m_7292_(Lnet/minecraft/class_1293;)Z", + "aiStep": "Lnet/minecraft/class_1657;aiStep()V", + "stopSleepInBed": "Lnet/minecraft/class_1657;method_7358(ZZ)V", + "Lnet/minecraft/world/entity/player/Player;causeFoodExhaustion(F)V": "Lnet/minecraft/class_1657;method_7322(F)V", + "Lnet/minecraft/world/entity/player/Player;setSharedFlag(IZ)V": "Lnet/minecraft/class_1657;m_20115_(IZ)V", + "turtleHelmetTick": "Lnet/minecraft/class_1657;method_7330()V", + "actuallyHurt": "Lnet/minecraft/class_1657;actuallyHurt(Lnet/minecraft/class_1282;F)V", + "Lnet/minecraft/world/entity/player/Player;sleepCounter:I": "Lnet/minecraft/class_1657;field_7487:I", + "Lnet/minecraft/world/food/FoodData;addExhaustion(F)V": "Lnet/minecraft/class_1702;method_7583(F)V", + "Lnet/minecraft/world/entity/player/Player;heal(F)V": "Lnet/minecraft/class_1657;m_5634_(F)V", + "Lnet/minecraft/world/damagesource/DamageSource;scalesWithDifficulty()Z": "Lnet/minecraft/class_1282;method_5514()Z", + "checkMovementStatistics": "Lnet/minecraft/class_1657;method_7282(DDD)V", + "stopFallFlying": "Lnet/minecraft/class_1657;method_23670()V", + "causeFoodExhaustion": "Lnet/minecraft/class_1657;method_7322(F)V", + "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1657;method_7329(Lnet/minecraft/class_1799;ZZ)Lnet/minecraft/class_1542;", + "jumpFromGround": "Lnet/minecraft/class_1657;jumpFromGround()V", + "travel": "Lnet/minecraft/class_1657;travel(Lnet/minecraft/class_243;)V", + "hurt": "Lnet/minecraft/class_1657;hurt(Lnet/minecraft/class_1282;F)Z", + "startFallFlying": "Lnet/minecraft/class_1657;method_23669()V" + }, + "io/izzel/arclight/common/mixin/core/world/spawner/PhantomSpawnerMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "tick": "Lnet/minecraft/class_2910;tick(Lnet/minecraft/class_3218;ZZ)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrowableProjectileMixin": { + "Lnet/minecraft/world/entity/projectile/ThrowableProjectile;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1682;m_6532_(Lnet/minecraft/class_239;)V", + "tick": "Lnet/minecraft/class_1682;tick()V", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1682;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1309;Lnet/minecraft/class_1937;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/PufferfishEntityMixin": { + "touch": "Lnet/minecraft/class_1454;method_6593(Lnet/minecraft/class_1308;)V", + "playerTouch": "Lnet/minecraft/class_1454;playerTouch(Lnet/minecraft/class_1657;)V", + "Lnet/minecraft/world/entity/Mob;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1308;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1657;m_147207_(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/MobMixin": { + "checkAndHandleImportantInteractions": "Lnet/minecraft/class_1308;method_29506(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/entity/Mob;setCanPickUpLoot(Z)V": "Lnet/minecraft/class_1308;method_5952(Z)V", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "serverAiStep": "Lnet/minecraft/class_1308;serverAiStep()V", + "interact": "Lnet/minecraft/class_1308;interact(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "convertTo": "Lnet/minecraft/class_1308;method_29243(Lnet/minecraft/class_1299;Z)Lnet/minecraft/class_1308;", + "readAdditionalSaveData": "Lnet/minecraft/class_1308;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "restoreLeashFromSave": "Lnet/minecraft/class_1308;method_5940()V", + "addAdditionalSaveData": "Lnet/minecraft/class_1308;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "doHurtTarget": "Lnet/minecraft/class_1308;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "pickUpItem": "Lnet/minecraft/class_1308;method_5949(Lnet/minecraft/class_1542;)V", + "Lnet/minecraft/world/entity/Mob;spawnAtLocation(Lnet/minecraft/world/level/ItemLike;)Lnet/minecraft/world/entity/item/ItemEntity;": "Lnet/minecraft/class_1308;m_19998_(Lnet/minecraft/class_1935;)Lnet/minecraft/class_1542;", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Mob;setLeashedTo(Lnet/minecraft/world/entity/Entity;Z)V": "Lnet/minecraft/class_1308;method_5954(Lnet/minecraft/class_1297;Z)V", + "setCanPickUpLoot": "Lnet/minecraft/class_1308;method_5952(Z)V", + "startRiding": "Lnet/minecraft/class_1308;startRiding(Lnet/minecraft/class_1297;Z)Z", + "removeAfterChangingDimensions": "Lnet/minecraft/class_1308;removeAfterChangingDimensions()V", + "tickLeash": "Lnet/minecraft/class_1308;method_5995()V", + "dropLeash": "Lnet/minecraft/class_1308;method_5932(ZZ)V", + "Lnet/minecraft/world/entity/Mob;dropLeash(ZZ)V": "Lnet/minecraft/class_1308;method_5932(ZZ)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/DefendVillageTargetGoalMixin": { + "start": "Lnet/minecraft/class_1397;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/BlockItemMixin": { + "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_1747;method_7707(Lnet/minecraft/class_1750;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/block/Block;setPlacedBy(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_2248;method_9567(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1309;Lnet/minecraft/class_1799;)V", + "place": "Lnet/minecraft/class_1747;method_7712(Lnet/minecraft/class_1750;)Lnet/minecraft/class_1269;" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkAccessMixin": { + "setUnsaved": "Lnet/minecraft/class_2791;method_12008(Z)V", + "isUnsaved": "Lnet/minecraft/class_2791;method_12044()Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Panda_HurtByTargetGoalMixin": { + "alertOther": "Lnet/minecraft/class_1440$class_1444;alertOther(Lnet/minecraft/class_1308;Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/Mob;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1308;method_5980(Lnet/minecraft/class_1309;)V", + "net.minecraft.world.entity.animal.Panda$PandaHurtByTargetGoal": "net/minecraft/class_1440$class_1444" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin": { + "Lnet/minecraft/world/entity/LivingEntity;setHealth(F)V": "Lnet/minecraft/class_1309;method_6033(F)V", + "removeAllEffects": "Lnet/minecraft/class_1309;method_6012()Z", + "setArrowCount": "Lnet/minecraft/class_1309;method_6097(I)V", + "Lnet/minecraft/world/entity/LivingEntity;teleportTo(DDD)V": "Lnet/minecraft/class_1309;m_6021_(DDD)V", + "addEatEffect": "Lnet/minecraft/class_1309;method_18865(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)V", + "actuallyHurt": "Lnet/minecraft/class_1309;method_6074(Lnet/minecraft/class_1282;F)V", + "completeUsingItem": "Lnet/minecraft/class_1309;method_6040()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "heal": "Lnet/minecraft/class_1309;method_6025(F)V", + "randomTeleport": "Lnet/minecraft/class_1309;method_6082(DDDZ)Z", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "getHealth": "Lnet/minecraft/class_1309;method_6032()F", + "Lnet/minecraft/world/entity/LivingEntity;setSharedFlag(IZ)V": "Lnet/minecraft/class_1309;m_20115_(IZ)V", + "setHealth": "Lnet/minecraft/class_1309;method_6033(F)V", + "dropAllDeathLoot": "Lnet/minecraft/class_1309;method_16080(Lnet/minecraft/class_1282;)V", + "createWitherRose": "Lnet/minecraft/class_1309;method_23733(Lnet/minecraft/class_1309;)V", + "removeEffectNoUpdate": "Lnet/minecraft/class_1309;method_6111(Lnet/minecraft/class_1291;)Lnet/minecraft/class_1293;", + "readAdditionalSaveData": "Lnet/minecraft/class_1309;readAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z", + "updateFallFlying": "Lnet/minecraft/class_1309;method_6053()V", + "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V": "Lnet/minecraft/class_1309;method_6005(DDD)V", + "Lnet/minecraft/world/entity/LivingEntity;dropExperience()V": "Lnet/minecraft/class_1309;method_23883()V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z", + "travel": "Lnet/minecraft/class_1309;method_6091(Lnet/minecraft/class_243;)V", + "Lnet/minecraft/world/item/ItemStack;finishUsingItem(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_1799;method_7910(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/SpiderMixin": { + "finalizeSpawn": "Lnet/minecraft/class_1628;finalizeSpawn(Lnet/minecraft/class_5425;Lnet/minecraft/class_1266;Lnet/minecraft/class_3730;Lnet/minecraft/class_1315;Lnet/minecraft/class_2487;)Lnet/minecraft/class_1315;", + "Lnet/minecraft/world/entity/monster/Spider;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1628;m_7292_(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/decoration/ArmorStandMixin": { + "Lnet/minecraft/world/level/block/Block;popResource(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_2248;method_9577(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1799;)V", + "causeDamage": "Lnet/minecraft/class_1531;method_6905(Lnet/minecraft/class_1282;F)V", + "Lnet/minecraft/world/entity/decoration/ArmorStand;invisible:Z": "Lnet/minecraft/class_1531;field_7111:Z", + "Lnet/minecraft/world/entity/player/Player;getAbilities()Lnet/minecraft/world/entity/player/Abilities;": "Lnet/minecraft/class_1657;method_31549()Lnet/minecraft/class_1656;", + "Lnet/minecraft/world/entity/decoration/ArmorStand;dropAllDeathLoot(Lnet/minecraft/world/damagesource/DamageSource;)V": "Lnet/minecraft/class_1531;m_6668_(Lnet/minecraft/class_1282;)V", + "swapItem": "Lnet/minecraft/class_1531;method_6904(Lnet/minecraft/class_1657;Lnet/minecraft/class_1304;Lnet/minecraft/class_1799;Lnet/minecraft/class_1268;)Z", + "Lnet/minecraft/tags/DamageTypeTags;IS_EXPLOSION:Lnet/minecraft/tags/TagKey;": "Lnet/minecraft/class_8103;field_42249:Lnet/minecraft/class_6862;", + "brokenByAnything": "Lnet/minecraft/class_1531;method_6908(Lnet/minecraft/class_1282;)V", + "Lnet/minecraft/world/entity/decoration/ArmorStand;kill()V": "Lnet/minecraft/class_1531;kill()V", + "kill": "Lnet/minecraft/class_1531;kill()V", + "hurt": "Lnet/minecraft/class_1531;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/StandingAndWallBlockItemMixin": { + "getPlacementState": "Lnet/minecraft/class_1827;getPlacementState(Lnet/minecraft/class_1750;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralWallFanBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2299;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/HopperBlockEntityMixin": { + "pushItemsTick": "Lnet/minecraft/class_2614;method_31692(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2614;)V", + "getAttachedContainer": "Lnet/minecraft/class_2614;method_11255(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Lnet/minecraft/class_1263;", + "Lnet/minecraft/world/level/block/entity/HopperBlockEntity;tryMoveItems(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/entity/HopperBlockEntity;Ljava/util/function/BooleanSupplier;)Z": "Lnet/minecraft/class_2614;method_11243(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2614;Ljava/util/function/BooleanSupplier;)Z", + "addItem(Lnet/minecraft/world/Container;Lnet/minecraft/world/entity/item/ItemEntity;)Z": "Lnet/minecraft/class_2614;method_11247(Lnet/minecraft/class_1263;Lnet/minecraft/class_1542;)Z", + "getSourceContainer": "Lnet/minecraft/class_2614;method_11248(Lnet/minecraft/class_1937;Lnet/minecraft/class_2615;)Lnet/minecraft/class_1263;", + "tryTakeInItemFromSlot": "Lnet/minecraft/class_2614;method_11261(Lnet/minecraft/class_2615;Lnet/minecraft/class_1263;ILnet/minecraft/class_2350;)Z", + "Lnet/minecraft/world/level/block/entity/HopperBlockEntity;addItem(Lnet/minecraft/world/Container;Lnet/minecraft/world/Container;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/core/Direction;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_2614;method_11260(Lnet/minecraft/class_1263;Lnet/minecraft/class_1263;Lnet/minecraft/class_1799;Lnet/minecraft/class_2350;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/optimization/paper/PlayerListMixin_PaperWorldCreation": { + "placeNewPlayer": "Lnet/minecraft/class_3324;method_14570(Lnet/minecraft/class_2535;Lnet/minecraft/class_3222;)V", + "Lnet/minecraft/server/players/PlayerList;updateEntireScoreboard(Lnet/minecraft/server/ServerScoreboard;Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3324;method_14588(Lnet/minecraft/class_2995;Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ConcretePowderBlockMixin": { + "onLand": "Lnet/minecraft/class_2292;onLand(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2680;Lnet/minecraft/class_1540;)V", + "getStateForPlacement": "Lnet/minecraft/class_2292;getStateForPlacement(Lnet/minecraft/class_1750;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "updateShape": "Lnet/minecraft/class_2292;updateShape(Lnet/minecraft/class_2680;Lnet/minecraft/class_2350;Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;", + "Lnet/minecraft/world/level/block/ConcretePowderBlock;concrete:Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2292;field_10810:Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/optimization/general/EntityMixin_Optimize": { + "getIndirectPassengersStream": "Lnet/minecraft/class_1297;method_31484()Ljava/util/stream/Stream;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BaseFireBlockMixin": { + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;removeBlock(Lnet/minecraft/class_2338;Z)Z", + "onPlace": "Lnet/minecraft/class_4770;onPlace(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Z)V", + "entityInside": "Lnet/minecraft/class_4770;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartMixin": { + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;isVehicle()Z": "Lnet/minecraft/class_1688;m_20160_()Z", + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;setRot(FF)V": "Lnet/minecraft/class_1688;m_19915_(FF)V", + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;hasPassenger(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1688;m_20363_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Entity;startRiding(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1297;method_5804(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;handleNetherPortal()V": "Lnet/minecraft/class_1688;m_20157_()V", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1688;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "tick": "Lnet/minecraft/class_1688;tick()V", + "push": "Lnet/minecraft/class_1688;push(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/Entity;push(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_1297;method_5697(Lnet/minecraft/class_1297;)V", + "applyNaturalSlowdown": "Lnet/minecraft/class_1688;method_7525()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FungusBlockMixin": { + "performBonemeal": "Lnet/minecraft/class_4771;performBonemeal(Lnet/minecraft/class_3218;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LecternBlockMixin": { + "popBook": "Lnet/minecraft/class_3715;method_17477(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V", + "Lnet/minecraft/core/Direction;getStepX()I": "Lnet/minecraft/class_2350;method_10148()I", + "Lnet/minecraft/world/level/Level;getBlockEntity(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/entity/BlockEntity;": "Lnet/minecraft/class_1937;getBlockEntity(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2586;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/piglin/PiglinMixin": { + "addAdditionalSaveData": "Lnet/minecraft/class_4836;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "canReplaceCurrentItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4836;method_24846(Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;)Z", + "holdInOffHand": "Lnet/minecraft/class_4836;method_24845(Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/entity/monster/piglin/PiglinAi;isLovedItem(Lnet/minecraft/world/item/ItemStack;)Z": "Lnet/minecraft/class_4838;method_24735(Lnet/minecraft/class_1799;)Z", + "readAdditionalSaveData": "Lnet/minecraft/class_4836;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/SmithingTableContainerMixin": { + "Lnet/minecraft/world/inventory/ResultContainer;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1731;setItem(ILnet/minecraft/class_1799;)V", + "createResult": "Lnet/minecraft/class_4862;createResult()V" + }, + "io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin": { + "Lnet/minecraft/world/item/ItemStack;shrink(I)V": "Lnet/minecraft/class_1799;method_7934(I)V", + "hurtAndBreak": "Lnet/minecraft/class_1799;method_7956(ILnet/minecraft/class_1309;Ljava/util/function/Consumer;)V", + "isSameItemSameTags": "Lnet/minecraft/class_1799;method_31577(Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;)Z", + "hurt": "Lnet/minecraft/class_1799;method_7970(ILnet/minecraft/class_5819;Lnet/minecraft/class_3222;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DirtPathBlockMixin": { + "tick": "Lnet/minecraft/class_2369;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/storage/RegionFileCacheMixin": { + "Lnet/minecraft/world/level/chunk/storage/RegionFile;getChunkDataInputStream(Lnet/minecraft/world/level/ChunkPos;)Ljava/io/DataInputStream;": "Lnet/minecraft/class_2861;method_21873(Lnet/minecraft/class_1923;)Ljava/io/DataInputStream;", + "getRegionFile": "Lnet/minecraft/class_2867;method_12440(Lnet/minecraft/class_1923;)Lnet/minecraft/class_2861;", + "read": "Lnet/minecraft/class_2867;method_17911(Lnet/minecraft/class_1923;)Lnet/minecraft/class_2487;", + "scanChunk": "Lnet/minecraft/class_2867;method_39802(Lnet/minecraft/class_1923;Lnet/minecraft/class_6836;)V", + "write": "Lnet/minecraft/class_2867;method_23726(Lnet/minecraft/class_1923;Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/network/ServerGamePacketListenerImplMixin_Optimize": { + "handleMovePlayer": "Lnet/minecraft/class_3244;handleMovePlayer(Lnet/minecraft/class_2828;)V", + "Lnet/minecraft/server/level/ServerChunkCache;move(Lnet/minecraft/server/level/ServerPlayer;)V": "Lnet/minecraft/class_3215;method_14096(Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/CraftingMenuMixin": { + "slotChangedCraftingGrid": "Lnet/minecraft/class_1714;method_17399(Lnet/minecraft/class_1703;Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_8566;Lnet/minecraft/class_1731;)V", + "slotsChanged": "Lnet/minecraft/class_1714;slotsChanged(Lnet/minecraft/class_1263;)V", + "access": "f_39350_:Lnet/minecraft/world/inventory/ContainerLevelAccess;", + "stillValid": "Lnet/minecraft/class_1714;stillValid(Lnet/minecraft/class_1657;)Z", + "Lnet/minecraft/world/inventory/ResultContainer;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1731;setItem(ILnet/minecraft/class_1799;)V", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1714;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BrewingStandBlockEntityMixin": { + "Lnet/minecraft/world/item/ItemStack;shrink(I)V": "Lnet/minecraft/class_1799;method_7934(I)V", + "serverTick": "Lnet/minecraft/class_2589;method_31665(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2589;)V", + "Lnet/minecraft/world/level/block/entity/BrewingStandBlockEntity;ingredient:Lnet/minecraft/world/item/Item;": "Lnet/minecraft/class_2589;field_11881:Lnet/minecraft/class_1792;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DiodeBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2312;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneTorchBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2459;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/boss/enderdragon/EnderCrystalMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "tick": "Lnet/minecraft/class_1511;tick()V", + "Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;remove(Lnet/minecraft/world/entity/Entity$RemovalReason;)V": "Lnet/minecraft/class_1511;m_142687_(Lnet/minecraft/class_1297$class_5529;)V", + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;": "Lnet/minecraft/class_1937;method_8454(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Lnet/minecraft/class_5362;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "hurt": "Lnet/minecraft/class_1511;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/HarvestFarmlandMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/npc/Villager;J)V": "Lnet/minecraft/class_4217;method_19565(Lnet/minecraft/class_3218;Lnet/minecraft/class_1646;J)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/TargetGoalMixin": { + "stop": "Lnet/minecraft/class_1405;stop()V", + "Lnet/minecraft/world/entity/Mob;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1308;method_5980(Lnet/minecraft/class_1309;)V", + "canContinueToUse": "Lnet/minecraft/class_1405;canContinueToUse()Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/HuskMixin": { + "doHurtTarget": "Lnet/minecraft/class_1576;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkBlockMixin": { + "attemptUseCharge": "Lnet/minecraft/class_7125;attemptUseCharge(Lnet/minecraft/class_7128$class_7129;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;Lnet/minecraft/class_7128;Z)I", + "Lnet/minecraft/world/level/LevelAccessor;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1936;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/npc/AbstractVillagerMixin": { + "addOffersFromItemListings": "Lnet/minecraft/class_3988;method_19170(Lnet/minecraft/class_1916;[Lnet/minecraft/class_3853$class_1652;I)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/MushroomBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "growMushroom": "Lnet/minecraft/class_2420;method_10349(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_5819;)Z", + "randomTick": "Lnet/minecraft/class_2420;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/levelgen/feature/ConfiguredFeature;place(Lnet/minecraft/world/level/WorldGenLevel;Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/util/RandomSource;Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_2975;method_12862(Lnet/minecraft/class_5281;Lnet/minecraft/class_2794;Lnet/minecraft/class_5819;Lnet/minecraft/class_2338;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/vehicle/AbstractMinecartContainerMixin": { + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1693;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "(Lnet/minecraft/world/entity/EntityType;DDDLnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1693;(Lnet/minecraft/class_1299;DDDLnet/minecraft/class_1937;)V" + }, + "io/izzel/arclight/common/mixin/core/world/storage/PlayerDataMixin": { + "load": "Lnet/minecraft/class_29;method_261(Lnet/minecraft/class_1657;)Lnet/minecraft/class_2487;", + "Lnet/minecraft/nbt/NbtUtils;getDataVersion(Lnet/minecraft/nbt/CompoundTag;I)I": "Lnet/minecraft/class_2512;method_48309(Lnet/minecraft/class_2487;I)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CropBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2302;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "growCrops(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_2302;method_9826(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "entityInside": "Lnet/minecraft/class_2302;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "getGrowthSpeed": "Lnet/minecraft/class_2302;method_9830(Lnet/minecraft/class_2248;Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;)F" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ConduitBlockEntityMixin": { + "applyEffects": "Lnet/minecraft/class_2597;method_11055(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Ljava/util/List;)V", + "Lnet/minecraft/world/entity/player/Player;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1657;m_7292_(Lnet/minecraft/class_1293;)Z", + "updateDestroyTarget": "Lnet/minecraft/class_2597;method_11068(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Ljava/util/List;Lnet/minecraft/class_2597;)V", + "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/item/crafting/ServerRecipeBookMixin": { + "addRecipes": "Lnet/minecraft/class_3441;method_14903(Ljava/util/Collection;Lnet/minecraft/class_3222;)I", + "Lnet/minecraft/world/item/crafting/Recipe;isSpecial()Z": "Lnet/minecraft/class_1860;method_8118()Z", + "sendRecipes": "Lnet/minecraft/class_3441;method_14899(Lnet/minecraft/class_2713$class_2714;Lnet/minecraft/class_3222;Ljava/util/List;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin": { + "load": "Lnet/minecraft/class_2586;method_11014(Lnet/minecraft/class_2487;)V", + "saveWithoutMetadata": "Lnet/minecraft/class_2586;method_38244()Lnet/minecraft/class_2487;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2298;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NetherPortalBlockMixin": { + "randomTick": "Lnet/minecraft/class_2423;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/entity/EntityType;spawn(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/MobSpawnType;)Lnet/minecraft/world/entity/Entity;": "Lnet/minecraft/class_1299;method_47821(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_3730;)Lnet/minecraft/class_1297;", + "Lnet/minecraft/world/entity/Entity;handleInsidePortal(Lnet/minecraft/core/BlockPos;)V": "Lnet/minecraft/class_1297;method_5717(Lnet/minecraft/class_2338;)V", + "entityInside": "Lnet/minecraft/class_2423;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/RepairContainerMixin": { + "Lnet/minecraft/world/inventory/ResultContainer;setItem(ILnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1731;setItem(ILnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/inventory/AnvilMenu;broadcastChanges()V": "Lnet/minecraft/class_1706;m_38946_()V", + "createResult": "Lnet/minecraft/class_1706;createResult()V" + }, + "io/izzel/arclight/common/mixin/core/commands/CommandSourceStackMixin": { + "Lnet/minecraft/server/players/PlayerList;isOp(Lcom/mojang/authlib/GameProfile;)Z": "Lnet/minecraft/class_3324;method_14569(Lcom/mojang/authlib/GameProfile;)Z", + "hasPermission": "Lnet/minecraft/class_2168;hasPermission(I)Z", + "broadcastToAdmins": "Lnet/minecraft/class_2168;method_9212(Lnet/minecraft/class_2561;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainerMixin": { + "stillValid": "Lnet/minecraft/class_3910;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_3910;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/SpawnEggItemMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "spawnOffspringFromSpawnEgg": "Lnet/minecraft/class_1826;method_24793(Lnet/minecraft/class_1657;Lnet/minecraft/class_1308;Lnet/minecraft/class_1299;Lnet/minecraft/class_3218;Lnet/minecraft/class_243;Lnet/minecraft/class_1799;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CoralFanBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_2297;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/server/ServerFunctionManagerMixin": { + "getDispatcher": "Lnet/minecraft/class_2991;method_12900()Lcom/mojang/brigadier/CommandDispatcher;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Rabbit_RaidGardenGoalMixin": { + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "tick": "Lnet/minecraft/class_1463$class_1470;tick()V", + "net.minecraft.world.entity.animal.Rabbit$RaidGardenGoal": "net/minecraft/class_1463$class_1470" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerLevel_EntityCallbacksMixin": { + "onTrackingStart(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218$class_5526;method_31436(Lnet/minecraft/class_1297;)V", + "onTrackingEnd(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218$class_5526;method_31437(Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/WitherSkeletonMixin": { + "doHurtTarget": "Lnet/minecraft/class_1639;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/CaveSpiderMixin": { + "doHurtTarget": "Lnet/minecraft/class_1549;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunk_BoundTickingBlockEntityMixin": { + "Lnet/minecraft/world/level/block/entity/BlockEntityTicker;tick(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/entity/BlockEntity;)V": "Lnet/minecraft/class_5558;tick(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2586;)V", + "tick": "Lnet/minecraft/class_2818$class_5563;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/HurtByTargetGoalMixin": { + "alertOther": "Lnet/minecraft/class_1399;method_6319(Lnet/minecraft/class_1308;Lnet/minecraft/class_1309;)V", + "start": "Lnet/minecraft/class_1399;start()V" + }, + "io/izzel/arclight/common/mixin/optimization/general/chunkload/SleepInBedMixin_Optimize": { + "checkExtraStartConditions": "Lnet/minecraft/class_4123;checkExtraStartConditions(Lnet/minecraft/class_3218;Lnet/minecraft/class_1309;)Z", + "Lnet/minecraft/server/level/ServerLevel;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_3218;m_8055_(Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LilyPadBlockMixin": { + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_46953_(Lnet/minecraft/class_2338;ZLnet/minecraft/class_1297;)Z", + "entityInside": "Lnet/minecraft/class_2553;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/horse/TraderLlamaEntity_FollowTraderGoalMixin": { + "start": "Lnet/minecraft/class_3986$class_3987;start()V", + "net.minecraft.world.entity.animal.horse.TraderLlama$TraderLlamaDefendWanderingTraderGoal": "net/minecraft/class_3986$class_3987" + }, + "io/izzel/arclight/common/mixin/core/world/food/FoodDataMixin": { + "Lnet/minecraft/world/food/FoodData;eat(IF)V": "Lnet/minecraft/class_1702;method_7585(IF)V", + "Lnet/minecraft/world/entity/player/Player;heal(F)V": "Lnet/minecraft/class_1657;m_5634_(F)V", + "tick": "Lnet/minecraft/class_1702;method_7588(Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/goat/GoatMixin": { + "mobInteract": "Lnet/minecraft/class_6053;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/item/ItemUtils;createFilledResult(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_5328;method_30012(Lnet/minecraft/class_1799;Lnet/minecraft/class_1657;Lnet/minecraft/class_1799;)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerChunkCacheMixin": { + "Lnet/minecraft/server/level/ChunkHolder;getTicketLevel()I": "Lnet/minecraft/class_3193;method_14005()I", + "runDistanceManagerUpdates": "m_8489_()Z", + "lightEngine": "f_8331_:Lnet/minecraft/server/level/ThreadedLevelLightEngine;", + "Lnet/minecraft/world/level/storage/LevelData;getGameTime()J": "Lnet/minecraft/class_5217;method_188()J", + "getChunkFutureMainThread": "Lnet/minecraft/class_3215;method_14134(IILnet/minecraft/class_2806;Z)Ljava/util/concurrent/CompletableFuture;", + "chunkAbsent": "Lnet/minecraft/class_3215;method_18752(Lnet/minecraft/class_3193;I)Z", + "Lnet/minecraft/world/level/GameRules;getBoolean(Lnet/minecraft/world/level/GameRules$Key;)Z": "Lnet/minecraft/class_1928;method_8355(Lnet/minecraft/class_1928$class_4313;)Z", + "tickChunks": "Lnet/minecraft/class_3215;method_14161()V" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin": { + "blockUpdated": "Lnet/minecraft/class_3218;blockUpdated(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "save": "Lnet/minecraft/class_3218;method_14176(Lnet/minecraft/class_3536;ZZ)V", + "tickChunk": "Lnet/minecraft/class_3218;method_18203(Lnet/minecraft/class_2818;I)V", + "saveLevelData": "Lnet/minecraft/class_3218;method_14188()V", + "tickNonPassenger": "Lnet/minecraft/class_3218;method_18762(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/server/level/ServerLevel;setDayTime(J)V": "Lnet/minecraft/class_3218;method_29199(J)V", + "explode": "Lnet/minecraft/class_3218;explode(Lnet/minecraft/class_1297;Lnet/minecraft/class_1282;Lnet/minecraft/class_5362;DDDFZLnet/minecraft/class_1937$class_7867;)Lnet/minecraft/class_1927;", + "unload": "Lnet/minecraft/class_3218;method_18764(Lnet/minecraft/class_2818;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "sendParticles(Lnet/minecraft/core/particles/ParticleOptions;DDDIDDDD)I": "Lnet/minecraft/class_3218;method_14199(Lnet/minecraft/class_2394;DDDIDDDD)I", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/Entity;rideTick()V": "Lnet/minecraft/class_1297;method_5842()V", + "tickBlock": "Lnet/minecraft/class_3218;method_14189(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;addNewEntity(Lnet/minecraft/world/level/entity/EntityAccess;)Z": "Lnet/minecraft/class_5579;method_31818(Lnet/minecraft/class_5568;)Z", + "Lnet/minecraft/server/level/ServerLevel;sendParticles(Lnet/minecraft/server/level/ServerPlayer;ZDDDLnet/minecraft/network/protocol/Packet;)Z": "Lnet/minecraft/class_3218;method_14191(Lnet/minecraft/class_3222;ZDDDLnet/minecraft/class_2596;)Z", + "Lnet/minecraft/server/level/ServerLevel;wakeUpAllPlayers()V": "Lnet/minecraft/class_3218;method_23660()V", + "Lnet/minecraft/world/level/block/state/BlockState;tick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/util/RandomSource;)V": "Lnet/minecraft/class_2680;m_222963_(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/Explosion;interactsWithBlocks()Z": "Lnet/minecraft/class_1927;method_46667()Z", + "tick": "Lnet/minecraft/class_3218;method_18765(Ljava/util/function/BooleanSupplier;)V", + "Lnet/minecraft/world/level/block/state/BlockState;randomTick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/util/RandomSource;)V": "Lnet/minecraft/class_2680;m_222972_(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/entity/Entity;tick()V": "Lnet/minecraft/class_1297;method_5773()V", + "addEntity": "Lnet/minecraft/class_3218;method_14175(Lnet/minecraft/class_1297;)Z", + "setMapData": "Lnet/minecraft/class_3218;setMapData(Ljava/lang/String;Lnet/minecraft/class_22;)V", + "gameEvent": "Lnet/minecraft/class_3218;gameEvent(Lnet/minecraft/class_5712;Lnet/minecraft/class_243;Lnet/minecraft/class_5712$class_7397;)V", + "Lnet/minecraft/server/level/ServerLevel;updateNeighborsAt(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V": "Lnet/minecraft/class_3218;updateNeighborsAt(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V", + "tickPassenger": "Lnet/minecraft/class_3218;method_18763(Lnet/minecraft/class_1297;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/decoration/ItemFrameMixin": { + "hurt": "Lnet/minecraft/class_1533;hurt(Lnet/minecraft/class_1282;F)Z", + "Lnet/minecraft/world/entity/decoration/ItemFrame;dropItem(Lnet/minecraft/world/entity/Entity;Z)V": "Lnet/minecraft/class_1533;method_6936(Lnet/minecraft/class_1297;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DetectorRailBlockMixin": { + "checkPressed": "Lnet/minecraft/class_2313;method_10002(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RedstoneWireBlockMixin": { + "updatePowerStrength": "Lnet/minecraft/class_2457;method_10485(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/block/RedStoneWireBlock;calculateTargetStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)I": "Lnet/minecraft/class_2457;method_27842(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)I" + }, + "io/izzel/arclight/common/mixin/core/network/protocol/game/SWorldBorderPacketMixin": { + "(Lnet/minecraft/world/level/border/WorldBorder;)V": "Lnet/minecraft/class_5895;(Lnet/minecraft/class_2784;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/AbstractArrowMixin": { + "Lnet/minecraft/world/entity/projectile/AbstractArrow;onHit(Lnet/minecraft/world/phys/HitResult;)V": "Lnet/minecraft/class_1665;m_6532_(Lnet/minecraft/class_239;)V", + "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V": "Lnet/minecraft/class_1297;method_5639(I)V", + "tick": "Lnet/minecraft/class_1665;tick()V", + "setOwner": "Lnet/minecraft/class_1665;setOwner(Lnet/minecraft/class_1297;)V", + "onHitEntity": "Lnet/minecraft/class_1665;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/network/ServerLoginNetHandlerMixin": { + "handleCustomQueryPacket": "Lnet/minecraft/class_3248;handleCustomQueryPacket(Lnet/minecraft/class_2913;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/TemptGoalMixin": { + "Lnet/minecraft/world/entity/ai/goal/TemptGoal;player:Lnet/minecraft/world/entity/player/Player;": "Lnet/minecraft/class_1391;field_6617:Lnet/minecraft/class_1657;", + "canUse": "Lnet/minecraft/class_1391;canUse()Z" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainerMixin": { + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_3971;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CactusBlockMixin": { + "randomTick": "Lnet/minecraft/class_2266;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "entityInside": "Lnet/minecraft/class_2266;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/server/level/ServerEntityMixin": { + "sendDirtyEntityData": "Lnet/minecraft/class_3231;method_14306()V", + "Lnet/minecraft/server/level/ServerEntity;broadcastAndSend(Lnet/minecraft/network/protocol/Packet;)V": "Lnet/minecraft/class_3231;method_18758(Lnet/minecraft/class_2596;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainerMixin": { + "stillValid": "Lnet/minecraft/class_1718;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1718;(ILnet/minecraft/class_1661;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/CampfireBlockMixin": { + "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_1937;setBlock(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "onProjectileHit": "Lnet/minecraft/class_3922;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ShulkerMixin": { + "hitByShulkerBullet": "Lnet/minecraft/class_1606;method_31547()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/BeehiveBlockEntityMixin": { + "emptyAllLivingFromHive": "Lnet/minecraft/class_4482;method_21850(Lnet/minecraft/class_1657;Lnet/minecraft/class_2680;Lnet/minecraft/class_4482$class_4484;)V", + "saveAdditional": "Lnet/minecraft/class_4482;saveAdditional(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/entity/Entity;getType()Lnet/minecraft/world/entity/EntityType;": "Lnet/minecraft/class_1297;method_5864()Lnet/minecraft/class_1299;", + "Lnet/minecraft/world/entity/animal/Bee;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_4466;m_6710_(Lnet/minecraft/class_1309;)V", + "load": "Lnet/minecraft/class_4482;load(Lnet/minecraft/class_2487;)V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/level/Level;isNight()Z": "Lnet/minecraft/class_1937;method_23886()Z", + "releaseOccupant": "Lnet/minecraft/class_4482;method_21855(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_4482$class_4483;Ljava/util/List;Lnet/minecraft/class_4482$class_4484;Lnet/minecraft/class_2338;)Z", + "addOccupantWithPresetTicks": "Lnet/minecraft/class_4482;method_21849(Lnet/minecraft/class_1297;ZI)V", + "Lnet/minecraft/world/entity/Entity;stopRiding()V": "Lnet/minecraft/class_1297;method_5848()V", + "addOccupantWithPresetTicks(Lnet/minecraft/world/entity/Entity;ZI)V": "Lnet/minecraft/class_4482;method_21849(Lnet/minecraft/class_1297;ZI)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/RavagerMixin": { + "aiStep": "Lnet/minecraft/class_1584;aiStep()V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_46953_(Lnet/minecraft/class_2338;ZLnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/MushroomCowMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/animal/MushroomCow;discard()V": "Lnet/minecraft/class_1438;m_146870_()V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TrapDoorBlockMixin": { + "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_1937;m_276867_(Lnet/minecraft/class_2338;)Z", + "neighborChanged": "Lnet/minecraft/class_2533;neighborChanged(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;Lnet/minecraft/class_2338;Z)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/NetherWartBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2421;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ContainerOpenersCounterMixin": { + "Lnet/minecraft/world/level/block/entity/ContainerOpenersCounter;openCount:I": "Lnet/minecraft/class_5561;field_27215:I", + "incrementOpeners": "Lnet/minecraft/class_5561;method_31684(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "recheckOpeners": "Lnet/minecraft/class_5561;method_31686(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V", + "decrementOpeners": "Lnet/minecraft/class_5561;method_31685(Lnet/minecraft/class_1657;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin": { + "load": "Lnet/minecraft/class_7132;load(Lnet/minecraft/class_2487;)V", + "serverTick": "Lnet/minecraft/class_7132;method_41517(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_7132;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/FarmBlockMixin": { + "Lnet/minecraft/server/level/ServerLevel;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z": "Lnet/minecraft/class_3218;m_7731_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;I)Z", + "randomTick": "Lnet/minecraft/class_2344;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "turnToDirt": "Lnet/minecraft/class_2344;method_10125(Lnet/minecraft/class_1297;Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/AgeableMobMixin": { + "addAdditionalSaveData": "Lnet/minecraft/class_1296;addAdditionalSaveData(Lnet/minecraft/class_2487;)V", + "aiStep": "Lnet/minecraft/class_1296;aiStep()V", + "Lnet/minecraft/world/level/Level;isClientSide:Z": "Lnet/minecraft/class_1937;field_9236:Z", + "readAdditionalSaveData": "Lnet/minecraft/class_1296;readAdditionalSaveData(Lnet/minecraft/class_2487;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin$ApotheosisCompatMixin": { + "getDamageAfterMagicAbsorb": "Lnet/minecraft/class_1309;method_6036(Lnet/minecraft/class_1282;F)F", + "Lnet/minecraft/world/entity/LivingEntity;hasEffect(Lnet/minecraft/world/effect/MobEffect;)Z": "Lnet/minecraft/class_1309;method_6059(Lnet/minecraft/class_1291;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/ElderGuardianMixin": { + "customServerAiStep": "Lnet/minecraft/class_1550;customServerAiStep()V", + "Lnet/minecraft/world/effect/MobEffectUtil;addEffectToPlayersAround(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;DLnet/minecraft/world/effect/MobEffectInstance;I)Ljava/util/List;": "Lnet/minecraft/class_1292;method_42143(Lnet/minecraft/class_3218;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;DLnet/minecraft/class_1293;I)Ljava/util/List;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ThrownTridentMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "onHitEntity": "Lnet/minecraft/class_1685;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/LecternBlockEntityMixin": { + "createCommandSourceStack": "Lnet/minecraft/class_3722;method_17512(Lnet/minecraft/class_1657;)Lnet/minecraft/class_2168;" + }, + "io/izzel/arclight/common/mixin/core/world/item/ArmorStandItemMixin": { + "useOn": "Lnet/minecraft/class_1742;useOn(Lnet/minecraft/class_1838;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/entity/decoration/ArmorStand;moveTo(DDDFF)V": "Lnet/minecraft/class_1531;m_7678_(DDDFF)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkGeneratorMixin": { + "applyBiomeDecoration": "Lnet/minecraft/class_2794;method_12102(Lnet/minecraft/class_5281;Lnet/minecraft/class_2791;Lnet/minecraft/class_5138;)V", + "tryGenerateStructure": "Lnet/minecraft/class_2794;method_41044(Lnet/minecraft/class_7059$class_7060;Lnet/minecraft/class_5138;Lnet/minecraft/class_5455;Lnet/minecraft/class_7138;Lnet/minecraft/class_3485;JLnet/minecraft/class_2791;Lnet/minecraft/class_1923;Lnet/minecraft/class_4076;)Z", + "Lnet/minecraft/world/level/StructureManager;setStartForStructure(Lnet/minecraft/core/SectionPos;Lnet/minecraft/world/level/levelgen/structure/Structure;Lnet/minecraft/world/level/levelgen/structure/StructureStart;Lnet/minecraft/world/level/chunk/StructureAccess;)V": "Lnet/minecraft/class_5138;method_26976(Lnet/minecraft/class_4076;Lnet/minecraft/class_3195;Lnet/minecraft/class_3449;Lnet/minecraft/class_2810;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ScaffoldingBlockMixin": { + "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;": "Lnet/minecraft/class_2680;m_61143_(Lnet/minecraft/class_2769;)Ljava/lang/Comparable;", + "tick": "Lnet/minecraft/class_3736;tick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/raider/Raider_HoldGroundAttackGoalMixin": { + "stop": "Lnet/minecraft/class_3763$class_4223;stop()V", + "start": "Lnet/minecraft/class_3763$class_4223;start()V", + "Lnet/minecraft/world/entity/raid/Raider;setTarget(Lnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_3763;m_6710_(Lnet/minecraft/class_1309;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/EnderEyeItemMixin": { + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "use": "Lnet/minecraft/class_1777;use(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1271;" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/ContainerTypeMixin": { + "register(Ljava/lang/String;Lnet/minecraft/world/inventory/MenuType$MenuSupplier;)Lnet/minecraft/world/inventory/MenuType;": "Lnet/minecraft/class_3917;method_17435(Ljava/lang/String;Lnet/minecraft/class_3917$class_3918;)Lnet/minecraft/class_3917;" + }, + "io/izzel/arclight/common/mixin/core/world/item/enchantment/DamageEnchantmentMixin": { + "doPostAttack": "Lnet/minecraft/class_1882;doPostAttack(Lnet/minecraft/class_1309;Lnet/minecraft/class_1297;I)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;)Z": "Lnet/minecraft/class_1309;method_6092(Lnet/minecraft/class_1293;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/AllayMixin": { + "aiStep": "Lnet/minecraft/class_7298;aiStep()V", + "mobInteract": "Lnet/minecraft/class_7298;mobInteract(Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "shouldStopDancing": "Lnet/minecraft/class_7298;method_44361()Z", + "Lnet/minecraft/world/entity/animal/allay/Allay;heal(F)V": "Lnet/minecraft/class_7298;m_5634_(F)V", + "duplicateAllay": "Lnet/minecraft/class_7298;method_44363()V", + "Lnet/minecraft/world/entity/animal/allay/Allay;duplicateAllay()V": "Lnet/minecraft/class_7298;method_44363()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ShulkerBulletMixin": { + "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/core/Direction$Axis;)V": "Lnet/minecraft/class_1678;(Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;Lnet/minecraft/class_1297;Lnet/minecraft/class_2350$class_2351;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z", + "hurt": "Lnet/minecraft/class_1678;hurt(Lnet/minecraft/class_1282;F)Z", + "onHitEntity": "Lnet/minecraft/class_1678;onHitEntity(Lnet/minecraft/class_3966;)V" + }, + "io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin": { + "destroyAndAck": "Lnet/minecraft/class_3225;method_21717(Lnet/minecraft/class_2338;ILjava/lang/String;)V", + "changeGameModeForPlayer": "Lnet/minecraft/class_3225;method_30118(Lnet/minecraft/class_1934;)Z", + "destroyBlock": "Lnet/minecraft/class_3225;method_14266(Lnet/minecraft/class_2338;)Z", + "tick": "Lnet/minecraft/class_3225;method_14264()V", + "Lnet/minecraft/server/level/ServerPlayerGameMode;destroyBlock(Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_3225;method_14266(Lnet/minecraft/class_2338;)Z", + "Lnet/minecraft/server/level/ServerPlayerGameMode;setGameModeForPlayer(Lnet/minecraft/world/level/GameType;Lnet/minecraft/world/level/GameType;)V": "Lnet/minecraft/class_3225;method_14261(Lnet/minecraft/class_1934;Lnet/minecraft/class_1934;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/CreeperMixin": { + "spawnLingeringCloud": "Lnet/minecraft/class_1548;method_7001()V", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/monster/Creeper;entityData:Lnet/minecraft/network/syncher/SynchedEntityData;": "Lnet/minecraft/class_1548;f_19804_:Lnet/minecraft/class_2945;", + "thunderHit": "Lnet/minecraft/class_1548;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V" + }, + "io/izzel/arclight/common/mixin/core/world/item/TridentItemMixin": { + "releaseUsing": "Lnet/minecraft/class_1835;releaseUsing(Lnet/minecraft/class_1799;Lnet/minecraft/class_1937;Lnet/minecraft/class_1309;I)V", + "Lnet/minecraft/world/entity/player/Player;getYRot()F": "Lnet/minecraft/class_1657;m_146908_()F", + "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_7967_(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/item/ItemStack;hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Ljava/util/function/Consumer;)V": "Lnet/minecraft/class_1799;method_7956(ILnet/minecraft/class_1309;Ljava/util/function/Consumer;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BigDripleafBlockMixin": { + "entityInside": "Lnet/minecraft/class_5801;entityInside(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/world/level/block/BigDripleafBlock;setTiltAndScheduleTick(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/properties/Tilt;Lnet/minecraft/sounds/SoundEvent;)V": "Lnet/minecraft/class_5801;method_33605(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_5816;Lnet/minecraft/class_3414;)V", + "onProjectileHit": "Lnet/minecraft/class_5801;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SugarCaneBlockMixin": { + "randomTick": "Lnet/minecraft/class_2523;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/PrimedTntMixin": { + "(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/entity/LivingEntity;)V": "Lnet/minecraft/class_1541;(Lnet/minecraft/class_1937;DDDLnet/minecraft/class_1309;)V", + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1541;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/BeaconContainerMixin": { + "stillValid": "Lnet/minecraft/class_1704;stillValid(Lnet/minecraft/class_1657;)Z", + "(ILnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V": "Lnet/minecraft/class_1704;(ILnet/minecraft/class_1263;Lnet/minecraft/class_3913;Lnet/minecraft/class_3914;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/ChorusFlowerBlockMixin": { + "randomTick": "Lnet/minecraft/class_2279;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1937;m_46953_(Lnet/minecraft/class_2338;ZLnet/minecraft/class_1297;)Z", + "onProjectileHit": "Lnet/minecraft/class_2279;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootDataManagerMixin": { + "apply": "Lnet/minecraft/class_60;method_20712(Ljava/util/Map;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/GoalMixin": { + "reducedTickDelay": "Lnet/minecraft/class_1352;method_38848(I)I" + }, + "io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableMixin": { + "Lnet/minecraft/world/level/storage/loot/LootTable;getRandomItems(Lnet/minecraft/world/level/storage/loot/LootContext;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;": "Lnet/minecraft/class_52;method_319(Lnet/minecraft/class_47;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;", + "fill": "Lnet/minecraft/class_52;method_329(Lnet/minecraft/class_1263;Lnet/minecraft/class_8567;J)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/SpectralArrowMixin": { + "doPostHurtEffects": "Lnet/minecraft/class_1679;doPostHurtEffects(Lnet/minecraft/class_1309;)V", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/SculkShriekerBlockMixin": { + "stepOn": "Lnet/minecraft/class_7268;stepOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1297;)V", + "Lnet/minecraft/server/level/ServerLevel;getBlockEntity(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/BlockEntityType;)Ljava/util/Optional;": "Lnet/minecraft/class_3218;m_141902_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2591;)Ljava/util/Optional;" + }, + "io/izzel/arclight/common/mixin/core/commands/CommandsMixin": { + "fillUsableCommands": "Lnet/minecraft/class_2170;method_9239(Lcom/mojang/brigadier/tree/CommandNode;Lcom/mojang/brigadier/tree/CommandNode;Lnet/minecraft/class_2168;Ljava/util/Map;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_EatBerriesGoalMixin": { + "Lnet/minecraft/util/RandomSource;nextInt(I)I": "Lnet/minecraft/class_5819;method_43048(I)I", + "pickSweetBerries": "Lnet/minecraft/class_4019$class_4025;method_33587(Lnet/minecraft/class_2680;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/boss/enderdragon/EnderDragonMixin": { + "aiStep": "Lnet/minecraft/class_1510;aiStep()V", + "Lnet/minecraft/world/entity/boss/enderdragon/phases/DragonPhaseInstance;getFlyTargetLocation()Lnet/minecraft/world/phys/Vec3;": "Lnet/minecraft/class_1521;method_6851()Lnet/minecraft/class_243;", + "checkCrystals": "Lnet/minecraft/class_1510;method_6830()V", + "Lnet/minecraft/world/entity/boss/enderdragon/EnderDragon;setHealth(F)V": "Lnet/minecraft/class_1510;m_21153_(F)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BuddingAmethystBlockMixin": { + "randomTick": "Lnet/minecraft/class_5543;randomTick(Lnet/minecraft/class_2680;Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_5819;)V", + "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_3218;m_46597_(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/JukeboxBlockEntityMixin": { + "setRecordWithoutPlaying": "Lnet/minecraft/class_2619;method_49210(Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/level/Level;updateNeighborsAt(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V": "Lnet/minecraft/class_1937;method_8452(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;)V" + }, + "io/izzel/arclight/common/mixin/core/world/inventory/LecternContainerMixin": { + "clickMenuButton": "Lnet/minecraft/class_3916;clickMenuButton(Lnet/minecraft/class_1657;I)Z", + "stillValid": "Lnet/minecraft/class_3916;stillValid(Lnet/minecraft/class_1657;)Z", + "Lnet/minecraft/world/Container;removeItemNoUpdate(I)Lnet/minecraft/world/item/ItemStack;": "Lnet/minecraft/class_1263;method_5441(I)Lnet/minecraft/class_1799;" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/goal/NearestAttackableTargetGoalMixin": { + "start": "Lnet/minecraft/class_1400;start()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/BeeMixin": { + "doHurtTarget": "Lnet/minecraft/class_4466;doHurtTarget(Lnet/minecraft/class_1297;)Z", + "Lnet/minecraft/world/entity/LivingEntity;addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_1309;method_37222(Lnet/minecraft/class_1293;Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/entity/ShulkerBoxBlockEntityMixin": { + "Lnet/minecraft/world/level/Level;blockEvent(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;II)V": "Lnet/minecraft/class_1937;method_8427(Lnet/minecraft/class_2338;Lnet/minecraft/class_2248;II)V", + "startOpen": "Lnet/minecraft/class_2627;startOpen(Lnet/minecraft/class_1657;)V", + "stopOpen": "Lnet/minecraft/class_2627;stopOpen(Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/server/commands/SummonCommandMixin": { + "Lnet/minecraft/server/level/ServerLevel;tryAddFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;method_30736(Lnet/minecraft/class_1297;)Z", + "createEntity": "Lnet/minecraft/class_3138;method_48758(Lnet/minecraft/class_2168;Lnet/minecraft/class_6880$class_6883;Lnet/minecraft/class_243;Lnet/minecraft/class_2487;Z)Lnet/minecraft/class_1297;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DoublePlantBlockMixin": { + "playerWillDestroy": "Lnet/minecraft/class_2320;playerWillDestroy(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_1657;)V" + }, + "io/izzel/arclight/common/mixin/core/network/chat/TextColorMixin": { + "(ILjava/lang/String;)V": "Lnet/minecraft/class_5251;(ILjava/lang/String;)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/realtime/PlayerInteractionManagerMixin_Realtime": { + "Lnet/minecraft/server/level/ServerPlayerGameMode;gameTicks:I": "Lnet/minecraft/class_3225;field_14000:I", + "tick": "Lnet/minecraft/class_3225;method_14264()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/PigMixin": { + "thunderHit": "Lnet/minecraft/class_1452;thunderHit(Lnet/minecraft/class_3218;Lnet/minecraft/class_1538;)V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin": { + "runAllUpdates": "Lnet/minecraft/class_3204;method_15892(Lnet/minecraft/class_3898;)Z", + "purgeStaleTickets": "m_140776_()V", + "removePlayer": "Lnet/minecraft/class_3204;method_14051(Lnet/minecraft/class_4076;Lnet/minecraft/class_3222;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/EnderMan_EndermanTakeBlockGoalMixin": { + "net.minecraft.world.entity.monster.EnderMan$EndermanTakeBlockGoal": "net/minecraft/class_1560$class_1563", + "Lnet/minecraft/world/entity/monster/EnderMan;setCarriedBlock(Lnet/minecraft/world/level/block/state/BlockState;)V": "Lnet/minecraft/class_1560;method_7032(Lnet/minecraft/class_2680;)V", + "tick": "Lnet/minecraft/class_1560$class_1563;tick()V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/ai/village/VillageSiegeMixin": { + "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V": "Lnet/minecraft/class_3218;m_47205_(Lnet/minecraft/class_1297;)V", + "trySpawn": "Lnet/minecraft/class_1419;method_6447(Lnet/minecraft/class_3218;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin": { + "explode": "Lnet/minecraft/class_1671;method_16830()V", + "dealExplosionDamage": "Lnet/minecraft/class_1671;method_7475()V", + "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z": "Lnet/minecraft/class_1309;hurt(Lnet/minecraft/class_1282;F)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/monster/AbstractSkeletonMixin": { + "Lnet/minecraft/world/entity/monster/AbstractSkeleton;playSound(Lnet/minecraft/sounds/SoundEvent;FF)V": "Lnet/minecraft/class_1547;m_5496_(Lnet/minecraft/class_3414;FF)V", + "performRangedAttack": "Lnet/minecraft/class_1547;performRangedAttack(Lnet/minecraft/class_1309;F)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BellBlockMixin": { + "Lnet/minecraft/world/level/block/entity/BellBlockEntity;onHit(Lnet/minecraft/core/Direction;)V": "Lnet/minecraft/class_3721;method_17031(Lnet/minecraft/class_2350;)V", + "attemptToRing(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;)Z": "Lnet/minecraft/class_3709;method_17026(Lnet/minecraft/class_1297;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/entity/item/ItemEntityMixin": { + "merge(Lnet/minecraft/world/entity/item/ItemEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/item/ItemEntity;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;method_18006(Lnet/minecraft/class_1542;Lnet/minecraft/class_1799;Lnet/minecraft/class_1542;Lnet/minecraft/class_1799;)V", + "merge(Lnet/minecraft/world/entity/item/ItemEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;method_24016(Lnet/minecraft/class_1542;Lnet/minecraft/class_1799;Lnet/minecraft/class_1799;)V", + "Lnet/minecraft/world/entity/item/ItemEntity;markHurt()V": "Lnet/minecraft/class_1542;m_5834_()V", + "Lnet/minecraft/world/entity/item/ItemEntity;setItem(Lnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;method_6979(Lnet/minecraft/class_1799;)V", + "mergeWithNeighbours": "Lnet/minecraft/class_1542;method_6973()V", + "Lnet/minecraft/world/phys/AABB;inflate(DDD)Lnet/minecraft/world/phys/AABB;": "Lnet/minecraft/class_238;method_1009(DDD)Lnet/minecraft/class_238;", + "hurt": "Lnet/minecraft/class_1542;hurt(Lnet/minecraft/class_1282;F)Z", + "setItem": "Lnet/minecraft/class_1542;method_6979(Lnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/SnifferMixin": { + "dropSeed": "Lnet/minecraft/class_8153;method_49142()V", + "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z": "Lnet/minecraft/class_3218;addFreshEntity(Lnet/minecraft/class_1297;)Z" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LeverBlockMixin": { + "use": "Lnet/minecraft/class_2401;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/world/level/block/LeverBlock;pull(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;": "Lnet/minecraft/class_2401;method_21846(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2680;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PointedDripstoneBlockMixin": { + "Lnet/minecraft/world/level/block/PointedDripstoneBlock;createDripstone(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Lnet/minecraft/world/level/block/state/properties/DripstoneThickness;)V": "Lnet/minecraft/class_5689;method_36370(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;Lnet/minecraft/class_5691;)V", + "grow": "Lnet/minecraft/class_5689;method_36369(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;)V", + "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;Z)Z": "Lnet/minecraft/class_1937;m_46961_(Lnet/minecraft/class_2338;Z)Z", + "fallOn": "Lnet/minecraft/class_5689;fallOn(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;F)V", + "Lnet/minecraft/world/entity/Entity;causeFallDamage(FFLnet/minecraft/world/damagesource/DamageSource;)Z": "Lnet/minecraft/class_1297;method_5747(FFLnet/minecraft/class_1282;)Z", + "createMergedTips": "Lnet/minecraft/class_5689;method_36376(Lnet/minecraft/class_2680;Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)V", + "onProjectileHit": "Lnet/minecraft/class_5689;onProjectileHit(Lnet/minecraft/class_1937;Lnet/minecraft/class_2680;Lnet/minecraft/class_3965;Lnet/minecraft/class_1676;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/TripWireHookBlockMixin": { + "calculateState": "Lnet/minecraft/class_2537;method_10776(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;ZZILnet/minecraft/class_2680;)V", + "Lnet/minecraft/world/level/block/TripWireHookBlock;emitState(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;ZZZZ)V": "Lnet/minecraft/class_2537;method_10777(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;ZZZZ)V" + }, + "io/izzel/arclight/common/mixin/optimization/general/activationrange/ServerWorldMixin_ActivationRange": { + "tickNonPassenger": "Lnet/minecraft/class_3218;method_18762(Lnet/minecraft/class_1297;)V", + "tick": "Lnet/minecraft/class_3218;method_18765(Ljava/util/function/BooleanSupplier;)V", + "Lnet/minecraft/server/level/ServerLevel;entityTickList:Lnet/minecraft/world/level/entity/EntityTickList;": "Lnet/minecraft/class_3218;field_26934:Lnet/minecraft/class_5574;" + }, + "io/izzel/arclight/common/mixin/core/server/commands/SetSpawnCommandMixin": { + "setSpawn": "Lnet/minecraft/class_3127;method_13645(Lnet/minecraft/class_2168;Ljava/util/Collection;Lnet/minecraft/class_2338;F)I" + }, + "io/izzel/arclight/common/mixin/core/world/entity/projectile/ProjectileMixin": { + "onHitBlock": "Lnet/minecraft/class_1676;method_24920(Lnet/minecraft/class_3965;)V", + "setOwner": "Lnet/minecraft/class_1676;method_7432(Lnet/minecraft/class_1297;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/BlockMixin": { + "Lnet/minecraft/world/entity/player/Player;causeFoodExhaustion(F)V": "Lnet/minecraft/class_1657;method_7322(F)V", + "playerDestroy": "Lnet/minecraft/class_2248;method_9556(Lnet/minecraft/class_1937;Lnet/minecraft/class_1657;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2586;Lnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/LiquidBlockMixin": { + "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z": "Lnet/minecraft/class_1937;method_8501(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "shouldSpreadLiquid": "Lnet/minecraft/class_2404;method_10316(Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;)Z", + "fizz": "Lnet/minecraft/class_2404;method_10318(Lnet/minecraft/class_1936;Lnet/minecraft/class_2338;)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/PortalShapeMixin": { + "createPortalBlocks": "Lnet/minecraft/class_2424;method_10363()V", + "createPortalInfo": "Lnet/minecraft/class_2424;method_30484(Lnet/minecraft/class_3218;Lnet/minecraft/class_5459$class_5460;Lnet/minecraft/class_2350$class_2351;Lnet/minecraft/class_243;Lnet/minecraft/class_1297;Lnet/minecraft/class_243;FF)Lnet/minecraft/class_5454;", + "getDistanceUntilEdgeAboveFrame": "Lnet/minecraft/class_2424;method_30493(Lnet/minecraft/class_2338;Lnet/minecraft/class_2350;)I", + "Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate;test(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z": "Lnet/minecraft/class_4970$class_4973;test(Lnet/minecraft/class_2680;Lnet/minecraft/class_1922;Lnet/minecraft/class_2338;)Z" + }, + "io/izzel/arclight/common/mixin/optimization/general/activationrange/entity/ItemEntityMixin_ActivationRange": { + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V": "Lnet/minecraft/class_1542;(Lnet/minecraft/class_1299;Lnet/minecraft/class_1937;)V", + "(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/item/ItemStack;)V": "Lnet/minecraft/class_1542;(Lnet/minecraft/class_1937;DDDLnet/minecraft/class_1799;)V" + }, + "io/izzel/arclight/common/mixin/core/world/entity/animal/Fox_BreedGoalMixin": { + "net.minecraft.world.entity.animal.Fox$FoxBreedGoal": "net/minecraft/class_4019$class_4024" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/RespawnAnchorBlockMixin": { + "use": "Lnet/minecraft/class_4969;use(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1657;Lnet/minecraft/class_1268;Lnet/minecraft/class_3965;)Lnet/minecraft/class_1269;", + "Lnet/minecraft/server/level/ServerPlayer;setRespawnPosition(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/BlockPos;FZZ)V": "Lnet/minecraft/class_3222;method_26284(Lnet/minecraft/class_5321;Lnet/minecraft/class_2338;FZZ)V" + }, + "io/izzel/arclight/common/mixin/core/world/level/chunk/storage/ChunkLoaderMixin": { + "Lnet/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler;getLegacyStructureHandler(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/storage/DimensionDataStorage;)Lnet/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler;": "Lnet/minecraft/class_3360;method_14745(Lnet/minecraft/class_5321;Lnet/minecraft/class_26;)Lnet/minecraft/class_3360;", + "getLegacyStructureHandler": "Lnet/minecraft/class_3977;method_43411(Lnet/minecraft/class_5321;Ljava/util/function/Supplier;)Lnet/minecraft/class_3360;" + }, + "io/izzel/arclight/common/mixin/core/world/level/block/DragonEggBlockMixin": { + "Lnet/minecraft/world/level/Level;isClientSide:Z": "Lnet/minecraft/class_1937;field_9236:Z", + "teleport": "Lnet/minecraft/class_2328;method_10047(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;)V" + } + } + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 18c0bd3af..1959309db 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,16 @@ +pluginManagement { + repositories { + maven { url "https://maven.fabricmc.net/" } + maven { url "https://maven.architectury.dev/" } + maven { url "https://maven.minecraftforge.net/" } + gradlePluginPortal() + } +} + rootProject.name = 'luminara' include 'arclight-common' include 'forge-installer' include 'arclight-forge' include 'i18n-config' +include 'arclight-fabric'