Skip to content

Test#1

Merged
NanoBotAgent merged 15 commits into
NanoBotAgent:mainfrom
IntellectualSites:main
May 11, 2026
Merged

Test#1
NanoBotAgent merged 15 commits into
NanoBotAgent:mainfrom
IntellectualSites:main

Conversation

@NanoBotAgent
Copy link
Copy Markdown
Owner

@NanoBotAgent NanoBotAgent commented May 11, 2026

Summary by CodeRabbit

  • New Features

    • Added comprehensive tree generation support across Minecraft versions
    • Enhanced registry initialization for tree types
  • Bug Fixes

    • Fixed memory usage warning rate limiting to reduce log spam
    • Improved Windows script reliability and error handling
  • Refactor

    • Migrated tree-related APIs to use modernized TreeType system
    • Improved schematic save messaging with localized captions
    • Updated forest generation commands for consistency
  • Chores

    • Upgraded Gradle from 9.4.0 to 9.5.0
    • Updated build tool versions and dependencies
    • Updated GitHub Actions workflow versions

Review Change Stack

renovate Bot and others added 15 commits April 6, 2026 01:04
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…ht.userdev.gradle.plugin to v2.0.0-SNAPSHOT (#3493)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…3508)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: dordsor21 <dordsor21@gmail.com>
…3514)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: SirYwell <hannesgreule@outlook.de>
Co-authored-by: Maddy Miller <git@madelinemiller.dev>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…3521)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@NanoBotAgent NanoBotAgent merged commit c237954 into NanoBotAgent:main May 11, 2026
1 of 5 checks passed
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8061b90e-f1ee-4ebb-9cd5-5b8b3701d639

📥 Commits

Reviewing files that changed from the base of the PR and between 9a31733 and 6f65c1d.

⛔ Files ignored due to path filters (1)
  • gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
📒 Files selected for processing (51)
  • .github/workflows/build-pr.yml
  • .github/workflows/build.yml
  • .github/workflows/upload-release-assets.yml
  • build.gradle.kts
  • gradle/libs.versions.toml
  • gradle/wrapper/gradle-wrapper.properties
  • gradlew
  • gradlew.bat
  • worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_11/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_5/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_6/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightFaweAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_9/PaperweightAdapter.java
  • worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightFaweAdapter.java
  • worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/FaweAdapter.java
  • worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java
  • worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java
  • worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java
  • worldedit-cli/src/main/java/com/sk89q/worldedit/cli/schematic/ClipboardWorld.java
  • worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java
  • worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/PaintBrushCommands.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/factory/TreeGeneratorFactory.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/ForestGenerator.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/TreeGenerator.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java
  • worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/TreeType.java
  • worldedit-core/src/main/resources/lang/strings.json

📝 Walkthrough

Walkthrough

This PR refactors tree generation into a new record-based API, updates Gradle and dependencies, and enhances schematic saving with caption-based messaging. Tree generation shifts from an enum-based approach to a TreeType record with registry-based lookup across all Minecraft adapter versions (1.20.2 through 1.21.11), updates command-layer tree type parameters, and deprecates the old TreeGenerator.TreeType enum. Gradle is updated to 9.5.0 with retry configuration. Schematic saving messages migrate to FAWE captions. JVM memory warnings are rate-limited to reduce spam.

Changes

Tree Generation API Refactoring

Layer / File(s) Summary
TreeType Record Definition
worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/TreeType.java
Defines TreeType as a record implementing Keyed with a static NamespacedRegistry<TreeType> for centralized tree type registration and lookup.
Adapter 1.20.2 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_20_2/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Adds tree feature discovery in registry initialization and implements generateTree method with placed-feature lookup and block-state capture.
Adapter 1.20.4 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_20_4/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Adds tree registry initialization and generateTree override with feature placement and state capture.
Adapter 1.20.5 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_20_5/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Registers tree types and implements generateTree with feature lookup and synchronous placement.
Adapter 1.21 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_21/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Adds tree feature discovery and generateTree method using WorldGenLevel proxy for placement.
Adapter 1.21.11 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_21_11/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Registers trees including FallenTreeFeature and implements generateTree with server-level delegation.
Adapter 1.21.4 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_21_4/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Adds tree feature discovery and generateTree with proxy-level placement.
Adapter 1.21.5 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_21_5/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Registers tree types and implements generateTree with task-manager synchronization and block capture.
Adapter 1.21.6 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_21_6/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Adds tree registration and generateTree method for 1.21.6 adapter.
Adapter 1.21.9 Tree Registration and Generation
worldedit-bukkit/adapters/adapter-1_21_9/.../PaperweightAdapter.java, .../PaperweightFaweAdapter.java
Registers tree features and implements generateTree with block-state capture.
BukkitImplAdapter Interface and FaweAdapter Delegation
worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java, FaweAdapter.java
Adds generateTree default method to BukkitImplAdapter interface and initializeRegistries delegation in FaweAdapter.
BukkitWorld Tree Generation Integration
worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java
Updates generateTree to accept TreeType directly, checks for adapter availability, and deprecates old tree type mapping.
WorldEditPlugin Registry Initialization
worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java
Moves initializeRegistries to setupPreWorldData and conditionally calls adapter initialization when available.
World Interface and Core Type Updates
worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java, NullWorld.java, worldedit-cli/.../ClipboardWorld.java
Updates World interface tree API from enum to TreeType record, replaces abstract with new signature, deprecates old overload, updates implementations.
New TreeGenerator RegionFunction Class
worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/TreeGenerator.java
Introduces TreeGenerator class implementing RegionFunction, holds EditSession and TreeType, delegates to World.generateTree.
EditSession Forest Generation Updates
worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java
Updates makeForest overloads to use TreeType and constructs TreeGenerator instances with new API.
TreePlanter Tool Updates
worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java
Updates constructor and field to use TreeType; calls World.generateTree instead of old enum-based API.
Command Argument Type Updates
worldedit-core/src/main/java/com/sk89q/worldedit/command/{ApplyBrushCommands,BrushCommands,GenerationCommands,PaintBrushCommands,RegionCommands,ToolCommands}.java
Updates all command files to import and use new TreeType for tree type parameters across tool, region, brush, and generation commands.
TreeGeneratorFactory Refactoring
worldedit-core/src/main/java/com/sk89q/worldedit/command/factory/TreeGeneratorFactory.java
Updates factory to produce TreeGenerator instances using TreeType instead of ForestGenerator.
Registry Converter TreeType Support
worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java
Registers TreeType for automatic command argument conversion.
Old API Deprecations
worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java, function/generator/ForestGenerator.java
Marks old TreeGenerator class and nested TreeType enum as deprecated; marks ForestGenerator deprecated.
WorldWrapper generateTree Delegation
worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java
Updates generateTree to use new TreeType and delegates directly without exception wrapping.

Gradle and Build Tooling Updates

Layer / File(s) Summary
Gradle Wrapper Configuration
gradle/wrapper/gradle-wrapper.properties, gradlew, gradlew.bat
Updates Gradle wrapper to 9.5.0; adds retry configuration (retries=0, retryBackOffMs=500); updates batch script error handling and endlocal behavior.
Gradle Wrapper Validation Action Updates
.github/workflows/build-pr.yml, build.yml, upload-release-assets.yml
Updates gradle/actions/wrapper-validation from v5 to v6 in three CI workflows.
Build Plugin and Dependency Version Updates
build.gradle.kts, gradle/libs.versions.toml
Updates nmcp aggregation plugin to 1.5.0; updates towny (0.102→0.103), checkerqual (3.54→4.1), lz4-java (1.10.4→1.11.0), paperweight (beta to snapshot).

Schematic Saving and Memory Monitoring Enhancements

Layer / File(s) Summary
Schematic Save Command Caption Updates
worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java
Converts schematic save messages to use FAWE captions for success, size, disk space, and error reporting; replaces TextComponent/WorldEditException with Caption/FaweException.
Localization Strings for Schematic Messages
worldedit-core/src/main/resources/lang/strings.json
Adds localization strings for schematic save success/info/error messages.
JVM Memory Monitoring and Rate Limiting
worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java
Rate-limits "High memory usage" warnings to once per 30 seconds; updates memory-pool monitoring to use collection-usage thresholds.

🐰 A-hoppy refactor makes trees bloom bright,
New TreeType records guide the code aright!
From enums old to registries new,
With captions and gradle, all shiny and true,
The forest API hops through every layer—
Much better it gets, said the data-layer player! 🌲

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~60 minutes

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@qodo-code-review
Copy link
Copy Markdown

Review Summary by Qodo

Implement translatable schematic commands and tree type registry system

✨ Enhancement 🐞 Bug fix

Grey Divider

Walkthroughs

Description
• Implement translatable schematic commands with caption-based messages
• Add TreeType registry and generation support across all adapters
• Migrate from deprecated TreeGenerator.TreeType to new TreeType class
• Fix memory warning cooldown and threshold detection in FAWE
• Update dependencies and Gradle to latest versions
Diagram
flowchart LR
  A["SchematicCommands"] -->|uses Captions| B["TreeType Registry"]
  C["EditSession"] -->|makeForest methods| B
  D["BukkitImplAdapter"] -->|generateTree| B
  E["TreePlanter Tool"] -->|uses| B
  F["Gradle Updates"] -->|dependencies| G["Build System"]
Loading

Grey Divider

File Changes

1. worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java ✨ Enhancement +25/-44

Replace hardcoded messages with translatable captions

worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java


2. worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/TreeType.java ✨ Enhancement +8/-10

Create new TreeType registry class replacing enum

worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/TreeType.java


3. worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java ✨ Enhancement +37/-0

Add new makeForest methods using TreeType

worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java


View more (48)
4. worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/TreeGenerator.java ✨ Enhancement +48/-0

Create new TreeGenerator implementing RegionFunction

worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/TreeGenerator.java


5. worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java ✨ Enhancement +18/-2

Add new generateTree method with TreeType parameter

worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java


6. worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java ✨ Enhancement +24/-0

Implement new TreeType-based tree generation

worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java


7. worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java ✨ Enhancement +31/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java


8. worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java ✨ Enhancement +28/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java


9. worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightFaweAdapter.java


10. worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java


11. worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightFaweAdapter.java


12. worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightFaweAdapter.java


13. worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightFaweAdapter.java


14. worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightFaweAdapter.java


15. worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightFaweAdapter.java


16. worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightFaweAdapter.java


17. worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightFaweAdapter.java ✨ Enhancement +41/-0

Implement generateTree method for tree generation

worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightFaweAdapter.java


18. worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_11/PaperweightAdapter.java ✨ Enhancement +29/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_11/PaperweightAdapter.java


19. worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_6/PaperweightAdapter.java ✨ Enhancement +29/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_6/PaperweightAdapter.java


20. worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_9/PaperweightAdapter.java ✨ Enhancement +29/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_9/PaperweightAdapter.java


21. worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_5/PaperweightAdapter.java ✨ Enhancement +28/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_5/PaperweightAdapter.java


22. worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java ✨ Enhancement +19/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java


23. worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java ✨ Enhancement +19/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java


24. worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java ✨ Enhancement +19/-0

Register and generate trees from PlacedFeature registry

worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java


25. worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java ✨ Enhancement +15/-0

Add generateTree method to adapter interface

worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java


26. worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java 🐞 Bug fix +9/-3

Fix memory warning cooldown and threshold detection

worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java


27. worldedit-core/src/main/resources/lang/strings.json ✨ Enhancement +6/-0

Add translatable captions for schematic messages

worldedit-core/src/main/resources/lang/strings.json


28. gradle/libs.versions.toml Dependencies +4/-4

Update dependencies and Gradle versions

gradle/libs.versions.toml


29. gradle/wrapper/gradle-wrapper.properties Dependencies +3/-1

Update Gradle wrapper to version 9.5.0

gradle/wrapper/gradle-wrapper.properties


30. gradlew Dependencies +1/-1

Update Gradle wrapper script

gradlew


31. gradlew.bat Dependencies +10/-21

Update Gradle wrapper batch script

gradlew.bat


32. .github/workflows/build-pr.yml Dependencies +1/-1

Update gradle/actions to version 6

.github/workflows/build-pr.yml


33. .github/workflows/build.yml Dependencies +1/-1

Update gradle/actions to version 6

.github/workflows/build.yml


34. .github/workflows/upload-release-assets.yml Dependencies +1/-1

Update gradle/actions to version 6

.github/workflows/upload-release-assets.yml


35. build.gradle.kts Dependencies +1/-1

Update nmcp.aggregation plugin version

build.gradle.kts


36. worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/FaweAdapter.java Additional files +5/-1

...

worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/FaweAdapter.java


37. worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java Additional files +8/-1

...

worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java


38. worldedit-cli/src/main/java/com/sk89q/worldedit/cli/schematic/ClipboardWorld.java Additional files +2/-3

...

worldedit-cli/src/main/java/com/sk89q/worldedit/cli/schematic/ClipboardWorld.java


39. worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java Additional files +7/-0

...

worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java


40. worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java Additional files +2/-2

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java


41. worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java Additional files +2/-2

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java


42. worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java Additional files +1/-1

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java


43. worldedit-core/src/main/java/com/sk89q/worldedit/command/PaintBrushCommands.java Additional files +2/-2

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/PaintBrushCommands.java


44. worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java Additional files +1/-1

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java


45. worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java Additional files +2/-2

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java


46. worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java Additional files +3/-1

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java


47. worldedit-core/src/main/java/com/sk89q/worldedit/command/factory/TreeGeneratorFactory.java Additional files +7/-7

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/factory/TreeGeneratorFactory.java


48. worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java Additional files +4/-4

...

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java


49. worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/ForestGenerator.java Additional files +3/-0

...

worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/ForestGenerator.java


50. worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java Additional files +2/-0

...

worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java


51. worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java Additional files +1/-2

...

worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java


Grey Divider

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown

qodo-code-review Bot commented May 11, 2026

Code Review by Qodo

🐞 Bugs (5) 📘 Rule violations (0)

Grey Divider


Action required

1. gradlew.bat fallthrough on error 🐞 Bug ☼ Reliability
Description
In gradlew.bat, the missing/invalid JAVA_HOME paths run "%COMSPEC%" /c exit 1 but do not exit the
current batch script, so execution falls through into later labels and can attempt to run Gradle
with an invalid %JAVA_EXE% (e.g., /bin/java.exe). This can mask the real problem and produce
confusing follow-on failures.
Code

gradlew.bat[R54-57]

+"%COMSPEC%" /c exit 1

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
Evidence
The error branches execute a child cmd exit but then continue to the next label; the file shows
the flow reaches :findJavaFromJavaHome/:execute after the error message instead of terminating
the script.

gradlew.bat[41-82]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`gradlew.bat` uses `"%COMSPEC%" /c exit 1` in error branches for missing/invalid Java, but that only exits the spawned `cmd.exe` process and does not reliably terminate the current batch script. The script then continues into subsequent labels and can reach `:execute` with a bad `%JAVA_EXE%`.

### Issue Context
We need the batch script to terminate immediately with a non-zero exit code when Java cannot be found.

### Fix Focus Areas
- gradlew.bat[41-82]

### Suggested fix
Replace both `"%COMSPEC%" /c exit 1` occurrences in the error paths with `exit /b 1` (or `goto :exitWithErrorLevel` after setting `ERRORLEVEL=1`). Ensure the script cannot fall through to `:execute` when Java is missing/invalid.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Unparseable TreeType IDs 🐞 Bug ≡ Correctness
Description
PaperweightAdapter.initializeRegistries() registers TreeType IDs using feature.key().toString(),
but tree generation later assumes treeType.id() is a valid namespace:path and passes it to
ResourceLocation.tryParse(...). If the stored ID is not parseable, tree generation can throw (via
getOrThrow) or fail due to null keys.
Code

worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java[R937-949]

+        // Trees
+        HolderLookup.RegistryLookup<PlacedFeature> placedFeatureRegistry = server.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE);
+        placedFeatureRegistry.listElements()
+                .filter(feature -> {
+                    var underlyingFeature = feature.value().feature().value().feature();
+                    return underlyingFeature instanceof TreeFeature || underlyingFeature instanceof CoralTreeFeature;
+                })
+                .forEach(feature -> {
+                    String key = feature.key().toString();
+                    if (TreeType.REGISTRY.get(key) == null) {
+                        TreeType.REGISTRY.register(key, new TreeType(key));
+                    }
+                });
Evidence
Trees are registered with feature.key().toString() but generation parses treeType.id() with
ResourceLocation.tryParse(...) and then performs a strict lookup. A different adapter version
demonstrates the expected approach: iterate ResourceLocation keys and store name.toString().

worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java[937-949]
worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java[980-989]
worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java[886-897]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Tree types are registered with `String key = feature.key().toString()`, but later code uses `ResourceLocation.tryParse(treeType.id())` expecting a plain `namespace:path`. If `feature.key().toString()` includes extra formatting, parsing can return null and tree generation will error.

### Issue Context
Tree IDs must round-trip between registry population and later lookup.

### Fix Focus Areas
- worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java[937-989]
- worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java[925-938]

### Suggested fix
When iterating placed features, derive the tree ID from the actual `ResourceLocation` (e.g., `feature.key().location().toString()` if available, or equivalent API) rather than `toString()` of the key object.
Also add a defensive guard in generateTree: if `ResourceLocation.tryParse(treeType.id()) == null`, return false (and optionally log/debug). Apply consistently across affected adapters.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. generateTree null dereference 🐞 Bug ☼ Reliability
Description
Several PaperweightFaweAdapter.generateTree() implementations fetch a PlacedFeature with
registry.get(...) and then unconditionally call placedFeature.place(...). If the registry lookup
returns null (missing key or parse failure), this will throw a NullPointerException instead of
returning false.
Code

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java[R694-709]

+        PlacedFeature placedFeature = serverLevel
+                .registryAccess()
+                .registryOrThrow(Registries.PLACED_FEATURE)
+                .get(ResourceLocation.tryParse(treeType.id()));
+
+        FaweBlockStateListPopulator populator = new FaweBlockStateListPopulator(serverLevel);
+        List<CraftBlockState> placed = TaskManager.taskManager().sync(() -> {
+            preCaptureStates(serverLevel);
+            try {
+                if (!placedFeature.place(
+                        populator,
+                        generator,
+                        serverLevel.random,
+                        new BlockPos(pt.x(), pt.y(), pt.z())
+                )) {
+                    return null;
Evidence
The code path shows PlacedFeature placedFeature = ...get(...) and then directly invokes
placedFeature.place(...) within the sync task; there is no guard before dereferencing.

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java[684-717]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`generateTree()` obtains a `PlacedFeature` from the registry and immediately calls `.place(...)` without checking for null, which can crash the operation.

### Issue Context
Other feature generation code paths in the project use `k != null && k.place(...)` and return `false` when missing.

### Fix Focus Areas
- worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java[684-720]
- worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightFaweAdapter.java[685-721]
- worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightFaweAdapter.java[698-734]
- worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightFaweAdapter.java[699-735]

### Suggested fix
After parsing the ResourceLocation and fetching from the registry, return `false` if the parsed key is null or the registry lookup returns null. Only call `.place(...)` when non-null, mirroring how `generateFeature()` handles missing entries.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. Missing schematic caption key 🐞 Bug ≡ Correctness
Description
SchematicCommands throws Caption.of("fawe.error.schematic.over.limit") when exceeding schematic
count limits, but strings.json defines fawe.error.schematic.over.count.limit instead. Users will
see a missing/untranslated caption key in this error case.
Code

worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java[R1011-1012]

+                    throw new FaweException(Caption.of("fawe.error.schematic.over.limit", numFiles, limit));
                }
Evidence
The thrown caption key in SchematicCommands does not exist in strings.json; the only defined key for
this message is fawe.error.schematic.over.count.limit.

worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java[1007-1012]
worldedit-core/src/main/resources/lang/strings.json[131-133]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The code references caption key `fawe.error.schematic.over.limit`, but the language bundle defines `fawe.error.schematic.over.count.limit`. This mismatch breaks localization/message rendering.

### Issue Context
This is thrown when `numFiles >= limit` during schematic save.

### Fix Focus Areas
- worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java[1007-1012]
- worldedit-core/src/main/resources/lang/strings.json[131-133]

### Suggested fix
Either:
1) Change the code to `Caption.of("fawe.error.schematic.over.count.limit", numFiles, limit)`; or
2) Add an alias entry for `fawe.error.schematic.over.limit` in strings.json pointing to the same message.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Overwrite caption missing filename 🐞 Bug ≡ Correctness
Description
On schematic overwrite success, the code calls
Caption.of("fawe.worldedit.schematic.schematic.overwritten") without arguments, but the string
requires {0}. The user-visible message will include an unexpanded placeholder instead of the
filename.
Code

worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java[R580-588]

+        AsyncCommandBuilder
+            .wrap(task, actor)
+            .registerWithSupervisor(worldEdit.getSupervisor(), "Saving schematic " + filename)
+            .setDelayMessage(Caption.of("worldedit.schematic.save.saving"))
+            .onSuccess(
+                overwrite
+                    ? Caption.of("fawe.worldedit.schematic.schematic.overwritten")
+                    : Caption.of("fawe.worldedit.schematic.schematic.saved", filename), null
+            )
Evidence
strings.json defines the overwritten message with one placeholder, but SchematicCommands calls the
caption without any args in the overwrite success branch.

worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java[579-588]
worldedit-core/src/main/resources/lang/strings.json[69-72]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The caption `fawe.worldedit.schematic.schematic.overwritten` is defined with `{0}`, but the code does not provide the filename argument when overwriting.

### Issue Context
This affects the success message for `//schem save` when overwriting an existing file.

### Fix Focus Areas
- worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java[579-588]
- worldedit-core/src/main/resources/lang/strings.json[69-72]

### Suggested fix
Change the overwrite branch to pass the filename (or schematic name) as `{0}`, e.g.:
`Caption.of("fawe.worldedit.schematic.schematic.overwritten", filename)`

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread gradlew.bat
Comment on lines +54 to 57
"%COMSPEC%" /c exit 1

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Gradlew.bat fallthrough on error 🐞 Bug ☼ Reliability

In gradlew.bat, the missing/invalid JAVA_HOME paths run "%COMSPEC%" /c exit 1 but do not exit the
current batch script, so execution falls through into later labels and can attempt to run Gradle
with an invalid %JAVA_EXE% (e.g., /bin/java.exe). This can mask the real problem and produce
confusing follow-on failures.
Agent Prompt
### Issue description
`gradlew.bat` uses `"%COMSPEC%" /c exit 1` in error branches for missing/invalid Java, but that only exits the spawned `cmd.exe` process and does not reliably terminate the current batch script. The script then continues into subsequent labels and can reach `:execute` with a bad `%JAVA_EXE%`.

### Issue Context
We need the batch script to terminate immediately with a non-zero exit code when Java cannot be found.

### Fix Focus Areas
- gradlew.bat[41-82]

### Suggested fix
Replace both `"%COMSPEC%" /c exit 1` occurrences in the error paths with `exit /b 1` (or `goto :exitWithErrorLevel` after setting `ERRORLEVEL=1`). Ensure the script cannot fall through to `:execute` when Java is missing/invalid.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +937 to +949
// Trees
HolderLookup.RegistryLookup<PlacedFeature> placedFeatureRegistry = server.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE);
placedFeatureRegistry.listElements()
.filter(feature -> {
var underlyingFeature = feature.value().feature().value().feature();
return underlyingFeature instanceof TreeFeature || underlyingFeature instanceof CoralTreeFeature;
})
.forEach(feature -> {
String key = feature.key().toString();
if (TreeType.REGISTRY.get(key) == null) {
TreeType.REGISTRY.register(key, new TreeType(key));
}
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Unparseable treetype ids 🐞 Bug ≡ Correctness

PaperweightAdapter.initializeRegistries() registers TreeType IDs using feature.key().toString(),
but tree generation later assumes treeType.id() is a valid namespace:path and passes it to
ResourceLocation.tryParse(...). If the stored ID is not parseable, tree generation can throw (via
getOrThrow) or fail due to null keys.
Agent Prompt
### Issue description
Tree types are registered with `String key = feature.key().toString()`, but later code uses `ResourceLocation.tryParse(treeType.id())` expecting a plain `namespace:path`. If `feature.key().toString()` includes extra formatting, parsing can return null and tree generation will error.

### Issue Context
Tree IDs must round-trip between registry population and later lookup.

### Fix Focus Areas
- worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java[937-989]
- worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java[925-938]

### Suggested fix
When iterating placed features, derive the tree ID from the actual `ResourceLocation` (e.g., `feature.key().location().toString()` if available, or equivalent API) rather than `toString()` of the key object.
Also add a defensive guard in generateTree: if `ResourceLocation.tryParse(treeType.id()) == null`, return false (and optionally log/debug). Apply consistently across affected adapters.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +694 to +709
PlacedFeature placedFeature = serverLevel
.registryAccess()
.registryOrThrow(Registries.PLACED_FEATURE)
.get(ResourceLocation.tryParse(treeType.id()));

FaweBlockStateListPopulator populator = new FaweBlockStateListPopulator(serverLevel);
List<CraftBlockState> placed = TaskManager.taskManager().sync(() -> {
preCaptureStates(serverLevel);
try {
if (!placedFeature.place(
populator,
generator,
serverLevel.random,
new BlockPos(pt.x(), pt.y(), pt.z())
)) {
return null;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Generatetree null dereference 🐞 Bug ☼ Reliability

Several PaperweightFaweAdapter.generateTree() implementations fetch a PlacedFeature with
registry.get(...) and then unconditionally call placedFeature.place(...). If the registry lookup
returns null (missing key or parse failure), this will throw a NullPointerException instead of
returning false.
Agent Prompt
### Issue description
`generateTree()` obtains a `PlacedFeature` from the registry and immediately calls `.place(...)` without checking for null, which can crash the operation.

### Issue Context
Other feature generation code paths in the project use `k != null && k.place(...)` and return `false` when missing.

### Fix Focus Areas
- worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java[684-720]
- worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightFaweAdapter.java[685-721]
- worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightFaweAdapter.java[698-734]
- worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightFaweAdapter.java[699-735]

### Suggested fix
After parsing the ResourceLocation and fetching from the registry, return `false` if the parsed key is null or the registry lookup returns null. Only call `.place(...)` when non-null, mirroring how `generateFeature()` handles missing entries.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants