
Teams API
TeamsAPI is a passive, server-side bridge plugin for Minecraft servers, inspired by Vault
Non-breaking additions. No changes required for existing providers or consumers.
Added
Convenience methods
TeamsService.getTeamIds()- returns all team UUIDs for iteration without loading full team objects.Team.getOwner()- default method returning the owner'sTeamMemberrecord.VelocityTeam.getMemberUUIDs()- returns UUIDs of all members.VelocityTeam.getOwner()- default method returning the owner's record.
Role prefix reset
New
resetPrefixOverride()method on bothTeamRoleandTeamRoleDefinitionclears any active prefix override, restoring the built-in default:TeamRole.OWNER.setPrefixOverride("[Lord]"); TeamRole.OWNER.resetPrefixOverride(); // back to "Owner"Equivalent to calling
setPrefixOverride(null).TeamsAPI.API_VERSIONupdated to2.5.0.
Changed
docs/api.mdTeam lookup section now correctly listsgetTeam,getTeamByName, andgetPlayerTeamalongsidegetAllTeams,getTeamCount, andgetTeamIds.docs/velocity.mdupdated to documentgetMemberUUIDs()andgetOwner()onVelocityTeam.
Migration
No behavioural changes for existing providers or consumers.
Non-breaking additions. No changes required for existing providers or consumers.
Added
Convenience methods
TeamsService.getTeamIds()- returns all team UUIDs for iteration without loading full team objects.Team.getOwner()- default method returning the owner'sTeamMemberrecord.VelocityTeam.getMemberUUIDs()- returns UUIDs of all members.VelocityTeam.getOwner()- default method returning the owner's record.
Role prefix reset
New
resetPrefixOverride()method on bothTeamRoleandTeamRoleDefinitionclears any active prefix override, restoring the built-in default:TeamRole.OWNER.setPrefixOverride("[Lord]"); TeamRole.OWNER.resetPrefixOverride(); // back to "Owner"Equivalent to calling
setPrefixOverride(null).TeamsAPI.API_VERSIONupdated to2.5.0.
Changed
docs/api.mdTeam lookup section now correctly listsgetTeam,getTeamByName, andgetPlayerTeamalongsidegetAllTeams,getTeamCount, andgetTeamIds.docs/velocity.mdupdated to documentgetMemberUUIDs()andgetOwner()onVelocityTeam.
Migration
No behavioural changes for existing providers or consumers.
Non-breaking additions. No changes required for existing providers or consumers.
Added
Convenience methods
TeamsService.getTeamIds()- returns all team UUIDs for iteration without loading full team objects.Team.getOwner()- default method returning the owner'sTeamMemberrecord.VelocityTeam.getMemberUUIDs()- returns UUIDs of all members.VelocityTeam.getOwner()- default method returning the owner's record.
Role prefix reset
New
resetPrefixOverride()method on bothTeamRoleandTeamRoleDefinitionclears any active prefix override, restoring the built-in default:TeamRole.OWNER.setPrefixOverride("[Lord]"); TeamRole.OWNER.resetPrefixOverride(); // back to "Owner"Equivalent to calling
setPrefixOverride(null).TeamsAPI.API_VERSIONupdated to2.5.0.
Changed
docs/api.mdTeam lookup section now correctly listsgetTeam,getTeamByName, andgetPlayerTeamalongsidegetAllTeams,getTeamCount, andgetTeamIds.docs/velocity.mdupdated to documentgetMemberUUIDs()andgetOwner()onVelocityTeam.
Migration
No behavioural changes for existing providers or consumers.
Non-breaking additions. No changes required for existing providers or consumers.
Added
Role prefix overrides
Consumers can now customise the display prefix for any built-in
TeamRoleconstant at runtime:// Override a single role TeamRole.OWNER.setPrefixOverride("[Lord]"); // Read back: returns override when set, default otherwise String prefix = TeamRole.OWNER.getPrefix(); // "[Lord]" // Original default is always available String def = TeamRole.OWNER.getDefaultPrefix(); // "Owner" // Clear the override TeamRole.OWNER.setPrefixOverride(null);For bulk operations two static helpers are available:
// Apply multiple overrides at once (null value clears that role's override) TeamRole.applyPrefixes(Map.of( TeamRole.OWNER, "[Lord]", TeamRole.ADMIN, "[Officer]" )); // Clear all overrides for every built-in role TeamRole.resetAllPrefixes();New methods on
TeamRole:getDefaultPrefix()- compile-time default prefix, unaffected by any overridesetPrefixOverride(String)- sets or clears (null) a JVM-wide prefix overrideapplyPrefixes(Map<TeamRole, String>)- bulk-sets overrides from a mapresetAllPrefixes()- clears overrides on every built-in role constant
getPrefix()now returns the override when set, otherwise the compile-time default. Existing calls togetPrefix()require no changes.Custom role definitions and registry
Providers that model roles beyond the three built-in constants (
OWNER,ADMIN,MEMBER) can now publish them through a server-wide registry:// In your provider plugin's onEnable() TeamRoleDefinition coOwner = new TeamRoleDefinition("co_owner", 75, "Co-Owner"); TeamsAPI.registerCustomRole(this, coOwner); // In onDisable() TeamsAPI.unregisterCustomRole("co_owner");Consumers can look up or enumerate registered definitions:
// Look up by key Optional<TeamRoleDefinition> role = TeamsAPI.getCustomRole("co_owner"); // Iterate all custom roles (sorted highest priority first) for (TeamRoleDefinition def : TeamsAPI.getCustomRoles()) { getLogger().info(def.getKey() + " - priority " + def.getPriority()); } // Test presence if (TeamsAPI.isCustomRoleRegistered("co_owner")) { ... }TeamRoleDefinitionalso supports prefix overrides viasetPrefixOverride(String), matching the same pattern asTeamRole.New methods on
TeamsAPI:registerCustomRole(Plugin, TeamRoleDefinition)- publishes a custom roleunregisterCustomRole(String)- removes a custom role by keygetCustomRole(String)- looks up a definition by key, returnsOptionalgetCustomRoles()- snapshot sorted by descending priorityisCustomRoleRegistered(String)- tests presence by key
TeamMember.getRoleDefinition()
TeamMembernow has a default methodgetRoleDefinition()that returns aTeamRoleDefinitionwrapping the member's current built-in role:TeamMember member = ...; TeamRoleDefinition def = member.getRoleDefinition(); // def.getKey() -> "owner" / "admin" / "member" // def.getPriority() -> 100 / 50 / 10Providers that register custom roles should override this method to return the precise custom definition for the member.
TeamsAPI.API_VERSIONupdated to2.4.0.
Migration
No behavioural changes for existing providers or consumers.
getPrefix()still returns the same defaults ("Owner","Admin","Member") unless a plugin explicitly callssetPrefixOverride(...). The newgetDefaultPrefix()method gives a stable, always-available fallback. The custom role registry starts empty; absence of a registered definition for a role key is a valid state.Non-breaking additions. No changes required for existing providers or consumers.
Added
Role prefix overrides
Consumers can now customise the display prefix for any built-in
TeamRoleconstant at runtime:// Override a single role TeamRole.OWNER.setPrefixOverride("[Lord]"); // Read back: returns override when set, default otherwise String prefix = TeamRole.OWNER.getPrefix(); // "[Lord]" // Original default is always available String def = TeamRole.OWNER.getDefaultPrefix(); // "Owner" // Clear the override TeamRole.OWNER.setPrefixOverride(null);For bulk operations two static helpers are available:
// Apply multiple overrides at once (null value clears that role's override) TeamRole.applyPrefixes(Map.of( TeamRole.OWNER, "[Lord]", TeamRole.ADMIN, "[Officer]" )); // Clear all overrides for every built-in role TeamRole.resetAllPrefixes();New methods on
TeamRole:getDefaultPrefix()- compile-time default prefix, unaffected by any overridesetPrefixOverride(String)- sets or clears (null) a JVM-wide prefix overrideapplyPrefixes(Map<TeamRole, String>)- bulk-sets overrides from a mapresetAllPrefixes()- clears overrides on every built-in role constant
getPrefix()now returns the override when set, otherwise the compile-time default. Existing calls togetPrefix()require no changes.Custom role definitions and registry
Providers that model roles beyond the three built-in constants (
OWNER,ADMIN,MEMBER) can now publish them through a server-wide registry:// In your provider plugin's onEnable() TeamRoleDefinition coOwner = new TeamRoleDefinition("co_owner", 75, "Co-Owner"); TeamsAPI.registerCustomRole(this, coOwner); // In onDisable() TeamsAPI.unregisterCustomRole("co_owner");Consumers can look up or enumerate registered definitions:
// Look up by key Optional<TeamRoleDefinition> role = TeamsAPI.getCustomRole("co_owner"); // Iterate all custom roles (sorted highest priority first) for (TeamRoleDefinition def : TeamsAPI.getCustomRoles()) { getLogger().info(def.getKey() + " - priority " + def.getPriority()); } // Test presence if (TeamsAPI.isCustomRoleRegistered("co_owner")) { ... }TeamRoleDefinitionalso supports prefix overrides viasetPrefixOverride(String), matching the same pattern asTeamRole.New methods on
TeamsAPI:registerCustomRole(Plugin, TeamRoleDefinition)- publishes a custom roleunregisterCustomRole(String)- removes a custom role by keygetCustomRole(String)- looks up a definition by key, returnsOptionalgetCustomRoles()- snapshot sorted by descending priorityisCustomRoleRegistered(String)- tests presence by key
TeamMember.getRoleDefinition()
TeamMembernow has a default methodgetRoleDefinition()that returns aTeamRoleDefinitionwrapping the member's current built-in role:TeamMember member = ...; TeamRoleDefinition def = member.getRoleDefinition(); // def.getKey() -> "owner" / "admin" / "member" // def.getPriority() -> 100 / 50 / 10Providers that register custom roles should override this method to return the precise custom definition for the member.
TeamsAPI.API_VERSIONupdated to2.4.0.
Migration
No behavioural changes for existing providers or consumers.
getPrefix()still returns the same defaults ("Owner","Admin","Member") unless a plugin explicitly callssetPrefixOverride(...). The newgetDefaultPrefix()method gives a stable, always-available fallback. The custom role registry starts empty; absence of a registered definition for a role key is a valid state.Non-breaking additions. No changes required for existing providers or consumers.
Added
Role prefix overrides
Consumers can now customise the display prefix for any built-in
TeamRoleconstant at runtime:// Override a single role TeamRole.OWNER.setPrefixOverride("[Lord]"); // Read back: returns override when set, default otherwise String prefix = TeamRole.OWNER.getPrefix(); // "[Lord]" // Original default is always available String def = TeamRole.OWNER.getDefaultPrefix(); // "Owner" // Clear the override TeamRole.OWNER.setPrefixOverride(null);For bulk operations two static helpers are available:
// Apply multiple overrides at once (null value clears that role's override) TeamRole.applyPrefixes(Map.of( TeamRole.OWNER, "[Lord]", TeamRole.ADMIN, "[Officer]" )); // Clear all overrides for every built-in role TeamRole.resetAllPrefixes();New methods on
TeamRole:getDefaultPrefix()- compile-time default prefix, unaffected by any overridesetPrefixOverride(String)- sets or clears (null) a JVM-wide prefix overrideapplyPrefixes(Map<TeamRole, String>)- bulk-sets overrides from a mapresetAllPrefixes()- clears overrides on every built-in role constant
getPrefix()now returns the override when set, otherwise the compile-time default. Existing calls togetPrefix()require no changes.Custom role definitions and registry
Providers that model roles beyond the three built-in constants (
OWNER,ADMIN,MEMBER) can now publish them through a server-wide registry:// In your provider plugin's onEnable() TeamRoleDefinition coOwner = new TeamRoleDefinition("co_owner", 75, "Co-Owner"); TeamsAPI.registerCustomRole(this, coOwner); // In onDisable() TeamsAPI.unregisterCustomRole("co_owner");Consumers can look up or enumerate registered definitions:
// Look up by key Optional<TeamRoleDefinition> role = TeamsAPI.getCustomRole("co_owner"); // Iterate all custom roles (sorted highest priority first) for (TeamRoleDefinition def : TeamsAPI.getCustomRoles()) { getLogger().info(def.getKey() + " - priority " + def.getPriority()); } // Test presence if (TeamsAPI.isCustomRoleRegistered("co_owner")) { ... }TeamRoleDefinitionalso supports prefix overrides viasetPrefixOverride(String), matching the same pattern asTeamRole.New methods on
TeamsAPI:registerCustomRole(Plugin, TeamRoleDefinition)- publishes a custom roleunregisterCustomRole(String)- removes a custom role by keygetCustomRole(String)- looks up a definition by key, returnsOptionalgetCustomRoles()- snapshot sorted by descending priorityisCustomRoleRegistered(String)- tests presence by key
TeamMember.getRoleDefinition()
TeamMembernow has a default methodgetRoleDefinition()that returns aTeamRoleDefinitionwrapping the member's current built-in role:TeamMember member = ...; TeamRoleDefinition def = member.getRoleDefinition(); // def.getKey() -> "owner" / "admin" / "member" // def.getPriority() -> 100 / 50 / 10Providers that register custom roles should override this method to return the precise custom definition for the member.
TeamsAPI.API_VERSIONupdated to2.4.0.
Migration
No behavioural changes for existing providers or consumers.
getPrefix()still returns the same defaults ("Owner","Admin","Member") unless a plugin explicitly callssetPrefixOverride(...). The newgetDefaultPrefix()method gives a stable, always-available fallback. The custom role registry starts empty; absence of a registered definition for a role key is a valid state.Added
- New optional
TeamsChestServiceinterface for team chest access:getChestIds(teamId),getContents(...),setContents(...),addItem(...), andremoveItem(...). - New
TeamsAPIchest facade methods:getChestService(),isChestAvailable(),registerChestProvider(plugin, service),registerChestProvider(plugin, service, priority), andunregisterChestProvider(service). - New API tests:
TeamsAPIChestTestfor chest provider registration, null-safety, priority registration, and service independence from coreTeamsService. - New docs pages:
provider-chests(provider implementation/registration guidance) andconsumer-chests(consumer usage patterns and fallback guards).
Changed
- TeamsAPI version bumped from
2.2.0to2.3.0(non-breaking minor release). TeamsAPI.API_VERSIONbumped to2.3.0.- README, API docs, provider/consumer guides, server guide, and public listings
updated to include the optional chest capability and
2.3.0dependency examples.
- New optional
Added
- New optional
TeamsChestServiceinterface for team chest access:getChestIds(teamId),getContents(...),setContents(...),addItem(...), andremoveItem(...). - New
TeamsAPIchest facade methods:getChestService(),isChestAvailable(),registerChestProvider(plugin, service),registerChestProvider(plugin, service, priority), andunregisterChestProvider(service). - New API tests:
TeamsAPIChestTestfor chest provider registration, null-safety, priority registration, and service independence from coreTeamsService. - New docs pages:
provider-chests(provider implementation/registration guidance) andconsumer-chests(consumer usage patterns and fallback guards).
Changed
- TeamsAPI version bumped from
2.2.0to2.3.0(non-breaking minor release). TeamsAPI.API_VERSIONbumped to2.3.0.- README, API docs, provider/consumer guides, server guide, and public listings
updated to include the optional chest capability and
2.3.0dependency examples.
- New optional
Added
- New optional
TeamsChestServiceinterface for team chest access:getChestIds(teamId),getContents(...),setContents(...),addItem(...), andremoveItem(...). - New
TeamsAPIchest facade methods:getChestService(),isChestAvailable(),registerChestProvider(plugin, service),registerChestProvider(plugin, service, priority), andunregisterChestProvider(service). - New API tests:
TeamsAPIChestTestfor chest provider registration, null-safety, priority registration, and service independence from coreTeamsService. - New docs pages:
provider-chests(provider implementation/registration guidance) andconsumer-chests(consumer usage patterns and fallback guards).
Changed
- TeamsAPI version bumped from
2.2.0to2.3.0(non-breaking minor release). TeamsAPI.API_VERSIONbumped to2.3.0.- README, API docs, provider/consumer guides, server guide, and public listings
updated to include the optional chest capability and
2.3.0dependency examples.
- New optional
TeamsAPI now ships official extensions for three popular team plugins. Drop the extension JAR in your
plugins/folder alongside the team plugin and TeamsAPI will automatically pick it up as a provider. No code changes needed.New: official provider extensions
TeamsAPI
2.2.0introduces three ready-to-use provider extensions. Each is bundled inside the mainteams-api-pluginJAR and provisioned automatically toplugins/TeamsAPI/extensions/on first startup.BetterTeams extension (
teams-api-extension-betterteams)- Exposes teams, members, invites, warps, and ally/neutral relations through TeamsAPI.
- Invite support:
invitePlayeranddeclineInvitework for offline players;acceptInviterequires the invitee to be online at the time of the call. - Relation support covers
ALLYandNEUTRAL; BetterTeams does not model enemies or truces. MEMBER,ALLY, andNEUTRALrelation constants are supported.
Towny Advanced extension (
teams-api-extension-towny)- Maps Towny towns to teams, residents to members, and nation relationships (ally/enemy) to TeamsAPI relation constants.
- Claim lookup fully supported; claim and unclaim mutations are not exposed (Towny manages its own chunk lifecycle).
MEMBER,ALLY,ENEMY, andNEUTRALrelation constants are supported;TRUCEis normalized toNEUTRAL.
KingdomsX extension (
teams-api-extension-kingdomsx)- Maps KingdomsX kingdoms to teams, members to members, and diplomatic relations to TeamsAPI constants.
- Claim lookup supported; mutations return
false(require a liveKingdomPlayercontext not available through TeamsAPI). - Power read-only;
getPlayerMaxPowerandgetTeamMaxPoweralways return0.0(KingdomsX does not expose a per-player power ceiling in its public API). MEMBER,ALLY,TRUCE,ENEMY, andNEUTRALrelation constants are supported; relations are applied symmetrically.
New: extension management commands
Command Permission Description /teamsapi install <extension>teamsapi.install(op)Copies a bundled extension JAR to plugins/TeamsAPI/extensions/. Valid names:betterteams,towny,kingdomsx./teamsapi load <file>.jarteamsapi.load(op)Loads and enables an extension from plugins/TeamsAPI/extensions/without a server restart.Installation quick-start
- The extension JARs are pre-bundled. TeamsAPI copies them to
plugins/TeamsAPI/extensions/on startup automatically. Nothing to download for first-time setup. - Run
/teamsapi install betterteams(ortowny/kingdomsx) to stage the extension for the next restart, or run/teamsapi load teams-api-extension-betterteams-2.2.0.jarto activate it immediately without a restart. - Install the matching team plugin if it is not already present, then restart (or reload) the server.
Full details and a feature matrix are in the Provider Catalog.
TeamsAPI now ships official extensions for three popular team plugins. Drop the extension JAR in your
plugins/folder alongside the team plugin and TeamsAPI will automatically pick it up as a provider. No code changes needed.New: official provider extensions
TeamsAPI
2.2.0introduces three ready-to-use provider extensions. Each is bundled inside the mainteams-api-pluginJAR and provisioned automatically toplugins/TeamsAPI/extensions/on first startup.BetterTeams extension (
teams-api-extension-betterteams)- Exposes teams, members, invites, warps, and ally/neutral relations through TeamsAPI.
- Invite support:
invitePlayeranddeclineInvitework for offline players;acceptInviterequires the invitee to be online at the time of the call. - Relation support covers
ALLYandNEUTRAL; BetterTeams does not model enemies or truces. MEMBER,ALLY, andNEUTRALrelation constants are supported.
Towny Advanced extension (
teams-api-extension-towny)- Maps Towny towns to teams, residents to members, and nation relationships (ally/enemy) to TeamsAPI relation constants.
- Claim lookup fully supported; claim and unclaim mutations are not exposed (Towny manages its own chunk lifecycle).
MEMBER,ALLY,ENEMY, andNEUTRALrelation constants are supported;TRUCEis normalized toNEUTRAL.
KingdomsX extension (
teams-api-extension-kingdomsx)- Maps KingdomsX kingdoms to teams, members to members, and diplomatic relations to TeamsAPI constants.
- Claim lookup supported; mutations return
false(require a liveKingdomPlayercontext not available through TeamsAPI). - Power read-only;
getPlayerMaxPowerandgetTeamMaxPoweralways return0.0(KingdomsX does not expose a per-player power ceiling in its public API). MEMBER,ALLY,TRUCE,ENEMY, andNEUTRALrelation constants are supported; relations are applied symmetrically.
New: extension management commands
Command Permission Description /teamsapi install <extension>teamsapi.install(op)Copies a bundled extension JAR to plugins/TeamsAPI/extensions/. Valid names:betterteams,towny,kingdomsx./teamsapi load <file>.jarteamsapi.load(op)Loads and enables an extension from plugins/TeamsAPI/extensions/without a server restart.Installation quick-start
- The extension JARs are pre-bundled. TeamsAPI copies them to
plugins/TeamsAPI/extensions/on startup automatically. Nothing to download for first-time setup. - Run
/teamsapi install betterteams(ortowny/kingdomsx) to stage the extension for the next restart, or run/teamsapi load teams-api-extension-betterteams-2.2.0.jarto activate it immediately without a restart. - Install the matching team plugin if it is not already present, then restart (or reload) the server.
Full details and a feature matrix are in the Provider Catalog.
TeamsAPI now ships official extensions for three popular team plugins. Drop the extension JAR in your
plugins/folder alongside the team plugin and TeamsAPI will automatically pick it up as a provider. No code changes needed.New: official provider extensions
TeamsAPI
2.2.0introduces three ready-to-use provider extensions. Each is bundled inside the mainteams-api-pluginJAR and provisioned automatically toplugins/TeamsAPI/extensions/on first startup.BetterTeams extension (
teams-api-extension-betterteams)- Exposes teams, members, invites, warps, and ally/neutral relations through TeamsAPI.
- Invite support:
invitePlayeranddeclineInvitework for offline players;acceptInviterequires the invitee to be online at the time of the call. - Relation support covers
ALLYandNEUTRAL; BetterTeams does not model enemies or truces. MEMBER,ALLY, andNEUTRALrelation constants are supported.
Towny Advanced extension (
teams-api-extension-towny)- Maps Towny towns to teams, residents to members, and nation relationships (ally/enemy) to TeamsAPI relation constants.
- Claim lookup fully supported; claim and unclaim mutations are not exposed (Towny manages its own chunk lifecycle).
MEMBER,ALLY,ENEMY, andNEUTRALrelation constants are supported;TRUCEis normalized toNEUTRAL.
KingdomsX extension (
teams-api-extension-kingdomsx)- Maps KingdomsX kingdoms to teams, members to members, and diplomatic relations to TeamsAPI constants.
- Claim lookup supported; mutations return
false(require a liveKingdomPlayercontext not available through TeamsAPI). - Power read-only;
getPlayerMaxPowerandgetTeamMaxPoweralways return0.0(KingdomsX does not expose a per-player power ceiling in its public API). MEMBER,ALLY,TRUCE,ENEMY, andNEUTRALrelation constants are supported; relations are applied symmetrically.
New: extension management commands
Command Permission Description /teamsapi install <extension>teamsapi.install(op)Copies a bundled extension JAR to plugins/TeamsAPI/extensions/. Valid names:betterteams,towny,kingdomsx./teamsapi load <file>.jarteamsapi.load(op)Loads and enables an extension from plugins/TeamsAPI/extensions/without a server restart.Installation quick-start
- The extension JARs are pre-bundled. TeamsAPI copies them to
plugins/TeamsAPI/extensions/on startup automatically. Nothing to download for first-time setup. - Run
/teamsapi install betterteams(ortowny/kingdomsx) to stage the extension for the next restart, or run/teamsapi load teams-api-extension-betterteams-2.2.0.jarto activate it immediately without a restart. - Install the matching team plugin if it is not already present, then restart (or reload) the server.
Full details and a feature matrix are in the Provider Catalog.
Added
- Optional
RelationNatureenum (FRIENDLY,NEUTRAL,HOSTILE) to the model package. EachTeamRelationconstant carries a built-in default nature which may be queried withgetDefaultNature(). - Consumer override support:
TeamRelation#setNatureOverride(RelationNature)andTeamRelation#getNature()- allows server or provider code to re-categorise a relation at runtime. PassingnulltosetNatureOverrideclears the override and restores the builtin default. Overrides are visible JVM-wide because enum constants are singletons. - Unit tests:
TeamRelationTestcovering default natures and override behaviour.
Changed
TeamsAPI.API_VERSIONbumped to2.1.0.
Migration
No behavioural changes to existing
TeamRelationhelpers:isFriendly()andisHostile()remain unchanged and existing consumers require no changes. Providers that wish to reclassify relations (for example treatingTRUCEasNEUTRAL) may callsetNatureOverride(...)during initialisation.- Optional
Added
- Optional
RelationNatureenum (FRIENDLY,NEUTRAL,HOSTILE) to the model package. EachTeamRelationconstant carries a built-in default nature which may be queried withgetDefaultNature(). - Consumer override support:
TeamRelation#setNatureOverride(RelationNature)andTeamRelation#getNature()- allows server or provider code to re-categorise a relation at runtime. PassingnulltosetNatureOverrideclears the override and restores the builtin default. Overrides are visible JVM-wide because enum constants are singletons. - Unit tests:
TeamRelationTestcovering default natures and override behaviour.
Changed
TeamsAPI.API_VERSIONbumped to2.1.0.
Migration
No behavioural changes to existing
TeamRelationhelpers:isFriendly()andisHostile()remain unchanged and existing consumers require no changes. Providers that wish to reclassify relations (for example treatingTRUCEasNEUTRAL) may callsetNatureOverride(...)during initialisation.- Optional
Added
- Optional
RelationNatureenum (FRIENDLY,NEUTRAL,HOSTILE) to the model package. EachTeamRelationconstant carries a built-in default nature which may be queried withgetDefaultNature(). - Consumer override support:
TeamRelation#setNatureOverride(RelationNature)andTeamRelation#getNature()- allows server or provider code to re-categorise a relation at runtime. PassingnulltosetNatureOverrideclears the override and restores the builtin default. Overrides are visible JVM-wide because enum constants are singletons. - Unit tests:
TeamRelationTestcovering default natures and override behaviour.
Changed
TeamsAPI.API_VERSIONbumped to2.1.0.
Migration
No behavioural changes to existing
TeamRelationhelpers:isFriendly()andisHostile()remain unchanged and existing consumers require no changes. Providers that wish to reclassify relations (for example treatingTRUCEasNEUTRAL) may callsetNatureOverride(...)during initialisation.- Optional
Added
TeamRelation.MEMBERconstant (ordinal 4) representing the same-team relationship. Providers should returnMEMBERfromgetRelation(A, A)when both team UUIDs are equal. Consumers comparing two players on potentially the same team will now receive a dedicated constant instead ofNEUTRAL.TeamRelationinternalhostilityLevelfield.isMoreHostileThan()now uses this field instead of ordinal position, correctly placingMEMBERat hostility level -1 (less hostile thanALLY). Results for the original four constants are unchanged.isFriendly()now returnstrueforMEMBERin addition toALLYandTRUCE.TeamsAPI.API_VERSIONbumped to2.0.0.
Changed
ALLYdefault color:§a(green /#55FF55) →§b(aqua /#55FFFF). This aligns with the standard Factions color convention where green represents same-team membership.TRUCEdefault color:§6(gold /#FFAA00) →§e(yellow /#FFFF55). Aligns legacy code character with MiniMessage<yellow>.
Migration
The four original ordinals (
ALLY=0,TRUCE=1,NEUTRAL=2,ENEMY=3) are unchanged. Code that does not referenceMEMBERand does not depend on the specific color values ofALLYorTRUCErequires no changes.Consumers that use
ALLYorTRUCEdefault colors (viagetLegacyColorCode(),getDefaultHexColor(), orTeamsRelationService.getRelationColor()) should update their color expectations accordingly. Providers that configure their own colors viagetRelationColor()overrides are unaffected.Added
TeamRelation.MEMBERconstant (ordinal 4) representing the same-team relationship. Providers should returnMEMBERfromgetRelation(A, A)when both team UUIDs are equal. Consumers comparing two players on potentially the same team will now receive a dedicated constant instead ofNEUTRAL.TeamRelationinternalhostilityLevelfield.isMoreHostileThan()now uses this field instead of ordinal position, correctly placingMEMBERat hostility level -1 (less hostile thanALLY). Results for the original four constants are unchanged.isFriendly()now returnstrueforMEMBERin addition toALLYandTRUCE.TeamsAPI.API_VERSIONbumped to2.0.0.
Changed
ALLYdefault color:§a(green /#55FF55) →§b(aqua /#55FFFF). This aligns with the standard Factions color convention where green represents same-team membership.TRUCEdefault color:§6(gold /#FFAA00) →§e(yellow /#FFFF55). Aligns legacy code character with MiniMessage<yellow>.
Migration
The four original ordinals (
ALLY=0,TRUCE=1,NEUTRAL=2,ENEMY=3) are unchanged. Code that does not referenceMEMBERand does not depend on the specific color values ofALLYorTRUCErequires no changes.Consumers that use
ALLYorTRUCEdefault colors (viagetLegacyColorCode(),getDefaultHexColor(), orTeamsRelationService.getRelationColor()) should update their color expectations accordingly. Providers that configure their own colors viagetRelationColor()overrides are unaffected.Added
TeamRelation.MEMBERconstant (ordinal 4) representing the same-team relationship. Providers should returnMEMBERfromgetRelation(A, A)when both team UUIDs are equal. Consumers comparing two players on potentially the same team will now receive a dedicated constant instead ofNEUTRAL.TeamRelationinternalhostilityLevelfield.isMoreHostileThan()now uses this field instead of ordinal position, correctly placingMEMBERat hostility level -1 (less hostile thanALLY). Results for the original four constants are unchanged.isFriendly()now returnstrueforMEMBERin addition toALLYandTRUCE.TeamsAPI.API_VERSIONbumped to2.0.0.
Changed
ALLYdefault color:§a(green /#55FF55) →§b(aqua /#55FFFF). This aligns with the standard Factions color convention where green represents same-team membership.TRUCEdefault color:§6(gold /#FFAA00) →§e(yellow /#FFFF55). Aligns legacy code character with MiniMessage<yellow>.
Migration
The four original ordinals (
ALLY=0,TRUCE=1,NEUTRAL=2,ENEMY=3) are unchanged. Code that does not referenceMEMBERand does not depend on the specific color values ofALLYorTRUCErequires no changes.Consumers that use
ALLYorTRUCEdefault colors (viagetLegacyColorCode(),getDefaultHexColor(), orTeamsRelationService.getRelationColor()) should update their color expectations accordingly. Providers that configure their own colors viagetRelationColor()overrides are unaffected.Added
TeamsPowerHistoryServiceoptional extension interface for reading and managing power-history entries through TeamsAPI.- New power-history model types:
TeamPowerHistoryEntryandTeamPowerHistoryType(GAIN,LOSS,ADJUSTMENT). - New
TeamsAPIpower-history facade methods:getPowerHistoryService(),isPowerHistoryAvailable(),registerPowerHistoryProvider(plugin, service),registerPowerHistoryProvider(plugin, service, priority),unregisterPowerHistoryProvider(service). - New tests:
TeamsAPIPowerHistoryTest(service registration/availability/null-safety) andTeamPowerHistoryTypeTest(enum contract coverage). TeamsAPI.API_VERSIONbumped to1.8.0.
Added
TeamsPowerHistoryServiceoptional extension interface for reading and managing power-history entries through TeamsAPI.- New power-history model types:
TeamPowerHistoryEntryandTeamPowerHistoryType(GAIN,LOSS,ADJUSTMENT). - New
TeamsAPIpower-history facade methods:getPowerHistoryService(),isPowerHistoryAvailable(),registerPowerHistoryProvider(plugin, service),registerPowerHistoryProvider(plugin, service, priority),unregisterPowerHistoryProvider(service). - New tests:
TeamsAPIPowerHistoryTest(service registration/availability/null-safety) andTeamPowerHistoryTypeTest(enum contract coverage). TeamsAPI.API_VERSIONbumped to1.8.0.
