This commit is contained in:
Cilly Leang 2025-03-08 15:13:29 +11:00
parent 7fc5f0b334
commit 6c61b330d1
Signed by: cilly
GPG key ID: 6500251E087653C9
11 changed files with 184 additions and 9 deletions

View file

@ -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`()
}

View file

@ -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<Double, Double>
fun `cartloader$finishSlowdown`()
}

View file

@ -1,9 +0,0 @@
package moe.lava.cartloader.accessor;
import net.minecraft.util.Pair;
import org.spongepowered.asm.mixin.Unique;
public interface ExperimentalMinecartControllerAccessor {
Pair<Double, Double> cartloader$getSpeedMultiplers();
void cartloader$finishSlowdown();
}

View file

@ -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<ChunkPos> =
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<Vec3d>) {
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)
}
}
}

View file

@ -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<Double>) {
cir.returnValue *= currentMultiplier
}
private var currentAcceleration = 0.0
fun accelerateFromPoweredRail(
velocity: Vec3d,
railPos: BlockPos,
railState: BlockState,
cir: CallbackInfoReturnable<Vec3d>
) {
if (!specialAcceleration) return
if (railState.isOf(Blocks.POWERED_RAIL) && railState.get<Boolean>(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<Vec3d>) {
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;
}

View file

@ -0,0 +1,4 @@
package moe.lava.cartloader.impl
class MixinPlayerEntityImpl {
}

View file

@ -0,0 +1,4 @@
package moe.lava.cartloader.mixin;
public class MixinEntity {
}