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/
abramcumner 1 234 Опубликовано 9 Июня 2016 Поделиться Опубликовано 9 Июня 2016 (изменено) @Kober(BRUC), добавь после 12-й строки: local set_0 = "set_0" Человек хочет свое делать. А как он будет делать, если пока не понимает основ? Там же ещё ошибки есть.Ну это не решение. Решение - обойтись без этой строчки. А это просто подумать, что значит одна и та же строка в кавычках и без. А до конкатенации и приведения типов тут далеко. Тут хотя бы переменные отличать от констант, находить в коде вызовы функций и прочее. Книги и доки, я так понимаю, в данном случае не котируются, только грабли, шишки и кодирование наугад. Изменено 9 Июня 2016 пользователем abramcumner 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017086
Kober(BRUC) 99 Опубликовано 9 Июня 2016 Поделиться Опубликовано 9 Июня 2016 (изменено) Разберись, какие значения операндов Как я понял нужно всего навсего изменить set_0 на: "set_0" Изменено 9 Июня 2016 пользователем Kober(BRUC) 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017114
Nazgool 251 Опубликовано 9 Июня 2016 Поделиться Опубликовано 9 Июня 2016 (изменено) @Kober(BRUC), С одним разобрались ) Теперь смотри на это : vector():set(ps) и разберись что такое 'ps' Только не спеши. Мы все понимаем что ты хотел сделать, но получилось не так. Подсказка 2.5.7 - Конструкторы таблиц ... описание синтаксиса конструкторов: ... fieldsep ::= ',' | ';' если перевести 'fieldsep', то выйдет 'разделитель полей' таблицы. Т.е. либо запятая, либо точка с запятой. И теперь посмотри какие поля у тебя в таблицах 'set_0*' Изменено 9 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017146
Zander_driver 10 358 Опубликовано 9 Июня 2016 Поделиться Опубликовано 9 Июня 2016 Я бы еще обратил внимание, что из таблицы разных вариантов координат, по отдельности выбирается, гейм_вертекс, левел-вертекс, и позиция. Т.е. возможен случай когда для спавна будут выбраны например, гейм-вертекс из 3-го варианта, левел-вертекс из 1-го, а позиция из второго. Но так же нельзя делать) Точнее, это смысла не имеет. Координаты в сталкере - это взаимосвязь gv, lv, position. Таким образом не надо 3 раза дергать math.random, достаточно вызвать его 1 раз, выбрать один вариант из таблицы, и уже все параметры (lv, gv, pos) брать из этого варианта. А если хочется больше разнообразия то увеличивать число вариантов в таблице. О настоящем рандомном спавне тут пока речь вести рано) Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил. Я понял что моя старая подпись что-то нарушает. Удалил все ссылки. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017160
Nazgool 251 Опубликовано 9 Июня 2016 Поделиться Опубликовано 9 Июня 2016 (изменено) возможен случай когда для спавна будут выбраны например, гейм-вертекс из 3-го варианта, левел-вертекс из 1-го, а позиция из второго Об этом я хотел сказать чуть позже. После того как с основами построения таблиц и обращения к полям всё станет ясно. Ну чтобы не вываливать всё сразу. Изменено 9 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017169
_g.script 3 670 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 Господа модмейкеры, надеюсь на вашу помощь. После нескольких тщетных попыток всё же решил обратиться сюда. Вопрос в том, как определить тип патронов в стволе в текущий момент, для получения коэффициентов ттх. Всё это нужно для краткого инфо об оружии в виде сообщения. На всякий случай вот код, как его составил на данный момент, потребует ли он кардинальной правки? --------------------------------------------------------------------------------------------------------------------------" информация об оружии------------------------------------------------------------------------------------------------------------------------local time_update = 500local time_addlocal conditionlocal damagelocal velocitylocal dispersionfunction weapon_info()local time = time_global()if time_add == nil thentime_add = time_global() + time_updateendlocal active_slot = db.actor:active_item()if active_slot and db.actor:active_slot()==1 thenif time > time_add thentime_add = time_global() + time_updatelocal sect=db.actor:item_in_slot(1):section()local name = tostring(system_ini():r_string(sect,"inv_name_short"))local a=tonumber(system_ini():r_string(sect,"hit_power"))local b=tonumber(system_ini():r_string(sect,"bullet_speed"))local c=tonumber(system_ini():r_string(sect,"fire_dispersion_base"))local d=tonumber(system_ini():r_string(sect,"fire_dispersion_condition_factor"))damage=a*100velocity=bcondition=db.actor:item_in_slot(1):condition()dispersion=(c*100)*(1+(d*(1-condition)))local text = "\\n%c[0,0,255,255]Текущее оружие: \\n%c[255,160,160,160]"..game.translate_string(tostring(name)).."\\n%c[255,1,255,1]повреждение = "..game.translate_string(tostring(damage)).."\\n%c[255,1,255,1]скорость пули = "..game.translate_string(tostring(velocity)).."\\n%c[255,1,255,1]кучность = "..game.translate_string(tostring(dispersion)).."\\n%c[255,1,255,1]состояние = "..game.translate_string(tostring(condition))db.actor:give_game_news(text,"ui\\ui_IconsTotalKrot",Frect():set(0,48,83,47),50,10000)endtime_add = nilendif active_slot and db.actor:active_slot()==2 thenif time > time_add thentime_add = time_global() + time_updatelocal sect=db.actor:item_in_slot(2):section()local name = tostring(system_ini():r_string(sect,"inv_name_short"))local a=tonumber(system_ini():r_string(sect,"hit_power"))local b=tonumber(system_ini():r_string(sect,"bullet_speed"))local c=tonumber(system_ini():r_string(sect,"fire_dispersion_base"))local d=tonumber(system_ini():r_string(sect,"fire_dispersion_condition_factor"))damage=a*100velocity=bcondition=db.actor:item_in_slot(2):condition()dispersion=(c*100)*(1+(d*(1-condition)))local text = "\\n%c[0,0,255,255]Текущее оружие: \\n%c[255,160,160,160]"..game.translate_string(tostring(name)).."\\n%c[255,1,255,1]повреждение = "..game.translate_string(tostring(damage)).."\\n%c[255,1,255,1]скорость пули = "..game.translate_string(tostring(velocity)).."\\n%c[255,1,255,1]кучность = "..game.translate_string(tostring(dispersion)).."\\n%c[255,1,255,1]состояние = "..game.translate_string(tostring(condition))db.actor:give_game_news(text,"ui\\ui_IconsTotalKrot",Frect():set(0,0,83,47),50,10000)endtime_add = nilendend Здесь могла быть ваша реклама. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017177
Kober(BRUC) 99 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 @Nazgool, т.е. между "x" "y" "z" нужно поставить”;”, так как если будет запятая, то он выберет только "x". З.ы. я себя чувствую дураком... Как я сразу это не заметил составляя таблицу координат?.. @Zander_driver, а гейм-вертекс и левел-вертекс во всех четырех вариантах совпадают. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017188
abramcumner 1 234 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 @Kober(BRUC), прочитай уж доку наконец. Там разбирается пример один в один как у тебя. И нет, запятая и точка с запятой в конструкторах таблиц означают одно и тоже. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017202
Nazgool 251 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) @Kober(BRUC), Ты немного не понял. Я говорил посмотри какие поля у тебя в таблицах А про сепараторы - это было для того, чтобы ты понял как определить где же поля.Хорошо. Давай разбирать. Но прежде, как правильно сказал abramcumner, прочитай. Вот на русском http://www.lua.ru/doc/2.5.7.html set_01 = {lvid=261995, gvid=187, pos = -15.300880,5.824976,292.832062} Ищем разделители. У тебя это запятые (но могут быть и точки с запятой). Значит у тебя будет 5 полей : lvid=261995 gvid=187 pos = -15.300880 5.824976 292.832062 Ты уже почитал доки ( ) и знаешь, что поля записываются как пара "ключ=значение" Разберем эти поля: ключ | значение | -----|----------| lvid | 261995 | -----|----------| gvid | 187 | -----|----------| pos |-15.300880| -----|----------| | 5.824976 | -----|----------| |292.832060| ----------------- Как видишь в последних двух случаях ключи не указаны, но после прочтения доков ты моментально поймешь, что ключи будут инициализированы самой lua автоматически, по правилам индексированного массива. А именно: -----|----------| [1] | 5.824976 | -----|----------| [2] |292.832060| ----------------- А теперь повторюсь : разберись что такое 'ps' в выражении vector():set(ps) и с какими аргументами сколько аргументов передаются при вызове метода vector():set(...) Изменено 10 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017219
Kober(BRUC) 99 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) @Nazgool, то есть это должно выглядеть так: return alife():create(section, vector():set(ps,ps[1],ps[2]),lv,gv) --Около фермы Изменено 10 Июня 2016 пользователем Kober(BRUC) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017220
Nazgool 251 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) @Kober(BRUC), Уже теплее Итак, ты пишешь : ps[1],ps[2] Т.е. подразумеваешь, что 'ps' таблица, и получаешь значения полей [1] и [2]. А что же у тебя всё-таки 'ps'? Таблица или не таблица? Изменено 10 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017222
Kober(BRUC) 99 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 @Nazgool, скорее не таблица, а ее компонент. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017223
Nazgool 251 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) Нужно в доки добавить новое определение.Давай разбирать local ps = pos_tbl[set_0 .. math.random(1,4)]["pos"] Выходит, что 'ps' это значения поля таблицы 'pos_tbl[какая-то_рандомная]' с индексом ['pos']А что у тебя записано в этом поле? Скажем таблица 'pos_tbl[какая-то_рандомная]' это 'set_01' Изменено 10 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017227
Kober(BRUC) 99 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) @Nazgool, координаты, левел и гейм-вертексы Изменено 10 Июня 2016 пользователем Kober(BRUC) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017228
Nazgool 251 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) Одному ключу можно присвоить только одно значение. И как же то, что мы уже разобрали ? -----|----------| pos |-15.300880| -----|----------| И всё. В 'pos' записана только координата 'x'Значит и 'ps' будет иметь значение ..... какое? Изменено 10 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017232
Kober(BRUC) 99 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 @Nazgool, я когда говорил координаты я подразумевал ps - x; ps[1] - y; ps[2] - z. Но как я понял это не правильно. То есть нужно изменить таблицу на такую?: ... А вот на какую что бы, я со своими скудными познаниями смог вызвать из этой таблицы и "x", и "y", и "z", из этой строки вызывались сразу три: local ps = pos_tbl["set_0" .. math.random(1,4)]["pos"] --Position Значит нужно сделать так: local pos_tbl={ set_01 = {lvid=261995, gvid=187, pos = -15.300880, pos[1] = 5.824976, pos[2] = 292.832062}, set_02 = {lvid=261995, gvid=187, pos = -13.200880, pos[1] = 3.716976, pos[2] = 292.832062}, set_03 = {lvid=261995, gvid=187, pos = -11.400880, pos[1] = 1.908976, pos[2] = 292.832062}, set_04 = {lvid=261995, gvid=187, pos = -19.100880, pos[1] = 7.600976, pos[2] = 292.832062} } ... local ps = pos_tbl["set_0" .. math.random(1,4)]["pos"] --Position local ps[1] = pos_tbl["set_0" .. math.random(1,4)]["pos[1]"] --Position local ps[2] = pos_tbl["set_0" .. math.random(1,4)]["pos[2]"] --Position Но вот проблема тогда появляется. Тогда рандомно из всех четырех "set_0*" будет вызываться разные координаты "x", "y" и "z". Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017233
Nazgool 251 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) @Kober(BRUC), Ладно. Давай пойдем от обратного.Вот готовый вариант. Специально написал более развернуто, чтобы ты пошагово понимал что происходит local pos_tbl={ {lvid=261995, gvid=187, pos = {-15.300880,5.824976,292.832062}}, {lvid=261995, gvid=187, pos = {-13.200880,3.716976,292.832062}}, {lvid=261995, gvid=187, pos = {-11.400880,1.908976,292.832062}}, {lvid=261995, gvid=187, pos = {-19.100880,7.600976,292.832062}}, } function spawn_z_escape_1(section) local data = math.random(#pos_tbl) -- Один раз получить какую-то таблицу с координатами local lv = data.lvid --Левел вертекс local gv = data.gvid --Гэйм вертекс local pos = data.pos --Position - Это таблица с координатами x,y,z local x = pos[1] -- теперь уже из таблицы 'pos' получаем первое поле 'x' local y = pos[2] -- второе 'y' local z = pos[3] -- и наконец третье 'z' return alife():create(section, vector():set(x,y,z),lvid,gvid) --Около фермы end function r_zombie_1() spawn_z_escape_1("zombie_new_k_1") spawn_z_escape_1("zombie_new_k_1") end Изменено 10 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017238
Kober(BRUC) 99 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) @Nazgool, а у меня ведь была идея сделать из pos еще одну таблицу... Что я понял из вашего кода: 1) Вы гениальны. 2) благодаря этой строчке: local data = math.random(#pos_tbl) -- Один раз получить таблицу с координатами можно решить проблему вызова левел-вертексов, гейм-вертексов и координат x, y,z из разных set_0* 3) То что в вашем коде pos является таблицей, а pos[1] - x и т.д. Изменено 10 Июня 2016 пользователем Kober(BRUC) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017239
Nazgool 251 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) Даже не знаю как и отреагировать.@Kober(BRUC), Почитай доки. Там написано ровно столько, чтобы все стали гениальны Это код не окончательный, а только для разъяснения.Окончательный выглядит несколько иначе, т.к. ещё не всё разобрали. Изменено 10 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017241
Kober(BRUC) 99 Опубликовано 10 Июня 2016 Поделиться Опубликовано 10 Июня 2016 (изменено) @Nazgool, а чем же окончательный отличается? Вроде бы и этот прекрасно должен работать. Я кажется понял отличие. Нет числа рандомного спавна. Точнее от сколки и до сколки зомби заспавнятся. Изменено 10 Июня 2016 пользователем Kober(BRUC) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/372/#findComment-1017244
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти