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

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

@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 сказал:

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

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

Мод, где не бывает одинаковых путей - Судьба Зоны. На базе модифицированного движка OGSR Engine.

Полагаю, любой мод изначально стоит делать максимально хардкорным. Потому что, желающих оказуалить всегда хоть отбавляй - и без вас найдутся те, кто это сделает.

Не понимаю, что люди находят в модах без аномалий и без мутантов. Какой интерес бродить по абсолютно пустой и не меняющейся зоне?... Однако, таких много...

 

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

@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 сказал:

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

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

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

Мод, где не бывает одинаковых путей - Судьба Зоны. На базе модифицированного движка OGSR Engine.

Полагаю, любой мод изначально стоит делать максимально хардкорным. Потому что, желающих оказуалить всегда хоть отбавляй - и без вас найдутся те, кто это сделает.

Не понимаю, что люди находят в модах без аномалий и без мутантов. Какой интерес бродить по абсолютно пустой и не меняющейся зоне?... Однако, таких много...

 

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

3 hours ago, Zander_driver said:

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

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

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

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

досрочный выход из цикла iterate предусмотрен?

В стандартном методе "iterate_inventory" точно нет, а в неизвестном "iterate_inventory_simple" - всё может быть.

Попробуй вернуть что-нибудь из функции, например "true".

 

Скрытый текст
local i=0
db.actor:iterate_inventory_simple(function(item)
	i=i+1
	if item then
		return true
	end
end)
log("iter="..i)

 

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

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

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

А ничего, что return, в твоем примере кода, вызывается в кэллбэк-ф-ции, которая, в свою очередь, вызывается из движка для каждого имеющегося предмета инветаря? Смотри пример ниже, там специально кэллбэк-ф-ция вынесена отдельно:

local npc_obj = level.object_by_id(alife():story_object(104).id)
if npc_obj then
    npc_obj:iterate_inventory(check_inv_items, npc_obj)
end

function check_inv_items(npc, item)

     .......

     return

     .......

end

Соответственно, понятно, что область действия оператора return ограничена ф-цией check_inv_items, и уж никак не може влиять на npc_obj:iterate_inventory.

Или я не прав?

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

@AndreySol 

Это разобрали несколькими постами ранее... :rolleyes:

Мод, где не бывает одинаковых путей - Судьба Зоны. На базе модифицированного движка OGSR Engine.

Полагаю, любой мод изначально стоит делать максимально хардкорным. Потому что, желающих оказуалить всегда хоть отбавляй - и без вас найдутся те, кто это сделает.

Не понимаю, что люди находят в модах без аномалий и без мутантов. Какой интерес бродить по абсолютно пустой и не меняющейся зоне?... Однако, таких много...

 

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

28.07.2021 в 19:40, phalcor сказал:

досрочный выход из цикла iterate предусмотрен?

Можно вместо iterate_inventory использовать

local obj

for i = 0, db.actor:object_count()-1 do

  obj = db.actor:object(i)

...

end

Тут можно и break, и return использовать.

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

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

naxac.gif

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

Здрасьте.

 

ТЧ 1.0006.

 

Безлоговый вылет при удалении простого скриптового окна, если оно открыто в момент перезагрузки (ситуация "смерть или переход при открытом инвентаре"). Проблема в том, что вылет случается только на сейвах, сделанных после начала задания Волка – дефолтный сейв all.sav не сбоит.

 

Условия теста:

• оставить в папке [gamedata] только указанный ниже файл

• начать новую игру
• открыть инвентарь с новым окном
• консоль: load_last_save        -- нет вылета
• взять задание Волка
• сделать сейв
• открыть инвентарь и новым окном
• консоль: load_last_save        -- вылет

 

Может, так и должно быть, а метод __finalize() нужен только для того, чтобы сборщик мусора не пытался убить окно на ближайшем апдейте?

 

Spoiler
[scripts\bind_stalker.script]
function actor_binder:info_callback(npc, info_id)
(+)
	if info_id == "ui_inventory" then
		show()
	end


(+)
function show()
	cui = test()
	level.start_stop_menu(cui)
end


class "test" (CUIScriptWnd)

function test:__init() super()
	self:Init(0, 0, 1024, 768)

	local b = CUIStatic()
		self:AttachChild(b)
	b:Init(0, 0, 1024, 768)
	b:InitTexture("ui_frame_back")
	b:SetStretchTexture(true)
end

function test:__finalize()
end

 

 

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

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

@Norman Eisenherz А убирать окно кто будет? Странно что при повторном открытии инвентаря вылет не ловишь.

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

@I am Dead Точнее, пожалуйста: кого, куда и как убирать. Добавлять к указанному коду cui = nil в net_destroy бесполезно, cui:GetHolder():start_stop_menu(cui) там же вообще не находит ссылки на окно.

Если вывести интерактивное окно при закрытых движковых окнах, оно удаляется без дополнительных действий (в ТЧ – в ЧН/ЗП уже нет) – проверял оба вида окон на одном сейве.

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

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

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

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

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

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

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

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

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

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

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

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

AMK-Team.ru

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