Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


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


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

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

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
denis2000Дата: Ср, 31.07.2013, 18:34 | Сообщение # 542
Полевой исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 543
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

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

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

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

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Ср, 31.07.2013, 18:44 | Сообщение # 545
Лидер «Свободы»
Свобода
Сообщений: 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 | Сообщение # 546
Полевой исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 547
Полевой исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 548
Новичок
Пользователи
Сообщений: 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 | Сообщение # 549
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 550
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

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


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

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

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


 
gamerДата: Ср, 31.07.2013, 23:52 | Сообщение # 553
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

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

[cut noguest=all.spawn][20000]
; cse_abstract properties
section_name = smart_terrain
name = zat_b216_mon
position = 247.16491699219,18.105577468872,527.29174804688
direction = -0.61985343694687,0,-0.7847176194191

; cse_alife_object properties
game_vertex_id = 292
distance = 0.699999988079071
level_vertex_id = 1388877
object_flags = 0xffffff3e
custom_data = <<END
[smart_terrain]
cfg = scripts\zaton\smart\zat_b216_mon.ltx

END

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

; cse_alife_space_restrictor properties
restrictor_type = 3

; se_smart_terrain properties

[/cut]

[cut noguest=zat_b216_mon][smart_terrain];zat_b216_mon
squad_id = 16
max_population = 16
respawn_params = respawn@zat_b216_mon

[respawn@zat_b216_mon]
spawn_tushkano

[spawn_tushkano]
spawn_squads = zat_m1_squad
spawn_num = 16 [/cut]

[cut noguest=squad_descr_zaton]
[zat_m1_squad]:online_offline_group
faction = monster
npc = rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, karlik_normal, karlik_normal, karlik_normal, karlik_normal, karlik_normal, tushkano_normal, tushkano_normal, tushkano_normal, tushkano_normal
target_smart = zat_b216_mon
spawn_point = zat_b216_mon_1_spawn
story_id = zat_m1_squad[/cut]

[cut noguest=simulation_objects_props][zat_m1_squad]:default_squad
sim_avail = true[/cut]

[cut noguest=simulation]
zat_m1_squad = zat_b216_mon[/cut]
 
makdmДата: Чт, 01.08.2013, 00:25 | Сообщение # 554
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

gamer,
spawn_num = 16
Это не количество НПС, а количество сквадов.
Зачем Вам 16 сквадов по 16 НПС в каждом?
Это же относится и к max_population = 16


Терпение......
И все получится!


Сообщение отредактировал makdm - Чт, 01.08.2013, 00:27
 
sergej5500Дата: Чт, 01.08.2013, 18:07 | Сообщение # 555
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый День. Делаю квест для СГМ 2.1 на зачистку ВНЗ Круг от Альфы.
[cut=Типовая логика альфовца.][logic]
active = move@walking
on_death = death

[death]
on_info = %+zat_b38_alfa1_death%

[move@walking]
move_dest_number = 206665
move_state_when_center = guard
move_state_when_move = walk
move_look_vertex = 246485
meet = meet

[meet]
abuse = true
use = {!actor_enemy} true, false
allow_break = true
meet_on_talking = false[/cut]
Всего там этих альфовцев 30. Их ID: zat_b38_alfa1, zat_b38_alfa2 и т.д. Хочу сделать квест на зачистку ВНЗ при помощи группы сталкеров по типу квестов на зачистку баз Чапая и Киборга. ID сталкеров штурмовой группы zat_b38_stalker1, zat_b38_stalker2 и т.д. Всего 12. В СГМ 2.1 сталкеры и альфа изначально нейтральны друг другу. Автор мода для этих квестов использовал специальные группировки сталкеров: army_alies и stalker_alies, которые враждебны бойцам Чапая и Киборга. Вопрос: можно ли в логике или через скрипт прописать взаимную враждебность носителей определённого ID (zat_b38_alfa** и zat_b38_stalker**) после прихода определенной инфопорции. Про настройку отношений группировок через скрипт я знаю. Этот метод полностью ссорит группировки, что нежелательно. Здесь нужна именно враждебность двух групп при общей нейтральности отношений между группировками. Новую группировку добавлять пока не хочется. Можно ли решить эту задачу? Заранее благодарен за советы.
 
Поиск: