Jump to content

Опишите логику работы ресурсов


Recommended Posts

Здравствуйте, я никогда не занимался скриптингом для мта. Я всю свою осознанную часть жизни писал сайты на PHP, потом уже последние 3 года на руби и его рельсах. Есть огромное желание научится делать качественные моды. Но для любого хорошего мода нужна хорошая структура. Для меня не ясен вот такой вопрос:

Если взять например чистый руби, создаем файл (e.g. main.rb) Этот файл является точкой входа в программу, в нем идет подключение других файлов, глобальные переменные и т.д. А есть ли в мта скриптинге такая точка входа. Скажем например у меня есть ресурс(тот же main) и в нем идет определение глобальных переменных и подключение других ресурсов(e.g. usermenu) Сможет ли ресурс usermenu использовать переменные и функции указанные в ресурсе main. Или же тут какая то другой принцип действия. Обьясните пожалуйста. Заранее спасибо всем за ответы и проявленное понимание.

Link to comment

Покопайся тут https://wiki.multitheftauto.com/wiki/Main_Page

"С коробки" точек входа в ... (программу?) нету, все ресурсы изначально независимы и каждый выполняется в своей LuaVM. Точкой входа в ресурс(а они делятся на клиентскую и серверную часть) является файл, который выше всего в meta.xml от этого ресурса на этой стороне(на клиенте - свой, на сервере - свой).

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

Не знаю почему, но не рекомендую использовать include в meta.xml

Обращения к переменным между ресурсами изначально реализованы export'ами https://wiki.multitheftauto.com/wiki/Call

Edited by Guest
Link to comment
Покопайся тут https://wiki.multitheftauto.com/wiki/Main_Page

"С коробки" точек входа в ... (программу?) нету, все ресурсы изначально независимы и каждый выполняется в своей LuaWM. Точкой входа в ресурс(а они делятся на клиентскую и серверную часть) является файл, который выше всего в meta.xml от этого ресурса на этой стороне(на клиенте - свой, на сервере - свой).

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

Не знаю почему, но не рекомендую использовать include в meta.xml

Обращения к переменным между ресурсами изначально реализованы export'ами https://wiki.multitheftauto.com/wiki/Call

Твой ответ дал мне гораздо больше чем вики) Щас вот попробывал, в пределах одного ресурса глобальные переменные работают. Начинаю потихоньку суть понимать. Это радует, спасибо тебе

Link to comment
Учить мне кажется лучше всего по примерах, зайди в коммюнити (сверху слева, думаю видел) скачай какой-то простой ресурс и разбирай его по тихоньку, лично мне это очень помогло.

Иногда такого скачать можно, что крыша съедет.

Да и там нету мульти-ресурсных разработок.

Link to comment
Здравствуйте, я никогда не занимался скриптингом для мта. Я всю свою осознанную часть жизни писал сайты на PHP, потом уже последние 3 года на руби и его рельсах. Есть огромное желание научится делать качественные моды. Но для любого хорошего мода нужна хорошая структура. Для меня не ясен вот такой вопрос:

Если взять например чистый руби, создаем файл (e.g. main.rb) Этот файл является точкой входа в программу, в нем идет подключение других файлов, глобальные переменные и т.д. А есть ли в мта скриптинге такая точка входа. Скажем например у меня есть ресурс(тот же main) и в нем идет определение глобальных переменных и подключение других ресурсов(e.g. usermenu) Сможет ли ресурс usermenu использовать переменные и функции указанные в ресурсе main. Или же тут какая то другой принцип действия. Обьясните пожалуйста. Заранее спасибо всем за ответы и проявленное понимание.

Явной точки входа как таковой нет. Все скрипты выполняются по порядку, как в PHP.

По поводу подключения других скриптов (инклудов), в стандартном Lua это делается с помощью dofile, либо подключением модулей с помощью require. В МТА это всё вырезано, вместе с остальными небезопасными функциями. Вместо этого придётся подключать необходимые библиотеки в meta.xml до вашего основного скрипта.

Если же нужна какая-то "точка входа", с которой будет начинаться вся логика, то советую посмотреть в сторону события onResourceStart (onClientResourceStart - аналог для клиента)

Link to comment
Учить мне кажется лучше всего по примерах, зайди в коммюнити (сверху слева, думаю видел) скачай какой-то простой ресурс и разбирай его по тихоньку, лично мне это очень помогло.

Иногда такого скачать можно, что крыша съедет.

Да и там нету мульти-ресурсных разработок.

Вы правы, большенство публичных ресурсов лапшакод. Я немного имел дело с самп и его павн, так там тоже самое. Нехотелось бы говнокодить, да и изобретать велосипеды тоже себе дороже(но и бест практикс ни кто не выкладывает, парадокс)

Link to comment
Явной точки входа как таковой нет. Все скрипты выполняются по порядку, как в PHP.

Как я понимаю, это справедливо в рамках одного ресурса, можно ли как то выбрать порядок загрузки ресурсов? Например с помошью resourceStart(...) - в onResourceStart основного ресурса. Или есть еще какие ли способы?

P.S. Очень кстати понравилась одна фишка когда в ресурсе(e.g. main) мы создаем набор функций, затем обьявляем export в meta.xml. А потом из другого ресурса я получаю доступ к данным функциям с помощью export.main:func().Так можно делать только для функций, я не могу отправить например метатаблицу? И где вообще почитать про это.

Link to comment
Экспортировать метатаблицы нельзя, придется встраивать тебе в каждый ресурс, увы.

А если передавать функцию, которая уже вернет метатаблицу, вот пример

Имеем 2 ресурса, главный main и побочный test из main экспортируем.

  
-- main.lua 
addEventHandler("onResourceStart" , getRootElement(), 
    function() 
        local resource = getResourceFromName('test') 
        startResource(resource) 
    end 
) 
  
function func() 
    local Obj = { 
  
        getString = function() 
            local var = "Hello World" 
            return var 
        end, 
  
    } 
    return Obj 
end 
  

  
-- test.lua 
addEventHandler("onPlayerJoin" , getRootElement(), 
    function() 
        local Obj = exports.main:func() 
        local var = Obj.getString() 
        outputChatBox(var) 
    end 
) 
  

Данный пример у меня не работает(кто бы сомнивался, ведь ты так и сказал) но может я просто не правильно делаю, ведь по сути я просто функцию вызываю, которая передает метатаблицу. Если например вызвать функцию передающую строку, то все работает

P.S. Поверхносный гугл показал, что я передаю вообще просто таблицу, их получается тоже нельзя передавать http://habrahabr.ru/post/228001/

P.P.S. Попробывал передать просто таблицу, все получилось. В ней значением ключа была не функция, строка. Какой то сыр бор в голове))

Edited by Guest
Link to comment

Как я понимаю, это справедливо в рамках одного ресурса, можно ли как то выбрать порядок загрузки ресурсов? Например с помошью resourceStart(...) - в onResourceStart основного ресурса. Или есть еще какие ли способы?

Можно сделать гланвый ресурс, который подгрузит все остальные. Правильно, onResourceStart, resourceStart(...) .

На форуме вместо тега code используй тег lua.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...