diff options
author | SoniEx2 <endermoneymod@gmail.com> | 2025-03-15 23:39:51 -0300 |
---|---|---|
committer | SoniEx2 <endermoneymod@gmail.com> | 2025-03-15 23:39:51 -0300 |
commit | f65be908897ce7cdf217f7d56bba0c73b8a1986f (patch) | |
tree | 49f050c8124ec6d10591fcf540c8e4daae3a1722 | |
parent | 1b4e672a4580e2d38edcd06510dabb45359f162b (diff) |
Adjust power received based on distance
-rw-r--r-- | src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt b/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt index b69cc42..4a4f087 100644 --- a/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt +++ b/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt @@ -1,6 +1,7 @@ package space.autistic.radio.client.sound import net.fabricmc.fabric.api.client.sound.v1.FabricSoundInstance +import net.minecraft.client.MinecraftClient import net.minecraft.client.network.ClientPlayerEntity import net.minecraft.client.sound.* import net.minecraft.sound.SoundCategory @@ -8,8 +9,10 @@ import net.minecraft.sound.SoundEvents import net.minecraft.util.Identifier import space.autistic.radio.PirateRadioEntityTypes import space.autistic.radio.client.PirateRadioClient +import space.autistic.radio.client.fmsim.FmSimulatorMode import space.autistic.radio.entity.DisposableTransmitterEntity import java.util.concurrent.CompletableFuture +import kotlin.math.PI class PirateRadioSoundInstance(private val player: ClientPlayerEntity) : MovingSoundInstance( SoundEvents.INTENTIONALLY_EMPTY, SoundCategory.MUSIC, SoundInstance.createRandom() @@ -32,10 +35,35 @@ class PirateRadioSoundInstance(private val player: ClientPlayerEntity) : MovingS player.clientWorld.entities.filter { it.type == PirateRadioEntityTypes.DISPOSABLE_TRANSMITTER } .filter { (it as DisposableTransmitterEntity).frequency <= PirateRadioClient.frequency + 1 && it.frequency >= PirateRadioClient.frequency - 1 } .sortedByDescending { player.pos.squaredDistanceTo(it.pos) } as List<DisposableTransmitterEntity> - val main = trackedEntities.filter { it.frequency == PirateRadioClient.frequency }.take(2) - val lower = trackedEntities.find { it.frequency == PirateRadioClient.frequency - 1 } - val upper = trackedEntities.find { it.frequency == PirateRadioClient.frequency + 1 } - // TODO implement + val main = trackedEntities.filter { it.frequency == PirateRadioClient.frequency } + .take(if (PirateRadioClient.mode == FmSimulatorMode.FAST) 1 else 2) + val lower = trackedEntities.filter { it.frequency == PirateRadioClient.frequency - 1 } + .take(if (PirateRadioClient.mode == FmSimulatorMode.FAST) 0 else 1) + val upper = trackedEntities.filter { it.frequency == PirateRadioClient.frequency + 1 } + .take(if (PirateRadioClient.mode == FmSimulatorMode.FAST) 0 else 1) + val mainNoise = trackedEntities.filter { it.frequency == PirateRadioClient.frequency }.drop(main.size) + .fold(0f) { noise, entity -> + noise + getPowerReceived(entity.pos.squaredDistanceTo(player.pos)) + } + val lowerNoise = trackedEntities.filter { it.frequency == PirateRadioClient.frequency - 1 }.drop(lower.size) + .fold(0f) { noise, entity -> + noise + getPowerReceived(entity.pos.squaredDistanceTo(player.pos)) + } + val upperNoise = trackedEntities.filter { it.frequency == PirateRadioClient.frequency + 1 }.drop(upper.size) + .fold(0f) { noise, entity -> + noise + getPowerReceived(entity.pos.squaredDistanceTo(player.pos)) + } + val mainLevels = main.map { getPowerReceived(it.pos.squaredDistanceTo(player.pos)) } + val lowerLevels = lower.map { getPowerReceived(it.pos.squaredDistanceTo(player.pos)) } + val upperLevels = upper.map { getPowerReceived(it.pos.squaredDistanceTo(player.pos)) } + // TODO + } + + private fun getPowerReceived(rsq: Double): Float { + // https://www.antenna-theory.com/basics/friis.php + // also fudge results if too close to transmitter + if (rsq < 1.0) return (FRIIS_FACTOR * rsq).toFloat() + return (FRIIS_FACTOR / rsq).toFloat() } override fun getAudioStream( @@ -65,4 +93,13 @@ class PirateRadioSoundInstance(private val player: ClientPlayerEntity) : MovingS 16 ) } + + companion object { + private const val TRANSMIT_POWER = 0.01 + + // for 100MHz + private const val WAVELENGTH = 3.0 + private const val UNIT_SPHERE = 4.0 * PI + private const val FRIIS_FACTOR = TRANSMIT_POWER * WAVELENGTH / (UNIT_SPHERE * UNIT_SPHERE) + } } |