refactor: split 6 oversized packages into semantic subpackages

Structure debt list is now empty (FOLDER_DEBT = Set.of()), every folder
holds at most 4 java files:

- elytra/{mode,generator} -> elytra/core plus per-mode slices (close,
  minspeed, obstacle, speeddemon, timetrial), 2 files each
- command/schematic -> command/schematic (4) + wand/ (2)
- generator/jump: JumpType -> jump/model/, SchematicBlockPlacer ->
  jump/placement/schematic/
- player/core -> player/core (4) + PlayerSpawnSetup -> player/service (4)

18 files moved, imports/tests updated, 5 classes widened to public for
cross-package calls. No behavior change; check and build stay green.
This commit is contained in:
loki5512344 2026-10-06 15:00:04 +02:00
parent e8b6569ccf
commit 4263df50a2
Signed by: boba
GPG key ID: 253067914055423B
29 changed files with 63 additions and 62 deletions

View file

@ -3,7 +3,7 @@ package dev.loki.loparkour.adaptive.core;
import dev.loki.loparkour.adaptive.model.PlayerMetrics;
import dev.loki.loparkour.adaptive.storage.StatsRepository;
import dev.loki.loparkour.generator.core.coordinator.GeneratorEventListener;
import dev.loki.loparkour.generator.jump.calculation.JumpType;
import dev.loki.loparkour.generator.jump.model.JumpType;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

View file

@ -1,7 +1,7 @@
package dev.loki.loparkour.adaptive.core.metrics;
import dev.loki.loparkour.adaptive.model.PlayerMetrics;
import dev.loki.loparkour.generator.jump.calculation.JumpType;
import dev.loki.loparkour.generator.jump.model.JumpType;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;

View file

@ -14,12 +14,12 @@ import dev.loki.loparkour.hook.papi.PAPIHook;
import dev.loki.loparkour.listener.gameplay.ParkourRestrictionListener;
import dev.loki.loparkour.listener.schematic.SchematicWandListener;
import dev.loki.loparkour.listener.player.PlayerConnectionListener;
import dev.loki.loparkour.elytra.mode.CloseMode;
import dev.loki.loparkour.elytra.mode.ElytraMode;
import dev.loki.loparkour.elytra.mode.MinSpeedMode;
import dev.loki.loparkour.elytra.mode.ObstacleMode;
import dev.loki.loparkour.elytra.mode.SpeedDemonMode;
import dev.loki.loparkour.elytra.mode.TimeTrialMode;
import dev.loki.loparkour.elytra.close.CloseMode;
import dev.loki.loparkour.elytra.core.ElytraMode;
import dev.loki.loparkour.elytra.minspeed.MinSpeedMode;
import dev.loki.loparkour.elytra.obstacle.ObstacleMode;
import dev.loki.loparkour.elytra.speeddemon.SpeedDemonMode;
import dev.loki.loparkour.elytra.timetrial.TimeTrialMode;
import dev.loki.loparkour.mode.base.Modes;
import dev.loki.loparkour.mode.impl.barrier.InvisibleBarrierMode;
import dev.loki.loparkour.mode.impl.multi.CoopMode;

View file

@ -2,6 +2,8 @@ package dev.loki.loparkour.command.schematic;
import dev.loki.loparkour.LoParkour;
import dev.loki.loparkour.command.player.PlayerCommandHandler;
import dev.loki.loparkour.command.schematic.wand.SchematicWand;
import dev.loki.loparkour.command.schematic.wand.SelectionStore;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.bukkit.Location;

View file

@ -1,5 +1,6 @@
package dev.loki.loparkour.command.schematic;
package dev.loki.loparkour.command.schematic.wand;
import dev.loki.loparkour.command.schematic.SchematicCommandHandler;
import dev.loki.loparkour.config.locale.Locales;
import dev.loki.loparkour.config.options.Option;
import dev.loki.loparkour.menu.core.screen.ParkourOption;
@ -9,7 +10,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType;
final class SchematicWand {
public final class SchematicWand {
private static ItemStack cachedWand;
@ -17,11 +18,11 @@ final class SchematicWand {
}
@NotNull
static ItemStack getWand() {
public static ItemStack getWand() {
return build().clone();
}
static boolean isWand(@Nullable ItemStack item) {
public static boolean isWand(@Nullable ItemStack item) {
if (item == null || !item.hasItemMeta()) {
return false;
}
@ -30,7 +31,7 @@ final class SchematicWand {
&& meta.getPersistentDataContainer().has(SchematicCommandHandler.WAND_KEY, PersistentDataType.BYTE);
}
static void clearCache() {
public static void clearCache() {
cachedWand = null;
}

View file

@ -1,16 +1,17 @@
package dev.loki.loparkour.command.schematic;
package dev.loki.loparkour.command.schematic.wand;
import dev.loki.loparkour.command.schematic.SchematicCommandHandler;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
final class SelectionStore {
public final class SelectionStore {
private SelectionStore() {
}
@NotNull
static Location[] get(@NotNull Player player) {
public static Location[] get(@NotNull Player player) {
Location[] sel = SchematicCommandHandler.SELECTIONS.get(player);
if (sel == null) {
sel = new Location[]{null, null};
@ -19,7 +20,7 @@ final class SelectionStore {
return sel;
}
static void set(@NotNull Player player, @NotNull Location loc, int index) {
public static void set(@NotNull Player player, @NotNull Location loc, int index) {
final Location[] updated = get(player).clone();
updated[index] = loc.clone();
SchematicCommandHandler.SELECTIONS.put(player, updated);

View file

@ -1,5 +1,6 @@
package dev.loki.loparkour.elytra.generator;
package dev.loki.loparkour.elytra.close;
import dev.loki.loparkour.elytra.core.ElytraGenerator;
import dev.loki.loparkour.elytra.section.ElytraPointType;
import dev.loki.loparkour.session.core.Session;

View file

@ -1,7 +1,6 @@
package dev.loki.loparkour.elytra.mode;
package dev.loki.loparkour.elytra.close;
import dev.loki.loparkour.config.locale.Locales;
import dev.loki.loparkour.elytra.generator.CloseGenerator;
import dev.loki.loparkour.leaderboard.core.Leaderboard;
import dev.loki.loparkour.mode.base.Mode;
import dev.loki.loparkour.mode.base.ModeMessages;

View file

@ -1,4 +1,4 @@
package dev.loki.loparkour.elytra.generator;
package dev.loki.loparkour.elytra.core;
import dev.loki.loparkour.elytra.section.ElytraSection;
import dev.loki.loparkour.util.misc.Compat;

View file

@ -1,4 +1,4 @@
package dev.loki.loparkour.elytra.generator;
package dev.loki.loparkour.elytra.core;
import dev.loki.loparkour.config.core.Config;
import dev.loki.loparkour.elytra.section.ClientBlockChanger;

View file

@ -1,7 +1,6 @@
package dev.loki.loparkour.elytra.mode;
package dev.loki.loparkour.elytra.core;
import dev.loki.loparkour.config.locale.Locales;
import dev.loki.loparkour.elytra.generator.ElytraGenerator;
import dev.loki.loparkour.leaderboard.core.Leaderboard;
import dev.loki.loparkour.mode.base.Mode;
import dev.loki.loparkour.mode.base.ModeMessages;

View file

@ -1,6 +1,7 @@
package dev.loki.loparkour.elytra.generator;
package dev.loki.loparkour.elytra.minspeed;
import dev.loki.loparkour.config.core.Config;
import dev.loki.loparkour.elytra.core.ElytraGenerator;
import dev.loki.loparkour.session.core.Session;
import org.bukkit.entity.Player;

View file

@ -1,7 +1,6 @@
package dev.loki.loparkour.elytra.mode;
package dev.loki.loparkour.elytra.minspeed;
import dev.loki.loparkour.config.locale.Locales;
import dev.loki.loparkour.elytra.generator.MinSpeedGenerator;
import dev.loki.loparkour.leaderboard.core.Leaderboard;
import dev.loki.loparkour.mode.base.Mode;
import dev.loki.loparkour.mode.base.ModeMessages;

View file

@ -1,6 +1,7 @@
package dev.loki.loparkour.elytra.generator;
package dev.loki.loparkour.elytra.obstacle;
import dev.loki.loparkour.config.core.Config;
import dev.loki.loparkour.elytra.core.ElytraGenerator;
import dev.loki.loparkour.elytra.section.ElytraPointType;
import dev.loki.loparkour.elytra.section.ElytraSection;
import dev.loki.loparkour.session.core.Session;

View file

@ -1,7 +1,6 @@
package dev.loki.loparkour.elytra.mode;
package dev.loki.loparkour.elytra.obstacle;
import dev.loki.loparkour.config.locale.Locales;
import dev.loki.loparkour.elytra.generator.ObstacleGenerator;
import dev.loki.loparkour.leaderboard.core.Leaderboard;
import dev.loki.loparkour.mode.base.Mode;
import dev.loki.loparkour.mode.base.ModeMessages;

View file

@ -1,5 +1,6 @@
package dev.loki.loparkour.elytra.generator;
package dev.loki.loparkour.elytra.speeddemon;
import dev.loki.loparkour.elytra.core.ElytraGenerator;
import dev.loki.loparkour.session.core.Session;
import org.bukkit.entity.Player;

View file

@ -1,7 +1,6 @@
package dev.loki.loparkour.elytra.mode;
package dev.loki.loparkour.elytra.speeddemon;
import dev.loki.loparkour.config.locale.Locales;
import dev.loki.loparkour.elytra.generator.SpeedDemonGenerator;
import dev.loki.loparkour.leaderboard.core.Leaderboard;
import dev.loki.loparkour.mode.base.Mode;
import dev.loki.loparkour.mode.base.ModeMessages;

View file

@ -1,6 +1,7 @@
package dev.loki.loparkour.elytra.generator;
package dev.loki.loparkour.elytra.timetrial;
import dev.loki.loparkour.config.core.Config;
import dev.loki.loparkour.elytra.core.ElytraGenerator;
import dev.loki.loparkour.session.core.Session;
/**

View file

@ -1,7 +1,6 @@
package dev.loki.loparkour.elytra.mode;
package dev.loki.loparkour.elytra.timetrial;
import dev.loki.loparkour.config.locale.Locales;
import dev.loki.loparkour.elytra.generator.TimeTrialGenerator;
import dev.loki.loparkour.leaderboard.core.Leaderboard;
import dev.loki.loparkour.mode.base.Mode;
import dev.loki.loparkour.mode.base.ModeMessages;

View file

@ -1,6 +1,6 @@
package dev.loki.loparkour.generator.core.coordinator;
import dev.loki.loparkour.generator.jump.calculation.JumpType;
import dev.loki.loparkour.generator.jump.model.JumpType;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;

View file

@ -1,4 +1,4 @@
package dev.loki.loparkour.generator.jump.calculation;
package dev.loki.loparkour.generator.jump.model;
import org.bukkit.Material;
import org.jetbrains.annotations.NotNull;

View file

@ -2,6 +2,7 @@ package dev.loki.loparkour.generator.jump.placement;
import dev.loki.loparkour.generator.core.coordinator.ParkourGenerator;
import dev.loki.loparkour.generator.jump.calculation.JumpCalculator;
import dev.loki.loparkour.generator.jump.placement.schematic.SchematicBlockPlacer;
import dev.loki.loparkour.util.misc.Probs;
import org.bukkit.Location;
import org.bukkit.block.Block;

View file

@ -2,7 +2,7 @@ package dev.loki.loparkour.generator.jump.placement;
import dev.loki.loparkour.api.core.Registry;
import dev.loki.loparkour.generator.core.coordinator.ParkourGenerator;
import dev.loki.loparkour.generator.jump.calculation.JumpType;
import dev.loki.loparkour.generator.jump.model.JumpType;
import dev.loki.loparkour.style.core.Style;
import dev.loki.loparkour.util.misc.MaterialUtil;
import org.bukkit.Material;

View file

@ -13,7 +13,7 @@ import java.util.List;
/**
* Computes the target block position for generated parkour blocks based on jump parameters.
*/
class BlockTargetSelector {
public class BlockTargetSelector {
private static final int NO_FORCED_HEIGHT = Integer.MIN_VALUE;
@ -32,7 +32,7 @@ class BlockTargetSelector {
}
@NotNull
List<Block> selectBlocks() {
public List<Block> selectBlocks() {
return selectBlocks(NO_FORCED_HEIGHT);
}

View file

@ -1,8 +1,9 @@
package dev.loki.loparkour.generator.jump.placement;
package dev.loki.loparkour.generator.jump.placement.schematic;
import dev.loki.loparkour.LoParkour;
import dev.loki.loparkour.api.event.generation.ParkourSchematicGenerateEvent;
import dev.loki.loparkour.generator.core.coordinator.ParkourGenerator;
import dev.loki.loparkour.generator.jump.placement.BlockTargetSelector;
import dev.loki.loparkour.player.core.ParkourPlayer;
import dev.loki.loparkour.schematic.core.ParkourSchematic;
import dev.loki.loparkour.schematic.core.SchematicManager;
@ -15,17 +16,17 @@ import java.util.List;
/**
* Pastes schematic parkour sections into the world and fires the related event.
*/
class SchematicBlockPlacer {
public class SchematicBlockPlacer {
private final ParkourGenerator generator;
private final BlockTargetSelector targetSelector;
SchematicBlockPlacer(@NotNull ParkourGenerator generator, @NotNull BlockTargetSelector targetSelector) {
public SchematicBlockPlacer(@NotNull ParkourGenerator generator, @NotNull BlockTargetSelector targetSelector) {
this.generator = generator;
this.targetSelector = targetSelector;
}
boolean placeSchematic() {
public boolean placeSchematic() {
final SchematicManager manager = LoParkour.getSchematicManager();
if (manager == null) {
return false;

View file

@ -2,12 +2,12 @@ package dev.loki.loparkour.mode.base;
import dev.loki.loparkour.api.core.Registry;
import dev.loki.loparkour.duels.DuelsMode;
import dev.loki.loparkour.elytra.mode.CloseMode;
import dev.loki.loparkour.elytra.mode.ElytraMode;
import dev.loki.loparkour.elytra.mode.MinSpeedMode;
import dev.loki.loparkour.elytra.mode.ObstacleMode;
import dev.loki.loparkour.elytra.mode.SpeedDemonMode;
import dev.loki.loparkour.elytra.mode.TimeTrialMode;
import dev.loki.loparkour.elytra.close.CloseMode;
import dev.loki.loparkour.elytra.core.ElytraMode;
import dev.loki.loparkour.elytra.minspeed.MinSpeedMode;
import dev.loki.loparkour.elytra.obstacle.ObstacleMode;
import dev.loki.loparkour.elytra.speeddemon.SpeedDemonMode;
import dev.loki.loparkour.elytra.timetrial.TimeTrialMode;
import dev.loki.loparkour.mode.impl.barrier.InvisibleBarrierMode;
import dev.loki.loparkour.mode.impl.multi.CoopMode;
import dev.loki.loparkour.mode.impl.multi.RaceMode;

View file

@ -8,6 +8,7 @@ import dev.loki.loparkour.menu.core.screen.ParkourOption;
import dev.loki.loparkour.mode.base.MultiMode;
import dev.loki.loparkour.player.data.PreviousData;
import dev.loki.loparkour.player.service.PlayerSettingsManager;
import dev.loki.loparkour.player.service.PlayerSpawnSetup;
import dev.loki.loparkour.session.core.Session;
import dev.loki.loparkour.world.core.Divider;
import org.bukkit.Location;

View file

@ -1,7 +1,8 @@
package dev.loki.loparkour.player.core;
package dev.loki.loparkour.player.service;
import dev.loki.loparkour.LoParkour;
import dev.loki.loparkour.config.core.Config;
import dev.loki.loparkour.player.core.ParkourPlayer;
import dev.loki.loparkour.player.service.ui.ParkourHotbar;
import dev.loki.loparkour.scheduler.Scheduler;
import org.bukkit.GameMode;
@ -10,11 +11,11 @@ import org.bukkit.Location;
/**
* Prepares a parkour player's world state such as location, game mode and hotbar.
*/
final class PlayerSpawnSetup {
public final class PlayerSpawnSetup {
private static final int HOTBAR_APPLY_DELAY = 5;
void setup(ParkourPlayer player, Location to) {
public void setup(ParkourPlayer player, Location to) {
if (to != null) {
player.teleport(to);
}
@ -28,7 +29,7 @@ final class PlayerSpawnSetup {
}
}
void updateHotbar(ParkourPlayer player) {
public void updateHotbar(ParkourPlayer player) {
ParkourHotbar.apply(player);
}
}

View file

@ -25,13 +25,7 @@ class StructureRulesTest {
private static final int MAX_LINES_PER_FILE = 200;
/** Known debt (docs/TODO.md, task 2). Remove entries as folders get split. */
private static final Set<String> FOLDER_DEBT = Set.of(
"dev/loki/loparkour/command/schematic",
"dev/loki/loparkour/elytra/generator",
"dev/loki/loparkour/elytra/mode",
"dev/loki/loparkour/generator/jump/calculation",
"dev/loki/loparkour/generator/jump/placement",
"dev/loki/loparkour/player/core");
private static final Set<String> FOLDER_DEBT = Set.of();
@Test
void foldersHaveAtMostFourFiles() throws IOException {