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

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

Здрасьте.

 

Пытаюсь ввести в интерфейс контейнера для артефактов (arc_ui_8container_menu.script) подложку, чтобы счетчик радиации читался на любом фоне.

Пробовал добавлять еще одну ссылку в секцию переменной "b" – читается только вторая текстура, и либо подложки не видно, либо самих артов.

Скопировал секцию из функции "DrawBackground", вставил в функцию "DrawArtButton" с другой ссылкой (переменная "z") – подложка появилась, но только на первом арте, хотя функция "DrawButtons" (которая с циклом  от 1 до максимума артов в коробке) включает функцию "DrawButton" полностью и подложка должна была повториться (наверное).

 

Есть кто-нибудь, кто знаком с особенностями интерфейса контейнера?

 

Измененные файлы для солянки 2010 (подозреваю, что в солянке 2016 контейнер точно такой же):

https://drive.google.com/open?id=1UljHS8Om_va2pqlUykaf_-QFW8RHe9OP

 

З.Ы. Может, я зря задаю вопрос в общую тему, где 50 человек уже обсуждают 40 других вопросов?

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

Шпаргалка

Ссылка на комментарий
12 hours ago, naxac said:

Есть контакт. Спасибо.

Как понимать запись "SetWindowName("bck"..s.."_"..button_number)"? Выглядит как соединение нового окна "z" с окном "s" (взять/положить) и количеством кнопок, но как такая форма записи следует из названия команды "присвоить имя окну"?

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

Шпаргалка

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

@naxac, если это просто имя, почему подложка не множилась с именем окна "black"? Или дело в начальной секции с условием?

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

Шпаргалка

Ссылка на комментарий
В 21.08.2018 в 20:27, dsh сказал:

@Graff46, потому, что alive() у серверных объектов есть только у живых, т.к. сказать:


if obj and ( IsStalker( obj ) or IsMonster( obj ) ) and obj:alive() then

@lordmuzer вон там выше указал, у кого этот метод есть.

Фантомы не живые и не мёртвые.

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

Вопрос к смотревшим исходники: а кто пытался разбираться,: как именно работают manager:action( блабла ):add_effect( блабла ) ?

В частности вот это вот true|false и случай, когда add_effect() более одного ?

 

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

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

Так... то-ли лыжи не едут совсем, то-ли мне столько не выпить...

xr_camper.script:

function evaluator_end:evaluate()
    return not xr_logic.is_active(self.object, self.a)
end

 

function evaluator_close_combat:evaluate()
    if not xr_logic.is_active(self.object, self.a) then
        return true
    end

если непись не под схемой, возвращаем true.

 

Если под схемой

        local action = this.action_patrol (object,"action_camper_patrol", storage)

...
        action:add_precondition    (world_property(properties["end"],  false))
        action:add_precondition    (world_property(properties["close_combat"],    false))

начинаем выполнять этот самый патруль, или, если бой, то не начинаем.

        action:add_effect (world_property(properties["end"],                true))
        action:add_effect (world_property(stalker_ids.property_enemy,        false))

а если начали - продолжаем, пока врагов не увидели, или не ушли из под схемы, что, вроде как, абсолютно с тем же успехом должно получаться в варианте

        local action = this.action_patrol (object,"action_camper_patrol", storage)

...
        action:add_precondition    (world_property(properties["close_combat"],    false))

        action:add_effect (world_property(properties["close_combat",                true))

но не получается: висим.

 

Что я где проглядел ?

Ссылка на комментарий
В 06.09.2018 в 00:12, Dennis_Chikin сказал:

а если начали - продолжаем, пока врагов не увидели, или не ушли из под схемы, что, вроде как, абсолютно с тем же успехом должно получаться в варианте

add_effect говорит движку немного другое: что, когда сталкер выполнит "action_camper_patrol",  выставятся свойства properties["end"]=true и stalker_ids.property_enemy=false(то есть не будет врагов).

На каждом апдейте движок расчитывает, что нужно предпринять НПЦ, чтобы разгадать загадку зоны. Одно из условий разгадывания загадки - отсутствие врагов. За устранение врагов отвечает action_combat_planner. В xr_camper.script ниже кода, который ты привел, action_combat_planner добавляется условие properties["close_combat"] == true. То есть кемпер-скрипт говорит движку, что устранить врагов на близкой дистанции(properties["close_combat"] == true) можно через action_combat_planner, на дальней через action_camper_patrol.

Когда ты убираешь из эффектов

 action:add_effect (world_property(stalker_ids.property_enemy,        false)) 

, то врагов на дальней дистанции становится нечем устранять и все зависает.

 

И снова :) Отладочная сборка такие моменты подробно расписывает: из-за чего не получается разгадать загадку зону, какие сейчас свойства мира и тому подобное.

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

Я вообще-то про action:add_effect (world_property(properties["end"],  true))

Если мы не под схемой, то precondition   properties["close_combat"] == false не выполняется для

action_camper_patrol и выполняется properties["close_combat"] == true для action_combat_planner

 

stalker_ids.property_enemy вообще пока не трогаем.

 

Впрочем, action_camper_patrol как раз должен не только врагов устранять, но и заставлять непися ходить-смотреть при их отсутствии.

 

Ссылка на комментарий
1 час назад, Dennis_Chikin сказал:

Я вообще-то про action:add_effect (world_property(properties["end"],  true))

Ты удалил action:add_effect (world_property(properties["end"],  true))?

Несколькими строками ниже это свойство добавляется в прекондишен к xr_actions_id.alife.

Так он вообще не сможет ничего вывести - не найдет ни одного action, который properties["end"] в true переведет.

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

Ага - то есть, если есть хоть одно упоминание, будет искать и экшены ?

и тогда получается, что чего-то в исходном варианте все-таки не хватает, и в какой-то момент непись таки начинает тупить.

Ссылка на комментарий
20 минут назад, Dennis_Chikin сказал:

Ага - то есть, если есть хоть одно упоминание, будет искать и экшены ?

Экшены всегда ищутся.

 

Смотри, алгоритм такой:

 0. Есть граф из состояний мира(набор свойств) и экшенов, которые обещают перевести мир из одного состояния(набор прекондишенов) в другое(набор эффектов).

 1. вычисляются все зарегистрированные свойства мира, для этого вызываются их эвалюаторы

 2. берется финальное состояние мира(свойство мира "загадка решена" = true)

 3. ищется путь в графе от текущего состояния до финального.

 

Как правило мир в финальное состояние переводит xr_actions_id.alife. С учетом добавленного properties["end"] в прекондишене у xr_actions_id.alife раньше подходил action_camper_patrol(он переводил properties["end"] из false в true). А после удаления из эффектов никакой экшен не подходит. На этом благополучно и зависает.

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

Короче, action_camper_patrol надо делить на часть, работающую при наличии врагов, и часть, работающую без врагов.

Иначе будет как минимум одна ситуация, где непись таки висит.

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

Сделал скриптовый ГУИ диалог:

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


class "dialogs2" (CUIScriptWnd)

function dialogs2:__init(name, hidx) super()
	self.hdx = hidx or 3
	self:InitControls()
	self.dTable = tbl[name]
	self.cnt = 2
	self:InitCallBacks()
	self.schet = 1
	curr_polilog = name
end

function dialogs2:__finalize()
	curr_polilog = false
end

function dialogs2:InitControls()
	local xml = CScriptXmlInit()
	self:Init(0,0,1024,768)
	xml:ParseFile("dialogs2.xml")
	self.root = xml:InitFrame("root", self)
	xml:InitFrameLine("root:frameline", self.root)
	self.descr_scroll = xml:InitScrollView("root:descr_scroll", self.root)
	self.Texts1 = xml:InitStatic("root:Texts1", self.descr_scroll)
	xml:InitFrame("root:List1_frame", self.root)
	self.List1 = xml:InitList("root:List1", self.root)
	self.List1:ShowSelectedItem(true)
	self:Register(self.List1, "List1")
	
	--self.Texts1:SetHeight(self.Texts1:GetHeight() * self.hdx)
end

function dialogs2:InitCallBacks()
	self:AddCallback("List1", ui_events.LIST_ITEM_CLICKED, self.List1_list_item_clicked, self)
	self:AddItemTo_List1(string.format("%s: %s", self.dTable[1][1], self.dTable[1][2]))
	--LIST_ITEM_SELECT
end

------------------- >>>  Класс элемента списка List1  <<< -------------------

class "List1_ListItem"(CUIListItemEx)
function List1_ListItem:__init() super()
	self.text_item = CUIStatic()
	self:AttachChild(self.text_item)
	self.text_item:SetFont(GetFontLetterica18Russian())
	self.text_item:SetTextColor(255,216,186,140)
	
end
------------------- >>>  END  <<< -------------------

function dialogs2:AddItemTo_List1(item_name)    --/Добавление элемента в список List1
	local _itm = List1_ListItem()
	_itm.text_item:SetText(item_name)
	self.List1:AddItem(_itm)
end

function dialogs2:List1_list_item_clicked()
	self.List1:RemoveAll()
	
	if table.getn(self.dTable) == self.cnt then
		if type(self.dTable[self.cnt]) == 'function' then
			self.dTable[self.cnt]()
		elseif type(self.dTable[self.cnt]) == 'string' then 
			db.actor:give_info_portion(self.dTable[self.cnt])
		end
		return self:Hide()
	end
	
	self:AddItemTo_List1(string.format("%s: %s", self.dTable[self.cnt][1], self.dTable[self.cnt][2]))
	self.Texts1:SetText(string.format("%s\\n***********\\n%s>>\\n%s", self.Texts1:GetText(), self.dTable[self.cnt-1][1], self.dTable[self.cnt-1][2]) )
	self.cnt = self.cnt + 1 
	self.Texts1:AdjustHeightToText()
end

function dialogs2:talk()
	return self:IsShown()
end

function dialogs2:Hide()
	self:GetHolder():start_stop_menu(self, true)
end

function start(name, idx)
    local super_dlg = this.dialogs2(name, idx)
    level.start_stop_menu(super_dlg, true)
	return super_dlg
end 

 

Как мне получить статус диалога (окна) (активен или нет), переменная super_dlg не зануливается после закрытия диалога, перехвать в методе __finalize - ничего недал?

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

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

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

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

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

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

Войти

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

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

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