Tags
Creators
Details
0.4.0-1.21.1
Compatibility
Required content
Changes
Port of 0.4.0 to NeoForge 1.21.1 (KubeJS 2101.7.2-build.368) - full feature parity with the main
0.4.0 branch (see github.com/Zynora-fr/KubeUI for the
complete feature list: economy, machines & automation, world map, dialogue, storage, progression,
combat & status HUD, structures & dungeons, guilds & factions, social, housing & claims, settings
hub, the machine screen redesign, JS-only slash commands for guild/party/housing, the tabbed social
screen, custom leaderboards, scriptable guild/party rules, and KubeUIHud), rebuilt against
1.21.1's own real APIs. Real, version-specific adaptations along the way (not guessed - each
verified against this exact NeoForge 21.1.248/KubeJS 2101.7.2 build):
ResourceLocation(26.1.2'sIdentifieris this version'sIdentifier... this version isResourceLocation- the rename only exists going the other way) - same API surface otherwise (tryParse/fromNamespaceAndPath/withDefaultNamespaceall real here too).- Block entity persistence is the pre-
ValueInput/ValueOutputsaveAdditional(CompoundTag, HolderLookup.Provider)/loadAdditional(...)shape;CompoundTagitself has nogetXxxOr(...)/getListOrEmpty(...)/getCompoundOrEmpty(...)convenience API at all on this version - not even through KubeJS, which doesn't add it either (26.1.2'sCompoundTaggained these natively as real Mojang methods, nothing KubeJS-specific).KubeUINbtCompatreproduces the 26.1.2 semantics for this project's own Java call sites;KubeUINbtView(a real public class, since KubeJS's ownCompoundTag-to-JS conversion falls back to normal reflection for any method name that isn't itself a stored NBT key) does the same for scripts - every JS-facing touchpoint that used to hand out a rawCompoundTag(KubeUIActionHandler#handle,KubeUIRemoteScreens#register, and a handful ofKubeUIActionsmethods like.claimsOf/.guildMembers/.playerData) hands out this wrapper instead, so a script written asdata.getStringOr('key', 'fallback')works unmodified either way.KubeUINbtViewalso implements KubeJS's ownNBTSerializableso the reverse direction - a script handing one straight back intoKubeUIActions.openRemote(...)- serializes correctly instead of silently dropping the value. - The currency ledger's
KubeUICurrency.load(server)no longer clears already-registered currencies: on a singleplayer/integrated server,server_scriptstop-level code (whereKubeUIActions.registerCurrency(...)normally lives) runs beforeServerAboutToStartEventfires this, so clearing it here was wiping out every currency a script had just registered (/money balancealways reporting "no currencies registered" was the real, reported symptom). Same fix landed on the main 0.4.0 branch - this wasn't 1.21.1-specific, just first caught here. AbstractContainerScreen's real override points arerenderBg(GuiGraphics, float, int, int)/renderLabels(GuiGraphics, int, int)(different names and argument order from 26.1.2'sextractBackground/extractLabels); a plainScreensubclass's isrender(GuiGraphics, int, int, float).GuiGraphicsExtractor(this project's existing 26.1.2-API-shape compatibility shim over the realGuiGraphics) is constructed explicitly at each of these bridge points.ClickType(notContainerInput) forAbstractContainerMenu#clicked;Commands.LEVEL_GAMEMASTERSis a plain numeric op-level constant with noCommands.hasPermission(int)static helper - real permission gating is.requires(source => source.hasPermission(Commands.LEVEL_GAMEMASTERS))(JS commands) /player.hasPermissions(level)(plain Java) instead.Item#getBurnTime(RecipeType)/AbstractFurnaceBlockEntity.isFuel(...)(noLevel#fuelValues()registry yet) for the machine block's real furnace-shaped fuel slot;BlockEntityType.Builder.of( factory, blocks...).build(null)(no bare public constructor yet) for block-entity-type registration;DeferredRegister.Blocks#registerBlock(name, factory, Properties)takes a plainProperties, not aSupplier<Properties>.
No functional or content changes versus the main 0.4.0 branch.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:43NbktDJ:BElhCP85"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:43NbktDJ:BElhCP85"
}

