Code Patterns

Copy-paste examples for common plugin tasks. Commands, events, ECS, GUI, and more.

← Back to Patterns
interaction

Configurable Item Interactions

Per-player configurable actions for custom item interactions

Example Code

java
public class AdminStickCustomConfig extends BlockingDiskFile {
    public HashMap<UUID, Config> config = new HashMap<>();

    public AdminStickCustomConfig() {
        super(Path.of("MyPlugin/StickConfig.json"));
    }

    public Config getPlayer(UUID uuid) {
        if (!this.config.containsKey(uuid)) {
            addPlayer(uuid, new Config("", "default1", "default2", "", "", ""));
        }
        return this.config.get(uuid);
    }

    public void addPlayer(UUID uuid, Config config) {
        this.fileLock.writeLock().lock();
        this.config.put(uuid, config);
        this.fileLock.writeLock().unlock();
        this.syncSave();
    }

    public static class Config {
        private String ability1, ability2, ability3;
        private String primary, secondary, pick;

        // Constructor, getters, setters...
    }
}

// In interaction handler:
var config = plugin.getStickConfig().getPlayer(playerRef.getUuid());
String actionId = switch (interactionType) {
    case Primary -> config.primary();
    case Secondary -> config.secondary();
    case Ability1 -> config.ability1();
    case Ability2 -> config.ability2();
    case Ability3 -> config.ability3();
    case Pick -> config.pick();
};
if (!actionId.isEmpty()) {
    var entry = Registry.getInstance().getEntry(actionId);
    if (entry != null) {
        player.getPageManager().openCustomPage(ref, store, entry.guiSupplier().apply(playerRef));
    }
}