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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Здрасьте.

 

Пытаюсь ввести в интерфейс контейнера для артефактов (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 пользователь

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