Это популярное сообщение. Zander_driver 10 333 Опубликовано 21 Августа 2015 Это популярное сообщение. Поделиться Опубликовано 21 Августа 2015 (изменено) Раньше в этой теме находились всякие полезности. Соответствующие определенным правилам и требованиям, которые были указаны в шапке. Но т.к. со временем в тему стали постить материалы не соответствующие этим требованиям - шапка более не имеет смысла. В старых постах еще может быть что-то полезное, в новых по всей видимости - вряд ли. Изменено 1 Декабря 2021 пользователем Zander_driver Привел в соответствие современным реалиям. 2 4 4 12 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Graff46 598 Опубликовано 5 Октября 2017 Поделиться Опубликовано 5 Октября 2017 (изменено) У меня вопрос по m_netpk.script. Когда устанавливаю дирекшн машин, то вроде оси сбиваются (вращать машинку по плоскости террейна это ось z). Это косяк скрипта, машин или вообще не косяк? И еще, когда вывожу через pk:dumpDesc() содержание пакетов объекта, то ни позишн, ни дирекшена там нет, но в скрипте работают... Изменено 5 Октября 2017 пользователем Graff46 Ссылка на комментарий
dsh 3 824 Опубликовано 5 Октября 2017 Поделиться Опубликовано 5 Октября 2017 @Graff46 почему Z, Y же? Вокруг вертикальной оси вращать нужно, т.е. в горизонтальной плоскости? 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
7.9 174 Опубликовано 6 Октября 2017 Поделиться Опубликовано 6 Октября 2017 11 часов назад, Graff46 сказал: (вращать машинку по плоскости террейна это ось z). Это косяк скрипта, машин или вообще не косяк? Это разница между "по" и "вокруг". Вращать по Х - это когда точка движется ПО плоскости X, соответственно ВОКРУГ оси Z. всё легко Ссылка на комментарий
Graff46 598 Опубликовано 6 Октября 2017 Поделиться Опубликовано 6 Октября 2017 1 минуту назад, 7.9 сказал: это когда точка движется ПО плоскости X По поверхности террейна Ссылка на комментарий
Graff46 598 Опубликовано 24 Октября 2017 Поделиться Опубликовано 24 Октября 2017 (изменено) Псевдо JSON для Cталкера, будет использован в новой логике для машин. Автор я. function jsn_wr (a) -- Псевдо джейсон a = a:gsub('%s+','') local b,c, e for b,c in a:gmatch('([:])(%S)') do if c~='{' and c~='[' then a = a:gsub(b..c, string.format('%s"%s',b,c)) end end for b,c in a:gmatch('([:]["]%S-)(%p)') do a = a:gsub(b..c, string.format('%s"%s',b,c)) end a=a:gsub('[[]','{') a=a:gsub('[]]','}') a=a:gsub(':','=') return loadstring ('return'..a)() end Работает, проверено, но с расширением Lua до 5.1, как на родном пойдёт - не знаю, смущает loadstring() Принимает строку JSON без кавычек (синтаксис объектов в JS), выдаёт таблицу... Пример строки: local str = '{aa: {gh :fg,tt:{gg:jj}},zz:xx}' Изменено 24 Октября 2017 пользователем Graff46 1 Ссылка на комментарий
Graff46 598 Опубликовано 24 Октября 2017 Поделиться Опубликовано 24 Октября 2017 (изменено) 13 часов назад, Graff46 сказал: Псевдо JSON для Cталкера Исправленный и дополненный код Скрытый текст function jsn_wr (a) a = a:gsub('%s+','') local b,c, e for b,c in a:gmatch('([:])(%S)') do if c~='{' and c~='[' then a = a:gsub(b..c, string.format('%s"%s',b,c)) end end for b,c in a:gmatch('[[].*([%S])([,]).*[]]') do if b~='}' and b~=']' then a = a:gsub(b..c, string.format('%s"%s"',b,c)) end end for b,c in a:gmatch('(%S)([]])') do if b~='}' and b~=']' then a = a:gsub(b..c, string.format('%s"%s',b,c)) end end for b,c in a:gmatch('([[])(%S)') do if c~='}' and c~=']' then a = a:gsub(string.format('[%s]%s', b,c), string.format('%s"%s',b,c)) end end for b,c in a:gmatch('([:]["]%S-)(%p)') do a = a:gsub(b..c, string.format('%s"%s',b,c)) end a=a:gsub('[[]','{') a=a:gsub('[]]','}') a=a:gsub(':','=') return loadstring ('return'..a)() end Изменено 24 Октября 2017 пользователем Graff46 Ссылка на комментарий
НаноБот 742 Опубликовано 3 Января 2018 Поделиться Опубликовано 3 Января 2018 (изменено) Командное меню.https://yadi.sk/d/JaMDyEHy3RCEHs Используется для управление напарниками, нанокостюмом, хенами и так далее. Управление в игре: Нажмите клавишу вызова конкретного меню, далее выберете номер команды цифрами на основной клавиатуре. Повторное нажатие на клавишу открытия меню, закрывает меню без вызова команды. Управление сходно с движковым меню. В скритах номера меню и команд задаётся от 1. Так же можно задать озвучку команды, по легенде ГГ даёт команды напарникам именно по радио голосом, через радиогарнитуру, которую используют СпН. Как подключить?, смотрите в файле Подключения.txt Изменено 4 Января 2018 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Ссылка на комментарий
Graff46 598 Опубликовано 24 Января 2018 Поделиться Опубликовано 24 Января 2018 (изменено) Оставлю это тут. Функция для xr_effects.script, Вам не нужно больше писать ф-ции именно в xr_effects.script, теперь из логики можно вызывать любые ф-ции из любых скриптов, но переданы могут быть этим ф-циям только 3 значения, это клиентский актор, клиентский НПС от которого вызвали, и таблица с числами и (или) строками которые можно задать в логике. Листинг: function myfunc_exec (actor, npc, p) _G[p[1]] [p[2]] (actor, npc, p[3] or 0) end Пример логики: [smart_terrains] none = true [logic] active = remark [remark] on_info = {+my_infoporshen} nil %=myfunc_exec(escape_task:myFuncName:param1:1986)% ; escape_task - имя скрипта ; myFuncName - имя функции ; param1 и 1986 - параметры(только строки и числа(возможно булев тип будет работать) ) которые будут переданы в ф-цию в таблице после объектов НПС и ГГ (3-й аргумент). Изменено 24 Января 2018 пользователем Graff46 Ссылка на комментарий
dsh 3 824 Опубликовано 24 Января 2018 Поделиться Опубликовано 24 Января 2018 Жуткий велосипед. Полезнее xr_logic.script научить распарсивать полные имена функций, с учетом имени скрипта. Я бы показал это, но у меня нет этого в виде отдельного изменения. А так, тут можно посмотреть, например https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/xr/xr_logic.script 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Graff46 598 Опубликовано 24 Января 2018 Поделиться Опубликовано 24 Января 2018 (изменено) Только что, dsh сказал: Жуткий велосипед. Я вызываю ф-цию по её имени полученной из строки через глобальное пространство _G, это вполне закономерно. Имена скриптов и ф-ций + параметры, передаю ИХ методами (разрабов), как эл-ты массива. Где тут велосипед - не знаю. Даже если велосипед, то он не плохо так ездит и выручает где-то год. Только что, dsh сказал: распарсивать полные имена функций, с учетом имени скрипта. Я не понял, либо я плохой кодер либо чего-то недогоняю.... Изменено 24 Января 2018 пользователем Graff46 Ссылка на комментарий
dsh 3 824 Опубликовано 24 Января 2018 Поделиться Опубликовано 24 Января 2018 @Graff46 зачем делать вот так "=myfunc_exec(escape_task:myFuncName:param1:1986)", если можно делать "=escape_task.myFuncName(param1:1986)" Вот что я имел ввиду, что полезнее xr_logic.script этому научить. И прекратите уже говорить "кодер" и прости господи "скриптер". Не бывает таких существ. Есть программисты, разработчики, софтверные инженеры. Но из кодеров я знаю только быдлокодеров. Что-то я разбурчался. 3 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Graff46 598 Опубликовано 24 Января 2018 Поделиться Опубликовано 24 Января 2018 Только что, dsh сказал: =escape_task.myFuncName(param1:1986) Не, ну можно конечно так, но стоит ли. П.С. Я попробую может быть так сделать. Ссылка на комментарий
Graff46 598 Опубликовано 24 Января 2018 Поделиться Опубликовано 24 Января 2018 Только что, Graff46 сказал: Я попробую может быть так сделать. Заменить в xr_logic.script функцию pick_section_from_condlist на эту: Скрытый текст function pick_section_from_condlist(actor, npc, condlist) local rval = nil -- math.random(100) --printf("_bp: pick_section_from_condlist: rval = %d", rval) local newsect = nil local infop_conditions_met for n, cond in pairs(condlist) do infop_conditions_met = true -- изначально считаем, что все условия переключения удовлетворены for inum, infop in pairs(cond.infop_check) do if infop.prob then if not rval then rval = math.random(100) end if infop.prob < rval then infop_conditions_met = false -- инфопоршен есть, но он не должен присутствовать break end elseif infop.func then --printf("_bp: infop.func = %s", infop.func) if not xr_conditions[infop.func] then abort("object '%s': pick_section_from_condlist: function '%s' is " .. "not defined in xr_conditions.script", npc:name(), infop.func) end --if xr_conditions[infop.func](actor, npc) then if infop.params then if xr_conditions[infop.func](actor, npc, infop.params) then if not infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end else if infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end end else if xr_conditions[infop.func](actor, npc) then if not infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end else if infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end end end elseif has_alife_info(infop.name) then if not infop.required then --'printf("FAILED: actor has infop '%s', which is NOT needed [%s]", infop.name, tostring(has_alife_info(infop.name))) infop_conditions_met = false -- инфопоршен есть, но он не должен присутствовать break else --'printf("PASSED: actor has infop '%s', which is needed [%s]", infop.name, tostring(has_alife_info(infop.name))) end else if infop.required then --'printf("FAILED: actor has NO infop '%s', which is needed [%s]", infop.name, tostring(has_alife_info(infop.name))) infop_conditions_met = false -- инфопоршена нет, но он нужен break else --'printf("PASSED: actor has NO infop '%s', which is not needed [%s]", infop.name, tostring(has_alife_info(infop.name))) end end end --printf("_bp: infop_cond_met = %s", utils.to_str(infop_conditions_met)) if infop_conditions_met then -- Условия выполнены. Независимо от того, задана ли секция, нужно проставить требуемые -- infoportions: for inum, infop in pairs(cond.infop_set) do if db.actor == nil then abort("TRYING TO SET INFOS THEN ACTOR IS NIL") end if infop.func then --[[if not xr_effects[infop.func] then abort("object '%s': pick_section_from_condlist: function '%s' is " .. "not defined in xr_effects.script", if_then_else(npc, npc:name(), "nil"), infop.func) end]] local spc, fname = 'xr_effects', infop.func if string.find(infop.func, '[.]') or -1 > 1 then spc, fname = string.match(infop.func, '(.+)[.]([^()]+)') end _G[spc][fname](actor, npc, infop.params or nil) elseif infop.required then if not has_alife_info(infop.name) then actor:give_info_portion(infop.name) end else if has_alife_info(infop.name) then actor:disable_info_portion(infop.name) end end end if cond.section == "never" then return nil else return cond.section end end end --printf("_bp: pick_section_from_condlist: nil") return nil end Я у себя потестил - вроде работает. В логике вызывать в таком виде: %=имяСкрипта.имяФункции(парам1:парам2)% 1 Ссылка на комментарий
Kirgudu 1 208 Опубликовано 25 Января 2018 Поделиться Опубликовано 25 Января 2018 (изменено) @Graff46 только я б либо оставил аборт с выводом в лог, как он был в оригинале (а также добавил проверку наличия распарсенной функции, и туда тоже аборт), либо убрал аборт во всей функции pick_section_from_condlist (если ты в принципе от них избавляешься и потому как вылет и без аборта будет на отсутствующих функциях). Ну и ещё в _G[spc][fname](actor, npc, infop.params or nil) "or nil" - лишнее, так как там и без того либо таблица, либо nil. Upd: раз здесь "сборочный цех", будет неплохо представить исправленные функции для всех трёх частей игры, так как они хоть и незначительно, но емнип отличаются. Изменено 25 Января 2018 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
Graff46 598 Опубликовано 25 Января 2018 Поделиться Опубликовано 25 Января 2018 Только что, Kirgudu сказал: будет неплохо представить исправленные функции для всех трёх частей игры У меня нет ничего кроме ТЧ сейчас + днями пишу свой мод, идею подал, а там смотрите. пишите.... Ссылка на комментарий
Graff46 598 Опубликовано 31 Марта 2018 Поделиться Опубликовано 31 Марта 2018 (изменено) Как можно получить нэт-пакет net_cse_abstract, если класс объекта не перегружен в class_registrator.script? Я пробовал через obj:STATE_Write(packet), пакет получаю, но net_cse_abstract не извлекается... И вообще можно ли менять позицию и поворот объекта, если его класс не перегружен в class_registrator.script? Изменено 31 Марта 2018 пользователем Graff46 Ссылка на комментарий
Graff46 598 Опубликовано 5 Апреля 2018 Поделиться Опубликовано 5 Апреля 2018 (изменено) Ф-ция для записи в файл "свободных" story_id. Написано под ТЧ, можно доработать для ЗП (добавить сканирование по спавн-секциям) Код: Скрытый текст function wr_free_sids() local obj, gini = false, game_ini() for i=1,65534,1 do obj = alife():story_object(i) if not obj then if gini:line_exist("story_ids", tostring(i)) then nt.logfile(string.format("In_list as: %s > %d", gini:r_string("story_ids", tostring(i)), i), "free_sids.txt") else nt.logfile(string.format("Free: %d", i), "free_sids.txt") end else nt.logfile(string.format("%s > %s", tostring(obj:name()), i), "free_sids.txt") end end end Для функции nt.logfile - Нужен модуль nt.script, это скриптовый модуль из мода "Новое время". Если Вы не хотите устанавливать модуль, то вот ф-ция: Скрытый текст function logfile (lgtext, fname) -- запись текста в файл lgtext = tostring(lgtext) local file = getFS():update_path("$game_data$", fname or "mylog.txt") f = io.open(file,"r") -- Пытается открыть файл в режиме "чтения/записи" if f == nil then -- Если файл не существует f = io.open(file,"w") -- Создает файл в режиме "записи" if f then f:close();-- Закрывает файл f = io.open(file,"a")-- Открывает уже существующий файл в режиме "чтения/записи" end end f = io.open(file,"a") if f then f:write(lgtext.."\n") f:flush() f:close() end end Для работы этого всего нужно что бы у LUA игры были открыты области видимости: io, file! Для этого можно скачать расширения Lua от разных авторов или такой функционал может быть у модифицированных движков. Файл с результатами (free_sids.txt) будет в папке gamedata. Строка вида: Free > [Story_Id] - свободный Сид - под сидом нет объекта на момент сканирования, строка вида: In_list as: [СекцияИзStory_ids.ltx] > [Story_Id] - свободный Сид, но отмечены секцией в файле story_ids.ltx, строка вида: [СекцияИзStory_ids.ltx] > [Story_Id] - Занятый Сид (под сидом есть объект на момент сканирования). Изменено 5 Апреля 2018 пользователем Graff46 1 1 Ссылка на комментарий
AndreySol 215 Опубликовано 6 Апреля 2018 Поделиться Опубликовано 6 Апреля 2018 19 часов назад, Graff46 сказал: Ф-ция для записи в файл "свободных" story_id. Я как-то решил задействовать свободное значение в [story_ids] - 20(чистая ТЧ). Получил вылет, по дублированию, оказалось, что в all.spawn'е это значение было занято, чисто в цифровом виде, без сета в вышеозначенном конфиге... Как-то так. Ссылка на комментарий
Graff46 598 Опубликовано 7 Апреля 2018 Поделиться Опубликовано 7 Апреля 2018 @AndreySol У меня в посте не просто так написано: "на момент сканирования". Ссылка на комментарий
Graff46 598 Опубликовано 12 Июня 2018 Поделиться Опубликовано 12 Июня 2018 (изменено) Не давно, с момента написания данного поста, я спорил на форуме, о том что код распарсивания строк условий переключения схем логики, достаточно громоздкий и и ресурсозатратный. Сейчас я опубликую новую систему, алгоритм достаточно специфичный, требуются тесты. Внимание! Старые схемы логики работать не будут! Вам нужно создать только своих НПС с логикой по новому стандарту. Скрытый текст Изменения касаются только полей переключателей(on_info, on_timer, on_actor_dist_le и тд...) Значением поля переключателя должна быть LUA таблица, в которой 1-е поле - это данные для переключателя (для on_timer это чило микросекунд, для on_actor_dist_le - это расстояние... Для on_info это поле пропускаем! ) 2-е поле (Для on_info 1-е) - это условия переключения, любые LUA типы (ф-ции, булёвы и тд соединенные логическими операторами, но будьте осторожны: если в этом поле 1 ф-ция и она возвращает таблицу - парсер может принять эту таблицу за вложенную! Что-бы этого избежать достаточно ф-цию логически умножить с true ( fname(param) and true )), в окружении доступна переменная npc, содержащая клиентский объект "обрабатываемого" НПС. Тут же можем указать условия присутвия или отсутствия инфопорней: Для обозначения "нужного" инфопоршня его нужно написать как строку(в кавычках) и прибавить к чему либо, к чему хотите (к предыдущему объекту или числу) (0+"infoporshn" +"infoporshn2", func() +"infoporshn3"). Отсутствие инфопоршня - пишем инфо-нь как строку с минусом перед строкой (не отнимаем строку, а с минусом, как у отрицательных чисел)! Это поле обязательное! Если хотите переход без условия, то напишите в поле true. 3-е поле (Для on_info 2-е) - это имя секции, это строка - пишем в "кавычках", 'в любых' [[любых]]. Вы можете пропустить это поле и вам за это ничего не будет. Далее можем делать сколько угодно полей (*хвост), где каждое поле это ф-ция или инфопоршни которая(ый) вызовется при выполнении всех условий. Выдача и удаление инфопоршней делается прибавлением строки и унарным минусом (описано выше, только теперь выдаём и удаляем инфопрошни) А если мы хотим несколько условий со своими секциями и эффектами? Для этого есть вложенные таблицы, каждая таблица оформляется по правилам которые описаны выше. Вкладывать таблицы во вложенные нельзя, т. е. вкладываем 1 раз! Вложенные таблицы должны идти в родительской таблице друг за другом, допускается после всх вложенных таблиц, в родительской таблице создать параметры для переключения. Эффекты: - Это ф-ции вызываемые при выполнении условия (и) или инфопоршни выдаваемые или удаляемые. Инфопоршни Добавляются актору и удаляются от него-же. Ф-ции пишутся относительно глобального окружения _G ( нужно писать полный "путь" - стек (xr_effects.myfunc() )! Перед стеком нужно написать " e. "! Указание ф-ции по имени myreward из скрипта escape_task будет выглядеть так: e.myreward.escape_task() В ф-ции эффектов неявно 1-ым параметром передается клиентский объект НПС, (в ф-ции условий само ничего не передаётся!) Количество элементов в стеке не ограничено, элементы стека связаны точкой, если вы вызываете метод с неявной передачей 1-го параметра (когда пишем двоеточие, например: mystring:match('%w+')), то нужно 1-й параметр явно передать, причем параметр должен быть указан относительно _G, в реализации этот параметр будет доступен из второго аргумента (будет таблицей) в качесве первого поля таблицы. Параметров у ф-ции эффекта может быть указано сколько угодно, эти параметры скомпануются в таблицу и эта таблица будет доступна 2-м параметром в реализации (1-й параметр это НПС). Пример: [logic] active = remark@1 [remark@1] on_timer = {5000,{0+'infop1', "remark@2", e.xr_ffects.main(npc)}, {xr_condition.cond(npc), -'infop2', e.myscript.myclass.method(myscript.myclass, npc)}, fname(npc)+'infop3', "remark@3"} [remark@2] [remark@3] Версия очень сырая, выкладываю для тестов, в скриптах есть 2 вида перебора переключателей, по таблице и по условиям. Возможно есть решения улучшить код. Хотелось бы узнать падение\прирост производительности... Есть возможность заменить унарный минус строк для инфопоршней на разность, для аналогии со сложением. Версия под ТЧ Гибкая версия. Сама распознает старые переключатели и новые. Ссылка Изменено 12 Июня 2018 пользователем Graff46 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти