Skip to content

GTNHLib ​

179 merged pull requests.

New Features ​

  • #470 Added new team event types to TeamEvents and corresponding action handler methods to TeamActions for team system parity. - @EternalQ
    • Added: additional team events, team event handlers
    • Migration: Addon developers may register handlers for new team events in TeamEvents and implement corresponding TeamActions handlers.
  • #464 Extended InventoryChangedEvent with inventoryCount field tracking the quantity of changed items. Updated InventoryEventPoster, InventoryEventListeners, and PlayerInventoryScanner to propagate count information through the event pipeline. - @Caedis
    • Added: inventoryCount field on InventoryChangedEvent
  • #438 Added texture injection in ModelRegistry and created TexHelper, with mixins to TextureMap and TextureAtlasSprite to support non-block texture registration. - @ah-OOG-ah
    • Added: non-block texture support in JSON models, TexHelper utility
    • Removed: texture type restrictions in ModelDeserializer
    • Migration: Update custom JSON models that previously worked around texture restrictions to use the native non-block texture syntax.
  • #435 Introduced IFlowerPottable interface with lifecycle hooks (validatePlacement, addDropsToFlowerPot, preRender, writeNBT). Four mixins intercept flower pot logic: allowModdedFlowers checks interface, customFlowerPotDrops handles item drops, renderCustomFlowerPot delegates rendering, writeFlowerPottableNBT preserves custom data. Config flag gtnhlib$updateOnRead forces client blockstate updates. - @FourIsTheNumber
    • Added: IFlowerPottable interface, GTNHLibConfig.allowModdedFlowersInPots flag, four flower pot compat mixins
  • #426 Added HashMap2D, HashMap3D, HashSet2D, HashSet3D and supporting functional interfaces (Compute2D/3D, Consumer2D/3D, etc.) for efficient coordinate-based storage without manual key packing; includes ImmutableXYZ/XZ value types (+319-323 lines per structure). - @RecursivePineapple
    • Added: HashMap2D, HashMap3D, HashSet2D, HashSet3D, ImmutableXYZ, ImmutableXZ, coordinate functional interfaces
  • #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
  • #416 Added ResourceUtil class (+101 lines) to ClientProxy with access transformer configuration; enables resource loading utilities across mods. - @Ruling-0
    • Added: ResourceUtil class, resource utilities
  • #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 Added getter accessor to GlyphReplacements class (+4 lines). - @sisyphussy
    • Added: GlyphReplacements getter method
  • #393 LocalTessellator expanded with new rendering methods; VertexFormat replaced List<VertexFormatElement> with VertexFormatElement[] array for ~20-30% better write profiling; updated TessellatorManager and CapturingTessellator to support new methods; added ModelQuad support. - @sisyphussy
    • Added: LocalTessellator methods, VertexFormat array optimization
  • #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 ItemStackNBT now provides safe enchantment method that validates enchantment level as short, checks for existing enchantments before adding/updating, and handles edge cases of vanilla's flawed implementation. - @ah-OOG-ah
    • Added: safe enchantment method
  • #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 Created ColorResource class providing centralized color enum; registered in ClientProxy. Provides foundation for migrating color definitions from individual mods (Vending Machine, AE2, NEI, etc.) to a single authoritative source. - @Ranzuu
    • Added: ColorResource class, unified color system
  • #372 Added config flags in GTNHLibConfig; modified TeamActions, TeamCommand, TeamAdminCommand, and TeamCommandsUtils to check config before executing team operations; updated language strings for customizable team names. - @tiffit
    • Added: whitelabeling config for team system, option to disable team commands
  • #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 Added initialization flag tracking to LivingEquipmentChangeEvent; modified MixinEntityLivingBase to detect and pass initialization state; added access transformer for EntityLivingBase. - @Roadhog360
    • Added: initialization detection in LivingEquipmentChangeEvent
    • Fixed: LivingEquipmentChangeEvent missing init detection
    • 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 Added WavefrontVBOBuilder (optimized parser, direct VRAM upload) and CCWavefrontBuilder (Wavefront with group support, WIP); refactored MixinWavefrontObject; does not replace Forge's WavefrontObject. - @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 Added @Config.Reloadable annotation; enhanced ConfigurationManager.reloadConfig() to handle marked fields. - @Lyfts
    • Added: @Config.Reloadable annotation, config reload functionality
  • #338 Created WorldDeletionEvent class in client/event package, added mixin to MixinGuiSelectWorld to intercept world deletion, updated Mixins.java registry. - @Algent
    • Added: WorldDeletionEvent, MixinGuiSelectWorld mixin
  • #334 Added @Config.RequiresMod, @Config.RequiresModOr, and @Config.RequiresModAnd annotations to Config.java; modified ConfigurationManager and IConfigElementProxy to evaluate mod presence at GUI render time. - @slprime
    • Added: @Config.RequiresMod annotation, @Config.RequiresModOr annotation, @Config.RequiresModAnd annotation, mod presence checking in config GUI
  • #331 Added setSlotStackLimit(int) to ItemSink, updated InventoryItemSink to use the limit, and ItemTransfer now sets max slot stack size before transfers. - @Luca-Guettinger
    • Added: per-slot stack size limit to ItemSink API
  • #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
  • #328 FontRendering.java: added 151 lines supporting & color codes in sizeStringToWidth and trimStringToWidth. Color code handling is gated behind textPreprocessor check, maintains compatibility without Angelica. - @alppp
    • Added: & color code awareness in font methods
  • #326 ItemStackNBT.java: added two new helper methods (61 lines added, 6 modified). - @Alexdoru
    • Added: two ItemStackNBT helper methods
  • #323 Added ItemStackNBT.java utility class (628 lines) providing safe NBT manipulation API for ItemStack. - @Alexdoru
    • Added: ItemStackNBT helper class
  • #313 Major refactor of ModelRegistry and related classes: added BlockModelInfo and IBlockModelProvider interfaces, BlockPropertyRegistry for blockstate tracking, improved particle texture handling, and updated model detection logic to scan resource packs automatically. - @ah-OOG-ah
    • Added: BlockModelInfo interface, IBlockModelProvider interface, BlockPropertyRegistry, automatic model detection from JSONs, helper methods for model detection
    • Removed: manual ISBRH override support for custom model loading
    • Fixed: break particles now use model particle texture
  • #309 Added Abstract3DIterator.java base class (400 lines) and CubeIterator.java (145 lines) for 3D spatial iteration patterns. - @felixfour
    • Added: CubeIterator spatial iterator, Abstract3DIterator base class
  • #305 Added BFSLeafDecay.java utility class (95 lines) for block decay logic. - @Alexdoru
    • Added: BFSLeafDecay leaf decay utility
  • #304 Added StdLCG.java utility class and StdLCGTest.java with unit tests. Improved RNG behavior to match stdlib semantics. - @ah-OOG-ah
    • Added: StdLCG random number generator utility, StdLCGTest unit tests
    • Fixed: StdLCG now behaves identically to stdlib after seeding
  • #297 Implemented team system with Team, ITeamData, TeamDataRegistry, and network sync classes (TeamDataSync, TeamInfoSync). Added TeamCommand and TeamAdminCommand for player/admin management. Teams support multi-owner hierarchy, merge operations with custom data merging, and arbitrary data attachment via ITeamData implementations. - @FourIsTheNumber
    • Added: GTNHTeams system, Team class, ITeamData interface, TeamDataRegistry, TeamCommand, TeamAdminCommand, TeamDataSync, TeamInfoSync, team network handlers
    • Migration: New team system is available; existing solo play is unaffected, but multiplayer servers can now organize teams and leverage the new team features.
  • #295 Enhanced JsonModel loader with blockstate system support in BlockStateImpl, ModelISBRH, and model state classes. Added context classes (BakedModelQuadContext, ItemContext, WorldContext) for model resolution. Updated model baking pipeline to read blockstate variants and display from parents. Modified multiple baked model classes to support new context-aware rendering. - @Shigure-Ruiseki
    • Added: BlockStateImpl blockstate support, BakedModelQuadContext, ItemContext, WorldContext, blockstate-based model variants
  • #286 Introduced @Config.Order() annotation and integrated it into ConfigurationManager. Updated IConfigElementProxy to handle ordering. Added mixin MixinGuiConfig to sort config elements. Updated ExampleConfig to demonstrate usage. - @0hwx
    • Added: @Config.Order() annotation, config element ordering in GUI
  • #282 Implemented InventoryChangedEvent with ItemAdded and ItemRemoved post-types, backed by PlayerInventoryEventHandler, InventoryDiffer, and InventoryEventPoster. Tracks cursor, inventory, armor, crafting slots, and Baubles using item identity (id+meta only). Runs on configurable interval (inventoryScanInterval, default 5 ticks) and only when listeners are subscribed. - @Caedis
    • Added: InventoryChangedEvent, PlayerInventoryEventHandler, InventoryDiffer, InventoryEventPoster, PlayerInvState, ItemIdentity, BaublesCompat
  • #281 Added IConfigEntry interface to the config system; updated Config.java and ConfigurationManager.java to support custom entries. Included an ExampleConfig.java demonstrating usage. - @0hwx
    • Added: IConfigEntry interface, custom config entry support, ExampleConfig demonstration
  • #278 Introduced AbstractChatComponentBuffer, ChatComponentFluidName, and ChatComponentItemName classes to format chat output with proper fluid/item metadata. Also exported stack serialization helper methods from CommonProxy. - @Discreater
    • Added: ChatComponentFluid, ChatComponentFluidName, ChatComponentItemName, AbstractChatComponentBuffer, stack serialization helpers
  • #277 Introduced IBlockModelProvider interface allowing blocks to supply custom models, reduced JSONModel visibility of key variables to protected for extensibility, added name parsing to element parser for flags, and implemented transparency support via render pass 1. - @Ruling-0
    • Added: IBlockModelProvider interface, Transparency support in model rendering
  • #275 Added static factory method to EnhancedInfusionRecipe mirroring Thaumcraft API's addInfusionCraftingRecipe, allowing recipes to be created, registered, and returned for use in research pages in a single call. - @LazyFlesh
    • Added: EnhancedInfusionRecipe factory method
  • #270 Implemented EnhancedInfusionRecipe class with replacement list support and corresponding mixin (MixinEnhancedInfusionRecipe) to handle replacements when items are consumed. Added GTNHLibLateMixinLoader and late mixin config. - @LazyFlesh
    • Added: EnhancedInfusionRecipe, GTNHLibLateMixinLoader, MixinEnhancedInfusionRecipe, mixins.gtnhlib.late.json
  • #269 Added FormattedResearchPage class copied from Salis Arcana that extends Thaumcraft research pages to support translateToLocalFormatted text formatting. - @koolkrafter5
    • Added: FormattedResearchPage for Thaumcraft API
  • #268 Added IItemTexture interface and supporting classes (ItemTexture, BlockItemTexture, TexturedItemRenderer, ItemWithTextures, ItemRenderUtils) to abstract GL translation logic for multi-layer item rendering with dynamic coloring. - @RecursivePineapple
    • Added: IItemTexture interface, ItemTexture, BlockItemTexture, TexturedItemRenderer, ItemWithTextures, ItemRenderUtils
  • #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 Implemented mixin on Minecraft class to post a PickBlockEvent to Forge event bus at a call stack level that avoids conflicts with hodgepodge's pick block mixin. - @querns
    • Added: PickBlockEvent, MixinMinecraft_PickBlockTrap mixin
  • #255 Extended ArrayProximityMap4D with new method to perform forEachInRange using a caller-supplied range, with flipped calculation logic to produce equivalent results to the standard method when all items have that range. - @Ruling-0
    • Added: External range query method for 4D proximity map
  • #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 Added JVMDowngrader as a published API dependency in build configuration, exposed stubs via mixins, and updated tessellator classes to support the new API. Version 0.9.0. - @mitchej123
    • Added: JVMDG API stub exposure, MixinJarDiscoverer mixin for early FML stage
  • #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 Adds InventoryItemSink class, extends ItemSink with iterator capability, updates StandardInventoryIterator and WrappedItemIO. - @hiroscho
    • Added: InventoryItemSink class
  • #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 Adds ItemRenderUtil class ported from GT5-Unofficial GTRenderUtil. - @FourIsTheNumber
    • Added: ItemRenderUtil utility class
  • #223 Adds TextureAtlas and AnimatedTexture classes, rewrites UniversiumShader to use static texture atlasing, adds BloomTonemapShader, removes old UniverseShader, splits shader logic, improves AutoShaderUpdater. - @sisyphussy
    • Added: TextureAtlas class, AnimatedTexture class, SpriteAnimationMetadata class, TextureLoader class, BloomTonemapShader class, UniversiumShader (rewritten)
    • Removed: UniverseShader old implementation
    • Fixed: shader initialization, AutoShaderUpdater
  • #221 Adds GlyphReplacements utility class for registering custom glyph mappings. - @boubou19
    • Added: GlyphReplacements registry class
  • #219 Introduces GlyphReplacements utility class for registering custom glyph mappings, intended for use by Angelica and GT5-Unofficial. - @DeathFuel
    • Added: GlyphReplacements registry class
  • #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 Adds UV rotation logic to JSONModel and BakeData to counter-rotate UVs during model rotations, matching vanilla Minecraft behavior. - @DarkShadow44
    • Added: UV locking for rotated 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 Implements ItemDuctSink handler and adds duct detection logic to ItemUtil for IItemDuct compatibility. - @RecursivePineapple
    • Added: IItemDuct support for EnderIO and BuildCraft, ItemDuctSink implementation
  • #195 Introduces IBlockWithCustomSound interface. Adds optional WrapOperation mixins in MixinEntity, MixinEntityLivingBase, MixinEntityHorse, MixinItemBlock, MixinItemSlab, MixinPlayerControllerMP, and MixinRenderGlobal to check for custom sound control. - @RecursivePineapple
    • Added: IBlockWithCustomSound interface, Dynamic block sound mixins for all sound access points
  • #193 Extends CapturingTessellator with compiling mode, introduces DrawCallback and CapturedDraw for callback-based rendering, adds QuadExtractor and quad writer implementations (PositionColorQuadWriter, etc.), and enhances TessellatorManager with callback support. - @mitchej123
    • Added: Compiling tessellator mode with callbacks, DrawCallback interface, CapturedDraw for draw capture, QuadExtractor for geometry extraction, Quad writer implementations
  • #188 Implements SimpleItemSource, SimpleItemSink, and SimpleItemIO to centralize slot management logic. Adds DSU support via DSUInventoryIterator, DSUItemIO, DSUItemSink, and DSUItemSource for Jabba compatibility. - @RecursivePineapple
    • Added: SimpleItemSource, SimpleItemSink, SimpleItemIO, DSU item moving support, DSU inventory iterator
  • #186 Introduces CustomFramebuffer for flexible framebuffer management, PostProcessingManager and PostProcessingHelper for effect orchestration, VAOManager and VaoFunctions for VAO operations, SharedDepthFramebuffer for efficient depth sharing, and shader classes for bloom and tonemapping. - @sisyphussy
    • Added: CustomFramebuffer implementation, PostProcessingManager and PostProcessingHelper, VAOManager and VAO utility classes, SharedDepthFramebuffer for depth attachment sharing, BloomShader and tonemapping support, I3DGeometryRenderer for delayed rendering
  • #176 Implements BlockState interface, BlockStateImpl concrete class, BlockPropertyRegistry, and property types (BlockProperty, MetaBlockProperty, etc.). Includes vanilla block property definitions and command support for debugging. - @RecursivePineapple
    • Added: BlockState system with pooling, BlockProperty and BlockPropertyTrait classes, BlockStateCommand for debugging, VanillaBlockProperties registry, Property types for axes, directions, and metadata
  • #175 Introduces BakedModelBuilder for constructing baked models, NormalHelper for normal vector computation, and extends CapturingTessellator with additional capture utilities. - @sisyphussy
    • Added: BakedModelBuilder for model construction, NormalHelper for normal computation, CapturingTessellator extensions
  • #171 Implements TimedCache using generations of cached objects that are periodically checked for expiration. New entries start in generation 0 and are promoted as they remain valid, avoiding unbounded memory growth. - @RecursivePineapple
    • Added: TimedCache generational cache implementation
  • #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

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

Changes ​

  • #353 Made CallbackTessellator use global Callback state; added VertexTransformCallback for vertex mutations; converted GlyphReplacements to Char2Char map; made VertexFormat less extensible; added MatrixHelper and VertexCallbackManager utilities. - @sisyphussy
    • Added: VertexTransformCallback, MatrixHelper, VertexCallbackManager, TessellatorCallback
    • Removed: VertexFormat extensibility
  • #352 Refactored team data syncing strategy: removed PlayerDataSync UUID sync (too expensive), added TeamActions class for centralized team operation handling, enhanced TeamInfoSync, added TeamManagerClient, added TeamRole visibility tracking. - @cubefury
    • Added: TeamActions, TeamManagerClient, TeamRole enhancement, team member sync on state changes
    • Removed: PlayerDataSync (full sync), expensive player UUID sync
  • #344 Refactored ITeamData.copyData(prevTeamData) to match mergeData pattern: now called on destination team, accepts previous team data, returns void instead of previous signature. - @tiffit
    • Migration: Callers of ITeamData#copyData must update to the new signature: call on the destination, pass prevTeamData, handle void return.
  • #322 ConfigException.java: changed to extend RuntimeException. ConfigFieldParser.java: fixed string array sync bug and removed outdated Lombok. ConfigurationManager.java: minor cleanup (56 lines added, 51 removed across files). - @Nikolay-Sitnikov
    • Removed: outdated Lombok annotations
    • Fixed: string array synchronization bug in config system
  • #312 ModelQuad.java: changed colorIdx default initialization to -1 (1 line changed). - @Ruling-0
  • #300 Adjusted FontRendering utility to achieve parity with vanilla Minecraft font rendering for text appearance consistency. - @DeathFuel
  • #291 Re-added addString() method to ClassConstantPoolParser marked as @Deprecated to maintain API compatibility while discouraging its use. - @Alexdoru
    • Added: deprecated ClassConstantPoolParser#addString method
  • #289 Updated transformer wrapper classes (RFBTessellatorRedirectorWrapper, RFBTessellatorTransformerWrapper) and TessellatorRedirector to use the new RFB transform signature. Updated dependency to newer RFB version. - @danyadev
  • #288 Removed the addString() method capability from ClassConstantPoolParser to prevent runtime resizing of the internal data structure, which could cause unforeseen performance degradation. - @Alexdoru
    • Removed: dynamic string addition to ClassConstantPoolParser
  • #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 Modified vertex format handling, tessellator, and attribute writers in DirectTessellator, VertexFormat, VertexFormatElement, and attribute writer classes. Added GLCaps support and vertex attribute writer implementations. Includes new unit tests for tessellator and vertex format. - @mitchej123
    • Added: NormalVertexAttributeWriter, PositionVertexAttributeWriter, DirectTessellatorTest, VertexFormatTest
  • #236 Renames MixinBlock_Particle mixin, corrects JSONModel lightFace and cullFace interpretation, updates MissingModel, improves ModelQuadFacing handling, enhances ModelDeserializer, updates various model loading and rendering classes. - @Roadhog360
    • Added: MixinBlock_IconWrapper for particle icon wrapping, ModelQuadFacing enhancements
    • Removed: old MixinBlock_Particle
    • Fixed: particle icon wrapper logic, model face culling interpretation, model face lighting
  • #203 Adds disableBlockSoundMixins boolean config flag to GTNHLibConfig and conditions mixin registration in Mixins class. - @RecursivePineapple
    • Added: Block sound mixins configuration option
  • #100 Refactored model system with new classes: BakeData, JSONVariant, ModelISBRH, NdQuadBuilder, and related rendering infrastructure. Removed old implementations DynamicCubeModel, GeometryHelper, ModelLoader. Added GTNHLibConfig for model settings. Updated ClientProxy and added test block BlockTest. - @ah-OOG-ah
    • Added: BakeData model baking support, JSONVariant model variant handling, ModelISBRH ISBRH model implementation, NdQuadBuilder quad construction, GTNHLibConfig configuration, BlockTest test block
    • Removed: DynamicCubeModel, GeometryHelper, ModelLoader, Material, LICENSE file
    • Migration: Dependent mods (Angelica, MatterManipulator) must update to use the new JSON model API; see linked PRs.

Bug Fixes ​

  • #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 Corrected regex in NBTJson NumberPattern to reject invalid notations (missing exponent digits, oversized integers) while accepting valid formats (+24-20 lines). - @Sanduhr32
    • Fixed: Number pattern validation accuracy
  • #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 Added fix to GTNHLibCore for Thermos console logging (+6 lines). - @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 Modified dependencies.gradle and gtnhlib_deps.json files to properly resolve transitive jvmdg dependencies and handle fplib deploader more gracefully. - @mitchej123
    • Fixed: jvmdg dependency resolution, fplib deploader compatibility
  • #390 Fixed incorrect file location in CustomGuiTextures resource reference. - @cubefury
    • Fixed: file path reference
  • #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
  • #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 Modified TeamDataSaver to ensure new team data types are added to pre-existing teams during load/merge. - @tiffit
    • Fixed: vending machine coins voiding on team data type changes
    • Migration: Existing saves affected by the vending machine coin void bug will need to migrate team data; reload the world or verify affected team data structures after updating.
    • 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
  • #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
  • #302 MixinBlock_IconWrapper.java: changed instanceof check to be more flexible for ModelISBRH subclasses. - @Shigure-Ruiseki
    • Fixed: model compatibility with custom ModelISBRH implementations
  • #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
  • #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 Corrected transformer exclusion rules in TessellatorRedirector and gtnhlib.properties RFB plugin configuration. - @Alexdoru
    • Fixed: transformer exclusions
  • #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
  • #274 Remapped mixin injections in MixinEnhancedInfusionRecipe from writeToNBT/readFromNBT to their obfuscated equivalents func_145841_b/func_145839_a to target the actual overridden TileEntity methods in the non-dev environment. - @danyadev
    • Fixed: EnhancedInfusionRecipe not working in production environments
  • #264 Extended UniversalVAO to include LWJGL3 fallback implementation for Apple platforms via new VaoAppleLwjgl3Fallback class. - @mitchej123
    • Added: VaoAppleLwjgl3Fallback
    • Fixed: VAO support on Apple platforms
  • #253 Fixed logic error in MultiReleaseMemCopy class to align with LWJGL3's reference implementation for memory utilities. - @eigenraven
    • Fixed: memCopy logic error
  • #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
  • #249 Updated build scripts per GTNHGradle#70 and added side-safety checks to mixins to prevent loading ItemRenderer and EntityRenderer (client-only classes) on dedicated servers. - @Dream-Master
    • Fixed: server startup errors from client class loading, NoClassDefFoundError for ItemRenderer on SERVER side, NoClassDefFoundError for EntityRenderer on SERVER side
  • #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 Updates ItemStackMap iterator removal to properly decrement the size counter. - @Kogepan229
    • Fixed: ItemStackMap size not updating on iterator removal
  • #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

Performance ​

  • #454 Reordered checks in MixinFileResourcePack to perform cheap filename/path comparisons before expensive metadata deserialization, avoiding unnecessary JSON parsing. - @boubou19
  • #453 In ModelISBRH: (1) fixed getBiomeGenForCoords to pass (x, z) instead of (x, y), (2) deferred WorldWrapper instantiation to only when block substitution occurs instead of on every renderWorldBlock call, reducing allocation overhead. - @sunshinekitsune
    • Fixed: biome coordinate bug in world wrapper, unnecessary WorldWrapper allocations
  • #404 Optimized StandardInventoryIterator to eliminate redundant NBT copying on item extraction (+9-3 lines). - @AnsonYeung
  • #401 Replaced permanent langKey field storage with on-demand generation via getLangKey(). Replaced INSTANCES collection with ALL (all instances) and ACTIVE (only resource-pack-overridden instances), reducing heap usage from ~150KB to near-zero and limiting lookups only to overridden entries. - @Ranzuu
    • Added: ACTIVE collection for overridden resources
    • Removed: langKey stored field
  • #378 StandardInventoryIterator now checks if overstacking is possible before performing NBT matching; uses same logic as insertion calculation to determine when NBT comparison is required. - @AnsonYeung
  • #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
  • #183 Eliminates unnecessary glClientActiveTexture invocations in DefaultVertexFormat and VertexFormatElement during VBO bind/draw operations. - @sisyphussy

Internal / Refactor ​

  • #425 Refactored BlockState to support property value states (normal, unvalidated, deferred); replaced singleton pooling with opt-in BlockStatePool; enhanced property validation and deserialization; extensive changes across BlockStateImpl, BlockProperty, and property classes (+204 lines in BlockState, +990 in BlockStateImpl, +multiple property implementations). - @RecursivePineapple
    • Added: BlockPropertyState enum, BlockStatePool, IllegalBlockStateException, deferred property support, BlockPropertyValueConsumer
    • Removed: singleton pool pattern
    • Fixed: thread-safety in BlockState pooling, deserialization support
    • Migration: Update code using BlockState API to handle deferred property validation and opt-in pooling; see BlockState documentation for migration details.
  • #392 ColorResource now uses Minecraft's logger instead of a custom implementation, eliminating a dependency loop. - @Ranzuu
    • Removed: dependency loop
  • #359 Moved shadowed dependencies to GTNHExtLib FatJar; added optional runtime loader in GTNHLibCore and GTNHLibRfbPlugin; added gtnhlib_deps.json manifests for version/bootstrap delegation; updated build.gradle.kts and dependencies.gradle. - @mitchej123
    • Added: optional dependency loader, gtnhlib_deps.json, gtnhlib_deps17.json, gtnhlib_deps8.json
    • Removed: shadowed JOML/libraries from GTNHLib
    • Migration: Mods depending on GTNHLib must ensure GTNHExtLib is present, or the optional dependency loader will pull in joml/etc at runtime.
  • #351 Added ServerPlayerUtils and ClientPlayerUtils utility classes; fixed TeamManager and team command logic to properly clean up merged/disbanded team references; enhanced PlayerDataSync handling. - @cubefury
    • Added: ServerPlayerUtils, ClientPlayerUtils, ServerEventHandler player tracking
    • Fixed: lingering team references after merge/disband
  • #349 Merged IMessage/IMessageHandler into IPacket; created NetworkChannel for incremental packet ID assignment; migrated all existing packets (PacketSyncConfig, PacketKeyDown, MessageTitle, etc.) to new system; removed handler classes. - @0hwx
    • Added: IPacket interface, NetworkChannel, NetworkUtils
    • Removed: MessageTitleHandler, PlayerDataSyncHandler, TeamDataSyncHandler
    • Migration: Mods using GTNHLib networking must migrate from IMessage/IMessageHandler to IPacket and use NetworkChannel for registration, passing packet instances instead of classes.
  • #307 Reorganized transformer packages to shared/transformers, added SafeClassWriter using mixin class info instead of reflection, refactored TessellatorTransformer and BlockIconTransformer, removed dead code, and added class dumping capability. - @Alexdoru
    • Added: SafeClassWriter class, ByteCodeUtil class, FMLTessellatorTransformerWrapper, TessellatorTransformer in shared package
    • Removed: old TessellatorTransformer from fml package
    • Fixed: Java 8 compatibility in Tessellator transformer
  • #261 Replaced internal tessellator usage with DirectTessellator throughout GTNHLib, added proper VBO/VAO API abstractions, refactored VertexFormat handling, and added new rendering classes (CallbackTessellator, DirectDrawCallback). Legacy classes marked for deprecation. - @sisyphussy
    • Added: DirectTessellator, CallbackTessellator, DirectDrawCallback, NormalHelper, FBOFunctions, GLCaps, New vertex format and rendering utilities
  • #222 Adds PrimitiveExtractor, ModelLine, and ModelTriangle classes; refactors CapturingTessellator and TessellatorManager to handle multiple primitive types; removes CapturedDraw; updates API for Angelica. - @mitchej123
    • Added: PrimitiveExtractor class, ModelLine primitive class, ModelTriangle primitive class, ModelPrimitiveView interface
    • Removed: CapturedDraw class
    • Fixed: tessellator memory allocations
  • #210 Removes TexturesDebug class and debug mixins (MixinDynamicTexture, MixinTextureAtlasSprite) from GTNHLib, delegating to Hodgepodge. - @Alexdoru
    • Removed: TexturesDebug debug utility, Texture debug mixins
  • #166 Restructures core/ to separate fml/tweakers, rfb, and shared packages to respect ClassLoader boundaries. Replaces ClassName.class.getName() with string registration for ITweakers and IClassTransformers. Fixes TessellatorRedirectorTransformer registration and consolidates transformer logic. - @Alexdoru
    • Added: Isolated package structure for ClassLoader separation, GTNHLibCoreModContainer, LateTransformerRegistrationTweaker
    • Removed: MixinCompatHackTweaker
    • Fixed: Transformer registration failures, Class loading across ClassLoaders
    • Migration: ASM-heavy addons must relocate ITweaker and RFB plugin classes to dedicated packages as described; avoid cross-package references from coremod code.

Documentation ​

  • #412 Expanded README documentation (+58-8 lines). - @Caedis
  • #400 Added JavaDoc and comments to ColorResource (+13 lines, -5 lines). - @Ranzuu
  • #337 Edits to models.md documentation file (+4-5 lines). - @ah-OOG-ah
  • #257 Added javadoc explaining that the Java implementation of Fnv1a expands signed bytes to 32/64-bit values during XOR, causing upper bits to flip. Left unfixed to preserve existing worldgen seeds. - @WNP78

Chores ​

  • #467 Added conditional log statements throughout model system when gtnhlib debug config is enabled, including ModelRegistry, ResourceLoc, and JSON model processing. - @RecursivePineapple
    • Added: debug logging
  • #444 Updated dependencies.gradle to pull GTNHExtLib with jvmdg 2.0.1, matching GTNHGradle#84. - @Nikolay-Sitnikov
  • #432 Added JavaDoc and null-safety annotations to TeamManager class (+9 lines). - @Sanduhr32

Contributors ​

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

@ah-OOG-ah (37), @sisyphussy (35), @Dream-Master (31), @RecursivePineapple (31), @mitchej123 (28), @Caedis (21), @Alexdoru (17), @boubou19 (17), @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), @DeathFuel (5), @Eldrinn-Elantey (5), @AnsonYeung (4), @Lyfts (4), @SuperSoupr (4), @0hwx (3), @DarkShadow44 (3), @eigenraven (3), @Kogepan229 (3), @LazyFleshWasTaken (3), @leagris (3), @MassAnarchyy (3), @UltraProdigy (3), @Connor-Colenso (2), @Ethryan (2), @hiroscho (2), @LazyFlesh (2), @Luca-Guettinger (2), @Sanduhr32 (2), @sunshinekitsune (2), @wlhlm (2), @ABKQPO (1), @C0bra5 (1), @Cardinalstars (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), @MeiTianyou (1), @PLASMAchicken (1), @querns (1), @RealSilverMoon (1), @slprime (1), @spacebuilder2020 (1), @Spicierspace153 (1), @Taskeren (1), @WNP78 (1), @YannickMG (1)