From 6a9ea06b71bb01aa1cb676eef1faf23af106511a Mon Sep 17 00:00:00 2001 From: alex_s168 <63254202+alex-s168@users.noreply.github.com> Date: Wed, 24 Jul 2024 18:49:13 +0000 Subject: [PATCH] works --- .../tournament/TournamentFuel.kt | 10 ++--- .../tournament/TournamentMod.kt | 1 + .../tournament/TournamentNetworking.kt | 16 +++++++- .../blockentity/FuelTankBlockEntity.kt | 5 ++- .../tournament/blocks/FuelTankBlock.kt | 38 +++++++++++++++---- .../tournament/blocks/ThrusterBlock.kt | 5 ++- .../tournament/ship/TournamentShips.kt | 33 ++++++++++++---- .../valkyrienskies/tournament/util/Title.kt | 22 +++++++++++ .../assets/vs_tournament/lang/en_us.json | 12 +++--- 9 files changed, 111 insertions(+), 31 deletions(-) create mode 100644 common/src/main/kotlin/org/valkyrienskies/tournament/util/Title.kt diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentFuel.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentFuel.kt index 80a72f4..af2c44f 100644 --- a/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentFuel.kt +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentFuel.kt @@ -199,8 +199,8 @@ private val defaultFuels = mapOf( baseBurnRate = 0.001f, burnRatePerThrottle = 0.002f, basePower = 0.33f, - powerPerThrottle = 666.666f, - particles = ParticleTypes.ASH, + powerPerThrottle = 1_000.0f, + particles = ParticleTypes.CAMPFIRE_COSY_SMOKE, particleCount = 2, particleSpread = 0f, particleVelocity = 0.2f, @@ -211,10 +211,10 @@ private val defaultFuels = mapOf( baseBurnRate = 0.0002f, burnRatePerThrottle = 0.0017f, basePower = 0.34f, - powerPerThrottle = 777f, - particles = ParticleTypes.ASH, + powerPerThrottle = 1_200.0f, + particles = ParticleTypes.CAMPFIRE_COSY_SMOKE, particleCount = 2, particleSpread = 0f, - particleVelocity = 0.23f, + particleVelocity = 0.25f, ), ) \ No newline at end of file diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentMod.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentMod.kt index 27935d3..6081bda 100644 --- a/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentMod.kt +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentMod.kt @@ -15,6 +15,7 @@ object TournamentMod { @JvmStatic fun init() { + TournamentNetworking.register() TournamentFuelManager.registerTournamentConfigDir() VSConfigClass.registerConfig("vs_tournament", TournamentConfig::class.java) diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentNetworking.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentNetworking.kt index 037ece2..d27a2b9 100644 --- a/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentNetworking.kt +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/TournamentNetworking.kt @@ -11,8 +11,19 @@ import org.valkyrienskies.tournament.ship.TournamentShips object TournamentNetworking { data class ShipFuelTypeChange( val ship: ShipId, - val fuel: ResourceLocation? + val fuel: String? ) : SimplePacket { + constructor( + ship: ShipId, + fuel: ResourceLocation? + ): this(ship, fuel?.toString()) + + fun fuelKey() = + fuel?.let(::ResourceLocation) + + fun fuelFuel() = + fuelKey()?.let(TournamentFuelManager.fuels::get) + fun send() { // TODO after vs update // with(vsCore.simplePacketNetworking) { @@ -20,6 +31,7 @@ object TournamentNetworking { // } } } + fun register() { // TODO after vs update // with(vsCore.simplePacketNetworking) { @@ -29,7 +41,7 @@ object TournamentNetworking { // TODO after vs update // with(vsCore.simplePacketNetworking) { ShipFuelTypeChange::class.registerClientHandler { - TournamentShips.Client[it.ship].fuelType = it.fuel?.let { TournamentFuelManager.fuels[it] } + TournamentShips.Client[it.ship].fuelType = it.fuelFuel() } // } } diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/blockentity/FuelTankBlockEntity.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/blockentity/FuelTankBlockEntity.kt index 2cf6450..70ff714 100644 --- a/common/src/main/kotlin/org/valkyrienskies/tournament/blockentity/FuelTankBlockEntity.kt +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/blockentity/FuelTankBlockEntity.kt @@ -22,6 +22,7 @@ import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.math.ceil import kotlin.math.max +import kotlin.math.min class FuelTankBlockEntity( pos: BlockPos, @@ -72,7 +73,7 @@ class FuelTankBlockEntity( val cap = ceil(TournamentConfig.SERVER.fuelContainerCap * capf).toInt() @OptIn(ExperimentalContracts::class) - private fun ship(fn: (TournamentShips) -> R): R? { + fun ship(fn: (TournamentShips) -> R): R? { contract { callsInPlace(fn, InvocationKind.AT_MOST_ONCE) } @@ -99,7 +100,7 @@ class FuelTankBlockEntity( ship { val fuel = stack.tournamentFuel() if (fuel != null && it.fuelType?.let { it == fuel } != false) - max(it.fuelCap - it.fuelCount, 0.0f).toInt() + min(stack.count, max(it.fuelCap - it.fuelCount, 0.0f).toInt()) else 0 } ?: 0 diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/FuelTankBlock.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/FuelTankBlock.kt index 05ef674..d958c91 100644 --- a/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/FuelTankBlock.kt +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/FuelTankBlock.kt @@ -1,6 +1,8 @@ package org.valkyrienskies.tournament.blocks import net.minecraft.core.BlockPos +import net.minecraft.network.chat.TranslatableComponent +import net.minecraft.server.level.ServerLevel import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResult import net.minecraft.world.WorldlyContainer @@ -17,7 +19,9 @@ import net.minecraft.world.level.material.Material import net.minecraft.world.phys.BlockHitResult import org.valkyrienskies.tournament.TournamentBlockEntities import org.valkyrienskies.tournament.blockentity.FuelTankBlockEntity +import org.valkyrienskies.tournament.util.TitleType import org.valkyrienskies.tournament.util.block.SlabBaseEntityBlock +import org.valkyrienskies.tournament.util.sendTitle private fun useCommon( state: BlockState, @@ -27,19 +31,37 @@ private fun useCommon( hand: InteractionHand, hit: BlockHitResult ): InteractionResult { - if (level.isClientSide) return InteractionResult.FAIL - val be = level.getBlockEntity(pos)!! as FuelTankBlockEntity + if (level !is ServerLevel) + return InteractionResult.FAIL + + val be = level.getBlockEntity(pos) + as? FuelTankBlockEntity + ?: return InteractionResult.FAIL val stack = player.getItemInHand(hand) + var result = InteractionResult.FAIL + val canStore = be.canStoreCount(stack) if (canStore > 0) { be.forceStore(stack, canStore) stack.shrink(canStore) - return InteractionResult.SUCCESS + result = InteractionResult.SUCCESS + } + + be.ship { mngr -> + level.sendTitle( + player, + TitleType.ACTION_BAR_TEXT, + TranslatableComponent( + "misc.vs_tournament.fuel.level", + mngr.fuelCount, + mngr.fuelCap + ) + ) } - return InteractionResult.FAIL + return result } class FuelTankBlockFull( @@ -51,7 +73,7 @@ class FuelTankBlockFull( override fun onPlace(state: BlockState, level: Level, pos: BlockPos, oldState: BlockState, isMoving: Boolean) { super.onPlace(state, level, pos, oldState, isMoving) if (level.isClientSide) return - val be = level.getBlockEntity(pos)!! as FuelTankBlockEntity + val be = level.getBlockEntity(pos) as? FuelTankBlockEntity? ?: return be.onAdded() } @@ -59,7 +81,7 @@ class FuelTankBlockFull( override fun onRemove(state: BlockState, level: Level, pos: BlockPos, newState: BlockState, isMoving: Boolean) { super.onRemove(state, level, pos, newState, isMoving) if (level.isClientSide) return - val be = level.getBlockEntity(pos)!! as FuelTankBlockEntity + val be = level.getBlockEntity(pos) as? FuelTankBlockEntity? ?: return be.onRemoved() } @@ -92,7 +114,7 @@ class FuelTankBlockHalf: SlabBaseEntityBlock( override fun onPlace(state: BlockState, level: Level, pos: BlockPos, oldState: BlockState, isMoving: Boolean) { super.onPlace(state, level, pos, oldState, isMoving) if (level.isClientSide) return - val be = level.getBlockEntity(pos)!! as FuelTankBlockEntity + val be = level.getBlockEntity(pos) as? FuelTankBlockEntity? ?: return be.onAdded() } @@ -100,7 +122,7 @@ class FuelTankBlockHalf: SlabBaseEntityBlock( override fun onRemove(state: BlockState, level: Level, pos: BlockPos, newState: BlockState, isMoving: Boolean) { super.onRemove(state, level, pos, newState, isMoving) if (level.isClientSide) return - val be = level.getBlockEntity(pos)!! as FuelTankBlockEntity + val be = level.getBlockEntity(pos) as? FuelTankBlockEntity? ?: return be.onRemoved() } diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/ThrusterBlock.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/ThrusterBlock.kt index 95fd8da..4050573 100644 --- a/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/ThrusterBlock.kt +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/blocks/ThrusterBlock.kt @@ -188,12 +188,15 @@ class ThrusterBlock( override fun animateTick(state: BlockState, level: Level, pos: BlockPos, random: Random) { super.animateTick(state, level, pos, random) - val ship = level.getShipObjectManagingPos(pos) ?: return + val ship = level.getShipManagingPos(pos) + ?: level.getShipObjectManagingPos(pos) + ?: return val rp = pos.toJOMLD() ship.transform.shipToWorld.transformPosition(rp) val fuel = TournamentShips.Client[ship].fuelType + println(fuel) if (fuel != null && state.getValue(BlockStateProperties.POWER) > 0 && fuel.particles != null) { val dir = state.getValue(FACING) diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/ship/TournamentShips.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/ship/TournamentShips.kt index e9a2a94..a2ad592 100644 --- a/common/src/main/kotlin/org/valkyrienskies/tournament/ship/TournamentShips.kt +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/ship/TournamentShips.kt @@ -6,6 +6,7 @@ import com.google.common.util.concurrent.AtomicDouble import net.fabricmc.api.EnvType import net.fabricmc.api.Environment import net.minecraft.core.BlockPos +import net.minecraft.resources.ResourceLocation import net.minecraft.server.MinecraftServer import net.minecraft.world.level.Level import org.joml.Vector3d @@ -61,7 +62,10 @@ class TournamentShips: ShipForcesInducer { CopyOnWriteArrayList() val thrustersV2 = - ConcurrentHashMap() + CopyOnWriteArrayList>() + + fun thrusterV2(pos: Vector3d): ThrusterDataV2? = + thrustersV2.firstOrNull { it.first == pos }?.second private val balloons = CopyOnWriteArrayList>() @@ -73,8 +77,14 @@ class TournamentShips: ShipForcesInducer { CopyOnWriteArrayList>() @Volatile - var fuelType: FuelType? = - null + var fuelTypeKey: String? = null + + var fuelType: FuelType? + set(v) { + fuelTypeKey = v?.let { TournamentFuelManager.getKey(it) }?.toString() + } + get() = + fuelTypeKey?.let { TournamentFuelManager.fuels[ResourceLocation(it)] } @Volatile var fuelCount = 0.0f @@ -110,6 +120,7 @@ class TournamentShips: ShipForcesInducer { @JsonIgnore private var ticker: TickScheduler.Ticking? = null + @JsonIgnore private var lastFuelType = fuelType override fun applyForces(physShip: PhysShip) { physShip as PhysShipImpl @@ -124,6 +135,10 @@ class TournamentShips: ShipForcesInducer { if (ticker == null) { ticker = TickScheduler.serverTickPerm(::tickfn) + TournamentNetworking.ShipFuelTypeChange( + physShip.id, + TournamentFuelManager.getKey(fuelType) + ).send() } val vel = physShip.poseVel.vel @@ -276,11 +291,11 @@ class TournamentShips: ShipForcesInducer { throttle: Float, dir: Vector3d ) { - thrustersV2[pos.toJOMLD()] = ThrusterDataV2(dir, throttle, false, 0.0f) + thrustersV2 += pos.toJOMLD() to ThrusterDataV2(dir, throttle, false, 0.0f) } fun thrusterLastPowerV2(pos: BlockPos) = - thrustersV2[pos.toJOMLD()]!!.lastPower + thrusterV2(pos.toJOMLD())!!.lastPower fun addThrustersV1( list: Iterable> @@ -293,8 +308,9 @@ class TournamentShips: ShipForcesInducer { fun stopThruster( pos: BlockPos ) { - thrusters.removeIf { pos.toJOML() == it.pos } - thrustersV2.remove(pos.toJOMLD()) + val joml = pos.toJOMLD() + thrusters.removeIf { it.pos == joml } + thrustersV2.removeIf { it.first == joml } } fun addBalloon(pos: BlockPos, pow: Double) { @@ -306,7 +322,8 @@ class TournamentShips: ShipForcesInducer { } fun removeBalloon(pos: BlockPos) { - balloons.removeAll { it.first == pos.toJOML() } + val joml = pos.toJOMLD() + balloons.removeAll { it.first == joml } } fun addSpinner(pos: Vector3i, torque: Vector3d) { diff --git a/common/src/main/kotlin/org/valkyrienskies/tournament/util/Title.kt b/common/src/main/kotlin/org/valkyrienskies/tournament/util/Title.kt new file mode 100644 index 0000000..dfb5efd --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/tournament/util/Title.kt @@ -0,0 +1,22 @@ +package org.valkyrienskies.tournament.util + +import net.minecraft.network.chat.Component +import net.minecraft.network.protocol.Packet +import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket +import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket +import net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket +import net.minecraft.server.level.ServerLevel +import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.entity.player.Player + +enum class TitleType(val packet: (Component) -> Packet<*>) { + TITLE(::ClientboundSetTitleTextPacket), + SUB_TITLE(::ClientboundSetSubtitleTextPacket), + ACTION_BAR_TEXT(::ClientboundSetActionBarTextPacket), +} + +fun ServerLevel.sendTitle(to: Player, type: TitleType, msg: Component) { + to as ServerPlayer + + to.connection.send(type.packet(msg)) +} \ No newline at end of file diff --git a/common/src/main/resources/assets/vs_tournament/lang/en_us.json b/common/src/main/resources/assets/vs_tournament/lang/en_us.json index e7cdb6b..27fa839 100644 --- a/common/src/main/resources/assets/vs_tournament/lang/en_us.json +++ b/common/src/main/resources/assets/vs_tournament/lang/en_us.json @@ -56,12 +56,14 @@ "tooltip.vs_tournament.gift.grab_gun": "The pieces of your old gravity gun. Right click to get a compensation.", "tooltip.vs_tournament.fuel.title": "Solid Fuel", - "tooltip.vs_tournament.fuel.standbyBurnRate": "Burn rate when off: %0/t (%1/s)", - "tooltip.vs_tournament.fuel.baseBurnRate": "Burn rate when powered: %0/t (%1/s)", - "tooltip.vs_tournament.fuel.burnRatePerThrottle": "Additional burn rate per throttle: %0/t (%1/s)", - "tooltip.vs_tournament.fuel.basePower": "Thrust: %0 N", - "tooltip.vs_tournament.fuel.powerPerThrottle": "Additional thrust per throttle: %0 N", + "tooltip.vs_tournament.fuel.standbyBurnRate": "Burn rate when off: %s/t (%s/s)", + "tooltip.vs_tournament.fuel.baseBurnRate": "Burn rate when powered: %s/t (%s/s)", + "tooltip.vs_tournament.fuel.burnRatePerThrottle": "Additional burn rate per throttle: %s/t (%s/s)", + "tooltip.vs_tournament.fuel.basePower": "Thrust: %s N", + "tooltip.vs_tournament.fuel.powerPerThrottle": "Additional thrust per throttle: %s N", "tooltip.vs_tournament.fuel.infoThrottle": "throttle = thruster redstone level * thruster tier", + "misc.vs_tournament.fuel.level": "Total (ship) fuel level: %s / %s", + "description.vs_tournament.old_block": "OLD BLOCK. Place and break to get new one." }