Developer API

Public API for integrating minePlots with external plugins.

Overview

minePlots provides a public API module (plugin-api) that allows external plugins to interact with plots, members, warps, bans, and profiles. The package root is pl.minecodes.plots.api.

Installation

The API is published to the mineCodes Maven repository.

Gradle (Kotlin DSL)

repositories {
    maven("https://maven.minecodes.pl/releases/")
}

dependencies {
    compileOnly("pl.minecodes.plots:plugin-api:4.6.2")
}

Maven

<repositories>
    <repository>
        <id>minecodes-releases</id>
        <url>https://maven.minecodes.pl/releases/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>pl.minecodes.plots</groupId>
        <artifactId>plugin-api</artifactId>
        <version>4.6.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

plugin.yml

Add minePlots as a dependency in your plugin:

depend: [minePlots]

Or as a soft dependency if plot integration is optional:

softdepend: [minePlots]

Accessing Services

minePlots registers its services in the Bukkit ServicesManager:

PlotServiceApi plotService = Bukkit.getServicesManager()
    .load(PlotServiceApi.class);

ProfileServiceApi profileService = Bukkit.getServicesManager()
    .load(ProfileServiceApi.class);

Always null-check the result — the services are available only after minePlots has been enabled.

Core Interfaces

PlotServiceApi

Plot lookups:

interface PlotServiceApi {
    PlotApi getPlot(Location location);
    PlotApi getPlot(UUID owner);
    PlotApi getPlot(int id);
    List<PlotApi> getPlots();
    List<PlotApi> getPlotsByWorld(UUID worldUniqueId);
}

All getPlot(...) lookups return null when no plot matches.

PlotApi

Represents a single plot. The most important methods:

interface PlotApi {
    int getId();
    UUID getOwner();
    String getName();

    Location getCenter();
    Location getHome();
    RegionApi getRegion();

    boolean isClosed();
    long getCreated();
    long getExpireIn();

    Set<MemberApi> getMembers();
    MemberApi getMember(UUID uuid);
    void addMember(UUID uuid);
    void removeMember(UUID uuid);

    Set<FlagType> getFlags();
    void addFlag(FlagType flag);
    void removeFlag(FlagType flag);

    boolean hasMemberPermission(UUID uuid, PermissionType permission);
    boolean hasAccess(Player player);
}

getMember(UUID) returns null when the player is not a member.

ProfileServiceApi

Player profile lookups:

interface ProfileServiceApi {
    @Nullable ProfileApi getProfileByUniqueId(UUID uniqueId);
    @Nullable ProfileApi getProfileByUsername(String nickname);
}

RegionApi

Plot region bounds:

interface RegionApi {
    boolean isInCuboid(Location location);
    int getSize();
    int getX();
    int getZ();
}

MemberApi

interface MemberApi {
    UUID getUuid();
    long getAdded();
    Set<PermissionType> getPermissions();
    boolean hasPermission(PermissionType permissionType);
}

WarpApi & BanApi

The API also exposes warp (WarpApi, WarpServiceApi) and ban (BanApi, BanServiceApi) interfaces in the pl.minecodes.plots.api.warp and pl.minecodes.plots.api.ban packages. Ban and warp data is best consumed through the related events listed below.

Type Enums

FlagType

PVP, BUILD, DESTROY, INTERACT, ITEM_FRAME, CHEST, EXPLOSION, LAVA, WATER, IGNITE, SNOW_MAN, ARMOR_STAND, ENDER_PEARL, SET_HOME, DAMAGE_AGGRESSIVE_MOBS, DAMAGE_PASSIVE_MOBS, POTION, VEHICLE, RECEIVE_DAMAGE_FROM_MOBS, PHANTOM_SPAWN

PermissionType

PANEL_OPEN, RENAME_PLOT, CHANGE_FLAG, INVITE_MEMBER, KICK_MEMBER, EXPIRATION_MANAGE, PERMISSION_MANAGE, MANAGE_VISIBILITY, UPGRADE_MANAGE, BAN_MEMBERS, PLOT_OPEN, PLOT_CLOSE

Events

All events live under pl.minecodes.plots.api.event and are standard Bukkit events.

EventCancellableFired
PlotCreateEventBefore plot registration and save
PlotRemoveEventAfter plot deletion
PlotRenameEventBefore rename is applied (mutable via setNewName)
PlotFlagChangeEventBefore a flag change is applied (mutable via setNewValue)
PlotFlagCanceledEventWhen a flag check denies an action
PrePlotEntryEventBefore a player enters a plot
PlotEntryEventAfter the pre-entry check passes
PrePlotLeaveEventBefore a player leaves a plot
PlotLeaveEventAfter the pre-leave check passes
PlotPlayerMoveEventOn movement within the same plot
PlotTeleportEventOn plot teleport (home, visit, warp, admin)
PlotSetHomeEventBefore plot home is updated (mutable via setHomeLocation)
PlotBlockInteractEventOn block interaction inside a plot
PlotPermissionChangeEventWhen member permission is toggled
PlotMemberAddEventBefore a member is added
PlotMemberRemoveEventBefore a member is removed (kick, leave, admin)
PlotBanEventBefore a ban record is persisted
PlotUnbanEventBefore a ban is removed
PlotWarpCreateEventBefore a warp is created (mutable name and location)
PlotWarpDeleteEventBefore a warp is deleted
PlotExpirationWarningEventDuring the scheduled expiry reminder pass
PlotExpiredEventBefore automatic deletion of an expired plot

Event Order

Movement and teleports crossing plot boundaries:

  1. PrePlotEntryEvent / PrePlotLeaveEvent
  2. If not cancelled: PlotEntryEvent / PlotLeaveEvent

Cancelling a pre-event cancels the original player move or teleport event. Movement inside the same plot fires only PlotPlayerMoveEvent.

Examples

Find a Plot at a Location

PlotServiceApi plotService = Bukkit.getServicesManager().load(PlotServiceApi.class);

PlotApi plot = plotService.getPlot(player.getLocation());
if (plot != null) {
    player.sendMessage("You are on plot: " + plot.getName());
}

Check Plot Access

PlotApi plot = plotService.getPlot(location);
if (plot != null && !plot.hasAccess(player)) {
    player.sendMessage("You cannot build here!");
}

Listen for Plot Creation

@EventHandler
public void onPlotCreate(PlotCreateEvent event) {
    Player player = event.getPlayer();
    if (!player.hasPermission("myplugin.plots.create")) {
        event.setCancelled(true);
        player.sendMessage("You are not allowed to create plots.");
    }
}

Block Entry to a Plot

@EventHandler
public void onPlotEntry(PrePlotEntryEvent event) {
    PlotApi plot = event.getPlot();
    Player player = event.getPlayer();
    if (plot.isClosed() && !plot.hasAccess(player)) {
        event.setCancelled(true);
    }
}

Modify a Flag Change

@EventHandler
public void onFlagChange(PlotFlagChangeEvent event) {
    if (event.getFlagType() == FlagType.EXPLOSION && event.getNewValue()) {
        event.setNewValue(false);
    }
}

Integration Notes

  • Always null-check lookup results from plot, warp, and profile services.
  • Prefer pre-events (PrePlotEntryEvent, PrePlotLeaveEvent) when you need to block movement.
  • Use mutable event fields (setNewValue, setWarpName, setWarpLocation, setHomeLocation, setTeleportLocation) to alter behavior where supported.
  • PlotTeleportEvent fires after the teleport is executed in current built-in flows — treat it as a notification hook.