Skip to content

⚡️Performance: Rework World Generation - #201

Open
Zoriot wants to merge 67 commits into
mainfrom
update/world-generation-rework
Open

⚡️Performance: Rework World Generation #201
Zoriot wants to merge 67 commits into
mainfrom
update/world-generation-rework

Conversation

@Zoriot

@Zoriot Zoriot commented Jan 27, 2026

Copy link
Copy Markdown
Member

Summary

This PR reworks plot-world generation and loading to make it asynchronous and lifecycle-safe, while updating plot recovery, world-height handling, tutorial flows, and translation automation.

What changed

  • Moved plot-world file generation off the main server thread.
  • Added skeleton-world generation and reuse for faster, consistent plot-world creation.
  • Reworked plot loading into dedicated loader implementations for regular and tutorial plots.
  • Ensured Bukkit, Multiverse, WorldGuard, and FAWE operations run on the appropriate thread.
  • Added synchronization to prevent concurrent generation of the same plot world.
  • Improved plot-world recovery when an existing one-plot world is missing.
    • Failed recovery no longer abandons or resets the existing plot.
    • New plot generation still rolls back assignment when generation fails.
  • Preserved existing plot-world identity based on persisted plot type and legacy compatibility.
  • Updated teleport and review flows to prepare worlds before teleporting.
  • Improved passenger handling during plot teleportation.
  • Updated plot height validation to use the actual world height limits.
  • Added clearer generation-error logging, including the affected plot ID.
  • Updated tutorial plot generation and schematic-pasting behavior.
  • Removed the obsolete plot generator implementations and replaced them with the new loader architecture.
  • Updated project dependencies and Paper/Gradle compatibility.
  • Updated Crowdin workflows and upgraded the Crowdin GitHub Action.
  • Removed source-file license notices where no longer required.

Behavior and compatibility notes

  • The disable-city-inspiration-mode setting now affects new plot assignment only.
  • Existing City Inspiration Mode plots continue to resolve to their persisted city worlds.
  • Existing completed and unfinished one-plot worlds retain their database state if recovery fails

Cinnazeyy and others added 26 commits July 14, 2025 04:17
- measure old generator performance
- add new AbstractPlotLoader, DefaultPlotLoader and PlotHandler
…ion-rework

# Conflicts:
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/generator/DefaultPlotGenerator.java
…ot Worlds to handle world specific abandon logic
- measure old generator performance
- add new AbstractPlotLoader, DefaultPlotLoader and PlotHandler
…ot Worlds to handle world specific abandon logic
…into update/world-generation-rework

# Conflicts:
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/generator/world/PlotWorldGenerator.java
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/world/OnePlotWorld.java
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/world/PlotWorld.java
move savePlotAsSchematic to PlotHandler.
create methods for both assigning and generating in PlotHandler.
remove all old PlotGenerator files and replace every usage with the new PlotLoaders
…ion-rework

# Conflicts:
#	src/main/java/com/alpsbte/plotsystem/commands/plot/CMD_Plot_Abandon.java
#	src/main/java/com/alpsbte/plotsystem/core/menus/companion/CityProjectMenu.java
#	src/main/java/com/alpsbte/plotsystem/core/menus/review/ReviewPlotTogglesMenu.java
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/generator/DefaultPlotGenerator.java
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/utils/PlotUtils.java
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/world/CityPlotWorld.java
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/world/OnePlotWorld.java
@Zoriot Zoriot added enhancement New feature or request high priority labels Jan 27, 2026
Zoriot and others added 10 commits May 27, 2026 15:23
# Conflicts:
#	gradle/libs.versions.toml
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/generator/loader/TutorialPlotLoader.java
#	src/main/java/com/alpsbte/plotsystem/core/system/plot/utils/PlotUtils.java
#	src/main/java/com/alpsbte/plotsystem/core/system/tutorial/AbstractPlotTutorial.java
This currently doesn't really work. When you have the old skeleton world it may work but as soon as you have the new one there are some exceptions. Needs to be polished before released
This removes handling for <=1.21.11 Worlds, the old changes made that the migration was started from paper.
We always just support the latest version.
…rate to Java 25

- Upgraded multiple library dependencies for compatibility.
- Updated Java version to 25 in build scripts and workflows.
- Modified Gradle configurations to exclude unwanted transitive dependencies.
- Adjusted workflows to use actions/checkout@v7 and relevant Java configurations.
…ntries

Refactor plot link message generation to rely on AlpsLib `MapLinks` and
iterate providers via `getAllLinks()` instead of hardcoded provider slots.

- Replace fixed Google/OSM/Apple link handling with dynamic provider iteration
- Build chat link components from resolved `MapLink` entries
- Keep shortlink behavior for each generated provider URL
- Add plugin-side config mapping for `map-links.links` into `MapLinksConfig`
  and `MapLinkEntryConfig` so providers can be disabled/extended without
  plugin code changes
- Add `ConfigPaths.MAP_LINKS`
- Document optional `map-links` config section in `config.yml`

This keeps provider definitions in AlpsLib defaults while allowing server-side
overrides (enable/disable/add providers) through plugin config.

Implements #177.
feat(plot-utils): ✨ use AlpsLib MapLinks with configurable provider entries
@Zoriot Zoriot linked an issue Jun 20, 2026 that may be closed by this pull request
@Zoriot Zoriot linked an issue Jul 20, 2026 that may be closed by this pull request
Zoriot added 15 commits August 25, 2026 14:18
Persist plot state consistently, prevent duplicate generation, and move heavy WorldEdit work onto FAWE's async executor.
- Now we don't construct a Air Mask in several places anymore.
- We just use ignore air

This fixes a issue where we adapt a cim world before it is actually loaded, that resulted into a fawe exception, which resulted in the plot not beeing pasted.
We switched to only the per repo license.
Teleporting called loadWorld(), which regenerated missing plot worlds and blocked on FAWE tasks that themselves need the main thread, freezing the server until the watchdog fired. World regeneration now lives in prepareWorld(), which callers invoke asynchronously before teleporting, and blocking waits fail fast when they run on the main thread.
This reverts commit 339d69b

We paste it on the original position anyway so it's fine to fallback to 0 there
@Zoriot
Zoriot marked this pull request as ready for review September 8, 2026 17:25
Prevent failed rebuilds of existing one-plot worlds from abandoning their plots, while retaining rollback behavior for newly assigned plots. Resolve existing plot worlds from persisted type and legacy compatibility instead of the new-plot CIM configuration.
Reduce schematic-save complexity, replace raw exception wrappers with specific completion exceptions, and document the tutorial loader lifecycle hook. Migrate tutorial menus, holograms, and NPC text to Adventure components and NamedTextColor.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request high priority

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] - Plot Slot Bugged - We need a Queue [Feature] - the ability to add custom links to /p links

2 participants