Skip to content

Commit

Permalink
works
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-s168 committed Jul 24, 2024
1 parent 8bd102c commit 6a9ea06
Show file tree
Hide file tree
Showing 9 changed files with 111 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
),
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ object TournamentMod {

@JvmStatic
fun init() {
TournamentNetworking.register()
TournamentFuelManager.registerTournamentConfigDir()

VSConfigClass.registerConfig("vs_tournament", TournamentConfig::class.java)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,27 @@ 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) {
this.sendToAllClients()
// }
}
}

fun register() {
// TODO after vs update
// with(vsCore.simplePacketNetworking) {
Expand All @@ -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()
}
// }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -72,7 +73,7 @@ class FuelTankBlockEntity(
val cap = ceil(TournamentConfig.SERVER.fuelContainerCap * capf).toInt()

@OptIn(ExperimentalContracts::class)
private fun <R> ship(fn: (TournamentShips) -> R): R? {
fun <R> ship(fn: (TournamentShips) -> R): R? {
contract {
callsInPlace(fn, InvocationKind.AT_MOST_ONCE)
}
Expand All @@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
Expand All @@ -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(
Expand All @@ -51,15 +73,15 @@ 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()
}

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()
}
Expand Down Expand Up @@ -92,15 +114,15 @@ 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()
}

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()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -61,7 +62,10 @@ class TournamentShips: ShipForcesInducer {
CopyOnWriteArrayList<ThrusterData>()

val thrustersV2 =
ConcurrentHashMap<Vector3d, ThrusterDataV2>()
CopyOnWriteArrayList<Pair<Vector3d, ThrusterDataV2>>()

fun thrusterV2(pos: Vector3d): ThrusterDataV2? =
thrustersV2.firstOrNull { it.first == pos }?.second

private val balloons =
CopyOnWriteArrayList<Pair<Vector3i, Double>>()
Expand All @@ -73,8 +77,14 @@ class TournamentShips: ShipForcesInducer {
CopyOnWriteArrayList<Pair<Vector3d, Vector3d>>()

@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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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<Triple<Vector3i, Vector3d, Double>>
Expand All @@ -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) {
Expand All @@ -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) {
Expand Down
22 changes: 22 additions & 0 deletions common/src/main/kotlin/org/valkyrienskies/tournament/util/Title.kt
Original file line number Diff line number Diff line change
@@ -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))
}
12 changes: 7 additions & 5 deletions common/src/main/resources/assets/vs_tournament/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}

0 comments on commit 6a9ea06

Please sign in to comment.