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

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

У меня есть вот такое диалоговое окно

https://yadi.sk/d/y_NZn-eUpq7wr

Основное окно у меня на классе CUIScriptWnd.

В его инитконтроле цепляются ещё 4 окна на классе CUIWindow.

 

В основном окне я успешно использую CUIScriptWnd.Update(self) для обновления часов.

А в дочернем от основного окне(окно чата) пришлось повесить обновление этого чата на калбек апдейта игры.

 

Вопрос вот в чём:

Есть ли для CUIWindow похожий простой апдейт, как для CUIScriptWnd?

 

Если нет, то как мне мои дочерние окна на CUIWindow переделать на класс CUIScriptWnd, чтобы не использовать каллбек на апдейт, а использовать CUIScriptWnd.Update(self)?

Что-то не выходит. Запутался%(

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

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

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

как мне мои дочерние окна на CUIWindow переделать на класс CUIScriptWnd, чтобы не использовать каллбек на апдейт, а использовать CUIScriptWnd.Update(self)?

Вызывай обновление в дочерних классах из апдейта базового.

Например, делаешь в дочернем фунцию UpdateWnd, а потом из базового апдейта вызываешь: "self.переменная_дочернего_окна:UpdateWnd()"

  • Согласен 1

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

naxac.gif

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

Подскажите, как можно убить монстра в оффлайне помимо метода  kill_entity? 

gobj = level.object_by_id(id)  
     if npc then  
gobj:kill(gobj)
end

Доброго времени суток , у кого можно проконсультироваться по поводу скриптовой составляющей LA 1.3003 :
в частности [ где посмотреть функции получения текущего состояния жажды а так же функции управления жаждой ]
 
2 вопрос , где прописано значение восстановления жажды при использовании воды и т.п (порылся в конфиге и не нашел новых переменных (возможно плохо искал но всё же))
 
заранее спасибо

Вопрос по поводу m_netpk  

пытаюсь изменить направление предмета при спавне 
 

function set_dir(sobj,dir)
 local pk = get_netpk(sobj,0) --/ m_netpk.net_cse_abstract(sobj)
 local data = pk:get() --/ читаем данные из нет-пакета
 data.direction = dir --/ изменение параметра в 'cse_abstract'
 pk:set(data)
end

вылета нет но и обьект не повернулся , подскажите если кто то имел опыт работы с m_netpk
или если можно ссылку где можно посмотреть скрипты с примерами
 
Изменено пользователем Logger
Ссылка на комментарий

@Logger, параметры в конфигах в ЛА не влияют на изменение жажды/сытости. Всё сделано через одно место чисто на таймерах, и при съедании/выпивании чего-либо параметры восстанавливаются полностью.

Здесь я это исправил: ссылка - сравни с оригиналом, разберешься.

 

Про специальный нет-пакет 'abstract':

Библиотека может работать с абстрактной частью пакета, которая доступна ТОЛЬКО в момент выхода объекта в онлайн или сохранении.

Поэтому напрямую (методами set и get) прочитать и записать такие данные нельзя.

Для чтения и/или изменения используется специальный пакет 'net_abstract'.

Хотя принцип работы отличается от работы остальных классов, но все же очень похож. Исключение составляет то, как изменять данные в пакете.

Рассмотрим сразу на примере:

а) создаем объект в игре:

local obj = alife():create("exo_outfit", pos, lv, gv)

б) получаем служебный пакет, которым будем менять свойства:

local pk = m_netpk.get(obj,0) -- или m_netpk.net_cse_abstract(obj)

в)

вариант-1: используем функцию:

pk:setCallback( function(data)

data.direction = vector():set(1,1,1)

end )

вариант-2: задаем желаемые изменения таблицей:

pk:setCallback( {direction = vector():set(1,1,1)} )

 

Здесь мы создали объект и захотели изменить его абстрактную часть.

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

В колбек передается таблица с параметрами пакета, мы можем смело их менять, в примере мы наклонили объект по всем осям на 1 радиану.

При спавне нового игрового объекта:

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

Для уже существующих объектов в игре:

требуется после задания изменений свойст объекта, перевести объект в оффлайн и обратно в онлайн, что модулем делается автоматически.

Изменения вступят в силу в момент выхода объекта в онлайн.

 

Как получить возможность менять абстрактную часть пакетов?

 

1) этот тип объектов должен иметь класс, который представляет такой тип объектов в игре (можно назвать биндером, а можно никак не называть)

(то есть то, что будет вызвано, когда объект появится в игре)

Завязка из class_registrator.script:

cs_register (object_factory, "CStalkerOutfit", "se_item.se_outfit", "E_STLK", "equ_stalker_s")

 

2) обязательно добавить (если таковой отсутствует) метод биндера 'STATE_Write' (см. скрипты типа: 'se_XXX.script')

Для примера с костюмом:

function se_outfit:STATE_Write(packet)

cse_alife_item_custom_outfit.STATE_Write(self, packet)

end

 

3) В метод STATE_Write (см. выше) добавить строку:

function se_outfit:STATE_Write(packet)

if self.cb_netpk then self.cb_netpk(self, packet) end -- коллбэк для изменения свойств пакета

cse_alife_item_custom_outfit.STATE_Write(self, packet)

end

 

Выполнение этих действий ОБЯЗАТЕЛЬНО.

Зачем это нужно? Ну, например, можно поменять дирекшн или позишн, так как это read_only свойства объектов.

А позишн при спавне смещается так, чтобы объект находился на ИИ сетке.

То есть, можем спавнить всякие там лампочки, физические объкты так, чтоб они оказывались повернутыми в пространстве.

Так же можно менять те свойства, которые, обычно, только для чтения. Например story_id, или position

 

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

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

naxac.gif

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

Добрый вечер!

Подскажите, секция [spawner] может работать у сталкеров под гулагом??? Необходимо что бы они появлялись по условию и уходили в оффлайн также по получении инфопорции.

НПС скриптовые, all.spawn не трогаю специально!!! Гулаг создал, все работает, выполняется, кроме вышеозначенной секции, как и куда ее вставить либо каким другим способом можно увести неписей в оффлайн???

 

И еще, в каких файлах прописаны эффекты визуальные и звуковые появления(спавна) монолитовцев на ЧАЭС-2, типа из телепорта выходят!!! Вобщем как этого добиться, или хотя бы какие файлы просмотреть я в принципе и сам разобрался бы...

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

Жизнь следует измерять поступками, а не временем...

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

как и куда ее вставить..

???

Запиши через net_packet в кастом-дату нпс при его спавне.

 

в каких файлах прописаны эффекты визуальные и звуковые появления(спавна) монолитовцев на ЧАЭС-2

Это реализовано рестрикторами со схемой sr_particle, её описание есть в вики на stalkerin.gameru.net
  • Спасибо 1

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

naxac.gif

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

Вопрос по GUI интерфейсам. Добавляю в список на GUI предметы из таблицы, которые находятся у гг, все работает. При выборе и нажатии на определенную кнопку они удаляются из инвентаря, но когда пытаюсь вывести не секции, а inv_name предметов, удаление перестает работать. Вот код, прошу опытных скриптеров посмотреть в чем косяк.


function repair_kit:InitControls()

self:SetWndRect (Frect():set(0,0,800,600))
local xml, ctrl = CScriptXmlInit(), CUIWindow()
xml:ParseFile ("ui_repair_kit.xml")
self.repair_kit = xml:InitStatic("repair_kit",self)
self.list = xml:InitList("repair_kit:list",self)
self.list:ShowSelectedItem(true)
self:Register(self.list, "list_window")
self.list:RemoveAll()

for i = 1, #parts_table do
if db.actor:object(parts_table) then
self:AddItemToList(parts_table)
end

end

function repair_kit:OnButton_second_slot_clicked()
if self.list:GetSize()==0 then
return
end
local index = self.list:GetSelectedItem()
if index == -1 then
return
end
local object = self.list:GetItem(index).text:GetText()
del_item(object)
self.button_second_slot:Enable(false)
end

 

function repair_kit:AddItemToList(item_name)
local _itm = spawn_item()
_itm.text:SetText (game.translate_string(system_ini():r_string(item_name, "inv_name")))
self.list:AddItem (_itm)
end

 

 

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

 

 

либо каким другим способом можно увести неписей в оффлайн???

Ну так в раздаче работ для того гулага, под которым работают эти неписи пропиши смену состояния с уходом в офф-лайн, вот пример из скрипта для Темной долины:

t = { section = "logic@" .. way_name,
     idle = 0,
     prior = prior, state = {0}, squad = squad, group = groups[1],
     position_threshold = 20, in_rest = "", out_rest = "",
     online = false <--- это. Те кто будет на этой работе, будут сидеть в офф-лайне, до перехода на другую работу.
}
table.insert(sj, t)
  • Спасибо 1
Ссылка на комментарий

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

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

 

И ещё вопром: в чём прок локальных функций "local function bla()"? Что даёт то, что мы обзываем её локальной?

 

Вот ещё вопрос: как указать путь к папке, не прописанной в fsgame.ltx? И как указать путь к звук. файлу не от папки sounds, а от любой другой?

Вот код наполнения, но тут во первых я указываю путь в файле fsgame.ltx $music_for_player$ по пути от папки sounds "/music_for_player. А во вторых указываю туда, по тому что не знаю как указать путь к звуку не от sounds

 

 

-- Заполнение листа с треками(считывает папку "gamedata\sounds\music_for_player")
function music_player:FillList()
	self.mp3_list:Clear()
	local list_music_player = {}
	local f	= getFS()
	local flist = f:file_list_open_ex('$music_for_player$',bit_or(FS.FS_ListFiles,FS.FS_ClampExt),"*.ogg")
	local f_cnt = flist:Size()
	for	it=0, f_cnt-1 do
		local file = flist:GetAt(it)
		local file_name = file:NameShort()
		table.insert(list_music_player,{sound = [[music_for_player\]]..file_name, title = 'Трек №'..(it+1), autor = file_name})
	end
	if debug_on then
		print_table(list_music_player)
	end
	for k,v in pairs(list_music_player) do
		self:AddItemToList(v.title,v.sound,v.autor)
	end

 

Не сочтите за наглость, просто не знаю где на это всё самому найти ответы, ещё один вопрос:D

Как поймать открытие/закрытие системных уи элементов(вроде пда, инвенторя и т.д.)?

Платформа ЗП

В ТЧ нормально получалось, а вот в ЗП что-то не получается. Вроде так же ловлю info_id (инфопоршень), но ловится только 1 раз открытие ПДА и закрытие его же, и больше не срабатывает, инвентарь и другое даже и 1 раза не ловится.

Если это важно- ковыряюсь на моде Call of Chernobyl

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

Вроде так же ловлю info_id (инфопоршень), но ловится только 1 раз открытие ПДА и закрытие его же, и больше не срабатывает, инвентарь и другое даже и 1 раза не ловится.

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

В ТЧ работало, потому что инфопорции в xml прописывались, и там прописано удаление инфопорции.

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

Вечер добрый. Еще раз прошу помощи с sr_robbery для ЧН: никак не могу создать таблицу, чтобы объекты проще было вносить, пытался разными способами, но почему то и не вылетает и не срабатывает, если в таблице более одного объекта. Начал уже тупо копировать-вставить по одному объекту в основную функцию в стиле

 

local function transfer_object_item(item)

if item:section() ~= "wpn_beretta" and

item:section() ~= "wpn_colt1911" and
item:section() ~= "wpn_desert_eagle" and
item:section() ~= "wpn_fort" and
item:section() ~= "wpn_hpsa" and
item:section() ~= "wpn_pb" and
item:section() ~= "wpn_pm" and
item:section() ~= "wpn_walther" and
item:section() ~= "novice_outfit" and
item:section() ~= "bandit_outfit" and
item:section() ~= "specops_outfit" and
item:section() ~= "military_outfit" and
item:section() ~= "stalker_outfit" and
item:section() ~= "scientific_outfit" and
item:section() ~= "exo_outfit" and
item:section() ~= "svoboda_light_outfit" and
item:section() ~= "svoboda_heavy_outfit" and
item:section() ~= "svoboda_exo_outfit" and
item:section() ~= "cs_light_outfit" and
item:section() ~= "cs_heavy_outfit" and
item:section() ~= "dolg_outfit" and
item:section() ~= "dolg_heavy_outfit" and
item:section() ~= "wpn_g36" then
db.actor:transfer_item(item, inv_box_1)
end
end
inv_box_1 = level_object_by_sid (718)
db.actor:inventory_for_each(transfer_object_item)

 

 

Но так получится огромная функция, да и работы прибавится. Вот также ссылка на Ядиск с файлом - https://yadi.sk/d/3VlWC2cGpwFud - м.б. кому то будет интересно изучить текущее состояние.

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

Не соответствует. N6260

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

Добрый день господа!!!

Опять с оффлайном немного заморочился. Создал секции в all.spawn (в тестовом режиме пока, потом через скрипт реализую) НПС и space_restrictor со следующей логикой:

; cse_abstract properties


section_name = space_restrictor
name = aes2_osoznanie_restrictor
position = 353.836,0.230,270.474
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 2583
distance = 0
level_vertex_id = 114493
object_flags = 0xffffff3e
custom_data = <[logic]
active = sr_idle1

[sr_idle1]
on_actor_inside = sr_particle

[sr_particle]
name = anomaly2\teleport_out_00
path = aes2_osoznanie_walk_particle
mode = 2
looped = false
on_timer = 900 | sr_idle2 %+aes2_osoznanie_teleport%

[sr_idle2]
on_timer = 3000 | {-aes2_osoznanie_teleport} sr_idle1 %+aes2_osoznanie_teleport%
END

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 10

; cse_alife_space_restrictor properties
restrictor_type = 0


И НПС:

; cse_abstract properties
section_name = stalker
name = aes2_osoznanie
position = 353.836,0.230,270.474
direction = 0,0,0

; cse_alife_trader_abstract properties
money = 5000
character_profile = osoznanie_8

; cse_alife_object properties
game_vertex_id = 2583
distance = 2.79999995231628
level_vertex_id = 114493
object_flags = 0xffffffff
custom_data = <[logic]
active = walker1
on_hit = hit@osoznanie

[walker1]
path_walk = aes2_osoznanie_walk
path_look = aes2_osoznanie_look

[spawner]
cond = {+aes2_osoznanie_teleport}

[smart_terrains]
none = true
[hit@osoznanie]
on_info = %-aes2_osoznanie_teleport%
END

; cse_visual properties
visual_name = actors\osoznanie\oso_zp_nauchniy

; cse_alife_creature_abstract properties
g_team = 2
g_squad = 2
g_group = 2
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =

upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = 353.836,0.230,270.474
upd:o_model = 0
upd:o_torso = -3.09779977798462,-4.40388163269745e-007,0
upd:g_team = 2
upd:g_squad = 2
upd:g_group = 2

; cse_alife_monster_abstract properties
;base_out_restrictors = aes2_space_restrictor_roof0004

upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0

; cse_alife_human_abstract properties
predicate5 = 2,2,0,2,2
predicate4 = 2,0,2,0

; cse_ph_skeleton properties

upd:start_dialog =

; se_stalker properties


По задумке сталкер появляется по типу монолита из оригинала игры как бы из телепорта, затем получает хит, уходит в оффлайн и опять появляется и так пока не надоест... В принципе работает такая схема, но повторный спавн (переход в онлайн) НПС происходит не в прописанной точке path = aes2_osoznanie_walk_particle как это было при первом спавне, а в точке из которой он ушел в оффлайн, что не совпадает с визуальными эффектами, телепорт условно в одном месте, а сталкер появляется в другом почему так??? Где можно поправить сей недостаток, если можно вообще конечно???

И еще, поле скрипта logic: on_actor_inside мне не нравится, не тот случай, работает ли вместе со space_restrictor "on_actor_dist_le =..." или как нибудь по другому, но суть в том, что бы они спавнились на определенном расстоянии от ГГ, что бы игрок мог это видеть, а не при заходе на локацию по безусловному условию.

Жизнь следует измерять поступками, а не временем...

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

 

 

повторный спавн (переход в онлайн) НПС происходит не в прописанной точке path = aes2_osoznanie_walk_particle как это было при первом спавне, а в точке из которой он ушел в оффлайн

 

Что мешает создать для каждого телепорта по индивидуальному НПС и подменять их по очереди?


 

 

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

 

Раз ты собираешься делать потом спавн из скрипта, то сделай, что при заходе в рестриктор дается инфопоршень, а в скрипте при получении поршня спавнится НПС в координатах достаточных, чтобы ГГ мог увидеть этот спавн перед собой"

Не соответствует. N6260

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

Я проверил, условие "on_actor_dist_le" работает как в случае с НПС, так и с рестриктором одинаково, т. е. при приближении ГГ на дистанцию равную N или меньше происходит выполнение функций и т. д. 

 

Что мешает создать для каждого телепорта по индивидуальному НПС и подменять их по очереди?

Ничего не мешает в принципе, я просто хотел отработать с 1 НПС, а не несколькими... Мне стало интересно почему НПС не приходит в онлайн в первоначальной точке спавна, если схема зациклена на определенном пути "path = aes2_osoznanie_walk_particle", а именно туда, откуда был взят в оффлайн. Это такая особенность игры (движка) или надо доработать схему (логику)??? Если первое, тогда ваш совет будет единственно верным со спавном нескольких НПС, если второе, тогда где недочет в логике???

Жизнь следует измерять поступками, а не временем...

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

Могу только предполагать: поскольку пути path_walk имеют контрольные точки, по которым следует нпс, например

[bloodsucker_02_way_1]

points = p0,p1
p0:name = wp00
p0:position = 98.0355453491211,0.780927002429962,216.506912231445
p0:game_vertex_id = 54232
p0:level_vertex_id = -1
p0:links = p1(1)

p1:name = wp01
p1:position = 93.8923492431641,1.38035702705383,225.457122802734
p1:game_vertex_id = 90
p1:level_vertex_id = 191120



То нпс пока не вернется на первую точку т.к. она уже пройдена и он уже стоит на второй и должен закончить ее. По крайней мере сколько я в ЧН\ЗП не убегал\возвращался к нпс они никогда свою работу не начинали с начала, все время с той точки, где они ушли оффлайн.

Не соответствует. N6260

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

@ZeeK, А если так?:

ignore = {"wpn_beretta","wpn_colt1911","wpn_desert_eagle","wpn_fort","wpn_hpsa"}
    if not string.find(item:section(),ignore) then db.actor:transfer_item(item, inv_box_1) end
Ссылка на комментарий

 А если так?:

 

 

Нет, загружается, но во время диалога вылет, причем такой, который в поиске гугл по сталкеру и не попадается "bad argument #2 to 'find' (string expected, got table)"

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

Не соответствует. N6260

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

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

---------------------------------

www.amk-zone.de

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

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

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

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

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

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

Войти

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

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

AMK-Team.ru

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