Перейти к основному содержимому

API Плейсхолдеров

Два способа работы с плейсхолдерами.

1. Обработка плейсхолдеров

Используется для обработки плейсхолдеров в строке.

Методы

// Стандартные плейсхолдеры: %player_name%
placeholder.setPlaceholders(player, "текст");

// Плейсхолдеры в фигурных скобках: {player_name}
placeholder.setBracketPlaceholders(player, "текст");

Примеры

const PlayerJoinEvent = Java.type('org.bukkit.event.player.PlayerJoinEvent');

events.on(PlayerJoinEvent, (event) => {
const player = event.getPlayer();

// Простой плейсхолдер
const msg1 = placeholder.setPlaceholders(player, "Привет, %player_name%!");
player.sendMessage(msg1);

// С несколькими плейсхолдерами
const msg2 = placeholder.setPlaceholders(player,
"§6Привет, %player_name%! Баланс: %vault_eco_balance%$"
);
player.sendMessage(msg2);

// Фигурные скобки
const msg3 = placeholder.setBracketPlaceholders(player,
"Игрок: {player_name}, Здоровье: {player_health}"
);
player.sendMessage(msg3);
});

2. Кастомные плейсхолдеры

Регистрация своих плейсхолдеров для использования в других плагинах (DeluxeMenus, etc).

Базовое использование

papi.registerPlaceholder("префикс", (player, параметры) => {
// Ваш код
return "значение";
});

Синтаксис плейсхолдера

%easyscript_<префикс>%        # без параметров
%easyscript_<префикс>_<параметры>% # с параметрами
примечание

Оба варианта работают:

  • %easyscript_deaths% - без подчёркивания
  • %easyscript_deaths_% - с подчёркиванием

Примеры

Простой плейсхолдер

// Регистрация: %easyscript_deaths%
papi.registerPlaceholder("deaths", (player, params) => {
if (!player.isOnline()) return "0";

const p = player.getPlayer();
return p.getStatistic(org.bukkit.Statistic.DEATHS).toString();
});

Плейсхолдер с параметрами

// Регистрация: %easyscript_stat_kills% или %easyscript_stat_deaths%
papi.registerPlaceholder("stat", (player, params) => {
if (!player.isOnline()) return "0";

const p = player.getPlayer();
const stat = org.bukkit.Statistic;

switch(params) {
case "kills": return p.getStatistic(stat.PLAYER_KILLS).toString();
case "deaths": return p.getStatistic(stat.DEATHS).toString();
case "level": return p.getLevel().toString();
default: return "0";
}
});

Прогрессивные плейсхолдеры (для GUI)

// Хранение данных игроков
let playerData = {};

function getPlayerLevel(uuid) {
return playerData[uuid]?.level || 0;
}

// Регистрация: %easyscript_reached_1%, %easyscript_reached_2%, etc
papi.registerPlaceholder("reached", (player, level) => {
const uuid = player.getUniqueId().toString();
const playerLevel = getPlayerLevel(uuid);
return playerLevel >= parseInt(level) ? "yes" : "no";
});

// Цвет для GUI: %easyscript_color_1%
papi.registerPlaceholder("color", (player, level) => {
const uuid = player.getUniqueId().toString();
const playerLevel = getPlayerLevel(uuid);
return playerLevel >= parseInt(level) ? "LIME" : "GRAY";
});

Плейсхолдер с данными игрока

const File = Java.type('java.io.File');
const Files = Java.type('java.nio.file.Files');

const DATA_FILE = new File(plugin.getDataFolder(), "stats.json");
let stats = {};

// Загрузка
if (DATA_FILE.exists()) {
stats = JSON.parse(Files.readString(DATA_FILE.toPath()));
}

// Плейсхолдер: %easyscript_wins%
papi.registerPlaceholder("wins", (player, params) => {
const uuid = player.getUniqueId().toString();
return (stats[uuid]?.wins || 0).toString();
});

Использование в GUI плагинах

DeluxeMenus

# placeholder_format: none
item_views:
main_menu:
items:
stats:
material: PLAYER_HEAD
display_name: "Победы: %easyscript_wins%"
lore:
- "Уровень: %easyscript_level%"

ServerSelectorPlus

# placeholder_format: none
lines:
- "%easyscript_online% игроков онлайн"

Полезные примеры

Плейсхолдер времени игры

const Map = Java.type('java.util.HashMap');
let playTimes = new Map();

papi.registerPlaceholder("playtime", (player, params) => {
const uuid = player.getUniqueId().toString();
const ms = playTimes.get(uuid) || 0;
const hours = Math.floor(ms / 3600000);
const minutes = Math.floor((ms % 3600000) / 60000);
return hours + "ч " + minutes + "м";
});

// Обновление времени игры
events.on(org.bukkit.event.player.PlayerQuitEvent, (event) => {
const uuid = event.getPlayer().getUniqueId().toString();
const current = playTimes.get(uuid) || 0;
playTimes.put(uuid, current + event.getPlayer().getStatistic(org.bukkit.Statistic.PLAY_ONE_TICK));
});