Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий
7.9, открыть диспетчер задач не судьба? Луа не многопоточен в принцыпе, так как один стек и виртуальная машина

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий

Про Lua понял.

Про диспетчер: У меня процессор с двумя ядрами, с двумя - вроде, чего-то там работает, но что именно - понять сложно.

Изменено пользователем 7.9

всё легко

Ссылка на комментарий
xStream,

 

например?

 

Некорректно выразилась. Имелась ввиду основа связки С++ - ЛУА: экспорт функций, классов из С++ в ЛУА. Я просто привыкла к этому, на этом можно всяческие трюки сделать (включая работу с памятью, потоками и прочими интересными штуками). Здесь же, в сталкере, приходится иметь дело "с тем, что есть".

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий
xStream, на данный момент в луа можно биндить любые свои функции и классы. Дальше ограничено только фантазией))

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий

Да вы что? :) То, что не предусмотрено движком, через корявые дллки? :) Если да, то извините, но это рядом не валялось с написанием нормальной системы классов и их биндингом. У меня фантазия отказывает, бедная она у меня, походу. Или, может, расширение классов, описанных разработчиками? Тогда, конечно, это круто.

[offtopic]

Подпирать сталкер костылями - палеатив, на мой взгляд. С такими усилиями, сколько комьюнити вложило в это решето, давно можно было свою собственную игру написать.

[/offtopic]

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий
xStream, биндинг через сам луа и луабинд, точно такой же как и у GSC был. Что мешает писать "нормальную систему классов" так и вообще не понятно...

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий

Ок, я поняла точку зрения :)

Вопрос был не в том КАК, а в том ЧТО. Если новое - то это реально бред, простите. Пишите новую игру лучше, это куда креативнее и интереснее, имхо, конечно же. И да, не забудьте это привязать к игровой логике сталка, или тоже пишем свою? Тогда что от сталкера остается?

 

Обкладывать сталкер дллками - палеатив, как я сказала. Да и вообще, такие таланты надо вкладывать не в чужое творение за бесплатно, а в свое и за деньги. Или я не улавливаю основную мысль? Сделать вообще возможно все, но вот есть ли в этом смысл...

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

RvP,

Что мешает писать "нормальную систему классов" так и вообще не понятно...

В первом приближении, мешает отсутствие у тебя этих самых классов. Впрочем, если сможешь это сделать, было бы действительно замечательно. То, как делаются расширения сейчас, иначе как мазохизмом не назвать.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Знаю что это из ряда фантастики, но штатными методами LUA можно ли "выключить" весь скрипт или функцию? Тоесть допустим у меня скрипт с рядом функций, которые из разных мест вызываются переодически. Могу ли я тупо "остановить" их. Тоесть чтобы если функцию вызовет какой то скрипт, игра не вылетела, но и функция не выполнилась?

 

Насколько я понял, все скрипты при компиляции заносятся в некую таблицу, к которой можно получить доступ из _G.

Все функции из этого скрипта я вызываю с проверкой вида if _G[script] and _G[script][funct] then, если я обнилю _G[script] = nil, это будет критично для движка?

Ну и раз так, то обратный вопрос, можно ли прямо во время игры "собрать" свой собственный скрипт через _G?

 

А вообще возможно составить функцию на лету? Тоесть скриптво в формате string сделать функцию и скормить компилятору, чтобы он её превротил в нормальную?

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

*Shoker*,

А вообще возможно составить функцию на лету? Тоесть скриптво в формате string сделать функцию и скормить компилятору, чтобы он её превротил в нормальную?

load (func [, chunkname])

loadfile ([filename])

loadstring (string [, chunkname])

оно?

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий

Возможно :)

Надеюсь что оно уже экспортировано в ЧН/ЗП (как я понял твоя библитоека тока для ТЧ годится)

 

А вообще я lUA на сталкере учил, поэтому многих спец. функций его даже не знаю, с load-ами никогда не работал, хотя на lua-help читал что то давно про них, но все эти чанки и прочее, я даже не пойму что это.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Это стандартные функции ЛУА.

 

Чанк - ссылка на скомпилированый байт-код. По сути - это нечто типа функции, внутри которой весь твой код рабочий и сохраняется (образно говоря). Чанки можно выполнять как функции, в результате чего произойдет "загрузка заново" (переинициализация всего, что было внутри чанка - переменных и функций).

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий
...штатными методами LUA можно ли "выключить" весь скрипт или функцию?
Проще всего с помощью debug. Я раньше уже показывал, но повторю.

Напиши где-нибудь в _g.script(конечно если используешь расширение от RvP):

debug.setmetatable(nil, {__index = function() end, __call = function() end})

А дальше, если нужно выключить отдельную функцию, или весь модуль, просто присвой им значение nil:

имя_модуля.имя_функции = nil -- отключаем функцию
-- или
имя_модуля = nil -- отключаем модуль целиком

Все вызовы таких функций, или же модуля в целом будут возвращать nil, а не вылетать.

Но тут есть ещё вопросы. Нужна ли возможность обратного включения? Сохранять ли состояние (включен\выключен)? Ну, в общем, ещё немало нюансов для создания полноценного функционала.

 

Добавлено через 159 мин.:

Полагаю что ты мало что понял из объяснений по load-ам, поэтому несколько примеров :

-- чанк как строка
local s = 'function foo() print "Hy" end' -- исходный чанк
loadstring(s)() -- загрузить чанк
foo()           -- выполнить
-- или такой вариант :
local s = 'n = 10'
loadstring(s)()
print(n)
-- Массив чанков, через load :
function getcode (t)
    local pos = 0
    local   function iterator ()
                pos = pos + 1
                return t [pos]
            end
    return iterator
end

code = {"local a = 1 ",
        "print ('a =', a) "}
  
load (getcode (code)) ()

-- чанк как байт-код
function foo() -- исходная функция
    print "Hy"
end

local f=string.dump(foo)  -- cохранить функцию в байт-код
local new_foo = loadstring(f) -- загрузить функцию
new_foo()                     -- выполнить функцию

 

Изменено пользователем Gun12
Ссылка на комментарий
*Shoker*: Знаю что это из ряда фантастики, но штатными методами LUA можно ли "выключить" весь скрипт или функцию? Тоесть допустим у меня скрипт с рядом функций, которые из разных мест вызываются переодически. Могу ли я тупо "остановить" их. Тоесть чтобы если функцию вызовет какой то скрипт, игра не вылетела, но и функция не выполнилась?
(выскажу свое ИМХО)

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

1. Функции, в Lua - один из типов информации, с которыми возможны большинство стандартных операций, т.е. присвоения, занИления, сохранения в таблицах и пр.

2. Если ты, как сам пишешь, используешь обращение к метатаблице - то что мешает в это поле в нужное время подставить нужную функцию (хоть ничего не возвращающую), а прежнюю, если потребно, запомнить в другом поле/месте (чтобы иметь возможность восстановить)?

3. Аналогично и со 'скриптами' (если под ними понимаем файл-скрипт). Обращаясь не к нему (файлу) непосредственно, а именно через метатаблицу (_G), ничто не мешает как угодно заменить на нужное _G[script]. Т.е. по сути подменять один скрипт другим. Примеров даже в имеющихся модах предостаточно.

4. Ну а чтобы не вылетело - все зависит от того, что обжидает в ответ вызвавшая функция и как обрабатывает полученный ответ. Ничто не мешает перед вызовом перепроверять и наличие собственно скрипта и/или функции в нем, и конечно же по полученному ответу не форсировать операций с неполученными 'штатно' параметрами.

 

Составлять же функцию 'на лету' - и Gun12 дал пояснение и ... А ЗАЧЕМ? Все одно, составленная таким образом функция должна быть подчинена некоему алгоритму и соответствовать некоему шаблону. Т.о. заложив шаблон или даже готовый набор возможных вариантов и выбирая из него нужное - вполне безопасно можно подстраиваться под нужное. Пример имеется даже для прекондишенов в диалогах (см. AMK-mod), в котоором рандомятся условия и по ним в собственно скрипт добавляются требуемые функции.

 

А вообще взглянул бы ты на известный тебе мод, в котором давным давно и модули/скрипты опциональны и отключаемы 'на лету' и функции 'на лету' добавляются/заменяются хоть в _G, хоть в иных скриптах.

 

Т.о. никакая это не фантастика, а вполне тривиальные вещи, способ реализации которых зависит от конкретного контекста.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Обкладывать сталкер дллками - палеатив, как я сказала.

Спорное это утверждение. Много-ли потенциала можно из движка ТЧ извлечь, не забираясь глубоко в его внутреннее устройство? Далеко можно зайти с оптимизацией, особенно если захочется задействовать дополнительные ядра ЦП?

Без своей разработки я пока не вижу способов такие вещи делать:

1. Прямой доступ к свойствам объектов игры, позволяющий буквально все изменять на лету, регулировать некоторые источники света в том числе. Полезная инфа из объектов на раз извлекается: в инвентори он лежит или в слоте например.

2. Вызов методов внутренних C++ классов, раскрывающий возможности опять-же недоступные обычно на уровне Lua.

3. В случае с 65535 ID, получение только существующих из онлайнового или серверного двоичного дерева, за считанные микросекунды вместо перебора. В том числе с фильтрами по владельцу, координатам и т. п. Что к слову позволяет самой DLL наблюдать за состояниями объектов и при необходимости колбеки вызывать, а перехват лога (в версии 1.0006) позволяет синхронизировать версии деревьев.

4. Элементарный перехват клавиатуры.

 

В будущем вероятно удастся даже записывать новые текстуры в память, и корректировать вертексы в буфере DX9. Вряд-ли это позволит движку стать более современным, но пока я оцениваю мир зоны все более и более перестает быть "пластмассовым" и статичным.

Изменено пользователем alpet

Плавайте поездами аэрофлота!

Ссылка на комментарий

Речь шла не о доступе к тому, что уже заложено в движке, а о новом функционале, причем экспортируемом в луа.

Это существенно разные вещи. Заняться реверсинжинирингом и дополнить существующее - бесспорно важно и полезно. Я тут даже и не спорю *тут должен быть смайл уважительного поклона*

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

А в LUA случаем нету "меток" и возможности переходить между ними?

Тоесть есть кусок кода, его можно "отметить" и в нужный момент перескочить именно на него.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Может быть эти кусочки объявить как локальные переменные вот как и будет вроде переход...

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...