Скриптование - Страница 355 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

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

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
 

Подскажите, как можно убить монстра в оффлайне помимо метода  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

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

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

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

 

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

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

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

???

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

 

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

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

Вопрос по 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

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

Опять с оффлайном немного заморочился. Создал секции в 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 как это было при первом спавне, а в точке из которой он ушел в оффлайн

 

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


 

 

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

 

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

Я проверил, условие "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



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

@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

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

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

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

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

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

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

Войти

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

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

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