Skip to Content
PluginsAquaClanDeveloper API

Developer API

Build add ons that read and modify clans, listen to clan events, and register their own /clan subcommands, menus and menu actions.

plugin.yml
softdepend: [AquaClan]

Depend on the API at compile time only. The plugin ships the implementation at runtime, so shading it will break your add on.

Install

build.gradle.kts
repositories { maven("https://jitpack.io") } dependencies { compileOnly("com.github.aquatic-studios:AquaClan:VERSION") }

Getting the API

import com.aquaticstudios.aquaclan.api.AquaClanAPI; import com.aquaticstudios.aquaclan.api.AquaClanProvider; import com.aquaticstudios.aquaclan.api.Clan; AquaClanAPI api = AquaClanProvider.get();

It is also registered as a Bukkit service.

Every write method, create, members, points, bank, relations, metadata, must run on the main server thread. Reads come from the cache and are safe anywhere.

Reading

api.getClan("Warriors"); api.getClanByPlayer(player.getUniqueId()); api.getClanByPlayer(offlinePlayer); api.getClans(); api.getTopClans(10); api.hasClan(uuid); api.clanExists("Warriors"); api.getClanCount(); api.getVersion();

Every lookup returns an Optional<Clan>.

The Clan object

clan.name(); clan.level(); clan.points(); clan.kills(); clan.deaths(); clan.kdr(); clan.bank(); clan.size(); clan.slots(configDefault); clan.rawSlots(); clan.friendlyFire(); clan.createdAt(); clan.unreadMail(); clan.isMember(uuid); clan.isBanned(uuid); clan.isAlly(clanKey); clan.isRival(clanKey); clan.hasTag(); clan.hasBanner(); clan.setting("open", false); clan.hasPermission(ClanRole.MODERATOR, RolePermission.KICK);

Writing

api.createClan("Warriors", leader.getUniqueId()).ifPresent(clan -> { api.setTag(clan, "<gradient:#54ADF4:#56FF00>WAR</gradient>"); api.setHome(clan, "base", leader.getLocation()); api.setSetting(clan, "open", true); api.sendMail(clan, leader.getUniqueId(), leader.getName(), "Welcome!"); });
AreaMethods
ClancreateClan, disbandClan, setDescription, setNickname, setTag, setBanner
MembersaddMember, removeMember, setRole, ban, unban, setSlots
PointsaddPoints, setPoints
Bankdeposit, withdraw
RelationsaddAlly, removeAlly, addRival, removeRival
HomessetHome, deleteHome
SettingsgetSetting, setSetting, setPermission
Mail and logsendMail, clearMail, addLog
CombatgetPlayerKills, getPlayerDeaths, getPlayerKdr, setPlayerKills, setPlayerDeaths, addPlayerKill, addPlayerDeath
Friendly firesetFriendlyFire

Call api.save(clan) to persist your changes.

Levels

api.getMaxLevel(); api.getLevelThreshold(level); api.getPointsToNext(clan); api.getLevelExtraHomes(level); api.getLevelExtraSlots(level); api.getLevelExtraAllies(level);

Module data

Store your own typed data per clan under a namespace. It is saved inside the clan, with no extra files or database, and survives restarts.

ClanData data = api.getData(clan, "quests"); int done = data.getInt("completed", 0); data.setInt("completed", done + 1); api.save(clan);

Supported types: String, int, long, double, boolean. Plus has, remove and clear.

For a single loose value there is also api.setMetadata(clan, "kills_today", "42").

Events

All extend ClanEvent.

EventCancellableFired when
ClanCreateEventYesA clan is created
ClanDisbandEventYesA clan is disbanded
ClanJoinEventYesA player joins
ClanKickEventYesA member is kicked
ClanRenameEventYesA clan is renamed
ClanBankTransactionEventYesA deposit or withdraw
ClanChatEventYesA clan chat message is sent
ClanTagChangeEventYesA tag is set or cleared
ClanBannerChangeEventYesThe banner changes
ClanHomeCreateEventYesA home is set
ClanSettingChangeEventYesA toggle changes
ClanMailSendEventYesMail is sent
ClanLeaveEventNoA player leaves
ClanRoleChangeEventNoA member’s role changes
ClanRelationEventNoAn ally or rival is added or removed
ClanPointsChangeEventNoPoints change
ClanLevelUpEventNoA clan levels up
@EventHandler public void onLevelUp(ClanLevelUpEvent event) { Clan clan = event.getClan(); getLogger().info(clan.name() + " reached level " + event.getNewLevel()); }

Extending /clan

api.registerCommand(new MySubCommand()); // adds /clan <yours> api.registerMenuSource("my_source", provider); // custom paginated menu content api.registerMenuAction("mytoken", action); // [mytoken] arg in a menu button api.openMenu(player, "levels"); api.sendMessage(sender, "&aDone");

Combine getData with registerMenuSource and a menu button to give your module its own tab inside AquaClan.

Custom placeholders

// %aquaclan_progress% -> "1200 / 1500 (300 to go)" api.registerPlaceholder("progress", (viewer, clan) -> { if (clan == null) return "No clan"; long next = api.getLevelThreshold(clan.level() + 1); return clan.points() + " / " + next + " (" + api.getPointsToNext(clan) + " to go)"; });

Role permissions

setPermission(clan, role, permission, value) toggles what a rank can do.

RolePermissionControls
INVITESending invitations
KICKKicking members
PROMOTE / DEMOTEChanging ranks
MANAGE_ROLESEditing role permissions
MANAGE_HOMESCreating and deleting homes
MANAGE_RELATIONSAllies and rivals
MANAGE_SETTINGSClan toggles
MANAGE_BANKDeposits and withdrawals
SEND_MAILClan mail
BANBanning players
DESCRIPTIONEditing the description
FRIENDLY_FIREToggling friendly fire
REGROUPRallying the clan

Roles are LEADER, CO_LEADER, MODERATOR and MEMBER.

Last updated: September 2, 2026 bySenkexin6da3673