Docs

Servicios

Cada sistema se alcanza desde PulsePrisonAPI:

LlamadaServicioCubre
economy()EconomyServiceDinero, tokens, gemas, transferencias y precio de venta real
currencies()CurrencyApiTodas las monedas de currencies.yml y proveedores propios
levels()LevelApiTracks de levels.yml
actions()ActionApiEjecutar acciones y registrar tipos propios
progression()ProgressionServiceRangos, prestigio y rebirth
pickaxe()PickaxeServicePico, encantamientos y registro de encantamientos
skills()SkillServiceÁrbol de habilidades
market()MarketServiceMercado dinámico
mines()MineServiceMinas de rango
privateMines()PrivateMineServiceMinas privadas por paquetes
clans()ClanServiceClanes
pets()PetServiceMascotas
robots()RobotServiceRobots
multipliers()MultiplierServiceMultiplicadores

Monedas: CurrencyApi

java
List<String> ids();
boolean exists(String currency);
double balance(UUID player, String currency);
boolean has(UUID player, String currency, double amount);
boolean give(UUID player, String currency, double amount);
boolean take(UUID player, String currency, double amount);
boolean set(UUID player, String currency, double amount);
String format(String currency, double amount);
void registerProviderType(String type, ExternalCurrencyFactory factory);

Acepta ids y aliases. take devuelve false sin cobrar si no alcanza. format usa el formato configurado por el dueño del servidor.

java
CurrencyApi currencies = prison.currencies();
if (currencies.take(id, "shards", 50)) {
    player.sendMessage("Paid " + currencies.format("shards", 50));
}

registerProviderType está explicado en Extender PulsePrison.

Niveles: LevelApi

java
List<String> tracks();
int level(UUID player, String track);
double experience(UUID player, String track);
double required(UUID player, String track);
void addExperience(Player player, String track, double amount);
void setLevel(UUID player, String track, int level);

addExperience respeta el permiso del track, aplica sus multiplicadores y la estadística level-exp, y ejecuta las recompensas de cada nivel ganado.

Acciones: ActionApi

java
void register(String type, BiConsumer<Player, String> handler);
void run(Player player, List<String> actions, Map<String, String> placeholders);
List<String> types();
java
prison.actions().run(player, List.of(
        "[give] tokens 1000",
        "[title] &6Reward;&7from MyAddon"), Map.of("reward", "vote"));

Ver Acciones y registrar tipos propios.

Economía: EconomyService

java
double getBalance(UUID player);
long getTokens(UUID player);
long getGems(UUID player);
boolean addMoney(Player player, double amount);
boolean removeMoney(Player player, double amount);
boolean addTokens(Player player, long amount);
boolean removeTokens(Player player, long amount);
boolean addGems(Player player, long amount);
boolean removeGems(Player player, long amount);
boolean transferMoney(UUID from, UUID to, double amount);
double getSellPrice(Player player, Material material);
double getEffectiveSellMultiplier(Player player);
boolean hasAccount(OfflinePlayer player);

getSellPrice devuelve lo que el jugador cobraría ahora por un bloque, con mercado y todos los multiplicadores. Usalo en vez de recalcular la cadena. Para otras monedas, usá currencies().

Progresión: ProgressionService

java
String getRank(UUID player);
String getNextRank(UUID player);
double getRankupProgress(UUID player);
double getRankupCost(String rankId);
int getPrestige(UUID player);
int getRebirth(UUID player);
double getRebirthSellBonus(UUID player);
double getNextRebirthMoneyCost(UUID player);
long getNextRebirthTokenCost(UUID player);
boolean isRebirthEnabled();

Pico: PickaxeService

java
boolean isCustomPickaxe(ItemStack item);
int getLevel(UUID player);
long getExperience(UUID player);
long getBlocksMined(UUID player);
Map<String, Integer> getEnchantments(UUID player);
int getEnchantLevel(UUID player, String enchantId);
boolean setEnchantLevel(UUID player, String enchantId, int level);
Collection<BaseEnchant> getRegisteredEnchants();
BaseEnchant getEnchant(String enchantId);
void registerEnchant(BaseEnchant enchant);
void unregisterEnchant(String enchantId);

isCustomPickaxe reconoce el pico por su marca interna, con cualquier skin. setEnchantLevel devuelve false si el encantamiento no existe o el pico no está cargado.

Minas de rango: MineService

java
List<Mine> getMines();
Mine getMine(String id);
Mine getMineAt(Location location);
boolean isInAnyMine(Location location);
void reset(Mine mine);
String getEngineName();

isInAnyMine usa un índice por chunk: se puede llamar por bloque.

Minas privadas: PrivateMineService

java
Optional<PrivateMineView> getMine(UUID owner);
Optional<PrivateMineView> getMineAt(Location location);
boolean hasAccess(UUID owner, UUID player);
CompletableFuture<PrivateMineView> create(UUID owner);
boolean reset(UUID owner);
boolean setType(UUID owner, String typeId);
boolean setStage(UUID owner, int stage);
boolean setExpansions(UUID owner, int expansions);
boolean breakBlocks(UUID owner, Collection<BlockVector> positions, Player cause);
Material getBlockAt(UUID owner, int x, int y, int z);

PrivateMineView es un record inmutable: owner, type, stage, expansions, sizeX/Y/Z, blocksMined, totalBlocks, open, tax, members, bans, visitors y percentMined().

Los bloques de las minas privadas no existen en el mundo del servidor: usá getBlockAt en vez de World#getBlockAt, y breakBlocks para romperlos: marca los bloques como minados y los reenvía a los jugadores que miran. breakBlocks no paga; si tu addon debe pagar al jugador, hacelo con currencies() o economy(). Devuelve false si cause no tiene acceso a la mina.

Árbol de habilidades: SkillService

java
List<SkillNode> getNodes();
SkillNode getNode(String nodeId);
int getNodeLevel(UUID player, String nodeId);
long getAvailablePoints(UUID player);
void grantPoints(UUID player, long amount);
double getBonus(UUID player, SkillEffect effect);       // 0.2 = +20%
double getMultiplier(UUID player, SkillEffect effect);  // 1.2

Mercado: MarketService

java
boolean isEnabled();
List<MarketEntry> getEntries();
MarketEntry getEntry(Material material);
double getCurrentPrice(Material material);
double getBasePrice(Material material);
double getDeviationPercent(Material material);
MarketTrend getTrend(Material material);
void recordSale(Material material, long amount);

Si tu addon vende bloques por su cuenta, llamá a recordSale para que muevan el mercado como una venta normal.

Clanes, mascotas, robots y multiplicadores

java
// ClanService
Clan getClan(UUID player);
Clan getClanByName(String name);
List<Clan> getAllClans();
List<Clan> getTopClansByValue(int limit);
String getRole(UUID clanId, UUID player);
void addValue(UUID player, long amount);

// PetService
List<PetType> getTypes();
PetType getType(String petId);
Collection<PetInstance> getOwned(UUID player);
PetInstance getActive(UUID player);
PetType getActiveType(UUID player);
boolean grant(Player player, String petId);             // un duplicado se convierte en experiencia
boolean setActive(UUID player, String petId);
void addExperience(Player player, String petId, long amount);
double getBonus(UUID player, PetEffect effect);
double getMultiplier(UUID player, PetEffect effect);

// RobotService
List<RobotTier> getTiers();
RobotTier getTier(String tierId);
Robot getRobot(String robotId);
List<Robot> getRobotsOf(UUID player);
int getLimit(Player player);
boolean place(Player player, Location location, String tierId);
boolean pickup(Player player, String robotId);
int collect(Player player, String robotId);

// MultiplierService
double getGlobalMultiplier();
double getPersonalMultiplier(UUID player);
double getPermissionMultiplier(Player player);
double getTotalMultiplier(Player player);
long getGlobalRemainingMillis();
long getPersonalRemainingMillis(UUID player);
void setGlobal(double value, long durationMillis);
void setPersonal(UUID player, double value, long durationMillis);
void clearGlobal();
void clearPersonal(UUID player);

Encantamientos: PulsePrisonEnchantAPI

Una API de consulta de encantamientos más completa, en dev.aeros.pulseprison.enchants.api:

java
PulsePrisonEnchantAPI enchants = EnchantAPIProvider.getAPI();

List<BaseEnchant> available = enchants.getAvailableEnchantments(pickaxeLevel);
List<BaseEnchant> area = enchants.getEnchantmentsByTrigger(EnchantTrigger.PRE_BREAK);
double cost = enchants.calculateUpgradeCost("nuke", 10, 20);
int levels = enchants.getMaxAffordableLevels("nuke", 10, budget);

También tiene getEnchantment, enchantmentExists, getAllEnchantments, getAllEnchantmentIds, getEnchantmentsByType, getEnchantmentsByRarity, registerCustomEnchantment, unregisterCustomEnchantment y getEnchantmentCount.

Services | PulsePrison Core Docs