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

[SoC] Ковыряемся в файлах


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

@UnLoaded

if data.custom_data:getString() == "" then
data.custom_data:setString("сюда пишешь свою кастом дату")
end

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

Ссылка на комментарий
"сюда пишешь свою кастом дату"

Символы переноса строки(\n) - легитимны ?

 

Раз уж пошло такое хорошо по работе с нет-пакетом, спрошу: как правильно прописать StoryID неписю(при скриптовом спавне) с использованием того-же модуля Artos'а ?

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

@UnLoaded, для переноса строки в назначаемой скриптом кастом дате следует использовать "\n".

Да, ты уже и сам догадался. :)

 

Для изменения story_id необходимо поработать с абстрактной частью нет-пакета, которая доступна только в момент выхода объекта в онлайн или при сохранении.

За инструкцией лучше всего обратиться к руководству от автора:

Про специальный нет-пакет '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.

 

Но такие вопросы больше относятся к теме «Скриптование».

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

@UnLoaded, точно так же как и любой другой параметр. Там "прозрачная" система на таблицах, все как на ладони, Artos к тому же подробное сопровождение написал.

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

Здравствуйте ВАМ. Кто может подсказать, как заспавнить монолитовцев в саркофаг вторично. По ходу нароботки, ГГ дважды идет в саркофаг. Сопротивления НОЛЬ, нет ни одного монолитовца после первой бойни.

Одна голова хорошо, а две лучше. А вот три, это уже змей Горыныч.

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

Я конечно в скриптах полное днище, но почему не происходит спавна объекта понять не могу (на другой функции проверил - работает):

 

Сам спавн вызывается из логики выключателя:

 

 

[logic]
active = ph_button@air_conditioning_system_off

[ph_button@air_conditioning_system_off]
on_info     = {+lab_x7_air_conditioning_system_turned_on} ph_idle@nil
anim        = lab_primary_switcher_idle
tooltip     = tips_lab_x7_air_conditioning_system_switcher
on_press    = ph_button@air_conditioning_system_on %=lab_x7_air_conditioning_system_turned_on%

[ph_button@air_conditioning_system_on]
anim        = lab_primary_switcher_off

[ph_idle@nil] 

 

 

 

Дальше, стандартная переброска вызова функции из xr_effects.script в свой скрипт:

 

 

function lab_x7_air_conditioning_system_turned_on()
	db.actor:db.actor:give_info_portion("lab_x7_air_conditioning_system_turned_on") 
	this.remove_all_lab_x7_static_ventilators()
	this.create_lab_x7_animated_ventilators()
end

function remove_all_lab_x7_static_ventilators()
	local id, obj
	for id=0, 65535 do
		obj = level.object_by_id(id)
		if obj ~= nil and obj:section() == "lab_x7_static_ventilators" then
			alife():release(alife():object(id), true)
		end
	end
end

function create_lab_x7_animated_ventilators() 
local ser_obj = alife():create("lab_x7_animated_ventilator",vector():set(-99.62,-18.25,73.64),2889,802) -- пока один, для тестов
	if ser_obj then
		local pk = m_netpk.get(ser_obj) 
			if pk and pk:isOk() then
		local data = pk:get() 
			if data and data.upd then
				data.fixed_bones = "link"
				pk:set(data)
			if data.custom_data:getString() == "lab_x7_animated_ventilator" then
				data.custom_data:setString("alex_mod\lab_x7_ventilators.ltx")
				end
			end
		end
	end
end 

 

 

 

Ну и секция предметов для спавна:

 

 

[lab_x7_static_ventilator]:identity_immunities
GroupControlSection 		= spawn_group
discovery_dependency 		= 
$spawn 				= "alex_mod\devices\lab_x7_static_ventilator"
class				= O_PHYS_S
cform				= skeleton
visual				= alex_mod\objects\ventilator_lab_static.ogf
custom_data			= scripts\alex_mod\lab_x7_ventilators.ltx
script_binding      		= bind_physic_object.init

[lab_x7_animated_ventilator]:identity_immunities
GroupControlSection 		= spawn_group
discovery_dependency 		= 
$spawn 				= "alex_mod\devices\lab_x7_animated_ventilator"
class				= O_PHYS_S
cform				= skeleton
visual				= physics\decor\ventilator_mike.ogf
custom_data			= scripts\alex_mod\lab_x7_ventilators.ltx
script_binding      		= bind_physic_object.init 

 

 

 

Может чего прописал не так, или не зарегестрировал?

 

З.Ы. Вспомнил, что помимо спавна и удаления объектов с логикой и прикрепленными костями, необходимо еще иметь возможность их разворота, аналогично all.spawn-ому. Надеюсь для этого тоже чего-нибудь придумали?

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

, непонятно, что такое "стандартная переброска".

Что мешает сразу поставить вентиляторы с анимированными моделями и переключать им анимации по получению инфопоршня?

db.actor:db.actor:give_info_portion

Тут должно быть db.actor:give_info_portion.

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

Ребят подскажите пжлста в чем проблема, где копать?
 
Expression    : assertion failed
Function      : CKinematics::Load
File          : ..\xrRender\SkeletonCustom.cpp
Line          : 208
Description   : data->find_chunk(OGF_S_BONE_NAMES)

Очевидно, в моделях. Что-то не то с костями. Что, собственно, и написано в логе. dc

Изменено пользователем Dennis_Chikin
Ссылка на комментарий
Stalker_AleX333, непонятно, что такое "стандартная переброска".

Обычная функция вида:

function test()
my_script.test()
end
db.actor:db.actor:give_info_portion

Тут должно быть db.actor:give_info_portion.

Описался когда последний раз правил сообщение. В скрипте данной ошибки нет.

 

Что мешает сразу поставить вентиляторы с анимированными моделями и переключать им анимации по получению инфопоршня?

Предполагаю, что требуются правки логики похожие на этот пример:

[collide]
ignore_static

[logic]
active   = ph_idle@ventilator_off

[ph_idle@ventilator_off]
anim     = idle
on_info  = {+lab_x7_air_conditioning_system_turned_on} ph_idle@ventilator_on

[ph_idle@ventilator_on]
anim     = work

Если кто-то знает больше - просветите, буду безмерно благодарен.

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

Так чего еще просвещать - нормальная логика, должна работать. Инфо-порцию lab_x7_air_conditioning_system_turned_on выдавай в логике переключателя:

on_press = ph_button@air_conditioning_system_on %+lab_x7_air_conditioning_system_turned_on%.

Секцию вентилятора оставь одну, логику пропиши в файл lab_x7_ventilators.ltx.

 

 

 

нет ни одного монолитовца после первой бойни.

Смотреть надо настройки смартов, под которыми эти монолитовцы работали. Вполне может быть, что по факту полного уничтожения населения смарта происходит его роспуск(т.е. смарт выключается и гулаг, приписанный к смарту, перестает работать). Ну и респавнеры стоит поискать и проверить - может просто нет пополнения смартов.

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

@UnLoaded, как ни странно, но данный вариант тоже почему-то не хочет работать.

 

Опишу по порядку, что делал (общая схема работы думаю уже ясна: дергаем выключатель - начинают "работать" вентиляторы):

 

1. В СДК подгрузил модельку вентилятора, изменил под себя анимации (медленное вращение - (idle) и собственно, работа (work) - быстрое вращение).

Отдельно сделал копию модельки вентилятора с приставкой static, без анимаций. (для антуража, т.к. некоторые из них должны не работать)

 

2. Секция выключателя в all.spwne и его логика (выдаваемый им инфопоршень зарегистрировал):

 

 

Секция в all.spawnе:

[2247]

; cse_abstract properties
section_name = physic_object
name = labx7_ventilation_system_switcher
position = -79.8399963378906, -9, 54.939998626709
direction = -1.95476889610291, 0, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8990

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static

[logic]
cfg = scripts\alex_mod\lab_x7_ventilation_system_switcher.ltx
END

; cse_visual properties
visual_name = physics\keyboard\lab_primary_switcher

; cse_ph_skeleton properties
skeleton_name = lab_primary_switcher_idle

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link

Последняя версия логики, на данный момент:

[logic]
active 	    = ph_button@ventilation_system_off

[ph_button@ventilation_system_off]
on_info     = {+lab_x7_ventilation_system_turned_on} ph_idle@nil
anim        = lab_primary_switcher_idle
tooltip     = tips_lab_x7_ventilation_system_switcher
on_press    = ph_button@ventilation_system_on %+lab_x7_ventilation_system_turned_on%

[ph_button@ventilation_system_on]
anim        = lab_primary_switcher_off

[ph_idle@nil] 

 

 

 

2. Секции для вентиляторов в all.spwne и их логика:

 

 

Пример секций в all.spawne для статичных и анимированных моделей:

[2358]

; cse_abstract properties
section_name = physic_object
name = labx7_ventilator_01
position = -99.6182250976563, -14.9479446411133, 73.6351470947266
direction = 0, -1.57079637050629, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8959

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static

[logic]
cfg = scripts\alex_mod\lab_x7_ventilators.ltx
END

; cse_visual properties
visual_name = alex_mod\objects\lab_x7_ventilator

; cse_ph_skeleton properties
skeleton_name = idle

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[2362]

; cse_abstract properties
section_name = physic_object
name = labx7_ventilator_05
position = -75.750862121582, -15.3341751098633, 55.7204208374023
direction = 0, 0, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8963

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static
END

; cse_visual properties
visual_name = alex_mod\objects\lab_x7_ventilator_static

; cse_ph_skeleton properties
skeleton_name =  

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link 

Логика (для анимированных моделей):

[logic]
active      = ph_idle@ventilators_off

[ph_idle@ventilators_off]
on_info     = {+lab_x7_ventilation_system_turned_on} ph_idle@ventilators_on
anim        = idle

[ph_idle@ventilators_on]
anim        = work 

 

 

 

Собственно, вроде все, надеюсь ничего не забыл.

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Ссылка на комментарий
Такое вот в логе:
~ cannot remove restriction with id [2919][agr_zone_radioactive_average] to the entity with id [2993][agr_flesh_normal], because it is not added
~ cannot remove restriction with id [2919][agr_zone_radioactive_average] to the entity with id [2993][agr_flesh_normal], because it is not added
~ cannot remove restriction with id [2919][agr_zone_radioactive_average] to the entity with id [2993][agr_flesh_normal], because it is not added
~ cannot remove restriction with id [2919][agr_zone_radioactive_average] to the entity with id [2993][agr_flesh_normal], because it is not added
~ cannot remove restriction with id [2919][agr_zone_radioactive_average] to the entity with id [2994][agr_flesh_normal_0000], because it is not added
~ cannot remove restriction with id [2919][agr_zone_radioactive_average] to the entity with id [2994][agr_flesh_normal_0000], because it is not added

В СДК нашел на Агропроме этих двух плотей и радиоактивную зону, все в районе болота, где вагончик с солдатом-дезертиром. Сравнил с другими мобами и зонами на этой локе - все то-же самое. Вот только не пойму на что ругань, из моих познаний английского вроде: "Не возможно удалить рестриктор [...] у объекта [...], потому, что он не добавлен". Разъясните плиз, что и у чего не добавлено, и как исправить ?
 

, все вроде нормально прописано.

Собственно как не работает: выключатель отрабатывает анимацию ? А вентиляторы нет ? Попробуй добавить в логику и переключателю и вентиляторам вывод контрольных сообщений в лог или на худ, чтоб протестить в каком месте логика не срабатывает.

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

@UnLoaded, проверил оба файла логики - отработка нормальная, но анимки вентиляторов никак не изменяются.


upd. Проблему решил. Необходимо было изменить схему работы вентиляторов во второй части, с ph_idle на ph_button.

  • Согласен 1

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

2 UnLoaded: боюсь, есть только погадайки, а я сам на них здесь ругаюсь. Ну, в общем, зоны с радиацией монстрам не добавляются, а чистится все, что есть, без проверок. Забить, либо не пускать монстров в местность с радиацией. В данном случае - плотей в воду (ага, аи-сетка).

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

 

 

Проблему решил. Необходимо было изменить схему работы вентиляторов во второй части, с ph_idle на ph_button.
Не понял ниче. Покажи уж, что ты изменил, после чего заработало ?
  • Согласен 1
Ссылка на комментарий

@UnLoaded, без проблем (проверил сейвами - анимка запоминается):

[logic]
active = ph_idle@ventilators_off

[ph_idle@ventilators_off]
on_info     = {+lab_x7_ventilation_system_turned_on} ph_button@ventilators_on

[ph_button@ventilators_on]
anim        = work
Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

, нет смысла писать в схему параметры, которые она не вычитывает. Смотри функции set_scheme в файлах, соответствующих схемам. Для ph_idle вычитываются параметры

 "hit_on_bone" - хитование по кости
 "nonscript_usable" - разрешает юзаемость
 "on_use" - событие на юзание
 "tips" - подсказка
а для ph_button 
"on_press"- действие на юзание
"tooltip" - подсказка
"anim" - имя анимации
"anim_blend" - смешивать анимации
Поэтому anim для ph_idle у тебя и не работало. Кондлисты on_info просчитываются на обновлении текущей схемы логики, если оно есть.

 

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

@Charsi, как-то не подумал об этом сразу, спасибо.

 

Вот чего-то крашится такая конструкция:

 

all.spawn:

 

 

[2147]

; cse_abstract properties
section_name = space_restrictor
name = labx7_biohazard_space_restrictor
position = -81.5000610351563, -7.43783712387085, 86.2225875854492
direction = 0, 0, 0
id = 65535
version = 118
script_version = 7
spawn_id = 8991

; cse_alife_object properties
game_vertex_id = 2870
level_vertex_id = 974
object_flags = 0xffffef3e
custom_data = <<END
[logic]
cfg = scripts\alex_mod\lab_x7_biohazard.ltx
END

; cse_shape properties
shapes = 1
shape_0:type = box
shape_0:axis_x = 80,0,0
shape_0:axis_y = 0,60,0
shape_0:axis_z = 0,0,70
shape_0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 0 

 

 

 

Логика:

 

 

[logic]
active = sr_idle@biohazard
 
[sr_idle@biohazard]
on_actor_inside = {+lab_x7_ventilation_system_turned_on} nil, {=lab_x7_biohazard_check_actor_outfit -lab_x7_actor_have_bioprotection_outfit} sr_timer@no_bioprotection_outfit, 
{=lab_x7_biohazard_check_actor_outfit +lab_x7_actor_have_bioprotection_outfit} sr_timer@with_bioprotection_outfit
 
[sr_timer@no_bioprotection_outfit]
type = dec
start_value = 72000
on_value = 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard
on_info = {+lab_x7_ventilation_system_turned_on} nil
string = lab_x7_biohazard_attention

[sr_timer@with_bioprotection_outfit]
type = dec
start_value = 144000
on_value = 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle@biohazard
on_info = {+lab_x7_ventilation_system_turned_on} nil
string = lab_x7_biohazard_attention 

 

 

 

Скрипт:

 

 

function lab_x7_biohazard_check_actor_outfit()
    local outfit = db.actor:item_in_slot(6)
	if outfit:section() == "ecolog_outfit"
	or outfit:section() == "protection_outfit"	
        or outfit:section() == "seva_outfit" 
	or outfit:section() == "medic_seva_outfit"
	or outfit:section() == "svoboda_scientific_outfit"
	or outfit:section() == "dolg_scientific_outfit"	then
	db.actor:give_info_portion("lab_x7_actor_have_bioprotection_outfit")
	else
	return false
    end
end 

 

 

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

, нужно проверять наличие объекта перед действиями с ним( в данном случае применения метода section).

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

 

 

local vaild_outfits = {
["ecolog_outfit"] = true,
["protection_outfit"] = true,
["seva_outfit"]  = true,
["medic_seva_outfit"] = true,
["svoboda_scientific_outfit"] = true,
["dolg_scientific_outfit"] = true}

function lab_x7_biohazard_check_actor_outfit()
	local outfit = db.actor:item_in_slot(6)
	if outfit and vaild_outfits[outfit:section()] then
		db.actor:give_info_portion("lab_x7_actor_have_bioprotection_outfit")
		return true
	else
		return false
	end
end 

 

 

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

Посмотрел только функцию lab_x7_biohazard_check_actor_outfit.

Кондишены должны возвращать либо true либо false.

false у тебя может возвратиться. А true где?

Поправь 

...
db.actor:give_info_portion("lab_x7_actor_have_bioprotection_outfit")
return true
...

З.Ы. Опоздал  )

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

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

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

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

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

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

Войти

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

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

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