Migrate to DelegateSyncher and Delegate<>
This commit is contained in:
parent
22430cd937
commit
2fbce58148
@ -141,9 +141,9 @@ dependencies {
|
||||
jarJar("ru.dbotthepony.kommons:kommons-gson:[$kommons_version,)") { setTransitive(false) }
|
||||
jarJar("ru.dbotthepony.kommons:kommons-guava:[$kommons_version,)") { setTransitive(false) }
|
||||
|
||||
implementation("ru.dbotthepony.kommons:kommons:[$kommons_version,)") { setTransitive(false) }
|
||||
implementation("ru.dbotthepony.kommons:kommons-gson:[$kommons_version,)") { setTransitive(false) }
|
||||
implementation("ru.dbotthepony.kommons:kommons-guava:[$kommons_version,)") { setTransitive(false) }
|
||||
compileOnly("ru.dbotthepony.kommons:kommons:[$kommons_version,)") { setTransitive(false) }
|
||||
compileOnly("ru.dbotthepony.kommons:kommons-gson:[$kommons_version,)") { setTransitive(false) }
|
||||
compileOnly("ru.dbotthepony.kommons:kommons-guava:[$kommons_version,)") { setTransitive(false) }
|
||||
|
||||
minecraftLibrary("ru.dbotthepony.kommons:kommons:[$kommons_version,)") { setTransitive(false) }
|
||||
minecraftLibrary("ru.dbotthepony.kommons:kommons-gson:[$kommons_version,)") { setTransitive(false) }
|
||||
|
@ -19,7 +19,7 @@ forge_version=48.1.0
|
||||
mixingradle_version=0.7.33
|
||||
mixin_version=0.8.5
|
||||
|
||||
kommons_version=2.3.3
|
||||
kommons_version=2.9.13
|
||||
|
||||
jei_version=16.0.0.28
|
||||
jupiter_version=5.9.2
|
||||
|
@ -5,18 +5,21 @@ import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraftforge.common.util.INBTSerializable
|
||||
import net.minecraftforge.event.entity.living.LivingAttackEvent
|
||||
import net.minecraftforge.event.entity.living.LivingHurtEvent
|
||||
import ru.dbotthepony.kommons.io.DelegateSyncher
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer
|
||||
import java.io.InputStream
|
||||
|
||||
abstract class AndroidFeature(val type: AndroidFeatureType<*>, val android: MatteryPlayerCapability) : INBTSerializable<CompoundTag> {
|
||||
val ply get() = android.ply
|
||||
val synchronizer = FieldSynchronizer()
|
||||
val syncher = DelegateSyncher()
|
||||
val syncherRemote = syncher.Remote()
|
||||
|
||||
open var level by synchronizer.int(setter = setter@{ value, field, setByRemote ->
|
||||
if (value != field.read()) {
|
||||
field.write(value)
|
||||
open var level by syncher.int(setter = setter@{ field, value ->
|
||||
if (value != field.get()) {
|
||||
field.accept(value)
|
||||
applyModifiers()
|
||||
}
|
||||
})
|
||||
@ -28,7 +31,7 @@ abstract class AndroidFeature(val type: AndroidFeatureType<*>, val android: Matt
|
||||
* Called when it is required to network everything again
|
||||
*/
|
||||
open fun invalidateNetwork() {
|
||||
synchronizer.invalidate()
|
||||
syncherRemote.invalidate()
|
||||
}
|
||||
|
||||
open fun applyModifiers() {}
|
||||
@ -38,11 +41,11 @@ abstract class AndroidFeature(val type: AndroidFeatureType<*>, val android: Matt
|
||||
open fun onAttack(event: LivingAttackEvent) {}
|
||||
|
||||
open fun collectNetworkPayload(): FastByteArrayOutputStream? {
|
||||
return synchronizer.collectNetworkPayload()
|
||||
return syncherRemote.write()
|
||||
}
|
||||
|
||||
open fun applyNetworkPayload(stream: InputStream) {
|
||||
synchronizer.read(stream)
|
||||
syncher.read(stream)
|
||||
}
|
||||
|
||||
override fun serializeNBT(): CompoundTag {
|
||||
|
@ -8,9 +8,11 @@ import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraftforge.common.MinecraftForge
|
||||
import net.minecraftforge.common.util.INBTSerializable
|
||||
import net.minecraftforge.eventbus.api.Cancelable
|
||||
import net.minecraftforge.eventbus.api.Event
|
||||
import net.minecraftforge.eventbus.api.Event.HasResult
|
||||
import ru.dbotthepony.kommons.io.DelegateSyncher
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.capability.awareItemsStream
|
||||
@ -19,7 +21,6 @@ import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.registryName
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.milliTime
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer
|
||||
import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger
|
||||
import java.io.InputStream
|
||||
import kotlin.math.absoluteValue
|
||||
@ -53,9 +54,10 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay
|
||||
|
||||
val ply: Player get() = capability.ply
|
||||
|
||||
val synchronizer = FieldSynchronizer()
|
||||
val syncher = DelegateSyncher()
|
||||
val syncherRemote = syncher.Remote()
|
||||
|
||||
var isResearched by synchronizer.bool().property
|
||||
var isResearched by syncher.boolean()
|
||||
private set
|
||||
|
||||
var tag = CompoundTag()
|
||||
@ -65,7 +67,7 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay
|
||||
* Called when it is required to network everything again
|
||||
*/
|
||||
fun invalidateNetwork() {
|
||||
synchronizer.invalidate()
|
||||
syncherRemote.invalidate()
|
||||
}
|
||||
|
||||
fun unResearch() {
|
||||
@ -187,11 +189,11 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay
|
||||
}
|
||||
|
||||
fun collectNetworkPayload(): FastByteArrayOutputStream? {
|
||||
return synchronizer.collectNetworkPayload()
|
||||
return syncherRemote.write()
|
||||
}
|
||||
|
||||
fun applyNetworkPayload(stream: InputStream) {
|
||||
synchronizer.read(stream)
|
||||
syncher.read(stream)
|
||||
}
|
||||
|
||||
val canResearch: Boolean get() {
|
||||
|
@ -7,6 +7,7 @@ import net.minecraft.ChatFormatting
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraftforge.eventbus.api.IEventBus
|
||||
import net.minecraftforge.registries.DeferredRegister
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.client.ShiftPressedCond
|
||||
import ru.dbotthepony.mc.otm.config.AndroidConfig
|
||||
|
@ -7,6 +7,7 @@ import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraftforge.eventbus.api.IEventBus
|
||||
import net.minecraftforge.registries.DeferredRegister
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.core.getValue
|
||||
import ru.dbotthepony.mc.otm.data.SingletonCodec
|
||||
|
@ -2,18 +2,21 @@ package ru.dbotthepony.mc.otm.android
|
||||
|
||||
import net.minecraft.client.multiplayer.ClientLevel
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
|
||||
abstract class AndroidSwitchableFeature(type: AndroidFeatureType<*>, android: MatteryPlayerCapability) : AndroidFeature(type, android) {
|
||||
var isActive by synchronizer.bool(setter = setter@{ value, access, setByRemote ->
|
||||
if (value != access.readBoolean()) {
|
||||
access.write(value)
|
||||
var isActive by syncher.boolean(setter = setter@{ access, value ->
|
||||
if (value != access.get()) {
|
||||
access.accept(value)
|
||||
|
||||
if (!setByRemote) {
|
||||
if (ply is ServerPlayer) {
|
||||
if (value) {
|
||||
applyModifiers()
|
||||
} else {
|
||||
@ -21,13 +24,13 @@ abstract class AndroidSwitchableFeature(type: AndroidFeatureType<*>, android: Ma
|
||||
}
|
||||
}
|
||||
}
|
||||
}).property
|
||||
})
|
||||
|
||||
open val allowToSwitchByPlayer: Boolean get() = true
|
||||
open val allowToSwitchByPlayerWhileSpectator: Boolean get() = true
|
||||
|
||||
open val maxCooldown: Int get() = 0
|
||||
open var cooldown by synchronizer.int().property
|
||||
open var cooldown by syncher.int()
|
||||
val isOnCooldown: Boolean
|
||||
get() = maxCooldown > 0 && cooldown > 0
|
||||
|
||||
|
@ -23,6 +23,7 @@ import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraftforge.client.event.RenderLevelStageEvent
|
||||
import net.minecraftforge.event.ForgeEventFactory
|
||||
import net.minecraftforge.event.entity.living.LivingDeathEvent
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.android.AndroidActiveFeature
|
||||
@ -38,7 +39,6 @@ import ru.dbotthepony.mc.otm.config.AndroidConfig
|
||||
import ru.dbotthepony.mc.otm.core.genericPositions
|
||||
import ru.dbotthepony.mc.otm.core.holder
|
||||
import ru.dbotthepony.mc.otm.core.isFall
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.Vector
|
||||
import ru.dbotthepony.mc.otm.core.math.asVector
|
||||
import ru.dbotthepony.mc.otm.core.math.component1
|
||||
|
@ -4,6 +4,7 @@ import net.minecraft.client.multiplayer.ClientLevel
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.world.entity.Entity
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.config.AndroidConfig
|
||||
import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
@ -13,7 +14,6 @@ import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
|
||||
import ru.dbotthepony.mc.otm.core.math.Vector
|
||||
import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.minus
|
||||
import ru.dbotthepony.mc.otm.core.math.plus
|
||||
import ru.dbotthepony.mc.otm.core.position
|
||||
|
@ -3,6 +3,9 @@ package ru.dbotthepony.mc.otm.android.feature
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.capability.energy.extractEnergyExact
|
||||
@ -11,7 +14,6 @@ import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
|
||||
import ru.dbotthepony.mc.otm.config.AndroidConfig
|
||||
import ru.dbotthepony.mc.otm.config.ClientConfig
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.Vector
|
||||
import ru.dbotthepony.mc.otm.core.math.plus
|
||||
import ru.dbotthepony.mc.otm.network.GenericNetworkChannel
|
||||
@ -55,13 +57,13 @@ class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
||||
override val maxCooldown: Int
|
||||
get() = (AndroidConfig.JumpBoost.BASE_COOLDOWN - AndroidConfig.JumpBoost.COOLDOWN_REDUCTION * level).coerceAtLeast(0)
|
||||
|
||||
override var cooldown by synchronizer.int(setter = setter@{ value, access, setByRemote ->
|
||||
access.write(value)
|
||||
override var cooldown by syncher.int(setter = setter@{ access, value ->
|
||||
access.accept(value)
|
||||
|
||||
if (setByRemote) {
|
||||
if (ply !is ServerPlayer) {
|
||||
tickCooldownClient = false
|
||||
}
|
||||
}).property
|
||||
})
|
||||
|
||||
private var lastGround = false
|
||||
|
||||
|
@ -1,12 +1,11 @@
|
||||
package ru.dbotthepony.mc.otm.android.feature
|
||||
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraftforge.event.entity.living.LivingHurtEvent
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.android.AndroidFeature
|
||||
import ru.dbotthepony.mc.otm.android.AndroidResearchManager
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.capability.energy.extractEnergyExact
|
||||
import ru.dbotthepony.mc.otm.core.isBypassArmor
|
||||
@ -19,17 +18,15 @@ import ru.dbotthepony.mc.otm.triggers.NanobotsArmorTrigger
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class NanobotsArmorFeature(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_ARMOR, android) {
|
||||
var strength by synchronizer.int(
|
||||
setter = setter@{
|
||||
value, access, _ -> access.write(value.coerceIn(0 .. 3))
|
||||
}
|
||||
).property
|
||||
var strength by syncher.int(
|
||||
setter = setter@{ access, value -> access.accept(value.coerceIn(0 .. 3)) }
|
||||
)
|
||||
|
||||
var speed: Int = 0
|
||||
set(value) { field = value.coerceIn(0 .. 3) }
|
||||
|
||||
private var ticksPassed = 0
|
||||
var layers by synchronizer.int().property
|
||||
var layers by syncher.int()
|
||||
|
||||
override fun tickServer() {
|
||||
if (layers < strength + 1 && android.androidEnergy.extractEnergyExact(ENERGY_PER_LAYER, true)) {
|
||||
@ -65,7 +62,7 @@ class NanobotsArmorFeature(android: MatteryPlayerCapability) : AndroidFeature(An
|
||||
}
|
||||
}
|
||||
|
||||
event.amount = event.amount - realAbsorbed
|
||||
event.amount -= realAbsorbed
|
||||
(ply as ServerPlayer?)?.awardStat(StatNames.DAMAGE_ABSORBED, (realAbsorbed * 10f).roundToInt())
|
||||
layers--
|
||||
}
|
||||
|
@ -2,13 +2,13 @@ package ru.dbotthepony.mc.otm.android.feature
|
||||
|
||||
import net.minecraft.world.effect.MobEffectInstance
|
||||
import net.minecraft.world.effect.MobEffects
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.capability.energy.extractEnergyExact
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
|
||||
import ru.dbotthepony.mc.otm.config.AndroidConfig
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
|
||||
|
||||
class NightVisionFeature(android: MatteryPlayerCapability) : AndroidSwitchableFeature(AndroidFeatures.NIGHT_VISION, android) {
|
||||
|
@ -17,7 +17,7 @@ import ru.dbotthepony.mc.otm.config.AndroidConfig
|
||||
import ru.dbotthepony.mc.otm.core.damageType
|
||||
import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid
|
||||
import ru.dbotthepony.mc.otm.core.getExplosionResistance
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.Vector
|
||||
import ru.dbotthepony.mc.otm.core.math.getEllipsoidBlockPositions
|
||||
import ru.dbotthepony.mc.otm.core.math.minus
|
||||
|
@ -6,7 +6,7 @@ import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
|
||||
import java.util.*
|
||||
|
||||
|
@ -7,7 +7,7 @@ import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.ResearchIcons
|
||||
import ru.dbotthepony.mc.otm.config.AndroidConfig
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
|
||||
import java.util.*
|
||||
|
||||
|
@ -4,9 +4,8 @@ import com.google.common.collect.ImmutableList
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
|
||||
import it.unimi.dsi.fastutil.longs.Long2ObjectFunction
|
||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArraySet
|
||||
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet
|
||||
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
|
||||
import it.unimi.dsi.fastutil.objects.Reference2IntArrayMap
|
||||
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
|
||||
import net.minecraft.core.BlockPos
|
||||
@ -37,12 +36,13 @@ import net.minecraftforge.event.level.ChunkWatchEvent
|
||||
import net.minecraftforge.event.level.LevelEvent
|
||||
import net.minecraftforge.event.server.ServerStoppingEvent
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import ru.dbotthepony.kommons.io.DelegateSyncher
|
||||
import ru.dbotthepony.kommons.util.Listenable
|
||||
import ru.dbotthepony.mc.otm.SERVER_IS_LIVE
|
||||
import ru.dbotthepony.mc.otm.block.INeighbourChangeListener
|
||||
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||
import ru.dbotthepony.mc.otm.capability.energy.IMatteryEnergyStorage
|
||||
import ru.dbotthepony.mc.otm.core.ISubscriptable
|
||||
import ru.dbotthepony.mc.otm.core.collect.WeakHashSet
|
||||
import ru.dbotthepony.mc.otm.core.get
|
||||
import ru.dbotthepony.mc.otm.core.immutableList
|
||||
@ -56,9 +56,7 @@ import ru.dbotthepony.mc.otm.core.util.TickList
|
||||
import ru.dbotthepony.mc.otm.core.util.countingLazy
|
||||
import ru.dbotthepony.mc.otm.network.BlockEntitySyncPacket
|
||||
import ru.dbotthepony.mc.otm.network.GenericNetworkChannel
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer
|
||||
import ru.dbotthepony.mc.otm.once
|
||||
import ru.dbotthepony.mc.otm.onceServer
|
||||
import ru.dbotthepony.mc.otm.sometimeServer
|
||||
import java.lang.ref.WeakReference
|
||||
import java.util.*
|
||||
@ -79,7 +77,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
private val sidelessCaps = Reference2ObjectOpenHashMap<Capability<*>, SidelessCap<*>>()
|
||||
protected val tickList = TickList()
|
||||
protected val blockStateChangesCounter = IntCounter()
|
||||
protected val dirtyListeners = ISubscriptable.Impl<Unit>()
|
||||
protected val dirtyListeners = Listenable.Impl<Unit>()
|
||||
private val waitForServerLevel = ArrayList<() -> Unit>()
|
||||
|
||||
private val _droppableContainers = ObjectArraySet<Container>()
|
||||
@ -129,9 +127,6 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
|
||||
open fun tick() {
|
||||
tickList.tick()
|
||||
|
||||
if (synchronizer.isNotEmpty)
|
||||
synchronizeToPlayers(false)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -181,7 +176,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
}
|
||||
}
|
||||
|
||||
interface SideListener<T> : Supplier<LazyOptional<T>>, ISubscriptable<LazyOptional<T>>
|
||||
interface SideListener<T> : Supplier<LazyOptional<T>>, Listenable<LazyOptional<T>>
|
||||
|
||||
inner class Side(val side: RelativeSide) {
|
||||
init {
|
||||
@ -202,9 +197,9 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
}
|
||||
}
|
||||
|
||||
private val listeners = ISubscriptable.Impl<LazyOptional<T>>()
|
||||
private val listeners = Listenable.Impl<LazyOptional<T>>()
|
||||
|
||||
override fun addListener(listener: Consumer<LazyOptional<T>>): ISubscriptable.L {
|
||||
override fun addListener(listener: Consumer<LazyOptional<T>>): Listenable.L {
|
||||
val l = listeners.addListener(listener)
|
||||
if (level is ServerLevel) listener.accept(value)
|
||||
return l
|
||||
@ -488,30 +483,8 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
dirtyListeners.accept(Unit)
|
||||
}
|
||||
|
||||
val synchronizer = FieldSynchronizer {
|
||||
if (isSynchronizing || tickList.ticks != 0)
|
||||
return@FieldSynchronizer
|
||||
|
||||
if (isRemoved) markSynchronizerClean()
|
||||
|
||||
if (level?.isClientSide == false && (_subCache == null || (_subCache ?: throw ConcurrentModificationException()).players.isNotEmpty())) {
|
||||
onceServer {
|
||||
if (!isRemoved) {
|
||||
synchronizeToPlayers(true)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
markSynchronizerClean()
|
||||
}
|
||||
}
|
||||
|
||||
private fun markSynchronizerClean() {
|
||||
synchronizer.markClean()
|
||||
}
|
||||
|
||||
init {
|
||||
synchronizer.defaultEndpoint.markUnused()
|
||||
}
|
||||
val syncher = DelegateSyncher()
|
||||
private val synchers = Object2ObjectArrayMap<ServerPlayer, DelegateSyncher.Remote>()
|
||||
|
||||
override fun setLevel(level: Level) {
|
||||
val old = this.level
|
||||
@ -595,51 +568,29 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
return subs
|
||||
}
|
||||
|
||||
private fun synchronizeToPlayers(calledBySynchronizer: Boolean) {
|
||||
isSynchronizing = true
|
||||
|
||||
try {
|
||||
check(level is ServerLevel) { "Invalid realm or Level is null" }
|
||||
synchronizer.observe()
|
||||
val subscription = subscription
|
||||
|
||||
if (subscription.players.isNotEmpty() && (playerListUpdated || synchronizer.isDirty)) {
|
||||
playerListUpdated = false
|
||||
|
||||
for (player in subscription.players) {
|
||||
if (player !in subscription.veto) {
|
||||
val payload = synchronizer.computeEndpointFor(player).collectNetworkPayload()
|
||||
|
||||
if (payload != null) {
|
||||
GenericNetworkChannel.send(player, BlockEntitySyncPacket(blockPos, payload.array, payload.length))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
synchronizer.markClean()
|
||||
} else if (calledBySynchronizer) {
|
||||
synchronizer.markClean()
|
||||
}
|
||||
} finally {
|
||||
isSynchronizing = false
|
||||
}
|
||||
}
|
||||
|
||||
private class ChunkSubscribers(level: ServerLevel, val chunkPos: Long) {
|
||||
val level = WeakReference(level)
|
||||
val blockEntities = WeakHashSet<MatteryBlockEntity>(linked = true, initialCapacity = 0)
|
||||
val players = ObjectArraySet<ServerPlayer>(0)
|
||||
val veto = ObjectArraySet<ServerPlayer>(0)
|
||||
val blockEntitiesWithObservers = WeakHashSet<MatteryBlockEntity>(linked = true, initialCapacity = 0)
|
||||
private val player2ResubCount = Reference2IntArrayMap<ServerPlayer>()
|
||||
private var isTicking = false
|
||||
|
||||
private fun checkShouldTick() {
|
||||
val shouldTick = blockEntities.isNotEmpty() && players.isNotEmpty()
|
||||
|
||||
if (!shouldTick && isTicking) {
|
||||
isTicking = false
|
||||
tickingMap[level.get()]?.remove(this)
|
||||
} else if (shouldTick && !isTicking) {
|
||||
isTicking = true
|
||||
tickingMap.computeIfAbsent(level.get()) { ArrayList() }.add(this)
|
||||
}
|
||||
}
|
||||
|
||||
operator fun component1() = blockEntities
|
||||
operator fun component2() = players
|
||||
|
||||
val hasObservers: Boolean get() {
|
||||
return blockEntities.any { it.synchronizer.hasObservers }
|
||||
}
|
||||
|
||||
private fun recheckPlayer(player: ServerPlayer) {
|
||||
sometimeServer {
|
||||
if (player in players && !player.hasDisconnected()) {
|
||||
@ -649,8 +600,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
veto.remove(player)
|
||||
|
||||
blockEntities.forEach {
|
||||
it.playerListUpdated = true
|
||||
it.synchronizeToPlayers(false)
|
||||
it.synchers[player] = it.syncher.Remote()
|
||||
}
|
||||
}
|
||||
} else if (player in players && player.hasDisconnected()) {
|
||||
@ -663,6 +613,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
if (players.add(player)) {
|
||||
veto.add(player)
|
||||
recheckPlayer(player)
|
||||
checkShouldTick()
|
||||
} else if (player !in veto) {
|
||||
player2ResubCount[player] = player2ResubCount.getInt(player) + 1
|
||||
LOGGER.debug("{} got subscribed to {} without prior unsubscribing, forcefully resubscribing (this happened {} times)", player, ChunkPos(chunkPos), player2ResubCount.getInt(player))
|
||||
@ -674,15 +625,13 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
fun unsubscribe(player: ServerPlayer, normal: Boolean = true): Boolean {
|
||||
if (players.remove(player)) {
|
||||
veto.remove(player)
|
||||
if (normal) player2ResubCount.removeInt(player)
|
||||
|
||||
blockEntities.forEach {
|
||||
it.synchronizer.removeEndpointFor(player)
|
||||
}
|
||||
|
||||
if (normal) {
|
||||
player2ResubCount.removeInt(player)
|
||||
it.synchers.remove(player)
|
||||
}
|
||||
|
||||
checkShouldTick()
|
||||
return true
|
||||
}
|
||||
|
||||
@ -690,27 +639,18 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
}
|
||||
|
||||
fun subscribe(blockEntity: MatteryBlockEntity) {
|
||||
if (!blockEntities.add(blockEntity)) return
|
||||
|
||||
onceServer {
|
||||
if (!blockEntity.isRemoved && blockEntity in blockEntities) {
|
||||
blockEntity.synchronizeToPlayers(false)
|
||||
if (blockEntities.add(blockEntity)) {
|
||||
players.forEach {
|
||||
if (it !in veto) {
|
||||
blockEntity.synchers[it] = blockEntity.syncher.Remote()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (blockEntity.synchronizer.hasObservers && blockEntity.tickList.ticks == 0) {
|
||||
blockEntitiesWithObservers.add(blockEntity)
|
||||
|
||||
tickingMap
|
||||
.computeIfAbsent(level.get() ?: throw NullPointerException("Level got GCd!")) { WeakHashSet(linked = true, initialCapacity = 2) }
|
||||
.add(this)
|
||||
}
|
||||
}
|
||||
|
||||
fun unsubscribe(blockEntity: MatteryBlockEntity): Boolean {
|
||||
blockEntities.remove(blockEntity)
|
||||
blockEntitiesWithObservers.remove(blockEntity)
|
||||
|
||||
checkShouldTick()
|
||||
return players.isEmpty() && blockEntities.isEmpty()
|
||||
}
|
||||
|
||||
@ -743,7 +683,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
const val LOOT_TABLE_SEED_KEY = RandomizableContainerBlockEntity.LOOT_TABLE_SEED_TAG
|
||||
|
||||
private val playerMap = WeakHashMap<ServerLevel, Long2ObjectOpenHashMap<ChunkSubscribers>>()
|
||||
private val tickingMap = WeakHashMap<ServerLevel, WeakHashSet<ChunkSubscribers>>()
|
||||
private val tickingMap = WeakHashMap<ServerLevel, ArrayList<ChunkSubscribers>>()
|
||||
|
||||
private val vec2Dir = Int2ObjectOpenHashMap<Direction>()
|
||||
private val LOGGER = LogManager.getLogger()
|
||||
@ -809,22 +749,20 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
||||
|
||||
fun postLevelTick(event: LevelTickEvent) {
|
||||
val level = event.level as? ServerLevel ?: return
|
||||
val ticking = tickingMap[level] ?: return
|
||||
|
||||
ticking.removeIf {
|
||||
val shouldRemove = it.blockEntitiesWithObservers.isEmpty()
|
||||
tickingMap[level]?.forEach {
|
||||
it.blockEntities.forEach { be ->
|
||||
be.syncher.observe()
|
||||
|
||||
if (!shouldRemove && it.players.isNotEmpty()) {
|
||||
it.blockEntitiesWithObservers.forEach {
|
||||
it.synchronizeToPlayers(false)
|
||||
be.synchers.entries.forEach { e ->
|
||||
val (player, data) = e
|
||||
val payload = data.write()
|
||||
|
||||
if (payload != null) {
|
||||
GenericNetworkChannel.send(player, BlockEntitySyncPacket(be.blockPos, payload.array, payload.length))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shouldRemove
|
||||
}
|
||||
|
||||
if (ticking.isEmpty()) {
|
||||
tickingMap.remove(level)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,8 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||
import net.minecraftforge.fluids.FluidStack
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler
|
||||
import net.minecraftforge.items.IItemHandler
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.capability.item.CombinedItemHandler
|
||||
import ru.dbotthepony.mc.otm.capability.item.EmptyItemHandler
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
@ -144,11 +146,11 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
savetables.bool(::automatePush, "fluid_${side}_push")
|
||||
}
|
||||
|
||||
var flow by synchronizer.enum(possibleModes, setter = { value, access, setByRemote ->
|
||||
var flow by syncher.enum(possibleModes, setter = { access, value ->
|
||||
require(possibleModes.isSupertype(value)) { "Energy mode $value is not allowed (allowed modes: ${possibleModes.family})" }
|
||||
|
||||
if (access.read() != value) {
|
||||
access.write(value)
|
||||
if (access.get() != value) {
|
||||
access.accept(value)
|
||||
markDirtyFast()
|
||||
|
||||
if (value == FlowDirection.NONE) {
|
||||
@ -180,13 +182,8 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
|
||||
init {
|
||||
waitForServerLevel {
|
||||
redstoneControl.addListener {
|
||||
updateTickerState()
|
||||
}
|
||||
|
||||
neighbour.addListener {
|
||||
updateTickerState()
|
||||
}
|
||||
redstoneControl.addListener(::updateTickerState)
|
||||
neighbour.addListener(::updateTickerState)
|
||||
|
||||
updateTickerState()
|
||||
}
|
||||
@ -384,18 +381,13 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
savetables.bool(::automatePull, "energy_${side}_pull")
|
||||
savetables.bool(::automatePush, "energy_${side}_push")
|
||||
|
||||
dirtyListeners.addListener {
|
||||
dirtyListeners.addListener(Runnable {
|
||||
updateTickerState()
|
||||
}
|
||||
})
|
||||
|
||||
waitForServerLevel {
|
||||
redstoneControl.addListener {
|
||||
updateTickerState()
|
||||
}
|
||||
|
||||
neighbour.addListener {
|
||||
updateTickerState()
|
||||
}
|
||||
redstoneControl.addListener(::updateTickerState)
|
||||
neighbour.addListener(::updateTickerState)
|
||||
|
||||
updateTickerState()
|
||||
}
|
||||
@ -443,11 +435,11 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
}
|
||||
}
|
||||
|
||||
override var energyFlow by synchronizer.enum(possibleModes, setter = { value, access, setByRemote ->
|
||||
override var energyFlow by syncher.enum(possibleModes, setter = { access, value ->
|
||||
require(possibleModes.isSupertype(value)) { "Energy mode $value is not allowed (allowed modes: ${possibleModes.family})" }
|
||||
|
||||
if (access.read() != value) {
|
||||
access.write(value)
|
||||
if (access.get() != value) {
|
||||
access.accept(value)
|
||||
markDirtyFast()
|
||||
|
||||
if (value == FlowDirection.NONE) {
|
||||
@ -462,7 +454,7 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
|
||||
updateTickerState()
|
||||
}
|
||||
})
|
||||
}).delegate
|
||||
|
||||
fun invalidate(force: Boolean = false) {
|
||||
if (force) {
|
||||
@ -611,11 +603,11 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
capController.close()
|
||||
}
|
||||
|
||||
var mode by synchronizer.enum(ItemHandlerMode.DISABLED, setter = { value, access, setByRemote ->
|
||||
var mode by syncher.enum(ItemHandlerMode.DISABLED, setter = { access, value ->
|
||||
require(value in possibleViews) { "View type $value is not allowed (allowed views: $possibleViews)" }
|
||||
|
||||
if (access.read() != value) {
|
||||
access.write(value)
|
||||
if (access.get() != value) {
|
||||
access.accept(value)
|
||||
markDirtyFast()
|
||||
|
||||
if (value == ItemHandlerMode.DISABLED) {
|
||||
@ -633,7 +625,7 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
ItemHandlerMode.BATTERY -> battery!!
|
||||
}
|
||||
}
|
||||
})
|
||||
}).delegate
|
||||
|
||||
var automatePull = false
|
||||
set(value) {
|
||||
@ -671,13 +663,8 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
savetables.enum(::mode, "itemhandler_${side}_mode", ItemHandlerMode::valueOf)
|
||||
|
||||
waitForServerLevel {
|
||||
redstoneControl.addListener {
|
||||
updateTickerState()
|
||||
}
|
||||
|
||||
neighbour.addListener {
|
||||
updateTickerState()
|
||||
}
|
||||
redstoneControl.addListener(::updateTickerState)
|
||||
neighbour.addListener(::updateTickerState)
|
||||
|
||||
updateTickerState()
|
||||
}
|
||||
|
@ -1,26 +1,27 @@
|
||||
package ru.dbotthepony.mc.otm.block.entity
|
||||
|
||||
import it.unimi.dsi.fastutil.booleans.BooleanConsumer
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraftforge.common.util.INBTSerializable
|
||||
import ru.dbotthepony.mc.otm.core.IBooleanSubscriptable
|
||||
import ru.dbotthepony.mc.otm.core.ISubscriptable
|
||||
import ru.dbotthepony.kommons.io.DelegateSyncher
|
||||
import ru.dbotthepony.kommons.util.Listenable
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.core.nbt.mapString
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer
|
||||
import java.util.function.Consumer
|
||||
|
||||
interface IRedstoneControlled {
|
||||
val redstoneControl: AbstractRedstoneControl
|
||||
}
|
||||
|
||||
abstract class AbstractRedstoneControl : INBTSerializable<CompoundTag?>, IBooleanSubscriptable {
|
||||
abstract class AbstractRedstoneControl : INBTSerializable<CompoundTag?>, Listenable<Boolean> {
|
||||
abstract var redstoneSetting: RedstoneSetting
|
||||
abstract var redstoneSignal: Int
|
||||
protected val listeners = IBooleanSubscriptable.Impl()
|
||||
protected val listeners = Listenable.Impl<Boolean>()
|
||||
|
||||
val isBlockedByRedstone: Boolean get() = !redstoneSetting.test(redstoneSignal)
|
||||
|
||||
final override fun addListener(listener: BooleanConsumer): ISubscriptable.L {
|
||||
final override fun addListener(listener: Consumer<Boolean>): Listenable.L {
|
||||
return listeners.addListener(listener)
|
||||
}
|
||||
|
||||
@ -77,38 +78,32 @@ class RedstoneControl(private val valueChanges: (new: Boolean, old: Boolean) ->
|
||||
}
|
||||
|
||||
class SynchronizedRedstoneControl(
|
||||
synchronizer: FieldSynchronizer,
|
||||
synchronizer: DelegateSyncher,
|
||||
private val valueChanges: (new: Boolean, old: Boolean) -> Unit,
|
||||
) : AbstractRedstoneControl() {
|
||||
override var redstoneSetting: RedstoneSetting by synchronizer.enum(RedstoneSetting.LOW, setter = { value, access, setByRemote ->
|
||||
if (access.read() == value) return@enum
|
||||
if (setByRemote) {
|
||||
access.write(value)
|
||||
} else {
|
||||
val old = isBlockedByRedstone
|
||||
access.write(value)
|
||||
val state = isBlockedByRedstone
|
||||
override var redstoneSetting: RedstoneSetting by synchronizer.enum(RedstoneSetting.LOW, setter = { access, value ->
|
||||
if (access.get() == value) return@enum
|
||||
|
||||
if (state != old) {
|
||||
valueChanges.invoke(state, old)
|
||||
listeners.accept(state)
|
||||
}
|
||||
val old = isBlockedByRedstone
|
||||
access.accept(value)
|
||||
val state = isBlockedByRedstone
|
||||
|
||||
if (state != old) {
|
||||
valueChanges.invoke(state, old)
|
||||
listeners.accept(state)
|
||||
}
|
||||
})
|
||||
}).delegate
|
||||
|
||||
override var redstoneSignal: Int by synchronizer.int(0, setter = { value, access, setByRemote ->
|
||||
if (access.readInt() == value) return@int
|
||||
if (setByRemote) {
|
||||
access.write(value)
|
||||
} else {
|
||||
val old = isBlockedByRedstone
|
||||
access.write(value)
|
||||
val state = isBlockedByRedstone
|
||||
override var redstoneSignal: Int by synchronizer.int(0, setter = { access, value ->
|
||||
if (access.get() == value) return@int
|
||||
|
||||
if (state != old) {
|
||||
valueChanges.invoke(state, old)
|
||||
listeners.accept(state)
|
||||
}
|
||||
val old = isBlockedByRedstone
|
||||
access.accept(value)
|
||||
val state = isBlockedByRedstone
|
||||
|
||||
if (state != old) {
|
||||
valueChanges.invoke(state, old)
|
||||
listeners.accept(state)
|
||||
}
|
||||
}).property
|
||||
}).delegate
|
||||
}
|
||||
|
@ -9,7 +9,6 @@ import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.Entity
|
||||
import net.minecraft.world.entity.EquipmentSlot
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.boss.wither.WitherBoss
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.level.Level
|
||||
@ -20,7 +19,8 @@ import net.minecraft.world.level.levelgen.structure.BoundingBox
|
||||
import net.minecraft.world.phys.AABB
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import net.minecraftforge.common.Tags
|
||||
import net.minecraftforge.registries.ForgeRegistries
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.block.BlackHoleBlock
|
||||
import ru.dbotthepony.mc.otm.block.entity.tech.GravitationStabilizerBlockEntity
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
|
||||
@ -37,6 +37,7 @@ import ru.dbotthepony.mc.otm.core.math.getSphericalBlockPositions
|
||||
import ru.dbotthepony.mc.otm.core.math.times
|
||||
import ru.dbotthepony.mc.otm.core.nbt.map
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.core.util.decimal
|
||||
import ru.dbotthepony.mc.otm.matter.MatterManager
|
||||
import ru.dbotthepony.mc.otm.registry.MDamageTypes
|
||||
import ru.dbotthepony.mc.otm.registry.MatteryDamageSource
|
||||
@ -46,9 +47,9 @@ import kotlin.math.roundToInt
|
||||
import kotlin.math.sqrt
|
||||
|
||||
class BlackHoleBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryBlockEntity(MBlockEntities.BLACK_HOLE, p_155229_, p_155230_) {
|
||||
var mass by synchronizer.decimal(BASELINE_MASS, setter = setter@{ mass, field, setByRemote ->
|
||||
if (setByRemote) {
|
||||
field.write(mass)
|
||||
var mass by syncher.decimal(BASELINE_MASS, setter = setter@{ field, mass ->
|
||||
if (level !is ServerLevel) {
|
||||
field.accept(mass)
|
||||
return@setter
|
||||
}
|
||||
|
||||
@ -57,19 +58,19 @@ class BlackHoleBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Mattery
|
||||
return@setter
|
||||
}
|
||||
|
||||
field.write(mass)
|
||||
field.accept(mass)
|
||||
setChanged()
|
||||
updateGravStrength()
|
||||
})
|
||||
|
||||
var gravitationStrength by synchronizer.double(1.0).property
|
||||
var gravitationStrength by syncher.double(1.0).delegate
|
||||
private set
|
||||
var affectedBounds = BoundingBox(0, 0, 0, 1, 1, 1)
|
||||
private set
|
||||
var affectedBoundsAABB: AABB = AABB.of(affectedBounds)
|
||||
private set
|
||||
|
||||
var spinDirection by synchronizer.bool().property
|
||||
var spinDirection by syncher.boolean().delegate
|
||||
|
||||
private var sphereIterator: Iterator<BlockPos>? = null
|
||||
private var sleepTicks = 4
|
||||
|
@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.block.entity.cable
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
@ -23,6 +22,7 @@ import ru.dbotthepony.mc.otm.once
|
||||
import ru.dbotthepony.mc.otm.onceServer
|
||||
import java.util.Collections
|
||||
import java.util.EnumMap
|
||||
import java.util.function.Consumer
|
||||
|
||||
// after some thinking, team decided to settle with IC2's side (techreborn, gregtech, integrated dynamics*, pipez*, p2p tunnels, ...) of implementation,
|
||||
// where cables have no residue capacitance, and never pull/push energy by themselves
|
||||
@ -50,7 +50,7 @@ abstract class EnergyCableBlockEntity(type: BlockEntityType<*>, blockPos: BlockP
|
||||
|
||||
init {
|
||||
waitForServerLevel {
|
||||
neighbour.addListener {
|
||||
neighbour.addListener(Consumer {
|
||||
if (isEnabled) {
|
||||
if (it.isPresent) {
|
||||
if (it.resolve().get() !is CableSide) {
|
||||
@ -62,7 +62,7 @@ abstract class EnergyCableBlockEntity(type: BlockEntityType<*>, blockPos: BlockP
|
||||
updateBlockState(blockRotation.side2Dir(side), it.isPresent || node.neighboursView[GraphNode.link(blockRotation.side2Dir(side))] != null)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,7 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||
import net.minecraftforge.fluids.FluidStack
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import ru.dbotthepony.kommons.util.ListenableDelegate
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
|
||||
import ru.dbotthepony.mc.otm.capability.item.CombinedItemHandler
|
||||
import ru.dbotthepony.mc.otm.capability.fluid.BlockMatteryFluidHandler
|
||||
@ -27,15 +28,14 @@ import ru.dbotthepony.mc.otm.menu.decorative.FluidTankMenu
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
|
||||
class FluidTankBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryDeviceBlockEntity(MBlockEntities.FLUID_TANK, blockPos, blockState) {
|
||||
val fluid = BlockMatteryFluidHandler(ItemsConfig::FLUID_TANK_CAPACITY, synchronizer.Field(FluidStack.EMPTY, FluidStackValueCodec, setter = { value, access, remote ->
|
||||
access.write(value)
|
||||
|
||||
val fluid = BlockMatteryFluidHandler(ItemsConfig::FLUID_TANK_CAPACITY, syncher.Slot(ListenableDelegate.SmartBox(FluidStack.EMPTY, setter = { access, value ->
|
||||
access.accept(value)
|
||||
level?.lightEngine?.checkBlock(blockPos)
|
||||
|
||||
if (!remote) {
|
||||
if (level is ServerLevel) {
|
||||
markDirtyFast()
|
||||
}
|
||||
}))
|
||||
}), FluidStackValueCodec))
|
||||
|
||||
val fillInput = MatteryContainer(::markDirtyFast, 1).also(::addDroppableContainer)
|
||||
val drainInput = MatteryContainer(::markDirtyFast, 1).also(::addDroppableContainer)
|
||||
|
@ -3,12 +3,16 @@ package ru.dbotthepony.mc.otm.block.entity.decorative
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.world.MenuProvider
|
||||
import net.minecraft.world.entity.player.Inventory
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.block.entity.IRedstoneControlled
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
|
||||
import ru.dbotthepony.mc.otm.block.entity.SynchronizedRedstoneControl
|
||||
@ -17,24 +21,23 @@ import ru.dbotthepony.mc.otm.core.math.component1
|
||||
import ru.dbotthepony.mc.otm.core.math.component2
|
||||
import ru.dbotthepony.mc.otm.core.math.component3
|
||||
import ru.dbotthepony.mc.otm.menu.decorative.HoloSignMenu
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.FloatFieldAccess
|
||||
import ru.dbotthepony.mc.otm.once
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import ru.dbotthepony.mc.otm.registry.MBlocks
|
||||
|
||||
class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryBlockEntity(MBlockEntities.HOLO_SIGN, blockPos, blockState), MenuProvider, IRedstoneControlled {
|
||||
override val redstoneControl = SynchronizedRedstoneControl(synchronizer) { _, _ -> setChanged() }
|
||||
override val redstoneControl = SynchronizedRedstoneControl(syncher) { _, _ -> setChanged() }
|
||||
|
||||
var signText by synchronizer.string("", setter = { value, access, remote ->
|
||||
var signText by syncher.string("", setter = { access, value ->
|
||||
setChanged()
|
||||
access.write(value)
|
||||
})
|
||||
access.accept(value)
|
||||
}).delegate
|
||||
|
||||
private fun colorSetter(value: Float, access: FloatFieldAccess, setByRemote: Boolean) {
|
||||
if (access.readFloat() != value) {
|
||||
access.write(value)
|
||||
private fun colorSetter(access: Delegate<Float>, value: Float) {
|
||||
if (access.get() != value) {
|
||||
access.accept(value)
|
||||
|
||||
if (setByRemote) {
|
||||
if (level !is ServerLevel) {
|
||||
markDirtyClientside()
|
||||
} else {
|
||||
markDirtyFast()
|
||||
@ -47,10 +50,10 @@ class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB
|
||||
minecraft.levelRenderer.setBlocksDirty(x, y, z, x, y, z)
|
||||
}
|
||||
|
||||
var textRed by synchronizer.float(1f, setter = ::colorSetter).property
|
||||
var textGreen by synchronizer.float(1f, setter = ::colorSetter).property
|
||||
var textBlue by synchronizer.float(85f / 255f, setter = ::colorSetter).property
|
||||
var textAlpha by synchronizer.float(1f).property
|
||||
var textRed by syncher.float(1f, setter = ::colorSetter).delegate
|
||||
var textGreen by syncher.float(1f, setter = ::colorSetter).delegate
|
||||
var textBlue by syncher.float(85f / 255f, setter = ::colorSetter).delegate
|
||||
var textAlpha by syncher.float(1f).delegate
|
||||
|
||||
var isLocked = false
|
||||
|
||||
|
@ -9,6 +9,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
|
||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import java.util.function.Consumer
|
||||
|
||||
class InfiniteWaterSourceBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryBlockEntity(MBlockEntities.INFINITE_WATER_SOURCE, blockPos, blockState), IFluidHandler {
|
||||
override fun getTanks(): Int {
|
||||
@ -55,7 +56,7 @@ class InfiniteWaterSourceBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
||||
}
|
||||
}
|
||||
|
||||
tracker.addListener { ticker.isEnabled = it.isPresent }
|
||||
tracker.addListener(Consumer { ticker.isEnabled = it.isPresent })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,9 @@ import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
|
||||
import ru.dbotthepony.mc.otm.block.entity.tech.BatteryBankBlockEntity
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
@ -22,7 +25,7 @@ import ru.dbotthepony.mc.otm.menu.matter.MatterCapacitorBankMenu
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
|
||||
class MatterCapacitorBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryDeviceBlockEntity(MBlockEntities.MATTER_CAPACITOR_BANK, p_155229_, p_155230_), IMatterStorage {
|
||||
var gaugeLevel by synchronizer.float().property
|
||||
var gaugeLevel by syncher.float()
|
||||
private set
|
||||
|
||||
val matterNode = SimpleMatterNode(matter = this)
|
||||
@ -123,7 +126,7 @@ class MatterCapacitorBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState)
|
||||
val container = object : MatteryContainer(this::markDirtyFast, BatteryBankBlockEntity.CAPACITY) {
|
||||
override fun setChanged(slot: Int, new: ItemStack, old: ItemStack) {
|
||||
super.setChanged(slot, new, old)
|
||||
capacitorStatus[slot].boolean = new.getCapability(MatteryCapability.MATTER).isPresent
|
||||
capacitorStatus[slot].value = new.getCapability(MatteryCapability.MATTER).isPresent
|
||||
gaugeLevel = storedMatter.percentage(maxStoredMatter)
|
||||
}
|
||||
|
||||
@ -147,7 +150,7 @@ class MatterCapacitorBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState)
|
||||
}))
|
||||
|
||||
val capacitorStatus = immutableList(BatteryBankBlockEntity.CAPACITY) {
|
||||
synchronizer.bool(false)
|
||||
syncher.boolean(false)
|
||||
}
|
||||
|
||||
init {
|
||||
|
@ -11,6 +11,8 @@ import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraftforge.registries.ForgeRegistries
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||
@ -27,6 +29,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||
import ru.dbotthepony.mc.otm.container.UpgradeContainer
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.registryName
|
||||
import ru.dbotthepony.mc.otm.core.util.item
|
||||
import ru.dbotthepony.mc.otm.graph.matter.MatterNode
|
||||
import ru.dbotthepony.mc.otm.matter.IMatterValue
|
||||
import ru.dbotthepony.mc.otm.matter.MatterManager
|
||||
@ -43,7 +46,7 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
||||
private var lastItem: Item? = null
|
||||
private var initialDamage = 0.0
|
||||
|
||||
var visualItemStack by synchronizer.item(observe = false)
|
||||
var visualItemStack by syncher.item()
|
||||
private set
|
||||
|
||||
var visualProgress = 0f
|
||||
|
@ -9,6 +9,8 @@ import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.block.entity.JobContainer
|
||||
import ru.dbotthepony.mc.otm.block.entity.JobStatus
|
||||
import ru.dbotthepony.mc.otm.block.entity.ItemJob
|
||||
@ -26,6 +28,7 @@ import ru.dbotthepony.mc.otm.container.HandlerFilter
|
||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||
import ru.dbotthepony.mc.otm.container.UpgradeContainer
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.util.item
|
||||
import ru.dbotthepony.mc.otm.data.DecimalCodec
|
||||
import ru.dbotthepony.mc.otm.data.UUIDCodec
|
||||
import ru.dbotthepony.mc.otm.data.minRange
|
||||
@ -142,10 +145,10 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
|
||||
visualProgress = 0f
|
||||
}
|
||||
|
||||
var visualItemStack by synchronizer.item(observe = false)
|
||||
var visualItemStack by syncher.item()
|
||||
private set
|
||||
|
||||
var visualProgress by synchronizer.float().property
|
||||
var visualProgress by syncher.float()
|
||||
private set
|
||||
|
||||
var renderRotation = 0f
|
||||
|
@ -7,6 +7,8 @@ import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.block.entity.JobContainer
|
||||
import ru.dbotthepony.mc.otm.block.entity.JobStatus
|
||||
import ru.dbotthepony.mc.otm.block.entity.ItemJob
|
||||
@ -21,6 +23,7 @@ import ru.dbotthepony.mc.otm.config.MachinesConfig
|
||||
import ru.dbotthepony.mc.otm.container.MatteryContainer
|
||||
import ru.dbotthepony.mc.otm.container.HandlerFilter
|
||||
import ru.dbotthepony.mc.otm.container.UpgradeContainer
|
||||
import ru.dbotthepony.mc.otm.core.util.item
|
||||
import ru.dbotthepony.mc.otm.menu.matter.MatterScannerMenu
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import ru.dbotthepony.mc.otm.graph.matter.MatterNode
|
||||
@ -162,10 +165,10 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
|
||||
visualProgress = 0f
|
||||
}
|
||||
|
||||
var visualItemStack by synchronizer.item(observe = false)
|
||||
var visualItemStack by syncher.item()
|
||||
private set
|
||||
|
||||
var visualProgress by synchronizer.float().property
|
||||
var visualProgress by syncher.float()
|
||||
private set
|
||||
|
||||
override fun onJobTick(status: JobStatus<ItemJob>, id: Int) {
|
||||
|
@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import ru.dbotthepony.mc.otm.storage.optics.priority
|
||||
import ru.dbotthepony.mc.otm.storage.optics.powered
|
||||
import ru.dbotthepony.mc.otm.storage.optics.flow
|
||||
import java.util.function.Consumer
|
||||
|
||||
class DriveRackBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.DRIVE_RACK, blockPos, blockState) {
|
||||
override val energy = ProfiledEnergyStorage(WorkerEnergyStorage(this::markDirtyFast, MachinesConfig.DRIVE_RACK))
|
||||
@ -67,9 +68,9 @@ class DriveRackBlockEntity(blockPos: BlockPos, blockState: BlockState) : Mattery
|
||||
savetables.int(::extractPriority)
|
||||
savetables.enum(::mode, map = FlowDirection::valueOf)
|
||||
|
||||
redstoneControl.addListener {
|
||||
redstoneControl.addListener(Consumer {
|
||||
cell.isDetached = it
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun setLevel(level: Level) {
|
||||
|
@ -34,6 +34,7 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import ru.dbotthepony.mc.otm.storage.*
|
||||
import java.math.BigInteger
|
||||
import java.util.*
|
||||
import java.util.function.Consumer
|
||||
import java.util.stream.Stream
|
||||
|
||||
private data class SlotTuple(val slot: Int, val stack: ItemStack)
|
||||
@ -101,24 +102,24 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
||||
savetables.int(::extractPriority)
|
||||
exposeGlobally(MatteryCapability.STORAGE_NODE, cell) { it != RelativeSide.FRONT }
|
||||
|
||||
side(RelativeSide.FRONT).track(ForgeCapabilities.ITEM_HANDLER).addListener {
|
||||
side(RelativeSide.FRONT).track(ForgeCapabilities.ITEM_HANDLER).addListener(Consumer {
|
||||
component?.let(cell::removeStorageComponent)
|
||||
component = if (it.isPresent) {
|
||||
ItemHandlerComponent(it.orThrow()).also { if (!redstoneControl.isBlockedByRedstone) cell.addStorageComponent(it) }
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
redstoneControl.addListener {
|
||||
val component = component ?: return@addListener
|
||||
redstoneControl.addListener(Consumer {
|
||||
val component = component ?: return@Consumer
|
||||
|
||||
if (it) {
|
||||
cell.removeStorageComponent(component)
|
||||
} else {
|
||||
cell.addStorageComponent(component)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
val filter = ItemFilter(MAX_FILTERS) {
|
||||
|
@ -14,6 +14,8 @@ import net.minecraft.world.item.crafting.SmokingRecipe
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.block.entity.ExperienceStorage
|
||||
import ru.dbotthepony.mc.otm.block.entity.JobContainer
|
||||
import ru.dbotthepony.mc.otm.block.entity.JobStatus
|
||||
@ -32,7 +34,9 @@ import ru.dbotthepony.mc.otm.container.UpgradeContainer
|
||||
import ru.dbotthepony.mc.otm.container.balance
|
||||
import ru.dbotthepony.mc.otm.core.collect.filter
|
||||
import ru.dbotthepony.mc.otm.core.collect.maybe
|
||||
import ru.dbotthepony.mc.otm.core.getValue
|
||||
import ru.dbotthepony.mc.otm.core.immutableList
|
||||
import ru.dbotthepony.mc.otm.core.util.item
|
||||
import ru.dbotthepony.mc.otm.menu.tech.PoweredFurnaceMenu
|
||||
import ru.dbotthepony.mc.otm.recipe.MatteryCookingRecipe
|
||||
import ru.dbotthepony.mc.otm.recipe.MicrowaveRecipe
|
||||
@ -60,9 +64,9 @@ sealed class AbstractPoweredFurnaceBlockEntity<P : AbstractCookingRecipe, S : Ma
|
||||
}
|
||||
|
||||
inner class SyncSlot {
|
||||
var inputItem by synchronizer.item(observe = false)
|
||||
var outputItem by synchronizer.item(observe = false)
|
||||
var progress by synchronizer.float().property
|
||||
var inputItem by syncher.item()
|
||||
var outputItem by syncher.item()
|
||||
var progress by syncher.float()
|
||||
var visualRotation = 0f
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,9 @@ import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
import ru.dbotthepony.mc.otm.capability.energy
|
||||
@ -25,14 +28,14 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import java.util.function.Supplier
|
||||
|
||||
class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryDeviceBlockEntity(MBlockEntities.BATTERY_BANK, p_155229_, p_155230_), IMatteryEnergyStorage {
|
||||
var gaugeLevel by synchronizer.float().property
|
||||
var gaugeLevel by syncher.float()
|
||||
private set
|
||||
|
||||
// 6 на 2
|
||||
val container: MatteryContainer = object : MatteryContainer(::setChanged, CAPACITY) {
|
||||
override fun setChanged(slot: Int, new: ItemStack, old: ItemStack) {
|
||||
super.setChanged(slot, new, old)
|
||||
batteryStatus[slot].boolean = new.getCapability(ForgeCapabilities.ENERGY).isPresent
|
||||
batteryStatus[slot].value = new.getCapability(ForgeCapabilities.ENERGY).isPresent
|
||||
gaugeLevel = batteryLevel.percentage(maxBatteryLevel)
|
||||
}
|
||||
|
||||
@ -40,7 +43,7 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte
|
||||
}.also(::addDroppableContainer)
|
||||
|
||||
val batteryStatus = immutableList(CAPACITY) {
|
||||
synchronizer.bool(false)
|
||||
syncher.boolean(false)
|
||||
}
|
||||
|
||||
val itemConfig = ConfigurableItemHandler(inputOutput = container.handler(HandlerFilter.Dischargeable))
|
||||
|
@ -10,6 +10,8 @@ import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.block.tech.EnergyCounterBlock
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
|
||||
import ru.dbotthepony.mc.otm.capability.*
|
||||
@ -23,12 +25,13 @@ import ru.dbotthepony.mc.otm.core.nbt.map
|
||||
import ru.dbotthepony.mc.otm.core.nbt.mapPresent
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.core.util.countingLazy
|
||||
import ru.dbotthepony.mc.otm.core.util.decimal
|
||||
import ru.dbotthepony.mc.otm.menu.tech.EnergyCounterMenu
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import java.util.*
|
||||
|
||||
class EnergyCounterBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryDeviceBlockEntity(MBlockEntities.ENERGY_COUNTER, p_155229_, p_155230_) {
|
||||
var passed by synchronizer.decimal()
|
||||
var passed by syncher.decimal()
|
||||
|
||||
override val blockRotation: BlockRotation by countingLazy(blockStateChangesCounter) {
|
||||
BlockRotation.of(blockState[EnergyCounterBlock.INPUT_DIRECTION])
|
||||
@ -37,7 +40,7 @@ class EnergyCounterBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Mat
|
||||
private val history = Array(10 * 20) { Decimal.ZERO }
|
||||
internal var historyTick = 0
|
||||
|
||||
var lastTick by synchronizer.decimal()
|
||||
var lastTick by syncher.decimal()
|
||||
internal set
|
||||
|
||||
var ioLimit: Decimal? = null
|
||||
|
@ -4,7 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem
|
||||
import com.mojang.blaze3d.vertex.PoseStack
|
||||
import it.unimi.dsi.fastutil.ints.IntAVLTreeSet
|
||||
import it.unimi.dsi.fastutil.ints.IntSet
|
||||
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
|
||||
import net.minecraft.ChatFormatting
|
||||
import net.minecraft.client.model.PlayerModel
|
||||
import net.minecraft.client.player.AbstractClientPlayer
|
||||
@ -62,6 +62,17 @@ import net.minecraftforge.registries.ForgeRegistries
|
||||
import net.minecraftforge.server.command.EnumArgument
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import org.joml.Vector4f
|
||||
import ru.dbotthepony.kommons.collect.ListenableMap
|
||||
import ru.dbotthepony.kommons.collect.ListenableSet
|
||||
import ru.dbotthepony.kommons.io.DelegateSyncher
|
||||
import ru.dbotthepony.kommons.io.IntValueCodec
|
||||
import ru.dbotthepony.kommons.io.RGBCodec
|
||||
import ru.dbotthepony.kommons.io.UUIDValueCodec
|
||||
import ru.dbotthepony.kommons.io.VarIntValueCodec
|
||||
import ru.dbotthepony.kommons.util.ListenableDelegate
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.*
|
||||
import ru.dbotthepony.mc.otm.android.AndroidFeature
|
||||
import ru.dbotthepony.mc.otm.android.AndroidFeatureType
|
||||
@ -91,25 +102,20 @@ import ru.dbotthepony.mc.otm.container.vanishCursedItems
|
||||
import ru.dbotthepony.mc.otm.core.*
|
||||
import ru.dbotthepony.mc.otm.core.collect.UUIDIntModifiersMap
|
||||
import ru.dbotthepony.mc.otm.core.collect.filter
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBColorDFUCodec
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.minus
|
||||
import ru.dbotthepony.mc.otm.core.nbt.getCompoundList
|
||||
import ru.dbotthepony.mc.otm.core.nbt.getIntList
|
||||
import ru.dbotthepony.mc.otm.core.nbt.getStringList
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.core.util.IntValueCodec
|
||||
import ru.dbotthepony.mc.otm.core.util.ItemValueCodec
|
||||
import ru.dbotthepony.mc.otm.core.util.RGBCodec
|
||||
import ru.dbotthepony.mc.otm.core.util.Savetables
|
||||
import ru.dbotthepony.mc.otm.core.util.TickList
|
||||
import ru.dbotthepony.mc.otm.core.util.UUIDValueCodec
|
||||
import ru.dbotthepony.mc.otm.core.util.VarIntValueCodec
|
||||
import ru.dbotthepony.mc.otm.menu.ExopackInventoryMenu
|
||||
import ru.dbotthepony.mc.otm.menu.IItemStackSortingSettings
|
||||
import ru.dbotthepony.mc.otm.network.*
|
||||
import ru.dbotthepony.mc.otm.network.SmokeParticlesPacket.Companion.makeSmoke
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer
|
||||
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
|
||||
import ru.dbotthepony.mc.otm.registry.MDamageTypes
|
||||
import ru.dbotthepony.mc.otm.registry.MItems
|
||||
@ -200,7 +206,12 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
* any differences in field order/types/etc between client and server
|
||||
* will break *everything*
|
||||
*/
|
||||
val synchronizer = FieldSynchronizer()
|
||||
val syncher = DelegateSyncher()
|
||||
|
||||
/**
|
||||
* Remote for "this" player
|
||||
*/
|
||||
val privateSyncherRemote = syncher.Remote()
|
||||
|
||||
/**
|
||||
* For fields that need to be synchronized to everyone
|
||||
@ -209,7 +220,10 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
* any differences in field order/types/etc between client and server
|
||||
* will break *everything*
|
||||
*/
|
||||
val publicSynchronizer = FieldSynchronizer()
|
||||
val publicSyncher = DelegateSyncher()
|
||||
|
||||
val publicSyncherRemote = publicSyncher.Remote()
|
||||
val remoteSynchers = Object2ObjectArrayMap<ServerPlayer, DelegateSyncher.Remote>()
|
||||
|
||||
/**
|
||||
* For data to be stored to and loaded from NBT automatically
|
||||
@ -219,8 +233,8 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
/**
|
||||
* Whenever player has Exopack
|
||||
*/
|
||||
var hasExopack by publicSynchronizer.bool(setter = setter@{ value, access, _ ->
|
||||
access.write(value)
|
||||
var hasExopack by publicSyncher.boolean(setter = setter@{ access, value ->
|
||||
access.accept(value)
|
||||
_exoPackMenu = null
|
||||
|
||||
if (value && ply is ServerPlayer) {
|
||||
@ -228,32 +242,34 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
ExopackObtainedTrigger.trigger(ply)
|
||||
}
|
||||
}
|
||||
}).property
|
||||
})
|
||||
|
||||
/**
|
||||
* Whenever to render Exopack on player
|
||||
*/
|
||||
var isExopackVisible by publicSynchronizer.bool(true).property
|
||||
var isExopackVisible by publicSyncher.boolean(true)
|
||||
|
||||
/**
|
||||
* Whenever to render Exopack glow in dark
|
||||
*/
|
||||
var exopackGlows by publicSynchronizer.bool(true).property
|
||||
var exopackGlows by publicSyncher.boolean(true)
|
||||
|
||||
var exopackColor by publicSynchronizer.Field(null, RGBCodec.nullable)
|
||||
var exopackColor by publicSyncher.add(ListenableDelegate.Box(null), RGBCodec.nullable)
|
||||
|
||||
/**
|
||||
* Tick event schedulers
|
||||
*/
|
||||
val tickList = TickList()
|
||||
|
||||
private val exopackSlotModifierMap: MutableMap<UUID, Int> by synchronizer.Map(
|
||||
// kotlin moment
|
||||
private fun _recomputeModifiers() {
|
||||
exopackSlotModifier.recompute()
|
||||
}
|
||||
|
||||
private val exopackSlotModifierMap = syncher.MapSlot(
|
||||
ListenableMap<UUID, Int>().also { it.addListener(Runnable { _recomputeModifiers() }) },
|
||||
keyCodec = UUIDValueCodec,
|
||||
valueCodec = IntValueCodec,
|
||||
backingMap = HashMap(),
|
||||
callback = {
|
||||
this.exopackSlotModifier.recompute()
|
||||
},
|
||||
)
|
||||
|
||||
/**
|
||||
@ -267,16 +283,16 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
} else {
|
||||
exopackContainer = PlayerMatteryContainer(it)
|
||||
}
|
||||
}, backingMap = this.exopackSlotModifierMap)
|
||||
}, backingMap = this.exopackSlotModifierMap.delegate)
|
||||
|
||||
val regularSlotFilters = immutableList(Inventory.INVENTORY_SIZE) {
|
||||
synchronizer.Field(null, ItemValueCodec.nullable)
|
||||
syncher.add(null, ItemValueCodec.nullable)
|
||||
}
|
||||
|
||||
val slotsChargeFlag by synchronizer.Set(
|
||||
codec = VarIntValueCodec,
|
||||
backingSet = IntAVLTreeSet(),
|
||||
)
|
||||
val slotsChargeFlag = syncher.SetSlot(
|
||||
ListenableSet(IntAVLTreeSet()),
|
||||
VarIntValueCodec,
|
||||
).delegate
|
||||
|
||||
private fun slotChargeToDefault() {
|
||||
// броня
|
||||
@ -311,7 +327,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
}
|
||||
|
||||
value.deserializeNBT(field.serializeNBT())
|
||||
value.addFilterSynchronizer(synchronizer)
|
||||
value.addFilterSynchronizer(syncher)
|
||||
field = value
|
||||
|
||||
_combinedInventory = null
|
||||
@ -373,9 +389,9 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
/**
|
||||
* Whenever Exopack has 3x3 crafting grid upgrade installed
|
||||
*/
|
||||
var isExopackCraftingUpgraded by publicSynchronizer.bool(setter = setter@{ value, access, _ ->
|
||||
if (value != access.readBoolean()) {
|
||||
access.write(value)
|
||||
var isExopackCraftingUpgraded by publicSyncher.boolean(setter = setter@{ access, value ->
|
||||
if (value != access.get()) {
|
||||
access.accept(value)
|
||||
_exoPackMenu = null
|
||||
|
||||
if (value && ply is ServerPlayer) {
|
||||
@ -384,11 +400,11 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
}
|
||||
}
|
||||
}
|
||||
}).property
|
||||
})
|
||||
|
||||
var isExopackEnderAccessInstalled by publicSynchronizer.bool(setter = setter@{ value, access, _ ->
|
||||
if (value != access.readBoolean()) {
|
||||
access.write(value)
|
||||
var isExopackEnderAccessInstalled by publicSyncher.boolean(setter = setter@{ access, value ->
|
||||
if (value != access.get()) {
|
||||
access.accept(value)
|
||||
_exoPackMenu = null
|
||||
|
||||
if (value && ply is ServerPlayer) {
|
||||
@ -397,7 +413,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
}
|
||||
}
|
||||
}
|
||||
}).property
|
||||
})
|
||||
|
||||
private var _exoPackMenu: ExopackInventoryMenu? = null
|
||||
set(value) {
|
||||
@ -441,11 +457,6 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
private var nextDischargeHurt = 20
|
||||
private var nextHealTick = 0
|
||||
|
||||
// players tracking us
|
||||
// stored separately because EntityTracker and ChunkMup, etc are buried deep and
|
||||
// getting them unburied will be a very work intense task
|
||||
private val trackingPlayers = Reference2ObjectOpenHashMap<ServerPlayer, FieldSynchronizer.Endpoint>()
|
||||
|
||||
/**
|
||||
* This returns if player is an Android or will become one on death/sleep/etc
|
||||
*/
|
||||
@ -471,7 +482,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
/**
|
||||
* Whenever player should become an Android once transformation conditions are met (e.g. player dies or sleeps in bed)
|
||||
*/
|
||||
var willBecomeAndroid by publicSynchronizer.bool().property
|
||||
var willBecomeAndroid by publicSyncher.boolean()
|
||||
|
||||
/**
|
||||
* Whenever player is an Android
|
||||
@ -487,14 +498,14 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
*
|
||||
* Android-immune (de)buffs are specified in `data/overdrive_that_matters/tags/mob_effect/android_immune_effects.json`
|
||||
*/
|
||||
var isAndroid by publicSynchronizer.bool().property
|
||||
var isAndroid by publicSyncher.boolean()
|
||||
|
||||
/**
|
||||
* Whenever player has exosuit smelting upgrade
|
||||
*/
|
||||
var isExopackSmeltingInstalled by synchronizer.bool(setter = { value, access, _ ->
|
||||
if (value != access.readBoolean()) {
|
||||
access.write(value)
|
||||
var isExopackSmeltingInstalled by syncher.boolean(setter = { access, value ->
|
||||
if (value != access.get()) {
|
||||
access.accept(value)
|
||||
_exoPackMenu = null
|
||||
|
||||
if (value && ply is ServerPlayer) {
|
||||
@ -503,7 +514,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
}
|
||||
}
|
||||
}
|
||||
}).property
|
||||
})
|
||||
|
||||
inner class SmelterBelt(index: Int) : MachineJobEventLoop<ItemJob>(ItemJob.CODEC) {
|
||||
override val energy: IMatteryEnergyStorage
|
||||
@ -568,12 +579,12 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
/**
|
||||
* [IMatteryEnergyStorage] instance, representing Android' battery charge
|
||||
*/
|
||||
val androidEnergy = BatteryBackedEnergyStorage(ply, synchronizer, AndroidConfig.ANDROID_MAX_ENERGY, AndroidConfig.ANDROID_MAX_ENERGY, true)
|
||||
val androidEnergy = BatteryBackedEnergyStorage(ply, syncher, AndroidConfig.ANDROID_MAX_ENERGY, AndroidConfig.ANDROID_MAX_ENERGY, true)
|
||||
|
||||
/**
|
||||
* [IMatteryEnergyStorage] instance, representing Exopack battery charge
|
||||
*/
|
||||
val exopackEnergy = ProfiledEnergyStorage(BatteryBackedEnergyStorage(ply, synchronizer, Decimal.ZERO, ExopackConfig.ENERGY_CAPACITY, false, onChange = { for (v in smelters) v.notify(MachineJobEventLoop.IdleReason.POWER) }))
|
||||
val exopackEnergy = ProfiledEnergyStorage(BatteryBackedEnergyStorage(ply, syncher, Decimal.ZERO, ExopackConfig.ENERGY_CAPACITY, false, onChange = { for (v in smelters) v.notify(MachineJobEventLoop.IdleReason.POWER) }))
|
||||
|
||||
val exopackChargeSlots = MatteryContainer(4)
|
||||
|
||||
@ -604,7 +615,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
savetables.float(::exopackSmelterExperience, "exoPackSmelterExperience")
|
||||
savetables.bool(::isExopackSmeltingInstalled, "isExoPackSmeltingInstalled")
|
||||
|
||||
savetables.codecNullable(::exopackColor, RGBAColor.CODECRGB)
|
||||
savetables.codecNullable(::exopackColor, RGBColorDFUCodec)
|
||||
savetables.bool(::exopackGlows)
|
||||
|
||||
savetables.stateful(::sortingSettings)
|
||||
@ -612,8 +623,8 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
}
|
||||
|
||||
fun invalidateNetworkState() {
|
||||
synchronizer.invalidate()
|
||||
publicSynchronizer.invalidate()
|
||||
privateSyncherRemote.invalidate()
|
||||
remoteSynchers.values.forEach { it.invalidate() }
|
||||
|
||||
for (instance in research.values) {
|
||||
instance.invalidateNetwork()
|
||||
@ -982,7 +993,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
override fun deserializeNBT(tag: CompoundTag) {
|
||||
savetables.deserializeNBT(tag)
|
||||
|
||||
if (MItems.ExopackUpgrades.INVENTORY_UPGRADE_ENDER_DRAGON.uuid(ItemStack.EMPTY) in exopackSlotModifierMap) {
|
||||
if (MItems.ExopackUpgrades.INVENTORY_UPGRADE_ENDER_DRAGON.uuid(ItemStack.EMPTY) in exopackSlotModifierMap.delegate) {
|
||||
isExopackEnderAccessInstalled = true
|
||||
}
|
||||
|
||||
@ -1318,28 +1329,28 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
|
||||
tickedOnce = true
|
||||
|
||||
val payload = synchronizer.collectNetworkPayload()
|
||||
val payload = privateSyncherRemote.write()
|
||||
|
||||
if (payload != null) {
|
||||
MatteryPlayerNetworkChannel.send(ply, MatteryPlayerFieldPacket(payload, false))
|
||||
}
|
||||
|
||||
val trackingIterator = trackingPlayers.entries.iterator()
|
||||
val trackingIterator = remoteSynchers.entries.iterator()
|
||||
|
||||
for ((ply, endpoint) in trackingIterator) {
|
||||
for ((ply, remote) in trackingIterator) {
|
||||
if (ply.hasDisconnected()) {
|
||||
trackingIterator.remove()
|
||||
continue
|
||||
}
|
||||
|
||||
val payload2 = endpoint.collectNetworkPayload()
|
||||
val payload2 = remote.write()
|
||||
|
||||
if (payload2 != null) {
|
||||
MatteryPlayerNetworkChannel.send(ply, MatteryPlayerFieldPacket(payload2, true, this.ply.uuid))
|
||||
}
|
||||
}
|
||||
|
||||
val payload3 = publicSynchronizer.collectNetworkPayload()
|
||||
val payload3 = publicSyncherRemote.write()
|
||||
|
||||
if (payload3 != null) {
|
||||
MatteryPlayerNetworkChannel.send(ply, MatteryPlayerFieldPacket(payload3, true))
|
||||
@ -1751,14 +1762,14 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
|
||||
fun onStartTracking(event: PlayerEvent.StartTracking) {
|
||||
if (event.target is ServerPlayer) {
|
||||
event.target.matteryPlayer?.let {
|
||||
it.trackingPlayers[event.entity as ServerPlayer] = it.publicSynchronizer.Endpoint()
|
||||
it.remoteSynchers[event.entity as ServerPlayer] = it.publicSyncher.Remote()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun onStopTracking(event: PlayerEvent.StopTracking) {
|
||||
if (event.target is ServerPlayer) {
|
||||
event.target.matteryPlayer?.trackingPlayers?.remove(event.entity as ServerPlayer)
|
||||
event.target.matteryPlayer?.remoteSynchers?.remove(event.entity as ServerPlayer)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,9 @@ import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.ticks.ContainerSingleItem
|
||||
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||
import net.minecraftforge.common.util.INBTSerializable
|
||||
import ru.dbotthepony.kommons.io.DelegateSyncher
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
import ru.dbotthepony.mc.otm.capability.extractEnergy
|
||||
import ru.dbotthepony.mc.otm.capability.receiveEnergy
|
||||
@ -15,14 +18,15 @@ import ru.dbotthepony.mc.otm.core.math.getDecimal
|
||||
import ru.dbotthepony.mc.otm.core.nbt.getItemStack
|
||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer
|
||||
import ru.dbotthepony.mc.otm.core.util.decimal
|
||||
import ru.dbotthepony.mc.otm.core.util.observedItem
|
||||
import ru.dbotthepony.mc.otm.registry.StatNames
|
||||
import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger
|
||||
import ru.dbotthepony.mc.otm.triggers.ExopackBatterySlotTrigger
|
||||
|
||||
class BatteryBackedEnergyStorage(
|
||||
private val ply: Player,
|
||||
synchronizer: FieldSynchronizer,
|
||||
synchronizer: DelegateSyncher,
|
||||
initialCharge: Decimal,
|
||||
maxCharge: Decimal,
|
||||
val isAndroid: Boolean,
|
||||
@ -34,8 +38,8 @@ class BatteryBackedEnergyStorage(
|
||||
private var battery by synchronizer.decimal(initialCharge)
|
||||
private var maxBattery by synchronizer.decimal(maxCharge)
|
||||
|
||||
var item by synchronizer.item(setter = setter@{ value, access, _ ->
|
||||
access.write(value)
|
||||
var item by synchronizer.observedItem(setter = setter@{ access, value ->
|
||||
access.accept(value)
|
||||
|
||||
if (ply is ServerPlayer && isAndroid) {
|
||||
AndroidBatteryTrigger.trigger(ply, value)
|
||||
|
@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.capability.energy
|
||||
import net.minecraftforge.energy.IEnergyStorage
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import java.math.BigInteger
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
|
@ -5,15 +5,17 @@ import net.minecraft.world.item.BlockItem
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraftforge.common.util.INBTSerializable
|
||||
import net.minecraftforge.fluids.FluidStack
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.core.tagNotNull
|
||||
import ru.dbotthepony.mc.otm.network.synchronizer.IMutableField
|
||||
import java.util.function.IntSupplier
|
||||
|
||||
/**
|
||||
* Fluid handler for blocks
|
||||
*/
|
||||
open class BlockMatteryFluidHandler(private val _capacity: IntSupplier, field: IMutableField<FluidStack>) : AbstractMatteryFluidHandler(), INBTSerializable<CompoundTag?> {
|
||||
open class BlockMatteryFluidHandler(private val _capacity: IntSupplier, field: Delegate<FluidStack>) : AbstractMatteryFluidHandler(), INBTSerializable<CompoundTag?> {
|
||||
override var fluid by field
|
||||
|
||||
override val capacity: Int
|
||||
|
@ -4,7 +4,7 @@ import net.minecraftforge.common.capabilities.ICapabilityProvider
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.orNull
|
||||
import ru.dbotthepony.mc.otm.capability.energy.IMatteryEnergyStorage
|
||||
import kotlin.math.roundToInt
|
||||
|
@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.capability.matter
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider
|
||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.orNull
|
||||
import java.util.*
|
||||
import java.util.function.Predicate
|
||||
|
@ -12,7 +12,7 @@ import ru.dbotthepony.mc.otm.capability.matteryPlayer
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.Widgets18
|
||||
import ru.dbotthepony.mc.otm.client.render.is3DContext
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.network.ActivateAndroidFeaturePacket
|
||||
import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel
|
||||
import kotlin.math.roundToInt
|
||||
|
@ -16,7 +16,7 @@ import ru.dbotthepony.mc.otm.capability.matteryPlayer
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.RenderGravity
|
||||
import ru.dbotthepony.mc.otm.client.render.drawArc
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.angleDifference
|
||||
import ru.dbotthepony.mc.otm.core.math.normalizeAngle
|
||||
import ru.dbotthepony.mc.otm.core.util.formatTickDuration
|
||||
|
@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.client.render.sprites.MatteryAtlas
|
||||
import ru.dbotthepony.mc.otm.client.render.sprites.MatterySprite
|
||||
import ru.dbotthepony.mc.otm.config.ClientConfig
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.util.formatPower
|
||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
|
||||
|
@ -9,7 +9,7 @@ import net.minecraft.network.chat.Component
|
||||
import net.minecraft.util.FormattedCharSequence
|
||||
import org.joml.Matrix4f
|
||||
import ru.dbotthepony.mc.otm.core.FloatSupplier
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.component1
|
||||
import ru.dbotthepony.mc.otm.core.math.component2
|
||||
import ru.dbotthepony.mc.otm.core.math.component3
|
||||
|
@ -1,7 +1,7 @@
|
||||
package ru.dbotthepony.mc.otm.client.render
|
||||
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
|
||||
interface IGUIRenderable {
|
||||
/**
|
||||
|
@ -10,7 +10,7 @@ import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.FormattedCharSequence
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import kotlin.math.PI
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
|
@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer
|
||||
import net.minecraft.core.Vec3i
|
||||
import org.joml.Matrix4f
|
||||
import org.joml.Vector3f
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.IAngle
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.Vector
|
||||
import ru.dbotthepony.mc.otm.core.math.rotateAroundPoint
|
||||
import ru.dbotthepony.mc.otm.core.math.rotateAroundThis
|
||||
|
@ -14,9 +14,9 @@ import org.apache.logging.log4j.LogManager
|
||||
import org.joml.Matrix4f
|
||||
import org.lwjgl.opengl.GL11.GL_ALWAYS
|
||||
import org.lwjgl.opengl.GL11.GL_LESS
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayDeque
|
||||
import kotlin.math.PI
|
||||
|
@ -22,18 +22,19 @@ import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel
|
||||
import ru.dbotthepony.mc.otm.core.immutableList
|
||||
import ru.dbotthepony.mc.otm.core.get
|
||||
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.rotate
|
||||
import ru.dbotthepony.mc.otm.core.math.rotateY
|
||||
import ru.dbotthepony.mc.otm.nanoTime
|
||||
import java.util.function.BooleanSupplier
|
||||
import java.util.function.Supplier
|
||||
import kotlin.math.PI
|
||||
|
||||
abstract class BankRenderer<T : MatteryDeviceBlockEntity>(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer<T> {
|
||||
protected abstract fun gaugeLevel(entity: T): Float
|
||||
protected abstract val texture: AbstractMatterySprite
|
||||
protected abstract val models: List<BakedModel>
|
||||
protected abstract fun status(entity: T): List<BooleanSupplier>
|
||||
protected abstract fun status(entity: T): List<Supplier<Boolean>>
|
||||
|
||||
private val random = XoroshiroRandomSource(nanoTime)
|
||||
|
||||
@ -53,7 +54,7 @@ abstract class BankRenderer<T : MatteryDeviceBlockEntity>(private val context: B
|
||||
stack.translate(-0.5f, -0.5f, -0.5f)
|
||||
|
||||
for ((i, model) in models.withIndex()) {
|
||||
if (!status[i].asBoolean) {
|
||||
if (!status[i].get()) {
|
||||
continue
|
||||
}
|
||||
|
||||
@ -124,7 +125,7 @@ class BatteryBankRenderer(context: BlockEntityRendererProvider.Context) : BankRe
|
||||
}
|
||||
}
|
||||
|
||||
override fun status(entity: BatteryBankBlockEntity): List<BooleanSupplier> {
|
||||
override fun status(entity: BatteryBankBlockEntity): List<Supplier<Boolean>> {
|
||||
return entity.batteryStatus
|
||||
}
|
||||
|
||||
@ -151,7 +152,7 @@ class MatterBatteryBankRenderer(context: BlockEntityRendererProvider.Context) :
|
||||
}
|
||||
}
|
||||
|
||||
override fun status(entity: MatterCapacitorBankBlockEntity): List<BooleanSupplier> {
|
||||
override fun status(entity: MatterCapacitorBankBlockEntity): List<Supplier<Boolean>> {
|
||||
return entity.capacitorStatus
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@ import ru.dbotthepony.mc.otm.capability.matteryPlayer
|
||||
import ru.dbotthepony.mc.otm.client.ShiftPressedCond
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.*
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.VECTOR_FORWARD
|
||||
import ru.dbotthepony.mc.otm.core.math.VECTOR_RIGHT
|
||||
import ru.dbotthepony.mc.otm.core.math.VECTOR_UP
|
||||
|
@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.block.entity.tech.EnergyCounterBlockEntity
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.*
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.asAngle
|
||||
import ru.dbotthepony.mc.otm.core.util.formatPower
|
||||
import ru.dbotthepony.mc.otm.core.math.times
|
||||
|
@ -19,7 +19,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler
|
||||
import ru.dbotthepony.mc.otm.block.entity.decorative.FluidTankBlockEntity
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.linearInterpolation
|
||||
import ru.dbotthepony.mc.otm.registry.MBlocks
|
||||
|
||||
|
@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.*
|
||||
import ru.dbotthepony.mc.otm.core.*
|
||||
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.VECTOR_DOWN
|
||||
import ru.dbotthepony.mc.otm.core.math.VECTOR_FORWARD
|
||||
import ru.dbotthepony.mc.otm.core.math.VECTOR_RIGHT
|
||||
|
@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.client.render.RenderGravity
|
||||
import ru.dbotthepony.mc.otm.client.render.draw
|
||||
import ru.dbotthepony.mc.otm.core.get
|
||||
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.rotateWithBlockFacing
|
||||
|
||||
class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer<HoloSignBlockEntity> {
|
||||
|
@ -12,13 +12,13 @@ import net.minecraft.client.renderer.RenderType
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import org.lwjgl.opengl.GL11.GL_ALWAYS
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.IGUIRenderable
|
||||
import ru.dbotthepony.mc.otm.client.render.IUVCoords
|
||||
import ru.dbotthepony.mc.otm.client.render.UVWindingOrder
|
||||
import ru.dbotthepony.mc.otm.client.render.color
|
||||
import ru.dbotthepony.mc.otm.client.render.renderTexturedRect
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.linearInterpolation
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
|
@ -16,6 +16,8 @@ import net.minecraftforge.client.event.ContainerScreenEvent.Render.Background
|
||||
import net.minecraftforge.client.event.ContainerScreenEvent.Render.Foreground
|
||||
import net.minecraftforge.common.MinecraftForge
|
||||
import org.lwjgl.opengl.GL11
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.capability.matteryPlayer
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.moveMousePosScaled
|
||||
|
@ -14,7 +14,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeRectangleButtonPan
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.input.NetworkedStringInputPanel
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.menu.decorative.HoloSignMenu
|
||||
import ru.dbotthepony.mc.otm.registry.MItems
|
||||
|
||||
|
@ -28,7 +28,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.util.ScrollableCanvasPanel
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.map
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.util.CreativeMenuItemComparator
|
||||
import ru.dbotthepony.mc.otm.menu.decorative.PainterMenu
|
||||
|
||||
@ -126,8 +126,8 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) :
|
||||
|
||||
val buttons = ArrayList<RectangleButtonPanel<PainterScreen>>()
|
||||
|
||||
menu.listeners.addListener {
|
||||
if (frame.isRemoved) return@addListener
|
||||
menu.listeners.addListener(Runnable {
|
||||
if (frame.isRemoved) return@Runnable
|
||||
buttons.forEach { it.remove() }
|
||||
buttons.clear()
|
||||
|
||||
@ -186,7 +186,7 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) :
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
DeviceControls(this, frame, itemConfig = menu.itemConfig)
|
||||
|
||||
|
@ -21,8 +21,8 @@ import ru.dbotthepony.mc.otm.client.screen.panels.util.DiscreteScrollBarPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.util.ScrollBarConstants
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.asGetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.core.math.integerDivisionDown
|
||||
import ru.dbotthepony.mc.otm.core.util.ItemSorter
|
||||
import ru.dbotthepony.mc.otm.core.util.formatMatter
|
||||
@ -55,7 +55,7 @@ class MatterPanelScreen(
|
||||
|
||||
val controls = DeviceControls(this, frame)
|
||||
|
||||
controls.sortingButtons(menu.settings::isAscending.asGetterSetter(), menu.settings::sorting.asGetterSetter(), ItemSorter.DEFAULT) {
|
||||
controls.sortingButtons(Delegate.Of(menu.settings::isAscending), Delegate.Of(menu.settings::sorting), ItemSorter.DEFAULT) {
|
||||
for (v in ItemSorter.entries) {
|
||||
add(v, skinElement = v.icon, tooltip = v.title)
|
||||
}
|
||||
@ -65,7 +65,7 @@ class MatterPanelScreen(
|
||||
LargeBooleanRectangleButtonPanel(
|
||||
this,
|
||||
frame,
|
||||
prop = menu::isProvidingTasks.asGetterSetter(),
|
||||
prop = Delegate.Of(menu::isProvidingTasks),
|
||||
iconActive = Widgets18.PLAY,
|
||||
iconInactive = Widgets18.PAUSE,
|
||||
tooltipActive = TranslatableComponent("otm.gui.matter_panel.is_providing_tasks"),
|
||||
|
@ -6,6 +6,7 @@ import it.unimi.dsi.fastutil.floats.FloatConsumer
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import ru.dbotthepony.kommons.math.HSVColor
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.client.CursorType
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
@ -19,8 +20,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.button.AbstractButtonPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.input.TextInputPanel
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.HSVColor
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import java.util.function.Consumer
|
||||
import java.util.function.Supplier
|
||||
import kotlin.math.roundToInt
|
||||
|
@ -14,7 +14,7 @@ import ru.dbotthepony.mc.otm.client.render.RenderGravity
|
||||
import ru.dbotthepony.mc.otm.client.render.determineTooltipPosition
|
||||
import ru.dbotthepony.mc.otm.client.render.sprites.sprite
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.util.DiscreteScrollBarPanel
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.util.formatTickDuration
|
||||
import ru.dbotthepony.mc.otm.core.math.integerDivisionDown
|
||||
|
@ -18,9 +18,9 @@ import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallBooleanRectangleBu
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallRectangleButtonPanel
|
||||
import ru.dbotthepony.mc.otm.compat.cos.CosmeticToggleRenderButton
|
||||
import ru.dbotthepony.mc.otm.compat.cos.isCosmeticArmorLoaded
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.network.DisableExopackGlowPacket
|
||||
import ru.dbotthepony.mc.otm.network.DisplayExopackPacket
|
||||
import ru.dbotthepony.mc.otm.network.EnableExopackGlowPacket
|
||||
@ -57,7 +57,7 @@ private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlaye
|
||||
screen,
|
||||
frame,
|
||||
text = TranslatableComponent("otm.gui.exopack.toggle_visibility"),
|
||||
isChecked = GetterSetter.of(
|
||||
isChecked = Delegate.Of(
|
||||
{
|
||||
matteryPlayer.isExopackVisible
|
||||
},
|
||||
@ -78,7 +78,7 @@ private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlaye
|
||||
screen,
|
||||
frame,
|
||||
text = TranslatableComponent("otm.gui.exopack.toggle_glow"),
|
||||
isChecked = GetterSetter.of(
|
||||
isChecked = Delegate.Of(
|
||||
{
|
||||
matteryPlayer.exopackGlows
|
||||
},
|
||||
|
@ -13,7 +13,7 @@ import ru.dbotthepony.mc.otm.client.render.*
|
||||
import ru.dbotthepony.mc.otm.client.render.sprites.StretchingRectangleElement
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.button.AbstractButtonPanel
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
|
||||
open class FramePanel<out S : Screen>(
|
||||
screen: S,
|
||||
|
@ -5,7 +5,7 @@ import net.minecraft.network.chat.Component
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.RenderGravity
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
|
||||
open class Label<out S : Screen> @JvmOverloads constructor(
|
||||
screen: S,
|
||||
|
@ -3,14 +3,14 @@ package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
import net.minecraft.ChatFormatting
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.network.chat.Component
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.IGUIRenderable
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.value
|
||||
import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback
|
||||
|
||||
abstract class BooleanRectangleButtonPanel<out S : Screen>(
|
||||
@ -20,7 +20,7 @@ abstract class BooleanRectangleButtonPanel<out S : Screen>(
|
||||
y: Float = 0f,
|
||||
width: Float,
|
||||
height: Float,
|
||||
val prop: GetterSetter<Boolean>,
|
||||
val prop: Delegate<Boolean>,
|
||||
var iconActive: IGUIRenderable? = null,
|
||||
var iconInactive: IGUIRenderable? = null,
|
||||
val onChange: ((newValue: Boolean) -> Unit)? = null,
|
||||
|
@ -6,7 +6,7 @@ import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.RenderGravity
|
||||
import ru.dbotthepony.mc.otm.client.render.Widgets18
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import java.util.function.IntConsumer
|
||||
|
||||
open class ButtonPanel<out S : Screen>(
|
||||
|
@ -5,6 +5,8 @@ import net.minecraft.ChatFormatting
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
|
||||
import ru.dbotthepony.mc.otm.block.entity.RedstoneSetting
|
||||
import ru.dbotthepony.mc.otm.capability.FlowDirection
|
||||
@ -24,14 +26,11 @@ import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.util.GridPanel
|
||||
import ru.dbotthepony.mc.otm.config.ClientConfig
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.asGetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.immutableList
|
||||
import ru.dbotthepony.mc.otm.core.math.RelativeSide
|
||||
import ru.dbotthepony.mc.otm.core.util.ItemStackSorter
|
||||
import ru.dbotthepony.mc.otm.core.value
|
||||
import ru.dbotthepony.mc.otm.menu.MatteryMenu
|
||||
import ru.dbotthepony.mc.otm.menu.UpgradeSlots
|
||||
import ru.dbotthepony.mc.otm.menu.input.BooleanInputWithFeedback
|
||||
@ -78,7 +77,7 @@ private class PullPushButton<out S : MatteryScreen<*>, T : Enum<T>>(
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
enum: Class<T>,
|
||||
prop: GetterSetter<T>,
|
||||
prop: Delegate<T>,
|
||||
defaultValue: T,
|
||||
val pullProp: BooleanInputWithFeedback,
|
||||
val pushProp: BooleanInputWithFeedback
|
||||
@ -372,7 +371,7 @@ class DeviceControls<out S : MatteryScreen<*>>(
|
||||
alignButtons()
|
||||
}
|
||||
|
||||
fun addStorageMode(prop: GetterSetter<FlowDirection>) {
|
||||
fun addStorageMode(prop: Delegate<FlowDirection>) {
|
||||
val mode = LargeEnumRectangleButtonPanel(screen, this, prop = prop, defaultValue = FlowDirection.BI_DIRECTIONAL, enum = FlowDirection::class.java)
|
||||
|
||||
mode.add(FlowDirection.INPUT, Widgets18.ONLY_STORE, FlowDirection.INPUT.title)
|
||||
@ -383,7 +382,7 @@ class DeviceControls<out S : MatteryScreen<*>>(
|
||||
addButton(mode)
|
||||
}
|
||||
|
||||
inline fun <reified T : Enum<T>> sortingButtons(ascending: GetterSetter<Boolean>, sorting: GetterSetter<T>, default: T, configurator: LargeEnumRectangleButtonPanel<S, T>.() -> Unit): List<EditablePanel<S>> {
|
||||
inline fun <reified T : Enum<T>> sortingButtons(ascending: Delegate<Boolean>, sorting: Delegate<T>, default: T, configurator: LargeEnumRectangleButtonPanel<S, T>.() -> Unit): List<EditablePanel<S>> {
|
||||
val result = ArrayList<EditablePanel<S>>()
|
||||
|
||||
LargeBooleanRectangleButtonPanel(
|
||||
@ -439,7 +438,7 @@ class DeviceControls<out S : MatteryScreen<*>>(
|
||||
set(value) {}
|
||||
|
||||
private fun makeButtons() {
|
||||
buttons = sortingButtons(input.settings::isAscending.asGetterSetter(), input.settings::sorting.asGetterSetter(), ItemStackSorter.DEFAULT) {
|
||||
buttons = sortingButtons(Delegate.Of(input.settings::isAscending), Delegate.Of(input.settings::sorting), ItemStackSorter.DEFAULT) {
|
||||
for (v in ItemStackSorter.entries) {
|
||||
add(v, v.icon, v.title)
|
||||
}
|
||||
|
@ -1,11 +1,8 @@
|
||||
package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.value
|
||||
import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback
|
||||
|
||||
open class CheckBoxInputPanel<out S : Screen>(
|
||||
|
@ -2,9 +2,9 @@ package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.network.chat.Component
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.Label
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
|
||||
open class CheckBoxLabelPanel<out S : Screen>(
|
||||
screen: S,
|
||||
@ -14,7 +14,7 @@ open class CheckBoxLabelPanel<out S : Screen>(
|
||||
y: Float = 0f,
|
||||
width: Float = CheckBoxPanel.REGULAR_DIMENSIONS + 120f,
|
||||
height: Float = CheckBoxPanel.REGULAR_DIMENSIONS,
|
||||
isChecked: GetterSetter<Boolean> = GetterSetter.box(false)
|
||||
isChecked: Delegate<Boolean> = Delegate.Box(false)
|
||||
) : AbstractCheckBoxLabelPanel<S>(screen, parent, x, y, width, height) {
|
||||
override val checkbox = CheckBoxPanel(screen, this, 0f, 0f, isChecked = isChecked)
|
||||
override val label = Label(screen, this, CheckBoxPanel.REGULAR_DIMENSIONS + 4f, 4f, text = text)
|
||||
|
@ -1,11 +1,11 @@
|
||||
package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.sprites.AbstractMatterySprite
|
||||
import ru.dbotthepony.mc.otm.client.render.WidgetLocation
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
|
||||
open class CheckBoxPanel<out S : Screen>(
|
||||
screen: S,
|
||||
@ -14,7 +14,7 @@ open class CheckBoxPanel<out S : Screen>(
|
||||
y: Float = 0f,
|
||||
width: Float = REGULAR_DIMENSIONS,
|
||||
height: Float = REGULAR_DIMENSIONS,
|
||||
open val isChecked: GetterSetter<Boolean> = GetterSetter.box(false)
|
||||
open val isChecked: Delegate<Boolean> = Delegate.Box(false)
|
||||
) : AbstractButtonPanel<S>(screen, parent, x, y, width, height) {
|
||||
open val IDLE_UNCHECKED: AbstractMatterySprite = Companion.IDLE_UNCHECKED
|
||||
open val IDLE_CHECKED: AbstractMatterySprite = Companion.IDLE_CHECKED
|
||||
|
@ -4,13 +4,15 @@ import com.mojang.blaze3d.platform.InputConstants
|
||||
import net.minecraft.ChatFormatting
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.network.chat.Component
|
||||
import ru.dbotthepony.kommons.io.StreamCodec
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.IGUIRenderable
|
||||
import ru.dbotthepony.mc.otm.client.render.UVWindingOrder
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.*
|
||||
import ru.dbotthepony.mc.otm.core.util.EnumValueCodec
|
||||
import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback
|
||||
import java.util.*
|
||||
import java.util.function.Predicate
|
||||
@ -24,10 +26,10 @@ abstract class EnumRectangleButtonPanel<out S : Screen, T : Enum<T>>(
|
||||
width: Float,
|
||||
height: Float,
|
||||
enum: Class<T>,
|
||||
val prop: GetterSetter<T>,
|
||||
val prop: Delegate<T>,
|
||||
val defaultValue: T,
|
||||
) : RectangleButtonPanel<S>(screen, parent, x, y, width, height, null) {
|
||||
val enum = EnumValueCodec.searchClass(enum)
|
||||
val enum = StreamCodec.Enum.searchClass(enum)
|
||||
private val constants: Array<T> = enum.enumConstants
|
||||
private var isBuilding = true
|
||||
var predicate: Predicate<T> = Predicate { true }
|
||||
|
@ -2,10 +2,10 @@ package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.network.chat.Component
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.render.IGUIRenderable
|
||||
import ru.dbotthepony.mc.otm.client.render.Widgets18
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
|
||||
open class LargeBooleanRectangleButtonPanel<out S : Screen>(
|
||||
screen: S,
|
||||
@ -14,7 +14,7 @@ open class LargeBooleanRectangleButtonPanel<out S : Screen>(
|
||||
y: Float = 0f,
|
||||
width: Float = SIZE,
|
||||
height: Float = SIZE,
|
||||
prop: GetterSetter<Boolean>,
|
||||
prop: Delegate<Boolean>,
|
||||
iconActive: IGUIRenderable? = null,
|
||||
iconInactive: IGUIRenderable? = null,
|
||||
onChange: ((newValue: Boolean) -> Unit)? = null,
|
||||
|
@ -1,11 +1,9 @@
|
||||
package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.render.Widgets18
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.menu.input.IPlayerInputWithFeedback
|
||||
|
||||
open class LargeEnumRectangleButtonPanel<out S : Screen, T : Enum<T>>(
|
||||
screen: S,
|
||||
@ -15,7 +13,7 @@ open class LargeEnumRectangleButtonPanel<out S : Screen, T : Enum<T>>(
|
||||
width: Float = SIZE,
|
||||
height: Float = SIZE,
|
||||
enum: Class<T>,
|
||||
prop: GetterSetter<T>,
|
||||
prop: Delegate<T>,
|
||||
defaultValue: T,
|
||||
) : EnumRectangleButtonPanel<S, T>(screen, parent, x, y, width, height, enum, prop, defaultValue) {
|
||||
final override val IDLE = Widgets18.BUTTON_IDLE
|
||||
|
@ -7,7 +7,7 @@ import ru.dbotthepony.mc.otm.client.render.IGUIRenderable
|
||||
import ru.dbotthepony.mc.otm.client.render.UVWindingOrder
|
||||
import ru.dbotthepony.mc.otm.client.render.Widgets18
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.menu.MatteryMenu
|
||||
|
||||
open class LargeRectangleButtonPanel<out S : Screen>(
|
||||
|
@ -1,10 +1,10 @@
|
||||
package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.render.*
|
||||
import ru.dbotthepony.mc.otm.client.render.sprites.AbstractMatterySprite
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
|
||||
open class SmallBooleanRectangleButtonPanel<out S : Screen>(
|
||||
screen: S,
|
||||
@ -13,7 +13,7 @@ open class SmallBooleanRectangleButtonPanel<out S : Screen>(
|
||||
y: Float = 0f,
|
||||
width: Float = SIZE,
|
||||
height: Float = SIZE,
|
||||
prop: GetterSetter<Boolean>,
|
||||
prop: Delegate<Boolean>,
|
||||
skinElementActive: AbstractMatterySprite? = null,
|
||||
skinElementInactive: AbstractMatterySprite? = null,
|
||||
onChange: ((newValue: Boolean) -> Unit)? = null,
|
||||
|
@ -1,9 +1,9 @@
|
||||
package ru.dbotthepony.mc.otm.client.screen.panels.button
|
||||
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.render.Widgets8
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
|
||||
open class SmallEnumRectangleButtonPanel<out S : Screen, T : Enum<T>>(
|
||||
screen: S,
|
||||
@ -13,7 +13,7 @@ open class SmallEnumRectangleButtonPanel<out S : Screen, T : Enum<T>>(
|
||||
width: Float = SIZE,
|
||||
height: Float = SIZE,
|
||||
enum: Class<T>,
|
||||
prop: GetterSetter<T>,
|
||||
prop: Delegate<T>,
|
||||
defaultValue: T,
|
||||
) : EnumRectangleButtonPanel<S, T>(screen, parent, x, y, width, height, enum, prop, defaultValue) {
|
||||
final override val IDLE = Widgets8.BUTTON_IDLE
|
||||
|
@ -6,6 +6,7 @@ import ru.dbotthepony.mc.otm.client.CursorType
|
||||
import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.menu.MatteryMenu
|
||||
import java.math.BigDecimal
|
||||
import java.util.function.BooleanSupplier
|
||||
@ -13,8 +14,8 @@ import java.util.function.BooleanSupplier
|
||||
open class NetworkNumberInputPanel<out S : Screen> @JvmOverloads constructor(
|
||||
screen: S,
|
||||
parent: EditablePanel<*>?,
|
||||
val networkValue: () -> BigDecimal,
|
||||
val callback: (BigDecimal) -> Unit,
|
||||
val networkValue: () -> Decimal,
|
||||
val callback: (Decimal) -> Unit,
|
||||
val isEnabled: BooleanSupplier = BooleanSupplier { true },
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
@ -25,8 +26,8 @@ open class NetworkNumberInputPanel<out S : Screen> @JvmOverloads constructor(
|
||||
constructor(
|
||||
screen: S,
|
||||
parent: EditablePanel<*>?,
|
||||
widget: MatteryMenu.PlayerInput<BigDecimal>,
|
||||
networkValue: () -> BigDecimal,
|
||||
widget: MatteryMenu.PlayerInput<Decimal>,
|
||||
networkValue: () -> Decimal,
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
width: Float = 0f,
|
||||
@ -69,14 +70,14 @@ open class NetworkNumberInputPanel<out S : Screen> @JvmOverloads constructor(
|
||||
}
|
||||
|
||||
if (nextUpdateFromServer < System.currentTimeMillis()) {
|
||||
getOrCreateWidget().value = networkValue.invoke().toPlainString()
|
||||
getOrCreateWidget().value = networkValue.invoke().toString()
|
||||
inputStr = getOrCreateWidget().value
|
||||
} else if (isEnabled.asBoolean) {
|
||||
if (inputStr != getOrCreateWidget().value) {
|
||||
inputStr = getOrCreateWidget().value
|
||||
|
||||
try {
|
||||
callback.invoke(BigDecimal(inputStr))
|
||||
callback.invoke(Decimal(inputStr))
|
||||
} catch (_: Throwable) { }
|
||||
}
|
||||
}
|
||||
|
@ -2,19 +2,19 @@ package ru.dbotthepony.mc.otm.client.screen.panels.input
|
||||
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.render.Widgets
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.Dock
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.button.RectangleButtonPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.util.HeightControls
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
|
||||
abstract class NumberInputPanel<out S : Screen, N : Number>(
|
||||
screen: S,
|
||||
parent: EditablePanel<*>,
|
||||
val prop: GetterSetter<N>,
|
||||
val prop: Delegate<N>,
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
width: Float = WIDTH,
|
||||
@ -129,7 +129,7 @@ abstract class NumberInputPanel<out S : Screen, N : Number>(
|
||||
abstract class LNumberInputPanel<out S : Screen, N : Number>(
|
||||
screen: S,
|
||||
parent: EditablePanel<*>,
|
||||
prop: GetterSetter<N>,
|
||||
prop: Delegate<N>,
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
width: Float = WIDTH,
|
||||
@ -157,7 +157,7 @@ abstract class LNumberInputPanel<out S : Screen, N : Number>(
|
||||
open class IntInputPanel<out S : Screen>(
|
||||
screen: S,
|
||||
parent: EditablePanel<*>,
|
||||
prop: GetterSetter<Int>,
|
||||
prop: Delegate<Int>,
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
width: Float = WIDTH,
|
||||
@ -185,7 +185,7 @@ open class IntInputPanel<out S : Screen>(
|
||||
open class DecimalInputPanel<out S : Screen>(
|
||||
screen: S,
|
||||
parent: EditablePanel<*>,
|
||||
prop: GetterSetter<Decimal>,
|
||||
prop: Delegate<Decimal>,
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
width: Float = WIDTH,
|
||||
|
@ -28,7 +28,7 @@ import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.addAll
|
||||
import ru.dbotthepony.mc.otm.core.collect.map
|
||||
import ru.dbotthepony.mc.otm.core.collect.reduce
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.milliTime
|
||||
import java.util.function.Predicate
|
||||
import kotlin.math.roundToInt
|
||||
|
@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.render.WidgetLocation
|
||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
|
||||
abstract class AbstractSlotPanel<out S : MatteryScreen<*>>(
|
||||
screen: S,
|
||||
|
@ -1,14 +1,14 @@
|
||||
package ru.dbotthepony.mc.otm.client.screen.panels.slot
|
||||
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
|
||||
open class FilterSlotPanel<out S : MatteryScreen<*>> @JvmOverloads constructor(
|
||||
screen: S,
|
||||
parent: EditablePanel<*>?,
|
||||
val slot: GetterSetter<ItemStack>,
|
||||
val slot: Delegate<ItemStack>,
|
||||
x: Float = 0f,
|
||||
y: Float = 0f,
|
||||
width: Float = SIZE,
|
||||
|
@ -14,10 +14,12 @@ import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.playGuiClickSound
|
||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.menu.UserFilteredSlot
|
||||
|
||||
abstract class UserFilteredSlotPanel<out S : MatteryScreen<*>, out T : Slot>(
|
||||
@ -122,7 +124,7 @@ abstract class UserFilteredSlotPanel<out S : MatteryScreen<*>, out T : Slot>(
|
||||
y: Float = 0f,
|
||||
width: Float = SIZE,
|
||||
height: Float = SIZE,
|
||||
filter: GetterSetter<Item?>
|
||||
filter: Delegate<Item?>
|
||||
): UserFilteredSlotPanel<S, T> {
|
||||
return object : UserFilteredSlotPanel<S, T>(screen, parent, slot, x, y, width, height) {
|
||||
override var slotFilter: Item? by filter
|
||||
|
@ -4,6 +4,7 @@ import net.minecraft.network.chat.Component
|
||||
import net.minecraft.world.entity.player.Inventory
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.client.render.ItemStackIcon
|
||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
@ -16,7 +17,6 @@ import ru.dbotthepony.mc.otm.client.screen.panels.slot.FilterSlotPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.slot.SlotPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.util.GridPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.widget.WideProfiledPowerGaugePanel
|
||||
import ru.dbotthepony.mc.otm.core.asGetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.util.ItemStorageStackSorter
|
||||
import ru.dbotthepony.mc.otm.item.PortableCondensationDriveItem
|
||||
import ru.dbotthepony.mc.otm.menu.storage.DriveViewerMenu
|
||||
@ -35,7 +35,7 @@ class DriveViewerScreen(menu: DriveViewerMenu, inventory: Inventory, title: Comp
|
||||
|
||||
val controls = DeviceControls(this, frame, redstoneConfig = menu.redstoneConfig, energyConfig = menu.energyConfig)
|
||||
|
||||
controls.sortingButtons(menu.settings::isAscending.asGetterSetter(), menu.settings::sorting.asGetterSetter(), ItemStorageStackSorter.DEFAULT) {
|
||||
controls.sortingButtons(Delegate.Of(menu.settings::isAscending), Delegate.Of(menu.settings::sorting), ItemStorageStackSorter.DEFAULT) {
|
||||
for (v in ItemStorageStackSorter.entries) {
|
||||
add(v, v.icon, v.title)
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import net.minecraft.network.chat.Component
|
||||
import net.minecraft.world.entity.player.Inventory
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||
@ -23,7 +24,6 @@ import ru.dbotthepony.mc.otm.client.screen.panels.util.GridPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.widget.WideProfiledPowerGaugePanel
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.asGetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.util.ItemStorageStackSorter
|
||||
import ru.dbotthepony.mc.otm.menu.storage.ItemMonitorMenu
|
||||
import yalter.mousetweaks.api.MouseTweaksDisableWheelTweak
|
||||
@ -52,7 +52,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp
|
||||
|
||||
val controls = DeviceControls(this, frame)
|
||||
|
||||
controls.sortingButtons(menu.settings::ascendingSort.asGetterSetter(), menu.settings::sorting.asGetterSetter(), ItemStorageStackSorter.DEFAULT) {
|
||||
controls.sortingButtons(Delegate.Of(menu.settings::ascendingSort), Delegate.Of(menu.settings::sorting), ItemStorageStackSorter.DEFAULT) {
|
||||
for (v in ItemStorageStackSorter.entries) {
|
||||
add(v, skinElement = v.icon, tooltip = v.title)
|
||||
}
|
||||
@ -83,7 +83,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp
|
||||
|
||||
SmallEnumRectangleButtonPanel(this, arrowLine,
|
||||
enum = ItemMonitorPlayerSettings.IngredientPriority::class.java,
|
||||
prop = menu.settings::ingredientPriority.asGetterSetter(),
|
||||
prop = Delegate.Of(menu.settings::ingredientPriority),
|
||||
defaultValue = ItemMonitorPlayerSettings.IngredientPriority.SYSTEM)
|
||||
.also {
|
||||
it.tooltips.add(TranslatableComponent("otm.gui.item_monitor.refill_source.desc"))
|
||||
@ -104,7 +104,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp
|
||||
|
||||
SmallEnumRectangleButtonPanel(this, resultAndButtons, y = 38f,
|
||||
enum = ItemMonitorPlayerSettings.ResultTarget::class.java,
|
||||
prop = menu.settings::resultTarget.asGetterSetter(),
|
||||
prop = Delegate.Of(menu.settings::resultTarget),
|
||||
defaultValue = ItemMonitorPlayerSettings.ResultTarget.MIXED)
|
||||
.also {
|
||||
it.tooltips.add(TranslatableComponent("otm.gui.item_monitor.result_target.desc"))
|
||||
@ -116,7 +116,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp
|
||||
|
||||
SmallEnumRectangleButtonPanel(this, resultAndButtons, x = 10f, y = 38f,
|
||||
enum = ItemMonitorPlayerSettings.Amount::class.java,
|
||||
prop = menu.settings::craftingAmount.asGetterSetter(),
|
||||
prop = Delegate.Of(menu.settings::craftingAmount),
|
||||
defaultValue = ItemMonitorPlayerSettings.Amount.STACK)
|
||||
.also {
|
||||
it.tooltips.add(TranslatableComponent("otm.gui.item_monitor.amount.desc"))
|
||||
|
@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.slot.EquipmentBatterySlotPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.util.DraggableCanvasPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.widget.WideProfiledPowerGaugePanel
|
||||
import ru.dbotthepony.mc.otm.config.MachinesConfig
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||
import ru.dbotthepony.mc.otm.menu.tech.AndroidStationMenu
|
||||
import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel
|
||||
|
@ -22,7 +22,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||
import ru.dbotthepony.mc.otm.core.TextComponent
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.isNotEmpty
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.linearInterpolation
|
||||
import ru.dbotthepony.mc.otm.core.registryName
|
||||
import ru.dbotthepony.mc.otm.core.util.formatFluidLevel
|
||||
|
@ -10,6 +10,7 @@ import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.client.renderer.GameRenderer
|
||||
import net.minecraft.network.chat.Component
|
||||
import org.lwjgl.opengl.GL11
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.capability.AbstractProfiledStorage
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.ShiftPressedCond
|
||||
|
@ -4,6 +4,7 @@ import it.unimi.dsi.fastutil.ints.IntArrayList
|
||||
import net.minecraft.ChatFormatting
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.network.chat.Component
|
||||
import ru.dbotthepony.kommons.util.value
|
||||
import ru.dbotthepony.mc.otm.capability.AbstractProfiledStorage
|
||||
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
|
||||
import ru.dbotthepony.mc.otm.client.ShiftPressedCond
|
||||
|
@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.compat.jade
|
||||
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters.loc
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
|
||||
object JadeUids {
|
||||
val MATTERY_ENERGY: ResourceLocation = loc("mattery_energy")
|
||||
|
@ -7,7 +7,7 @@ import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity
|
||||
import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys
|
||||
import ru.dbotthepony.mc.otm.compat.jade.JadeUids
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import snownee.jade.api.BlockAccessor
|
||||
import snownee.jade.api.IBlockComponentProvider
|
||||
import snownee.jade.api.IServerDataProvider
|
||||
|
@ -6,7 +6,7 @@ import ru.dbotthepony.mc.otm.block.entity.matter.MatterReconstructorBlockEntity
|
||||
import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys
|
||||
import ru.dbotthepony.mc.otm.compat.jade.JadeUids
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import snownee.jade.api.BlockAccessor
|
||||
import snownee.jade.api.IBlockComponentProvider
|
||||
import snownee.jade.api.IServerDataProvider
|
||||
|
@ -12,7 +12,7 @@ import ru.dbotthepony.mc.otm.compat.jade.JadeUids
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.getDecimal
|
||||
import ru.dbotthepony.mc.otm.core.math.putDecimal
|
||||
import ru.dbotthepony.mc.otm.core.util.formatMatter
|
||||
|
@ -12,7 +12,7 @@ import ru.dbotthepony.mc.otm.compat.jade.JadeUids
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.ifPresentK
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.getDecimal
|
||||
import ru.dbotthepony.mc.otm.core.math.putDecimal
|
||||
import ru.dbotthepony.mc.otm.core.util.formatPower
|
||||
|
@ -7,7 +7,7 @@ import ru.dbotthepony.mc.otm.block.entity.ItemJob
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
|
||||
import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys
|
||||
import ru.dbotthepony.mc.otm.compat.jade.JadeUids
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.nbt.getCompoundList
|
||||
import ru.dbotthepony.mc.otm.core.nbt.getItemStack
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
|
@ -18,7 +18,7 @@ import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.RenderGravity
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.registryName
|
||||
import ru.dbotthepony.mc.otm.recipe.MicrowaveRecipe
|
||||
|
@ -18,7 +18,7 @@ import ru.dbotthepony.mc.otm.client.minecraft
|
||||
import ru.dbotthepony.mc.otm.client.render.RenderGravity
|
||||
import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel
|
||||
import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.kommons.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.TranslatableComponent
|
||||
import ru.dbotthepony.mc.otm.core.registryName
|
||||
import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe
|
||||
|
@ -11,6 +11,7 @@ import net.minecraft.world.inventory.MenuType
|
||||
import net.minecraftforge.eventbus.api.IEventBus
|
||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent
|
||||
import net.minecraftforge.registries.DeferredRegister
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.core.getValue
|
||||
import ru.dbotthepony.mc.otm.menu.MatteryMenu
|
||||
|
@ -3,8 +3,9 @@ package ru.dbotthepony.mc.otm.config
|
||||
import net.minecraftforge.common.ForgeConfigSpec
|
||||
import net.minecraftforge.fml.ModLoadingContext
|
||||
import net.minecraftforge.fml.config.ModConfig
|
||||
import ru.dbotthepony.kommons.util.Delegate
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
import ru.dbotthepony.mc.otm.core.GetterSetter
|
||||
import ru.dbotthepony.mc.otm.core.getValue
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.defineDecimal
|
||||
@ -59,10 +60,10 @@ abstract class AbstractConfig(private val configName: String, private val type:
|
||||
val obj = object : WorkerBalanceValues {
|
||||
override val energyCapacity: Decimal by builder.defineDecimal("ENERGY_CAPACITY", energyStorage, minimum = Decimal.ONE)
|
||||
override val energyThroughput: Decimal by builder.defineDecimal("ENERGY_THROUGHPUT", energyThroughput, minimum = Decimal.ONE)
|
||||
override val energyConsumption: Decimal by (if (energyConsumption == null) GetterSetter.box(Decimal.ZERO) else builder.defineDecimal("ENERGY_CONSUMPTION", energyConsumption, minimum = Decimal.ONE))
|
||||
override val matterCapacity: Decimal by (if (matterCapacity == null) GetterSetter.box(Decimal.ZERO) else builder.defineDecimal("MATTER_CAPACITY", matterCapacity, minimum = Decimal.ONE))
|
||||
override val workTimeMultiplier: Double by (if (workTimeMultiplier == null) GetterSetter.box(1.0) else builder.defineInRange("WORK_TIME_MULTIPLIER", workTimeMultiplier, 0.0))
|
||||
override val maxExperienceStored: Double by (if (maxExperience == null) GetterSetter.box(Double.POSITIVE_INFINITY) else builder.defineInRange("MAX_EXPERIENCE_STORED", maxExperience, 0.0))
|
||||
override val energyConsumption: Decimal by (if (energyConsumption == null) Delegate.Box(Decimal.ZERO) else builder.defineDecimal("ENERGY_CONSUMPTION", energyConsumption, minimum = Decimal.ONE))
|
||||
override val matterCapacity: Decimal by (if (matterCapacity == null) Delegate.Box(Decimal.ZERO) else builder.defineDecimal("MATTER_CAPACITY", matterCapacity, minimum = Decimal.ONE))
|
||||
override val workTimeMultiplier: Double by (if (workTimeMultiplier == null) Delegate.Box(1.0) else builder.defineInRange("WORK_TIME_MULTIPLIER", workTimeMultiplier, 0.0))
|
||||
override val maxExperienceStored: Double by (if (maxExperience == null) Delegate.Box(Double.POSITIVE_INFINITY) else builder.defineInRange("MAX_EXPERIENCE_STORED", maxExperience, 0.0))
|
||||
}
|
||||
|
||||
configurator.invoke(builder)
|
||||
|
@ -1,5 +1,6 @@
|
||||
package ru.dbotthepony.mc.otm.config
|
||||
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.defineDecimal
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package ru.dbotthepony.mc.otm.config
|
||||
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.kommons.util.setValue
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.defineDecimal
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
package ru.dbotthepony.mc.otm.config
|
||||
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.defineDecimal
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
package ru.dbotthepony.mc.otm.config
|
||||
|
||||
import ru.dbotthepony.kommons.util.getValue
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.defineDecimal
|
||||
import ru.dbotthepony.mc.otm.registry.MNames
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user