From 5a352c1c4372f21e83f8e3a467b533265842e605 Mon Sep 17 00:00:00 2001 From: HypherionMC Date: Sat, 27 Aug 2022 22:21:34 +0200 Subject: [PATCH] Campfire WTHIT and TOP integration --- Common/build.gradle | 4 +- .../hypherionmc/hyperlighting/Constants.java | 2 + .../AdvancedCampfireBlockEntity.java | 9 +-- Fabric/build.gradle | 15 +++++ .../integration/top/TOPIntegration.java | 26 ++++++++ .../overrides/TOPCampfireInfoProvider.java | 60 +++++++++++++++++++ .../wthit/CampfireDataProvider.java | 22 +++++++ .../integration/wthit/CampfireProvider.java | 50 ++++++++++++++++ .../integration/wthit/HLWTHITPlugin.java | 24 ++++++++ Fabric/src/main/resources/fabric.mod.json | 9 +++ Forge/build.gradle | 4 ++ .../hyperlighting/HyperLightingForge.java | 6 ++ .../integration/top/TOPIntegration.java | 42 +++++++++++++ .../overrides/TOPCampfireInfoProvider.java | 60 +++++++++++++++++++ build.gradle | 4 ++ gradle.properties | 3 + 16 files changed, 332 insertions(+), 8 deletions(-) create mode 100644 Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java create mode 100644 Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java create mode 100644 Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireDataProvider.java create mode 100644 Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireProvider.java create mode 100644 Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/HLWTHITPlugin.java create mode 100644 Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java create mode 100644 Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java diff --git a/Common/build.gradle b/Common/build.gradle index 6e9d7ed..9badadb 100644 --- a/Common/build.gradle +++ b/Common/build.gradle @@ -23,8 +23,8 @@ minecraft { } dependencies { - compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' - compileOnly("me.hypherionmc.craterlib:CraterLib-common-1.19.1:${craterlib_version}") + compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' + compileOnly("me.hypherionmc.craterlib:CraterLib-common-1.19.1:${craterlib_version}") compileOnly("com.lowdragmc.shimmer:Shimmer-common-1.19.1:${shimmer_version}") } diff --git a/Common/src/main/java/me/hypherionmc/hyperlighting/Constants.java b/Common/src/main/java/me/hypherionmc/hyperlighting/Constants.java index 9a1826e..1d35965 100644 --- a/Common/src/main/java/me/hypherionmc/hyperlighting/Constants.java +++ b/Common/src/main/java/me/hypherionmc/hyperlighting/Constants.java @@ -12,4 +12,6 @@ public class Constants { public static ResourceLocation rl(String name) { return new ResourceLocation(MOD_ID, name); } + + public static final String THE_ONE_PROBE = "theoneprobe"; } diff --git a/Common/src/main/java/me/hypherionmc/hyperlighting/common/blockentities/AdvancedCampfireBlockEntity.java b/Common/src/main/java/me/hypherionmc/hyperlighting/common/blockentities/AdvancedCampfireBlockEntity.java index 6ed3374..7cf5d89 100644 --- a/Common/src/main/java/me/hypherionmc/hyperlighting/common/blockentities/AdvancedCampfireBlockEntity.java +++ b/Common/src/main/java/me/hypherionmc/hyperlighting/common/blockentities/AdvancedCampfireBlockEntity.java @@ -31,13 +31,10 @@ import java.util.Optional; */ public class AdvancedCampfireBlockEntity extends BlockEntity implements Clearable, ISidedTickable { - private static final int BURN_COOL_SPEED = 2; - private static final int NUM_SLOTS = 4; - private final NonNullList items = NonNullList.withSize(4, ItemStack.EMPTY); - private final int[] cookingProgress = new int[4]; - private final int[] cookingTime = new int[4]; + public final int[] cookingProgress = new int[4]; + public final int[] cookingTime = new int[4]; private final RecipeManager.CachedCheck quickCheck = RecipeManager.createCheck(RecipeType.CAMPFIRE_COOKING); @@ -135,7 +132,7 @@ public class AdvancedCampfireBlockEntity extends BlockEntity implements Clearabl } } - protected void saveAdditional(CompoundTag compoundTag) { + public void saveAdditional(CompoundTag compoundTag) { super.saveAdditional(compoundTag); ContainerHelper.saveAllItems(compoundTag, this.items, true); compoundTag.putIntArray("CookingTimes", this.cookingProgress); diff --git a/Fabric/build.gradle b/Fabric/build.gradle index 95346f4..39af117 100644 --- a/Fabric/build.gradle +++ b/Fabric/build.gradle @@ -6,6 +6,10 @@ plugins { archivesBaseName = "${mod_name}-fabric-${minecraft_version}" +repositories { + maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" } +} + dependencies { minecraft "com.mojang:minecraft:${minecraft_version}" mappings loom.officialMojangMappings() @@ -32,6 +36,17 @@ dependencies { modImplementation ("com.lowdragmc.shimmer:Shimmer-fabric-1.19.1:${shimmer_version}") { exclude(group: "net.fabricmc.fabric-api") } + + // The One Probe Fabric + modCompileOnly("mcjty.theoneprobe:theoneprobe-fabric:${top_fabric}") + + // WTHIT + // compile against the API + modCompileOnly "mcp.mobius.waila:wthit-api:fabric-${wthitVersion}" + + // run against the full jar + modRuntimeOnly "mcp.mobius.waila:wthit:fabric-${wthitVersion}" + modRuntimeOnly "lol.bai:badpackets:fabric-0.2.0" } loom { diff --git a/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java new file mode 100644 index 0000000..1fb1caa --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java @@ -0,0 +1,26 @@ +package me.hypherionmc.hyperlighting.common.integration.top; + +import mcjty.theoneprobe.api.IProbeConfig; +import mcjty.theoneprobe.api.ITheOneProbe; +import mcjty.theoneprobe.api.ITheOneProbePlugin; +import me.hypherionmc.hyperlighting.common.integration.top.overrides.TOPCampfireInfoProvider; + +/** + * @author HypherionSA + * @date 27/08/2022 + */ +public class TOPIntegration implements ITheOneProbePlugin { + + private static ITheOneProbe theOneProbe; + + @Override + public void onLoad(ITheOneProbe apiInstance) { + TOPIntegration.theOneProbe = apiInstance; + + theOneProbe.registerBlockDisplayOverride(new TOPCampfireInfoProvider()); + } + + public static IProbeConfig getProbeConfig() { + return theOneProbe.createProbeConfig(); + } +} diff --git a/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java new file mode 100644 index 0000000..8ffa132 --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java @@ -0,0 +1,60 @@ +package me.hypherionmc.hyperlighting.common.integration.top.overrides; + +import mcjty.theoneprobe.api.*; +import me.hypherionmc.hyperlighting.Constants; +import me.hypherionmc.hyperlighting.common.blockentities.AdvancedCampfireBlockEntity; +import me.hypherionmc.hyperlighting.common.integration.top.TOPIntegration; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; + +import static mcjty.theoneprobe.api.IProbeConfig.ConfigMode.EXTENDED; +import static mcjty.theoneprobe.api.IProbeConfig.ConfigMode.NORMAL; +import static mcjty.theoneprobe.api.TextStyleClass.MODNAME; + +/** + * @author HypherionSA + * @date 27/08/2022 + */ +public class TOPCampfireInfoProvider implements IBlockDisplayOverride { + + @Override + public boolean overrideStandardInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player playerEntity, Level world, BlockState blockState, IProbeHitData iProbeHitData) { + IProbeConfig config = TOPIntegration.getProbeConfig(); + + if (probeMode != ProbeMode.DEBUG) { + if (world.getBlockEntity(iProbeHitData.getPos()) instanceof AdvancedCampfireBlockEntity tileCampFire) { + String modName = FabricLoader.getInstance().getModContainer(Constants.MOD_ID).get().getMetadata().getName(); + iProbeInfo + .horizontal() + .item(iProbeHitData.getPickBlock()) + .vertical() + .text(CompoundText.create().name(blockState.getBlock().getName())) + .vertical() + .text(CompoundText.create().info(MODNAME + modName)); + + for (int i = 0; i < tileCampFire.getItems().size(); i++) { + ItemStack stack = tileCampFire.getItems().get(i); + if (!stack.isEmpty()) { + iProbeInfo + .horizontal() + .item(stack) + .horizontal() + .progress( + (int) ((float) tileCampFire.cookingTime[i] / tileCampFire.cookingProgress[i] * 100), + 100, + iProbeInfo.defaultProgressStyle().suffix(" %").alignment(ElementAlignment.ALIGN_TOPLEFT)); + } + } + return true; + } + } + return false; + } + + private boolean show(ProbeMode mode, IProbeConfig.ConfigMode cfg) { + return cfg == NORMAL || (cfg == EXTENDED && mode == ProbeMode.EXTENDED); + } +} diff --git a/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireDataProvider.java b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireDataProvider.java new file mode 100644 index 0000000..61b96f3 --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireDataProvider.java @@ -0,0 +1,22 @@ +package me.hypherionmc.hyperlighting.common.integration.wthit; + +import mcp.mobius.waila.api.IPluginConfig; +import mcp.mobius.waila.api.IServerAccessor; +import mcp.mobius.waila.api.IServerDataProvider; +import me.hypherionmc.hyperlighting.common.blockentities.AdvancedCampfireBlockEntity; +import net.minecraft.nbt.CompoundTag; + +/** + * @author HypherionSA + * @date 27/08/2022 + */ +public class CampfireDataProvider implements IServerDataProvider { + + @Override + public void appendServerData(CompoundTag data, IServerAccessor accessor, IPluginConfig config) { + CompoundTag tag = new CompoundTag(); + accessor.getTarget().saveAdditional(tag); + data.put("hl_campfire", tag); + } + +} diff --git a/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireProvider.java b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireProvider.java new file mode 100644 index 0000000..a12c056 --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/CampfireProvider.java @@ -0,0 +1,50 @@ +package me.hypherionmc.hyperlighting.common.integration.wthit; + +import mcp.mobius.waila.api.IBlockAccessor; +import mcp.mobius.waila.api.IBlockComponentProvider; +import mcp.mobius.waila.api.IPluginConfig; +import mcp.mobius.waila.api.ITooltip; +import net.minecraft.ChatFormatting; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.item.ItemStack; + +/** + * @author HypherionSA + * @date 27/08/2022 + */ +public class CampfireProvider implements IBlockComponentProvider { + + @Override + public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) { + CompoundTag compound = accessor.getServerData().getCompound("hl_campfire"); + int[] cookingTimes = new int[4]; + int[] cookingTotalTimes = new int[4]; + NonNullList inventory = NonNullList.withSize(4, ItemStack.EMPTY); + + inventory.clear(); + ContainerHelper.loadAllItems(compound, inventory); + if (compound.contains("CookingTimes", 11)) { + int[] aint = compound.getIntArray("CookingTimes"); + System.arraycopy(aint, 0, cookingTimes, 0, Math.min(cookingTotalTimes.length, aint.length)); + } + + if (compound.contains("CookingTotalTimes", 11)) { + int[] aint1 = compound.getIntArray("CookingTotalTimes"); + System.arraycopy(aint1, 0, cookingTotalTimes, 0, Math.min(cookingTotalTimes.length, aint1.length)); + } + + if (inventory.isEmpty()) { + tooltip.addLine(Component.literal(ChatFormatting.RED + "Empty")); + } else { + for (int i = 0; i < inventory.size(); i++) { + if (!inventory.get(i).isEmpty()) { + int progress = (int) ((float) cookingTimes[i] / cookingTotalTimes[i] * 100); + tooltip.addLine(Component.literal(inventory.get(i).getDisplayName().getString() + " : " + ChatFormatting.YELLOW + progress + "%")); + } + } + } + } +} diff --git a/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/HLWTHITPlugin.java b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/HLWTHITPlugin.java new file mode 100644 index 0000000..a2d3fcc --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/hyperlighting/common/integration/wthit/HLWTHITPlugin.java @@ -0,0 +1,24 @@ +package me.hypherionmc.hyperlighting.common.integration.wthit; + +import mcp.mobius.waila.api.IRegistrar; +import mcp.mobius.waila.api.IWailaPlugin; +import mcp.mobius.waila.api.TooltipPosition; +import me.hypherionmc.hyperlighting.Constants; +import me.hypherionmc.hyperlighting.common.blockentities.AdvancedCampfireBlockEntity; +import me.hypherionmc.hyperlighting.common.blocks.AdvancedCampfire; + +/** + * @author HypherionSA + * @date 27/08/2022 + */ +public class HLWTHITPlugin implements IWailaPlugin { + + @Override + public void register(IRegistrar registrar) { + Constants.LOG.info("Registering WTHIT Plugins"); + //registrar.addComponent(new FogMachineProvider(), TooltipPosition.BODY, FogMachineBlock.class); + + registrar.addBlockData(new CampfireDataProvider(), AdvancedCampfireBlockEntity.class); + registrar.addComponent(new CampfireProvider(), TooltipPosition.BODY, AdvancedCampfire.class); + } +} diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json index a6089d4..c208b85 100644 --- a/Fabric/src/main/resources/fabric.mod.json +++ b/Fabric/src/main/resources/fabric.mod.json @@ -23,6 +23,9 @@ ], "client": [ "me.hypherionmc.hyperlighting.client.HyperLightingFabricClient" + ], + "top_plugin": [ + "me.hypherionmc.hyperlighting.common.integration.top.TOPIntegration" ] }, "mixins": [ @@ -37,5 +40,11 @@ "java": ">=17", "craterlib": "*" }, + "custom": { + "waila:plugins": { + "id": "hyperlighting:waila_compat", + "initializer": "me.hypherionmc.hyperlighting.common.integration.wthit.HLWTHITPlugin" + } + }, "accessWidener": "hyperlighting.aw" } diff --git a/Forge/build.gradle b/Forge/build.gradle index 9ae351a..f308852 100644 --- a/Forge/build.gradle +++ b/Forge/build.gradle @@ -90,6 +90,10 @@ dependencies { // Shimmer implementation fg.deobf("com.lowdragmc.shimmer:Shimmer-forge-1.19.1:${shimmer_version}") + + // The One Probe + implementation "mcjty.theoneprobe:theoneprobe:${top_version}:api" + } tasks.withType(JavaCompile) { diff --git a/Forge/src/main/java/me/hypherionmc/hyperlighting/HyperLightingForge.java b/Forge/src/main/java/me/hypherionmc/hyperlighting/HyperLightingForge.java index 9e22b3b..285f1d8 100644 --- a/Forge/src/main/java/me/hypherionmc/hyperlighting/HyperLightingForge.java +++ b/Forge/src/main/java/me/hypherionmc/hyperlighting/HyperLightingForge.java @@ -8,12 +8,14 @@ import me.hypherionmc.hyperlighting.common.entities.NeonFlyEntity; import me.hypherionmc.hyperlighting.common.init.CommonRegistration; import me.hypherionmc.hyperlighting.common.init.HLBlockEntities; import me.hypherionmc.hyperlighting.common.init.HLEntities; +import me.hypherionmc.hyperlighting.common.integration.top.TOPIntegration; import me.hypherionmc.hyperlighting.common.worldgen.ForgeWorldGen; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.client.renderer.entity.EntityRenderers; import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.client.ConfigScreenHandler; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -30,6 +32,10 @@ public class HyperLightingForge { FMLJavaModLoadingContext.get().getModEventBus().addListener(this::commonInit); CommonRegistration.registerAll(); + if (ModList.get().isLoaded(Constants.THE_ONE_PROBE)) { + new TOPIntegration().setup(); + } + ForgeWorldGen.registerAll(FMLJavaModLoadingContext.get().getModEventBus()); registration.registerEvents(); } diff --git a/Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java b/Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java new file mode 100644 index 0000000..dfdd9b3 --- /dev/null +++ b/Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/TOPIntegration.java @@ -0,0 +1,42 @@ +package me.hypherionmc.hyperlighting.common.integration.top; + +import mcjty.theoneprobe.api.IProbeConfig; +import mcjty.theoneprobe.api.ITheOneProbe; +import me.hypherionmc.hyperlighting.Constants; +import me.hypherionmc.hyperlighting.common.integration.top.overrides.TOPCampfireInfoProvider; +import net.minecraftforge.fml.InterModComms; +import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import java.util.function.Function; + +/** + * @author HypherionSA + * @date 27/08/2022 + */ +public class TOPIntegration implements Function { + + private static ITheOneProbe theOneProbe; + + public void setup() { + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::sendIMC); + } + + public void sendIMC(InterModEnqueueEvent event) { + Constants.LOG.info("Registering TOP integration"); + InterModComms.sendTo(Constants.THE_ONE_PROBE, "getTheOneProbe", TOPIntegration::new); + } + + @Override + public Void apply(ITheOneProbe theOneProbe) { + TOPIntegration.theOneProbe = theOneProbe; + + TOPCampfireInfoProvider topCampfireInfoProvider = new TOPCampfireInfoProvider(); + theOneProbe.registerBlockDisplayOverride(topCampfireInfoProvider); + return null; + } + + public static IProbeConfig getProbeConfig() { + return theOneProbe.createProbeConfig(); + } +} diff --git a/Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java b/Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java new file mode 100644 index 0000000..da5343b --- /dev/null +++ b/Forge/src/main/java/me/hypherionmc/hyperlighting/common/integration/top/overrides/TOPCampfireInfoProvider.java @@ -0,0 +1,60 @@ +package me.hypherionmc.hyperlighting.common.integration.top.overrides; + +import mcjty.theoneprobe.api.*; +import me.hypherionmc.hyperlighting.Constants; +import me.hypherionmc.hyperlighting.common.blockentities.AdvancedCampfireBlockEntity; +import me.hypherionmc.hyperlighting.common.integration.top.TOPIntegration; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fml.ModList; + +import static mcjty.theoneprobe.api.IProbeConfig.ConfigMode.EXTENDED; +import static mcjty.theoneprobe.api.IProbeConfig.ConfigMode.NORMAL; +import static mcjty.theoneprobe.api.TextStyleClass.MODNAME; + +/** + * @author HypherionSA + * @date 27/08/2022 + */ +public class TOPCampfireInfoProvider implements IBlockDisplayOverride { + + @Override + public boolean overrideStandardInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player playerEntity, Level world, BlockState blockState, IProbeHitData iProbeHitData) { + IProbeConfig config = TOPIntegration.getProbeConfig(); + + if (probeMode != ProbeMode.DEBUG) { + if (world.getBlockEntity(iProbeHitData.getPos()) instanceof AdvancedCampfireBlockEntity tileCampFire) { + String modName = ModList.get().getModContainerById(Constants.MOD_ID).get().getModInfo().getDisplayName(); + iProbeInfo + .horizontal() + .item(iProbeHitData.getPickBlock()) + .vertical() + .text(CompoundText.create().name(blockState.getBlock().getName())) + .vertical() + .text(CompoundText.create().info(MODNAME + modName)); + + for (int i = 0; i < tileCampFire.getItems().size(); i++) { + ItemStack stack = tileCampFire.getItems().get(i); + if (!stack.isEmpty()) { + iProbeInfo + .horizontal() + .item(stack) + .horizontal() + .progress( + (int) ((float) tileCampFire.cookingTime[i] / tileCampFire.cookingProgress[i] * 100), + 100, + iProbeInfo.defaultProgressStyle().suffix(" %").alignment(ElementAlignment.ALIGN_TOPLEFT)); + } + } + return true; + } + } + return false; + } + + private boolean show(ProbeMode mode, IProbeConfig.ConfigMode cfg) { + return cfg == NORMAL || (cfg == EXTENDED && mode == ProbeMode.EXTENDED); + } +} diff --git a/build.gradle b/build.gradle index a693ae1..09cb838 100644 --- a/build.gradle +++ b/build.gradle @@ -57,6 +57,10 @@ subprojects { name = "Curseforge Maven" url 'https://cfa2.cursemaven.com' } + + maven { url = "https://maven.k-4u.nl" } + maven { url = "https://maven.wispforest.io/" } + maven { url "https://maven.bai.lol" } } diff --git a/gradle.properties b/gradle.properties index 562eb2b..6346fa2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,3 +33,6 @@ mod_menu_version=4.0.5 shimmer_version=0.1.11d sodium_version=3820973 ribidium_version=3864138 +top_version=1.19-6.2.0-6 +top_fabric=1.19-6.0.0 +wthitVersion=5.11.3