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

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

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

Изменено пользователем Graff46
Ссылка на комментарий
11 часов назад, Graff46 сказал:

(вращать машинку по плоскости террейна это ось z). Это косяк скрипта, машин или вообще не косяк?

Это разница между "по" и "вокруг".

Вращать по Х - это когда точка движется ПО плоскости X, соответственно ВОКРУГ оси Z.

всё легко

Ссылка на комментарий

Псевдо 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
Ссылка на комментарий

Командное меню.
https://yadi.sk/d/JaMDyEHy3RCEHs
Используется для управление напарниками, нанокостюмом, хенами и так далее.

Управление в игре:
Нажмите клавишу вызова конкретного меню, далее выберете номер команды цифрами на основной клавиатуре. Повторное нажатие на клавишу открытия меню, закрывает меню без вызова команды.

Управление сходно с движковым меню. В скритах номера меню и команд задаётся от 1. Так же можно задать озвучку команды, по легенде ГГ даёт команды напарникам именно по радио голосом, через радиогарнитуру, которую используют СпН.
Как подключить?, смотрите в файле Подключения.txt

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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Ссылка на комментарий

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

Жуткий велосипед. Полезнее xr_logic.script научить распарсивать полные имена функций, с учетом имени скрипта. Я бы показал это, но у меня нет этого в виде отдельного изменения. А так, тут можно посмотреть, например

https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/xr/xr_logic.script

 

  • Согласен 1
Ссылка на комментарий
Только что, dsh сказал:

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

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

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

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

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

Изменено пользователем Graff46
Ссылка на комментарий

@Graff46 зачем делать вот так "=myfunc_exec(escape_task:myFuncName:param1:1986)", если можно делать "=escape_task.myFuncName(param1:1986)"

Вот что я имел ввиду, что полезнее xr_logic.script этому научить.

 

И прекратите уже говорить "кодер" и прости господи "скриптер". Не бывает таких существ. Есть программисты, разработчики, софтверные инженеры. Но из кодеров я знаю только быдлокодеров.

 

Что-то я разбурчался.

 

  • Согласен 3
  • Смешно 1
Ссылка на комментарий
Только что, 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 только я б либо оставил аборт с выводом в лог, как он был в оригинале (а также добавил проверку наличия распарсенной функции, и туда тоже аборт), либо убрал аборт во всей функции pick_section_from_condlist (если ты в принципе от них избавляешься и потому как вылет и без аборта будет на отсутствующих функциях).

Ну и ещё в _G[spc][fname](actor, npc, infop.params or nil) "or nil" - лишнее, так как там и без того либо таблица, либо nil.

 

Upd: раз здесь "сборочный цех", будет неплохо представить исправленные функции для всех трёх частей игры, так как они хоть и незначительно, но емнип отличаются.

Изменено пользователем Kirgudu
  • Согласен 1
Ссылка на комментарий
Только что, Kirgudu сказал:

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

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

Ссылка на комментарий

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

Изменено пользователем Graff46
Ссылка на комментарий

Ф-ция для записи в файл "свободных" 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] - Занятый Сид (под сидом есть объект на момент сканирования).

Изменено пользователем Graff46
  • Нравится 1
  • Полезно 1
Ссылка на комментарий
19 часов назад, Graff46 сказал:

Ф-ция для записи в файл "свободных" story_id.

Я как-то решил задействовать свободное значение в [story_ids] - 20(чистая ТЧ). Получил вылет, по дублированию, оказалось, что в all.spawn'е это значение было занято, чисто в цифровом виде, без сета в вышеозначенном конфиге... Как-то так.

Ссылка на комментарий

Не давно, с момента написания данного поста, я спорил на форуме, о том что код распарсивания строк условий переключения схем логики, достаточно громоздкий и и ресурсозатратный.

Сейчас я опубликую новую систему, алгоритм достаточно специфичный, требуются тесты.

Внимание! Старые схемы логики работать не будут! Вам нужно создать только своих НПС с логикой по новому стандарту.

Скрытый текст

Изменения касаются только полей переключателей(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 вида перебора переключателей, по таблице и по условиям. Возможно есть решения улучшить код. Хотелось бы узнать падение\прирост производительности...

Есть возможность заменить унарный минус строк для инфопоршней на разность, для аналогии со сложением.

Версия под ТЧ


Гибкая версия. Сама распознает старые переключатели и новые. Ссылка

Изменено пользователем Graff46
  • Сомнительно 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

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