diff --git a/build.gradle b/build.gradle index 409844a..efe0f62 100644 --- a/build.gradle +++ b/build.gradle @@ -74,6 +74,13 @@ repositories { mavenCentral() } +configurations { + clientRuntime { + canBeConsumed = false + canBeResolved = true + } +} + def icJar = null def icDir = file('../ImmersiveConvergence-Legacy/build/libs') def icJars = icDir.exists() ? fileTree(icDir) { @@ -113,10 +120,13 @@ dependencies { implementation files(itJar) } runtimeOnly('zone.rong:mixinbooter:10.7') { transitive = false } + + clientRuntime rfg.deobf("curse.maven:${common.bf3r_version}") } tasks.named('runClient').configure { extraArgs.addAll('--width', '1920', '--height', '1080') + classpath configurations.clientRuntime } tasks.named('runServer').configure { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5dc98db..c56b367 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/tech/muddykat/engineered_schematics/util/ESMultiblocks.java b/src/main/java/tech/muddykat/engineered_schematics/util/ESMultiblocks.java index e34c8a2..2b08c0f 100644 --- a/src/main/java/tech/muddykat/engineered_schematics/util/ESMultiblocks.java +++ b/src/main/java/tech/muddykat/engineered_schematics/util/ESMultiblocks.java @@ -18,10 +18,12 @@ public class ESMultiblocks { private static final String METHOD_TRIGGER = "primaryTrigger"; private static final String IC_REGISTRY = "com.immersiveconvergence.common.multiblock.IEMultiblockRegistry"; + private static final String IC_API_REGISTRY = "com.immersiveconvergence.api.multiblock.MultiblockRegistry"; private static final String IC_TEMPLATE = "com.immersiveconvergence.api.multiblock.TemplateMultiblock"; private static final BlockPos NO_TRIGGER = new BlockPos(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE); private static final Map TRIGGERS = triggers(); private static final Map RESOLVED = new HashMap<>(); + private static final Map IC_OBJECTS = new HashMap<>(); private static final Set REVERSED_LENGTH = new HashSet<>(Arrays.asList("IE:Crusher", "IE:Squeezer", "IE:Fermenter", "IE:Mixer", "IE:Refinery", "IE:DieselGenerator", "IE:ArcFurnace", "IE:Excavator", "IE:AutoWorkbench", "IE:BottlingMachine", "IP:Pumpjack")); @@ -57,18 +59,48 @@ private static Map triggers() { public static boolean hasReversedLength(MultiblockHandler.IMultiblock multiblock) { return REVERSED_LENGTH.contains(multiblock.getUniqueName()) || isTemplateMultiblock(multiblock); } private static boolean isTemplateMultiblock(MultiblockHandler.IMultiblock multiblock) { + if (walksToTemplate(multiblock)) { return true; } + return walksToTemplate(fromConvergenceApi(multiblock.getUniqueName())); + } + + private static boolean walksToTemplate(@Nullable Object multiblock) { + if (multiblock == null) { return false; } for (Class type = multiblock.getClass(); type != null; type = type.getSuperclass()) { if (IC_TEMPLATE.equals(type.getName())) { return true; } } return false; } + @Nullable + private static Object fromConvergenceApi(String uniqueName) { + Object cached = IC_OBJECTS.get(uniqueName); + if (cached != null) { return cached == IC_OBJECTS ? null : cached; } + Object found = findInConvergenceApi(uniqueName); + IC_OBJECTS.put(uniqueName, found == null ? IC_OBJECTS : found); + return found; + } + + @Nullable + private static Object findInConvergenceApi(String uniqueName) { + try { + Object list = Class.forName(IC_API_REGISTRY).getMethod("getMultiblocks").invoke(null); + if (!(list instanceof Iterable)) { return null; } + for (Object candidate : (Iterable)list) { + Object name = candidate.getClass().getMethod("getUniqueName").invoke(candidate); + if (uniqueName.equals(name)) { return candidate; } + } + return null; + } + catch (ReflectiveOperationException | LinkageError exception) { return null; } + } + @Nullable public static BlockPos getTriggerOffset(MultiblockHandler.IMultiblock multiblock) { String uniqueName = multiblock.getUniqueName(); BlockPos resolved = RESOLVED.get(uniqueName); if (resolved == null) { resolved = toCanonical(multiblock, fromConvergence(uniqueName)); + if (resolved == null) { resolved = toCanonical(multiblock, readTriggerField(fromConvergenceApi(uniqueName))); } if (resolved == null) { resolved = TRIGGERS.get(uniqueName); } if (resolved == null) { resolved = toCanonical(multiblock, readTriggerField(multiblock)); } RESOLVED.put(uniqueName, resolved == null ? NO_TRIGGER : resolved); @@ -95,7 +127,8 @@ private static BlockPos fromConvergence(String uniqueName) { } @Nullable - private static BlockPos readTriggerField(MultiblockHandler.IMultiblock multiblock) { + private static BlockPos readTriggerField(@Nullable Object multiblock) { + if (multiblock == null) { return null; } try { Object value = multiblock.getClass().getMethod(METHOD_TRIGGER).invoke(multiblock); return value instanceof BlockPos ? (BlockPos)value : null; diff --git a/src/main/resources/assets/engineered_schematics/lang/ru_ru.lang b/src/main/resources/assets/engineered_schematics/lang/ru_ru.lang index 11e1d7c..36d3bda 100644 --- a/src/main/resources/assets/engineered_schematics/lang/ru_ru.lang +++ b/src/main/resources/assets/engineered_schematics/lang/ru_ru.lang @@ -70,9 +70,9 @@ desc.engineered_schematics.multiblock.II:Radar=Радар desc.engineered_schematics.multiblock.II:Emplacement=Огневая точка desc.engineered_schematics.multiblock.II:ChemicalPainter=Химический маляр desc.engineered_schematics.multiblock.II:Vulcanizer=Вулканизатор -desc.engineered_schematics.multiblock.II:SkycratePost=Фуникулёрный пост -desc.engineered_schematics.multiblock.II:SkycrateStation=Фуникулёрная станция -desc.engineered_schematics.multiblock.II:SkycartStation=Фуникулёрная пассажирская станция +desc.engineered_schematics.multiblock.II:SkycratePost=Фуникулёрный столб +desc.engineered_schematics.multiblock.II:SkycrateStation=Станция фуникулёра +desc.engineered_schematics.multiblock.II:SkycartStation=Станция пассажирского фуникулёра desc.engineered_schematics.multiblock.II:Sawmill=Лесопилка desc.engineered_schematics.multiblock.II:WoodenFenceGate=Деревянные ворота desc.engineered_schematics.multiblock.II:WoodenChainFenceGate=Деревянные сеточные ворота diff --git a/version.properties b/version.properties index b4b7dd5..cdddcd7 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ -#Wed Sep 02 01:37:58 MDT 2026 -build_number=7 +#Sat Sep 12 13:04:31 MDT 2026 +build_number=9 stage=release version=1.0