Skip to content

GTNHLib ​

180 merged pull requests.

New Features ​

  • #473 Added WorldContextRegistry with a WorldAddress of host dimension ID, namespace and sub ID. Mods register namespaced handlers that resolve addresses to worlds and back. - @DarkShadow44
    • Added: WorldContextRegistry API for virtual subworlds
  • #470 Adds TeamLeaveEvent, TeamDisbandEvent, TeamJoinEvent, TeamKickEvent, TeamRenameEvent, TeamPromoteEvent and TeamDemoteEvent to TeamEvents. TeamActions posts them on the Forge event bus. - @EternalQ
    • Added: team rename, join, leave, kick, disband, promote and demote events
  • #464 Adds a public final inventoryCount field to InventoryChangedEvent and a matching constructor argument on ItemAdded and ItemRemoved. InventoryEventPoster takes the total from the current snapshot map, which PlayerInventoryScanner now passes in. Addons that construct these events must pass the new argument. - @Caedis
    • Added: inventoryCount on InventoryChangedEvent
  • #438 Removes the domain and block/ prefix munging in ModelDeserializer and JSONModel. Adds TexHelper, MixinTextureMap and MixinTextureAtlasSprite to register foreign textures in the atlas. texturesToLoad becomes a set, and a BlockTestAo test block is added. - @ah-OOG-ah
    • Added: non-block textures in JSON models, BlockTestAo test block
    • Removed: texture path remapping for block/ and minecraft: prefixes
    • Migration: Model JSON files must now give full texture paths relative to the textures folder, for example domain:blocks/name.
  • #435 Adds the IFlowerPottable interface and mixins into BlockFlowerPot, TileEntityFlowerPot and RenderBlocks for placement, drops, render override and NBT sync. The mixins apply only if enableMoreFlowerPottage is true. - @FourIsTheNumber
    • Added: IFlowerPottable interface, enableMoreFlowerPottage config option
  • #428 Added a com.gtnewhorizon.gtnhlib.noise package with a NoiseSampler interface and SimplexSampler, PerlinSampler, OctavesSampler, ScaledSampler and NormalizedSampler implementations. Also added a JMH benchmark source set and plugin to build.gradle.kts. - @RecursivePineapple
    • Added: Simplex and Perlin noise samplers, JMH benchmarks for the samplers
  • #423 Added BrigadierCommandWrapper and integration in CommonProxy to register Brigadier commands as standard Bukkit commands only on Thermos servers, working around Brigadier's incompatibility with Bukkit command registry (+24 lines added). - @RealSilverMoon
    • Added: BrigadierCommandWrapper, Bukkit command compatibility
    • Fixed: gtnhteam command on Thermos
    • Closes GTNH#25797
  • #409 Added new API for custom world conversion warnings: GuiConfirmationWCW, IWorldConversionWarning, WCWHelper, WorldConversionWarningManager; integrated via ClientEventHandler and mixins (PreInitMixinPlugin, MixinGameData_WorldConversionWarning) to intercept world load. - @SuperSoupr
    • Added: world conversion warning system, IWorldConversionWarning interface, WorldConversionWarningManager, GuiConfirmationWCW dialog, WCWHelper utility, mixin plugin integration
  • #407 Updated TeamActions command suggestions to omit team name when a single active invite exists, reducing command clutter (+12-5 lines). - @cubefury
  • #398 GlyphReplacements gets getGlyphReplacementsMap(), which returns the customGlyphsNew Char2CharOpenHashMap. - @sisyphussy
    • Added: GlyphReplacements map getter
  • #388 Expanded TitleAPI with position offset parameters; created TitleEffectSystem with four cinematic effect types; fixed TitleRenderer to prevent RenderItem from forcing alpha to 1 during drop-shadow rendering; added configuration options in GTNHLibConfig. - @alppp
    • Added: TitleEffectSystem, 13 icon animation styles, cinematic effects, position offset configuration
    • Fixed: drop-shadow icon fade-out
  • #387 Adds a safe enchant method to ItemStackNBT that avoids vanilla's int-to-byte level cast and updates an existing enchantment entry instead of appending a duplicate. The class Javadoc was also rewritten. - @ah-OOG-ah
    • Added: safe item stack enchant method in ItemStackNBT
  • #384 Created Teams GUI subsystem using ModularUI2 integration with TeamGui, ConfirmationDialog, FreezablePanel, DisplayItem classes; added UI utilities and theme customization; integrated with existing team command system to ensure UI button availability matches command permissions. - @cubefury
    • Added: Teams GUI interface, ConfirmationDialog, FreezablePanel, ClientTextField, DisplayItem, team UI utilities
  • #380 Adds ColorResource, which supports ARGB and RGB defaults, a Factory per mod ID, and per-instance caching. A lang key color.resource.<modid>.<name> overrides the default. CacheReloadListener is registered in ClientProxy and refreshes colors on resource reload. - @Ranzuu
    • Added: ColorResource
  • #372 GTNHLibConfig gets enableTeamCommands (default true), teamCommandRoot (default gtnhteam) and teamSystemName (default GTNHTeams). CommonProxy only registers TeamCommand and TeamAdminCommand when enabled, both commands use the configured root, and TeamCommandsUtils.getCommandRoot feeds the clickable accept and deny text in chat. en_US.lang strings were updated. - @tiffit
    • Added: enableTeamCommands config, teamCommandRoot config, teamSystemName config
  • #365 Extended TitleAPI with setIcon/setConfettiIcon, setParticleEffect (4 styles), per-call overrides; added TitleParticleSystem, TitleParticle, TitleRenderer, VertexTransformer; added client config for scales/effects/animations; added /title icon command. - @alppp
    • Added: TitleAPI icon support, TitleParticleSystem, TitleRenderer, VertexTransformer, particle effect styles (confetti, sparkle, firework, item confetti), /title icon command, icon animation styles (none, fly_in, spin)
    • Removed: MixinGuiIngameForge_TitleRender, MixinGuiIngame_TitleTick
  • #363 Adds an initial field and isInitial() to LivingEquipmentChangeEvent, with a new five-argument constructor and the old four-argument one kept. MixinEntityLivingBase captures Entity.firstUpdate at the head of onUpdate and passes it to the event. Adds an access transformer for Entity.firstUpdate. - @Roadhog360
    • Added: LivingEquipmentChangeEvent.isInitial
    • Fixed: No way to detect an entity-initialization fire of LivingEquipmentChangeEvent
    • Closes #361
  • #356 Added &u to isValidAmpCode in FontRendering to recognize drop shadow formatting codes as zero-width. - @alppp
    • Added: &u drop shadow formatting code support
  • #354 Adds WavefrontVBOBuilder, which parses .obj files and writes into a DirectTessellator captured to an immutable VBO. Adds CCWavefrontBuilder and CCBakedModel, still WIP with no color or lighting support and no non-baked transforms. Bumps the Angelica compileOnly dependency to 2.1.22 and adds CodeChickenCore compileOnly. - @sisyphussy
    • Added: WavefrontVBOBuilder, CCWavefrontBuilder, CCBakedModel
  • #343 Extended ModelISBRH with overrideIcon support; added MixinRenderGlobal to intercept model rendering; added test block BlockTestLectern; added texture and model assets for demonstration. - @Shigure-Ruiseki
    • Added: overrideIcon model feature, MixinRenderGlobal, BlockTestLectern test block, texture assets (lectern_base.png, lectern_front.png, lectern_sides.png, up_arrow.png)
  • #342 Adds @Config.Reloadable(id) and ConfigurationManager.reloadConfig(Class, id). It reloads the raw Configuration and runs the registered loaders for fields with that id. The field loader runnable is refactored into a reloadables map. - @Lyfts
    • Added: Config.Reloadable annotation, ConfigurationManager reloadConfig
  • #338 Adds client-side WorldDeletionEvent, posted on MinecraftForge.EVENT_BUS from a MixinGuiSelectWorld ModifyArg on deleteWorldDirectory in confirmClicked. The event carries the save folder name. Registered as WORLD_DELETION_EVENT in Mixins. - @Algent
    • Added: WorldDeletionEvent
  • #334 Adds the @Config.RequiresMod annotation with OR and AND modes. ConfigNode now holds order and required mods, and IConfigElementProxy#showInGui checks Loader for the required mods. ExampleConfig shows usage. - @slprime
    • Added: Config.RequiresMod annotation
  • #331 Adds ItemSink#setSlotStackLimit (default no-op). InventoryItemSink stores the limit and applies it in getSlotStackLimit. ItemTransfer gets a maxSinkSlotStackSize setter and passes it to the sink before each transfer. - @Luca-Guettinger
    • Added: per-slot stack limit on ItemSink, ItemTransfer setMaxSinkSlotStackSize
  • #330 Added TitleAPI.java, TitleCommand.java, MessageTitle/MessageTitleHandler network classes, MixinGuiIngame mixins for ticking and rendering, and lang entries. Supports renderer registration for full overlay control. - @alppp
    • Added: TitleAPI client-side title system, TitleCommand, title network messages, title rendering mixins
  • #329 Modified BlockStateCommand and NumberFormatUtil to apply colors: yellow for integers, light purple for floats, aqua for strings, green/red for booleans. - @flamingowrangler2869
    • Added: color formatting for blockstate properties
  • #326 Adds ItemStackNBT#getDisplayName, which returns display.Name or null, and invertBoolean(key). Nullability annotations switch from javax.annotation to org.jetbrains.annotations. - @Alexdoru
    • Added: ItemStackNBT getDisplayName, ItemStackNBT invertBoolean
  • #323 Adds ItemStackNBT with static allocation-free getters and setters and a chainable instance API via of(stack). The compound is created lazily on write and read defaults are safe for missing tags. - @Alexdoru
    • Added: ItemStackNBT helper
  • #309 Adds Abstract3DIterator, a base class for 3D position iterators with n/l/m fields, optional offsets and packed-coordinate output, and CubeIterator, which orders by the L-infinity metric and then the manhattan metric within a shell. - @felixfour
    • Added: CubeIterator, Abstract3DIterator
  • #305 Adds BFSLeafDecay.handleDecayChecked, a static BFS over connected leaves up to range 7 using shared static visited and queue arrays. It sets the decay meta bit off when a log is found in range and otherwise drops the block and sets it to air. - @Alexdoru
    • Added: BFSLeafDecay helper
  • #304 Adds StdLCG extends Random in gtnhlib.util with the same LCG constants, scramble on setSeed and a Knuth-based nextGaussian that matches stdlib, plus StdLCGTest comparing nextLong and nextGaussian against Random. Copied from Hodgepodge, which is not changed. - @ah-OOG-ah
    • Added: StdLCG random number generator, StdLCGTest
  • #297 Added the teams package (Team, TeamManager, TeamDataSaver, TeamDataRegistry, ITeamData, INetworkTeamData) and TeamCommand and TeamAdminCommand, which are registered on server start. Added TeamInfoSync and TeamDataSync packets with ids 5 and 6. Mods attach data to a team by registering an ITeamData implementation. - @FourIsTheNumber
    • Added: GTNHTeams team system, team commands, ITeamData API for team data
  • #295 Adds BakedModelQuadContext with WorldContext and ItemContext implementations, and passes them through BakedModel, MonopartModel, MultipartModel and ModelISBRH. BlockStateImpl gets equals and hashCode, and ModelRegistry and ModelDeserializer are reworked. JSONModel.resolveParents now copies the parent's display entries with putIfAbsent. The test blocks are moved to the test package and use a DirectionBlockProperty backed by a tile entity. models.md documents the BlockProperty API. - @Shigure-Ruiseki
    • Added: blockstate-based model selection for JSON models, BlockProperty registration for blocks and items, display inheritance from parent models
  • #286 Adds a Config.Order annotation for fields and types. ConfigurationManager builds a ConfigNode tree per config class, and IConfigElementProxy carries the order value. A new client mixin, MixinGuiConfig, sorts the entries in the config GUI. ExampleConfig is updated to demonstrate it. - @0hwx
    • Added: Config.Order annotation, sorted config GUI entries
  • #282 Adds InventoryChangedEvent with ItemAdded and ItemRemoved subclasses, fired on client (local player) and server by a scanner that diffs item id and meta counts (no NBT). Adds config inventoryScanInterval (default 5 ticks, range 1-200) and a debugInventoryEvents flag. The scanner only runs when something subscribes, and Baubles is accessed by reflection. - @Caedis
    • Added: InventoryChangedEvent.ItemAdded and ItemRemoved events, inventoryScanInterval config option, debugInventoryEvents config option
  • #281 Adds Config.Entry (IConfigEntry class) and ConfigurationManager.applyConfigEntries, called from ClientProxy.init. Also adds Config.categoryCulling (default true) and ExampleConfig. Bumps lwjgl3ify, NEI, Angelica and the settings convention plugin. - @0hwx
    • Added: Config.Entry annotation, categoryCulling option, ExampleConfig in dev
  • #278 New ChatComponentItemName and ChatComponentFluidName extend the new AbstractChatComponentBuffer, which encodes to PacketBuffer and Base64. Both are registered in CommonProxy. - @Discreater
    • Added: ChatComponentItemName, ChatComponentFluidName, AbstractChatComponentBuffer
  • #277 Adds IBlockModelProvider, which ModelISBRH.getModel checks first. ModelQuad gets a transparent flag, and ModelISBRH skips transparent quads in world render pass 0. ModelElement stores a name, and several JSONModel fields become protected. - @Ruling-0
    • Added: IBlockModelProvider, transparent quad support, model element names
  • #275 Adds static EnhancedInfusionRecipe.addEnhancedInfusionCraftingRecipe, mirroring ThaumcraftApi.addInfusionCraftingRecipe. It adds the recipe to ThaumcraftApi.getCraftingRecipes(). - @LazyFlesh
    • Added: addEnhancedInfusionCraftingRecipe helper
  • #270 New EnhancedInfusionRecipe with a Replacement list, and MixinEnhancedInfusionRecipe on TileInfusionMatrix, loaded late when Thaumcraft is present. Adds GTNHLibLateMixinLoader, a THAUMCRAFT target mod and mixins.gtnhlib.late.json. - @LazyFlesh
    • Added: EnhancedInfusionRecipe, late mixin loader
  • #269 New FormattedResearchPage extends ResearchPage and overrides getTranslatedText to call StatCollector.translateToLocalFormatted. Adds a Thaumcraft compileOnly dependency. - @koolkrafter5
    • Added: FormattedResearchPage
  • #268 New itemrendering package: IItemTexture, ItemTexture, BlockItemTexture, ItemWithTextures, ItemRenderUtils and TexturedItemRenderer. Adds the enableTestItems config and TestItem, and moves the test blocks into a test.block package. - @RecursivePineapple
    • Added: IItemTexture layered item renderer, TexturedItemRenderer, enableTestItems config option
  • #266 Added LocaleOption enum to NumberFormatConfig with 17 predefined locales, implemented ConfigEventHandler for live reloading, and modified number formatting to use selected locale instead of system default. - @Eldrinn-Elantey
    • Added: LocaleOption enum with 17 locale choices, ConfigEventHandler for config changes, Number formatting locale selection UI
    • Fixed: number formatting locale selection per issue #265
  • #260 Implemented ResourcePackUpdateChecker that periodically scans enabled resource packs for opt-in via pack.mcmeta, queries GitHub Releases API for compatible newer versions, and posts chat notifications. Added /resourcepack command family and client config option. - @Ranzuu
    • Added: ResourcePackUpdateChecker system, ChatNotifier, GitHubReleaseClient, PackMcmetaReader, ResourcePackUpdateEventHandler, CommandResourcePack, Localization strings for 5 languages
  • #259 New PickBlockEvent posted on the Forge event bus from a client-side mixin on Minecraft's pick block method at HEAD. Cancelling the event cancels the vanilla call. Registered as PICK_BLOCK_TRAP in Mixins. - @querns
    • Added: PickBlockEvent, pick block mixin
  • #255 Adds an ArrayProximityMap4D.forEachInRange overload with an explicit range, backed by new forEachInSphere and forEachInCube overloads in DimensionData. - @Ruling-0
    • Added: forEachInRange overload with external range
  • #252 Introduced GuiText utility class with static methods to format GUI text strings using configurable keys, allowing resource pack authors to override hardcoded strings and apply color codes via .lang file entries. - @Ranzuu
    • Added: GuiText utility class, GuiText.Keys enum for standard symbols and phrases
  • #245 Adds jvmdowngrader-java-api (1.3.5) as shaded downgraded-8 stubs and as a Java 17 multi-release copy in shadowJar. Adds MixinJarDiscoverer and TargetMods, moves the store/restoreTranslation code into a new LocalTessellator, and updates build properties. - @mitchej123
    • Added: JVMDowngrader API stubs, LocalTessellator
  • #235 Introduces chat component infrastructure (AbstractChatComponentCustom, ChatComponentCustomRegistry, ChatComponentNumber/Fluid/Energy), NumberFormatUtil with exponential and compact formatting, NumberFormatConfig for client-side options, MixinIChatComponentSerializer for deserialization support. - @Connor-Colenso
    • Added: AbstractChatComponentCustom base class, ChatComponentCustomRegistry, ChatComponentNumber, ChatComponentFluid, ChatComponentEnergy classes, NumberFormatUtil with formatting algorithms, NumberFormatConfig client settings, ExponentialFormat, CompactOptions classes
  • #230 Added ItemSink.simulatedSinkIterator() (default null), implemented in InventoryItemSink as a StandardInventoryIterator whose writes and markDirty are no-ops, and forwarded in WrappedItemIO. StandardInventoryIterator.insert now modifies a copy of the slot stack. - @hiroscho
    • Added: simulated item sink iterator
  • #228 Introduces VillagerNames class with localized profession names in en_US, es_MX, ru_RU, and zh_CN. - @SuperSoupr
    • Added: VillagerNames client utility class, villager profession names in 4 languages
  • #227 Added util.ItemRenderUtil with renderItem(ItemRenderType, IIcon), handling ENTITY, EQUIPPED and the other render types. Ported from GT5-Unofficial's GTRenderUtil. - @FourIsTheNumber
    • Added: ItemRenderUtil
  • #222 Added PrimitiveExtractor, ModelLine, ModelTriangle and ModelPrimitiveView, with pooled instances in CapturingTessellator and TessellatorManager. DrawCallback.onDraw now takes a primitives list and CapturedDraw is removed. ModelQuad.clearLightmap now sets slots 0-3 instead of slot 0 four times. - @mitchej123
    • Added: line and triangle support in the compiling tessellator, PrimitiveExtractor, ModelLine, ModelTriangle
    • Removed: CapturedDraw
    • Fixed: ModelQuad clearLightmap setting only slot 0
  • #219 Added util.font.GlyphReplacements with a static HashMap and two registerCustomGlyph overloads (replacement with original, or replacement with null). - @DeathFuel
    • Added: glyph replacement map
  • #216 Extends ModelISBRH with BlockBench display rendering, adds MixinModelFHC to handle model transforms, enhances BakedModel and related classes to support display configurations. - @Shigure-Ruiseki
    • Added: BlockBench display rendering in ModelISBRH, MixinModelFHC for model transforms, display configuration support
  • #215 Introduces ITranslucentItem interface, adds MixinItemRenderer_Translucency and MixinRenderItem_Translucency to enable per-item translucency control, updates mixins.gtnhlib.early.json with mixinextras dependency. - @SuperSoupr
    • Added: ITranslucentItem interface, MixinItemRenderer_Translucency mixin, MixinRenderItem_Translucency mixin, translucency config option
  • #211 Introduces BlockColor interface, IBlockColor API, ModelISBRH renderer enhancements, and BlockTestTint test block. Adds color tinting support via tintIndex in JSON model deserialization. - @Shigure-Ruiseki
    • Added: BlockColor interface, IBlockColor API, ModelISBRH JSON renderer enhancements, BlockTestTint test block, tintIndex support in JSON models
  • #208 JSONModel.bake counter-rotates UVs on POS_Y and NEG_Y faces by the variant y rotation around (8,8) using a Matrix2f when BakeData.uvLock() is true. BakeData.lockUV is renamed uvLock and gains x() and y(). BlockTest now rotates from player yaw and model_test.json uses uvlock. - @DarkShadow44
    • Added: UV locking for JSON models
  • #205 Adds UniverseShader class with lightmap color accessor mixin (EntityRendererAccessor). Includes universe shader pair (fragment and vertex) and cosmic texture animations with .mcmeta metadata. - @chrombread
    • Added: UniverseShader for cosmic rendering, Entity renderer lightmap accessor mixin, Cosmic texture animations in blocks and items directories
  • #204 Adds ItemDuctSink wrapping cofh.api.transport.IItemDuct, a WRAP_ITEM_DUCTS flag in ItemUtil guarded by an isCoFHCoreLoaded check, and a CoFH Core compileOnly dependency. A rejected stack that does not match the inserted one is logged and discarded to prevent dupes. - @RecursivePineapple
    • Added: item duct insertion support
  • #195 Adds the IBlockWithCustomSound interface and WrapOperation mixins on Entity, EntityLivingBase, EntityHorse, ItemBlock, ItemSlab, PlayerControllerMP and RenderGlobal that redirect Block.stepSound/blockSound reads. Registered as DYNAMIC_BLOCK_SOUNDS_COMMON and DYNAMIC_BLOCK_SOUNDS_CLIENT in Mixins. - @RecursivePineapple
    • Added: dynamic block sound interface
  • #193 Adds DrawCallback, CapturedDraw, QuadExtractor and compiling methods on ITessellatorInstance. Reworks CapturingTessellator and TessellatorManager (+343 lines), adds quad writers, and adds VertexBuffer.draw(first, count). - @mitchej123
    • Added: compiling tessellator mode, draw callback
  • #188 Adds SimpleItemSource, SimpleItemSink and SimpleItemIO, which implement slot handling over an abstract iterator. Adds DSUItemSource/Sink/IO and DSUInventoryIterator for IDeepStorageUnit, wired through ItemUtil with a WRAP_DSUS flag and an isMFRLoaded check. - @RecursivePineapple
    • Added: Deep Storage Unit support in item moving, SimpleItemSource, SimpleItemSink, SimpleItemIO
  • #186 Adds CustomFramebuffer, SharedDepthFramebuffer, PostProcessingManager/Helper, BloomShader and I3DGeometryRenderer. Adds VAOManager, VaoFunctions and VertexArrayBuffer, moves VAO implementation selection into UniversalVAO.getImplementation, and adds TessellatorManager.stopCapturingToVAO and startCapturingAndGet. - @sisyphussy
    • Added: custom framebuffer, tonemapping, shared depth attachment, delayed geometry rendering, VAO helper methods
  • #176 Adds the blockstate package: BlockState and BlockStateImpl with pooling, BlockProperty, BlockPropertyRegistry, VanillaBlockProperties, transformable property interfaces and a BlockStateCommand registered in CommonProxy.serverStarting. BlockPropertyInit.init() runs in preInit. - @RecursivePineapple
    • Added: block state system, /blockstate command, vanilla block properties
  • #149 Integrates the Brigadier library (shadowed, MIT-licensed) via BrigadierApi and mixins to CommandHandler and help system (MixinCommandHandler, MixinCommandHelp), allowing legacy commands to leverage modern command features. - @Taskeren
    • Added: Brigadier command support, Command suggestions and autocomplete, Help text integration for Brigadier commands
  • #100 Replaced the old model classes (ModelLoader, NdQuadBuilder, DynamicCubeModel and others) with ModelISBRH and a ModelRegistry that loads textures from model files. Added BakeData, a BlockTest behind the enableTestBlocks config, and the modelCacheSize and autoTextureLoading config options. Breaks Angelica and MatterManipulator until their matching PRs are merged. - @ah-OOG-ah
    • Added: ModelISBRH JSON model renderer, model cache size config option, automatic model texture loading config option, test block for models
    • Removed: old model loader classes
    • Migration: The 0.7.10 model API is removed: ModelLoader, Variant, json.JsonModel, the template models (BlockStaticCube, BlockColoredCube, ColumnModel), the client.renderer.quad classes (Quad, QuadBuilder, QuadProvider, QuadView, ModelQuad) and client.renderer.util (DirectionUtil, WorldUtil, MathUtil, ModelQuadUtil). Move to the new loader (blockstate and model JSON in assets, ModelRegistry, IBlockModelProvider) and the quad classes in client.renderer.cel.model.quad.

New Content ​

  • #437 Added BOP dependency and six late-phase mixins (targeting BOP flower, plant, sapling, mushroom, and colorized sapling classes) to apply IFlowerPottable interface and adjust model scales for flower pot compatibility. - @FourIsTheNumber
    • Added: BOP integration mixins, BOP dependency
  • #280 Added 28 new localization strings to ru_RU.lang for the Resource Pack Notifier feature. - @Eldrinn-Elantey
    • Added: Russian translations for Resource Pack Notifier
  • #175 Added BakedModelBuilder, which bakes ModelRenderer-style quads into one VBO through CapturingTessellator, and NormalHelper for normal matrices. CapturingTessellator got two setNormalTransformed methods. - @sisyphussy
    • Added: BakedModelBuilder, NormalHelper, CapturingTessellator.setNormalTransformed
  • #171 Added TimedCache, which keeps entries in generations and expires them by last access time. It wraps a fetch function and needs to be polled to clean itself up. - @RecursivePineapple
    • Added: TimedCache

Changes ​

  • #425 BlockState property values get NORMAL, UNVALIDATED and DEFERRED states (BlockPropertyState). BlockStatePool is opt-in with no singletons. Adds BlockPropertyValueConsumer, IllegalBlockStateException and FloatBlockProperty, expands Boolean and Integer properties, and changes BlockPropertyRegistry lookups to getValidProperties with a consumer. place() now takes a flags argument. - @RecursivePineapple
    • Added: deferred and unvalidated BlockState property values, BlockStatePool, FloatBlockProperty
    • Fixed: BlockState deserialization was not possible, thread safety issues from pooling
  • #359 Removes the shadowed libs and the shadowSources/jvmdgDowngraded17 configs. Adds the FalsePatternLib DepLoader bootstrap (gtnhlib_deps*.json, GTNHLibCore and GTNHLibRfbPlugin static blocks) that delegates to GTNHExtLib if present. The libs stay as api dependencies for POM publishing, and relocateShadowedDependencies is now true. - @mitchej123
    • Added: GTNHExtLib dependency, runtime dependency loader for fastutil, joml, brigadier
    • Removed: shadowed fastutil, joml, brigadier and jvmdowngrader API
  • #353 CallbackTessellator now uses one global TessellatorCallback through VertexCallbackManager and can mutate vertices. Adds VertexTransformCallback and MatrixHelper, turns GlyphReplacements into a Char2Char map, deprecates DirectDrawCallback and ITessellatorInstance, and restricts VertexFormat extension. The CallbackTessellator constructors taking a draw callback are removed. - @sisyphussy
    • Added: VertexTransformCallback, TessellatorCallback, MatrixHelper
    • Removed: CallbackTessellator constructors that take a draw callback
  • #352 TeamInfoSync carries a TeamRole. Adds Team.getRole, TeamActions (shared command logic), and moves the login team data sync into ServerEventHandler. Drops the PlayerDataSync packet from #351. Renames ITeamData.copyData to transferData and TeamDataCopyReason to TeamDataTransferReason, which breaks addons implementing ITeamData. - @cubefury
    • Added: Team role sync to the client, TeamActions
    • Removed: PlayerDataSync packet
    • Fixed: Team data not synced to clients in some team actions
  • #328 FontRendering.sizeStringToWidth and trimStringToWidth skip & sequences when the registered text preprocessor reports handlesAmpCodes, and track bold state (&l/&r) in the skip paths. Adds a TextPreprocessor interface, preprocessText and a setter for the preprocessor. Needs Angelica PR 1669. - @alppp
    • Added: & color code handling in font width methods
  • #322 ConfigException now extends RuntimeException. ConfigFieldParser and ConfigurationManager are reworked: Lombok val and NoArgsConstructor are replaced with plain Java, the string array sync bug is fixed, and the unused singleton instance is dropped. - @Nikolay-Sitnikov
    • Removed: Lombok usage in the config classes
    • Fixed: string arrays being synced incorrectly
  • #313 Adds BlockIconTransformer, which adds BlockModelInfo with nhlib$isModeled to Block, and ModelRegistry now marks modeled blocks from RPInfo gathered by ModelResourcePack.nhlib$gatherModelInfo. ModelISBRH is no longer overridden for custom loading. The per-block item renderer registration and test block registration move out of the proxies. Config options autoTextureLoading and modelIconWrapperMixin are removed. Adds BlockPropertyRegistry helpers and improved docs. - @ah-OOG-ah
    • Added: automatic model detection, BlockModelInfo interface, RPInfo record, lang entries for test blocks, two blockstate helper methods
    • Removed: autoTextureLoading config option, modelIconWrapperMixin config option, ISBRH override for custom model loading
    • Fixed: break particles ignoring the model particle texture
  • #291 Restores ClassConstantPoolParser#addString with @Deprecated and makes BYTES_TO_SEARCH non-final again, reverting the API break from #288. - @Alexdoru
    • Added: deprecated ClassConstantPoolParser addString method
  • #285 Enhanced GitHubReleaseClient to fix version comparison logic, limit per-page results to 10 releases, sort by publish date descending, and output both latest stable and prerelease URLs. - @Ranzuu
    • Fixed: version comparison for release detection, release sorting and output
  • #284 DirectTessellator sizes its buffer from vertex count times format vertex size and gets an overridable writeVertexData hook, and getWriteBuffer becomes public. Adds writeAttributeTransformed to the vertex attribute writers, with a matrix-transformed position and normal write path in VertexFormat. VertexFormatElement.Usage gains extra per-usage fields, and new tests are added. - @mitchej123
    • Added: transformed vertex write path, DirectTessellator and VertexFormat tests
  • #236 ModelISBRH now checks shouldSideBeRendered per pooled direction. JSONModel pools quads by cullFace (UNASSIGNED when unset), and ModelDeserializer reads light_emission. The particle mixin is renamed to MixinBlock_IconWrapper with a new modelIconWrapperMixin config option, and MissingModel is extended. PileOfQuads.BLANK is removed. - @Roadhog360
    • Added: modelIconWrapperMixin config option, light_emission support in JSON models, cullFace support in JSON models
    • Removed: PileOfQuads.BLANK
    • Fixed: JSON model lightFace and cullFace values, missing block icon for JSON model blocks
  • #223 Added TextureAtlas, AnimatedTexture, TextureLoader and SpriteAnimationMetadata, and a new UniversiumShader with uniforms for customization. Removed UniverseShader and its universe.vert. Split BloomTonemapShader out of CustomFramebuffer, fixed AutoShaderUpdater, dropped a redundant unbindFramebuffer() call, and bumped the lwjgl3ify compileOnly dependency to 3.0.0-beta.8. - @sisyphussy
    • Added: TextureAtlas and AnimatedTexture classes, new UniversiumShader, BloomTonemapShader
    • Removed: UniverseShader
    • Fixed: AutoShaderUpdater
  • #203 Adds disableBlockSoundMixins boolean config flag to GTNHLibConfig and conditions mixin registration in Mixins class. - @RecursivePineapple
    • Added: Block sound mixins configuration option

Bug Fixes ​

  • #478 Bumped GTNHExtLib from 1.0.4 to 1.0.5 in dependencies.gradle. GTNHLibRfbPlugin adds the xyz.wagyourtail.jvmdg. prefix to compatClassLoader().childDelegations. - @mitchej123
    • Fixed: Java 17 startup problem with JVM Downgrader classes
  • #474 IterableBitSet's iterator now tracks the last returned bit separately from the next set bit. remove() clears the last returned element and throws IllegalStateException if called without one, and nextInt() throws NoSuchElementException when exhausted instead of returning -1. - @Chitak985
    • Fixed: Hologram projector subchannel clearing not clearing projector NBT, IterableBitSet iterator removing the wrong bit, IterableBitSet iterator erroring after the last element
    • Closes GTNH#26755
  • #453 In ModelISBRH.renderWorldBlock, WorldWrapper is only instantiated when the block at the position differs from the rendered block. WorldWrapper.getBiomeGenForCoords now passes (x, z) instead of (x, y) to the wrapped world. - @sunshinekitsune
    • Fixed: wrong biome lookup for model blocks, extra allocation during chunk meshing
  • #452 Rewrote MixinFileResourcePack to parse pack.mcmeta independently using GSON instead of delegating to ResourcePackRepository's deserializer. Previous implementation caused NullPointerException during pack discovery, causing all packs to be dropped. Now validates metadata format before resource loading to avoid triggering exception handlers. - @sunshinekitsune
    • Fixed: resource pack initialization regression in v0.11.38
    • Closes #450
  • #449 Modified MixinFileResourcePack to only filter blockstate.json files from old resource packs, not all JSON files, preserving compatibility with mods using JSON for custom model formats. - @ah-OOG-ah
    • Fixed: false-positive filtering of ProjectBlue JSON models
  • #448 Modified EventBusSubTransformer and AutoEventBus to add class loading guards, consolidate error reporting, and validate method signatures against FML lifecycle restrictions. - @Nikolay-Sitnikov
    • Added: event handler signature validation, improved error messages
    • Fixed: EventBusSubscriber debug mode crash, invalid handler method detection
  • #447 Added FontRendering extension for Hex Text to follow Vanilla formatting rules where hex colors reset formatting codes, and fixed MonopartState/ResourceLoc to support legacy JSON block formatting. - @KAMKEEL
    • Added: Vanilla color code rules API
    • Fixed: legacy JSON parsing crash, Hex Text formatting parity
  • #443 Added logic to MixinFileResourcePack to detect and block loading of blockstate/model files from resource packs targeting newer MC versions. Modified ModelISBRH to wrap world context so block substitution is properly respected during recursive rendering. Added pack.mcmeta to resource tracking. - @ah-OOG-ah
    • Added: old model format detection and blocking
    • Fixed: crash from incompatible resource pack formats, block context in recursive model rendering
    • Closes #441
  • #439 Modified PlayerInventoryEventHandler to clear world reference after use, preventing long-lived event handler from holding stale world instances. - @Alexdoru
    • Fixed: world reference leak in inventory event handler
  • #434 Modified particle spawning in EffectRenderer, Entity, and RenderGlobal via mixins to pass full blockstate instead of just block ID. Added IBlockModelInfo and helper accessors for world state during particle spawning. - @ah-OOG-ah
    • Added: BlockModelInfo API, particle spawning accessors
    • Fixed: walk and fall particle icons on custom-modeled blocks
  • #433 Modified WavefrontVBOBuilder, DirectTessellator, TessellatorManager, and related vertex attribute writer classes to validate and apply VertexFormat constraints during mesh construction. Added comprehensive test coverage. - @mitchej123
    • Added: VertexFormat validation in WavefrontVBOBuilder, test suite for WavefrontVBOBuilder and TessellatorManager
    • Fixed: vertex format honor in wavefront model loading
  • #424 Updated TeamCommand tab-completion to include offline team members (cached by username) in addition to online members (+7-1 lines). - @Eldrinn-Elantey
    • Fixed: offline member suggestions in team commands
  • #422 Fixed MixinMinecraftServer to not leak profiler reference (+1-0 lines). - @mitchej123
    • Fixed: profiler leak
  • #420 Changed onFinishTextureStitch method in ClientProxy from instance to static to comply with Forge event handler expectations (+1-1 lines). - @Algent
    • Fixed: Client init crash on non-static event handler
    • Closes #419
  • #418 NBTJson.numberPattern is replaced with a regex allowing 1-20 integer digits and an optional fraction and [eE][-+]?digits exponent; also switches to pattern-matching instanceof. - @Sanduhr32
    • Fixed: NBTJson number regex accepting invalid notations
  • #413 Added MixinItemRenderer_Translucency to apply ITranslucentItem logic during equipped item rendering (+36 lines). - @SuperSoupr
    • Added: ITranslucentItem support for equipped items
    • Fixed: ITranslucentItem in hand view only
    • Closes UtilitiesInExcess#244
  • #408 Removed @ThreadSafe annotation from ModelISBRH because BlockState access is not thread-safe; prevents fatal crashes when Angelica attempts concurrent model access (+2-2 lines). - @FourIsTheNumber
    • Removed: @ThreadSafe annotation from ModelISBRH
    • Fixed: ModelISBRH crashes with Angelica
  • #405 Fixed ItemTransfer retry logic to handle size-dependent filters correctly; prevents revalidation of reduced stack sizes against filters that passed for larger stacks (+7-2 lines). - @Kogepan229
    • Fixed: Item transfer infinite loop with size-dependent filters
    • Closes GTNH#25297
  • #403 GTNHLibCore adds com.mojang.util.QueueLogAppender to the classloader exclusion set when org/bukkit/World.class or thermos/Thermos.class is found on the classpath. - @mitchej123
    • Fixed: Thermos console logging
  • #397 Corrected DirectTessellator state management (single-line fix). Does not affect CallbackTessellator or Display List Emulation mode. - @sisyphussy
    • Fixed: DirectTessellator trophy rendering
    • Closes GTNH#25104
  • #396 ChatComponentItemName.getUnformattedTextForChat() now wraps item names in brackets to match vanilla func_151000_E() behavior. - @Eldrinn-Elantey
    • Fixed: item name chat component formatting
  • #395 StandardInventoryIterator reordered checks to perform canInsert validation before maxStack checks, avoiding expensive O(n) stack limit calculations when insertion is impossible. - @AnsonYeung
  • #394 dependencies.gradle switches fastutil, joml, brigadier and the jvmdowngrader API to compileOnlyApi and adds testRuntimeOnly entries. GTNHExtLib goes to 1.0.2 and gtnhlib_deps.json now lists fastutil 8.5.18. The change also works better with the fplib deploader in dev. - @mitchej123
    • Fixed: dependency resolution for mods depending on jvmdg-using mods
  • #390 CustomGuiTextures.LIST_BACKGROUND used ModularUI.ID as the namespace; it now uses GTNHLib.MODID. The unused ModularUI import was removed. - @cubefury
    • Fixed: wrong texture location for the MUI2 list background
  • #389 FontRendering now correctly computes bold text width with hex color formatting. - @alppp
    • Fixed: bold text width with hex colors
  • #383 BlockStateCommand now checks WorldMutable before setting state; VanillaBlockProperties uses BlockFurnace.updateFurnaceBlockState for lit/unlit state instead of applying mod-defined furnace properties to all furnace variants. - @RecursivePineapple
    • Fixed: BlockStateCommand WorldMutable support, furnace lit state handling
  • #382 Fixed MissingModel and MixinFolderResourcePack to properly resolve models from directory-based resource packs. - @ah-OOG-ah
    • Fixed: model loading from folder resource packs
  • #381 Corrected hash calculation in ModelISBRH and WorldContext to properly incorporate all spatial dimensions in position-based randomization. - @ah-OOG-ah
    • Fixed: position hash for random models
  • #374 Updated GTNHLibCore with workarounds for record handling; modified dependency version constraint; updated gtnhlib_deps.json, gtnhlib_deps17.json, and gtnhlib_deps8.json to resolve deploader issues. - @mitchej123
    • Fixed: Angelica/Java8 record crash, ForgePatches deploader 1.9.0 compatibility
  • #373 Corrected lighting calculations in ModelISBRH and PileOfQuads; fixed MissingState and related state classes to propagate properly; improved WorldContext position hashing; added crash guards for malformed texture packs; updated ModelRegistry and JSONModel. - @ah-OOG-ah
    • Added: test blocks for RNG and weighted RNG, DirectionUtil utility methods
    • Fixed: rotated model lighting, inset face lighting, missing model propagation, texture pack crashes, randomized model selection
  • #371 Added optional patch component to PackVersion with default value of 0; version comparison logic updated to handle the additional component. - @Eldrinn-Elantey
    • Fixed: IllegalArgumentException when parsing three-part version strings
  • #358 Fixed DirectTessellator display list handling; updated DirectTessellatorTest to verify display list behavior. - @sisyphussy
    • Fixed: display list rendering corruption
    • Closes #357
  • #351 TeamAdminCommand.executeAdminDisband now also removes the team from every PENDING_MERGE_REQUESTS value set, and TeamManager gets additional cleanup. Adds ServerPlayerUtils and ClientPlayerUtils for player UUID and name resolution, plus a PlayerDataSync packet and ServerEventHandler login sync (removed again in #352). - @cubefury
    • Added: ServerPlayerUtils, ClientPlayerUtils
    • Fixed: Lingering team references after a team merge or admin disband, Stale pending merge requests pointing at a disbanded team
  • #348 Added same-team merge detection in TeamAdminCommand.forcemerge(); added duplicate merge prevention in TeamCommandsUtils and TeamManager.mergeTeam(). - @cubefury
    • Added: team self-merge prevention
    • Fixed: team force-merge data voiding
  • #347 In TeamDataSaver.loadFromNBT, team.putData is now called outside the hasKey check, so a newly registered data type gets a fresh instance on teams saved without it. - @tiffit
    • Fixed: Vending Machine voiding coins, new team data types missing on existing teams
    • Closes GTNH#24637
  • #346 Updated TeamAdminCommand and TeamCommand to use quotable string arguments for team name parsing, allowing spaces only when quoted. - @cubefury
    • Fixed: team names with spaces parsing
    • Closes #345
  • #341 Modified BlockIconTransformer to resolve ThreadLocal compatibility issue related to PR #320. - @ABKQPO
    • Fixed: ModelISBRH ThreadLocal incompatibility
  • #332 IndexBuffer.convertQuadsToTrigs(): now switches to GL_UNSIGNED_INT indices when vertex range exceeds 16-bit capacity. IndexedVAO: updated to respect dynamic index type. Fixes rendering of large batches like KaizPatch NGTObject (380k+ vertices). - @Kai-Z-JP
    • Fixed: rendering corruption in large quad batches with 16-bit index overflow
  • #320 Made ModelISBRH.INSTANCE a ThreadLocal to eliminate shared mutable state (worldContext, itemContext) that was being corrupted by concurrent rendering threads. - @Ruling-0
    • Fixed: race condition in ModelISBRH worldContext when using Angelica
  • #318 ModelDeserializer.java and JSONModel.java: corrected particle texture key from arbitrary iterator result to explicit '#particle' key. Fixed loadTextures to work with both block and item model contexts. - @Shigure-Ruiseki
    • Fixed: particle texture loading in JSON models for 1.7.10
  • #316 BlockIconTransformer.java: added obfuscated name comparisons since the transformer runs before DeobfuscationTransformer (35 lines added, 27 modified). - @danyadev
    • Fixed: BlockIconTransformer functionality in obfuscated production environments
  • #312 ModelQuad.colorIdx now defaults to -1. ModelQuadView#hasColor and ModelISBRH already treat -1 as no color index. - @Ruling-0
    • Fixed: untinted model quads defaulting to color index 0
  • #310 ModelISBRH.java: applied color channel fix to item model rendering (4 lines changed). - @Shigure-Ruiseki
    • Fixed: item model color channel order
  • #308 ModelISBRH.java: corrected color channel bit shifting for tint application (2 lines changed). - @Ruling-0
    • Fixed: color channel order in JSON model tints
  • #307 Moves TessellatorTransformer to core.shared.transformers and renames the FML and RFB wrappers to FMLTessellatorWrapper and RFBTessellatorWrapper. Adds SafeClassWriter, which resolves common superclasses through Mixin ClassInfo rather than Class.forName, and ByteCodeUtil getter/setter generators. BlockIconTransformer now implements the interface via ASM and can dump classes. GTNHLibCore reads TweakClasses from Launch.blackboard. - @Alexdoru
    • Added: SafeClassWriter, ByteCodeUtil, class dumping in BlockIconTransformer
    • Removed: unused code in the tessellator transformer
    • Fixed: tessellator transformer on Java 8
  • #302 MixinBlock_IconWrapper now checks RenderingRegistry.blockRenderers.get(getRenderType()) instanceof ModelISBRH instead of comparing the render type to JSON_ISBRH_ID, in all four getIcon wrappers. - @Shigure-Ruiseki
    • Fixed: icon wrapper ignoring ModelISBRH subclasses with their own render ID
  • #301 ClientProxy.java: corrected block crash by fixing postInit logic (8 lines added, 6 modified). - @sisyphussy
    • Fixed: crash when block data loads during postInit with specific mod combinations
    • Closes Angelica#1487
  • #300 In FontRendering, getStringWidth, sizeStringToWidth and trimStringToWidth add a fixed 1.0f for bold characters instead of fontParams.getShadowOffset(). - @DeathFuel
    • Fixed: bold text width differing from vanilla
  • #296 Updated EnhancedInfusionRecipe to copy the replacement list before passing to mixin, preventing the original list from being cleared at the end of infusion matrix operations. - @LazyFlesh
    • Fixed: EIr replacement list cleared after first use
  • #294 TessellatorRedirector exclusions now list com.gtnewhorizons.angelica.loading instead of angelica.transform. The rfb-plugin gtnhlib.properties transformerExclusions now uses a semicolon separator and lists com.gtnewhorizon.gtnhlib.core.shared and com.gtnewhorizon.gtnhlib.asm. - @Alexdoru
    • Fixed: transformer exclusion list for the tessellator redirector and RFB plugin
  • #293 Updated BloomShader to handle headless (server-side) rendering contexts gracefully, preventing exceptions when renderer is unavailable. - @sisyphussy
    • Fixed: HeadlessException in BloomShader
  • #290 Updated ConfigurationManager to filter out synthetic fields when walking class fields, preventing ConfigNode from picking up compiler-generated fields. Added test case to ConfigurationManagerTest. - @Caedis
    • Fixed: infinite loop in nested config class parsing
  • #287 Updated English localization file to properly escape backslashes in config tooltip strings. - @Ranzuu
    • Fixed: backslash rendering in config tooltips
  • #283 Added fallback check in SyncedKeybind#isKeyDown() to query actual key state when called from a GUI context, since GUI interactions bypass normal tick-based key tracking. - @Caedis
    • Fixed: keybinds not responding in GUIs
    • Closes #237
  • #264 UniversalVAO.getImplementation now tries the new VaoAppleLwjgl3Fallback.tryCreate() when neither Apple nor ARB VAO caps are reported, and logs a warning if nothing is available. The fallback resolves the APPLE function addresses through LWJGL3 method handles (MemoryStack, JNI calls). - @mitchej123
    • Added: LWJGL3 fallback for Apple VAO
    • Fixed: No VAO implementation found on LWJGL3 with Apple VAO
  • #253 MultiReleaseMemCopy.copy now requires bytes < 160 for the aligned 64-bit path and no longer masks the length with 0xFF, which truncated copies of 256 bytes or more. - @eigenraven
    • Fixed: memCopy length truncation in aligned path
  • #251 Removed or side-gated references to ItemRenderer and EntityRenderer (client-only classes) from Mixins.java to prevent NoClassDefFoundError on server startup. Updated build script for GTNHGradle compatibility. - @PLASMAchicken
    • Fixed: RuntimeException when loading ItemRenderer on server, RuntimeException when loading EntityRenderer on server
  • #248 Added initialization check in GTNHLibCore to validate dependencies at startup, preventing cryptic failures when required mods are missing or misconfigured. - @mitchej123
    • Fixed: dependency validation at startup
  • #241 Made simulatedSink a required method in SimpleItemIO and SimpleItemSink interfaces, and implemented it in DSU-related classes (DSUItemIO, DSUItemSink, DSUItemSource). Updated DSUInventoryIterator to handle sink simulation correctly. - @hiroscho
    • Fixed: simulatedSink contract enforcement for item I/O operations
  • #234 Updates normal calculations in ModelQuad to handle degenerate quad cases. - @mitchej123
    • Fixed: rendering of triangles stored as quads
  • #233 Single-line fix in UniversiumShader. - @sisyphussy
    • Fixed: UniversiumShader crash
  • #231 Adds missing uniform to UniversiumShader, splits shader events in ClientProxy. - @sisyphussy
    • Fixed: UniversiumShader uniform variable
  • #229 Moves UniversiumShader initialization from ClientProxy static block to lazy loading on first use. - @sisyphussy
    • Fixed: splash screen initialization issues
  • #225 Corrects logic flaw in SharedDepthFramebuffer that tried to link depth renderbuffer as depth texture instead of using texture attachment. - @sisyphussy
    • Fixed: HUD rendering with Iris disabled, depth framebuffer attachment
    • Closes Angelica#1149, #224
  • #218 Fixes ClassCastException in SharedDepthFramebuffer when Iris is not loaded. - @Alexdoru
    • Fixed: ClassCastException crash when enableIris=false
    • Closes Angelica#1146
  • #217 ItemStackMap's detail iterator remove() now calls backing.updateSize() after state.remove(this). - @Kogepan229
    • Fixed: ItemStackMap size not updating when removing via iterator
  • #212 Corrects ItemBlock facing in ModelISBRH, adds static INSTANCE and public render method for external usage, fixes ModelDeserializer loadADisplay, adds getDisplay method, introduces BlockTestTintMul test block with texture loading conflict resolution with DragonApi. - @Shigure-Ruiseki
    • Added: static INSTANCE in renderer, public render method, getDisplay method, BlockTestTintMul test block
    • Fixed: ItemBlock facing/direction, texture loading conflict with DragonApi, ModelDeserializer loadADisplay
  • #209 Refines UniverseShader texture sampling logic. Adds item texture variants of cosmic animations for broader shader application. - @chrombread
    • Added: Universe shader additional hooks, Item cosmic textures for shader use
    • Fixed: Weird lines in universe shader textures
  • #207 Adds initialization hooks to VAOManager and VertexArrayBuffer for splash-screen VAO creation, marks IModelCustomExt and VertexBuffer as beta APIs. - @sisyphussy
    • Added: VAO splash-screen initialization
    • Fixed: VAO creation during splash screen
  • #202 Corrects canExtract usage in item sources, adds null checks in ItemTransfer, fixes WrappedItemIO to call sinkIterator, and improves AbstractInventoryIterator and inventory handlers. - @RecursivePineapple
    • Fixed: canExtract applied to sinks instead of sources, NPE on extracted items in ItemTransfer, Railcraft Advanced Coke Oven compatibility
  • #200 Corrects stack size handling in ItemSink and StandardInventoryIterator to preserve quantities >64 and adds null checks in item extraction logic. - @RecursivePineapple
    • Fixed: Stacks >64 being truncated in pattern slot moves, NPE in item transfer
    • Closes GTNH#22524
  • #192 Removes FRMAccessor, SRRMAccessor, and related mixins (MixinFileResourcePack, MixinFolderResourcePack). Uses interface detection instead of mixin-injected duck typing in ModelRegistry and ModelResourcePack. - @ah-OOG-ah
    • Removed: Mixin-based resource pack type accessors, Duck typing mixins for resource packs
    • Fixed: ClassCastException with non-standard resource packs
    • Closes #191
  • #166 Moved the ITweakers, RFB plugin code and shared transformers into core/fml/tweakers, core/rfb and core/shared packages, and registered them by class name string. Split GTNHLibCoreModContainer out of GTNHLibCore, deleted MixinCompatHackTweaker, added LateTransformerRegistrationTweaker and the enableFontRendererMixin config. - @Alexdoru
    • Added: font renderer mixin config option
    • Removed: MixinCompatHackTweaker
    • Fixed: transformers not being applied, class loading issues across multiple class loaders

Performance ​

  • #454 In MixinFileResourcePack the cheap path checks (.json extension, path length, assets and blockstates segments) now run before the pack.mcmeta metadata is read and parsed. - @boubou19
  • #404 StandardInventoryIterator.extract returns the slot's stack directly and sets the slot to null when the stack size is at most the amount extracted; splitStack is only used for partial extraction. - @AnsonYeung
  • #401 ColorResource stores modId and name and builds the lang key on demand in getLangKey(). Per the PR body, it adds ALL and ACTIVE lists so reloads only re-check instances with a confirmed resource pack override, and invalidate() forces a full rescan. The diff shown is trimmed, so this part of the change is not visible in it. - @Ranzuu
  • #393 LocalTessellator gains collectQuads, writeQuads, writeToBuffer0 and getDataSize. VertexFormat now keeps its elements in an array (elementsArray) and the List getter is deprecated. TessellatorManager gets getMainThreadTessellator, ModelQuad gets a new setState overload, and CapturingTessellator is deprecated in favour of LocalTessellator and DirectTessellator. - @sisyphussy
    • Added: LocalTessellator quad collection and write methods, TessellatorManager.getMainThreadTessellator
  • #378 StandardInventoryIterator.insert computes the slot stack limit first. For non-forced inserts it returns early when inSlot.stackSize >= maxStack or the item is not stackable, before calling stack.matches. - @AnsonYeung
    • Fixed: Unneeded NBT matching on full target slots during inventory insertion
  • #298 Replaced @WrapMethod with cancellable injects in MixinModelFHC to avoid boxing primitive parameters into arrays during model rendering, reducing GC pressure in the rendering loop. - @Alexdoru
    • Fixed: runtime allocations in model rendering
  • #289 Updated transformer wrapper classes (RFBTessellatorRedirectorWrapper, RFBTessellatorTransformerWrapper) and TessellatorRedirector to use the new RFB transform signature. Updated dependency to newer RFB version. - @danyadev
  • #183 Splits VertexFormatElement.Usage.UV into PRIMARY_UV (index 0, no glClientActiveTexture) and SECONDARY_UV (index 1-31, keeps the call). DefaultVertexFormat texture and light elements use the new usages. - @sisyphussy

Removals ​

  • #288 Removes ClassConstantPoolParser#addString, makes the class final and the byte array field final, and replaces var with explicit types. Callers of addString no longer compile. - @Alexdoru
    • Removed: ClassConstantPoolParser addString method
  • #210 Deleted TexturesDebug, MixinDynamicTexture and MixinTextureAtlasSprite and the DEBUG_TEXTURES entry in Mixins. Moved to Hodgepodge (PR 672). - @Alexdoru
    • Removed: texture size debug mixins, TexturesDebug class

Internal / Refactor ​

  • #392 ColorResource drops its GTNHLib.LOG reference and uses a class-local log4j Logger, which removes a class dependency loop. The '[ColorResource]' log prefix was dropped. - @Ranzuu
  • #349 Adds IPacket (merges IMessage and IMessageHandler), NetworkChannel (handles ID increments) and NetworkUtils. Existing packets and handlers are ported, the separate *Handler classes are deleted, and registration takes packet instances instead of classes. - @0hwx
    • Added: IPacket interface, NetworkChannel
    • Removed: MessageTitleHandler, PlayerDataSyncHandler, TeamDataSyncHandler
    • Migration: Only GTNHLib's own channel changed: NetworkHandler.instance is now a NetworkChannel whose send methods take an IPacket, and PacketMessageAboveHotbar, PacketSyncConfig, PacketKeyDown and PacketViewDistance no longer implement IMessage or carry nested Handler classes. An addon's own IMessage packets on its own SimpleNetworkWrapper are unaffected.
  • #344 ITeamData#copyData is now called on the destination team data, takes the previous team's ITeamData and returns void. TeamManager.copyTeamData now iterates over the new team's data entries. - @tiffit
  • #261 Adds DirectTessellator, CallbackTessellator, DirectDrawCallback, GLCaps, FBOFunctions and an IVertexArrayObject/VertexBufferType API, and refactors VertexFormat. BakedModelBuilder.finish() now returns IVertexArrayObject. CapturingTessellator and DrawCallback are deprecated. Adds unit test setup with JUnit, Mockito and LWJGL natives. - @sisyphussy
    • Added: DirectTessellator, VBO/VAO API, GLCaps, unit test setup
    • Migration: The classes in client.renderer.quad.writers (IWriteQuads, ItemVBOQuadWriter and the Position*QuadWriter classes) are removed, and VertexFormat is now built only from VertexFormatElement... or taken from DefaultVertexFormat. VertexBuffer.draw(FloatBuffer) and render() are removed; move to DirectTessellator and the new VertexBuffer draw methods.

Documentation ​

  • #432 Adds @Nullable to getTeamByPlayer, @NotNull to getOrCreateTeam, and Javadoc recommending getOrCreateTeam. - @Sanduhr32
  • #412 README.md rewritten with Config, Events and Items sections, including InventoryChangedEvent, PickBlockEvent and EventBusSubscriber. - @Caedis
    • Added: README feature overview
  • #400 Javadoc update in ColorResource for the Factory and constructor modId parameter. Em dashes in the docs and in one log message were replaced with plain hyphens. - @Ranzuu
  • #337 Edits models.md to replace the ModelISBRH.JSON_ISBRH_ID render type requirement with a note that most blocks can be replaced, mainly those with ISBRHs. - @ah-OOG-ah
  • #257 Adds javadoc and comments to Fnv1a32 and Fnv1a64 explaining that signed byte sign extension flips the upper state bits in the XOR step. Also trims trailing whitespace in javadoc. No behaviour change. - @WNP78

Chores ​

  • #467 Adds GTNHLibConfig.enableModelDebugLogs (default false) and guards new MODEL_LOGGER calls in ModelRegistry, ResourceLoc, MonopartState, MultipartState, JSONModel and MixinFileResourcePack. The IOException log in ResourceLoc now includes the stack trace. - @RecursivePineapple
    • Added: enableModelDebugLogs config option
  • #444 Bumps GTNHExtLib from 1.0.3 to 1.0.4 in dependencies.gradle to pick up jvmdg 2.0.1, matching GTNHGradle PR 84. - @Nikolay-Sitnikov
  • #426 Adds HashMap2D, HashMap3D, HashSet2D and HashSet3D on fastutil long collections with packed coordinate keys, plus functional interfaces and XZ/XYZ coordinate types. IBlockPos now extends XYZAddressable. - @RecursivePineapple
    • Added: HashMap2D, HashMap3D, HashSet2D, HashSet3D
  • #416 Adds client-side ResourceUtil with a cached resourceExists check that walks the resource packs of SimpleReloadableResourceManager. The cache is cleared on TextureStitchEvent.Post in ClientProxy, and two access transformer entries are added. - @Ruling-0
    • Added: ResourceUtil resource existence cache

Contributors ​

Everyone who authored, reviewed or co-authored a change on this page, with how many of them:

@ah-OOG-ah (38), @sisyphussy (35), @RecursivePineapple (34), @Dream-Master (32), @mitchej123 (29), @Caedis (21), @Alexdoru (17), @boubou19 (16), @MalTeeez (13), @Nikolay-Sitnikov (13), @Ruling-0 (12), @cubefury (11), @Ranzuu (10), @FourIsTheNumber (9), @Shigure-Ruiseki (8), @tiffit (8), @Algent (7), @Roadhog360 (7), @alppp (6), @chrombread (6), @koolkrafter5 (6), @danyadev (5), @Eldrinn-Elantey (5), @AnsonYeung (4), @DarkShadow44 (4), @DeathFuel (4), @Lyfts (4), @SuperSoupr (4), @0hwx (3), @eigenraven (3), @Kogepan229 (3), @LazyFleshWasTaken (3), @leagris (3), @MassAnarchyy (3), @UltraProdigy (3), @Ethryan (2), @hiroscho (2), @Luca-Guettinger (2), @Sanduhr32 (2), @sunshinekitsune (2), @wlhlm (2), @ABKQPO (1), @C0bra5 (1), @Cardinalstars (1), @Chitak985 (1), @Connor-Colenso (1), @Discreater (1), @EternalQ (1), @felixfour (1), @flamingowrangler2869 (1), @FrostyFire1 (1), @Glease (1), @glowredman (1), @Guvante (1), @jss2a98aj (1), @Justxs (1), @Kai-Z-JP (1), @KAMKEEL (1), @LazyFlesh (1), @MeiTianyou (1), @PLASMAchicken (1), @querns (1), @RealSilverMoon (1), @slprime (1), @spacebuilder2020 (1), @Spicierspace153 (1), @Taskeren (1), @WNP78 (1), @YannickMG (1)