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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Serge! 127 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 Почему тебе следующий вариант не нравится? function isBool(value) type(value) == 'boolean' end да хотя-бы потому, что это не рабочий вариант. Вы сами то попробовали её запустить? Я попробовал, у меня не получилось ее даже в SciTE запихнуть. Ругается. А так все нормально, все буковки правильные. Вам не кажется, что это уже в простой трёп переходит? Я же Вам ничего не советовал. Вы правильно дианостировали ошибку в том фрагменте кода (там еще был метод find применённый к таблице, хотя обычно применяется для строк, но я не претендую на эксперта Lua и его расширений для Сталкера - возможно такое применение и корректно. Но у меня в _G такого метода для таблиц нет). И так можно перебрасываться очень долго, пока меня окончательно не забанят. По сему на этом всё. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969218
Desertir 202 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 (изменено) Расшифруй.Я о том, что type возвращает одну из строк nil, boolean, number, string, userdata, function, thread, tableОни все известны, их конечное число и они описаны в доках, и мне непонятна фраза про непредсказуемые моменты. Всё вполне предсказуемо. Ну типы то надо знать... Изменено 15 Октября 2015 пользователем Desertir Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969224
Serge! 127 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 Ну типы то надо знать... Типы то я знаю, а вот Вы так и не поняли, что функуция проверяет не типы, а объекты. Ведь это две большие разницы, не правда ли? Или Вы и с этим не согласны? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969225
Карлан 1 050 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 (изменено) @Desertir, там все ясно, он мне в личку отписал, он путает перевод в булево с проверкой существования переменной, причем с относительно НЕпустым значением.Приведу цитату (просьба не притягивать за уши и опять меня в чем-то обвинять): Неверно. Если такой объект существует (буть то функция, нить, userdata и т.д) она вернёт true, а если не существует (нет его в _G), то вернёт false. Все корректно. Это никак не проверка типа на булево. Если попробовать поискать что-то подобное у себя, то только такое могу предложить: function is_correct(x) return not (is_false(x) or is_nil(x)) end Для toboolean у меня используется двойное отрицание, в таком виде lua безопасно переводит любой тип в булево значение, следует только учитывать при работе с нулем и единицей, их не переводит, они оба true, потому при работе с нулем как false следует это учитывать. Изменено 15 Октября 2015 пользователем Карлан Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969227
Serge! 127 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 он путает перевод в булево с проверкой существования переменной я не собираюсь ни в чем, никого обвинять, просто прошу напомнить где я говорил о "переводе в булево"? Может я что-то забыл, тогда я не прав. Я всё время твержу о проверке зачения объекта, а не его типа. Переименуйте функцию в thisObjIs(var) и забудьте про тип возвращаемого ею значения. Тогда может вопросы отпадут? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969229
Desertir 202 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 да хотя-бы потому, что это не рабочий вариантОчевидно надо дописать return, про который я забыл, ошибка очень легко диагностируемая, появляется частенько если писать код быстро. У меня такое бывает, ошибаюсь. Вопрос только в том, почему для тебя это не очевидно? Вам не кажется, что это уже в простой трёп переходит? Я же Вам ничего не советовал.Нет, не кажется, я хочу помочь, однако советов я не давал, я только задавал вопросы. Несколько наводящие, но вопросы, чтобы ты сам постарался понять свою проблему. что функуция проверяет не типы, а объектыКонечно объекты, в Луа нет работы напрямую с типами, отчасти мета-таблицы, которые хоть немного привносят рефлексию. Это же скриптовый язык, он должен быть простым. он путает перевод в булево с проверкой существования переменнойНу ок. В JavaScript вообще все просто, написал два раза восклицательный знак вот и перевел в булево используется двойное отрицаниеВот и я об этом. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969267
Serge! 127 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 ты сам постарался понять свою проблему. У меня конкретно в этом случае нет проблемы, это раз.Два, в последний раз повторяю, я не проверяю типы, не пытаюсь перевести их в булево, а проверяю значение объекта на факт его существования и на то, что он не пустой (number не 0, string не "" и т.п.). И только результат такой проверки получаю в виде булевского значения. Других слов снять вашу зашторенность у меня просто нет, извините. Разве что переименуйте мысленно эту функцию из isBool(var) в thisIsObj(var) и тогда возможно станет понятнее моя цель.А за вопросы, особенно наводящие, большое человеческое спасибо. в Луа нет работы напрямую с типами добавлю. И здесь Вы не правы. В Lua допускается и имеется возможность изменения типа значения, ограниченная правда, но имеется.Примеры: 1. указанное Карлан двойное отрицание. 2. tonumber(var) - перевод в тип number. 3. tostring(var) - перевод в тип string.Продолжить? или этого достаточно? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969280
FonSwong 33 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 Нужна помощь со строками Нужно получить из строки(s) текст от 1 пробела до второго. индекс 1 пробела нахожу, а вот со 2 пробелом проблема. Подскажите пожалуйста. local s = "! Волк где ты?"--ввод с пда log1(get_substr_since_first_to_two_space(s))--запуск функции которая должна вернуть слово Волк function get_substr_since_first_to_two_space(line) if not contains(line," ") then return "" end local space1 = index_of(line," ")+1--узнаём индекс 1 пробела + 1 local space2 = -1--узнаём индекс 2 пробела - 1 return substring(line,space1,space2) end ------------------------------------------------------ -- Автор DukeKan -- 25.04.2013 ------------------------------------------------------ ------------------------------------------------------ -- Служебные функции для удобной работы со строками ------------------------------------------------------ -- Функция возвращает подстроку с 1 символа и до ближайшего пробела, не включая его function get_substr_until_first_space(line) if not contains(line," ") then return "" end return substring(line,1,index_of(line," ") - 1) end --[[ function get_substr_since_first_to_two_space(line) if not contains(line," ") then return "" end local sbst = index_of(line," ") local sbst2 = substring(line,sbst + 1,sbst - 1) return substring(line,sbst + 1,sbst2) return substring(line,index_of(line," ") + 1,substring(line,index_of(line," ") + 1,index_of(line," ") - 1)) end ]] -- Функция возвращает подстроку с пробела (первого) и до конца function get_substr_since_space_to_end(line) if not contains(line," ") then return "" end return substring(line, index_of(line," ") + 1) end -- Вычисление длины строки function length(line) if line == nil then return nil end return string.len(line) end -- Выделение подстроки по индексам function substring(line,begin,ends) if ends == nil then ends = length(line) end return string.sub(line, begin, ends) end -- Находит первое вхождение в строку второго аргумента, -- возвращается не только первое вхождение, но и индекс, на котором вхождение заканчивается function index_of(line,substring) return string.find(line, substring) end -- Содержит ли строка данную подстроку function contains(line,substr, first, simple) if (length(line) < length(substr)) then return false end if string.find(line,substr,firts, simple) == nil then return false else return true end end -- Заменяет первое вхождение old в строке line на new function replace_first(line,old, new) if contains(line,old) then line = substring(line,1,index_of(line,old) - 1)..new..substring(line,index_of(line,old) + 1) end return line end -- Заменяет все вхождения old в строке line на new function replace_all(line,old,new) return string.gsub(line, old, new) end -- Проверяет, начинается ли строка с данной подстроки function starts_with(line,substring) local b,e = index_of(line,substring) return (b == 1 and e == length(substring) ) end -- Проверяет, заканчивается ли срока line последовательностью substring function ends_width(line,substring) if (length(substring) > length(line)) then return false end local begin,ends = index_of(line,substring) if (begin == nil) then return false end return (ends == length(line) and begin == length(line) - length(substring) + 1) end -- Проверяет, является ли строка пустой. true, если пустая, false иначе function is_empty(line) return length(line) == 0 end -- Переводит все буквы в нижний регистр function to_lower_case(line) return string.lower(line) end -- Переводит все буквы в верхний регистр function to_upper_case(line) return string.upper(line) end ------------------------------------------------------ -- Тесты ------------------------------------------------------ function accert_true(boolean, message) if not boolean then err_log("Error at "..message) end end function accert_false(boolean, message) if boolean then err_log("Error at "..message) end end function accert_equals(arg1, arg2, message) if arg1 ~= arg2 then err_log("Error at " .. message) end end function accert_not_equals(arg1, arg2, message) if arg1 == arg2 then err_log("Error at " .. message) end end function test_script() local a = "abcdefghijk" local b = "aaabbbcccddd" local c = "somestring" local d = "aabbccaabbcc" local e = "vvv ccc" local g = " vvv ccc " local j = "" local f = nil local h = "AaBb" accert_equals(get_substr_until_first_space(e),"vvv","get_substr_until_first_space") accert_equals(get_substr_until_first_space(g),"","get_substr_until_first_space") accert_equals(get_substr_since_space_to_end(e),"ccc","get_substr_since_space_to_end") accert_equals(get_substr_since_space_to_end(g),"vvv ccc ","get_substr_since_space_to_end") accert_true(length(a) == 11, "length") accert_true(length(j) == 0, "length") accert_true(length(f) == nil, "length") accert_equals(substring(b,4,6),"bbb","substring") local x,z = index_of(d,"cc") accert_true(x == 5 and z == 6, "index_of") accert_true(contains(e,"cc"),"contains") accert_false(contains(e,"dd"),"contains") accert_equals(replace_first(d,"b", ""),"aabccaabbcc","replace_first") accert_equals(replace_first(d,"a", ""),"abbccaabbcc","replace_first") accert_equals(replace_all(d,"b", ""),"aaccaacc","replace_all") accert_true(starts_with(c,"some"),"starts_with") accert_true(ends_width(c,"string"),"ends_width") accert_true(is_empty(j),"is_empty") accert_false(is_empty(h),"is_empty") accert_equals(to_lower_case(h),"aabb","to_lower_case") accert_equals(to_upper_case(h),"AABB","to_upper_case") end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969290
Charsi 441 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 (изменено) @FonSwong, захватываем всё, что после первого пробела и не относится к пунктуации. local s = "! Волк, где ты?" print(s:match("%s(%P*)")) --> печатает 'Волк' @Serge!, продолжай. Изменено 16 Октября 2015 пользователем Charsi Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969293
FonSwong 33 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 , где можно почитать по работе со строками? или готовые примеры понятные (ссылку можете дать?) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969294
Карлан 1 050 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 @FonSwong, документация по луа от Иерусалимского (не хочу ударятся в брюзжание, но надо читать шапку темы), там и про строки и про паттерны, а твой спойлер это жуть . Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969303
FonSwong 33 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 Карлан, чего жуть то Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969305
Карлан 1 050 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 @FonSwong, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969310
Desertir 202 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 (изменено) Разве что переименуйте мысленно эту функцию из isBool(var) в thisIsObj(var) и тогда возможно станет понятнее моя цель.Я даже не знаю что на это сказать. Я понимаю, что тема была про проверку на существование и пустоту, но почему isBool? Это не просто неверное именование функции, это наименование для заблуждения читающего, случайное или намеренное - не важно. Важно то, что ты предоставил свой вариант общественности, и он весьма странный. И здесь Вы не правыЯ про Фому, а ты мне про Ерёму. Я говорю о типах как о значениях. В Lua допускается и имеется возможность изменения типа значенияТип значения ты изменить не сможешь. Можно изменить тип переменной. Значение это строка или число, которые ты написал в код. Ты никак не скажешь компилятору "вот тебе число, но интерпретируй его как строку". Число есть число, строка есть строка. А вот переменная будет иметь тип согласно последнему присвоенному значению, т.к. Луа - динамический ЯП. Поэтому в нем нет приведения типов на уровне языка (о чем кстати ты и говоришь), они реализованы в виде функций toTYPE и, как ты сказал, весьма в ограниченном виде. Но это не то, о чем я говорил. Продолжить? или этого достаточно?На твое усмотрение, подискутировать я всегда могу. Изменено 16 Октября 2015 пользователем Desertir Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969333
FonSwong 33 Опубликовано 17 Октября 2015 Поделиться Опубликовано 17 Октября 2015 @FonSwong, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь.Оболочки сделаны для более удобного вызова, так как в них сразу проверки на пустоту и тд.Спасибо за наводки Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969407
Serge! 127 Опубликовано 18 Октября 2015 Поделиться Опубликовано 18 Октября 2015 Никогда не мог подумать, что для постоянных посетителей этого ресурса требуется какой-то ликбез по терминологии в области программирования. Однако последние станицы показали, что некоторым такое будет полезно. Заодно и сам кое-что освежил. Переменная — поименованная, либо адресуемая область памяти, адрес которую можно использовать для осуществления доступа к данным. Данные, находящиеся в переменной (то есть по данному адресу памяти), называются значением этой переменной.В некоторых языках переменная определяется как имя, с которым может быть связано значение, или даже как место для хранения значения.Важно понимать разницу между именем переменной и значением этой переменной, и не забывать о ней.Значение, к которому привязана переменная (значение переменной) может быть объектом любого типа (допустимого синтаксисом), который может быть возвращен выражением.Например (для Lua):local tbl - это переменнаяаlocal tbl = () - это значение, к которому привязана переменная tbl. Это значение имеет тип table, а сама переменная (tbl) в отрыве от контекста присваивания никакого значения не имеет (nil в терминах Lua). Типы значения привязанные к переменным могут быть любые определённые синтаксисом компилятора.Отсюда вытекает, что нет никакой возможности проверять или переопределять типы самих переменных (их просто не существует), а можно выполнить проверку или преобразование только для значений, привязанных к этим переменным. Причем, при этом подразумевается не изменение типа значения (это невозможно по определению), а просто привязывание определённой ранее переменной к значению другого типа.В тоже время выражениеvar == {}является вполне допустимым (хоть и не имеющим никакого практического смысла) не смотря на то, что конструкция {} не привязана ни к какой переменной, но всё равно является вполне корректной для Lua, т.к. является ссылкой на область памяти под размещение массива (таблицы) и поэтому реальна, а, следовательно, не определяется компилятором как nil или ошибка. Это так называемая "повисшая" ссылка или "дырка", которая напрасно расходует ресурсы, но не вызовет вылетов. С ней позже разберётся сборщик мусора.Поэтому проверка переменных на их существование и проверка значений, привязанных к этим переменным, на наличие (пустоту) и тип - это всё суть разные понятия и действия.Объект, в понятиях "Сталкера", это нечто более аморфное, чем простые типы Lua и его рассмотрение потребует значительного времени и места. Поэтому пока оставим это. Да и к тому же форум "Скриптование" не самое подходящее место для подобных словопрений. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969547
FonSwong 33 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 (изменено) Не получается вывести рандомное значение из таблицы, ругается на аргумент tbl_sos = {} for id, human in pairs(db.creature) do if human then local npc = level.object_by_id(id) if npc~=nil and npc:alive() then if poisk.npc_will_help(npc,db.actor) then end end end end -- в npc_will_help идёт проверка по условиям и в таблицу записываются ид нпс через tbl_sos[npc:id()] = "SOS" local abc = tbl_sos[math.random(#tbl_sos)] log1(abc) Изменено 19 Октября 2015 пользователем FonSwong Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969863
Charsi 441 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 @FonSwong, оператор # применяется к индексированным массивам, а у тебя tbl_sos - ассоциативный. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969909
RayTwitty 559 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 (изменено) @FonSwong, если есть расширения RvP - используй функцию random для таблиц. Если нет, напиши сам - создай индексированный массив из ключей таблицы tbl_sos и выбери рандомный айди, а по нему уже получи значение из tbl_sos. Изменено 19 Октября 2015 пользователем RayTwitty Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969912
FonSwong 33 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 (изменено) Сделал просто через индексированный. Расширение RvP что это и с чем едят, объясните по простому, пожалуйста И как соорудить ассоциативный Изменено 19 Октября 2015 пользователем FonSwong Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/339/#findComment-969923
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти