Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 02.03.2014, 13:44 | Сообщение # 436 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата NIV ( ) Как использовать выражение return, чтобы функция возвращала 2 (или n) значений? Так: return 1,2, где 1 и 2 независимые передаваемые значения функции Или так: return table, где table - таблица из n элементов. Цитата NIV ( ) Вопрос - можно ли поменять описание для hint, аналогично, как это делали командой InitTexture для текстуры? Можно прописать hint текстуре - это конечно хорошо, но функции меняющей hint у выведенной текстуры вроде нет. Мне по крайней мере такая функция не известна (см. lua_help.script) Цитата NIV ( ) Какова должна быть последовательность действий? Может есть пример в каком-то моде? Знал-бы сказал. Вернее так последовательность конечно хорошо известна, а вот ее реализация средствами LUA игры - нет.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Пн, 03.03.2014, 08:47 | Сообщение # 437 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Цитата denis2000 ( ) Знал-бы сказал ОК :). Я обратил внимание, что в ТЧ не было всплывающих окон, а инфа выводилась по клике на объекте. Можно попробовать сделать так (т.е. через кнопку?). А для всплывющих окон, наверное, нужно отслеживать положение курсора. Похоже, проблема в этом?
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 03.03.2014, 16:10 | Сообщение # 438 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| NIV, Можно отрабатывать шелчек левой/правой кнопки мыши (WINDOW_LBUTTON_UP или WINDOW_RBUTTON_UP), можно перемещение курсора над формой (по идее это WINDOW_MOUSE_MOVE), можно проверить другие события класса ui_events. Если использовать класс листбокс, то есть события клик и выделение объекта в списке (LIST_ITEM_CLICKED LIST_ITEM_SELECT).
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
strelok200 | Дата: Ср, 05.03.2014, 18:52 | Сообщение # 439 |
Бывалый
Свобода
Сообщений: 126
| У меня такой вопрос - каким образом можно проапгрейдить все, например, пистолеты ПМ, что есть в игре. А проще говоря, чтобы у всех стволов увеличился определенный параметр, допустим настильность
Добавлено (05.03.2014, 13:27) --------------------------------------------- Или такое вообще невозможно?
Бинго! denis2000 Есть конечно вариант пройтись по всем объектам игры удалить все ПМ, и в том-же месте заспавнить другой ПМ с измененным параметром, но опять таки ценой потери апгрейдов на этих стволах. denis2000Добавлено (05.03.2014, 18:52) --------------------------------------------- Нет, это не вариант, по крайней мере для меня. Вопрос закрыт
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 10.03.2014, 09:40 | Сообщение # 440 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата 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]
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 10.03.2014, 14:39 | Сообщение # 441 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| makdm, Как быть с оружием в руках ГГ? Вываливать под ноги, переводить в офлайн, затем в онлайн и подбирать?
PS: Ведь насколько я понял речь идет о реализации некоего скилла, повышающего навык владения оружием ГГ. То есть если скилл получен все оружие попадающее в руки ГГ (или находящееся в руках) должно увеличит свой параметр например настильность. Установить параметр у оружия можно двумя способами - апгрейд оружия (скриптово или у механника) или переспавн оружия с другим значением настильности. Апгрейд хорошо, но не красиво поскольку он будет виден и это будет странно, все оружие (а точнее попадающее в руки ГГ будет иметь апгрейд и это странно). Переспавн - лучше, но нужно перенести апгрейды и аддоны. Отсюда вопрос озвученный выше - как это реализовать корректно и не привлекая внимания игрока.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 10.03.2014, 15:20 | Сообщение # 442 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| denis2000, именно так и можно сделать. Другого я тоже ничего не придумал, поэтому в функции это и не прописывал. И поэтому пишу, что лучше это делать при переходе с локации на локацию. Тогда изменённые параметры оружия у ГГ автоматом будут загружены в нет пакет при новом спавне ГГ на другой локации.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 10.03.2014, 15:26 | Сообщение # 443 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| makdm, Но игрок может еще долго бегать по текущей локации, не имея заявленного преимущества и получит его только при переходе с локации на локацию.
К стати я пробовал делать апгрейд ствола из инвентаря ГГ предварительно выкинув его под ноги - апгрейд не установился и офлайн-онлайн не помогал. У тебя есть конкретный код для этого?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 10.03.2014, 15:38 | Сообщение # 444 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата denis2000 ( ) Переспавн - лучше, но нужно перенести апгрейды и аддоны Как раз перенести апгрейды и аддоны не сложно. Алгоритм примерно такой. Прочитать установленные апгрейды из нет пакета оружия в таблицу. Проспавнить новое оружие под ногами ГГ со скиллом. Записать новому оружию в нет пакет считанные ранее апгрейды. Перевести в оффлай, а затем в онлайн. Установить аддоны с помощью clon_addons. Удалить старое оружие. Поднять и вставить в слот новое оружие. Единственный минус, что нужно создать кучу секций оружия с предустановленными скиллами.Добавлено (10.03.2014, 15:38) ---------------------------------------------
Цитата denis2000 ( ) У тебя есть конкретный код для этого? Сейчас нарисую.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 10.03.2014, 15:46 | Сообщение # 445 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата makdm ( ) Алгоритм примерно такой. Алгоритм то известен, а вот какой конкретно для этого код нужен нет. И проблема в том, что это все таки заметно для игрока будет, нужно делать затемнение - например, а следовательно делать это в катсцене или во время сна или во время перехода на локацию.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 10.03.2014, 17:06 | Сообщение # 446 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| 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 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
NIV | Дата: Вт, 11.03.2014, 22:45 | Сообщение # 447 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| makdm, I'm sorry, Цитата makdm ( ) Осталось только поднять оружие в рюкзак. а как это делается? Просто интересно.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 11.03.2014, 23:08 | Сообщение # 448 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| NIV, Код db.actor:transfer_item(obj,db.actor)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 17.03.2014, 14:55 | Сообщение # 449 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день. Переделал квест Ноя из СГМ (Защита Баржи) под логику рестриктора. Имею такой результат.
[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]
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 17.03.2014, 19:47 | Сообщение # 450 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) При убийстве определенного числа зверей спавнится следующая группа и происходит удаление трупов.
sergej5500, квест "волна мутантов" в SGM устроен немного по другому. 1. Первая волна - 5 групп мутантов. 2. Вторая волна - 6 групп мутантов 3. Третья волна - 7 групп мутантов.
Спавн групп мутантов происходит через каждые 20 секунд независимо от гибели мутантов в группах. Поэтому отслеживается только один параметр - количество отстрелянных мутантов ( а вы отслеживаете гибель групп ). При достижении определённого количества волна прерывается, трупы зачищаются и выдаётся квест на убийство контролёра. Поэтому логика вашего рестриктора написана уже с ошибками, так как не повторяет оригинальный квест, как он был задуман автором. Перепишите правильно логику рестриктора и вопрос должен отпасть сам собой.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
|