diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt index 84435e33d..1ba470189 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt @@ -130,13 +130,17 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.generated(MItems.CLEANER_DRONE_KIT, modLocation("item/egg/cleaner")) provider.generated(MItems.ANDROID_MELEE_SPAWN_EGG, modLocation("item/egg/android_melee")) - provider.generatedTiered(MItems.BATTERIES, "battery_tier") + provider.capacitorWithGauge(MItems.BATTERY_CRUDE, 10, "battery_gauge_", modLocation("item/battery_tier0")) + provider.capacitorWithGauge(MItems.BATTERY_BASIC, 10, "battery_gauge_", modLocation("item/battery_tier1")) + provider.capacitorWithGauge(MItems.BATTERY_NORMAL, 10, "battery_gauge_", modLocation("item/battery_tier2")) + provider.capacitorWithGauge(MItems.BATTERY_DENSE, 10, "battery_gauge_", modLocation("item/battery_tier3")) + provider.capacitorWithGauge(MItems.BATTERY_CAPACITOR, 10, "battery_gauge_", modLocation("item/battery_tier4")) provider.generated(MItems.BATTERY_CREATIVE) - provider.generated(MItems.PROCEDURAL_BATTERY, modLocation("item/battery_procedural")) + provider.capacitorWithGauge(MItems.PROCEDURAL_BATTERY, 9, "battery_procedural_gauge_", modLocation("item/battery_procedural")) - provider.generated(MItems.MATTER_CAPACITOR_BASIC, modLocation("item/matter_capacitor_tier1")) - provider.generated(MItems.MATTER_CAPACITOR_NORMAL, modLocation("item/matter_capacitor_tier2")) - provider.generated(MItems.MATTER_CAPACITOR_DENSE, modLocation("item/matter_capacitor_tier3")) + provider.capacitorWithGauge(MItems.MATTER_CAPACITOR_BASIC, 8, "matter_capacitor_gauge_", modLocation("item/matter_capacitor_tier1")) + provider.capacitorWithGauge(MItems.MATTER_CAPACITOR_NORMAL, 8, "matter_capacitor_gauge_", modLocation("item/matter_capacitor_tier2")) + provider.capacitorWithGauge(MItems.MATTER_CAPACITOR_DENSE, 8, "matter_capacitor_gauge_", modLocation("item/matter_capacitor_tier3")) provider.generated(MItems.MATTER_CAPACITOR_CREATIVE) provider.generated(MItems.MachineUpgrades.Basic.BLANK, modLocation("item/machine_upgrade_tier1")) @@ -184,8 +188,8 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.upgrade(MItems.MachineUpgrades.Creative.MATTER_STORAGE_FLAT_SMALL, "matter", "creative") - provider.generated(MItems.QUANTUM_BATTERY) - provider.generated(MItems.QUANTUM_CAPACITOR) + provider.capacitorWithGauge(MItems.QUANTUM_BATTERY, 10, "battery_gauge_") + provider.capacitorWithGauge(MItems.QUANTUM_CAPACITOR, 10, "battery_gauge_") provider.generated(MItems.QUANTUM_BATTERY_CREATIVE) provider.generated(MItems.PATTERN_DRIVE_NORMAL, modLocation("item/pattern_drive_tier1")) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt index a29a176f6..63b25454e 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt @@ -143,6 +143,33 @@ class MatteryItemModelProvider(event: GatherDataEvent) : ItemModelProvider(event .texture("layer1", modLocation("item/machine_upgrade_icon_$upgradeType")) } + fun capacitorWithGauge(item: Item, fillTextures: Int, gaugePrefix: String, baseTexture: ResourceLocation? = null) = exec { + val path = item.registryName!!.path + val texture = baseTexture ?: modLocation("item/$path") + + val empty = withExistingParent("${path}_empty", GENERATED) + .texture("layer0", texture) + + val basic = withExistingParent(path, GENERATED) + .texture("layer0", texture) + .texture("layer1", modLocation("item/${gaugePrefix}$fillTextures")) + .override() + .predicate(modLocation("capacitor_gauge"), 0f) + .model(empty) + .end() + + for (i in 1 .. fillTextures) { + val model = withExistingParent("${path}_fill_$i", GENERATED) + .texture("layer0", texture) + .texture("layer1", modLocation("item/${gaugePrefix}$i")) + + basic.override() + .predicate(modLocation("capacitor_gauge"), i.toFloat() / fillTextures.toFloat()) + .model(model) + .end() + } + } + companion object { val ARMOR_TRIM_MATERIALS = listOf("quartz", "iron", "netherite", "redstone", "copper", "gold", "emerald", "diamond", "lapis", "amethyst") val GENERATED = ResourceLocation("minecraft", "item/generated") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt index 2dcac2393..02909696a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt @@ -348,6 +348,17 @@ abstract class MatteryBlockEntity(type: BlockEntityType<*>, pos: BlockPos, state private var cache: BlockCapabilityCache? = null private val listeners = Listenable.Impl() + private val lookupProvider = Supplier { + if (isRemoved) + return@Supplier null + + val get = cache?.capability + provider = Supplier { get } + return@Supplier get + } + + private var provider: Supplier = lookupProvider + override fun addListener(listener: Consumer): Listenable.L { return listeners.addListener(listener) } @@ -358,23 +369,21 @@ abstract class MatteryBlockEntity(type: BlockEntityType<*>, pos: BlockPos, state } override fun get(): T? { - if (isRemoved) - return null - - return cache?.capability + return provider.get() } val isPresent: Boolean - get() = cache?.capability != null + get() = get() != null val isEmpty: Boolean - get() = cache?.capability == null + get() = get() == null fun rebuildCache() { if (!SERVER_IS_LIVE) return val level = level as? ServerLevel val creationVersion = ++currentVersion + provider = lookupProvider if (level == null) { cache = null @@ -388,12 +397,21 @@ abstract class MatteryBlockEntity(type: BlockEntityType<*>, pos: BlockPos, state { !isRemoved || creationVersion != currentVersion }, // IllegalStateException("Do not call getCapability on an invalid cache or from the invalidation listener!") // what a shame. - { if (SERVER_IS_LIVE) onceServer { if (!isRemoved && creationVersion == currentVersion) listeners.accept(cache?.capability) } }) + { + provider = lookupProvider + if (SERVER_IS_LIVE) onceServer { if (!isRemoved && creationVersion == currentVersion) listeners.accept(get()) } + }) onceServer { - if (!isRemoved && creationVersion == currentVersion) listeners.accept(cache?.capability) + if (!isRemoved && creationVersion == currentVersion) listeners.accept(get()) } } + + fun removeCache() { + cache = null + currentVersion++ + provider = Supplier { null } + } } val syncher = SynchableGroup() @@ -424,6 +442,7 @@ abstract class MatteryBlockEntity(type: BlockEntityType<*>, pos: BlockPos, state override fun setRemoved() { super.setRemoved() + capabilityCaches.forEach { it.removeCache() } unsubscribe() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableBlockEntity.kt index e3cd1261b..37024d687 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableBlockEntity.kt @@ -115,7 +115,7 @@ abstract class EnergyCableBlockEntity(type: BlockEntityType<*>, blockPos: BlockP val sides get() = energySides - val currentlyTransferringTo = ObjectArraySet>() + val currentlyTransferringTo = ObjectArraySet>() override fun onNeighbour(link: Link) { if (link is DirectionLink) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt index 6b4155906..edc9e5c2c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt @@ -74,8 +74,8 @@ private class LinkedPriorityQueue> { } class EnergyCableGraph : GraphNodeList() { - private val livelyNodes = HashSet>() - private val livelyNodesList = ArrayList>() + private val livelyNodes = HashSet>() + private val livelyNodesList = ArrayList>() fun addLivelyNode(node: EnergyCableBlockEntity.Node) { when (contains(node)) { @@ -83,7 +83,7 @@ class EnergyCableGraph : GraphNodeList throw IllegalArgumentException("$node does not belong to $this") ContainsStatus.CONTAINS -> { for (dir in RelativeSide.entries) { - val pair = node to dir + val pair = node to node.sides[dir]!! if (livelyNodes.add(pair)) { livelyNodesList.add(pair) @@ -589,7 +589,7 @@ class EnergyCableGraph : GraphNodeList Decimal.ZERO) { + if (matterRatio == Decimal.ZERO && matterTransferred > Decimal.ZERO) { + // transferring very little matter, transfer this time for free isWorking = true - energy.extractEnergy(energyRate * minRatio, false) - matter.extractMatter(capability.receiveMatter(rate * minRatio, false), false) + matter.extractMatter(capability.receiveMatter(matter.storedMatter, false), false) workProgress = ((capability.storedMatter - initialCapacity!!) / capability.maxStoredMatter).toFloat() slot.setChanged() + } else { + val minRatio = minOf(matterRatio, energyRatio) + + if (minRatio > Decimal.ZERO) { + isWorking = true + energy.extractEnergy(energyRate * minRatio, false) + matter.extractMatter(capability.receiveMatter(rate * minRatio, false), false) + workProgress = ((capability.storedMatter - initialCapacity!!) / capability.maxStoredMatter).toFloat() + slot.setChanged() + } } } else { if (spitItemsWhenCantWork) { @@ -262,20 +272,28 @@ class MatterBottlerBlockEntity(blockPos: BlockPos, blockState: BlockState) : initialCapacity = initialCapacity ?: it.storedMatter hasCapacitors = true - val rate = MachinesConfig.MatterBottler.RATE * (1.0 + upgrades.speedBonus) - val energyRate = MachinesConfig.MatterBottler.VALUES.energyConsumption * (1.0 + upgrades.speedBonus) + val rate = MachinesConfig.MatterBottler.RATE * (Decimal.ONE + upgrades.speedBonus.toDecimal()) + val energyRate = MachinesConfig.MatterBottler.VALUES.energyConsumption * (Decimal.ONE + upgrades.speedBonus.toDecimal()) val energyRatio = if (energyRate <= Decimal.ZERO) Decimal.ONE else energy.extractEnergy(energyRate, true) / energyRate - val matterRatio = matter.receiveMatter(it.extractMatterChecked(rate, true), true) / rate + val matterExtracted = matter.receiveMatter(it.extractMatterChecked(rate, true), true) + val matterRatio = matterExtracted / rate - val minRatio = minOf(energyRatio, matterRatio) - - if (minRatio > Decimal.ZERO) { + if (matterRatio == Decimal.ZERO && matterExtracted > Decimal.ZERO) { + // very little matter extracted, extract this one for free any = true - energy.extractEnergy(energyRate * energyRatio, false) - matter.receiveMatter(it.extractMatterChecked(rate * minRatio, false), false) - + matter.receiveMatter(it.extractMatterChecked(matterExtracted, false), false) workProgress = 1f - (it.storedMatter / initialCapacity!!).toFloat() + } else { + val minRatio = minOf(energyRatio, matterRatio) + + if (minRatio > Decimal.ZERO) { + any = true + energy.extractEnergy(energyRate * energyRatio, false) + matter.receiveMatter(it.extractMatterChecked(rate * minRatio, false), false) + + workProgress = 1f - (it.storedMatter / initialCapacity!!).toFloat() + } } break diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt index d28d2caf3..92cc40e3a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt @@ -163,6 +163,13 @@ class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem { return matter(stack) >= ItemsConfig.MATTER_DUST_CAPACITY } + fun makeStack(matterValue: Decimal = Decimal.ONE, count: Int = 1): ItemStack { + val stack = ItemStack(this, count) + matter(stack, matterValue) + + return stack + } + override fun overrideStackedOnOther( pStack: ItemStack, pSlot: Slot, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt index 7bad07d07..62ce5522a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt @@ -1,6 +1,7 @@ package ru.dbotthepony.mc.otm.network import io.netty.buffer.ByteBuf +import net.minecraft.core.Direction import net.minecraft.core.UUIDUtil import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.codec.ByteBufCodecs @@ -10,6 +11,7 @@ import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.mc.otm.container.ItemFilter +import ru.dbotthepony.mc.otm.util.math.RelativeSide import ru.dbotthepony.mc.otm.util.readDecimal import ru.dbotthepony.mc.otm.util.writeDecimal import ru.dbotthepony.mc.otm.util.readBlockType @@ -35,6 +37,8 @@ object StreamCodecs { val RESOURCE_LOCATION = ResourceLocation.STREAM_CODEC.wrap() val BLOCK_STATE: MatteryStreamCodec = ByteBufCodecs.idMapper(Block.BLOCK_STATE_REGISTRY).wrap() val BLOCK_TYPE = MatteryStreamCodec.Of(FriendlyByteBuf::writeBlockType, FriendlyByteBuf::readBlockType) + val RELATIVE_SIDE = MatteryStreamCodec.Enum(RelativeSide::class.java) + val DIRECTION = MatteryStreamCodec.Enum(Direction::class.java) val RGBA: MatteryStreamCodec = StreamCodec.of( { s, v -> s.writeFloat(v.red); s.writeFloat(v.green); s.writeFloat(v.blue); s.writeFloat(v.alpha) }, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/syncher/DynamicSynchableGroup.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/syncher/DynamicSynchableGroup.kt index 4d72a71c7..bfe1c759e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/syncher/DynamicSynchableGroup.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/syncher/DynamicSynchableGroup.kt @@ -10,29 +10,39 @@ import java.io.Closeable import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.atomic.AtomicBoolean +/** + * Constructs a new [DynamicSynchableGroup] where [T] is itself an [ISynchable] + */ +fun DynamicSynchableGroup(reader: RegistryFriendlyByteBuf.() -> T, writer: T.(RegistryFriendlyByteBuf) -> Unit): DynamicSynchableGroup { + return DynamicSynchableGroup(reader, { this }, writer) +} + /** * Syncher group/set, which deals with synchables of only one type, and which are created and removed * on remote (e.g. server adding and removing synchables at will), which makes it distinct from * [SynchableGroup], in which attached synchables are created/removed manually on both sides. */ -class DynamicSynchableGroup( +class DynamicSynchableGroup( /** * Constructs new [T] instance locally, when remote created one. * Data written by [writer] must be read here, if there is any. */ private val reader: RegistryFriendlyByteBuf.() -> T, + /** + * Gets an [ISynchable] out of value [T] for synching state + */ + private val synchable: T.() -> ISynchable, + /** * Allows to write additional data to network stream during * first-time networking of [T] to remote */ - private val writer: T.(RegistryFriendlyByteBuf) -> Unit = {} + private val writer: T.(RegistryFriendlyByteBuf) -> Unit = {}, ) : ISynchable, MutableSet { - constructor(factory: () -> T) : this({ factory() }, {}) - private inner class RemoteState(val listener: Runnable) : IRemoteState { private inner class RemoteSlot(val slot: Slot, fromConstructor: Boolean) : Runnable, Closeable { - val remoteState = slot.synchable.createRemoteState(this) + val remoteState = synchable(slot.value).createRemoteState(this) val isDirty = AtomicBoolean(true) var isRemoved = false private set @@ -114,7 +124,7 @@ class DynamicSynchableGroup( firstTime.forEach { stream.writeByte(ADD_ENTRY) stream.writeVarInt(it.slot.id) - writer(it.slot.synchable, stream) + writer(it.slot.value, stream) } firstTime.clear() @@ -177,10 +187,10 @@ class DynamicSynchableGroup( } } - private data class Slot(val synchable: T, val id: Int) + private data class Slot(val value: T, val id: Int) private val remoteStates = ArrayList() - private val value2slot = HashMap>() + private val value2slot = LinkedHashMap>() private val id2slot = Int2ObjectOpenHashMap>() private val idAllocator = IDAllocator() @@ -199,7 +209,7 @@ class DynamicSynchableGroup( REMOVE_ENTRY -> { val id = stream.readVarInt() val slot = checkNotNull(id2slot.remove(id)) { "No such slot with ID: $id" } - check(value2slot.remove(slot.synchable) == value2slot) + check(value2slot.remove(slot.value) == value2slot) remoteStates.forEach { it.remove(slot) } } @@ -212,7 +222,7 @@ class DynamicSynchableGroup( if (id2slot.containsKey(id)) { val slot = id2slot.remove(id)!! - check(value2slot.remove(slot.synchable) == value2slot) + check(value2slot.remove(slot.value) == value2slot) remoteStates.forEach { it.remove(slot) } } @@ -225,7 +235,7 @@ class DynamicSynchableGroup( SYNC_ENTRY -> { val id = stream.readVarInt() val slot = checkNotNull(id2slot.get(id)) { "No such slot with ID: $id" } - slot.synchable.read(stream) + synchable(slot.value).read(stream) } CLEAR -> { @@ -299,7 +309,7 @@ class DynamicSynchableGroup( override fun next(): T { val slot = parent.next() last = KOptional(slot) - return slot.synchable + return slot.value } override fun remove() { @@ -313,11 +323,7 @@ class DynamicSynchableGroup( } override fun remove(element: T): Boolean { - if (element !in value2slot) { - return false - } - - val slot = value2slot.remove(element)!! + val slot = value2slot.remove(element) ?: return false checkNotNull(id2slot.remove(slot.id)) remoteStates.forEach { it.remove(slot) } idAllocator.release(slot.id) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt index dd959dd51..64b3969a9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -36,6 +36,7 @@ import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock import ru.dbotthepony.mc.otm.block.decorative.ComputerTerminalBlock import ru.dbotthepony.mc.otm.block.decorative.StarChairBlock import ru.dbotthepony.mc.otm.block.decorative.TritaniumPressurePlate +import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.matteryEnergy import ru.dbotthepony.mc.otm.client.MatteryGUI import ru.dbotthepony.mc.otm.util.ResourceLocation @@ -319,6 +320,21 @@ object MRegistry : IBlockItemRegistryAcceptor { val tag = stack.getOrDefault(MDataComponentTypes.Configurator.CONFIGURATION, CompoundTag()) if (tag.isEmpty) 0f else 1f } + + for (item in MItems.MATTER_CAPACITORS) { + ItemProperties.register(item, ResourceLocation(OverdriveThatMatters.MOD_ID, "capacitor_gauge")) { stack, _, _, _ -> + val cap = stack.getCapability(MatteryCapability.MATTER_ITEM) ?: return@register 1f + (cap.storedMatter / cap.maxStoredMatter).toFloat() + } + } + + for (item in MItems.ALL_BATTERIES) { + ItemProperties.register(item, ResourceLocation(OverdriveThatMatters.MOD_ID, "capacitor_gauge")) { stack, _, _, _ -> + val energy = stack.matteryEnergy ?: return@register 1f + + (energy.batteryLevel / energy.maxBatteryLevel).toFloat() + } + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt index 9163895d9..866c8a86c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt @@ -223,7 +223,7 @@ private fun addMainCreativeTabItems(consumer: CreativeModeTab.Output) { accept(MItems.GRILL.values) - // accept(MItems.MATTER_DUST) + accept(MItems.MATTER_DUST.makeStack()) accept(MItems.TRITANIUM_ORE) accept(MItems.DEEPSLATE_TRITANIUM_ORE) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/util/RandomUtils.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/util/RandomUtils.kt index b4a152927..33602b9b5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/util/RandomUtils.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/util/RandomUtils.kt @@ -78,6 +78,17 @@ fun IntArray.shuffle(random: RandomSource): IntArray { return this } +fun Array.shuffle(random: RandomSource): Array { + for (i in lastIndex downTo 1) { + val j = random.nextInt(i + 1) + val copy = this[i] + this[i] = this[j] + this[j] = copy + } + + return this +} + fun L.shuffle(random: RandomSource): L { for (i in lastIndex downTo 1) { val j = random.nextInt(i + 1) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/util/math/BlockRotation.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/util/math/BlockRotation.kt index 216c46405..ba2eecd3d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/util/math/BlockRotation.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/util/math/BlockRotation.kt @@ -20,7 +20,21 @@ operator fun BlockPos.plus(other: BlockRotation): BlockPos { } enum class RelativeSide(val default: Direction) { - FRONT(Direction.NORTH), BACK(Direction.SOUTH), LEFT(Direction.WEST), RIGHT(Direction.EAST), TOP(Direction.UP), BOTTOM(Direction.DOWN) + FRONT(Direction.NORTH), BACK(Direction.SOUTH), LEFT(Direction.WEST), RIGHT(Direction.EAST), TOP(Direction.UP), BOTTOM(Direction.DOWN); + + companion object { + @JvmStatic + fun defaultOf(direction: Direction): RelativeSide { + return when (direction) { + Direction.DOWN -> BOTTOM + Direction.UP -> TOP + Direction.NORTH -> FRONT + Direction.SOUTH -> BACK + Direction.WEST -> LEFT + Direction.EAST -> RIGHT + } + } + } } /** diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_1.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_1.png new file mode 100644 index 000000000..cf364706d Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_1.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_10.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_10.png new file mode 100644 index 000000000..ce5b2666d Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_10.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_2.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_2.png new file mode 100644 index 000000000..4815bb435 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_2.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_3.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_3.png new file mode 100644 index 000000000..07408dba9 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_3.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_4.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_4.png new file mode 100644 index 000000000..cdda38e13 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_4.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_5.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_5.png new file mode 100644 index 000000000..d0c4ca6d6 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_5.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_6.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_6.png new file mode 100644 index 000000000..5f1552046 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_6.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_7.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_7.png new file mode 100644 index 000000000..495ebefbc Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_7.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_8.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_8.png new file mode 100644 index 000000000..30718eb5a Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_8.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_9.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_9.png new file mode 100644 index 000000000..37715862f Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_gauge_9.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural.png index afdf29101..b3b1043a3 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_1.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_1.png new file mode 100644 index 000000000..7ba3c3c4d Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_1.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_2.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_2.png new file mode 100644 index 000000000..8b5bc570e Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_2.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_3.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_3.png new file mode 100644 index 000000000..5eb06cc74 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_3.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_4.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_4.png new file mode 100644 index 000000000..70450c03f Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_4.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_5.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_5.png new file mode 100644 index 000000000..8c0cd5ce9 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_5.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_6.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_6.png new file mode 100644 index 000000000..c30cabcb7 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_6.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_7.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_7.png new file mode 100644 index 000000000..c62b25269 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_7.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_8.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_8.png new file mode 100644 index 000000000..2a7391311 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_8.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_9.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_9.png new file mode 100644 index 000000000..fa37a3c6a Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_procedural_gauge_9.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier0.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier0.png index 9892d8e51..d0ce5a475 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier0.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier0.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier1.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier1.png index 1fee5af1d..e5a33f3c5 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier1.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier1.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier2.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier2.png index d8fbe8ca0..742068645 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier2.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier2.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier3.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier3.png index 892c1097a..2fcd20d79 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier3.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier3.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier4.png b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier4.png index 54a0104ff..febf757c8 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier4.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/battery_tier4.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_1.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_1.png new file mode 100644 index 000000000..64428f359 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_1.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_2.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_2.png new file mode 100644 index 000000000..f0f560b92 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_2.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_3.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_3.png new file mode 100644 index 000000000..59ad4e415 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_3.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_4.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_4.png new file mode 100644 index 000000000..259e88443 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_4.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_5.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_5.png new file mode 100644 index 000000000..f3281b834 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_5.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_6.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_6.png new file mode 100644 index 000000000..49241e961 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_6.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_7.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_7.png new file mode 100644 index 000000000..ee270f646 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_7.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_8.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_8.png new file mode 100644 index 000000000..4e4b63564 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_gauge_8.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier0.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier0.png index 2bb6e4571..fa28d455d 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier0.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier0.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier1.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier1.png index d19259474..eaadbd348 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier1.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier1.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier2.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier2.png index 773c51f07..15fae90cd 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier2.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier2.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier3.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier3.png index d12d5a1da..bfc1cec47 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier3.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier3.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier4.png b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier4.png index f39082528..533101fc2 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier4.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/matter_capacitor_tier4.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_battery.png b/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_battery.png index 0c9f47982..d2da511c5 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_battery.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_battery.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_capacitor.png b/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_capacitor.png index ac0dee6d9..8e38228dc 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_capacitor.png and b/src/main/resources/assets/overdrive_that_matters/textures/item/quantum_capacitor.png differ