Files
Cites_Plugins/docs/diagrams/team-join-sequence.puml
T
Antone Barbaud ffc77c4213 feat: initial CR-Core library (team + player + command framework)
Pure Maven library for CR Minecraft game plugins, targeting Paper 1.16.5.

Common abstractions (fr.luc.crcore.common): Identifiable, Named, ScoreHolder,
AbstractEntity, Repository<T>.

Team domain (fr.luc.crcore.team): Team entity with name/tag/color/leader/
visibility (PUBLIC|PRIVATE)/members/scores/spawn point, TeamMember,
TeamRole/TeamColor/TeamVisibility enums, TeamRanking record, TeamService with
overridable hooks (factories, validations, lifecycle events), in-memory
repository, dedicated exception hierarchy.

Player domain (fr.luc.crcore.player): PlayerProfile with named scores per
player, PlayerProfileService with auto-creation, individual rankings,
exception hierarchy. Both Team and PlayerProfile implement ScoreHolder.

Command framework (fr.luc.crcore.command): Command interface,
AbstractCommand base, BaseCommand (CommandExecutor + TabCompleter), SubCommand,
CommandContext, CommandResult, ArgumentType<T> + ArgumentTypes catalogue
(STRING, INTEGER, DOUBLE, BOOLEAN, ONLINE_PLAYER, enumOf, choice).

Docs (docs/) is the single source of truth: README, setup, features,
decisions log, and 6 PlantUML diagrams (team class/sequence/activity/join,
player class, command class).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-08 17:17:56 +02:00

63 lines
1.7 KiB
Plaintext

@startuml team-join-sequence
title CR-Core — Player joins a public team (sequence diagram)
actor Player
participant "BaseCommand\n(TeamCommand)" as Base
participant "SubCommand\n(TeamJoinSub)" as Sub
participant "TeamService" as Service
participant "TeamRepository" as Repo
participant "Team" as Team
Player -> Base : /team join <name>
activate Base
Base -> Base : route args[0]="join" → TeamJoinSub
Base -> Sub : execute(ctx)
activate Sub
Sub -> Service : getTeamByName(name)
activate Service
Service -> Repo : findByName(name)
activate Repo
Repo --> Service : Optional<Team>
deactivate Repo
Service --> Sub : Optional<Team>
deactivate Service
alt team not found
Sub --> Base : CommandResult.failure("Team not found")
else team found
Sub -> Service : joinTeam(team.id, playerId)
activate Service
Service -> Service : validateJoinable(team, playerId)
alt team is PRIVATE
Service --> Sub : throw TeamAccessException
Sub --> Base : CommandResult.failure(ex.message)
else player already in a team
Service --> Sub : throw TeamAccessException
Sub --> Base : CommandResult.failure(ex.message)
else allowed
Service -> Team : addMember(playerId)
activate Team
Team --> Service : member
deactivate Team
Service -> Repo : save(team)
activate Repo
Repo --> Service : team
deactivate Repo
Service -> Service : onMemberAdded(team, member)
Service -> Service : onPlayerJoined(team, member)
Service --> Sub : true
Sub --> Base : CommandResult.success("Joined " + team.name)
end
deactivate Service
end
deactivate Sub
Base -> Base : handleResult → sender.sendMessage
Base --> Player : reply
deactivate Base
@enduml