02e2947f47
refactor(player): encapsulate game state behind PlayerSettings, clear VisibilityModifier and HiddenField
...
- ParkourUser/ParkourPlayer/GeneratorState public mutable fields -> private + short accessors
- per-player settings extracted to player/data/PlayerSettings (ParkourPlayer 188 -> 96 lines,
PMD-counted methods 20 -> 9); this is what fixed the TooManyMethods violation that the
encapsulation itself introduced — by decomposition, not by lowering the threshold
- disk storage reads and writes the same canonical 12-key map as the SQL JSON column;
legacy key names normalized on read, @Expose dropped from domain classes
- 39 settings call sites rewritten across 7 files
- HiddenField backlog cleared (Config, ObstacleGenerator, GhostService, Leaderboard,
PagedMenu, Reward, ParticleData, World)
- checkstyle ratchet: VisibilityModifier, HiddenField, EmptyLineSeparator and
MissingDeprecated flipped to error once their counters hit zero; suppressions.xml empty
- javac -Xmaxwarns raised so NullAway/Error Prone counts are honest
(baseline 165/289, now 164/265)
checkstyle 0 errors / 135 warnings, PMD 0 violations, tests 94/0 fail, ./gradlew check green.
TODO.md: items 30 and 107 updated, new items 167-170, ПРОГРЕСС-6/7 recorded.
2026-10-06 18:57:39 +02:00
4263df50a2
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.
2026-10-06 15:00:04 +02:00
3b5d3d97d5
feat: elytra firework boost, obstacle mode, duels menu, tests
...
- ElytraBoost: one-shot firework boost (v*0.7+dir*0.6, FIREWORKS_SPARK,
rocket sounds) on entering ascending section + sustained thrust; Particle.
FIREWORK doesn't exist in spigot-api 1.20.4 -> FIREWORKS_SPARK
- ObstacleGenerator (client-side obstacles: PILLARS/LINES/HOLE_IN_WALL/
CIRCLE/DIAMOND via ClientBlockChanger.sendNow) + ObstacleMode + locales
- DuelsMenu (lists open duels sessions, click to join) + /parkour duels
command + tab completion + locales play.multi.duels.{name,menu_empty}
- Tests: ElytraSection/PointType/KnotDirector/SingleDuelsGenerator (15 new)
- checkstyle 0/0 (main+test), PMD 0, 41 tests pass
2026-08-05 21:49:11 +02:00
5707cf2d24
feat: duels player colors + elytra sub-modes (M-level)
...
- Add ParkourGenerator.selectBlockData() hook (forced course material);
BlockSelector checks it first; SingleDuelsGenerator overrides to use the
player's color (16 concrete colors) and forces only DEFAULT block type
- Elytra sub-modes: SpeedDemonGenerator (max-speed score), MinSpeedGenerator
(min-speed check, reset on 6 slow ticks), TimeTrialGenerator (score cap),
CloseGenerator (FLAT rings); + SpeedDemon/MinSpeed/TimeTrial/Close modes,
registration, locales play.elytra.*, config mode-settings.*
- Config.getDouble(path, default) + ConfigAccessor overload
- checkstyle 0/0, PMD 0, build green
2026-08-05 21:32:54 +02:00
acb884b70b
feat: add Duels mode (MultiMode, generator-per-player)
...
- duels/: DuelsMode (MultiMode), DuelsGenerator (owner: per-player
SingleDuelsGenerator map, allowJoining, goal), SingleDuelsGenerator
(getPlayers()=List.of(own player) -> independent course/score; score
reaches goal -> win), DuelsCountdown (10s countdown + race start)
- win(): sorted scoreboard, victory/loss titles, return to default after 10s;
leave() only removePlayer (no Coop recursion)
- config modes.duels.{enabled,max-players,goal,island-distance}, locales
play.multi.duels.* (ru/en), registered in Modes/PluginBootstrap
- checkstyle 0/0, PMD 0, build green
2026-08-05 21:16:00 +02:00
8fde1b579b
feat: add Elytra mode (basic S-level)
...
- elytra/section/: ElytraSection (5 knots + cubic spline via commons-math3),
ElytraKnotDirector (dx~N(75,15), dy bias, dz~N(0,35)), ElytraPointType
(CIRCLE Bresenham / FLAT), ClientBlockChanger (client-side sendBlockChanges,
forward-limit min(vd,8))
- elytra/generator/ElytraGenerator extends ParkourGenerator: own tick() (score by
velocity.x while gliding, section lifecycle, fall detection, sustained boost in
ascending sections), reset, spawn with elytra
- elytra/mode/ElytraMode: registered in Modes/PluginBootstrap, locale items ru/en
- build.gradle: commons-math3 3.6.1 + relocate
- checkstyle 0/0, PMD 0, build green (tests + shadowJar)
2026-08-05 20:45:01 +02:00
81788e71ed
refactor: decompose god-classes, add lint gates, restructure packages
...
- Decompose all 11 god-classes (>200 lines) into facade + collaborators
(command/, schematic/, config/, generator/, mode/, papi/, adaptive/,
storage/, player/, leaderboard/) — every file is now <=200 lines
- Add PMD 7 (report-only) + stricter checkstyle rules (NPath, IllegalCatch,
NestedDepth, Whitespace, MissingOverride); fix real bugs found
(printStackTrace, resource leaks in ConfigLoader/SQLStatsStorage)
- docs/ARCHITECTURE.md: target structure + 'one folder = one purpose' rule
- Pilot restructure: command/core|util/, mode/impl/solo|multi|barrier/,
hook/papi/resolver/; cross-package classes made public
- TODO.md: track warning cleanup (132-138) + restructure progress
2026-08-05 18:33:21 +02:00
bfeecb0866
fix: resolve 266/375 checkstyle violations, add lolib jar
2026-07-12 11:52:54 +02:00
2773db98cf
feat: replace Elytra mode with Invisible Barrier mode
2026-07-06 11:24:09 +02:00
0079cbf54b
fix: remove Hardcore mode, disable Elytra by default, add bug tracker
...
- Remove HardcoreMode (lose all rewards on fall)
- Disable Elytra mode in default config
- Add todo.md with 20 identified bugs
- Fix 3 remaining bugs: checkPlayerFall continue, removeTrailBlocks sync, scoredBlocks clear on fall
2026-06-08 14:40:22 +02:00
fd0ba2cc0e
refactor: reorganize packages and replace LPSchematic with WorldEdit
...
Restructure core modules into subpackages (generator, schematic, config, session, etc.); add .schem/.nbt schematic pipeline, commands, adaptive stats skeleton, and bootstrap wiring.
2026-06-01 14:02:48 +02:00