WikiScriptingAPI

Script API


📜 Script API

Полный справочник по JavaScript API для ScriptsLab. Здесь описаны все доступные объекты и методы для создания скриптов.


Глобальные объекты

При запуске скрипта вам доступны следующие глобальные объекты:

ОбъектОписание
ConsoleЛогирование в консоль сервера
CommandsРегистрация команд
EventsОбработка событий
SchedulerПланирование задач
PlayersУправление игроками
ServerУправление сервером
WorldУправление мирами
ItemsСоздание предметов
StorageСохранение данных
APIРасширенный API

Console - Логирование

Вывод сообщений в консоль сервера.

Методы

// Информационное сообщение
Console.log('Сообщение');

// Предупреждение
Console.warn('Предупреждение');

// Ошибка
Console.error('Ошибка');

// Отладочное сообщение (только при debug: true)
Console.debug('Отладка');

Пример

Console.log('Скрипт загружен');
Console.warn('Внимание: что-то не так');
Console.error('Произошла ошибка: ' + errorMessage);
Console.debug('Переменная x = ' + x);

Commands - Команды

Регистрация и управление командами сервера.

Регистрация команды

Commands.register(name, handler, permission);
ПараметрТипОписание
namestringИмя команды
handlerfunctionФункция-обработчик
permissionstringПраво доступа (опционально)

Обработчик команды

function handler(sender, args) {
    // sender - отправитель команды
    // args - массив аргументов
}

Примеры

Простая команда

Commands.register('hello', function(sender, args) {
    sender.sendMessage('§aПривет, ' + sender.getName() + '!');
});

Команда с правами

Commands.register('heal', function(sender, args) {
    if (!sender.isPlayer()) {
        sender.sendMessage('§cТолько для игроков!');
        return;
    }
    
    var player = sender;
    player.setHealth(player.getMaxHealth());
    player.sendMessage('§aВы исцелены!');
}, 'scriptslab.heal');

Команда с аргументами

Commands.register('warp', function(sender, args) {
    if (args.length === 0) {
        sender.sendMessage('§cИспользование: /warp <название>');
        return;
    }
    
    var warpName = args[0];
    // Логика телепортации
    sender.sendMessage('§aТелепорт на §e' + warpName);
});

Команда с проверкой игрока

Commands.register('fly', function(sender, args) {
    if (!sender.isPlayer()) {
        sender.sendMessage('§cТолько для игроков!');
        return;
    }
    
    var player = sender;
    var canFly = player.getAllowFlight();
    player.setAllowFlight(!canFly);
    
    var msg = !canFly ? '§aПолёт включен!' : '§cПолёт выключен!';
    player.sendMessage(msg);
}, 'scriptslab.fly');

Events - События

Обработка событий Bukkit.

Подписка на событие

Events.on(eventName, handler);
ПараметрТипОписание
eventNamestringИмя события (например, PlayerJoinEvent)
handlerfunctionФункция-обработчик

Обработчик события

function handler(event) {
    // event - объект события Bukkit
}

Доступные события

События игрока

СобытиеОписание
PlayerJoinEventВход на сервер
PlayerQuitEventВыход с сервера
PlayerChatEventЧат (синхронный)
AsyncPlayerChatEventЧат (асинхронный)
PlayerMoveEventДвижение
PlayerInteractEventВзаимодействие
PlayerItemHeldEventСмена предмета в руке
PlayerDeathEventСмерть
PlayerRespawnEventВозрождение

События сущностей

СобытиеОписание
EntityDamageEventПолучение урона
EntityDamageByEntityEventУрон от сущности
EntityDeathEventСмерть сущности
EntityShootBowEventВыстрел из лука

События блоков

СобытиеОписание
BlockPlaceEventУстановка блока
BlockBreakEventРазрушение блока
BlockInteractEventВзаимодействие с блоком

Примеры

Вход игрока

Events.on('PlayerJoinEvent', function(event) {
    var player = event.getPlayer();
    player.sendMessage('§aДобро пожаловать!');
    Console.log(player.getName() + ' зашёл на сервер');
});

Выход игрока

Events.on('PlayerQuitEvent', function(event) {
    var player = event.getPlayer();
    Console.log(player.getName() + ' вышел с сервера');
});

Чат

Events.on('AsyncPlayerChatEvent', function(event) {
    var player = event.getPlayer();
    var message = event.getMessage();
    
    // Фильтр плохих слов
    if (message.toLowerCase().indexOf('badword') !== -1) {
        event.setCancelled(true);
        player.sendMessage('§cТакое говорить нельзя!');
        return;
    }
});

Смерть игрока

Events.on('PlayerDeathEvent', function(event) {
    var entity = event.getEntity();
    var killer = entity.getKiller();
    
    if (killer !== null) {
        Console.log(entity.getName() + ' был убит ' + killer.getName());
    }
});

Урон от игрока

Events.on('EntityDamageByEntityEvent', function(event) {
    var damager = event.getDamager();
    var victim = event.getEntity();
    
    // Проверяем, что атаковал игрок
    var Player = Java.type('org.bukkit.entity.Player');
    if (damager instanceof Player) {
        Console.log(damager.getName() + ' атаковал ' + victim.getName());
    }
});

Scheduler - Планировщик

Планирование отложенных и повторяющихся задач.

Важно: Все методы Bukkit API автоматически выполняются в главном потоке!

Методы

runLater - Выполнить один раз

Scheduler.runLater(handler, delay);
ПараметрТипОписание
handlerfunctionФункция для выполнения
delayintegerЗадержка в тиках (20 тиков = 1 секунда)
// Выполнить через 5 секунд (100 тиков)
Scheduler.runLater(function() {
    player.sendMessage('§aСообщение через 5 секунд!');
}, 100);

runTimer - Повторяющаяся задача

Scheduler.runTimer(handler, delay, period);
ПараметрТипОписание
handlerfunctionФункция для выполнения
delayintegerНачальная задержка
periodintegerИнтервал повторения
// Выполнять каждую минуту (1200 тиков)
Scheduler.runTimer(function() {
    Server.broadcast('§eНе забудьте проголосовать!');
}, 0, 1200);

Примеры

Отложенное сообщение

Scheduler.runLater(function() {
    Server.broadcast('§eСервер перезагрузится через 10 минут!');
}, 12000); // 12000 тиков = 10 минут

Повторяющееся объявление

var messages = [
    '§eНе забудьте проголосовать!',
    '§aПрисоединяйтесь к Discord!',
    '§6Голосуйте за сервер!'
];

var index = 0;

Scheduler.runTimer(function() {
    Server.broadcast(messages[index]);
    index = (index + 1) % messages.length;
}, 0, 6000); // Каждые 5 минут

Таймер с отменой

// Сохраняем ID задачи
var taskId = Scheduler.runTimer(function() {
    // Код
}, 0, 20);

// Отмена задачи
// Scheduler.cancel(taskId);

Players - Игроки

Управление игроками.

Методы

get - Получить игрока

var player = Players.get('NickName');
ПараметрТипОписание
namestringИмя игрока
var player = Players.get('Steve');
if (player !== null) {
    player.sendMessage('§aПривет!');
}

getAll - Все онлайн игроки

var players = Players.getAll();
var players = Players.getAll();
for (var i = 0; i < players.length; i++) {
    players[i].sendMessage('§eОбъявление для всех!');
}

teleport - Телепортация

Players.teleport(player, world, x, y, z);
var player = Players.get('Steve');
var world = org.bukkit.Bukkit.getWorld('world');
Players.teleport(player, world, 0, 100, 0);

giveItem - Дать предмет

Players.giveItem(player, itemId, amount);
var player = Players.get('Steve');
Players.giveItem(player, 'custom_sword', 1);

Server - Сервер

Управление сервером.

Методы

broadcast - Сообщение всем

Server.broadcast(message);
Server.broadcast('§aПривет всем игрокам!');

executeCommand - Выполнить команду

Server.executeCommand(command);
Server.executeCommand('say Сообщение от сервера!');
Server.executeCommand('give Steve DIAMOND 1');

getOnlinePlayers - Онлайн игроки

var players = Server.getOnlinePlayers();
var count = Server.getOnlinePlayers().size();
Console.log('Онлайн: ' + count);

World - Мир

Управление мирами.

Методы

get - Получить мир

var world = World.get('world_name');
var world = World.get('world');

setTime - Установить время

World.setTime(world, time);
var world = World.get('world');
World.setTime(world, 1000); // День (0-24000)

setWeather - Установить погоду

World.setWeather(world, weather);
var world = World.get('world');
World.setWeather(world, 'CLEAR');  // Ясно
World.setWeather(world, 'RAIN');   // Дождь
World.setWeather(world, 'THUNDER'); // Гроза

spawnEntity - Создать сущность

World.spawnEntity(world, x, y, z, entityType);
var world = World.get('world');
World.spawnEntity(world, 0, 100, 0, 'ZOMBIE');
World.spawnEntity(world, 0, 100, 0, 'CREEPER');

Items - Предметы

Создание кастомных предметов.

Методы

create - Создать предмет

var item = Items.create(id, material, displayName);
ПараметрТипОписание
idstringУникальный ID
materialstringМатериал (например, DIAMOND_SWORD)
displayNamestringОтображаемое имя
var sword = Items.create('fire_sword', 'DIAMOND_SWORD', '§cОгненный меч');
sword.setLore(['§7Поджигает врагов']);

setLore - Установить описание

item.setLore(loreArray);
var sword = Items.create('fire_sword', 'DIAMOND_SWORD', '§cОгненный меч');
sword.setLore([
    '§7Поджигает врагов',
    '§cЛегендарный предмет'
]);

addAbility - Добавить способность

item.addAbility(triggerType, handler);
triggerTypeОписание
HITПри ударе
RIGHT_CLICKПравый клик
LEFT_CLICKЛевый клик
var sword = Items.create('fire_sword', 'DIAMOND_SWORD', '§cОгненный меч');
sword.setLore(['§7Поджигает врагов']);

sword.addAbility('HIT', function(player, target, item) {
    target.setFireTicks(100); // Поджечь на 5 секунд
    player.sendMessage('§cВраг горит!');
});

Items.register(sword);

register - Зарегистрировать предмет

Items.register(item);
Items.register(sword);

Storage - Хранилище

Сохранение и загрузка данных.

Методы

save - Сохранить данные

Storage.save(key, value);
Storage.save('player.steve.coins', 100);
Storage.save('player.steve.level', 5);

load - Загрузить данные

Storage.load(key).then(function(value) {
    // value - загруженное значение
});
Storage.load('player.steve.coins').then(function(coins) {
    if (coins === null) {
        coins = 0;
    }
    Console.log('Монет: ' + coins);
});

delete - Удалить данные

Storage.delete(key);
Storage.delete('player.steve.temp');

exists - Проверить существование

Storage.exists(key).then(function(exists) {
    if (exists) {
        Console.log('Данные существуют');
    }
});

API - Расширенный API

Дополнительные методы для удобной работы.

Методы

registerEvent - Регистрация события

API.registerEvent(eventName, handler);
API.registerEvent('PlayerJoinEvent', function(event) {
    var player = event.getPlayer();
    player.sendMessage('§aДобро пожаловать!');
});

broadcast - Сообщение всем

API.broadcast(message);
API.broadcast('§eОбъявление для всех!');

getOnlinePlayers - Получить игроков

var players = API.getOnlinePlayers();
var count = API.getOnlinePlayers().size();

strikeLightningSync - Молния (безопасно)

API.strikeLightningSync(location);
API.strikeLightningSync(player.getLocation());

addPotionEffectSync - Эффект зелья (безопасно)

API.addPotionEffectSync(player, effectType, duration, amplifier, ambient, particles);
var PotionEffectType = Java.type('org.bukkit.potion.PotionEffectType');
API.addPotionEffectSync(player, PotionEffectType.SPEED, 999999, 2, false, false);

removePotionEffectSync - Убрать эффект (безопасно)

API.removePotionEffectSync(player, effectType);
var PotionEffectType = Java.type('org.bukkit.potion.PotionEffectType');
API.removePotionEffectSync(player, PotionEffectType.SPEED);

addAttribute - Атрибут предмета

API.addAttribute(itemMeta, attributeName, modifierName, value, operation, slot);
ПараметрОписани��
itemMetaItemMeta предмета
attributeNameGENERIC_ATTACK_DAMAGE, GENERIC_ATTACK_SPEED и т.д.
modifierNameУникальное имя модификатора
valueЗначение
operationADD_NUMBER, MULTIPLY_SCALAR_1
slotHAND, FEET, LEGS, etc.
var Attribute = Java.type('org.bukkit.attribute.Attribute');
var AttributeModifier = Java.type('org.bukkit.attribute.AttributeModifier');
var UUID = Java.type('java.util.UUID');

API.addAttribute(meta, 'GENERIC_ATTACK_DAMAGE', 'damage_boost', 10.0, 'ADD_NUMBER', 'HAND');

log - Логирование

API.log(message);
API.log('Скрипт загружен');

Работа с Java

ScriptsLab позволяет использовать Java классы напрямую.

Импорт классов

var Material = Java.type('org.bukkit.Material');
var ItemStack = Java.type('org.bukkit.inventory.ItemStack');
var Enchantment = Java.type('org.bukkit.enchantments.Enchantment');
var ItemFlag = Java.type('org.bukkit.inventory.ItemFlag');
var Attribute = Java.type('org.bukkit.attribute.Attribute');
var AttributeModifier = Java.type('org.bukkit.attribute.AttributeModifier');
var EquipmentSlot = Java.type('org.bukkit.inventory.EquipmentSlot');
var UUID = Java.type('java.util.UUID');
var ArrayList = Java.type('java.util.ArrayList');
var PotionEffect = Java.type('org.bukkit.potion.PotionEffect');
var PotionEffectType = Java.type('org.bukkit.potion.PotionEffectType');

Создание объектов

var item = new ItemStack(Material.DIAMOND_SWORD);
item.setAmount(64);

var list = new ArrayList();
list.add('элемент');

Использование методов

item.setAmount(64);
list.add('элемент');
var size = list.size();

instanceof - Проверка типа

var Player = Java.type('org.bukkit.entity.Player');
if (entity instanceof Player) {
    // Это игрок
}

Работа с отправителем команды

Типы отправителя

МетодОписание
sender.isPlayer()Проверить, является ли игроком
sender.isOp()Проверить, является ли OP

Примеры

Commands.register('test', function(sender, args) {
    // Проверка игрок ли
    if (!sender.isPlayer()) {
        sender.sendMessage('§cТолько для игроков!');
        return;
    }
    
    var player = sender;
    player.sendMessage('§aПривет, игрок!');
});

Получение игрока из отправителя

var player = sender; // Если проверено isPlayer()

Обработка ошибок

try-catch

try {
    // Ваш код
    var result = dangerousOperation();
} catch (error) {
    Console.error('Ошибка: ' + error);
}

Проверка на null

var player = Players.get('Steve');
if (player !== null) {
    // Безопасно использовать
} else {
    Console.warn('Игрок не найден');
}

Типы данных

JavaScript → Java

JavaScriptJava
numberint, double, float
stringString
booleanboolean
arrayArrayList, List
functionConsumer, Function
objectObject

Java → JavaScript

JavaJavaScript
intnumber
doublenumber
booleanboolean
Stringstring
Listarray
Mapobject
Objectobject

Ограничения

  • Таймаут: 5 секунд по умолчанию (настраивается)
  • Память: 128MB на скрипт (настраивается)
  • Песочница: Ограниченный доступ к Java API (при sandbox: true)
  • Потоки: GraalVM JS однопоточный

Следующие шаги

ШагОписание
ПримерыГотовые примеры скриптов
МодулиСистема модулей
БезопасностьНастройка безопасности

📜 Script API (English)

Complete reference for ScriptsLab JavaScript API. All available objects and methods for creating scripts are described here.


Global Objects

When a script starts, the following global objects are available:

ObjectDescription
ConsoleLog to server console
CommandsRegister commands
EventsHandle events
SchedulerTask scheduling
PlayersPlayer management
ServerServer management
WorldWorld management
ItemsCreate items
StorageSave data
APIExtended API

Console - Logging

Output messages to server console.

Methods

// Info message
Console.log('Message');

// Warning
Console.warn('Warning');

// Error
Console.error('Error');

// Debug message (only when debug: true)
Console.debug('Debug');

Example

Console.log('Script loaded');
Console.warn('Attention: something is wrong');
Console.error('An error occurred: ' + errorMessage);
Console.debug('Variable x = ' + x);

Commands - Commands

Register and manage server commands.

Register Command

Commands.register(name, handler, permission);
ParameterTypeDescription
namestringCommand name
handlerfunctionHandler function
permissionstringAccess permission (optional)

Command Handler

function handler(sender, args) {
    // sender - command sender
    // args - argument array
}

Examples

Simple Command

Commands.register('hello', function(sender, args) {
    sender.sendMessage('§aHello, ' + sender.getName() + '!');
});

Command with Permissions

Commands.register('heal', function(sender, args) {
    if (!sender.isPlayer()) {
        sender.sendMessage('§cOnly for players!');
        return;
    }
    
    var player = sender;
    player.setHealth(player.getMaxHealth());
    player.sendMessage('§aYou have been healed!');
}, 'scriptslab.heal');

Command with Arguments

Commands.register('warp', function(sender, args) {
    if (args.length === 0) {
        sender.sendMessage('§cUsage: /warp <name>');
        return;
    }
    
    var warpName = args[0];
    // Teleportation logic
    sender.sendMessage('§aTeleporting to §e' + warpName);
});

Command with Player Check

Commands.register('fly', function(sender, args) {
    if (!sender.isPlayer()) {
        sender.sendMessage('§cOnly for players!');
        return;
    }
    
    var player = sender;
    var canFly = player.getAllowFlight();
    player.setAllowFlight(!canFly);
    
    var msg = !canFly ? '§aFlight enabled!' : '§cFlight disabled!';
    player.sendMessage(msg);
}, 'scriptslab.fly');

Events - Events

Handle Bukkit events.

Subscribe to Event

Events.on(eventName, handler);
ParameterTypeDescription
eventNamestringEvent name (e.g., PlayerJoinEvent)
handlerfunctionHandler function

Event Handler

function handler(event) {
    // event - Bukkit event object
}

Available Events

Player Events

EventDescription
PlayerJoinEventPlayer join
PlayerQuitEventPlayer quit
PlayerChatEventChat (sync)
AsyncPlayerChatEventChat (async)
PlayerMoveEventMovement
PlayerInteractEventInteraction
PlayerItemHeldEventItem held change
PlayerDeathEventDeath
PlayerRespawnEventRespawn

Entity Events

EventDescription
EntityDamageEventTaking damage
EntityDamageByEntityEventDamage by entity
EntityDeathEventEntity death
EntityShootBowEventBow shoot

Block Events

EventDescription
BlockPlaceEventBlock place
BlockBreakEventBlock break
BlockInteractEventBlock interaction

Examples

Player Join

Events.on('PlayerJoinEvent', function(event) {
    var player = event.getPlayer();
    player.sendMessage('§aWelcome!');
    Console.log(player.getName() + ' joined the server');
});

Player Quit

Events.on('PlayerQuitEvent', function(event) {
    var player = event.getPlayer();
    Console.log(player.getName() + ' left the server');
});

Chat

Events.on('AsyncPlayerChatEvent', function(event) {
    var player = event.getPlayer();
    var message = event.getMessage();
    
    // Bad word filter
    if (message.toLowerCase().indexOf('badword') !== -1) {
        event.setCancelled(true);
        player.sendMessage('§cYou can't say that!');
        return;
    }
});

Player Death

Events.on('PlayerDeathEvent', function(event) {
    var entity = event.getEntity();
    var killer = entity.getKiller();
    
    if (killer !== null) {
        Console.log(entity.getName() + ' was killed by ' + killer.getName());
    }
});

Player Damage

Events.on('EntityDamageByEntityEvent', function(event) {
    var damager = event.getDamager();
    var victim = event.getEntity();
    
    // Check if attacker is player
    var Player = Java.type('org.bukkit.entity.Player');
    if (damager instanceof Player) {
        Console.log(damager.getName() + ' attacked ' + victim.getName());
    }
});

Scheduler - Task Scheduler

Schedule delayed and repeating tasks.

Important: All Bukkit API methods are automatically executed on the main thread!

Methods

runLater - Execute Once

Scheduler.runLater(handler, delay);
ParameterTypeDescription
handlerfunctionFunction to execute
delayintegerDelay in ticks (20 ticks = 1 second)
// Execute after 5 seconds (100 ticks)
Scheduler.runLater(function() {
    player.sendMessage('§aMessage after 5 seconds!');
}, 100);

runTimer - Repeating Task

Scheduler.runTimer(handler, delay, period);
ParameterTypeDescription
handlerfunctionFunction to execute
delayintegerInitial delay
periodintegerRepeat interval
// Execute every minute (1200 ticks)
Scheduler.runTimer(function() {
    Server.broadcast('§eDon\'t forget to vote!');
}, 0, 1200);

Examples

Delayed Message

Scheduler.runLater(function() {
    Server.broadcast('§eServer will restart in 10 minutes!');
}, 12000); // 12000 ticks = 10 minutes

Repeating Announcement

var messages = [
    '§eDon\'t forget to vote!',
    '§aJoin our Discord!',
    '§6Vote for the server!'
];

var index = 0;

Scheduler.runTimer(function() {
    Server.broadcast(messages[index]);
    index = (index + 1) % messages.length;
}, 0, 6000); // Every 5 minutes

Timer with Cancel

// Save task ID
var taskId = Scheduler.runTimer(function() {
    // Code
}, 0, 20);

// Cancel task
// Scheduler.cancel(taskId);

Players - Players

Player management.

Methods

get - Get Player

var player = Players.get('NickName');
ParameterTypeDescription
namestringPlayer name
var player = Players.get('Steve');
if (player !== null) {
    player.sendMessage('§aHello!');
}

getAll - All Online Players

var players = Players.getAll();
var players = Players.getAll();
for (var i = 0; i < players.length; i++) {
    players[i].sendMessage('§eAnnouncement for everyone!');
}

teleport - Teleport

Players.teleport(player, world, x, y, z);
var player = Players.get('Steve');
var world = org.bukkit.Bukkit.getWorld('world');
Players.teleport(player, world, 0, 100, 0);

giveItem - Give Item

Players.giveItem(player, itemId, amount);
var player = Players.get('Steve');
Players.giveItem(player, 'custom_sword', 1);

Server - Server

Server management.

Methods

broadcast - Message Everyone

Server.broadcast(message);
Server.broadcast('§aHello to all players!');

executeCommand - Execute Command

Server.executeCommand(command);
Server.executeCommand('say Message from server!');
Server.executeCommand('give Steve DIAMOND 1');

getOnlinePlayers - Online Players

var players = Server.getOnlinePlayers();
var count = Server.getOnlinePlayers().size();
Console.log('Online: ' + count);

World - World

World management.

Methods

get - Get World

var world = World.get('world_name');
var world = World.get('world');

setTime - Set Time

World.setTime(world, time);
var world = World.get('world');
World.setTime(world, 1000); // Day (0-24000)

setWeather - Set Weather

World.setWeather(world, weather);
var world = World.get('world');
World.setWeather(world, 'CLEAR');  // Clear
World.setWeather(world, 'RAIN');   // Rain
World.setWeather(world, 'THUNDER'); // Thunder

spawnEntity - Spawn Entity

World.spawnEntity(world, x, y, z, entityType);
var world = World.get('world');
World.spawnEntity(world, 0, 100, 0, 'ZOMBIE');
World.spawnEntity(world, 0, 100, 0, 'CREEPER');

Items - Items

Create custom items.

Methods

create - Create Item

var item = Items.create(id, material, displayName);
ParameterTypeDescription
idstringUnique ID
materialstringMaterial (e.g., DIAMOND_SWORD)
displayNamestringDisplay name
var sword = Items.create('fire_sword', 'DIAMOND_SWORD', '§cFire Sword');
sword.setLore(['§7Ignites enemies']);

setLore - Set Description

item.setLore(loreArray);
var sword = Items.create('fire_sword', 'DIAMOND_SWORD', '§cFire Sword');
sword.setLore([
    '§7Ignites enemies',
    '§cLegendary item'
]);

addAbility - Add Ability

item.addAbility(triggerType, handler);
triggerTypeDescription
HITOn hit
RIGHT_CLICKRight click
LEFT_CLICKLeft click
var sword = Items.create('fire_sword', 'DIAMOND_SWORD', '§cFire Sword');
sword.setLore(['§7Ignites enemies']);

sword.addAbility('HIT', function(player, target, item) {
    target.setFireTicks(100); // Ignite for 5 seconds
    player.sendMessage('§cEnemy is burning!');
});

Items.register(sword);

register - Register Item

Items.register(item);
Items.register(sword);

Storage - Storage

Save and load data.

Methods

save - Save Data

Storage.save(key, value);
Storage.save('player.steve.coins', 100);
Storage.save('player.steve.level', 5);

load - Load Data

Storage.load(key).then(function(value) {
    // value - loaded value
});
Storage.load('player.steve.coins').then(function(coins) {
    if (coins === null) {
        coins = 0;
    }
    Console.log('Coins: ' + coins);
});

delete - Delete Data

Storage.delete(key);
Storage.delete('player.steve.temp');

exists - Check Existence

Storage.exists(key).then(function(exists) {
    if (exists) {
        Console.log('Data exists');
    }
});

API - Extended API

Additional methods for convenient work.

Methods

registerEvent - Register Event

API.registerEvent(eventName, handler);
API.registerEvent('PlayerJoinEvent', function(event) {
    var player = event.getPlayer();
    player.sendMessage('§aWelcome!');
});

broadcast - Message Everyone

API.broadcast(message);
API.broadcast('§eAnnouncement for everyone!');

getOnlinePlayers - Get Players

var players = API.getOnlinePlayers();
var count = API.getOnlinePlayers().size();

strikeLightningSync - Lightning (Safe)

API.strikeLightningSync(location);
API.strikeLightningSync(player.getLocation());

addPotionEffectSync - Potion Effect (Safe)

API.addPotionEffectSync(player, effectType, duration, amplifier, ambient, particles);
var PotionEffectType = Java.type('org.bukkit.potion.PotionEffectType');
API.addPotionEffectSync(player, PotionEffectType.SPEED, 999999, 2, false, false);

removePotionEffectSync - Remove Effect (Safe)

API.removePotionEffectSync(player, effectType);
var PotionEffectType = Java.type('org.bukkit.potion.PotionEffectType');
API.removePotionEffectSync(player, PotionEffectType.SPEED);

addAttribute - Item Attribute

API.addAttribute(itemMeta, attributeName, modifierName, value, operation, slot);
ParameterDescription
itemMetaItemMeta of item
attributeNameGENERIC_ATTACK_DAMAGE, GENERIC_ATTACK_SPEED, etc.
modifierNameUnique modifier name
valueValue
operationADD_NUMBER, MULTIPLY_SCALAR_1
slotHAND, FEET, LEGS, etc.
var Attribute = Java.type('org.bukkit.attribute.Attribute');
var AttributeModifier = Java.type('org.bukkit.attribute.AttributeModifier');
var UUID = Java.type('java.util.UUID');

API.addAttribute(meta, 'GENERIC_ATTACK_DAMAGE', 'damage_boost', 10.0, 'ADD_NUMBER', 'HAND');

log - Logging

API.log(message);
API.log('Script loaded');

Working with Java

ScriptsLab allows using Java classes directly.

Import Classes

var Material = Java.type('org.bukkit.Material');
var ItemStack = Java.type('org.bukkit.inventory.ItemStack');
var Enchantment = Java.type('org.bukkit.enchantments.Enchantment');
var ItemFlag = Java.type('org.bukkit.inventory.ItemFlag');
var Attribute = Java.type('org.bukkit.attribute.Attribute');
var AttributeModifier = Java.type('org.bukkit.attribute.AttributeModifier');
var EquipmentSlot = Java.type('org.bukkit.inventory.EquipmentSlot');
var UUID = Java.type('java.util.UUID');
var ArrayList = Java.type('java.util.ArrayList');
var PotionEffect = Java.type('org.bukkit.potion.PotionEffect');
var PotionEffectType = Java.type('org.bukkit.potion.PotionEffectType');

Creating Objects

var item = new ItemStack(Material.DIAMOND_SWORD);
item.setAmount(64);

var list = new ArrayList();
list.add('element');

Using Methods

item.setAmount(64);
list.add('element');
var size = list.size();

instanceof - Type Check

var Player = Java.type('org.bukkit.entity.Player');
if (entity instanceof Player) {
    // This is a player
}

Working with Command Sender

Sender Types

MethodDescription
sender.isPlayer()Check if sender is player
sender.isOp()Check if sender is OP

Examples

Commands.register('test', function(sender, args) {
    // Check if player
    if (!sender.isPlayer()) {
        sender.sendMessage('§cOnly for players!');
        return;
    }
    
    var player = sender;
    player.sendMessage('§aHello, player!');
});

Getting Player from Sender

var player = sender; // If checked with isPlayer()

Error Handling

try-catch

try {
    // Your code
    var result = dangerousOperation();
} catch (error) {
    Console.error('Error: ' + error);
}

Null Check

var player = Players.get('Steve');
if (player !== null) {
    // Safe to use
} else {
    Console.warn('Player not found');
}

Data Types

JavaScript → Java

JavaScriptJava
numberint, double, float
stringString
booleanboolean
arrayArrayList, List
functionConsumer, Function
objectObject

Java → JavaScript

JavaJavaScript
intnumber
doublenumber
booleanboolean
Stringstring
Listarray
Mapobject
Objectobject

Limitations

  • Timeout: 5 seconds by default (configurable)
  • Memory: 128MB per script (configurable)
  • Sandbox: Limited Java API access (when sandbox: true)
  • Threads: GraalVM JS is single-threaded

Next Steps

StepDescription
ExamplesReady-made script examples
ModulesModule system
SecuritySecurity setup

Last updated Apr 29, 2026, 6:40 AM
Edit