diff --git a/src/main/java/moe/lava/cartloader/accessor/AccessorAbstractMinecartEntity.kt b/src/main/java/moe/lava/cartloader/accessor/AccessorAbstractMinecartEntity.kt new file mode 100644 index 0000000..c5567a8 --- /dev/null +++ b/src/main/java/moe/lava/cartloader/accessor/AccessorAbstractMinecartEntity.kt @@ -0,0 +1,10 @@ +package moe.lava.cartloader.accessor + +import net.minecraft.entity.vehicle.MinecartController +import net.minecraft.util.math.ChunkPos +import net.minecraft.world.World + +@Suppress("FunctionName") +interface AbstractMinecartEntityAccessor { + fun `cartloader$linkedTick`() +} \ No newline at end of file diff --git a/src/main/java/moe/lava/cartloader/accessor/AccessorExperimentalMinecartController.kt b/src/main/java/moe/lava/cartloader/accessor/AccessorExperimentalMinecartController.kt new file mode 100644 index 0000000..fc6a0d5 --- /dev/null +++ b/src/main/java/moe/lava/cartloader/accessor/AccessorExperimentalMinecartController.kt @@ -0,0 +1,12 @@ +package moe.lava.cartloader.accessor + +import net.minecraft.entity.vehicle.AbstractMinecartEntity +import net.minecraft.entity.vehicle.ExperimentalMinecartController +import net.minecraft.entity.vehicle.MinecartEntity +import net.minecraft.world.World + +@Suppress("FunctionName") +interface ExperimentalMinecartControllerAccessor { + fun `cartloader$getSpeedMultiplers`(): Pair + fun `cartloader$finishSlowdown`() +} \ No newline at end of file diff --git a/src/main/java/moe/lava/cartloader/accessor/ExperimentalMinecartControllerAccessor.java b/src/main/java/moe/lava/cartloader/accessor/ExperimentalMinecartControllerAccessor.java deleted file mode 100644 index d14a925..0000000 --- a/src/main/java/moe/lava/cartloader/accessor/ExperimentalMinecartControllerAccessor.java +++ /dev/null @@ -1,9 +0,0 @@ -package moe.lava.cartloader.accessor; - -import net.minecraft.util.Pair; -import org.spongepowered.asm.mixin.Unique; - -public interface ExperimentalMinecartControllerAccessor { - Pair cartloader$getSpeedMultiplers(); - void cartloader$finishSlowdown(); -} diff --git a/src/main/java/moe/lava/cartloader/impl/MixinAbstractMinecartEntityImpl.kt b/src/main/java/moe/lava/cartloader/impl/MixinAbstractMinecartEntityImpl.kt new file mode 100644 index 0000000..0dcedea --- /dev/null +++ b/src/main/java/moe/lava/cartloader/impl/MixinAbstractMinecartEntityImpl.kt @@ -0,0 +1,58 @@ +package moe.lava.cartloader.mixin.impl + +import moe.lava.cartloader.accessor.AbstractMinecartEntityAccessor +import moe.lava.cartloader.accessor.ExperimentalMinecartControllerAccessor +import moe.lava.cartloader.mixin.MixinAbstractMinecartEntity +import net.minecraft.server.world.ChunkTicketType +import net.minecraft.server.world.ServerWorld +import net.minecraft.util.math.ChunkPos +import net.minecraft.util.math.Vec3d +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.spongepowered.asm.mixin.injection.At +import org.spongepowered.asm.mixin.injection.Inject +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable +import java.util.* + +private val TICKET: ChunkTicketType = + ChunkTicketType.create("minecart", Comparator.comparingLong { obj: ChunkPos -> obj.toLong() }, 50) + +class MixinAbstractMinecartEntityImpl(private val parent: AbstractMinecartEntityAccessor) { + private val log: Logger = LoggerFactory.getLogger("cartloader@mixin.ame") + + private var lastChunk: ChunkPos? = null + + fun onTick() { + val world = parent.world; + if (world !is ServerWorld) return + if (lastChunk == parent.chunkPos) return + lastChunk = parent.chunkPos + world.chunkManager.addTicket(TICKET, lastChunk, 3, lastChunk) + } + + fun slowdown(cir: CallbackInfoReturnable) { + val world = parent.world + val controller = parent.`cartloader$getController`() + if (world !is ServerWorld) return + if (controller !is ExperimentalMinecartControllerAccessor) { + return + } + + val (current, target) = controller.`cartloader$getSpeedMultiplers`() + if (current == target) return + + val base = controller.getMaxSpeed(world) + val mult = target / current + val newMax = base * mult + + val ret = cir.returnValue + val diff = ret.horizontalLength() - newMax + if (diff > 0) { + if (diff < 0.15) + controller.`cartloader$finishSlowdown`() + else + cir.returnValue = ret.multiply(0.95) + } + } +} \ No newline at end of file diff --git a/src/main/java/moe/lava/cartloader/impl/MixinExperimentalMinecartControllerImpl.kt b/src/main/java/moe/lava/cartloader/impl/MixinExperimentalMinecartControllerImpl.kt new file mode 100644 index 0000000..f077827 --- /dev/null +++ b/src/main/java/moe/lava/cartloader/impl/MixinExperimentalMinecartControllerImpl.kt @@ -0,0 +1,96 @@ +package moe.lava.cartloader.mixin.impl + +import jdk.jfr.Experimental +import moe.lava.cartloader.accessor.ExperimentalMinecartControllerAccessor +import moe.lava.cartloader.mixin.MixinExperimentalMinecartController +import net.minecraft.block.BlockState +import net.minecraft.block.Blocks +import net.minecraft.block.PoweredRailBlock +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Vec3d +import org.slf4j.LoggerFactory +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable + +private const val TOTAL_ACCELERATION = 0.075 +private const val ACCELERATION_DECAY = 0.5 +private const val MAX_ACCELERATION = TOTAL_ACCELERATION * (1 - ACCELERATION_DECAY) +private const val FINAL_ACCELERATION = TOTAL_ACCELERATION * + ACCELERATION_DECAY * ACCELERATION_DECAY * ACCELERATION_DECAY * ACCELERATION_DECAY * ACCELERATION_DECAY + +class MixinExperimentalMinecartControllerImpl(private val parent: ExperimentalMinecartControllerAccessor) { + private val log = LoggerFactory.getLogger("cartloader@mixin.emc") + + var currentMultiplier = 0.5 + var targetMultiplier = 0.5 + private var specialAcceleration = false + + fun checkRail(pos: BlockPos, railState: BlockState) { + val unpoweredRail = railState.isOf(Blocks.POWERED_RAIL) && !railState.get(PoweredRailBlock.POWERED) + if (!railState.isOf(Blocks.DETECTOR_RAIL) && !unpoweredRail) + return + + val under: BlockState = parent.world.getBlockState(pos.down()) + var newMultiplier = 0.0 + if (under.isOf(Blocks.IRON_BLOCK)) newMultiplier = 0.25 + else if (under.isOf(Blocks.GOLD_BLOCK)) newMultiplier = 0.5 + else if (under.isOf(Blocks.EMERALD_BLOCK)) newMultiplier = 0.75 + else if (under.isOf(Blocks.DIAMOND_BLOCK)) newMultiplier = 1.0 + + if (newMultiplier != 0.0) { + specialAcceleration = true + targetMultiplier = newMultiplier + } + + if (targetMultiplier > currentMultiplier) + currentMultiplier = targetMultiplier + } + + fun applyMaxSpeedMultiplier(cir: CallbackInfoReturnable) { + cir.returnValue *= currentMultiplier + } + + private var currentAcceleration = 0.0 + fun accelerateFromPoweredRail( + velocity: Vec3d, + railPos: BlockPos, + railState: BlockState, + cir: CallbackInfoReturnable + ) { + if (!specialAcceleration) return + + if (railState.isOf(Blocks.POWERED_RAIL) && railState.get(PoweredRailBlock.POWERED)) + currentAcceleration = MAX_ACCELERATION + + if (!railState.isOf(Blocks.POWERED_RAIL)) { + currentAcceleration *= ACCELERATION_DECAY + if (currentAcceleration <= FINAL_ACCELERATION) + currentAcceleration = 0.0 + } + + if (velocity.length() > 0.01) + cir.returnValue = velocity.normalize().multiply(velocity.length() * (1 + currentAcceleration)) + else { + val vec3d: Vec3d = this.parent.minecart.getLaunchDirection(railPos) + cir.returnValue = if (vec3d.lengthSquared() <= 0.0) + velocity + else + vec3d.multiply(velocity.length() + MAX_ACCELERATION) + } + } + + fun decelerateFromPoweredRail(velocity: Vec3d, railState: BlockState, cir: CallbackInfoReturnable) { + if (!specialAcceleration) return + + if (railState.isOf(Blocks.POWERED_RAIL) && !railState.get(PoweredRailBlock.POWERED)) { + log.info("Decel") + log.info(velocity.length().toString()) + cir.returnValue = if (velocity.length() < 0.03) Vec3d.ZERO else velocity.multiply(0.915) + } else { + cir.returnValue = velocity + } + } + + var linked = true + private set; + +} \ No newline at end of file diff --git a/src/main/java/moe/lava/cartloader/impl/MixinPlayerEntityImpl.kt b/src/main/java/moe/lava/cartloader/impl/MixinPlayerEntityImpl.kt new file mode 100644 index 0000000..bc11006 --- /dev/null +++ b/src/main/java/moe/lava/cartloader/impl/MixinPlayerEntityImpl.kt @@ -0,0 +1,4 @@ +package moe.lava.cartloader.impl + +class MixinPlayerEntityImpl { +} \ No newline at end of file diff --git a/src/main/java/moe/lava/cartloader/mixin/AbstractMinecartEntityMixin.java b/src/main/java/moe/lava/cartloader/mixin/MixinAbstractMinecartEntity.java similarity index 100% rename from src/main/java/moe/lava/cartloader/mixin/AbstractMinecartEntityMixin.java rename to src/main/java/moe/lava/cartloader/mixin/MixinAbstractMinecartEntity.java diff --git a/src/main/java/moe/lava/cartloader/mixin/DebugHudMixin.java b/src/main/java/moe/lava/cartloader/mixin/MixinDebugHud.java similarity index 100% rename from src/main/java/moe/lava/cartloader/mixin/DebugHudMixin.java rename to src/main/java/moe/lava/cartloader/mixin/MixinDebugHud.java diff --git a/src/main/java/moe/lava/cartloader/mixin/MixinEntity.java b/src/main/java/moe/lava/cartloader/mixin/MixinEntity.java new file mode 100644 index 0000000..0bddd6c --- /dev/null +++ b/src/main/java/moe/lava/cartloader/mixin/MixinEntity.java @@ -0,0 +1,4 @@ +package moe.lava.cartloader.mixin; + +public class MixinEntity { +} diff --git a/src/main/java/moe/lava/cartloader/mixin/ExperimentalMinecartControllerMixin.java b/src/main/java/moe/lava/cartloader/mixin/MixinExperimentalMinecartController.java similarity index 100% rename from src/main/java/moe/lava/cartloader/mixin/ExperimentalMinecartControllerMixin.java rename to src/main/java/moe/lava/cartloader/mixin/MixinExperimentalMinecartController.java diff --git a/src/main/java/moe/lava/cartloader/mixin/PlayerEntityMixin.java b/src/main/java/moe/lava/cartloader/mixin/MixinPlayerEntity.java similarity index 100% rename from src/main/java/moe/lava/cartloader/mixin/PlayerEntityMixin.java rename to src/main/java/moe/lava/cartloader/mixin/MixinPlayerEntity.java