Исходник Информация Гайд MoonScript | Пишем красивый код с расширенными возможностями

ufdhbi

Известный
Автор темы
Проверенный
1,456
861
Содержание

Вступление

Установка

Пример настройки редактора

Немного примеров кода на MoonScript

Полезные ссылки

Заключение




Вступление

MoonScript - это динамический язык сценариев, который компилируется в Lua . Это дает вам мощь одного из самых быстрых скриптовых языков в сочетании с богатым набором функций. MoonScript может быть скомпилирован в Lua и запущен позднее, поскольку он компилируется прямо в код Lua, он полностью совместим с альтернативными реализациями Lua, такими как LuaJIT , а также со всем существующим кодом Lua и библиотеками. MoonScript обеспечивает чистый синтаксис, используя отступы, что позволяет избежать шума ключевых слов (do, then, end и т.д., которые как правило, вы видели в скрипте Lua). Ниже приведен пример некоторых конструкций, найденных в языке.



Важно знать: MoonScript - это чувствительный к пробелам язык. Это означает, что вместо использования do и end(или { и }) для разделения разделов кода мы используем разрывы строк и отступы.



Установка

Установка очень проста, переместить содержимое архива в корневую директорию игры, требования: установленный moonloader

В самой библиотеке moonscript используется библиотека Lpeg, она уже включена в архив

Также в архиве



Пример настройки редактора

Я использую VS-Code, поэтому информация по настройке будет именно по этому редактору

Тут тоже ничего сложного, переходим во вкладку расширения и устанавливаем: "vgalaktionov.moonscript"

Вот оно:

1576590096855.png



Примеры кода на MoonScript

Начнем с простого, узнаем как выглядит костяк скрипта, дополнительных комментариев, кроме тех, что в коде, думаю не нужно

Подсветка синтаксиса используется Lua, т.к. на ВН пока что не завезли мунскрипт, хотя в дискорде есть

Moonscript:
export main = -> -- функция мэйн, должно быть обязательно "export main", иначе функция будет local, а надо ее глобальную, чтобы мунлоадер увидел
  if not isSampfuncsLoaded() or not isSampLoaded() then return
  while not isSampAvailable() do wait 100
  -- тут регистрируем команды и тд, всё как в луа
  while true
    wait(0)
    -- бесконечный цикл в мэйн

Перейдем к имгуи, пример создания окна с текстом "текст", показать/скрыть окно на F2

Moonscript:
imgui = require 'imgui'
encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

wEnable = imgui.ImBool false -- булевая переменная отвечает за показ окна, можно "wEnable = imgui.ImBool(false)"

imgui.OnDrawFrame = ->
  imgui.Begin(thisScript().name, wEnable)
  imgui.Text(u8'Текст')
  imgui.End()



export main = ->
  if not isSampfuncsLoaded() or not isSampLoaded() then return
  while not isSampAvailable() do wait 100
  while true do
    wait(0)
    imgui.Process = wEnable.v
    if isKeyJustPressed(0x71) -- F2
      wEnable.v = not wEnable.v

Следующий пример по интереснее, тут уже немного раскрыты возможности мунскрипта в плане ООП, интерполяции строк (строка #34), табличные литералы:

Moonscript:
sampEvents = require 'samp.events'

class Log
  new: (path) =>
    @obj =
      path: path
    unless doesFileExist(@obj.path)
      f = io.open(@obj.path, 'w+')
      f\close!
  write: (text) =>
    f = io.open @obj.path, 'a'
    if f != nil
      f\write text
      f\close!
  remove: => os.remove @obj.path

class LogEx extends Log -- наследуемся от класса Log
  clear: => -- добавляем метод clear
    f = io.open @data.path, 'w+'
    f\close!

  print: => -- аналогично добавляем print для вывода лога
    for line in io.lines @data.path
      print line

export main = ->
  if not isSampfuncsLoaded() or not isSampLoaded() then return
  while not isSampAvailable() do wait 100
  export chatlog = LogEx "moonloader\\chat.log" -- создаем глобальную переменную chatlog, туда будем писать наш чат
  wait -1

sampEvents.onServerMessage = (color, message) ->
  chatlog\write "[color: #{color}] #{message}\n"
-- пишем в лог строку, используем интерполяцию строк доступную нам в мунскрипт, анлог в луа: string.format('[color: %s] %s', color, message)



onScriptTerminate = (script, quitGame) ->
  if script == thisScript!
    chatlog\remove! -- удаляем наш чат лог при выгрузке скрипта

Все эти примеры вы так же найдете в архиве (moonloader/moonscript/)





Полезные ссылки

Официальный сайт MoonScipt

Руководство по языку Moonscript (На английском, я через гугл переводчик все понял)

Онлайн компилятор Moonscript -> Lua

Репозиторий на github



Заключение

Не забываем про отступы, примеры в архиве полностью рабочие, возникнут вопросы - задаем их в теме

В лоадере мунскриптов имеется встроенная автоматическая перезагрузка при изменении .moon файлов



Лоадер работает по принципу:

Компиляция moonscript -> lua

Сохранение полученного кода в файл

Загрузка lua скрипта в игру



По поводу модулей:

Модули можно писать на мунскрипте, и использовать их в луа, просто "require("my module")"



Вроде ничего не забыл, предложения по улучшению кода лоадера принимаются
 

Вложения

  • MoonScript Loader.zip
    141.1 KB · Просмотры: 48
Последнее редактирование:

Azller Lollison

я узбек
Друг
1,342
2,263
Синтаксис блевотный, + луа в сампе используется в основном для крутых приватных читов где максимум 3 функции и то одна из них это мейн

И в чем вообще плюсы ебать себе мозги тратя время на мунскрипт если особого плюсов кроме сомнительного ооп нет? Компилируется один хуй в луа, по скорости никаких бустов не будет, да и ещё реально блевотный синтаксис со своими ограничениями

Может я хочу писать

Lua:
local
function
   someFunc(
      arg1,
      arg2,
      arg3
   )

   print(
      arg1,
      arg2,
      arg3
   )
  
end

someFunc(
   1,
   2,
   "бластхак"
)

А не эти ваши стрелки............
 

ufdhbi

Известный
Автор темы
Проверенный
1,456
861
Синтаксис блевотный, + луа в сампе используется в основном для крутых приватных читов где максимум 3 функции и то одна из них это мейн

И в чем вообще плюсы ебать себе мозги тратя время на мунскрипт если особого плюсов кроме сомнительного ооп нет? Компилируется один хуй в луа, по скорости никаких бустов не будет, да и ещё реально блевотный синтаксис со своими ограничениями

Может я хочу писать

Lua:
local
function
   someFunc(
      arg1,
      arg2,
      arg3
   )

   print(
      arg1,
      arg2,
      arg3
   )
 
end

someFunc(
   1,
   2,
   "бластхак"
)

А не эти ваши стрелки............
45771

Да никто и не заставляет переходить
 

DolgorukovGTA

Известный
Проверенный
652
344
Синтаксис блевотный, + луа в сампе используется в основном для крутых приватных читов где максимум 3 функции и то одна из них это мейн

И в чем вообще плюсы ебать себе мозги тратя время на мунскрипт если особого плюсов кроме сомнительного ооп нет? Компилируется один хуй в луа, по скорости никаких бустов не будет, да и ещё реально блевотный синтаксис со своими ограничениями

Может я хочу писать

Lua:
local
function
   someFunc(
      arg1,
      arg2,
      arg3
   )

   print(
      arg1,
      arg2,
      arg3
   )
 
end

someFunc(
   1,
   2,
   "бластхак"
)

А не эти ваши стрелки............
Тебе главное обосрать, как понимаю
 

AnWu

Guardian of Order
Всефорумный модератор
4,683
5,128
Синтаксис правда сомнительный. Ключевые слова занимают конечно много места в луа, но это не повод переходить на мунскрипт. К тому же искать в 1к строк где у тебя нет пробела - проблематичнее чем искать не закрытый блок в луа.
Мунскрипт явно не для нубов, нет такой простоты как луа и слишком много надуманных правил которые судя по всему задумывались как революционные
 
  • Нравится
Реакции: Azller Lollison

ufdhbi

Известный
Автор темы
Проверенный
1,456
861
Синтаксис правда сомнительный. Ключевые слова занимают конечно много места в луа, но это не повод переходить на мунскрипт. К тому же искать в 1к строк где у тебя нет пробела - проблематичнее чем искать не закрытый блок в луа.
Мунскрипт явно не для нубов, нет такой простоты как луа и слишком много надуманных правил которые судя по всему задумывались как революционные
Как тогда люди пишут на питоне? Там тоже чувствительный к отступам язык
 
  • Нравится
Реакции: romacaddy

AnWu

Guardian of Order
Всефорумный модератор
4,683
5,128
Как тогда люди пишут на питоне? Там тоже чувствительный к отступам язык
Не знаю. Я не пишу на питоне. Но если у питона был выбор между синтаксисами, яб выбрал луаподобный
 

ufdhbi

Известный
Автор темы
Проверенный
1,456
861
Почему до сих пор не популярно?
 
  • Грустно
Реакции: cooqie

ufdhbi

Известный
Автор темы
Проверенный
1,456
861
Lua:
profile =
    font: "Arial"
    size: 9
    flag: 0x4
    color: 0xFFFFFFFF

export main = ->
  unless isSampfuncsLoaded() or not isSampLoaded() then return
  while not isSampAvailable() do wait 100
  font = renderCreateFont(profile.font, profile.size, profile.flag)
  allAdmins = [admin for admin in io.lines("moonloader//config//admins.txt")]
  while true
    wait(0)
    onlineAdmins = ["#{admin}[#{i}]" for i = 0, 1004 for admin in *allAdmins when sampGetPlayerNickname(i) == admin]
    renderFontDrawText(font, table.concat(onlineAdmins, "\n"), 2, 2, profile.color)
Пример чекера админов на moonscript
 
  • Нравится
Реакции: MaksQ и Warflex

7jizzle

Участник
238
14
Прошу расписать преймущества мунскрипта и причины для перехода на него. Так же прошу ответить на вопрос - если писать на нем с защитой то она будет крепче чем на луа?
 

ufdhbi

Известный
Автор темы
Проверенный
1,456
861
Прошу расписать преймущества мунскрипта и причины для перехода на него. Так же прошу ответить на вопрос - если писать на нем с защитой то она будет крепче чем на луа?
преимущества ты можешь посмотреть в примерах выше и тут: https://moonscript.org/reference/
насчет защищенности: при компиляции мунскрипта получается .lua код, не похожий на обычный код, написанный человеком, более не читабельный выходит
 
  • Нравится
Реакции: 7jizzle

7jizzle

Участник
238
14
преимущества ты можешь посмотреть в примерах выше и тут: https://moonscript.org/reference/
насчет защищенности: при компиляции мунскрипта получается .lua код, не похожий на обычный код, написанный человеком, более не читабельный выходит
My English is very bad. 😔
 

Похожие темы