Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Спавн и логика
denis2000Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Спавн и логика

Создание объектов на локации и логика поведения этих объектов

Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]

[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                    local reason = string.format(fmt, ...)
                    error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Code
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Code
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Ср, 31.07.2013, 18:19 | Сообщение # 541
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

9vova8, покажи, пожалуйста, строки из way_...ltx


 
NIVДата: Ср, 31.07.2013, 18:24 | Сообщение # 542
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Здравствуйте! Извиняюсь, если этот вопрос уже поднимался.
Можно ли при спауне физического объекта через скрипт использовать значения directions (углов поворота)?
Если да, то в каком виде нужно прописывать вектор position в функции alife():create(section,position,levelvertex,gamevertex)?


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Ср, 31.07.2013, 18:24
 
FantomICWДата: Ср, 31.07.2013, 18:31 | Сообщение # 543
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

NIV, этот вопрос достаточно часто поднимают модмейкеры. И на АМК, и на Ап-про. Здесь, правда, я его давно не видал.
К сожалению, через всеми нами любимый alife():create(section,position,levelvertex,gamevertex) такого сделать нельзя. Увы. Но существует альтернатива all.spawn - скриптовой способ спавна Net-Packet. В нем можно указать direction.





Сообщение отредактировал FantomICW - Ср, 31.07.2013, 18:51
 
NIVДата: Ср, 31.07.2013, 18:32 | Сообщение # 544
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

FantomICW, а ссылочку дадите?

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
denis2000Дата: Ср, 31.07.2013, 18:34 | Сообщение # 545
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

NIV, Указанная тобой функция помимо всего возвращает в качестве результата объект который создала, а ему можно задать угол.
Для физического объекта:
Код
local se_obj = alife():create(***)
se_obj:set_yaw(yaw * math.pi / 180)

Для сталкера:
Код
se_obj:o_torso().yaw = yaw * math.pi / 180

где yaw - угол поворота объекта в градусах.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Ср, 31.07.2013, 18:39 | Сообщение # 546
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

denis2000, спасибо, счас попробуем. А вокруг какой оси этот угол? Их же 3.

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
denis2000Дата: Ср, 31.07.2013, 18:41 | Сообщение # 547
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

NIV, Вокруг Y естественно, для вращения по другим осям нужно спавнить указанными FantomICW способами.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Ср, 31.07.2013, 18:44 | Сообщение # 548
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

NIV, вот, например, пара статей с Инсайда:
Ссылка 1
Ссылка 2
Еще нашел скрипт от antreg
[cut=Скрипт спавна аномалий]
Код
function get_story_id_not_replay()  
local ST  
ST = xr_logic.pstor_retrieve(db.actor, "ScriptAnomId", 0)  
if type(ST) ~= "number" or ST == nil then  
ST = 9000  
xr_logic.pstor_store(db.actor, "ScriptAnomId", ST)  
end  
if type(ST) == "number" or ST ~= nil then  
ST = ST + 1  
xr_logic.pstor_store(db.actor, "ScriptAnomId", ST)  
end  
return tonumber(ST)  
end  

function create_anom(name_anom, posit_anom, lvid_anom, gvid_anom, radius_anom, power_anom)  
local obj = alife():create(name_anom, posit_anom, lvid_anom, gvid_anom)  

-----------------------write----------------------  
local packet = net_packet()  
obj:STATE_Write(packet)  

-----------------------load-----------------------  
-- cse_alife_object  
local game_vertex_id = packet:r_u16()  
local distance = packet:r_float()  
local direct_control = packet:r_u32()  
local level_vertex_id = packet:r_u32()  
local object_flags = packet:r_u32()  
local custom_data = packet:r_stringZ()  
local story_id = packet:r_u32()  
local spawn_story_id = packet:r_u32()  

-- cse_shape  
local shape_count = packet:r_u8()  
for i=1,shape_count do  
local shape_type = packet:r_u8()  
if shape_type == 0 then  
-- sphere  
local center = packet:r_vec3()  
local radius = packet:r_float()  
else  
-- box  
local box = packet:r_matrix()  
end  
end  

-- cse_alife_space_restrictor  
local restrictor_type = packet:r_u8()  

-- cse_alife_custom_zone  
local max_power = packet:r_float()  
local owner_id = packet:r_u32()  
local enabled_time = packet:r_u32()  
local disabled_time = packet:r_u32()  
local start_time_shift = packet:r_u32()  

-- cse_alife_anomalous_zone  
local offline_interactive_radius = packet:r_float()  
local artefact_spawn_count = packet:r_u16()  
local artefact_position_offset = packet:r_u32()  

-- se_zone_anom  
local last_spawn_time_present = packet:r_u8()  

if (string.find (name_anom, 'zone_zharka_static') ~= nil  
or string.find (name_anom, 'zone_witches_galantine') ~= nil  
or string.find (name_anom, 'zone_mosquito_bald') ~= nil  
or string.find (name_anom, 'zone_mincer') ~= nil  
or string.find (name_anom, 'zone_gravi_zone') ~= nil  
or string.find (name_anom, 'zone_buzz') ~= nil )  
and packet:r_elapsed() ~= 0 then  
abort("left=%d", left)  
end  

---------------------------save--------------------  
-- cse_alife_object  
packet:w_begin(game_vertex_id)  
packet:w_float(distance)  
packet:w_u32(direct_control)  
packet:w_u32(level_vertex_id)  
object_flags = bit_not(193)  
packet:w_u32(object_flags)  
packet:w_stringZ(custom_data)  
packet:w_u32(get_story_id_not_replay())  
packet:w_u32(get_story_id_not_replay())  

-- cse_shape  
packet:w_u8(1) -- количество фигур  
packet:w_u8(0) -- тип фигуры: сфера  
packet:w_vec3(vector():set(0, 0, 0))  
if radius_anom ~= nil then  
packet:w_float(radius_anom)  
else  
packet:w_float(1.0)  
end  

-- cse_alife_space_restrictor  
packet:w_u8(restrictor_type)  

-- cse_alife_custom_zone  
if power_anom ~= nil then  
packet:w_float(power_anom)  
else  
packet:w_float(max_power)  
end  
packet:w_u32(owner_id)  
packet:w_u32(enabled_time)  
packet:w_u32(disabled_time)  
packet:w_u32(start_time_shift)  

-- cse_alife_anomalous_zone  
packet:w_float(offline_interactive_radius)  
packet:w_u16(artefact_spawn_count)  
packet:w_u32(artefact_position_offset)  

-- se_zone_anom  
packet:w_u8(last_spawn_time_present)  

------------------------read------------------------  
packet:r_seek(0)  
obj:STATE_Read (packet, packet:w_tell())  

end  

-----------------------------------спавним аномалии-----------------------------------  

function spawn_anom1()  
this.create_anom('zone_zharka_static', vector():set(-30.974,0.002,693.734),178968,2618, 3, 0.7)  
end  

function spawn_anom2()  
this.create_anom('zone_witches_galantine_strong', vector():set(-20.851,0.000,693.588),178968,2618, 5, 0.8)  
end  

function spawn_anom3()  
this.create_anom('zone_mincer_average', vector():set(-26.064,0.000,698.637),178968,2618, 4, 1)  
end
[/cut]



 
NIVДата: Ср, 31.07.2013, 19:02 | Сообщение # 549
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

denis2000, ваш первый способ работает. Для других интересующихся добавлю, что угол указывается в радианах, т.е. от +3.14 до -3.14. Или, как у denis2000, перевод из градусов.
Во втором способе лог говорит, что не знает такого метода o_torso. Лично мне не нравятся скобки () после него.
FantomICW, спасибо, будем смотреть.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Ср, 31.07.2013, 19:02
 
denis2000Дата: Ср, 31.07.2013, 19:14 | Сообщение # 550
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (NIV)
Или, как у denis2000, перевод из градусов.

Прошу прощения но не у меня, а у GSC.
Цитата (NIV)
Во втором способе лог говорит, что не знает такого метода o_torso.

Метод можно вызвать для объектов только определенного класса! clsid.script_actor и clsid.script_stalker
Цитата (NIV)
Лично мне не нравятся скобки () после него.

Курим функцию spawn_object из скрипта xr_effects.script


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
9vova8Дата: Ср, 31.07.2013, 20:58 | Сообщение # 551
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

FantomICW, [cut=way_zaton][zat_stalker_wait_smart_zat_stalker_wait_1_walk]
points = p0
p0:name = wp00 |a=assault
p0:flags = 0x1
p0:position = -178.46,8.93,80.57
p0:game_vertex_id = 246
p0:level_vertex_id = 584197[/cut]


 
sergej5500Дата: Ср, 31.07.2013, 21:22 | Сообщение # 552
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

9vova8,
У Вас в логике сталкера секция называется path_walk = zat_stalker_wait_1_walk.
В all.spawn прописана секция zat_stalker_wait_smart_zat_stalker_wait_1_walk. Вообще то, это разные секции. Естественно, что движок эту секцию не находит, и сталкеры попадают под симуляцию.
 
9vova8Дата: Ср, 31.07.2013, 21:42 | Сообщение # 553
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

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


 
sergej5500Дата: Ср, 31.07.2013, 21:54 | Сообщение # 554
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

9vova8,
Движок не принимает логику сталкеров. Где-то есть ошибка. Проверяйте или выложите все свои правки. Возможно, путь к файлам логики прописан неверно.
 
FantomICWДата: Ср, 31.07.2013, 22:00 | Сообщение # 555
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

9vova8, в логике отсутствует параметр path_look и его секции в way_zaton.ltx. Пробуй добавить.


 
Поиск: