Fixes to spectator androids

Fixes #112
This commit is contained in:
DBotThePony 2022-10-10 18:01:02 +07:00
parent 130617d793
commit 6bde5ff954
Signed by: DBot
GPG Key ID: DCC23B5715498507
8 changed files with 43 additions and 16 deletions

View File

@ -21,6 +21,7 @@ abstract class AndroidSwitchableFeature(type: AndroidFeatureType<*>, android: Ma
})
open val allowToSwitchByPlayer: Boolean get() = true
open val allowToSwitchByPlayerWhileSpectator: Boolean get() = true
// TODO: PoseStack is stripped from server dist
// but it doesn't seem to cause issues?

View File

@ -79,7 +79,7 @@ class ItemMagnetFeature(capability: MatteryPlayerCapability) : AndroidSwitchable
private val clientPredicate = Predicate<Entity> { it is ItemEntity && (datatable[it] ?: SharedItemEntityData.EMPTY).let { !it.hasPickupDelay && (it.owner == null || it.owner != ply.uuid || it.lifespan - it.age <= 200) } }
private fun doTick(server: Boolean) {
if (server && !android.androidEnergy.extractEnergyInnerExact(ServerConfig.AndroidItemMagnet.POWER_DRAW, true).isPositive) {
if (ply.isSpectator || server && !android.androidEnergy.extractEnergyInnerExact(ServerConfig.AndroidItemMagnet.POWER_DRAW, true).isPositive) {
return
}
@ -120,7 +120,7 @@ class ItemMagnetFeature(capability: MatteryPlayerCapability) : AndroidSwitchable
override fun tickClient() {
super.tickClient()
if (isActive && android.androidEnergy.extractEnergyInnerExact(ServerConfig.AndroidItemMagnet.POWER_DRAW, true).isPositive) {
if (!ply.isSpectator && isActive && android.androidEnergy.extractEnergyInnerExact(ServerConfig.AndroidItemMagnet.POWER_DRAW, true).isPositive) {
doTick(false)
}
}

View File

@ -83,6 +83,11 @@ class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
fun movementTick(isJumping: Boolean, isShifting: Boolean) {
check(ply !is ServerPlayer) { "Invalid side" }
if (ply.isSpectator) {
return
}
val old = lastGround
lastGround = ply.isOnGround

View File

@ -11,16 +11,22 @@ import ru.dbotthepony.mc.otm.client.render.ResearchIcons
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
class NightVisionFeature(android: MatteryPlayerCapability) : AndroidSwitchableFeature(AndroidFeatures.NIGHT_VISION, android) {
override val allowToSwitchByPlayerWhileSpectator: Boolean
get() = true
override fun tickServer() {
if (isActive) {
val effect = android.ply.activeEffectsMap[MobEffects.NIGHT_VISION]
if ((effect == null || effect.duration < 220) && android.androidEnergy.extractEnergyInnerExact(ServerConfig.NIGHT_VISION_POWER_DRAW, true).isPositive) {
if ((effect == null || effect.duration < 220) && (ply.isSpectator || android.androidEnergy.extractEnergyInnerExact(ServerConfig.NIGHT_VISION_POWER_DRAW, true).isPositive)) {
android.ply.addEffect(MobEffectInstance(MobEffects.NIGHT_VISION, 220))
if (!ply.isSpectator) {
android.androidEnergy.extractEnergyInner(ServerConfig.NIGHT_VISION_POWER_DRAW, false)
}
}
}
}
override fun removeModifiers() {
val effect = android.ply.activeEffectsMap[MobEffects.NIGHT_VISION]

View File

@ -69,7 +69,14 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
private set
override fun tickClient() {
if (isActive && ply.isShiftKeyDown && cooldown <= 0 && android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive && ply.deltaMovement.y < -0.01) {
if (
!ply.isSpectator &&
isActive &&
ply.isShiftKeyDown &&
cooldown <= 0 &&
android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive &&
ply.deltaMovement.y < -0.01
) {
ply.deltaMovement += Vector(0.0, -ServerConfig.Shockwave.ACCELERATION / 20.0, 0.0)
}
@ -77,7 +84,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
}
fun shockwave() {
if (cooldown > 0 || !android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, false).isPositive) {
if (ply.isSpectator || cooldown > 0 || !android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, false).isPositive) {
return
}
@ -156,13 +163,13 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
}
private fun ticker(isClient: Boolean) {
if (!ply.isOnGround) {
if (!ply.isOnGround || ply.isSpectator) {
airTicks = (airTicks + 1).coerceAtMost(3)
} else {
airTicks = (airTicks - 1).coerceAtLeast(0)
}
if (isActive && cooldown <= 0 && android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive) {
if (!ply.isSpectator && isActive && cooldown <= 0 && android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive) {
val old = wasMidair
wasMidair = !ply.isOnGround

View File

@ -890,7 +890,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
fun canEntitySpawn(event: LivingSpawnEvent.CheckSpawn) {
if (event.spawnReason == MobSpawnType.NATURAL && event.entity is Phantom) {
for (ply in event.entity.level.players()) {
if (ply.matteryPlayer?.isAndroid == true) {
if (!ply.isSpectator && ply.matteryPlayer?.isAndroid == true) {
val feature = (ply.matteryPlayer?.getFeature(AndroidFeatures.PHANTOM_ATTRACTOR) as AndroidSwitchableFeature?)
if (feature?.isActive != true) {

View File

@ -49,11 +49,14 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
super.setDown(isDown)
if (old != isDown) {
val player = minecraft.player
val matteryPlayer = player?.matteryPlayer
if (
minecraft.screen == null &&
isDown &&
minecraft.player?.matteryPlayer?.isAndroid == true &&
minecraft.player?.matteryPlayer?.features?.anyMatch { it is AndroidSwitchableFeature && it.allowToSwitchByPlayer } == true
matteryPlayer?.isAndroid == true &&
matteryPlayer.features.anyMatch { it is AndroidSwitchableFeature && it.allowToSwitchByPlayer && (!player.isSpectator || it.allowToSwitchByPlayerWhileSpectator) }
) {
grabbedInput = true
minecraft.mouseHandler.releaseMouse()
@ -110,7 +113,12 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
return
}
val features = minecraft.player?.matteryPlayer?.features?.filter { it is AndroidSwitchableFeature && it.allowToSwitchByPlayer }?.collect(Collectors.toList()) as MutableList<AndroidSwitchableFeature>? ?: return
val player = minecraft.player ?: return
val matteryPlayer = player.matteryPlayer ?: return
val features = matteryPlayer.features
.filter { it is AndroidSwitchableFeature && it.allowToSwitchByPlayer && (!player.isSpectator || it.allowToSwitchByPlayerWhileSpectator) }
.collect(Collectors.toList()) as MutableList<AndroidSwitchableFeature>
if (features.isEmpty()) {
lastRender = System.nanoTime()

View File

@ -326,14 +326,14 @@ class SwitchAndroidFeaturePacket(val type: AndroidFeatureType<*>, val newState:
val feature = matteryPlayer.getFeature(type) ?: return@enqueueWork
if (feature is AndroidActiveFeature && feature.allowToSwitchByPlayer) {
if (feature is AndroidActiveFeature && feature.allowToSwitchByPlayer && (!matteryPlayer.ply.isSpectator || feature.allowToSwitchByPlayerWhileSpectator)) {
matteryPlayer.features
.map { it as? AndroidActiveFeature }
.filter { it != null }
.filter { it !== feature && it!!.allowToSwitchByPlayer }
.filter { it !== feature && it!!.allowToSwitchByPlayer && (!matteryPlayer.ply.isSpectator || it.allowToSwitchByPlayerWhileSpectator) }
.forEach { it!!.isActive = false }
feature.isActive = newState
} else if (feature is AndroidSwitchableFeature && feature.allowToSwitchByPlayer) {
} else if (feature is AndroidSwitchableFeature && feature.allowToSwitchByPlayer && (!matteryPlayer.ply.isSpectator || feature.allowToSwitchByPlayerWhileSpectator)) {
feature.isActive = newState
}
}
@ -357,7 +357,7 @@ class ActivateAndroidFeaturePacket(val type: AndroidFeatureType<*>) : MatteryPac
context.enqueueWork {
val matteryPlayer = context.sender?.matteryPlayer ?: return@enqueueWork
if (!matteryPlayer.isAndroid) {
if (!matteryPlayer.isAndroid || matteryPlayer.ply.isSpectator) {
return@enqueueWork
}