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
Original file line number Diff line number Diff line change
@@ -1,15 +1,30 @@
package com.lx862.jcm.mixin.modded.mtr;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.lx862.mtrscripting.core.util.TimingJS;
import com.lx862.mtrscripting.mod.impl.mtr.vehicle.VehicleRenderDataCache;
import org.mtr.mapping.holder.MinecraftClient;
import org.mtr.mapping.holder.Vector3d;
import org.mtr.mod.render.MainRenderer;
import org.mtr.mod.render.RenderVehicles;
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;

@Mixin(value = MainRenderer.class, remap = false)
public class MainRendererMixin {
@WrapOperation(method = "render(Lorg/mtr/mapping/mapper/GraphicsHolder;Lorg/mtr/mapping/holder/Vector3d;)V", at = @At(value = "INVOKE", target = "Lorg/mtr/mod/render/RenderVehicles;render(JLorg/mtr/mapping/holder/Vector3d;)V"))
private static void jsblock$cacheVehicleRenderData(long millisElapsed, Vector3d cameraShakeOffset, Operation<Void> original) {
VehicleRenderDataCache.startRendering();
try {
original.call(millisElapsed, cameraShakeOffset);
} finally {
VehicleRenderDataCache.finishRendering();
}
}

@Inject(method = "getMillisElapsed", at = @At("RETURN"))
private static void incrementTimer(CallbackInfoReturnable<?> ci) {
long elapsedTime = ci.getReturnValueJ();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ protected ModelPropertiesPartMixin(PartCondition condition, RenderStage renderSt

@Inject(method = "render", at = @At("HEAD"), cancellable = true)
private void jsblock$hideDisplayParts(Identifier texture, StoredMatrixTransformations storedMatrixTransformations, VehicleExtension vehicle, int carNumber, int[] scrollingDisplayIndexTracker, int light, ObjectArrayList<ObjectDoubleImmutablePair<Box>> openDoorways, boolean fromResourcePackCreator, CallbackInfo ci) {
String vehicleId = vehicle.getVehicleCarsAndPositions().get(carNumber).left().getVehicleId();
String vehicleId = vehicle.vehicleExtraData.immutableVehicleCars.get(carNumber).getVehicleId();
if(type == PartType.DISPLAY && MTRContentResourceManager.shouldHideDisplayParts(vehicleId)) {
ci.cancel();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.lx862.mtrscripting.mod.impl.mtr.MTRContentScripting;
import com.lx862.mtrscripting.core.util.render.ScriptRenderManager;
import com.lx862.mtrscripting.core.util.sound.ScriptSoundManager;
import com.lx862.mtrscripting.mod.impl.mtr.vehicle.VehicleRenderDataCache;
import com.lx862.mtrscripting.mod.impl.mtr.vehicle.VehicleScriptInstance;
import com.lx862.mtrscripting.core.primitive.ScriptInstance;
import com.lx862.mtrscripting.core.primitive.UniqueKey;
Expand Down Expand Up @@ -50,7 +51,7 @@ public abstract class VehicleResourceMixin {

double x = 0, y = 0, z = 0;
int total = 0;
ObjectArrayList<ObjectObjectImmutablePair<Vector, Vector>> bogiePoses = vehicle.getVehicleCarsAndPositions().get(carNumber).right();
ObjectArrayList<ObjectObjectImmutablePair<Vector, Vector>> bogiePoses = VehicleRenderDataCache.getVehicleCarsAndPositions(vehicle).get(carNumber).right();
for(ObjectObjectImmutablePair<Vector, Vector> bogiePos : bogiePoses) {
x += bogiePos.left().x;
y += bogiePos.left().y;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,16 @@ public void blockEntityTick() {
World world = getWorld2();

if(repeatTick > 0 && !soundID.isEmpty() && world != null && !world.isClient() && JCMServerStats.getGameTick() % repeatTick == 0) {
boolean bl1 = world.isEmittingRedstonePower(getPos2(), Direction.NORTH);
boolean bl2 = world.isEmittingRedstonePower(getPos2(), Direction.EAST);
boolean bl3 = world.isEmittingRedstonePower(getPos2(), Direction.SOUTH);
boolean bl4 = world.isEmittingRedstonePower(getPos2(), Direction.WEST);
boolean bl5 = world.isEmittingRedstonePower(getPos2(), Direction.UP);
boolean bl6 = world.isEmittingRedstonePower(getPos2(), Direction.DOWN);
boolean emittingRedstonePower = bl1 || bl2 || bl3 || bl4 || bl5 || bl6;
if(needRedstone && !emittingRedstonePower) return;
if(needRedstone) {
boolean bl1 = world.isEmittingRedstonePower(getPos2(), Direction.NORTH);
boolean bl2 = world.isEmittingRedstonePower(getPos2(), Direction.EAST);
boolean bl3 = world.isEmittingRedstonePower(getPos2(), Direction.SOUTH);
boolean bl4 = world.isEmittingRedstonePower(getPos2(), Direction.WEST);
boolean bl5 = world.isEmittingRedstonePower(getPos2(), Direction.UP);
boolean bl6 = world.isEmittingRedstonePower(getPos2(), Direction.DOWN);
boolean emittingRedstonePower = bl1 || bl2 || bl3 || bl4 || bl5 || bl6;
if(!emittingRedstonePower) return;
}

final SoundCategory category = SOURCE_LIST[soundCategory];
Identifier identifier = null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.lx862.mtrscripting.mod.impl.mtr.vehicle;

import org.mtr.core.data.VehicleCar;
import org.mtr.core.tool.Vector;
import org.mtr.libraries.it.unimi.dsi.fastutil.objects.ObjectArrayList;
import org.mtr.libraries.it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair;
import org.mtr.mod.data.VehicleExtension;

public final class VehicleRenderDataCache {
private static final Object LOCK = new Object();
private static Thread renderingThread;
private static VehicleExtension cachedVehicle;
private static ObjectArrayList<ObjectObjectImmutablePair<VehicleCar, ObjectArrayList<ObjectObjectImmutablePair<Vector, Vector>>>> cachedVehicleCarsAndPositions;

private VehicleRenderDataCache() {
}

public static void startRendering() {
synchronized (LOCK) {
renderingThread = Thread.currentThread();
cachedVehicle = null;
cachedVehicleCarsAndPositions = null;
}
}

public static ObjectArrayList<ObjectObjectImmutablePair<VehicleCar, ObjectArrayList<ObjectObjectImmutablePair<Vector, Vector>>>> getVehicleCarsAndPositions(VehicleExtension vehicle) {
final Thread currentThread = Thread.currentThread();
synchronized (LOCK) {
if (renderingThread == currentThread) {
if (cachedVehicle == vehicle && cachedVehicleCarsAndPositions != null) {
return cachedVehicleCarsAndPositions;
}

cachedVehicleCarsAndPositions = vehicle.getVehicleCarsAndPositions();
cachedVehicle = vehicle;
return cachedVehicleCarsAndPositions;
}
}
return vehicle.getVehicleCarsAndPositions();
}

public static void finishRendering() {
synchronized (LOCK) {
if (renderingThread == Thread.currentThread()) {
renderingThread = null;
cachedVehicle = null;
cachedVehicleCarsAndPositions = null;
}
}
}
}