Graff46 598 Опубликовано 8 Апреля 2017 Скриптовый модуль из мода "Новое Время".Кроме давно известных и банальных вещей содержит скриптовую систему заменяющую стандартный story_id. Подробнее в файле. Никаких адаптаций и подключений не требует. Для функцианирования некоторых плюшек могут понадобится: расширения LUA открывающие пространства имен io, os(копирование файлов), X-Ray extensions(спавн со story_id). (Для аналога story_id дополнительные правки не нужны).Ссылка.Использовать везде с указанием автора. 1 1 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 10 Мая 2017 Какой сейчас самый юзабельный скрипт для нэт-пакетов? Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 10 Мая 2017 @Kirgudu, Я пытался работать с m_netpk, но что то не заладилось, работаю с xrs_utils.script. А вообще в многих модулях для работы требуется отдельный LTX файл, в котором записаны классы объектов. Я нашел способ изменить class_registrator.script и читать классы из него, и если моддер добавляет свои объекты\классы, то нет необходимости возиться еще с LTX. Вот и хочу узнать на какой скрипт лучше свою фитчу навесить... Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 10 Мая 2017 :getString() возвращает пустую строку.А в каком виде кастом дэйта может быть кроме ини? Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 10 Мая 2017 @dsh, А если логика? [logic] active = remark [remark] anim = guard meet = default_meet Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 11 Мая 2017 а вот это как раз и есть формат ini,А как будет выглядеть логика в виде 1 строки, таблицы? Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 12 Мая 2017 ТаблицаЯ не знал о таком методе даже! Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 12 Мая 2017 (изменено) @Kirgudu, Объекты\классы также из ЛТХ файла читаются? Изменено 12 Мая 2017 пользователем Graff46 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 17 Августа 2017 Из тутора по m_netpk для работы с "абстрактными" пакетами: 3) В метод STATE_Write (см. выше) добавить строку: function se_outfit:STATE_Write(packet) if self.cb_netpk then self.cb_netpk(self, packet) end -- коллбэк для изменения свойств пакета cse_alife_item_custom_outfit.STATE_Write(self, packet) end Как я понял мы пишем состояние объекта в его же пакет. Если так, то зачем? У только созданного объекта "абстрактный" пакет пуст и мы его заполняем "вручную"? Если объект подергать по оффлайнам и онлайнам "абстрактный" пакет "соберётся"? Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 22 Августа 2017 (изменено) Вот пара функций к m_netpk.script Скрытый текст function myspawn (sct_obj, pos, lv, gv) -- имя секции объекта; позиция спавна (готовым вектором); левел вертекс; гейм вертекс local sobj = alife():create(sct_obj, pos, lv, gv) local pk = m_netpk.get(sobj) local data, sini, abs_tbl, abs_flag = pk:get(), system_ini(), {}, false local out_tbl = {} if sini:section_exist(sct_obj) and pk:isOk() then get_console():execute("ok") for i=1, sini:line_count(sct_obj) do local all_line, key, value = sini:r_line(sct_obj,i,"","") --get_console():execute(tostring(all_line).."__"..key.."__"..value) if string.sub(key, 0,5) == '&std.' then data[string.sub(key,6 ,-1)] = value --get_console():execute(string.sub(key,6 ,-1).."__"..value) elseif string.sub(key, 0,5) == '&upd.' then data.upd[string.sub(key,6 ,-1)] = value --get_console():execute('&upd.__'..string.sub(key,6 ,-1).."__"..value) elseif string.sub(key, 0,5) == '&abs.' then abs_flag = true abs_tbl[string.sub(key, 6, -1)] = value end end if abs_flag then abs_flag = false out_tbl[1] = pk:setCallback(abs_tbl) end out_tbl[1] = pk:set(data) end out_tbl[2] = sobj return out_tbl end function net_edit (obj, idx, tbl) -- желательно серверный объект; индекс получения пакета (как в pk:Get(obj, индекс) (см. инструкцию к m_netpk.script)); таблица = {свойство=значение} local pk = m_netpk.get(obj, idx) if idx and idx==0 then return pk:setCallback(tbl) else local data = pk:get() for k,v in pairs(tbl) do data[k] = v end return pk:set(data) end end См myspawn - (почти all.spawn на скриптах) Скрытый текст В ИНИ файле с секциями спавн объектов (часто это spawn_sections.ltx) укажите дополнительные поля для редактирования через нэт пакеты спавненного объекта. Поля должны быть такого вида &префикс.имяНэтПакета = значение Виды префиксов: &std. - для state пакетов, &upd. - для update пакетов, &abs. - нет-пакет 'abstract'; Пример: [test]:stalker $spawn = "respawn\esc_salaga_chast" character_profile = esc_salaga spec_rank = regular community = military custom_data = scripts\test.ltx &std.visual_name = actors\hero\stalker_novice net_edit - быстрое редактирование нэт-пакетов объекта. *для работы с нет-пакетами вида 'abstract' - читайте инструкцию к m_netpk.script! Всё это будет включено в новую версию скрипта nt.script... Изменено 22 Августа 2017 пользователем Graff46 Ошибки исправлял Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 5 Октября 2017 (изменено) У меня вопрос по m_netpk.script. Когда устанавливаю дирекшн машин, то вроде оси сбиваются (вращать машинку по плоскости террейна это ось z). Это косяк скрипта, машин или вообще не косяк? И еще, когда вывожу через pk:dumpDesc() содержание пакетов объекта, то ни позишн, ни дирекшена там нет, но в скрипте работают... Изменено 5 Октября 2017 пользователем Graff46 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 6 Октября 2017 1 минуту назад, 7.9 сказал: это когда точка движется ПО плоскости X По поверхности террейна Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 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 (изменено) 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 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 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 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 24 Января 2018 (изменено) Только что, dsh сказал: Жуткий велосипед. Я вызываю ф-цию по её имени полученной из строки через глобальное пространство _G, это вполне закономерно. Имена скриптов и ф-ций + параметры, передаю ИХ методами (разрабов), как эл-ты массива. Где тут велосипед - не знаю. Даже если велосипед, то он не плохо так ездит и выручает где-то год. Только что, dsh сказал: распарсивать полные имена функций, с учетом имени скрипта. Я не понял, либо я плохой кодер либо чего-то недогоняю.... Изменено 24 Января 2018 пользователем Graff46 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 24 Января 2018 Только что, dsh сказал: =escape_task.myFuncName(param1:1986) Не, ну можно конечно так, но стоит ли. П.С. Я попробую может быть так сделать. Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 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 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 25 Января 2018 Только что, Kirgudu сказал: будет неплохо представить исправленные функции для всех трёх частей игры У меня нет ничего кроме ТЧ сейчас + днями пишу свой мод, идею подал, а там смотрите. пишите.... Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 31 Марта 2018 (изменено) Как можно получить нэт-пакет net_cse_abstract, если класс объекта не перегружен в class_registrator.script? Я пробовал через obj:STATE_Write(packet), пакет получаю, но net_cse_abstract не извлекается... И вообще можно ли менять позицию и поворот объекта, если его класс не перегружен в class_registrator.script? Изменено 31 Марта 2018 пользователем Graff46 Поделиться этим сообщением Ссылка на сообщение