From 223df78a0e5ab160cf3bca237d348793f5160aea Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Wed, 26 Jan 2022 21:22:18 +0800 Subject: [PATCH] Update to forge 39.0.59 --- README.md | 10 +- .../network/ServerPlayNetHandlerMixin.java | 12 +- .../core/world/entity/LivingEntityMixin.java | 19 ++- .../forge/FMLWorldPersistenceHookMixin.java | 83 ----------- .../mixin/forge/PermissionAPIMixin.java | 28 ++++ .../arclight/common/mod/ArclightMod.java | 3 - .../mod/server/ArclightPermissionHandler.java | 134 +++++------------- .../common/mod/server/ArclightServer.java | 2 +- .../main/resources/mixins.arclight.forge.json | 4 +- .../application/ApplicationBootstrap.java | 33 ----- build.gradle | 2 +- .../izzel/arclight/i18n/conf/CompatSpec.java | 7 + .../src/main/resources/META-INF/arclight.conf | 1 + 13 files changed, 104 insertions(+), 234 deletions(-) delete mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/FMLWorldPersistenceHookMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/PermissionAPIMixin.java diff --git a/README.md b/README.md index 88131617..58240d3b 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,13 @@ A Bukkit server implementation utilizing Mixin. ![Actions](https://img.shields.io/github/workflow/status/IzzelAliz/Arclight/Java%20CI%20with%20Gradle?style=flat-square) ![GitHub](https://img.shields.io/github/license/IzzelAliz/Arclight?style=flat-square) -| Minecraft | Forge | Status | Build | -| :----: | :----: | :---: | :---: | -| 1.18.x | 38.0.12 | ACTIVE | [![1.18 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-18?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-18) | -| 1.17.x | 37.1.0 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.17/1.0.2) | [![1.17 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-17?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-17) | +| Minecraft | Forge | Status | Build | +| :----: |:-------:| :---: | :---: | +| 1.18.x | 39.0.59 | ACTIVE | [![1.18 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-18?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-18) | +| 1.17.x | 37.1.0 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.17/1.0.2) | [![1.17 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-17?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-17) | | 1.16.x | 36.2.19 | ACTIVE | [![1.16 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-16?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-16) | | 1.15.x | 31.2.48 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.15/1.0.19) | [![1.15 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-15?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-15) | -| 1.14.x | 28.2.0 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.0.6) | [![1.14 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight) | +| 1.14.x | 28.2.0 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.0.6) | [![1.14 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight) | * Legacy version still accepts pull requests. 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 98671c2b..f2b9e64e 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 @@ -1587,14 +1587,10 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB ItemStack itemstack = packetplayinsetcreativeslot.getItem(); final CompoundTag nbttagcompound = itemstack.getTagElement("BlockEntityTag"); if (!itemstack.isEmpty() && nbttagcompound != null && nbttagcompound.contains("x") && nbttagcompound.contains("y") && nbttagcompound.contains("z")) { - final BlockPos blockposition = new BlockPos(nbttagcompound.getInt("x"), nbttagcompound.getInt("y"), nbttagcompound.getInt("z")); - final BlockEntity tileentity = this.player.level.getBlockEntity(blockposition); - if (tileentity != null) { - final CompoundTag nbttagcompound2 = tileentity.save(new CompoundTag()); - nbttagcompound2.remove("x"); - nbttagcompound2.remove("y"); - nbttagcompound2.remove("z"); - itemstack.addTagElement("BlockEntityTag", nbttagcompound2); + BlockPos blockpos = BlockEntity.getPosFromTag(nbttagcompound); + BlockEntity blockentity = this.player.level.getBlockEntity(blockpos); + if (blockentity != null) { + blockentity.saveToItem(itemstack); } } final boolean flag2 = packetplayinsetcreativeslot.getSlotNum() >= 1 && packetplayinsetcreativeslot.getSlotNum() <= 45; 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 be92be19..544ca84d 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 @@ -679,7 +679,20 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt float hardHatModifier = hardHat.apply((double) f).floatValue(); f += hardHatModifier; - Function blocking = f13 -> -((this.isDamageSourceBlocked(damagesource)) ? f13 : 0.0); + 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(); + shieldTakesDamage = shieldEvent.shieldTakesDamage(); + blocking = f13 -> -(double) blocked; + } else { + blocking = f13 -> 0d; + } + } else { + blocking = f13 -> 0d; + } float blockingModifier = blocking.apply((double) f).floatValue(); f += blockingModifier; @@ -743,7 +756,9 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt // 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 - this.hurtCurrentlyUsedShield((float) -event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING)); + if (shieldTakesDamage) { + this.hurtCurrentlyUsedShield((float) -event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING)); + } Entity entity = damagesource.getDirectEntity(); if (entity instanceof LivingEntity) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/FMLWorldPersistenceHookMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/FMLWorldPersistenceHookMixin.java deleted file mode 100644 index 9c24bcf0..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/FMLWorldPersistenceHookMixin.java +++ /dev/null @@ -1,83 +0,0 @@ -package io.izzel.arclight.common.mixin.forge; - -import com.google.common.collect.Multimap; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.storage.LevelStorageSource; -import net.minecraft.world.level.storage.WorldData; -import net.minecraftforge.common.util.MavenVersionStringHelper; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.GameData; -import net.minecraftforge.registries.RegistryManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.Marker; -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.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; - -@Mixin(targets = "net.minecraftforge.common.ForgeMod$FMLWorldPersistenceHook", remap = false) -public class FMLWorldPersistenceHookMixin { - - @Shadow @Final private static Logger LOGGER; - @Shadow @Final private static Marker WORLDPERSISTENCE; - - private final Map map = new HashMap<>(); - private boolean injected = false; - - @Redirect(method = "readData", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/registries/GameData;injectSnapshot(Ljava/util/Map;ZZ)Lcom/google/common/collect/Multimap;")) - private Multimap arclight$handleInject(Map snapshot, boolean injectFrozenData, boolean isLocalWorld, - LevelStorageSource.LevelStorageAccess levelSave, WorldData serverInfo, CompoundTag tag) { - if (!injected) { - injected = true; - return GameData.injectSnapshot(snapshot, injectFrozenData, isLocalWorld); - } else { - // TODO Properly remap registry and id - map.put(levelSave.getWorldDir(), tag.getCompound("Registries").copy()); - LOGGER.debug(WORLDPERSISTENCE, "Skipped registry injection for {}", serverInfo.getLevelName()); - return null; - } - } - - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - public CompoundTag getDataForWriting(LevelStorageSource.LevelStorageAccess levelSave, WorldData serverInfo) { - CompoundTag fmlData = new CompoundTag(); - ListTag modList = new ListTag(); - ModList.get().getMods().forEach(mi -> - { - final CompoundTag mod = new CompoundTag(); - mod.putString("ModId", mi.getModId()); - mod.putString("ModVersion", MavenVersionStringHelper.artifactVersionToString(mi.getVersion())); - modList.add(mod); - }); - fmlData.put("LoadingModList", modList); - - CompoundTag nbt = map.get(levelSave.getWorldDir()); - if (nbt != null) { - fmlData.put("Registries", nbt); - LOGGER.debug(WORLDPERSISTENCE, "Skipped ID Map collection for {}", serverInfo.getLevelName()); - } else { - CompoundTag registries = new CompoundTag(); - fmlData.put("Registries", registries); - LOGGER.debug(WORLDPERSISTENCE, "Gathering id map for writing to world save {}", serverInfo.getLevelName()); - - for (Map.Entry e : RegistryManager.ACTIVE.takeSnapshot(true).entrySet()) { - registries.put(e.getKey().toString(), e.getValue().write()); - } - LOGGER.debug(WORLDPERSISTENCE, "ID Map collection complete {}", serverInfo.getLevelName()); - } - return fmlData; - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/PermissionAPIMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/PermissionAPIMixin.java new file mode 100644 index 00000000..6261eca2 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/forge/PermissionAPIMixin.java @@ -0,0 +1,28 @@ +package io.izzel.arclight.common.mixin.forge; + +import io.izzel.arclight.common.mod.ArclightMod; +import io.izzel.arclight.common.mod.server.ArclightPermissionHandler; +import io.izzel.arclight.i18n.ArclightConfig; +import net.minecraftforge.server.permission.PermissionAPI; +import net.minecraftforge.server.permission.handler.IPermissionHandler; +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.callback.CallbackInfo; + +@Mixin(value = PermissionAPI.class, remap = false) +public class PermissionAPIMixin { + + @Shadow private static IPermissionHandler activeHandler; + + @Inject(method = "initializePermissionAPI", at = @At("RETURN")) + private static void arclight$init(CallbackInfo ci) { + if (!ArclightConfig.spec().getCompat().isForwardPermission()) { + return; + } + var handler = new ArclightPermissionHandler(activeHandler); + ArclightMod.LOGGER.info("Forwarding forge permission[{}] to bukkit", activeHandler.getIdentifier()); + activeHandler = handler; + } +} 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 ae3e2af8..30cc7ef6 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 @@ -1,13 +1,11 @@ package io.izzel.arclight.common.mod; -import io.izzel.arclight.common.mod.server.ArclightPermissionHandler; import io.izzel.arclight.common.mod.server.event.ArclightEventDispatcherRegistry; import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger; import net.minecraftforge.fml.IExtensionPoint; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.network.NetworkConstants; -import net.minecraftforge.server.permission.PermissionAPI; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -29,7 +27,6 @@ public class ArclightMod { ArclightEventDispatcherRegistry.registerAllEventDispatchers(); ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true)); - PermissionAPI.setPermissionHandler(ArclightPermissionHandler.INSTANCE); } private static class LoggingPrintStream extends PrintStream { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java index df1d870a..798865ed 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java @@ -1,112 +1,54 @@ package io.izzel.arclight.common.mod.server; -import com.mojang.authlib.GameProfile; -import io.izzel.arclight.common.bridge.core.entity.player.PlayerEntityBridge; -import net.minecraftforge.server.permission.DefaultPermissionLevel; -import net.minecraftforge.server.permission.IPermissionHandler; -import net.minecraftforge.server.permission.context.IContext; +import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.server.permission.handler.IPermissionHandler; +import net.minecraftforge.server.permission.nodes.PermissionDynamicContext; +import net.minecraftforge.server.permission.nodes.PermissionNode; +import net.minecraftforge.server.permission.nodes.PermissionTypes; import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionDefault; -import org.bukkit.util.permissions.DefaultPermissions; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; -public class ArclightPermissionHandler implements IPermissionHandler { +public final class ArclightPermissionHandler implements IPermissionHandler { - public static final ArclightPermissionHandler INSTANCE = new ArclightPermissionHandler(); + private final IPermissionHandler delegate; - private final List list = new LinkedList<>(); - private final AtomicBoolean initialized = new AtomicBoolean(false); + public ArclightPermissionHandler(IPermissionHandler delegate) { + Objects.requireNonNull(delegate, "permission handler"); + this.delegate = delegate; + } - public void initialize() { - if (!initialized.getAndSet(true)) { - for (Perm permission : this.list) { - DefaultPermissions.registerPermission(permission.toBukkit()); - } - this.list.clear(); + @Override + public ResourceLocation getIdentifier() { + return new ResourceLocation("arclight", "permission"); + } + + @Override + public Set> getRegisteredNodes() { + return delegate.getRegisteredNodes(); + } + + @SuppressWarnings("unchecked") + @Override + public T getPermission(ServerPlayer player, PermissionNode node, PermissionDynamicContext... context) { + if (node.getType() == PermissionTypes.BOOLEAN) { + return (T) (Object) ((ServerPlayerEntityBridge) player).bridge$getBukkitEntity().hasPermission(node.getNodeName()); + } else { + return delegate.getPermission(player, node, context); } } @Override - public void registerNode(@NotNull String node, @NotNull DefaultPermissionLevel level, @NotNull String desc) { - PermissionDefault bukkit; - if (level == DefaultPermissionLevel.ALL) { - bukkit = PermissionDefault.TRUE; - } else if (level == DefaultPermissionLevel.OP) { - bukkit = PermissionDefault.OP; + public T getOfflinePermission(UUID uuid, PermissionNode node, PermissionDynamicContext... context) { + var player = Bukkit.getPlayer(uuid); + if (player != null && node.getType() == PermissionTypes.BOOLEAN) { + return (T) (Object) player.hasPermission(node.getNodeName()); } else { - bukkit = PermissionDefault.FALSE; - } - if (initialized.get()) { - DefaultPermissions.registerPermission(node, desc, bukkit); - } else { - this.list.add(new Perm(node, desc, bukkit)); - } - } - - @Override - public @NotNull Collection getRegisteredNodes() { - if (initialized.get()) { - return Bukkit.getPluginManager().getPermissions().stream().map(Permission::getName).collect(Collectors.toList()); - } else { - return this.list.stream().map(it -> it.node).collect(Collectors.toList()); - } - } - - @Override - public boolean hasPermission(@NotNull GameProfile profile, @NotNull String node, @Nullable IContext context) { - if (context != null) { - net.minecraft.world.entity.player.Player player = context.getPlayer(); - if (player != null) { - return ((PlayerEntityBridge) player).bridge$getBukkitEntity().hasPermission(node); - } - } - Player player = Bukkit.getPlayer(profile.getId()); - if (player != null) { - return player.hasPermission(node); - } else { - Permission perm = Bukkit.getServer().getPluginManager().getPermission(node); - boolean isOp = ArclightServer.getMinecraftServer().getPlayerList().isOp(profile); - if (perm != null) { - return perm.getDefault().getValue(isOp); - } else { - return Permission.DEFAULT_PERMISSION.getValue(isOp); - } - } - } - - @Override - public @NotNull String getNodeDescription(@NotNull String node) { - if (!initialized.get()) { - return ""; - } else { - Permission permission = Bukkit.getPluginManager().getPermission(node); - return permission == null ? "" : permission.getDescription(); - } - } - - private static class Perm { - - private final String node; - private final String desc; - private final PermissionDefault level; - - public Perm(String node, String desc, PermissionDefault level) { - this.node = node; - this.desc = desc; - this.level = level; - } - - public Permission toBukkit() { - return new Permission(node, desc, level); + return delegate.getOfflinePermission(uuid, node, context); } } } 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 2efdd65f..40a22824 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 @@ -33,7 +33,7 @@ public class ArclightServer { server = new CraftServer(console, playerList); ((MinecraftServerBridge) console).bridge$setServer(server); ((MinecraftServerBridge) console).bridge$setConsole(ColouredConsoleSender.getInstance()); - ArclightPermissionHandler.INSTANCE.initialize(); + } catch (Throwable t) { throw new RuntimeException("Error initializing Arclight", t); } diff --git a/arclight-common/src/main/resources/mixins.arclight.forge.json b/arclight-common/src/main/resources/mixins.arclight.forge.json index 179e9a3f..f994cd80 100644 --- a/arclight-common/src/main/resources/mixins.arclight.forge.json +++ b/arclight-common/src/main/resources/mixins.arclight.forge.json @@ -10,10 +10,10 @@ }, "compatibilityLevel": "JAVA_11", "mixins": [ - "FMLWorldPersistenceHookMixin", "ForgeEventFactoryMixin", "ForgeHooksMixin", "NetworkHooksMixin", - "PacketDistributorMixin" + "PacketDistributorMixin", + "PermissionAPIMixin" ] } \ No newline at end of file diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/application/ApplicationBootstrap.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/application/ApplicationBootstrap.java index 2fe45d9e..45e19751 100644 --- a/arclight-forge/src/main/java/io/izzel/arclight/boot/application/ApplicationBootstrap.java +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/application/ApplicationBootstrap.java @@ -5,11 +5,6 @@ import io.izzel.arclight.api.Unsafe; import io.izzel.arclight.boot.AbstractBootstrap; import io.izzel.arclight.i18n.ArclightConfig; import io.izzel.arclight.i18n.ArclightLocale; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; import java.util.ServiceLoader; import java.util.function.Consumer; @@ -41,7 +36,6 @@ public class ApplicationBootstrap extends AbstractBootstrap implements Consumer< try { this.setupMod(); this.dirtyHacks(); - this.hackModlauncher(); ServiceLoader.load(getClass().getModule().getLayer(), Consumer.class).stream() .filter(it -> !it.type().getName().contains("arclight")) .findFirst().orElseThrow().get().accept(args); @@ -50,31 +44,4 @@ public class ApplicationBootstrap extends AbstractBootstrap implements Consumer< System.err.println("Fail to launch Arclight."); } } - - private void hackModlauncher() throws Exception { - try (var in = getClass().getClassLoader().getResourceAsStream("cpw/mods/modlauncher/TransformerClassWriter$SuperCollectingVisitor.class")) { - var cw = new ClassWriter(0); - var cr = new ClassReader(in); - cr.accept(new ClassVisitor(Opcodes.ASM9, cw) { - @Override - public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { - var mv = super.visitMethod(access, name, descriptor, signature, exceptions); - if (name.equals("")) { - return new MethodVisitor(Opcodes.ASM9, mv) { - @Override - public void visitLdcInsn(Object value) { - if (value.equals(Opcodes.ASM7)) { - super.visitLdcInsn(Opcodes.ASM9); - } else { - super.visitLdcInsn(value); - } - } - }; - } else return mv; - } - }, 0); - var bytes = cw.toByteArray(); - Unsafe.defineClass(cr.getClassName(), bytes, 0, bytes.length, getClass().getClassLoader(), getClass().getProtectionDomain()); - } - } } diff --git a/build.gradle b/build.gradle index b4d468f8..c37d1121 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ allprojects { ext { agpVersion = '1.22' minecraftVersion = '1.18.1' - forgeVersion = '39.0.0' + forgeVersion = '39.0.59' apiVersion = '1.2.5' toolsVersion = '1.3.+' mixinVersion = '0.8.5' diff --git a/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java b/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java index 21fd5521..65e33a6c 100644 --- a/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java +++ b/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java @@ -22,6 +22,9 @@ public class CompatSpec { @Setting("extra-logic-worlds") private List extraLogicWorlds; + @Setting("forward-permission") + private boolean forwardPermission; + public Map getMaterials() { return materials; } @@ -45,4 +48,8 @@ public class CompatSpec { public List getExtraLogicWorlds() { return extraLogicWorlds; } + + public boolean isForwardPermission() { + return forwardPermission; + } } diff --git a/i18n-config/src/main/resources/META-INF/arclight.conf b/i18n-config/src/main/resources/META-INF/arclight.conf index 80e51f38..45356e0a 100644 --- a/i18n-config/src/main/resources/META-INF/arclight.conf +++ b/i18n-config/src/main/resources/META-INF/arclight.conf @@ -17,6 +17,7 @@ compatibility { extra-logic-worlds = [ "com.example.mod.ExtraLogicWorld" ] + forward-permission = true } async-catcher { dump = true