Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, BlockPos> TRIGGERS = triggers();
private static final Map<String, BlockPos> RESOLVED = new HashMap<>();
private static final Map<String, Object> IC_OBJECTS = new HashMap<>();
private static final Set<String> 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"));

Expand Down Expand Up @@ -57,18 +59,48 @@ private static Map<String, BlockPos> 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);
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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=Деревянные сеточные ворота
Expand Down
4 changes: 2 additions & 2 deletions version.properties
Original file line number Diff line number Diff line change
@@ -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