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..6029c59d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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 99d467195..e74d098b3 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 @@ -777,6 +777,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) @@ -791,6 +806,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 6b33fac1c..f2bd9a0e4 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 @@ -778,6 +778,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) @@ -789,4 +804,5 @@ fun AddRussianLanguage(provider: MatteryLanguageProvider) { research(provider) death(provider) androidFeatures(provider) + jade(provider) } 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..2423d7ffb --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/JadeCompatData.kt @@ -0,0 +1,22 @@ +package ru.dbotthepony.mc.otm.compat.jade + +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.OverdriveThatMatters.loc + +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" +} 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..43620216a --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatterStorageProvider.kt @@ -0,0 +1,63 @@ +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.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(RGBAColor.LOW_MATTER.linearInterpolation(ratio, RGBAColor.FULL_MATTER).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..56e6189ae --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jade/providers/MatteryEnergyProvider.kt @@ -0,0 +1,61 @@ +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.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(RGBAColor.LOW_POWER.linearInterpolation(ratio, RGBAColor.FULL_POWER).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 + ) + ) + } + } + } +}