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

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

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

Если добавить наследуемую секцию [wpn_ak74] в ЭТОТ ЖЕ файл, всё работает!

Естественно, родитель для наследования должен быть виден там, где ты его наследуешь.

Если ты хочешь, чтобы все выше-объявленные секции конфига были видны для твоей, то и подключай его к system.ltx, и доступ получай через system_ini().

Файлы, доступ к которым получается через ini_file(), подключаются как отдельная система конфига, независимая и несвязанная с system_ini. К ним может быть тоже что-то подключено через #include, но это все равно будет обособленная система.

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

В общем, у меня задача стояла такая - определить, является ли запрашиваемый параметр оружия "родным" (прописанным непосредственно под секцией это оружия), или же он наследуемый.

Есть такая идея...

local ltx = system_ini()
function found_line(section, line)
  local lc = ltx:line_count(section)
  local a = 1
  while a < lc do
    local key = ''
    local value = ''
    local r = ltx:r_line(section, a, key, value)
    if r and key == line then
      return true
    end
    a = a + 1
  end
  return false
end

Методы line_count и r_line точно есть в OGSR (Это не я добавил). Есть ли они в оригинальном ТЧ, честно говоря не помню. Если есть, то должно сработать.

Если же нету, то боюсь, не существует способа узнать то что тебе нужно из скриптов.

Мод, где не бывает одинаковых путей - Судьба Зоны.

Что вы говорите, этого никто никогда не делал!? Что вы говорите, это невозможно!? ... Я берусь.

29.07.2021 в 22:28, GYN ZAN сказал:

не стоит помогать людям, которые в ответ на помощь только желчью плюются

Ссылка на комментарий
Поделиться на других сайтах

@Zander_driver , спасибо за идею, методы у меня работают (ОП 2.1), вот только функция всегда выдаёт "true",

т.е. какой параметр ей в line не укажи, она его всегда найдёт в system_ini() - оно и правильно, ведь это обобщённое, так сказать хранилище всех параметров данной секции. 

Ну что жеж, констатируем - нет у нас методов против Кости Сапрыкина для решения моей задачи по определению, оригинален или наследуем параметр.

Ссылка на комментарий
Поделиться на других сайтах

7 минут назад, phalcor сказал:

вот только функция всегда выдаёт "true"

Это естественно. После прочтения ini-файла, наследуемые параметры копируются в конечную секцию, и присутствую в ней в полном составе.

 

7 минут назад, phalcor сказал:

нет у нас методов ... по определению, оригинален или наследуем параметр.

Здесь возможен только "костыль". Если точно знать имя конечной секции, а также имя наследуемой, то можно прочитать параметр дважды - из одной и из другой секции. Если параметр различается, значит, он был переопределен. По другому никак.

 

 

Изменено пользователем WinCap
Ссылка на комментарий
Поделиться на других сайтах

8 минут назад, WinCap сказал:

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

А вот это идея. Остаётся узнать, а есть ли способ прочитать в переменную parent-секцию (то, что после двоеточия) - [wpn_ak74_m1]:wpn_ak74 ?

Ссылка на комментарий
Поделиться на других сайтах

4 минуты назад, phalcor сказал:

есть ли способ прочитать в переменную parent-секцию

Нет.

Если это действительно необходимо для реализации какой-то мега крутой идеи, то можно вручную составить таблицу наследований секций:

local tbl = {
  ["wpn_ak74_m1"] = "wpn_ak74",
  и т.д.
}

 

Изменено пользователем WinCap
Ссылка на комментарий
Поделиться на других сайтах

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

можно вручную составить таблицу наследований секций:

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

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

Мод, где не бывает одинаковых путей - Судьба Зоны.

Что вы говорите, этого никто никогда не делал!? Что вы говорите, это невозможно!? ... Я берусь.

29.07.2021 в 22:28, GYN ZAN сказал:

не стоит помогать людям, которые в ответ на помощь только желчью плюются

Ссылка на комментарий
Поделиться на других сайтах

Здравствуйте. Как определить, принадлежит ли определенный гейм-вертекс текущей локации? ЗП.

Ссылка на комментарий
Поделиться на других сайтах

@Jekyll, как-то так:

local gvid = определенный_m_game_vertex_id

local level_name = alife():level_name(game_graph():vertex(gvid):level_id())

if level_name == level.name() then

Ссылка на комментарий
Поделиться на других сайтах

@Norman Eisenherz , честно? Вот шут его знает, что у кого год назад стояло. Сейчас любопытства ради попробовал оригинал - Макрон - обр. 14г. Везде ожидаемый вылет. Впрочем, это уже явно не "скриптовые" вопросы.

Ссылка на комментарий
Поделиться на других сайтах

Здрасьте.


ТЧ 1.0006.
Задача: действие по нажатию кнопки в инвентаре.
Построение: присоединить кнопку к инвентарю при первом обращении, создать скриптовое окно и сохранить в переменной, привязать событие.
Проблема: скриптовое окно вызывает безлоговый вылет после перезагрузки и повторного обращения к инвентарю.

Обнуление скриптового окна при выходе из инвентаря или через net_destroy не помогает.

 

Как правильно очистить окно при перезагрузке?

 

Spoiler
local inv, z, wnd					-- инвентарь, кнопка и окно для отслеживания нажатия кнопки

-- [bind_stalker.script] actor_binder:info_callback
function button(info_id)
	if info_id == "ui_inventory" then
		local b_name = "btn"

		if not inv then
			inv = level.main_input_receiver()

			z = CUI3tButton()
			inv:AttachChild(z)
			local x, y = 755, 245
			local w, h = 157, 48
			z:Init("ui_button_main03", x, y, w, h)
		end

		if not wnd then
			wnd = CUIScriptWnd()
			wnd:Init(0, 0, 1, 1)

			wnd:Register(z, b_name)
			wnd:AddCallback(b_name, ui_events.BUTTON_CLICKED, action, wnd)
		end
	elseif info_id == "ui_inventory_hide" then
		wnd = nil
	end
end


function action()
	news_manager.send_tip(db.actor, "TEST")
end


-- [bind_stalker.script] actor_binder:net_spawn
function delete()
	wnd = nil
end

 

 

Мини-моды: ТЧ ЧН ЗП

Ссылка на комментарий
Поделиться на других сайтах

1 час назад, Norman Eisenherz сказал:

Как правильно очистить окно при перезагрузке?

Вот так 

    if wnd then
        wnd:DetachWnd()
        wnd = nil
    end

Ссылка на комментарий
Поделиться на других сайтах

18 часов назад, phalcor сказал:

В общем, у меня задача стояла такая - определить, является ли запрашиваемый параметр оружия "родным" (прописанным непосредственно под секцией это оружия), или же он наследуемый.

Мне когда такое понадобилось - сделал движковую правку.

@Norman Eisenherz 

z:SetAutoDelete(true) - должно помочь.

Ссылка на комментарий
Поделиться на других сайтах

5 часов назад, Norman Eisenherz сказал:

Как правильно очистить окно при перезагрузке?

При net_destroy надо отсоединять элементы от окна:

if inv then

  inv:DetachChild(z)

  inv, wnd, z = nil, nil, nil

end

 

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
Поделиться на других сайтах

По результатам проверки хватило принудительного отсоединения кнопки – AutoDelete работает и так для всех окон.

Мини-моды: ТЧ ЧН ЗП

Ссылка на комментарий
Поделиться на других сайтах

Доброго дня!

Скажите, а досрочный выход из цикла iterate предусмотрен? Return явно не работает, ибо в log я получаю iter=50.

local i=0
db.actor:iterate_inventory_simple(function(item)
	i=i+1
	if item then
		return								
	end
end)
log("iter="..i)

 

 

Ссылка на комментарий
Поделиться на других сайтах

@phalcor @phalcor что-то я не нахожу в движке такого метода. iterate_inventory нахожу, а iterate_inventory_simple нету.

Ссылка на комментарий
Поделиться на других сайтах

1 час назад, phalcor сказал:

Return явно не работает

Работает. Он выходит из тела анонимной функции.

Вот этой:

1 час назад, phalcor сказал:
function(item)
	i=i+1
	if item then
		return								
	end
end

А iterate_inventory или его аналоги, запускает задание на циклический вызов указанной функции. И для отмены/прерывания задания, метода нету. Но, а зачем он нужен?

 

Можно же сделать что-то в таком духе:

local i=0
local ido = true
db.actor:iterate_inventory(function(item)
    if ido then -- Здесь наши действия если перебор продолжается
      i=i+1
      if item then ido = false end
    else -- Здесь - если нет
      return
    end
end)
log("iter="..i)

 

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

я не нахожу в движке такого метода.

Кстати, я тоже. Все равно какая-то вариация на тему, по образу и подобию... не все ли равно?)

Мод, где не бывает одинаковых путей - Судьба Зоны.

Что вы говорите, этого никто никогда не делал!? Что вы говорите, это невозможно!? ... Я берусь.

29.07.2021 в 22:28, GYN ZAN сказал:

не стоит помогать людям, которые в ответ на помощь только желчью плюются

Ссылка на комментарий
Поделиться на других сайтах

@dsh это из движка ОП 2.1. Но суть не в том, стандартный iterate ведёт себя так же (без выхода по return!):

local i=0
db.actor:iterate_inventory(
	function(dummy,item)
		i=i+1
		if item then
			return								
		end
	end,db.actor)
log("iter2="..i)

 

@Zander_driver 

2 минуты назад, Zander_driver сказал:

Можно же сделать что-то в таком духе:

Можно конечно, но прогонка цикла, когда он уже не нужен, отнимает время (пусть и малое). Я-то думал, есть волшебный break! Ну нет, так нет :-)

Ссылка на комментарий
Поделиться на других сайтах

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

стандартный iterate ведёт себя так же

Естественно так же. Любой подобный итератор делает простую вещь - запускает в движке цикл перебора, в котором вызывается указанная функция.

Т.к. цикл крутится в движке, остановить его из скриптов естественно невозможно. Будет крутиться до тех пор пока все итемы не переберет. Но его и не нужно останавливать ни для чего...

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

прогонка цикла, когда он уже не нужен, отнимает время (пусть и малое).

Ну формально да. Но, т.к. это цикл в движке - это очень малое время. Очень.

В среднестатистическом моде, есть куда более весомые вещи, которые можно оптимизировать.

Мод, где не бывает одинаковых путей - Судьба Зоны.

Что вы говорите, этого никто никогда не делал!? Что вы говорите, это невозможно!? ... Я берусь.

29.07.2021 в 22:28, GYN ZAN сказал:

не стоит помогать людям, которые в ответ на помощь только желчью плюются

Ссылка на комментарий
Поделиться на других сайтах

3 hours ago, Zander_driver said:

не все ли равно?)

Нет. Возможно там сделали возможность досрочного выхода из цикла, кто знает.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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

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

AMK-Team.ru

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