From 303af091a03c2ed369fdfbfc7599a9f748eae162 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 8 Mar 2025 17:09:41 -0700 Subject: [PATCH 1/2] move valkyrienskies stuff to a middle integration class to prevent early stage class loading resolve #715 --- build.gradle | 35 +++++++--------- gradle.properties | 42 ++++++++++--------- .../common/addons/APAddons.java | 4 +- .../computercraft/owner/IPeripheralOwner.java | 11 +---- .../EnvironmentDetectorPeripheral.java | 4 +- .../plugins/AutomataLookPlugin.java | 12 ++---- .../addons/valkyrienskies/ValkyrienSkies.java | 33 +++++++++++++++ .../fakeplayer/FakePlayerProviderTurtle.java | 15 ++----- .../lib/peripherals/BasePeripheral.java | 15 ++----- 9 files changed, 89 insertions(+), 82 deletions(-) diff --git a/build.gradle b/build.gradle index 647b8a371..63cae26c5 100644 --- a/build.gradle +++ b/build.gradle @@ -201,12 +201,12 @@ repositories { } } maven { - name = "Modmaven Jei" + name = "Modmaven" url = 'https://modmaven.dev/' content { - includeGroup("mezz.jei") includeGroup("appeng") includeGroup("mekanism") + includeGroup("mezz.jei") } } maven { @@ -314,7 +314,7 @@ dependencies { // Botania compileOnly fg.deobf("vazkii.botania:Botania:${botania_version}") - runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") + // runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") // Minecolonies // Change to compileOnly when running `runData` @@ -339,7 +339,7 @@ dependencies { // Create compileOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") - runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") + // runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") // DimStorage compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") @@ -376,23 +376,18 @@ dependencies { // runtimeOnly fg.deobf("curse.maven:createaddition-439890:5099757") // Valkyrien Skies 2 - implementation("org.joml:joml:1.10.4") { - transitive = false - } - implementation("org.joml:joml-primitives:1.10.0") { - transitive = false - } - // implementation fg.deobf("org.valkyrienskies:valkyrienskies-119-common:${vs2_version}") - implementation fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") { - transitive = false - } + compileOnly("org.joml:joml:1.10.4") + compileOnly("org.joml:joml-primitives:1.10.0") + // compileOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-common:${vs2_version}") + compileOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") compileOnly "org.valkyrienskies.core:api:${vs_core_version}" compileOnly "org.valkyrienskies.core:api-game:${vs_core_version}" compileOnly "org.valkyrienskies.core:util:${vs_core_version}" compileOnly "org.valkyrienskies.core:impl:${vs_core_version}" - runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") - runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") - runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") + // runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") + // runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") + // runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") + // runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") } @@ -427,12 +422,12 @@ task setupServer(type: Copy) { } ["Client", "Server"].forEach { name -> - tasks.register("test$name", JavaExec.class).configure { + tasks.register("test${name}", JavaExec.class).configure { it.group('In-game tests') it.description("Runs tests on a temporary Minecraft instance.") - it.dependsOn(setupServer, "prepareRunTest$name", "cleanTest$name", 'compileTestModJava') + it.dependsOn(setupServer, "prepareRunTest${name}", "cleanTest${name}", 'compileTestModJava') - JavaExec exec = tasks.getByName("runTest$name") + JavaExec exec = tasks.getByName("runTest${name}") exec.copyTo(it) it.setClasspath(exec.getClasspath()) it.mainClass = exec.mainClass diff --git a/gradle.properties b/gradle.properties index f4735631c..93e3534e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false +org.gradle.jvmargs=-Xmx4G org.gradle.logging.level=info # Minecraft related @@ -10,53 +10,57 @@ mod_id=advancedperipherals mod_version=0.8r minecraft_version=1.19.2 mod_artifact_suffix= + forge_version=43.4.0 loader_version=43 + release_type=release + mappings_channel=parchment mappings_version=2022.11.20-1.19.2 -jb_annotations=21.0.1 # Test dependencies -junit_version=5.7.2 hamcrest_version=2.2 +jb_annotations=21.0.1 +junit_version=5.7.2 kotlin_version=1.8.0 kotlinx_coroutines_version=1.7.3 ttoolkit_version=0.1.3 # Mod dependencies cc_version=1.101.3 -curios_version=1.19.2-5.1.4.1 -minecolonies_version=1.19.2-1.1.473-BETA -appliedenergistics_version=12.9.9 -patchouli_version=1.19.2-77 -refinedstorage_version=1.11.7 + +ae2additions_version=4646599 +ae2things_version=4367610 +appliedenergistics_version=12.9.12 +appliedmekanistics_version=4734608 botania_version=1.19.2-440-FORGE +clockwork_version=5171528 create_version=0.5.1.f-46 createca_version=5099757 +curios_version=1.19.2-5.1.4.1 +dimstorage_version=3927875 +eureka_ships_version=5321628 +kotlinforforge_version=3.12.0 mekanism_version=1.19.2-10.3.9.13 -ae2things_version=4367610 +minecolonies_version=1.19.2-1.1.473-BETA +patchouli_version=1.19.2-77 powah_version=4183078 -ae2additions_version=4646599 -kotlinforforge_version=3.12.0 -appliedmekanistics_version=4734608 -dimstorage_version=3927875 +refinedstorage_version=1.11.7 valkyrien_skies_version=4994898 -eureka_ships_version=5321628 -clockwork_version=5171528 vs2_version=2.1.2-beta.1+a04911c932 vs_core_version=1.1.0+2a62e6a823 # Mod dependencies which are needed for other mods # For minecolonies -structurize_version=1.19.2-1.0.649-BETA -multipiston_version=1.19.2-1.2.21-ALPHA blockui_version=1.19.2-0.0.102-ALPHA domumornamentum_version=1.19-1.0.141-BETA +multipiston_version=1.19.2-1.2.21-ALPHA +structurize_version=1.19.2-1.0.649-BETA # For DimStorage edivadlib_version=3927847 -# Mod dependencies for testing stuff(Only used in the dev environment) +# Mod dependencies for testing stuff (Only used in the dev environment) +jade_version=4914105 jei_version=1.19.2-forge:11.6.0.1016 -jade_version=4914105 \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java index a1241b4d6..9e209e822 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorage; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -12,7 +13,6 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import top.theillusivec4.curios.api.CuriosApi; import top.theillusivec4.curios.api.SlotResult; import top.theillusivec4.curios.api.SlotTypeMessage; @@ -95,6 +95,6 @@ public static boolean isBlockOnShip(Level level, BlockPos pos) { if (!vs2Loaded) { return false; } - return VSGameUtilsKt.isBlockInShipyard(level, pos); + return ValkyrienSkies.isBlockOnShip(level, pos); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index 4ed959fd8..fc737aa5a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -2,6 +2,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -14,9 +15,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.Collection; import java.util.HashSet; @@ -47,12 +45,7 @@ default Vec3 getDirection() { if (!APAddons.vs2Loaded) { return dir; } - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(getLevel(), getPos()); - if (ship == null) { - return dir; - } - Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); - return new Vec3(newDir.x, newDir.y, newDir.z); + return ValkyrienSkies.transformToWorldDir(getLevel(), getPos(), dir); } @Nullable Entity getHoldingEntity(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index a30fd0a5d..62db06f6a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -8,6 +8,7 @@ import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; + import de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; @@ -18,6 +19,7 @@ import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralPlugin; + import net.minecraft.resources.ResourceKey; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -35,7 +37,6 @@ import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.server.ServerLifecycleHooks; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashMap; @@ -45,6 +46,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; +import org.jetbrains.annotations.NotNull; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperation.SCAN_ENTITIES; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index 855271248..cba185c95 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -7,9 +7,11 @@ import dan200.computercraft.core.apis.TableHelper; import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; + import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; @@ -18,13 +20,11 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.NotNull; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.jetbrains.annotations.NotNull; public class AutomataLookPlugin extends AutomataCorePlugin { @@ -58,11 +58,7 @@ public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaE data.put("y", pos.y - origin.y); data.put("z", pos.z - origin.z); if (APAddons.vs2Loaded) { - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(automataCore.getLevel(), blockPos); - if (ship != null) { - data.put("shipId", ship.getId()); - data.put("shipName", ship.getSlug()); - } + ValkyrienSkies.encodeShipInfo(automataCore.getLevel(), blockPos, data); } return MethodResult.of(data); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java index 2a18aeca9..9e032a0eb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java @@ -2,6 +2,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.ServerShip; @@ -10,10 +11,42 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; public final class ValkyrienSkies { private ValkyrienSkies() {} + public static boolean isBlockOnShip(Level level, BlockPos pos) { + return VSGameUtilsKt.isBlockInShipyard(level, pos); + } + + public static Vec3 transformToWorldPos(Level level, BlockPos blockPos, Vec3 pos) { + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, blockPos); + if (ship == null) { + return pos; + } + Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); + return new Vec3(newPos.x, newPos.y, newPos.z); + } + + public static Vec3 transformToWorldDir(Level level, BlockPos blockPos, Vec3 dir) { + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, blockPos); + if (ship == null) { + return dir; + } + Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); + return new Vec3(newDir.x, newDir.y, newDir.z); + } + + public static void encodeShipInfo(Level level, BlockPos blockPos, Map data) { + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, blockPos); + if (ship == null) { + return; + } + data.put("shipId", ship.getId()); + data.put("shipName", ship.getSlug()); + } + public static List getNearbyShips(ServerLevel level, Vec3 pos, double radius) { Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, new BlockPos(pos)); if (ship != null) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 2fd019fc6..aa9b0b86e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -4,6 +4,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.shared.util.WorldUtil; import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -15,10 +16,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; -import org.joml.Matrix4dc; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.WeakHashMap; @@ -46,14 +43,8 @@ public static void load(APFakePlayer player, ITurtleAccess turtle) { Vec3 direction = Vec3.atLowerCornerOf(turtle.getDirection().getNormal()); Vec3 position = Vec3.atCenterOf(pos); if (APAddons.vs2Loaded) { - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, pos); - if (ship != null) { - Matrix4dc matrix = ship.getShipToWorld(); - Vector3d newPos = matrix.transformPosition(new Vector3d(position.x, position.y, position.z)); - Vector3d newDir = matrix.transformDirection(new Vector3d(direction.x, direction.y, direction.z)); - position = new Vec3(newPos.x, newPos.y, newPos.z); - direction = new Vec3(newDir.x, newDir.y, newDir.z); - } + position = ValkyrienSkies.transformToWorldPos(level, pos, position); + direction = ValkyrienSkies.transformToWorldDir(level, pos, direction); } player.setPosRaw(position.x, position.y, position.z); player.lookAt(EntityAnchorArgument.Anchor.FEET, position.add(direction)); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index f7261df7b..78ded5854 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -12,16 +12,12 @@ import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.OperationAbility; import de.srendi.advancedperipherals.common.addons.computercraft.owner.PeripheralOwnerAbility; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import de.srendi.advancedperipherals.common.util.CoordUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.ArrayList; import java.util.Collections; @@ -34,6 +30,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.Consumer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public abstract class BasePeripheral implements IBasePeripheral, IDynamicPeripheral { @@ -162,12 +160,7 @@ public Vec3 getPhysicsPos() { if (!APAddons.vs2Loaded) { return pos; } - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(owner.getLevel(), owner.getPos()); - if (ship == null) { - return pos; - } - Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); - return new Vec3(newPos.x, newPos.y, newPos.z); + return ValkyrienSkies.transformToWorldPos(owner.getLevel(), owner.getPos(), pos); } public final BlockPos getPhysicsBlockPos() { From 222b703e8f4cc49b9d425431970805a992139f64 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 8 Mar 2025 17:11:59 -0700 Subject: [PATCH 2/2] re-enable testing environement mods --- build.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 63cae26c5..93366c8b5 100644 --- a/build.gradle +++ b/build.gradle @@ -314,7 +314,7 @@ dependencies { // Botania compileOnly fg.deobf("vazkii.botania:Botania:${botania_version}") - // runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") + runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") // Minecolonies // Change to compileOnly when running `runData` @@ -339,7 +339,7 @@ dependencies { // Create compileOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") - // runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") + runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") // DimStorage compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") @@ -384,10 +384,10 @@ dependencies { compileOnly "org.valkyrienskies.core:api-game:${vs_core_version}" compileOnly "org.valkyrienskies.core:util:${vs_core_version}" compileOnly "org.valkyrienskies.core:impl:${vs_core_version}" - // runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") - // runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") - // runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") - // runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") + runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") + runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") + runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") + runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") }