c2
This commit is contained in:
parent
7fc5f0b334
commit
6c61b330d1
11 changed files with 184 additions and 9 deletions
|
|
@ -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`()
|
||||||
|
}
|
||||||
|
|
@ -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`()
|
||||||
|
}
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
package moe.lava.cartloader.impl
|
||||||
|
|
||||||
|
class MixinPlayerEntityImpl {
|
||||||
|
}
|
||||||
4
src/main/java/moe/lava/cartloader/mixin/MixinEntity.java
Normal file
4
src/main/java/moe/lava/cartloader/mixin/MixinEntity.java
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
package moe.lava.cartloader.mixin;
|
||||||
|
|
||||||
|
public class MixinEntity {
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue