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

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
denis2000Дата: Вс, 02.03.2014, 13:44 | Сообщение # 436
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата NIV ()
Как использовать выражение return, чтобы функция возвращала 2 (или n) значений?

Так: return 1,2, где 1 и 2 независимые передаваемые значения функции
Или так: return table, где table - таблица из n элементов.
Цитата NIV ()
Вопрос - можно ли поменять описание для hint, аналогично, как это делали командой InitTexture для текстуры?

Можно прописать hint текстуре - это конечно хорошо, но функции меняющей hint у выведенной текстуры вроде нет. Мне по крайней мере такая функция не известна (см. lua_help.script)
Цитата NIV ()
Какова должна быть последовательность действий? Может есть пример в каком-то моде?

Знал-бы сказал. Вернее так последовательность конечно хорошо известна, а вот ее реализация средствами LUA игры - нет.


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

Цитата denis2000 ()
Знал-бы сказал

ОК :). Я обратил внимание, что в ТЧ не было всплывающих окон, а инфа выводилась по клике на объекте. Можно попробовать сделать так (т.е. через кнопку?). А для всплывющих окон, наверное, нужно отслеживать положение курсора. Похоже, проблема в этом?


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

NIV, Можно отрабатывать шелчек левой/правой кнопки мыши (WINDOW_LBUTTON_UP или WINDOW_RBUTTON_UP), можно перемещение курсора над формой (по идее это WINDOW_MOUSE_MOVE), можно проверить другие события класса ui_events. Если использовать класс листбокс, то есть события клик и выделение объекта в списке (LIST_ITEM_CLICKED LIST_ITEM_SELECT).

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Ср, 05.03.2014, 18:52 | Сообщение # 439
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

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

Добавлено (05.03.2014, 13:27)
---------------------------------------------
Или такое вообще невозможно?

Бинго! denis2000
Есть конечно вариант пройтись по всем объектам игры удалить все ПМ, и в том-же месте заспавнить другой ПМ с измененным параметром, но опять таки ценой потери апгрейдов на этих стволах. denis2000

Добавлено (05.03.2014, 18:52)
---------------------------------------------
Нет, это не вариант, по крайней мере для меня. Вопрос закрыт

 
makdmДата: Пн, 10.03.2014, 09:40 | Сообщение # 440
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата strelok200 ()
по крайней мере для меня. Вопрос закрыт

strelok200, я тут на праздниках ( было время ) посмотрел вашу идею.
Сделать то, что вы хотите можно, но есть несколько нюансов.

После того, как скриптом проапгрейдить оружие, то для того чтобы изменения вступили в силу необходимо перевести оружие в оффлайн, а затем снова а онлайн. Для оружия, находящегося на не активных локациях всё гуууд. А вот на активной сложнее.
Если оружие бесхозное, то проблем нет ( оно переводится в офлайн-онлайн одной движковой функцией ), а вот если оружие имеет "хозяина" ( лежит в трупе, в инвентарном ящике, находится у НПС в рюкзаке ), то необходимо в оффлайн - онлайн переводить владельца оружия. Если с инвентарным ящиком всё просто ( он имеет прозрачную текстуру ), то с НПС выглядит некрасиво, если они находятся в радиусе видимости ГГ.
Поэтому лучше использовать скрипт при переходе ГГ с локации на локацию( выполнить функцию до перемещения ГГ в левел ченджер ).

Вызов скрипта из логики, например на все винторезы в игре установить настильность в 20 %

%=upgrade_weapon(wpn_vintorez:up_firstd_vintorez)%

Сам скрипт в xr_effects.script

Первый вариант: бесхозное оружие и ящики

[cut noguest=Первый вариант]local upgrades = {}
local upgrade_count = 0
local sect_upgr = nil
local has_upgr = false
local weapon_id = {}
local parent_id = 65535
local sw_online = nil

function upgrade_weapon( actor, npc, p )

local need_item = tostring( p[ 1 ] )
sect_upgr = tostring( p[ 2 ] )
weapon_id = {}

for i = 1,65535 do
local sobj = alife():object( i )
if sobj ~= nil then
if string.find( sobj:section_name(), need_item ) ~= nil then
local packet = net_packet()
packet:w_begin( 0 )
sobj:STATE_Write( packet )
packet:r_seek( 2 )
---------------------------------------------
--считываем параметры из нет пакета
---------------------------------------------
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local spawn_story_id = packet:r_s32()
local visual_name = packet:r_stringZ()
local visual_flags = packet:r_u8()
local condition = packet:r_float()
upgrade_count = packet:r_u32()
for i = 1, upgrade_count do
upgrades[ i ] = packet:r_stringZ()
end
local ammo_current = packet:r_u16()
local ammo_elapsed = packet:r_u16()
local weapon_state = packet:r_u8()
local addon_flags = packet:r_u8()
local ammo_type = packet:r_u8()
-----------------------------------------------------------------------------------------------------
--проверяем есть ли у оружия апгрейд, который мы хотим установить. Если нет, то устанавливаем апгрейд.
-----------------------------------------------------------------------------------------------------
has_upgr = false
if upgrade_count > 0 then
for i = 1, upgrade_count do
local need_sect_upgr = upgrades[ i ]
if need_sect_upgr == sect_upgr then
has_upgr = true
end
end
end

if has_upgr == false then
upgrade_count = upgrade_count + 1
upgrades[ upgrade_count ] = sect_upgr
weapon_id[ sobj.id ] = sobj.id
---------------------------------------------
--записываем параметры в нет пакет
---------------------------------------------
packet:w_begin( 0 )
packet:w_u16( game_vertex_id )
packet:w_float( distance )
packet:w_s32( direct_control )
packet:w_s32( level_vertex_id )
packet:w_s32( object_flags )
packet:w_stringZ( custom_data )
packet:w_s32( story_id )
packet:w_s32( spawn_story_id )
packet:w_stringZ( visual_name )
packet:w_u8( visual_flags )
packet:w_float( condition )
packet:w_u32( upgrade_count )
for i = 1, upgrade_count do
packet:w_stringZ( upgrades[ i ] )
end
packet:w_u16( ammo_current )
packet:w_u16( ammo_elapsed )
packet:w_u8( weapon_state )
packet:w_u8( addon_flags )
packet:w_u8( ammo_type )
packet:r_seek( 2 )
sobj:STATE_Read( packet, packet:w_tell() )
end
end
end
end

-----------------------------------------------------------------------------------
--Чтобы изменеия вступили в силу - переводим сначала апгрейденное оружие в офф-лайн
--Если оружие имеет владельцев, то переводим в офф-лайн владельцев оружия
-----------------------------------------------------------------------------------
for k,v in pairs( weapon_id ) do
local id = tonumber( v )
local w_online = level.object_by_id( id )
if w_online then
sw_online = alife():object( id )
parent_id = sw_online.parent_id
if parent_id then
if parent_id == 65535 then
sw_online:switch_offline()
else
if parent_id ~= db.actor:id() then
alife ():set_switch_online ( parent_id, false)
alife ():set_switch_offline ( parent_id, true )
end
end
end
end
end
-------------------------------------------------------------------------------------
--А затем спустя 2 сек переводим апгрейденное оружие ( или его владельцев ) в он-лайн
-------------------------------------------------------------------------------------
local it_is_time = time_global() + 2000

level.add_call(

function ()
if time_global() > it_is_time then
return true
end
end,

function ()
for k,v in pairs( weapon_id ) do
local id = tonumber( v )
sw_online = alife():object( id )
parent_id = sw_online.parent_id
if parent_id then
if parent_id ~= 65535 then
alife ():set_switch_online ( parent_id, true )
alife ():set_switch_offline ( parent_id, false )
end
end
end
end
)
end[/cut]

Второй вариант: бесхозное оружие, ящики и сквады.

[cut noguest=Второй вариант]local upgrades = {}
local upgrade_count = 0
local sect_upgr = nil
local has_upgr = false
local weapon_id = {}
local parent_id = 65535
local squad_id = nil
local sw_online = nil
local parent_id_tbl = {}
local squad_id_tbl = {}

function upgrade_weapon( actor, npc, p )

local need_item = tostring( p[ 1 ] )
sect_upgr = tostring( p[ 2 ] )
weapon_id = {}
for i = 1,65535 do
local sobj = alife():object( i )
if sobj ~= nil then
if string.find( sobj:section_name(), need_item ) ~= nil then
local packet = net_packet()
packet:w_begin( 0 )
sobj:STATE_Write( packet )
packet:r_seek( 2 )
---------------------------------------------
--считываем параметры из нет пакета
---------------------------------------------
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local spawn_story_id = packet:r_s32()
local visual_name = packet:r_stringZ()
local visual_flags = packet:r_u8()
local condition = packet:r_float()
upgrade_count = packet:r_u32()
for i = 1, upgrade_count do
upgrades[ i ] = packet:r_stringZ()
end
local ammo_current = packet:r_u16()
local ammo_elapsed = packet:r_u16()
local weapon_state = packet:r_u8()
local addon_flags = packet:r_u8()
local ammo_type = packet:r_u8()
-----------------------------------------------------------------------------------------------------
--проверяем есть ли у оружия апгрейд, который мы хотим установить. Если нет, то устанавливаем апгрейд.
-----------------------------------------------------------------------------------------------------
has_upgr = false
if upgrade_count > 0 then
for i = 1, upgrade_count do
local need_sect_upgr = upgrades[ i ]
if need_sect_upgr == sect_upgr then
has_upgr = true
end
end
end

if has_upgr == false then
upgrade_count = upgrade_count + 1
upgrades[ upgrade_count ] = sect_upgr
weapon_id[ sobj.id ] = sobj.id
---------------------------------------------
--записываем параметры в нет пакет
---------------------------------------------
packet:w_begin( 0 )
packet:w_u16( game_vertex_id )
packet:w_float( distance )
packet:w_s32( direct_control )
packet:w_s32( level_vertex_id )
packet:w_s32( object_flags )
packet:w_stringZ( custom_data )
packet:w_s32( story_id )
packet:w_s32( spawn_story_id )
packet:w_stringZ( visual_name )
packet:w_u8( visual_flags )
packet:w_float( condition )
packet:w_u32( upgrade_count )
for i = 1, upgrade_count do
packet:w_stringZ( upgrades[ i ] )
end
packet:w_u16( ammo_current )
packet:w_u16( ammo_elapsed )
packet:w_u8( weapon_state )
packet:w_u8( addon_flags )
packet:w_u8( ammo_type )
packet:r_seek( 2 )
sobj:STATE_Read( packet, packet:w_tell() )
end
end
end
end

-----------------------------------------------------------------------------------
--Чтобы изменеия вступили в силу - переводим сначала апгрейденное оружие в офф-лайн
--Если оружие имеет владельцев, то переводим в офф-лайн владельцев оружия
-----------------------------------------------------------------------------------
for k,v in pairs( weapon_id ) do
local id = tonumber( v )
local w_online = level.object_by_id( id )
if w_online ~= nil then
sw_online = alife():object( id )
parent_id = sw_online.parent_id
if parent_id then
if parent_id ~= db.actor:id() then
----------------------если оружие бесхозное, то сразу его в оффлайн\онлайн
if parent_id == 65535 then

sw_online:switch_offline()

else
if is_object_online( parent_id ) then
---------------------------у оружия есть хозяин и если он входит в сквад, то весь сквад в оффлайн
local sobj_parent = alife():object( parent_id )
squad_id = sobj_parent.group_id

if squad_id ~= nil then
local squad = alife():object( squad_id )
if squad ~= nil then
alife ():set_switch_online ( squad_id, false )
alife ():set_switch_offline ( squad_id, true )
squad_id_tbl[ squad_id ] = squad_id
end
else
---------------------------это не сквад, а инвентарный ящик или НПС. Весь ящик в оффлайн и НПС туда же.
alife ():set_switch_online ( parent_id, false )
alife ():set_switch_offline ( parent_id, true )
parent_id_tbl[ parent_id ] = parent_id
end
end
end
end
end
end
end
-------------------------------------------------------------------------------------
--А затем спустя 2 сек переводим владельцев апгрейденного оружия в он-лайн
-------------------------------------------------------------------------------------

local it_is_time = time_global() + 2000

level.add_call(

function ()
if time_global() > it_is_time then
return true
end
end,

function ()

for l,m in pairs( squad_id_tbl ) do
local sq_id = tonumber( m )
local sim = alife ()
if sim ~= nil then
sim:set_switch_online( sq_id, true )
sim:set_switch_offline( sq_id, false )
end
end

for k,v in pairs( parent_id_tbl ) do
local par_id = tonumber( v )
local sim = alife ()
if sim ~= nil then
sim:set_switch_online( par_id, true )
sim:set_switch_offline( par_id, false )
end
end

end
)
end[/cut]


Терпение......
И все получится!
 
denis2000Дата: Пн, 10.03.2014, 14:39 | Сообщение # 441
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

makdm, Как быть с оружием в руках ГГ? Вываливать под ноги, переводить в офлайн, затем в онлайн и подбирать?

PS: Ведь насколько я понял речь идет о реализации некоего скилла, повышающего навык владения оружием ГГ. То есть если скилл получен все оружие попадающее в руки ГГ (или находящееся в руках) должно увеличит свой параметр например настильность. Установить параметр у оружия можно двумя способами - апгрейд оружия (скриптово или у механника) или переспавн оружия с другим значением настильности. Апгрейд хорошо, но не красиво поскольку он будет виден и это будет странно, все оружие (а точнее попадающее в руки ГГ будет иметь апгрейд и это странно). Переспавн - лучше, но нужно перенести апгрейды и аддоны. Отсюда вопрос озвученный выше - как это реализовать корректно и не привлекая внимания игрока.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Пн, 10.03.2014, 15:20 | Сообщение # 442
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

denis2000, именно так и можно сделать. Другого я тоже ничего не придумал, поэтому в функции это и не прописывал.
И поэтому пишу, что лучше это делать при переходе с локации на локацию. Тогда изменённые параметры оружия у ГГ автоматом будут загружены в нет пакет при новом спавне ГГ на другой локации.


Терпение......
И все получится!
 
denis2000Дата: Пн, 10.03.2014, 15:26 | Сообщение # 443
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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

К стати я пробовал делать апгрейд ствола из инвентаря ГГ предварительно выкинув его под ноги - апгрейд не установился и офлайн-онлайн не помогал. У тебя есть конкретный код для этого?


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Пн, 10.03.2014, 15:38 | Сообщение # 444
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата denis2000 ()
Переспавн - лучше, но нужно перенести апгрейды и аддоны

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

Добавлено (10.03.2014, 15:38)
---------------------------------------------

Цитата denis2000 ()
У тебя есть конкретный код для этого?

Сейчас нарисую.


Терпение......
И все получится!
 
denis2000Дата: Пн, 10.03.2014, 15:46 | Сообщение # 445
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата makdm ()
Алгоритм примерно такой.

Алгоритм то известен, а вот какой конкретно для этого код нужен нет. И проблема в том, что это все таки заметно для игрока будет, нужно делать затемнение - например, а следовательно делать это в катсцене или во время сна или во время перехода на локацию.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Пн, 10.03.2014, 17:06 | Сообщение # 446
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

denis2000, вот скрипт апгрейда оружия у ГГ скриптом.

[cut noguest]local sect_upgr = nil
local upgrade_count = 0
local upgrades = {}
function upgr_weapon( actor, npc, p )

local need_item = tostring( p[ 1 ] )
sect_upgr = tostring( p[ 2 ] )
local obj = db.actor:object( need_item )
local sobj = alife():object( obj:id() )
if sobj ~= nil then
local packet = net_packet()
packet:w_begin( 0 )
sobj:STATE_Write( packet )
packet:r_seek( 2 )
---------------------------------------------
--считываем параметры из нет пакета
---------------------------------------------
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local spawn_story_id = packet:r_s32()
local visual_name = packet:r_stringZ()
local visual_flags = packet:r_u8()
local condition = packet:r_float()
upgrade_count = packet:r_u32()
for i = 1, upgrade_count do
upgrades[ i ] = packet:r_stringZ()
end
local ammo_current = packet:r_u16()
local ammo_elapsed = packet:r_u16()
local weapon_state = packet:r_u8()
local addon_flags = packet:r_u8()
local ammo_type = packet:r_u8()

upgrade_count = upgrade_count + 1
upgrades[ upgrade_count ] = sect_upgr
---------------------------------------------
--записываем параметры в нет пакет
---------------------------------------------
packet:w_begin( 0 )
packet:w_u16( game_vertex_id )
packet:w_float( distance )
packet:w_s32( direct_control )
packet:w_s32( level_vertex_id )
packet:w_s32( object_flags )
packet:w_stringZ( custom_data )
packet:w_s32( story_id )
packet:w_s32( spawn_story_id )
packet:w_stringZ( visual_name )
packet:w_u8( visual_flags )
packet:w_float( condition )
packet:w_u32( upgrade_count )
for i = 1, upgrade_count do
packet:w_stringZ( upgrades[ i ] )
end
packet:w_u16( ammo_current )
packet:w_u16( ammo_elapsed )
packet:w_u8( weapon_state )
packet:w_u8( addon_flags )
packet:w_u8( ammo_type )
packet:r_seek( 2 )
sobj:STATE_Read( packet, packet:w_tell() )

end

db.actor:drop_item( obj )
local parent_id = sobj.parent_id
level.add_call(
function ()
if parent_id == 65535 then
return true
end
end,

function ()
sobj:switch_offline()
end
)
end[/cut]

Осталось только поднять оружие в рюкзак.


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


Сообщение отредактировал makdm - Пн, 10.03.2014, 18:50
 
NIVДата: Вт, 11.03.2014, 22:45 | Сообщение # 447
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

makdm, I'm sorry,
Цитата makdm ()
Осталось только поднять оружие в рюкзак.
а как это делается? Просто интересно.


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

NIV,
Код
db.actor:transfer_item(obj,db.actor)


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Пн, 17.03.2014, 14:55 | Сообщение # 449
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день. Переделал квест Ноя из СГМ (Защита Баржи) под логику рестриктора.
Имею такой результат.

[cut=Результат]При гибели монстра из секции death вызывается функция

function zat_monsters_1st_wave_update(actor,npc)
sgm_functions.inc_counter("zat_monster_w1_deaths")
end


Параметр zat_monster_w1_deaths увеличивается на 1. В xr_conditions значение параметра проверяется функциями типа

function zat_monster_w1_1_killed(actor, npc)
if sgm_functions.read_variable("zat_monster_w1_deaths")~=nil and sgm_functions.read_variable("zat_monster_w1_deaths")>=9 then return true else return false end
end


Если завалили 9 монстров, то спавнится следующая группа. В волне несколько групп. Для проверки есть несколько ф-ий.

function zat_monster_w1_2_killed(actor, npc)
if sgm_functions.read_variable("zat_monster_w1_deaths")~=nil and sgm_functions.read_variable("zat_monster_w1_deaths")>=18 then return true else return false end
end
function zat_monster_w1_3_killed(actor, npc)
if sgm_functions.read_variable("zat_monster_w1_deaths")~=nil and sgm_functions.read_variable("zat_monster_w1_deaths")>=27 then return true else return false end
end


Как видно, ф-ии однотипны и отличаются только значением параметра.

Часть логики рестриктора.

[sr_idle@task3]
on_info = {=zat_monster_w1_1_killed} sr_idle@task4 %=add_cleaner_monster =zat_monster_w1_2_spawned%
on_info2 = {+zat_monsters_wave_fail} sr_idle@end

[sr_idle@task4]
on_info = {=zat_monster_w1_2_killed} sr_idle@task5 %=add_cleaner_monster =zat_monster_w1_3_spawned%
on_info2 = {+zat_monsters_wave_fail} sr_idle@end


При убийстве определенного числа зверей спавнится следующая группа и происходит удаление трупов.

Если в волне 7 групп зверей, то нужно прописать 7 ф-ий в xr_conditions для одной волны. Вопрос, можно ли написать универсальную функцию и необходимое кол-во убитых зверей указывать в файле логики рестриктора?[/cut]
 
makdmДата: Пн, 17.03.2014, 19:47 | Сообщение # 450
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
При убийстве определенного числа зверей спавнится следующая группа и происходит удаление трупов.


sergej5500, квест "волна мутантов" в SGM устроен немного по другому.
1. Первая волна - 5 групп мутантов.
2. Вторая волна - 6 групп мутантов
3. Третья волна - 7 групп мутантов.

Спавн групп мутантов происходит через каждые 20 секунд независимо от гибели мутантов в группах.
Поэтому отслеживается только один параметр - количество отстрелянных мутантов ( а вы отслеживаете гибель групп ). При достижении определённого количества волна прерывается, трупы зачищаются и выдаётся квест на убийство контролёра.
Поэтому логика вашего рестриктора написана уже с ошибками, так как не повторяет оригинальный квест, как он был задуман автором.
Перепишите правильно логику рестриктора и вопрос должен отпасть сам собой.


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