riding extractors, more abstractions

This commit is contained in:
Bixilon 2023-01-12 11:53:00 +01:00
parent 57438e7abc
commit 6c3b9c1727
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
22 changed files with 711 additions and 55 deletions

View File

@ -88,10 +88,21 @@ This [pixlyzer](https://gitlab.bixilon.de/bixilon/pixlyzer) module runs physics
- end of world (everything >= 30M)
- abilities (flying, walk speed, fly speed)
- tags
- tags
## Additional entity physics
- rideable entities
## Ridable entities
(only client controlled)
- strider (with warped fungus on a stick)
- pig (with carrot on a stick)
- all horses (with controls and jumping)
- boat
## Client calculated
- items
- projectiles
- firework rockets
@ -110,5 +121,5 @@ New tests can/will always be added, existing tests may only be changed if they b
Parkour code (attach debugger in `ClientPlayerEntity`, where `getTutorialManager` is called):
```java
"f=" + input.pressingForward + ",b=" + input.pressingBack + ",l=" + input.pressingLeft + ",r=" + input.pressingRight + ",j=" + input.jumping + ",sn=" + input.sneaking + ",sp=" + client.options.sprintKey.isPressed() + " --> " + getX() + "|" + getY() + "|" + getZ() + " " + yaw + "|" + pitch
"f="+input.pressingForward+",b="+input.pressingBack+",l="+input.pressingLeft+",r="+input.pressingRight+",j="+input.jumping+",sn="+input.sneaking+",sp="+client.options.sprintKey.isPressed()+" --> "+getX()+"|"+getY()+"|"+getZ()+" "+yaw+"|"+pitch
```

View File

@ -14,7 +14,9 @@ import de.bixilon.pixlyzer.physics.tests.fluid.still.LavaStillExtractor
import de.bixilon.pixlyzer.physics.tests.fluid.still.MixedFluidExtractor
import de.bixilon.pixlyzer.physics.tests.fluid.still.WaterStillExtractor
import de.bixilon.pixlyzer.physics.tests.health.DamageExtractor
import de.bixilon.pixlyzer.physics.tests.input.SneakExtractor
import de.bixilon.pixlyzer.physics.tests.precision.VelocityFlatteningExtractor
import de.bixilon.pixlyzer.physics.tests.riding.*
import de.bixilon.pixlyzer.physics.tests.server.AbilitiesExtractor
import java.lang.reflect.Method
import kotlin.system.exitProcess
@ -73,7 +75,14 @@ object PhysicsExtractor {
// VelocityFlatteningExtractor::class.java,
// IceWalk::class.java,
// AbilitiesExtractor::class.java,
ElytraExtractor::class.java,
// ElytraExtractor::class.java,
PigRidingExtractor::class.java,
StriderExtractor::class.java,
HorseExtractor::class.java,
BoatExtractor::class.java,
MinecartExtractor::class.java,
SpiderExtractor::class.java,
)

View File

@ -19,7 +19,6 @@ import net.minecraft.client.input.Input
import net.minecraft.client.network.*
import net.minecraft.client.option.GameOptions
import net.minecraft.client.recipebook.ClientRecipeBook
import net.minecraft.client.sound.SoundManager
import net.minecraft.client.tutorial.TutorialManager
import net.minecraft.client.world.ClientChunkManager
import net.minecraft.client.world.ClientEntityManager
@ -186,7 +185,7 @@ object PhysicsUtil {
fun createPlayer(world: MinecraftWorld): MinecraftPlayer {
val client = createMinecraftClient()
val networkHandler = createNetworkHandler(client)
val native = ClientPlayerEntityImpl(client, world.level, networkHandler, StatHandler(), ClientRecipeBook())
val native = ClientPlayerEntityImpl(client, world.native, networkHandler, StatHandler(), ClientRecipeBook())
client.player = native
PLAYER_ENTRY?.set(native, createPlayerListEntry())

View File

@ -0,0 +1,26 @@
package de.bixilon.pixlyzer.physics.abstractions
import net.minecraft.entity.Entity
import net.minecraft.util.math.Vec3d
open class MinecraftEntity<T : Entity>(val native: T) {
fun tick(count: Int = 1) {
for (i in 0 until count) {
native.tick()
}
}
fun teleport(x: Double, y: Double, z: Double) {
native.setPosition(Vec3d(x, y, z))
}
fun setVelocity(x: Double, y: Double, z: Double) {
native.velocity = Vec3d(x, y, z)
}
fun rotate(yaw: Float, pitch: Float) {
native.setRotation(yaw, pitch)
}
}

View File

@ -13,35 +13,16 @@ import net.minecraft.item.ItemStack
import net.minecraft.item.Items
import net.minecraft.network.Packet
import net.minecraft.network.listener.ClientPlayPacketListener
import net.minecraft.util.math.Vec3d
class MinecraftPlayer(
val native: ClientPlayerEntity,
native: ClientPlayerEntity,
private val sprint: DummyBinding,
) {
) : MinecraftEntity<ClientPlayerEntity>(native) {
fun handlePacket(packet: Packet<ClientPlayPacketListener>) {
packet.apply(native.networkHandler)
}
fun tick(count: Int = 1) {
for (i in 0 until count) {
native.tick()
}
}
fun teleport(x: Double, y: Double, z: Double) {
native.setPosition(Vec3d(x, y, z))
}
fun setVelocity(x: Double, y: Double, z: Double) {
native.velocity = Vec3d(x, y, z)
}
fun rotate(yaw: Float, pitch: Float) {
native.setRotation(yaw, pitch)
}
var flying: Boolean
get() = native.abilities.flying
set(value) {
@ -158,4 +139,10 @@ class MinecraftPlayer(
boots.addEnchantment(Enchantments.SWIFT_SNEAK, level)
native.equipStack(EquipmentSlot.LEGS, boots)
}
fun startRiding(vehicle: MinecraftVehicle<*>) {
if (!native.startRiding(vehicle.native)) {
throw IllegalStateException("Failed to start riding!")
}
}
}

View File

@ -0,0 +1,6 @@
package de.bixilon.pixlyzer.physics.abstractions
import net.minecraft.entity.Entity
class MinecraftVehicle<T : Entity>(native: T) : MinecraftEntity<T>(native) {
}

View File

@ -8,11 +8,11 @@ import net.minecraft.util.math.random.Random
import net.minecraft.world.dimension.DimensionType
class MinecraftWorld(
val level: ClientWorld,
val native: ClientWorld,
) {
operator fun set(x: Int, y: Int, z: Int, value: BlockState?) {
try {
level.setBlockState(BlockPos(x, y, z), value)
native.setBlockState(BlockPos(x, y, z), value)
} catch (error: Throwable) {
val cause = error.cause ?: error
if (cause is NullPointerException && cause.message!!.contains("worldRenderer")) {
@ -33,7 +33,7 @@ class MinecraftWorld(
}
fun initRandom() {
level.random = Random.create(0L) // particles
native.random = Random.create(0L) // particles
}
var ultrawarm: Boolean = false
@ -42,6 +42,6 @@ class MinecraftWorld(
val type = DimensionType::class.java
val field = type.getDeclaredField("ultrawarm")
field.isAccessible = true
field.setBoolean(level.getDimension(), value)
field.setBoolean(native.getDimension(), value)
}
}

View File

@ -5,6 +5,7 @@ import net.minecraft.client.world.ClientWorld
import net.minecraft.entity.Entity
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.nbt.NbtCompound
import net.minecraft.network.Packet
import net.minecraft.particle.ParticleEffect
import net.minecraft.sound.SoundCategory
import net.minecraft.sound.SoundEvent
@ -36,4 +37,6 @@ class ClientWorldImpl private constructor() : ClientWorld(null, null, null, null
override fun shouldUpdatePostDeath(entity: Entity?) = true
override fun sendPacket(packet: Packet<*>?) = Unit
}

View File

@ -113,7 +113,7 @@ class GravityExtractor : AbstractExtractor() {
@ExtractorMethod("rotated_falling_5")
fun rotatedFalling5() {
player.teleport(45.0, 178.0, 13.0)
player.rotate(23.0, 86.0)
player.rotate(23.0f, 86.0f)
player.setKeys(forwards = true)
player.tick(5)
storeMovement()
@ -122,7 +122,7 @@ class GravityExtractor : AbstractExtractor() {
@ExtractorMethod("rotated_falling_12")
fun rotatedFalling12() {
player.teleport(45.0, 178.0, 13.0)
player.rotate(123.0, 23.0)
player.rotate(123.0f, 23.0f)
player.setKeys(backwards = true, left = true)
player.tick(12)
storeMovement()

View File

@ -24,7 +24,7 @@ class SpectatorExtractor : AbstractExtractor() {
fun spectatorTest3() {
player.teleport(12.0, 5.0, 12.0)
player.setKeys(forwards = true, left = true)
player.rotate(12.0, 60.0)
player.rotate(12.0f, 60.0f)
player.tick(10)
storePosition()
storeVelocity()
@ -34,7 +34,7 @@ class SpectatorExtractor : AbstractExtractor() {
fun spectatorTest4() {
player.teleport(12.0, 5.0, -19.0)
player.setKeys(forwards = true, right = true)
player.rotate(12.0, 60.0)
player.rotate(12.0f, 60.0f)
player.tick(100)
storePosition()
storeVelocity()
@ -45,7 +45,7 @@ class SpectatorExtractor : AbstractExtractor() {
player.teleport(12.0, 5.0, -19.0)
player.setKeys(forwards = true, right = true)
player.flying = true
player.rotate(12.0, 60.0)
player.rotate(12.0f, 60.0f)
player.tick(100)
storePosition()
storeVelocity()

View File

@ -56,7 +56,7 @@ abstract class AbstractWalkExtractor(private val state: BlockState) : AbstractEx
protected fun walking6() {
player.teleport(-6.0, 1.0, -6.0)
player.setKeys(forwards = true)
player.rotate(180.0, 0.0)
player.rotate(180.0f, 0.0f)
player.tick(10)
storeMovement()
}
@ -64,7 +64,7 @@ abstract class AbstractWalkExtractor(private val state: BlockState) : AbstractEx
protected fun walking7() {
player.teleport(-6.0, 1.0, -6.0)
player.setKeys(forwards = true)
player.rotate(180.0, 0.0)
player.rotate(180.0f, 0.0f)
player.tick(50)
storeMovement()
}
@ -72,13 +72,13 @@ abstract class AbstractWalkExtractor(private val state: BlockState) : AbstractEx
protected fun walking8() {
player.teleport(-6.0, 1.0, -6.0)
player.setKeys(forwards = true)
player.rotate(180.0, 0.0)
player.rotate(180.0f, 0.0f)
player.tick(10)
player.rotate(90.0, 0.0)
player.rotate(90.0f, 0.0f)
player.tick(10)
player.rotate(0.0, 0.0)
player.rotate(0.0f, 0.0f)
player.tick(10)
player.rotate(270.0, 0.0)
player.rotate(270.0f, 0.0f)
player.tick(10)
storeMovement()
}
@ -89,7 +89,7 @@ abstract class AbstractWalkExtractor(private val state: BlockState) : AbstractEx
for (x in 0..100) {
player.tick()
player.rotate(kotlin.math.sin(x / Math.PI / 100.0) * 400.0, 0.0)
player.rotate(kotlin.math.sin(x / Math.PI.toFloat() / 100.0f) * 400.0f, 0.0f)
}
storeMovement()
}
@ -122,7 +122,7 @@ abstract class AbstractWalkExtractor(private val state: BlockState) : AbstractEx
world.fill(-18, 3, 2, -10, 3, 10, Blocks.STONE.defaultState)
world.fill(-16, 3, 4, -12, 3, 8, this.state)
player.teleport(-15.653410032035934, 4.0, 8.580128352737571)
player.rotate(180.29749, 22.493956)
player.rotate(180.29749f, 22.493956f)
player.tick(5)
player.setKeys(sprint = true)
player.tick(1)
@ -135,7 +135,7 @@ abstract class AbstractWalkExtractor(private val state: BlockState) : AbstractEx
world.fill(-18, 3, 2, -10, 3, 10, Blocks.STONE.defaultState)
world.fill(-16, 3, 4, -12, 3, 8, this.state)
player.teleport(-15.653410032035934, 4.0, 8.580128352737571)
player.rotate(180.29749, 22.493956)
player.rotate(180.29749f, 22.493956f)
player.tick(5)
player.setKeys(sprint = true)
player.tick(1)

View File

@ -19,7 +19,7 @@ class RotatingExtractor : AbstractExtractor() {
player.setKeys(forwards = true)
for (x in 0..100) {
player.tick()
player.rotate(kotlin.math.sin(x / PI / 100.0) * 400.0, 0.0)
player.rotate(kotlin.math.sin(x / PI.toFloat() / 100.0f) * 400.0f, 0.0f)
}
storePosition()
storeVelocity()

View File

@ -128,7 +128,7 @@ class LevitationExtractor : AbstractExtractor() {
player.teleport(12.0, 9.0, 4.0)
player.applyLevitation(3)
player.setKeys(true, left = true)
player.rotate(140.0, 29.0)
player.rotate(140.0f, 29.0f)
player.tick(21)
storeMovement()
storeVelocity()
@ -139,7 +139,7 @@ class LevitationExtractor : AbstractExtractor() {
player.teleport(12.0, 9.0, 4.0)
player.applyLevitation(3)
player.setKeys(backwards = true, left = true)
player.rotate(76.0, 29.0)
player.rotate(76.0f, 29.0f)
player.tick(21)
storeMovement()
storeVelocity()
@ -150,7 +150,7 @@ class LevitationExtractor : AbstractExtractor() {
player.teleport(7.0, 9.0, 4.0)
player.applyLevitation(3)
player.setKeys(backwards = true, right = true)
player.rotate(1.0, 38.0)
player.rotate(1.0f, 38.0f)
player.tick(19)
storeMovement()
storeVelocity()

View File

@ -69,7 +69,7 @@ class SlowFallingExtractor : AbstractExtractor() {
player.teleport(12.0, 9.0, 4.0)
player.applySlowFalling()
player.setKeys(true, left = true)
player.rotate(112.0, 2.0)
player.rotate(112.0f, 2.0f)
player.tick(21)
storeMovement()
storeVelocity()
@ -80,7 +80,7 @@ class SlowFallingExtractor : AbstractExtractor() {
player.teleport(12.0, 9.0, 4.0)
player.applySlowFalling()
player.setKeys(backwards = true, left = true)
player.rotate(87.0, 29.0)
player.rotate(87.0f, 29.0f)
player.tick(21)
storeMovement()
storeVelocity()
@ -91,7 +91,7 @@ class SlowFallingExtractor : AbstractExtractor() {
player.teleport(7.0, 9.0, 4.0)
player.applySlowFalling()
player.setKeys(backwards = true, right = true)
player.rotate(1.0, 1.0)
player.rotate(1.0f, 1.0f)
player.tick(19)
storeMovement()
storeVelocity()

View File

@ -97,7 +97,7 @@ class SpeedExtractor : AbstractExtractor() {
player.teleport(-10.0, 1.0, -11.0)
player.applySpeed(1)
player.setKeys(forwards = true)
player.rotate(79.0, 4.0)
player.rotate(79.0f, 4.0f)
player.tick(50)
storeMovement()
storeVelocity()
@ -108,7 +108,7 @@ class SpeedExtractor : AbstractExtractor() {
player.teleport(-10.0, 1.0, -11.0)
player.applySpeed(1)
player.setKeys(forwards = true, jump = true)
player.rotate(12.0, 4.0)
player.rotate(12.0f, 4.0f)
player.tick(50)
storeMovement()
storeVelocity()
@ -119,7 +119,7 @@ class SpeedExtractor : AbstractExtractor() {
player.teleport(-10.0, 1.0, -11.0)
player.applySpeed(3)
player.setKeys(forwards = true, jump = true)
player.rotate(54.0, 4.0)
player.rotate(54.0f, 4.0f)
player.tick(37)
storeMovement()
storeVelocity()
@ -130,7 +130,7 @@ class SpeedExtractor : AbstractExtractor() {
player.teleport(-10.0, 1.0, -11.0)
player.applySpeed(3)
player.setKeys(forwards = true, jump = true, sprint = true)
player.rotate(54.0, 4.0)
player.rotate(54.0f, 4.0f)
player.tick(33)
storeMovement()
storeVelocity()

View File

@ -0,0 +1,58 @@
package de.bixilon.pixlyzer.physics.tests.riding
import de.bixilon.pixlyzer.physics.tests.ExtractorMethod
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityType
import net.minecraft.entity.vehicle.BoatEntity
class BoatExtractor : RidingExtractor() {
override fun construct(): Entity {
return BoatEntity(EntityType.BOAT, world.native)
}
@ExtractorMethod
fun boatStartRiding() {
super.startRiding()
}
@ExtractorMethod
fun boatStartFalling() {
super.startFalling()
}
@ExtractorMethod
fun boatStartWalking1() {
super.startWalking1()
}
@ExtractorMethod
fun boatStartWalking2() {
super.startWalking2()
}
@ExtractorMethod
fun boatWalkSideways1() {
super.walkSideways1()
}
@ExtractorMethod
fun boatWalkSideways2() {
super.walkSideways2()
}
@ExtractorMethod
fun boatWalkUnsaddled() {
super.walkUnsaddled()
}
@ExtractorMethod
fun boatJump1() {
super.jump1()
}
@ExtractorMethod
fun boatJump2() {
super.jump2()
}
}

View File

@ -0,0 +1,58 @@
package de.bixilon.pixlyzer.physics.tests.riding
import de.bixilon.pixlyzer.physics.tests.ExtractorMethod
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityType
import net.minecraft.entity.passive.HorseEntity
class HorseExtractor : RidingExtractor() {
override fun construct(): Entity {
return HorseEntity(EntityType.HORSE, world.native)
}
@ExtractorMethod
fun horseStartRiding() {
super.startRiding()
}
@ExtractorMethod
fun horseStartFalling() {
super.startFalling()
}
@ExtractorMethod
fun horseStartWalking1() {
super.startWalking1()
}
@ExtractorMethod
fun horseStartWalking2() {
super.startWalking2()
}
@ExtractorMethod
fun horseWalkSideways1() {
super.walkSideways1()
}
@ExtractorMethod
fun horseWalkSideways2() {
super.walkSideways2()
}
@ExtractorMethod
fun horseWalkUnsaddled() {
super.walkUnsaddled()
}
@ExtractorMethod
fun horseJump1() {
super.jump1()
}
@ExtractorMethod
fun horseJump2() {
super.jump2()
}
}

View File

@ -0,0 +1,58 @@
package de.bixilon.pixlyzer.physics.tests.riding
import de.bixilon.pixlyzer.physics.tests.ExtractorMethod
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityType
import net.minecraft.entity.vehicle.MinecartEntity
class MinecartExtractor : RidingExtractor() {
override fun construct(): Entity {
return MinecartEntity(EntityType.MINECART, world.native)
}
@ExtractorMethod
fun minecartStartRiding() {
super.startRiding()
}
@ExtractorMethod
fun minecartStartFalling() {
super.startFalling()
}
@ExtractorMethod
fun minecartStartWalking1() {
super.startWalking1()
}
@ExtractorMethod
fun minecartStartWalking2() {
super.startWalking2()
}
@ExtractorMethod
fun minecartWalkSideways1() {
super.walkSideways1()
}
@ExtractorMethod
fun minecartWalkSideways2() {
super.walkSideways2()
}
@ExtractorMethod
fun minecartWalkUnsaddled() {
super.walkUnsaddled()
}
@ExtractorMethod
fun minecartJump1() {
super.jump1()
}
@ExtractorMethod
fun minecartJump2() {
super.jump2()
}
}

View File

@ -0,0 +1,101 @@
package de.bixilon.pixlyzer.physics.tests.riding
import de.bixilon.pixlyzer.physics.tests.ExtractorMethod
import net.minecraft.block.Blocks
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityType
import net.minecraft.entity.EquipmentSlot
import net.minecraft.entity.passive.PigEntity
import net.minecraft.item.ItemStack
import net.minecraft.item.Items
class PigRidingExtractor : RidingExtractor() {
override fun construct(): Entity {
return PigEntity(EntityType.PIG, world.native)
}
@ExtractorMethod
fun pigStartRiding() {
super.startRiding()
}
@ExtractorMethod
fun pigStartFalling() {
super.startFalling()
}
@ExtractorMethod
fun pigStartWalking1() {
super.startWalking1()
}
@ExtractorMethod
fun pigStartWalking2() {
super.startWalking2()
}
@ExtractorMethod
fun pigWalkSideways1() {
super.walkSideways1()
}
@ExtractorMethod
fun pigWalkSideways2() {
super.walkSideways2()
}
@ExtractorMethod
fun pigWalkUnsaddled() {
super.walkUnsaddled()
}
@ExtractorMethod
fun pigJump1() {
super.jump1()
}
@ExtractorMethod
fun pigJump2() {
super.jump2()
}
private fun addCarrotOnStick() {
val stack = ItemStack(Items.CARROT_ON_A_STICK)
player.native.equipStack(EquipmentSlot.MAINHAND, stack)
}
@ExtractorMethod
fun pigCarrotOnStick1() {
player.teleport(6.0, 5.0, 4.0)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
addCarrotOnStick()
tick(10)
storeMovement()
vehicle.storeMovement()
}
@ExtractorMethod
fun pigCarrotOnStick2() {
player.teleport(6.0, 5.0, 4.0)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
player.startRiding(vehicle)
addCarrotOnStick()
tick(20)
storeMovement()
vehicle.storeMovement()
}
}

View File

@ -0,0 +1,182 @@
package de.bixilon.pixlyzer.physics.tests.riding
import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.json.MutableJsonObject
import de.bixilon.pixlyzer.physics.abstractions.MinecraftVehicle
import de.bixilon.pixlyzer.physics.tests.AbstractExtractor
import net.minecraft.block.Blocks
import net.minecraft.entity.Entity
import net.minecraft.entity.Saddleable
abstract class RidingExtractor : AbstractExtractor() {
abstract fun construct(): Entity
protected fun createEntity(saddle: Boolean = true): MinecraftVehicle<Entity> {
val native = construct()
if (saddle && native is Saddleable) {
native.saddle(null)
}
return MinecraftVehicle(native.unsafeCast())
}
protected fun MinecraftVehicle<*>.storeMovement() {
val json: MutableJsonObject = mutableMapOf()
json["position"] = listOf(native.x, native.y, native.z)
json["velocity"] = listOf(native.velocity.x, native.velocity.y, native.velocity.z)
if (native.onGround) {
json["on_ground"] = true
}
result["vehicle"] = json
}
protected fun tick(count: Int = 1) {
for (i in 0 until count) {
player.native.vehicle?.let { world.native.tickEntity(it) } ?: world.native.tickEntity(player.native)
}
}
protected fun startRiding() {
player.teleport(6.0, 5.0, 4.0)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
storeMovement()
vehicle.storeMovement()
}
protected fun startFalling() {
player.teleport(6.0, 5.0, 4.0)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
tick(10)
storeMovement()
vehicle.storeMovement()
}
protected fun startWalking1() {
player.teleport(6.0, 5.0, 4.0)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(forwards = true)
tick(10)
storeMovement()
vehicle.storeMovement()
}
protected fun startWalking2() {
player.teleport(6.0, 5.0, 4.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(forwards = true)
tick(15)
storeMovement()
vehicle.storeMovement()
}
protected fun walkSideways1() {
player.teleport(6.0, 5.0, 4.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(left = true)
tick(12)
storeMovement()
vehicle.storeMovement()
}
protected fun walkSideways2() {
player.teleport(6.0, 5.0, 4.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(left = true, forwards = true)
tick(16)
storeMovement()
vehicle.storeMovement()
}
protected fun walkBackwards() {
player.teleport(6.0, 5.0, 4.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(backwards = true)
tick(11)
storeMovement()
vehicle.storeMovement()
}
protected fun walkUnsaddled() {
player.teleport(6.0, 5.0, 4.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
val vehicle = createEntity(false)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(forwards = true)
tick(18)
storeMovement()
vehicle.storeMovement()
}
protected fun jump1() {
player.teleport(6.0, 5.0, 4.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(forwards = true, jump = true)
tick(18)
storeMovement()
vehicle.storeMovement()
}
protected fun jump2() {
player.teleport(6.0, 5.0, 4.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
player.setKeys(forwards = true, jump = true)
tick(18)
player.setKeys(forwards = true)
tick(3)
storeMovement()
vehicle.storeMovement()
}
}

View File

@ -0,0 +1,58 @@
package de.bixilon.pixlyzer.physics.tests.riding
import de.bixilon.pixlyzer.physics.tests.ExtractorMethod
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityType
import net.minecraft.entity.mob.SpiderEntity
class SpiderExtractor : RidingExtractor() {
override fun construct(): Entity {
return SpiderEntity(EntityType.SPIDER, world.native)
}
@ExtractorMethod
fun spiderStartRiding() {
super.startRiding()
}
@ExtractorMethod
fun spiderStartFalling() {
super.startFalling()
}
@ExtractorMethod
fun spiderStartWalking1() {
super.startWalking1()
}
@ExtractorMethod
fun spiderStartWalking2() {
super.startWalking2()
}
@ExtractorMethod
fun spiderWalkSideways1() {
super.walkSideways1()
}
@ExtractorMethod
fun spiderWalkSideways2() {
super.walkSideways2()
}
@ExtractorMethod
fun spiderWalkUnsaddled() {
super.walkUnsaddled()
}
@ExtractorMethod
fun spiderJump1() {
super.jump1()
}
@ExtractorMethod
fun spiderJump2() {
super.jump2()
}
}

View File

@ -0,0 +1,100 @@
package de.bixilon.pixlyzer.physics.tests.riding
import de.bixilon.pixlyzer.physics.tests.ExtractorMethod
import net.minecraft.block.Blocks
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityType
import net.minecraft.entity.EquipmentSlot
import net.minecraft.entity.passive.StriderEntity
import net.minecraft.item.ItemStack
import net.minecraft.item.Items
class StriderExtractor : RidingExtractor() {
override fun construct(): Entity {
return StriderEntity(EntityType.STRIDER, world.native)
}
@ExtractorMethod
fun striderStartRiding() {
super.startRiding()
}
@ExtractorMethod
fun striderStartFalling() {
super.startFalling()
}
@ExtractorMethod
fun striderStartWalking1() {
super.startWalking1()
}
@ExtractorMethod
fun striderStartWalking2() {
super.startWalking2()
}
@ExtractorMethod
fun striderWalkSideways1() {
super.walkSideways1()
}
@ExtractorMethod
fun striderWalkSideways2() {
super.walkSideways2()
}
@ExtractorMethod
fun striderWalkUnsaddled() {
super.walkUnsaddled()
}
@ExtractorMethod
fun striderJump1() {
super.jump1()
}
@ExtractorMethod
fun striderJump2() {
super.jump2()
}
private fun addWarpedFungusOnAStick() {
val stack = ItemStack(Items.WARPED_FUNGUS_ON_A_STICK)
player.native.equipStack(EquipmentSlot.MAINHAND, stack)
}
@ExtractorMethod
fun stiderOnStick1() {
player.teleport(6.0, 5.0, 4.0)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
player.startRiding(vehicle)
addWarpedFungusOnAStick()
tick(10)
storeMovement()
vehicle.storeMovement()
}
@ExtractorMethod
fun stiderOnStick2() {
player.teleport(6.0, 5.0, 4.0)
val vehicle = createEntity(true)
vehicle.teleport(7.0, 6.0, 5.0)
world.fill(-10, 4, -10, 10, 4, 10, Blocks.STONE.defaultState)
player.startRiding(vehicle)
addWarpedFungusOnAStick()
tick(20)
storeMovement()
vehicle.storeMovement()
}
}