События
Скрипт живёт на колбэках: клиент зовёт их сам, когда наступает нужный момент — кадр, тик, удар, нажатая клавиша.
Подписка
events.on("attack", function(e)
client.notify("ударил " .. e.name)
end)Отписаться можно той же функцией через events.off(name, fn) — для этого её придётся сохранить в переменную.
Кадр и тик
render2dкаждый кадр, 2D поверх игрыrender3dкаждый кадр, внутри мираrender_world_postпосле отрисовки мираtick20 раз в секундуpost_tickпосле движения игрокаДанные копят на tick, рисуют на render2d. Это важно для графиков и таймеров: кадров бывает и 30, и 300 в секунду, а тиков всегда двадцать.
Ввод
keykey, key_name, action, pressed, released, repeatedmousebutton, action, pressed, released, x, ymove_keysforward, backward, left, right, jump, sneak, sprintmove_inputforward, strafe и запись через set_forward / set_strafejumpпрыжок, поле preСобытия ввода не приходят, пока открыт любой экран — так устроена обработка биндов в клиенте. Если клавиши нужны в своём GUI, опрашивайте client.key_down(code).
Игра
attackудар по сущности: entity, namespawn_entityпоявилась сущностьtotem_popлопнул тотемchat_sendотправка сообщения: message, commandpacket_send / packet_receiveимя класса пакета в packetworld_changeсмена мираscreen_openоткрылся или закрылся экранОтмена
У объекта события есть cancel() и is_cancelled(). Отменяются те события, которые клиент отправляет дальше — например сообщение в чат.
events.on("chat_send", function(e)
if e.message == "стоп" then
e.cancel()
end
end)Смена мира
Всё накопленное состояние — счётчики, кэши, сэмплы графиков — чистят на world_change. Иначе после перезахода скрипт покажет данные из прошлой игры.
local combo = 0
events.on("attack", function()
combo = combo + 1
end)
events.on("world_change", function()
combo = 0
end)