Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
-StalkMen- 159 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 (изменено) Нет ли тут подводных камней? function bind_function(func,...) return function () return func(unpack(arg)) end end function bind_member(func, inst, ...) return function () return func(inst, unpack(arg)) end end class "test_class" function test_class:__init() printf ("test_class:__init()") end function test_class:test_fun(a, printf ("test_class:test_fun()") printf (a+1) printf (b+1) end function my_test(a, printf (a+1) printf (b+1) end function test() local test_inst = test_class() local f = bind_function(my_test, 10, 20) local f2 = bind_member(test_class.test_fun, test_inst, 10, 20) f() f2() end Изменено 30 Августа 2015 пользователем -StalkMen- Ссылка на комментарий
Nazgool 250 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 (изменено) @-StalkMen-, А чего сразу подводные? Тут надводные Как Lua поймет что такое 'arg' в выражении 'unpack(arg)' ?Сначала нужно эту переменную определить function bind_function(func,...) local arg = {...} return function () return func(unpack(arg)) end end То же самое нужно сделать и в функции 'bind_member' Сразу отвечу на возможный следующий вопрос. Стандартная переменная 'arg' в Lua vs STALKER не работает. Поэтому таблицу с переменным количеством аргументов нужно определять самому. В принципе это можно считать подводным камнем )). Изменено 30 Августа 2015 пользователем Nazgool Ссылка на комментарий
Charsi 440 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 @Nazgool, в функциях с неявным числом аргументов локальная таблица arg создается автоматически. Функция bind_member от bind_function по сути ничем не отличается. Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
-StalkMen- 159 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 (изменено) @Nazgool, У меня Lua 5.1.5, и то, что я написал робит. "Шаблонность" в Lua зачётная, я блин больше времени убил, пока писал аналог на С++ того, что выше, а то, что ниже ... function bind_member(func, inst, ...) local arg1 = arg return function (...) return func(inst, unpack(arg1), unpack(arg)) end end Такой вопрос, стоит вводить систему "эвентов" ? Вроде же вызовы двиг<->скрипты дорогие, значит надо их минимизировать. Изменено 30 Августа 2015 пользователем -StalkMen- Ссылка на комментарий
Desertir 202 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 я блин больше времени убил, пока писал аналог на С++Ну ты сравнил динамический и статический языки... Зато на плюсах надежно. Почти, гы. Такой вопрос, стоит вводить систему "эвентов" ?Этаж какую? Которую уже реализовали раза 2-3 профи и еще каждый любитель свою запилил? Или что то с движком связанное? Уточняй. Прости мою придирчивость, но я поправлю, event произносится через И - "ивэнт"/"ивент". ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
-StalkMen- 159 Опубликовано 30 Августа 2015 Поделиться Опубликовано 30 Августа 2015 @Desertir, Которую уже Я не так давно снова стал сидеть на Сталкерских форумах, так что не всё знаю. Движок? Определённо! Первое, что приходит в голову, апдейт биндеров. Вообще я это всё начал из-за отсутствия апдейта, нормального, без всяких цепляний к чему-то там. (©мультиплеер)+ Хочетцо модульную систему. Дописал в конфиге строчку, скрипт прописался, куда ему надо. onUpdate = Event() onInitialize = Event() function main() Initialize() Update() end function Initialize() onInitialize:Call() end function Update() while true do onUpdate:Call() wait(1) end end 1 Ссылка на комментарий
-StalkMen- 159 Опубликовано 31 Августа 2015 Поделиться Опубликовано 31 Августа 2015 аналог Sleep (в луа это wait ) Однако function wait(time_to_wait) verify_if_thread_is_running() if (time_to_wait == nil) then coroutine.yield() else local time_to_stop = time_global() + time_to_wait while time_global() <= time_to_stop do coroutine.yield() end end end Ссылка на комментарий
Romz 142 Опубликовано 1 Сентября 2015 Поделиться Опубликовано 1 Сентября 2015 Товарищи. Может, конечно, совсем нубский вопрос, но всё же. Как получить количество строк в табличке? Ну вот, допустим, есть табличка covers. В ней, соответственно, сложены укрытия на локации, с учетом кондишнов и инфопоршней. Дык вот как, сопсна получить число укрытий, которые там сложены? Подсмотрел, что можно написать #covers, но чегось не взлетает... По крайней мере, в лог не пишет, т.е. nil. Табличка заведомо заполнена. Не, ну можно нагородить конструкцию при заполнении, чтоб считало,но должен же быть способ... Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
UnLoaded 313 Опубликовано 1 Сентября 2015 Поделиться Опубликовано 1 Сентября 2015 но чегось не взлетает... По крайней мере, в лог не пишет, т.е. nil. Ну, если у тебя Lua не хочет размер таблицы посчитать - видно оно\она на тебя шибко обиделось\лась... Ссылка на комментарий
Romz 142 Опубликовано 1 Сентября 2015 Поделиться Опубликовано 1 Сентября 2015 чегось не взлетает...Внезапно - взлетело Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
-StalkMen- 159 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 (изменено) Оператор # возвращает целое число n, такое, что t[n] не nil, и t[n + 1] равно nil. Другими словами оператор #, возвращает максимальный индекс непрерывной последовательности ключей от начала массива. Соответственно, для таблицы: local t = {1, [100] = 2}print(#t) -- > 1, поскольку t[1] не nil, а t[1 + 1] равно nil.Для массива, в котором значения хранятся одно за другим, оператор # вернет количество элементов в массиве. Изменено 2 Сентября 2015 пользователем -StalkMen- Ссылка на комментарий
Romz 142 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 Нужна подсказка по циклам имеется вот такая конструкция for _, level_t in pairs(levels) do for i = 1, level_t.count do local tab_1 = {} pos_new= {} tab_1.game_vertex = level_t.game_vertex tab_1.level_vertex = math.random(1571597) repeat pos_new = level.vertex_position(tab_1.level_vertex) until pos_check(pos_new) == false tab_1.x = pos_new.x tab_1.y = pos_new.y tab_1.z = pos_new.z table.insert(items_q, tab_1) end end Функция pos_check возвращает true если pos_new не попадает в некие границы, и false, если попадает. Почему-то repeat / until приводит к бесконечному циклу... Я пробовал ставить и pos_check(pos_new) == true и pos_check(pos_new) ~= true Всегда получаю зависание игры. Или как ещё можно добиться, чтобы итерация не пропала зря. Потому что если сгородить конструкцию pos_new = ... if pos_check (pos_new) == true then ... table.insert end то цикл for i = 1, level_t.count do срабатывает, но координаты в таблицу не кладутся, т.к. они неверные. Мож чего невнятно объяснил, скажите, попробую разжевать... Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Shredder 49 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 (изменено) Потому что у тебя внутри цикла ничего не изменяется repeat pos_new = level.vertex_position(tab_1.level_vertex) until pos_check(pos_new) == false --Ты проверяешь одно и тоже tab_1.level_vertex = math.random(1571597) нужно занести внутрь цикла Изменено 2 Сентября 2015 пользователем Shredder 3 Ссылка на комментарий
Romz 142 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 @Shredder, Блин, точно... Затупил, признаю... Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Nazgool 250 Опубликовано 2 Сентября 2015 Поделиться Опубликовано 2 Сентября 2015 (изменено) Nazgool, в функциях с неявным числом аргументов локальная таблица arg создается автоматически. Даже обидно как-то. Ну ладно, допустим я этого никогда не знал. И решил проверить. Написал бы что-то вроде : function f(...) print(arg and arg.n) end f(1,2,3) И в SciTE (читать стандартном lua) действительно увидел бы таблицу 'arg' с тремя полями. Но вот запустив этот же код в игре (print у меня работает как log), напечатало бы 'nil' Почему и сказал Стандартная переменная 'arg' в Lua vs STALKER не работает. Поэтому таблицу с переменным количеством аргументов нужно определять самому. Изменено 2 Сентября 2015 пользователем Nazgool Ссылка на комментарий
Kirgudu 1 264 Опубликовано 4 Сентября 2015 Поделиться Опубликовано 4 Сентября 2015 Никогда не был силён в регулярных выражениях.Требуется из строки вида, например, «aaa_bbb_ccc_ddd» вытащить подстроку от первого символа и до последнего подчёркивания включительно, то есть «aaa_bbb_ccc_», и присвоить это значение переменной средствами сталкеровского Lua. В строке могут быть буквы, цифры и подчёркивания, больше никаких знаков, регистр любой.Может кто-нибудь помочь? Инструмент Ссылка на комментарий
Shredder 49 Опубликовано 4 Сентября 2015 Поделиться Опубликовано 4 Сентября 2015 ^(.*_)[^_]+$ 1 Ссылка на комментарий
Карлан 1 049 Опубликовано 4 Сентября 2015 Поделиться Опубликовано 4 Сентября 2015 @Shredder, проще s:match('^(.*_)'), это если грубо, а если конкретно под тз, то так: s1 = '' for s in str:gmatch('[^%.%;%,]') do s1 = s1..s end Как доделать думаю ясно. 1 1 Ссылка на комментарий
UnLoaded 313 Опубликовано 6 Сентября 2015 Поделиться Опубликовано 6 Сентября 2015 Помощь требуется, однако... Собственно условия задачки: есть некое кол-во(ну в пределах не более 20) биндеров неких объектов, в апдейтах которых вычисляется значение в диапазоне от 0 до 100. Есть ф-ция, которая будет отображать эти значения динамически в виде линейного индикатора(тот-же ProgressBar, к примеру), с условием, что отображать надо на одном индикаторе от 0(если все значения по 0) до самого максимального(если есть 0, 18 и 76 - то отображать 76). Уж извиняйте, не знаю как это грамотными словами обозвать. Пока у меня думалка надумала такой вариант: заносить все значения из апдейтов в табличку. В ф-ции отображения, которую вызывать из этих-же апдейтов, парсить ее как-то так: local value_table = {} function set_pos() local pos = 0 for k, v in pairs(value_table) do if v > pos(или v >= pos ?) then pos = v end end SetProgressPos(pos) end Хотелось-бы подсказку: как оптимально табличку организовать(или она вообще не нужна ?), как ф-цию отображения организовать ? Ссылка на комментарий
Карлан 1 049 Опубликовано 6 Сентября 2015 Поделиться Опубликовано 6 Сентября 2015 Самое простое это сделать переменную, и обновлять максимальное значение. Либо если хочется таблицей, то таблицей и далее table.max какой-нибудь, то есть сортировка, но тут можно обойтись и без этого. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти