diff --git a/build.gradle.kts b/build.gradle.kts index b08081996..de8377dc3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -193,7 +193,7 @@ dependencies { compileOnly(fg.deobf("mezz.jei:jei-${jei_mc_version}-forge-api:${jei_version}")) //runtimeOnly(fg.deobf("mezz.jei:jei-${jei_mc_version}-forge:${jei_version}")) - //runtimeOnly(fg.deobf("curse.maven:jade-324717:${jade_id}")) + implementation(fg.deobf("curse.maven:jade-324717:${jade_id}")) //runtimeOnly(fg.deobf("curse.maven:configured-457570:${configured_id}")) compileOnly(fg.deobf("curse.maven:resourceful-lib-570073:${resourceful_lib_id}")) diff --git a/gradle.properties b/gradle.properties index 36f394177..eaa8ca684 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ jei_mc_version=1.20 curios_mc_version=1.20 forge_gradle_version=[6.0,6.2) -forge_version=47.0.19 +forge_version=47.1.0 mixingradle_version=0.7.33 mixin_version=0.8.5 @@ -30,7 +30,7 @@ ad_astra_id=4594155 botarium_id=4594094 resourceful_lib_id=4598948 resourceful_config_id=4576455 -jade_id=4573193 +jade_id=4614153 configured_id=4462894 kotlin_for_forge_version=3.1.0 diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 6cb9a002e..71590fef0 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -146,6 +146,7 @@ private fun misc(provider: MatteryLanguageProvider) { gui("exopack.toggle_glow", "Glows in dark") gui("exopack.change_color", "Customize color") gui("exopack.change_color2", "Remove color") + gui("exopack.go_curios", "Open Curios inventory") gui("exopack.probe1", "This little device feels unnatural to touch, it is almost certainly resilient to any possible attempt to break it open.") gui("exopack.probe2", "There is fingerprint reader built into one of sides which gently glow when touched.") @@ -799,6 +800,21 @@ private fun gui(provider: MatteryLanguageProvider) { } } +private fun jade(provider: MatteryLanguageProvider) { + with(provider.english) { + jadeloc("matter_storage", "Matter Storage") + jadeloc("mattery_energy", "Energy Storage") + jadeloc("mattery_worker", "Machine Job Progress") + jadeloc("matter_bottler", "Matter Bottler Mode") + jadeloc("matter_reconstructor", "Matter Reconstructor Progress") + + jade("mode", "Mode: %s") + + jade("matter_bottler.mode.fill", "Filling") + jade("matter_bottler.mode.drain", "Emptying") + } +} + fun AddEnglishLanguage(provider: MatteryLanguageProvider) { decoratives(provider) sounds(provider) @@ -813,6 +829,8 @@ fun AddEnglishLanguage(provider: MatteryLanguageProvider) { research(provider) gui(provider) + jade(provider) + with(provider.english) { add("itemGroup.otm", "Overdrive That Matters") add("itemGroup.otm_decorative", "Overdrive That Matters Decorative") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt index bd7aa1ec9..9da3b9f2a 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt @@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.android.AndroidFeatureType import ru.dbotthepony.mc.otm.android.AndroidResearch import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.registry.objects.ColoredDecorativeBlock private fun researchString(key: AndroidResearchType): String { @@ -104,6 +105,9 @@ class MatteryLanguageProvider(private val gen: DataGenerator) { fun sound(key: String, value: String) = slave.add("otm.sound.$key", value) fun sound(key: SoundEvent, value: String) = slave.add("otm.sound.${key.location.path}", value) + fun jade(key: String, value: String) = slave.add("otm.jade.$key", value) + fun jadeloc(key: String, value: String) = slave.add("config.jade.plugin_${DataGen.MOD_ID}.$key", value) + inner class Prepended(path: String) { val path = "$path." constructor(vararg path: String) : this(path.joinToString(".")) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 6fbffacf8..ff0aed63d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -154,6 +154,7 @@ private fun misc(provider: MatteryLanguageProvider) { gui("exopack.toggle_glow", "Свечение в темноте") gui("exopack.change_color", "Изменить окраску") gui("exopack.change_color2", "Убрать окраску") + gui("exopack.go_curios", "Открыть инвентарь Curios") gui("exopack.probe1", "Данное маленькое устройство необычно на ощупь, а так же неприступно для любых попыток вскрыть.") gui("exopack.probe2", "На одной из сторон данного устройства находится сканер отпечатка, который тускло загорается при касании.") @@ -800,6 +801,21 @@ private fun gui(provider: MatteryLanguageProvider) { } } +private fun jade(provider: MatteryLanguageProvider) { + with(provider.russian) { + jadeloc("matter_storage", "Хранилище материи") + jadeloc("mattery_energy", "Хранилище энергии") + jadeloc("mattery_worker", "Прогресс работы механизма") + jadeloc("matter_bottler", "Режим бутилировщика материи") + jadeloc("matter_reconstructor", "Прогресс материального реконструктора") + + jade("mode", "Режим: %s") + + jade("matter_bottler.mode.fill", "Заполнение") + jade("matter_bottler.mode.drain", "Опустошение") + } +} + fun AddRussianLanguage(provider: MatteryLanguageProvider) { decoratives(provider) blocks(provider) @@ -811,4 +827,5 @@ fun AddRussianLanguage(provider: MatteryLanguageProvider) { research(provider) death(provider) androidFeatures(provider) + jade(provider) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt index ba365952a..a45fd8958 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt @@ -126,6 +126,8 @@ class MatterCapacitorBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) capacitorStatus[slot].boolean = new.getCapability(MatteryCapability.MATTER).isPresent gaugeLevel = (storedMatter / maxStoredMatter).toFloat() } + + override fun getMaxStackSize(): Int = 1 }.also(::addDroppableContainer) val itemConfig = ConfigurableItemHandler(inputOutput = container.handler(object : HandlerFilter { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt index 59230312f..1e4e0a821 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt @@ -54,9 +54,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : super.setChanged(slot, new, old) } - override fun getMaxStackSize(): Int { - return 1 - } + override fun getMaxStackSize(): Int = 1 }.also(::addDroppableContainer) private fun updateBlockstate() { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt index f610bbe08..8e429535c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt @@ -35,6 +35,8 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte batteryStatus[slot].boolean = new.getCapability(ForgeCapabilities.ENERGY).isPresent gaugeLevel = batteryLevel.percentage(maxBatteryLevel) } + + override fun getMaxStackSize(): Int = 1 }.also(::addDroppableContainer) val batteryStatus = immutableList(CAPACITY) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt index 8a54ddce1..93e07d358 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt @@ -51,6 +51,7 @@ object Widgets18 { val CROSS = miscGrid.next() val FORWARD_SLASH = miscGrid.next() val RETURN_ARROW_LEFT = miscGrid.next() + val CURIOS_INVENTORY = miscGrid.next() private val slotBgGrid = WidgetLocation.SLOT_BACKGROUNDS.grid(4, 4) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt index 802182da8..9dc4547ee 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoPackInventoryScreen.kt @@ -23,6 +23,8 @@ import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.TallHorizontalProfiledPowerGaugePanel import ru.dbotthepony.mc.otm.client.setMousePos import ru.dbotthepony.mc.otm.client.shouldOpenVanillaInventory +import ru.dbotthepony.mc.otm.compat.curios.isCuriosLoaded +import ru.dbotthepony.mc.otm.compat.curios.openCuriosScreen import ru.dbotthepony.mc.otm.core.math.integerDivisionDown import ru.dbotthepony.mc.otm.menu.ExoPackInventoryMenu import ru.dbotthepony.mc.otm.network.ExoPackMenuOpen @@ -235,7 +237,7 @@ class ExoPackInventoryScreen(menu: ExoPackInventoryMenu) : MatteryScreen frame.y += movePixels moveMousePosScaled(y = movePixels) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt index e99c1f020..50802c1be 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/curios/CuriosCompat.kt @@ -4,7 +4,10 @@ import com.google.common.collect.Streams import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack +import net.minecraftforge.api.distmarker.Dist import net.minecraftforge.fml.ModList +import net.minecraftforge.fml.loading.FMLEnvironment +import net.minecraftforge.network.PacketDistributor import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.container.awareStream @@ -16,6 +19,8 @@ import top.theillusivec4.curios.api.CuriosApi import top.theillusivec4.curios.api.event.SlotModifiersUpdatedEvent import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot import top.theillusivec4.curios.common.inventory.CurioSlot +import top.theillusivec4.curios.common.network.NetworkHandler +import top.theillusivec4.curios.common.network.client.CPacketOpenCurios import java.util.stream.Stream import kotlin.collections.ArrayList @@ -28,6 +33,10 @@ fun onCuriosSlotModifiersUpdated(event: SlotModifiersUpdatedEvent) { event.entity.matteryPlayer?.recreateExoPackMenu() } +fun openCuriosScreen(carriedStack: ItemStack = ItemStack.EMPTY) { + if (FMLEnvironment.dist.isClient) NetworkHandler.INSTANCE.send(PacketDistributor.SERVER.noArg(), CPacketOpenCurios(carriedStack)) +} + private fun Player.getCuriosSlotsImpl(): List> { val handler = getCapability(MatteryCapability.CURIOS_INVENTORY).orNull() ?: return listOf() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/JadeCompatData.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/JadeCompatData.kt new file mode 100644 index 000000000..7678283fb --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/JadeCompatData.kt @@ -0,0 +1,29 @@ +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 + +object JadeUids { + val MATTERY_ENERGY: ResourceLocation = loc("mattery_energy") + val MATTER_STORAGE: ResourceLocation = loc("matter_storage") + val MATTERY_WORKER: ResourceLocation = loc("mattery_worker") + + val MATTER_BOTTLER: ResourceLocation = loc("matter_bottler") + val MATTER_RECONSTRUCTOR: ResourceLocation = loc("matter_reconstructor") +} + +object JadeTagKeys { + val MATTERY_ENERGY_DATA = "otmJadeMatteryEnergyData" + val MATTER_STORAGE_DATA = "otmJadeMatterStorageData" + val MATTERY_WORKER_DATA = "otmJadeMatteryWorkerData" + + val MATTER_BOTTLER_DATA = "otmJadeMatterBottlerData" + val MATTER_RECONSTRUCTOR_DATA = "otmJadeMatterReconstructorData" +} + +object JadeColors { + val ENERGY_COLOR = RGBAColor(231, 232, 0) + val ENERGY_COLOR2 = RGBAColor(192, 193, 0) + val MATTER_COLOR = RGBAColor(71, 255, 187) +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/JadePlugin.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/JadePlugin.kt new file mode 100644 index 000000000..d5ca7cba5 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/JadePlugin.kt @@ -0,0 +1,38 @@ +package ru.dbotthepony.mc.otm.compat.jade + +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.entity.BlockEntity +import ru.dbotthepony.mc.otm.block.MatteryBlock +import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity +import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity +import ru.dbotthepony.mc.otm.block.entity.matter.MatterReconstructorBlockEntity +import ru.dbotthepony.mc.otm.block.entity.matter.MatterReplicatorBlockEntity +import ru.dbotthepony.mc.otm.block.entity.matter.MatterScannerBlockEntity +import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock +import ru.dbotthepony.mc.otm.block.matter.MatterReconstructorBlock +import ru.dbotthepony.mc.otm.block.matter.MatterReplicatorBlock +import ru.dbotthepony.mc.otm.block.matter.MatterScannerBlock +import ru.dbotthepony.mc.otm.compat.jade.providers.* +import snownee.jade.api.IWailaClientRegistration +import snownee.jade.api.IWailaCommonRegistration +import snownee.jade.api.IWailaPlugin +import snownee.jade.api.WailaPlugin + +@WailaPlugin +class JadePlugin : IWailaPlugin { + override fun register(reg: IWailaCommonRegistration) { + reg.registerBlockDataProvider(MatterStorageProvider, BlockEntity::class.java) + reg.registerBlockDataProvider(MatteryEnergyProvider, BlockEntity::class.java) + reg.registerBlockDataProvider(MatteryWorkerProvider, MatteryWorkerBlockEntity::class.java) + reg.registerBlockDataProvider(MatterBottlerProvider, MatterBottlerBlockEntity::class.java) + reg.registerBlockDataProvider(MatterReconstructorProvider, MatterReconstructorBlockEntity::class.java) + } + + override fun registerClient(reg: IWailaClientRegistration) { + reg.registerBlockComponent(MatteryEnergyProvider, Block::class.java) + reg.registerBlockComponent(MatterStorageProvider, Block::class.java) + reg.registerBlockComponent(MatteryWorkerProvider, MatteryBlock::class.java) + reg.registerBlockComponent(MatterBottlerProvider, MatterBottlerBlock::class.java) + reg.registerBlockComponent(MatterReconstructorProvider, MatterReconstructorBlock::class.java) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterBottlerProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterBottlerProvider.kt new file mode 100644 index 000000000..9ac8d29bf --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterBottlerProvider.kt @@ -0,0 +1,67 @@ +package ru.dbotthepony.mc.otm.compat.jade.providers + +import net.minecraft.nbt.CompoundTag +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.block.entity.WorkerState +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 snownee.jade.api.BlockAccessor +import snownee.jade.api.IBlockComponentProvider +import snownee.jade.api.IServerDataProvider +import snownee.jade.api.ITooltip +import snownee.jade.api.config.IPluginConfig +import snownee.jade.api.ui.BoxStyle + +object MatterBottlerProvider : IBlockComponentProvider, IServerDataProvider { + override fun getUid(): ResourceLocation = JadeUids.MATTER_BOTTLER + + override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { + if (accessor.blockEntity is MatterBottlerBlockEntity) { + val bottler = accessor.blockEntity as MatterBottlerBlockEntity + + val bottlerData = CompoundTag() + bottlerData.putBoolean("isBottling", bottler.isBottling) + bottlerData.putBoolean("isIdling", accessor.blockState.getValue(WorkerState.SEMI_WORKER_STATE) !== WorkerState.WORKING) + bottlerData.putFloat("workProgress", bottler.getWorkProgress()) + data.put(JadeTagKeys.MATTER_BOTTLER_DATA, bottlerData) + } + } + + override fun appendTooltip(tooltip: ITooltip, accessor: BlockAccessor, config: IPluginConfig) { + val data = accessor.serverData + + if (!data.contains(JadeTagKeys.MATTER_BOTTLER_DATA)) return + val bottlerData = data.getCompound(JadeTagKeys.MATTER_BOTTLER_DATA) + + val elementHelper = tooltip.elementHelper + tooltip.add( + elementHelper.text( + TranslatableComponent( + "otm.jade.mode", + if (bottlerData.getBoolean("isBottling")) + TranslatableComponent("otm.jade.matter_bottler.mode.fill") + else + TranslatableComponent("otm.jade.matter_bottler.mode.drain") + ) + ) + ) + + if (!data.getBoolean("isIdling")) { + val workProgress = data.getFloat("workProgress") + val style = elementHelper.progressStyle().color(RGBAColor.WHITE.toARGB()) + + tooltip.add( + elementHelper.progress( + workProgress, + null, + style, + BoxStyle.DEFAULT, + true + ) + ) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterReconstructorProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterReconstructorProvider.kt new file mode 100644 index 000000000..bbe6cece3 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterReconstructorProvider.kt @@ -0,0 +1,62 @@ +package ru.dbotthepony.mc.otm.compat.jade.providers + +import net.minecraft.nbt.CompoundTag +import net.minecraft.resources.ResourceLocation +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 snownee.jade.api.BlockAccessor +import snownee.jade.api.IBlockComponentProvider +import snownee.jade.api.IServerDataProvider +import snownee.jade.api.ITooltip +import snownee.jade.api.config.IPluginConfig +import snownee.jade.api.ui.BoxStyle + +object MatterReconstructorProvider : IBlockComponentProvider, IServerDataProvider { + override fun getUid(): ResourceLocation = JadeUids.MATTER_RECONSTRUCTOR + + override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { + if (accessor.blockEntity is MatterReconstructorBlockEntity) { + val reconstructor = accessor.blockEntity as MatterReconstructorBlockEntity + + val item = reconstructor.repairContainer.get(0) + + if (!item.isEmpty && item.isDamageableItem && item.maxDamage != 0) { + val reconstructorData = CompoundTag() + + reconstructorData.putInt("damage", item.maxDamage - item.damageValue) + reconstructorData.putInt("maxDamage", item.maxDamage) + + data.put(JadeTagKeys.MATTER_RECONSTRUCTOR_DATA, reconstructorData) + } + } + } + + override fun appendTooltip(tooltip: ITooltip, accessor: BlockAccessor, config: IPluginConfig) { + val data = accessor.serverData + + if (!data.contains(JadeTagKeys.MATTER_RECONSTRUCTOR_DATA)) return + val reconstructorData = data.getCompound(JadeTagKeys.MATTER_RECONSTRUCTOR_DATA) + + val damage = reconstructorData.getInt("damage") + val maxDamage = reconstructorData.getInt("maxDamage") + + val ratio = damage.toFloat() / maxDamage.toFloat() + + tooltip.add( + tooltip.elementHelper.progress( + ratio, + TranslatableComponent( + "item.durability", + damage, + maxDamage + ), + tooltip.elementHelper.progressStyle().color(RGBAColor.DARK_GREEN.toARGB()).textColor(RGBAColor.WHITE.toARGB()), + BoxStyle.DEFAULT, + true + ) + ) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterStorageProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterStorageProvider.kt new file mode 100644 index 000000000..1ed43911c --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterStorageProvider.kt @@ -0,0 +1,64 @@ +package ru.dbotthepony.mc.otm.compat.jade.providers + +import net.minecraft.nbt.CompoundTag +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.capability.MatteryCapability +import ru.dbotthepony.mc.otm.compat.jade.JadeColors +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.ifPresentK +import ru.dbotthepony.mc.otm.core.math.Decimal +import ru.dbotthepony.mc.otm.core.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 +import snownee.jade.api.BlockAccessor +import snownee.jade.api.IBlockComponentProvider +import snownee.jade.api.IServerDataProvider +import snownee.jade.api.ITooltip +import snownee.jade.api.config.IPluginConfig +import snownee.jade.api.ui.BoxStyle + +object MatterStorageProvider : IBlockComponentProvider, IServerDataProvider { + override fun getUid(): ResourceLocation = JadeUids.MATTER_STORAGE + + override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { + accessor.blockEntity?.getCapability(MatteryCapability.MATTER)?.ifPresentK { + val matterData = CompoundTag() + + matterData.putDecimal("storedMatter", it.storedMatter) + matterData.putDecimal("maxStoredMatter", it.maxStoredMatter) + + data.put(JadeTagKeys.MATTER_STORAGE_DATA, matterData) + } + } + + override fun appendTooltip(tooltip: ITooltip, accessor: BlockAccessor, config: IPluginConfig) { + val data = accessor.serverData + if (!data.contains(JadeTagKeys.MATTER_STORAGE_DATA)) return + + val matterData = data.getCompound(JadeTagKeys.MATTER_STORAGE_DATA) + val storedMatter = matterData.getDecimal("storedMatter") + val maxStoredMatter = matterData.getDecimal("maxStoredMatter") + + val ratio = if (maxStoredMatter.isZero) 0f else (storedMatter / maxStoredMatter).coerceIn(Decimal.ZERO, Decimal.ONE).toFloat() + val style = tooltip.elementHelper.progressStyle() + .color(JadeColors.MATTER_COLOR.toARGB()) + .textColor(RGBAColor.WHITE.toARGB()) + + tooltip.add( + tooltip.elementHelper.progress( + ratio, + TranslatableComponent( + "otm.gui.level", + storedMatter.formatMatter(), + maxStoredMatter.formatMatter() + ), + style, + BoxStyle.DEFAULT, + true + ) + ) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatteryEnergyProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatteryEnergyProvider.kt new file mode 100644 index 000000000..586c5ed2d --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatteryEnergyProvider.kt @@ -0,0 +1,62 @@ +package ru.dbotthepony.mc.otm.compat.jade.providers + +import net.minecraft.nbt.CompoundTag +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.capability.MatteryCapability +import ru.dbotthepony.mc.otm.compat.jade.JadeColors +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.ifPresentK +import ru.dbotthepony.mc.otm.core.math.Decimal +import ru.dbotthepony.mc.otm.core.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 +import snownee.jade.api.* +import snownee.jade.api.config.IPluginConfig +import snownee.jade.api.ui.BoxStyle + +object MatteryEnergyProvider : IBlockComponentProvider, IServerDataProvider { + override fun getUid(): ResourceLocation = JadeUids.MATTERY_ENERGY + + override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { + accessor.blockEntity?.getCapability(MatteryCapability.ENERGY)?.ifPresentK { + val energyData = CompoundTag() + + energyData.putDecimal("batteryLevel", it.batteryLevel) + energyData.putDecimal("maxBatteryLevel", it.maxBatteryLevel) + + data.put(JadeTagKeys.MATTERY_ENERGY_DATA, energyData) + } + } + + override fun appendTooltip(tooltip: ITooltip, accessor: BlockAccessor, config: IPluginConfig) { + val data = accessor.serverData + + if (!data.contains(JadeTagKeys.MATTERY_ENERGY_DATA)) return + val energyData = data.getCompound(JadeTagKeys.MATTERY_ENERGY_DATA) + + val batteryLevel = energyData.getDecimal("batteryLevel") + val maxBatteryLevel = energyData.getDecimal("maxBatteryLevel") + + val ratio = if (maxBatteryLevel.isZero) 0f else (batteryLevel / maxBatteryLevel).coerceIn(Decimal.ZERO, Decimal.ONE).toFloat() + val style = tooltip.elementHelper.progressStyle() + .color(JadeColors.ENERGY_COLOR.toARGB(), JadeColors.ENERGY_COLOR2.toARGB()) + .textColor(RGBAColor.WHITE.toARGB()) + + tooltip.add( + tooltip.elementHelper.progress( + ratio, + TranslatableComponent( + "otm.gui.level", + batteryLevel.formatPower(), + maxBatteryLevel.formatPower() + ), + style, + BoxStyle.DEFAULT, + true + ) + ) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatteryWorkerProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatteryWorkerProvider.kt new file mode 100644 index 000000000..a0b62cda3 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatteryWorkerProvider.kt @@ -0,0 +1,84 @@ +package ru.dbotthepony.mc.otm.compat.jade.providers + +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.ListTag +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.block.entity.MachineItemJob +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.mc.otm.core.nbt.getCompoundList +import ru.dbotthepony.mc.otm.core.nbt.getItemStack +import ru.dbotthepony.mc.otm.core.nbt.set +import snownee.jade.api.BlockAccessor +import snownee.jade.api.IBlockComponentProvider +import snownee.jade.api.IServerDataProvider +import snownee.jade.api.ITooltip +import snownee.jade.api.config.IPluginConfig +import snownee.jade.api.ui.BoxStyle + +object MatteryWorkerProvider : IBlockComponentProvider, IServerDataProvider { + override fun getUid(): ResourceLocation = JadeUids.MATTERY_WORKER + + override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { + if (accessor.blockEntity is MatteryWorkerBlockEntity<*>) { + val worker = accessor.blockEntity as MatteryWorkerBlockEntity<*> + + val workerData = CompoundTag() + + workerData["jobs"] = ListTag().also { + for (job in worker.jobEventLoops) { + val jobData = CompoundTag() + jobData.putFloat("workProgress", job.workProgress) + jobData.putBoolean("isIdling", job.isIdling) + jobData.putBoolean("isUnableToProcess", job.isUnableToProcess) + + if (job.currentJob is MachineItemJob) { + val currentJob = job.currentJob as MachineItemJob + jobData.put("itemStack", currentJob.itemStack.serializeNBT()) + } + + it.add(jobData) + } + } + + data.put(JadeTagKeys.MATTERY_WORKER_DATA, workerData) + } + } + + override fun appendTooltip(tooltip: ITooltip, accessor: BlockAccessor, config: IPluginConfig) { + val data = accessor.serverData + + if (!data.contains(JadeTagKeys.MATTERY_WORKER_DATA)) return + val workerData = data.getCompound(JadeTagKeys.MATTERY_WORKER_DATA) + + val elementHelper = tooltip.elementHelper + val style = elementHelper.progressStyle().color(RGBAColor.WHITE.toARGB()) + val styleError = elementHelper.progressStyle().color(RGBAColor.REDDISH.toARGB()) + + for (job in workerData.getCompoundList("jobs")) { + val progress = job.getFloat("workProgress") + val isIdling = job.getBoolean("isIdling") + val isUnableToProcess = job.getBoolean("isUnableToProcess") + val itemStack = job.getItemStack("itemStack") + + if (!isIdling) { + if (!itemStack.isEmpty) { + tooltip.add(elementHelper.smallItem(itemStack)) + tooltip.append(elementHelper.text(itemStack.hoverName)) + } + + tooltip.add( + elementHelper.progress( + progress, + null, + if (isUnableToProcess) styleError else style, + BoxStyle.DEFAULT, + true + ) + ) + } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/ProceduralBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/ProceduralBatteryItem.kt index 42c68d400..19445751b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/ProceduralBatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/ProceduralBatteryItem.kt @@ -15,6 +15,8 @@ import net.minecraftforge.common.capabilities.ICapabilityProvider import ru.dbotthepony.mc.otm.capability.FlowDirection import ru.dbotthepony.mc.otm.capability.energy.ItemEnergyStorageImpl import ru.dbotthepony.mc.otm.capability.energy.batteryLevel +import ru.dbotthepony.mc.otm.capability.energy.getBarColor +import ru.dbotthepony.mc.otm.capability.energy.getBarWidth import ru.dbotthepony.mc.otm.capability.matteryEnergy import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.math.Decimal @@ -47,6 +49,18 @@ class ProceduralBatteryItem : Item(Properties().stacksTo(1)) { get() = maxBatteryLevel } + override fun isBarVisible(p_150899_: ItemStack): Boolean { + return p_150899_.matteryEnergy != null + } + + override fun getBarWidth(p_150900_: ItemStack): Int { + return p_150900_.matteryEnergy?.getBarWidth() ?: super.getBarWidth(p_150900_) + } + + override fun getBarColor(p_150901_: ItemStack): Int { + return p_150901_.matteryEnergy?.getBarColor() ?: super.getBarColor(p_150901_) + } + override fun appendHoverText(p_41421_: ItemStack, p_41422_: Level?, p_41423_: MutableList, p_41424_: TooltipFlag) { super.appendHoverText(p_41421_, p_41422_, p_41423_, p_41424_) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index a3199ff6b..841489a93 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -43,7 +43,7 @@ Matter. Energy. Combined. # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency - versionRange="[47.0.1,)" #mandatory + versionRange="[47.1.0,)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering="NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.png index 9a54260fb..e8e91ae60 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.png and b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.xcf index 3d5a11d54..f42db9b99 100644 Binary files a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.xcf and b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/misc18.xcf differ