Servicios
Cada sistema se alcanza desde PulsePrisonAPI:
| Llamada | Servicio | Cubre |
|---|---|---|
economy() | EconomyService | Dinero, tokens, gemas, transferencias y precio de venta real |
currencies() | CurrencyApi | Todas las monedas de currencies.yml y proveedores propios |
levels() | LevelApi | Tracks de levels.yml |
actions() | ActionApi | Ejecutar acciones y registrar tipos propios |
progression() | ProgressionService | Rangos, prestigio y rebirth |
pickaxe() | PickaxeService | Pico, encantamientos y registro de encantamientos |
skills() | SkillService | Árbol de habilidades |
market() | MarketService | Mercado dinámico |
mines() | MineService | Minas de rango |
privateMines() | PrivateMineService | Minas privadas por paquetes |
clans() | ClanService | Clanes |
pets() | PetService | Mascotas |
robots() | RobotService | Robots |
multipliers() | MultiplierService | Multiplicadores |
Monedas: CurrencyApi
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.
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
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
void register(String type, BiConsumer<Player, String> handler);
void run(Player player, List<String> actions, Map<String, String> placeholders);
List<String> types();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
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
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
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
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
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
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.2Mercado: MarketService
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
// 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:
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.