ProjectRed
30 merged pull requests.
Needs action on an existing world:
- [check your build] #60 The Auto Crafting Bench now matches NBT when it checks and takes ingredients. It no longer crafts with items whose NBT differs from the recipe plan. Crafts that relied on mismatched NBT, such as renamed or enchanted items, will stop working.
After updating, check your Auto Crafters. An Auto Crafter only accepts ingredients whose NBT tag matches the plan exactly now, so any crafter that was quietly being fed a differently tagged item, renamed, enchanted, or carrying any other NBT, stops producing without an error. Re-make the plan using the exact item you actually feed it.
New Features
- #98 Adds recolour(newColour) to IBundledCablePart and TBundledCableCommons, which updates colour, marks the tile dirty, sends a stream packet with key 11 and repropagates the signal. Colored bundled WireDefs now get a "pr_fbundled" second name, and read() handles key 11. - @DreamYao520
- Added: spray can recoloring for bundled cables
- #96 Added recolour to IInsulatedRedwirePart and implemented it in TInsulatedCommons: sets colour, marks dirty, writes stream key 11, updates connections, propagates signal and notifies part change. Client read handles key 11. - @DreamYao520
- Added: recoloring of insulated wires
- #89 Added Configurator.enableInductiveFurnace (default true) under Machine Settings. ExpansionRecipes skips InductiveFurnaceRecipeLib.init and the furnace crafting recipe when it is false. - @boubou19
- Added: Inductive Furnace enable config
- #79 Implemented IInventory interface in TileBlockBreaker to enable pipe network integration. - @Luca-Guettinger
- Added: IInventory implementation in block breaker
- #66 Added configuration option in Configurator and updated lightmicroblocks rendering to enforce light level 15 when enabled. - @june-dev-username
- Added: Configuration option for sawn lamp light level
- Fixed: Sawn lamps sometimes producing no light
Changes
- #92 Added TexturedPanNode, a PanNode subclass that draws track and handle from the new textures/gui/scrollbar.png as nine-slice tiles, registered as PRResources.guiScrollBar. guiicworkbench, tileicprinter and the requester GUI now use it. - @Ranzuu
- Added: textured scroll bars, scrollbar texture
- Fixed: scroll bars looking broken in resource packs
- #71 Added 4 new localization strings and updated guis.scala to reference localized keys for GUI element text. - @Ranzuu
- Added: GUI element localization strings
- #64 Added separate localization keys in en_US.lang and updated AutoCrafter, BatteryBox, BlockPlacer, ChargingBench, ElectrotineGenerator, FilteredImporter, InductiveFurnace, ProjectBench, and GUI classes to use container-specific keys. - @Ranzuu
- Added: Separate GUI title localization strings (16 new entries)
- Fixed: GUI localization display issues
- #61 Corrected capitalization in en_US.lang localization file (37 strings). - @ModularityEnjoyer
- Fixed: Capitalization inconsistencies in localizations
Bug Fixes
- #97 RenderComparator.renderModels in gaterenders.scala no longer applies orient % 24 to the chip models and passes orient unchanged. - @Algent
- Fixed: wrong + / - signs on a flipped ProjectRed comparator
- Closes GTNH#26991
- #94 NewICNode in guiicworkbench.scala now uses an anonymous SimpleTextboxNode that overrides drawBack_Impl to draw a full 0xffa0a0a0 rect (size + 2) before calling super, covering the edges the library skips. - @Ranzuu
- Fixed: missing right and bottom border on the IC redraw name textbox
- #86 Changed the hardcoded toolset name string in GuiICWorkbench. - @PLASMAchicken
- Fixed: IC Workbench misspelling of Primitives
- Closes GTNH#26150
- #85 ItemStorage.load in deviceabstracts.scala read the itemFlow tag list with type 0 instead of 10 (compound), so the list came back empty. Changed to 10. - @ModularityEnjoyer
- Fixed: ProjectRed devices voiding their internal buffer on world reload
- Migration: Items that ProjectRed devices dropped from their internal buffer on earlier world loads are gone for good. From now on items in an Item Importer survive a world load.
- Closes GTNH#25041
- #82 The rwConnectable ThreadLocal in WirePropagator was only set on the client thread, so the server thread got false and canConnectRedstone() always returned false. It now uses initialValue() returning true. - @Luca-Guettinger
- Fixed: ProjectRed wires not providing redstone power, red alloy wire not triggering machines or redstone lamps
- Migration: Red Alloy wire starts powering lamps and machines again, so anything wired to one may switch on the first time you load in.
- Closes GTNH#24592, GTNH#24634
- #81 Fixed world client leak in exploration and fabrication TESR modules by cleaning up light matrix references. - @Alexdoru
- Fixed: Light matrix memory leak in renders
- #76 Fixed reusableRun object pool references in ProjectRedTransmission, wirepropagation.scala, and propagation.scala that were preventing garbage collection. - @Alexdoru
- Fixed: Memory leak in wire propagation, Memory leak in fabrication wire propagation
- #75 ChipDynamicItemResponder.filterAllows in ChipResponder.scala now checks whether the wrapped inventory's getAllItemStacks keys contain the item, instead of calling hasItem. - @Dragovorn
- Fixed: Dynamic Item Responder Chip not routing into locked drawers holding 0 items
- #68 TArrayCellTopOnly in gatepartarray.scala now has its own onChange and scheduledTick, with a delay of 2 and helpers for redwire input and output calculation. ANDCell no longer mixes in TSimpleRSGateLogic and its calcOutput now tests the input bits. Ported from an upstream ProjectRed commit. - @Engineer12798
- Fixed: pulse behaviour of array gates
- #67 BaseLightPart in lightpart.scala now overrides shouldRenderDynamic to return true. - @Worive
- Fixed: missing glow on non-full block lamps
- Closes GTNH#23112
- #65 In PluginStorageDrawers, StorageDrawersInvWrapper.hasItem now calls a new hasPrototype, which checks each drawer's stored item prototype against the ItemKey instead of requiring a count above 0. - @ModularityEnjoyer
- Fixed: Dynamic Item Responder Chip not routing items into empty locked Storage Drawers
- Closes GTNH#23020
- #62 Backport of an upstream ProjectRed fix. ContainerProjectBench now overrides transferStackInSlot and returns null for the output slot (28) when canTakeStack fails for the player. - @PLASMAchicken
- Fixed: item duping when crafting in the Project Bench, item duplication from shift clicking the craft button with a recipe plan
- Closes Dupes-Exploits-GTNH#216, Dupes-Exploits-GTNH#224
- #60 TileAutoCrafter sets matchNBT = true in containsEnoughResource and eatResource. - @Worive
- Fixed: Auto Crafting Bench crafting with items of different NBT
- Migration: After updating, check your Auto Crafters. An Auto Crafter only accepts ingredients whose NBT tag matches the plan exactly now, so any crafter that was quietly being fed a differently tagged item, renamed, enchanted, or carrying any other NBT, stops producing without an error. Re-make the plan using the exact item you actually feed it.
- #59 TileBlockBreaker and TileDiamondBlockBreaker now pass the target block coordinates (bc.x, bc.y, bc.z) to playAuxSFXAtEntity instead of the breaker's own x, y, z. - @DarkShadow44
- Fixed: crash when a Block Breaker breaks a block that checks its tile entity by position
Performance
- #88 Added regression tests for rendered models; lazily construct gate renderers and component models; precompute built-in wire layouts while preserving resource-pack overrides; cache wire geometry and torch geometry while isolating mutable state. - @boubou19
- Added: Regression tests for gate models, Wire layout precomputation
- Removed: Redundant wire geometry copies
- #87 Refactored lamp rendering: light values now use per-world packed hash table instead of tile entity lookups; inverted state derived from metadata + redstone on tick; halos moved from TESR to batched VBO sorted by color, rebuilt only on cache changes. Removed per-lamp halo rendering config. - @boubou19
- Added: Halo batching system
- Removed: Lamp halo quantity config option
- #78 MultiComponentModel now bakes 2 dynamic models per part and applies orientPrecomputed at render time. SingleComponentModel gets a UV transformation list (extraTransformModelUV). BaseComponentModel becomes a shared singleton used by gate renderers and RenderCircuitGate. - @AnsonYeung
- Fixed: texture transformation applied as a coordinate transformation in one render path
- #77 SingleComponentModel bakes one dynamic model pair (normal and flipped) instead of 48 baked copies. Rotation is applied at render time through a TransformationList with precomputed orientation transforms and the standard light model. BundledCableModel transforms are precomputed in ComponentStore. - @AnsonYeung
- Fixed: high memory use of gate component models
- #69 Implemented recipe result caching in TileAutoCrafter to reduce redundant recipe lookups. Profiling shows substantial reduction in CPU usage under load. - @Caedis
- Added: Recipe caching mechanism in AutoCrafter
Internal / Refactor
- #72 Replaced the Scala MossSpreadHandler (IBlockEventHandler via BlockUpdateHandler) with a Java version called from updateTick. Added BlockMossyCobblestone, early mixins BlockMixin and BlockStoneBrickMixin, an EarlyMixinLoader core mod and mixin configs, and enabled usesMixins in gradle.properties (also usesMixinDebug = true). - @MalTeeez
- Added: mixin-based moss spread handling
- Removed: IBlockEventHandler-based moss spread handler
Documentation
- #80 LICENSE.md replaced with MIT license text. - @xronin01
- Removed: Restricted Public Software License
Contributors
Everyone who authored, reviewed or co-authored a change on this page, with how many of them:
@boubou19 (7), @UltraProdigy (5), @Alexdoru (4), @Dream-Master (4), @Ranzuu (4), @ModularityEnjoyer (3), @PLASMAchicken (3), @wlhlm (3), @Algent (2), @AnsonYeung (2), @DarkShadow44 (2), @DreamYao520 (2), @fehling135 (2), @koolkrafter5 (2), @Luca-Guettinger (2), @Nana-Sakura (2), @Nikolay-Sitnikov (2), @RecursivePineapple (2), @Worive (2), @Caedis (1), @Dragovorn (1), @Engineer12798 (1), @glowredman (1), @june-dev-username (1), @Ktmi (1), @LazyFlesh (1), @MalTeeez (1), @MLGfruitshoot (1), @OvermindDL1 (1), @spacebuilder2020 (1), @xronin01 (1)