Перейти к контенту

Сборочный цех


Zander_driver

Рекомендуемые сообщения

Скриптовый модуль из мода "Новое Время".
Кроме давно известных и банальных вещей содержит скриптовую систему заменяющую стандартный story_id. Подробнее в файле. Никаких адаптаций и подключений не требует. Для функцианирования некоторых плюшек могут понадобится: расширения LUA открывающие пространства имен io,  os(копирование файлов), X-Ray extensions(спавн со story_id). (Для аналога story_id дополнительные правки не нужны).
Ссылка.
Использовать везде с указанием автора.

  • Спасибо 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

Какой сейчас самый юзабельный скрипт для нэт-пакетов?

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, Я пытался работать с m_netpk, но что то не заладилось, работаю с xrs_utils.script. А вообще в многих модулях для работы требуется отдельный LTX  файл, в котором записаны классы объектов. Я нашел способ изменить class_registrator.script и читать классы из него, и если моддер добавляет свои объекты\классы, то нет необходимости возиться еще с LTX. Вот и хочу узнать на какой скрипт лучше свою фитчу навесить...

Поделиться этим сообщением


Ссылка на сообщение

 

 

:getString() возвращает пустую строку.
А в каком виде кастом дэйта может быть кроме ини?

Поделиться этим сообщением


Ссылка на сообщение

@dsh, А если логика? 

[logic]
active = remark

[remark]
anim = guard
meet = default_meet

Поделиться этим сообщением


Ссылка на сообщение

 

 

а вот это как раз и есть формат ini,
А как будет выглядеть логика в виде 1 строки, таблицы?

Поделиться этим сообщением


Ссылка на сообщение

 

 

Таблица
Я не знал о таком методе даже!

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, Объекты\классы также из ЛТХ файла читаются?

Изменено пользователем Graff46

Поделиться этим сообщением


Ссылка на сообщение

Из тутора по 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

Как я понял мы пишем состояние объекта в его же пакет. Если так, то зачем? У только созданного объекта "абстрактный" пакет пуст и мы его заполняем "вручную"? 

Если объект подергать по оффлайнам и онлайнам "абстрактный" пакет "соберётся"?

Поделиться этим сообщением


Ссылка на сообщение

Вот пара функций к 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...

Изменено пользователем Graff46
Ошибки исправлял

Поделиться этим сообщением


Ссылка на сообщение

У меня вопрос по m_netpk.script. Когда устанавливаю дирекшн машин, то вроде оси сбиваются (вращать машинку по плоскости террейна это ось z). Это косяк скрипта, машин или вообще не косяк? И еще, когда вывожу через pk:dumpDesc() содержание пакетов объекта, то ни позишн, ни дирекшена там нет, но в скрипте работают...

Изменено пользователем Graff46

Поделиться этим сообщением


Ссылка на сообщение
1 минуту назад, 7.9 сказал:

это когда точка движется ПО плоскости X

По поверхности террейна

Поделиться этим сообщением


Ссылка на сообщение

Псевдо 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}'

 

Изменено пользователем Graff46
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
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

 

 

Изменено пользователем Graff46

Поделиться этим сообщением


Ссылка на сообщение

Оставлю это тут. Функция для 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 аргумент). 

 

Изменено пользователем Graff46

Поделиться этим сообщением


Ссылка на сообщение
Только что, dsh сказал:

Жуткий велосипед.

 Я вызываю ф-цию по её имени полученной из строки через глобальное пространство _G,  это вполне закономерно. Имена скриптов и ф-ций + параметры, передаю ИХ методами (разрабов), как эл-ты массива. Где тут велосипед - не знаю. Даже если велосипед, то он не плохо так ездит и выручает где-то год.

Только что, dsh сказал:

распарсивать полные имена функций, с учетом имени скрипта.

Я не понял, либо я плохой кодер либо чего-то недогоняю....

Изменено пользователем Graff46

Поделиться этим сообщением


Ссылка на сообщение
Только что, dsh сказал:

=escape_task.myFuncName(param1:1986)

Не, ну можно конечно так, но стоит ли.

П.С. Я попробую может быть так сделать.

Поделиться этим сообщением


Ссылка на сообщение
Только что, 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 сказал:

будет неплохо представить исправленные функции для всех трёх частей игры

У меня нет ничего кроме ТЧ сейчас + днями пишу свой мод, идею подал, а там смотрите. пишите....

Поделиться этим сообщением


Ссылка на сообщение

Как можно получить нэт-пакет net_cse_abstract, если класс объекта не перегружен в class_registrator.script? Я пробовал через obj:STATE_Write(packet), пакет получаю, но net_cse_abstract не извлекается... И вообще можно ли менять позицию и поворот объекта, если его класс не перегружен в class_registrator.script?

Изменено пользователем Graff46

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...