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/
Colder 12 Опубликовано 15 Февраля 2023 Поделиться Опубликовано 15 Февраля 2023 (изменено) Подскажите в чем проблема? Имею такую функцию: Скрытый текст function spawn_meat(victim, who) local meat_position = victim:position() local meat_direction = victim:direction() meat_direction = vector_rotate_y(meat_direction, math.random(-180, 180)) meat_position.x = meat_position.x + meat_direction.x * random_float(0.5, 0.7) meat_position.y = meat_position.y + meat_direction.y + 1 meat_position.z = meat_position.z + meat_direction.z * random_float(0.5, 0.7) local monster_meat = monster_to_meat[victim:clsid()] for i = 1, math.random(1,3) do alife():create(monster_meat, meat_position, victim:level_vertex_id(), victim:game_vertex_id()) end end Спавн itema по кругу трупа мутантов. Но они спавняться в одно стопке. в чем проблема? https://disk.yandex.ru/i/-miHtOu9MKTVhA Изменено 15 Февраля 2023 пользователем Colder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1451087
Chypakabra 799 Опубликовано 15 Февраля 2023 Поделиться Опубликовано 15 Февраля 2023 4 часа назад, Colder сказал: for i = 1, math.random(1,3) do эту строчку перенеси в самое начало функции 1 Личный архив по играм Архив по Trilogy EE Скрипт гладкого интерфейса AMK-Team Файлы BFG Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1451107
Colder 12 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 Как правильно прочитат рандомно название оружия или где то можно подсмотреть? Пробовал так: Скрытый текст local weapon_classes = { [clsid.wpn_svu] = true, [clsid.wpn_svu_s] = true, [clsid.wpn_usp45] = true, [clsid.wpn_usp45_s] = true, [clsid.wpn_val] = true, [clsid.wpn_val_s] = true, [clsid.wpn_vintorez] = true, [clsid.wpn_vintorez_s] = true, [clsid.wpn_walther] = true, [clsid.wpn_walther_s] = true } function irWeapon(object, class_id) local id = class_id or get_clsid(object) return id and weapon_classes[id] end function show_news() if irWeapon(item) then local name = system_ini():r_string(item:section(), "inv_name") local n = name[math.random(#name)] local ww = gts(n) local news_text = "%c[ui_gray_1]".. ww db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000) end end но ничего не приходит. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452433
WinCap 323 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 1 час назад, Colder сказал: ничего не приходит. Может так: function show_news(item) 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452441
Colder 12 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 @WinCap Нет. Не помогло. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452444
WinCap 323 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 50 минут назад, Colder сказал: Не помогло. Ладно... Пойдем длинным путём... В функции show_news переменная item откуда берётся? S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452451
Colder 12 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 (изменено) @WinCap повесил на on_trade(item, sell_bye, money) Изменено 2 Марта 2023 пользователем Colder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452452
_g.script 3 669 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 2 часа назад, Colder сказал: Как правильно прочитат рандомно название оружия Вообще не понял... Может, стоит для начала рандомно определить оружие? Здесь могла быть ваша реклама. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452453
Zander_driver 10 348 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 20 минут назад, mole venomous сказал: Может, стоит для начала Адекватно сформулировать вопрос Чтобы хотя бы было понятно, чего хочется достичь, и откуда что берется на данный момент. 3 часа назад, Colder сказал: local n = name[math.random(#name)] local ww = gts(n) Я что-то не припоминаю чтобы для строк в Lua применялся оператор #. Что тут должно получиться, одна рандомная буква из названия? Загадочная функция gts не приведена. Судя по тому что оно не вылетает на #строка, подозреваю что функция show_news с заключенным в ней блоком вообще не вызывается. 3 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452458
Norman Eisenherz 354 Опубликовано 2 Марта 2023 Поделиться Опубликовано 2 Марта 2023 4 hours ago, Zander_driver said: чтобы для строк в Lua применялся оператор # Длина строки успешно читается… Есть какие-то особые случаи? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452484
Zander_driver 10 348 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 7 часов назад, Norman Eisenherz сказал: особые случаи? string.len Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452494
Norman Eisenherz 354 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 В каких случаях #str даст результат, отличный от string.len(str)? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452495
Kirgudu 1 342 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 Оператор #, кстати, вполне успешно вернёт длину строки, но это ничему не поможет. Предположим, что загадочная функция gts - это game.translate_string. Предположим даже, что функция show_news действительно вызывается, но тогда непонятно, как в неё передаётся переменная item, ведь show_news объявлена за пределами on_trade, а область видимости переменной item - внутри on_trade. Скорее всего, как писали выше, передавать item в функцию таки необходимо. Но и это ещё не всё. local name = system_ini():r_string(item:section(), "inv_name") - здесь переменной name присвоится строка. Одна строка. #name отработает и даст длину, math.random(#name) - случайный индекс в пределах длины строки. Однако name[math.random(#name)] вернёт nil, поскольку получить один символ из строки посредством обращения к индексу в Lua нельзя - у символов в строках просто нет индекса. Для этого необходимо использовать функцию string.sub. Но даже если бы удалось получить символ, то после применения загадочной local ww = gts(n) в переменную ww попадёт ровно тот же символ без всякого перевода. Ибо вряд ли в xml с текстами найдутся записи, идентификаторами которых служат одиночные символы латинского алфавита... 2 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452513
Colder 12 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 (изменено) @Kirgudu Скрытый текст local gts = game.translate_string local weapon_classes = { [clsid.wpn_svu] = true, [clsid.wpn_svu_s] = true, [clsid.wpn_usp45] = true, [clsid.wpn_usp45_s] = true, [clsid.wpn_val] = true, [clsid.wpn_val_s] = true, [clsid.wpn_vintorez] = true, [clsid.wpn_vintorez_s] = true, [clsid.wpn_walther] = true, [clsid.wpn_walther_s] = true } function irWeapon(object, class_id) local id = class_id or get_clsid(object) return id and weapon_classes[id] end function show_news(item) if irWeapon(item) then local name = system_ini():r_string(item:section(), "inv_name") local n = name[math.random(#name)] local ww = gts(n) local news_text = "%c[ui_gray_1]".. ww db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000) end end Вызываю с ui_main_menu по кнопке Можно было сделать так : Скрытый текст function show_news() local where_trade = txr_utils.collect_translations("st_dyn_news_lvl_",true) if (not where_trade) then return false end local wt = where_trade[math.random(#where_trade)] local news_text = "%c[ui_gray_1]".. wt db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000) end txr_utils: local cache_translated = {} local cache_untranslated = {} local string_find = string.find function collect_translations(st, is_translated) if is_translated and cache_translated[st] then return cache_translated[st] elseif cache_untranslated[st] then return cache_untranslated[st] end local string_count = 1 local tr_t = {} while true do local tr_s = game.translate_string(st .. string_count) if (tr_s == st .. string_count) then break else if is_translated then tr_t[#tr_t + 1] = tr_s else tr_t[#tr_t + 1] = st .. tostring(string_count) end end string_count = string_count + 1 end if (#tr_t == 0) then if (not string_find(st,"st_msg")) then printf("! WARNING: collect_translations | strings of (%s) don't exist!", st) end return false end if is_translated then cache_translated[st] = tr_t else cache_untranslated[st] = tr_t end return tr_t end Но это не решает проблему, ведь он будет читать строку в виде ...._1, ..._2 и т.д. А мне нужны имена оружий. Ну не писать же длинющий список: local where_trade = { "ПМ", "ПБ", и т.д } Я так понимаю это не реализовать? Изменено 3 Марта 2023 пользователем Colder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452515
Kirgudu 1 342 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 (изменено) @Colder Вот поэтому и стоит для начала сделать то, о чём писали выше: 19 часов назад, mole venomous сказал: Вообще не понял... Может, стоит для начала рандомно определить оружие? Нужно получить список имён оружия и вывести его в новости. Какого оружия, где? В слоте? В инвентаре? На уровне? Вообще любого в игре? Передаваемого покупателю/продавцу (если отталкиваться от on_trade? Если берёшь в работу один единственный предмет, который передаётся в параметр item функции on_trade, то о каких множественных строках, перебор которых ты хочешь сделать, может идти речь? И т. д. Цель непонятна, условия непонятны, а гадать, что именно требуется сделать, - неблагодарное занятие. Изменено 3 Марта 2023 пользователем Kirgudu 2 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452520
Colder 12 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 @Kirgudu 7 минут назад, Kirgudu сказал: Вообще любого в игре? Именно Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452521
Kirgudu 1 342 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 (изменено) Перебирает все предметы в игре (на всех локациях), помещает уникальные записи оружия в таблицу, затем выводит в новость случайное название из этой таблицы: local weapon_names, weapon_sections, cnt, sini, al = {}, {}, 0, system_ini(), alife() for i=1, 65535 do local obj = al:object(i) if obj and isWeapon(obj) then local section = obj.section_name and obj:section_name() if section and (not weapon_names[section]) and sini:section_exist(section) and sini:line_exist(section, "inv_name") then local name = sini:r_string(section, "inv_name") weapon_names[section] = name table.insert(weapon_sections, section) cnt = cnt + 1 end end end if cnt > 0 then local news_text = "%c[ui_gray_1]"..game.translate_string(weapon_names[weapon_sections[math.random(cnt)]]) db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000) end Вот только затратная это штука благодаря перебору. Куда проще было бы пройтись по всем конфигам и вычитать из них секции с оружием по какому-то признаку, но я так никогда не делал, не могу подсказать способ. Изменено 3 Марта 2023 пользователем Kirgudu 1 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452524
Norman Eisenherz 354 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 10 hours ago, Kirgudu said: пройтись по всем конфигам и вычитать из них секции с оружием Сходная задача: надо получить все входящие секции из конфига [weapons.ltx]. Перебор через line_count + r_line требует указания общей секции "list", которой в этом конфиге нет. Версия игры – ТЧ 1.0006, библиотека io. недоступна. Какое есть решение? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452604
Это популярное сообщение. Zander_driver 10 348 Опубликовано 3 Марта 2023 Это популярное сообщение. Поделиться Опубликовано 3 Марта 2023 32 минуты назад, Norman Eisenherz сказал: библиотека io. недоступна. Какое есть решение? Не мучиться для подобных задач костылями на базе оригинального игрового движка и/или работающих из-под него Луа-скриптов. Они НЕ подходят для подобных задач. Я для таких и сходных задач, использовал решение путем: 0) Берем все файлы конфигов, скриптов, (а в моем случае и код движка), и закидываем в базу данных. 1) Далее путем нехитрой оболочки API на языке php, 2) И столь же нехитрой обвязки скриптами javaScript 4) Получаем в web-интерфейсе на локалке или на своем хостинге, в пару кликов выше-упомянутую или любую другую подобную информацию, по конфигам, скриптам и движку своего мода. Плюсы - как уже говорилось куча всего в духе выше-упомянутого но не только, доступна в пару-тройку кликов. В принципе вам доступна любая мыслимая аналитика ваших скриптов и конфигов (и движка) по щелчку пальца. Кроме того, если использовать свой сервер, то доступна она не только с вашего модостроительного ПК, но и с планшета/смартфона. Минусы - Для редактирования под свои нужды, надо понимать SQL, php, javaScript. А вовсе никакой не Луа. И я так понимаю, что за такие минусы здесь меня сейчас тухлыми помидорами наверное закидают, да? Или нет? ЗЫ. Мораль сей басни - для некоторых вещей и некоторых задач, разумнее оторваться взглядом от сталкера и осмотреться по другим технологиям. Авось найдется что-то намного более подходящее для того что вы хотите. P.P.S. Если тут кто-нибудь проявит позитивный интерес к такому инструменту. Готов выложить все исходники... Если хоть кому-то оно надо. 3 3 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452605
UriZzz 1 004 Опубликовано 4 Марта 2023 Поделиться Опубликовано 4 Марта 2023 (изменено) 4 часа назад, Zander_driver сказал: И я так понимаю, что за такие минусы здесь меня сейчас тухлыми помидорами наверное закидают, да? Или нет? За что тебя тухлыми яйцами закидывать? СУБД вообще норм штука, сам пользую postgres на дому. Правда без php морды. Изменено 4 Марта 2023 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/597/#findComment-1452613
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти