Полный справочник событий
Эта страница документирует все события, которые можно обрабатывать в файлах .event.ss.
Файлы .mixin.ss работают отдельно: их хук-обработчики вызываются до действия и могут отменять чат, сон, ломание и другие действия через return false.
Цикл жизни событий
- Запуск сервера → событие
load - Подключение игрока → событие
player_connect - Полное присоединение → событие
player_join - Действия игрока →
player_chat,block_place,block_breakи т.д. - Смерть игрока → события
player_death+player_dead - Сон игрока → события
player_sleep,player_sleep_attempt - Возрождение → событие
player_respawn
События сервера
load → (нет параметров)
Срабатывает один раз при запуске сервера и загрузке всех скриптов.
Применение: Инициализация, загрузка данных.
on load:
log "Сервер стартует..."
set_global("startup_time", sec(0))
log "Инит завершён"
end
События подключения игрока
player_connect(player) → объект
Срабатывает когда инициализируется подключение игрока (до полного присоединения).
Параметры:
player: Объект игрока
Поля объекта игрока:
name— имя учётной записиuuid— UUID игрокаtype— тип сущности (всегда “minecraft:player”)x,y,z— координаты позицииpos— форматированная позиция “X Y Z”dimension— ID измерения (например “minecraft:overworld”)health— текущее здоровье (0-20)gamemode— режим игры (“survival”, “creative” и т.д.)tags— список команд-теговnbt— NBT данные строкой
Поля доступны как у объекта события, так и у результата get_target() / get_targets() для игроков и других сущностей.
on player_connect(player):
log "Подключение: " + player.name
end
player_join(player) → объект
Срабатывает когда игрок полностью присоединился к серверу.
Параметры:
player: Объект игрока (см. выше)
Применение: Приветственные сообщения, выдача прав, загрузка данных.
on player_join(player):
log "Добро пожаловать " + player.name
# Дать тег если первый раз
if not has_tag(player.name, "seen_before"):
tag_add(player.name, "seen_before")
tellraw(player.name, "Добро пожаловать на сервер!")
end
end
player_respawn(player, alive) → объект, булево
Срабатывает когда игрок возрождается после смерти.
Параметры:
player: Объект игрокаalive:true= возрождение,false= загрузка данных
on player_respawn(player, alive):
log player.name + " возродился"
effect_give(player.name, "minecraft:resistance", 5, 0, false)
end
События чата
player_chat(player, message) → объект, строка
Срабатывает когда игрок отправляет сообщение в чат.
Параметры:
player: Объект игрокаmessage: Текст сообщения
Применение: Логирование чата, фильтры, парсинг команд.
on player_chat(player, message):
log "[" + player.name + "] " + message
# Логируем в файл
file_mkdirs("sscripts/logs")
file_append("sscripts/logs/chat.log", player.name + ": " + message + "\n")
end
События блоков
block_interact(player, block) → объект, объект
Срабатывает когда игрок успешно кликает правой кнопкой по блоку.
Включает: Открытие дверей, нажатие кнопок, рычаги и т.д. (любое взаимодействие).
Параметры:
player: Объект игрокаblock: Объект блока (см. ниже)
Поля объекта блока:
id— ID блока (например “minecraft:diamond_ore”)x,y,z— координаты блокаpos— форматированная позиция “X Y Z”dimension— ID измерения
on block_interact(player, block):
log player.name + " взаимодействовал с " + block.id + " на " + block.pos
# Пример: логируем все взаимодействия с дверями
if contains(block.id, "door"):
log "Взаимодействие с дверью на " + block.pos
end
end
block_place(player, block) → объект, объект
Срабатывает когда игрок теоретически ставит новый блок.
Это семантически отличается от block_interact:
block_interactсрабатывает для любого принятого правого клика (двери, рычаги и т.д.)block_placeсрабатывает ТОЛЬКО когда состояние блока изменилось (новый блок поставлен)
Параметры:
player: Объект игрокаblock: Объект блока (вновь поставленный блок)
Применение: Логирование строительства, защита от грифа, отслеживание построек.
on block_place(player, block):
log player.name + " поставил " + block.id + " на " + block.pos
# Запретить обсидиан
if block.id == "minecraft:obsidian":
if not has_tag(player.name, "builder"):
run "setblock " + block.x + " " + block.y + " " + block.z + " air"
tellraw(player.name, "Вы не можете ставить обсидиан здесь")
end
end
end
block_break(player, block) → объект, объект
Срабатывает когда игрок ламает блок.
Параметры:
player: Объект игрокаblock: Объект блока (перед уничтожением)
Применение: Ограничения добычи, отслеживание руд, защита от грифа.
on block_break(player, block):
log player.name + " ломал " + block.id + " на " + block.pos
# Пример: логируем весь добытый алмаз
if block.id == "minecraft:diamond_ore":
set_global("total_diamonds_mined", num(get_global("total_diamonds_mined")) + 1)
end
end
События смерти игрока
player_death(player, location) → объект, строка
Срабатывает когда игрок умирает (включая задержку возрождения).
Параметры:
player: Объект игрока (в месте смерти)location: Форматированная строка позиции “X Y Z”
on player_death(player, location):
log player.name + " умер на " + location
end
player_dead(player, location) → объект, строка
Альтернативное имя для события player_death (оба срабатывают вместе для совместимости).
on player_dead(player, location):
# Это тоже срабатывает при player_death
end
События сна
player_sleep_attempt(player, bed_location) → объект, строка
Срабатывает когда игрок пытается спать (до успеха/неудачи).
Параметры:
player: Объект игрокаbed_location: Форматированная позиция “X Y Z”
on player_sleep_attempt(player, bed_location):
log player.name + " пытается спать"
end
player_sleep(player, bed_location) → объект, строка
Срабатывает когда игрок успешно ложится спать.
Параметры:
player: Объект игрокаbed_location: Форматированная позиция “X Y Z”
on player_sleep(player, bed_location):
log player.name + " лёг спать на " + bed_location
# Выдаём достижение за сон
tag_add(player.name, "has_slept")
end
Паттерны обработки событий
Паттерн 1: Условная логика
on player_chat(player, message):
if contains(message, "spam"):
log "Заблокирован спам от " + player.name
end
end
Паттерн 2: Фильтрация по тегам
on player_chat(player, message):
if has_tag(player.name, "muted"):
log "Молчаливый игрок пытался писать: " + player.name
end
end
Паттерн 3: Условная защита блоков
on block_break(player, block):
# Защищаем определённые блоки для не-админов
if block.id == "minecraft:obsidian" and not has_tag(player.name, "admin"):
run "setblock " + block.x + " " + block.y + " " + block.z + " " + block.id
tellraw(player.name, "Вы не можете ломать обсидиан!")
end
end
Паттерн 4: Отложенное действие с wait
on player_join(player):
log player.name + " присоединился"
wait send_welcome, player.name
end
func send_welcome(name):
sleep 20 # 1 секунда задержки
tellraw(name, "Добро пожаловать на сервер!")
end
Паттерн 5: Отслеживание глобального состояния
on player_join(player):
set_global("last_joined", player.name)
end
on player_chat(player, message):
if message == "who_was_last":
last = get_global("last_joined")
log "Последний игрок: " + str(last)
end
end
Порядок обработки событий
- Событие срабатывает на сервере/миксине
- Все обработчики регистрируются в очередь
- Каждый обработчик получает свой процесс
- Обработчики выполняются независимо (не обязательно по порядку)
- Ошибки в одном не влияют на других
Важные замечания
- Обработчики асинхронные: Используйте
waitдля отложенного выполнения - Порядок не гарантирован: Несколько обработчиков могут выполняться в любом порядке
- Потокобезопасно: Миксин-хуки потокобезопасны
- Объекты игроков неизменяемы: Не изменяйте объект игрока (только чтение)
- Позиции блоков: Используйте
get_block()для получения текущего состояния
Тестирование событий
Создайте test_events.event.ss:
on load:
log "=== SScript Event System Ready ==="
end
on player_join(player):
log "[JOIN] " + player.name + " (" + player.uuid + ")"
end
on player_chat(player, message):
log "[CHAT] " + player.name + ": " + message
end
on block_break(player, block):
log "[BREAK] " + player.name + " ломал " + block.id + " на " + block.pos
end
on block_place(player, block):
log "[PLACE] " + player.name + " ставил " + block.id + " на " + block.pos
end
on player_death(player, location):
log "[DEATH] " + player.name + " умер на " + location
end