From 6bde5ff954550575797a2b58dc96c371c03c613a Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 10 Oct 2022 18:01:02 +0700 Subject: [PATCH] Fixes to spectator androids Fixes #112 --- .../mc/otm/android/AndroidSwitchableFeature.kt | 1 + .../mc/otm/android/feature/ItemMagnetFeature.kt | 4 ++-- .../mc/otm/android/feature/JumpBoostFeature.kt | 5 +++++ .../mc/otm/android/feature/NightVisionFeature.kt | 10 ++++++++-- .../mc/otm/android/feature/ShockwaveFeature.kt | 15 +++++++++++---- .../mc/otm/capability/MatteryPlayerCapability.kt | 2 +- .../mc/otm/client/AndroidMenuKeyMapping.kt | 14 +++++++++++--- .../mc/otm/network/MatteryPlayerNetworkChannel.kt | 8 ++++---- 8 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidSwitchableFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidSwitchableFeature.kt index 098fd9e99..ea8a5b3eb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidSwitchableFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidSwitchableFeature.kt @@ -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? diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt index 5948f289c..55f579594 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ItemMagnetFeature.kt @@ -79,7 +79,7 @@ class ItemMagnetFeature(capability: MatteryPlayerCapability) : AndroidSwitchable private val clientPredicate = Predicate { 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) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt index 285c6623e..0ebb4df09 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt @@ -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 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NightVisionFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NightVisionFeature.kt index b7c5dcb28..4ac77be6b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NightVisionFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NightVisionFeature.kt @@ -11,13 +11,19 @@ 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)) - android.androidEnergy.extractEnergyInner(ServerConfig.NIGHT_VISION_POWER_DRAW, false) + + if (!ply.isSpectator) { + android.androidEnergy.extractEnergyInner(ServerConfig.NIGHT_VISION_POWER_DRAW, false) + } } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ShockwaveFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ShockwaveFeature.kt index 8edf7944d..bc46509ed 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ShockwaveFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/ShockwaveFeature.kt @@ -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 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index 6e6025a4a..f113e110c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -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) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/AndroidMenuKeyMapping.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/AndroidMenuKeyMapping.kt index 8ccb16bda..cdfceb7c4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/AndroidMenuKeyMapping.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/AndroidMenuKeyMapping.kt @@ -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? ?: 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 if (features.isEmpty()) { lastRender = System.nanoTime() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt index 2303fbb9a..d91f64944 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerNetworkChannel.kt @@ -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 }