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