|
Модостроение. Редактирование и создание скриптов
|
|
| 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 | Дата: Ср, 29.11.2017, 13:36 | Сообщение # 886 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 (  ) 1. При гибели командира метка не переносится с него на следующего командира. 2. После гибели всего сквада метка продолжает висеть на трупе. Естественно, ведь для отработки этих ситуаций нужно сделать скриптовые действия. Постоянно анализировать состояние сквада и работать с меткой (убирать, переносить на нового командира). Начните с того, что вы хотите получить в итоге.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 29.11.2017, 21:56 | Сообщение # 887 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Тестирую функцию спавна множества аномалий с рандомной позицией.
[cut=Функции] function test_anomaly_spawn() local anomaly = {"mod_zone_mine_electric_weak","mod_zone_mine_electric_average"} for i = 1, 150 do local section = anomaly[ math.random( #anomaly ) ] create_anomaly_2(section,5,math.random(1,1800000),db.actor:game_vertex_id()) end end
-- 'Спавн аномалии. function create_anomaly_2(zone_name,zone_radius,lv,gv) local sobj=alife():create(zone_name,level.vertex_position(lv),lv,gv) 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 shape_count = packet:r_u8() for i = 1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local max_power = packet:r_float() local owner_id = packet:r_s32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32() local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_s32() local new_center = vector():set(0,0,0) owner_id = bit_not(0) restrictor_type = 3 max_power = 0 offline_interactive_radius = 30 artefact_spawn_count = 32 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_u8(1) packet:w_u8(0) packet:w_vec3(new_center) packet:w_float(zone_radius) packet:w_u8(restrictor_type) packet:w_float(max_power) packet:w_s32(owner_id) packet:w_u32(enabled_time) packet:w_u32(disabled_time) packet:w_u32(start_time_shift) packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_count) packet:w_s32(artefact_position_offset) packet:r_seek(2) sobj:STATE_Read(packet,packet:w_tell()) return sobj end[/cut]
По горячей клавише в разных точках рандомно спавнятся 150 аномалий. Клавишу нажимаю один раз в несколько секунд.
Несколько раз после спавна очередной партии аномалий ловил вылет с таким логом.
[cut=Лог]FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...publishing\Зов Припяти\gamedata\scripts\utils.script:588: attempt to index local 't' (a number value)
stack trace:[/cut]
Глючная функция
-- запись CTime в пакет. если t=nil, то запишет один нулевой байт function w_CTime( p, t ) --set_save_marker(p, "save", false, "CTIME") if t == nil then p:w_u8(-1) --set_save_marker(p, "save", true, "CTIME") return end
if (CTime == nil) or (t ~= CTime_0) then local Y, M, D, h, m, s, ms = 0, 0, 0, 0, 0, 0, 0 Y, M, D, h, m, s, ms = t:get( Y, M, D, h, m, s, ms ) -- 588 строка
p:w_u8 ( Y - 2000 ) p:w_u8 ( M ) p:w_u8 ( D ) p:w_u8 ( h ) p:w_u8 ( m ) p:w_u8 ( s ) p:w_u16( ms ) else p:w_u8 ( 0 ) end --set_save_marker(p, "save", true, "CTIME") end
Как можно избавиться от вылета?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 30.11.2017, 16:46 | Сообщение # 888 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Проблема не в этой функции, а в той что вызывает ее, передавая вместо даты/времени число. Искать надо начинать именно там. Возможно причина в том, что при спавне аномалий происходит очень часто и много чтений и записей нетпакетов объектов.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| makdm | Дата: Чт, 30.11.2017, 22:57 | Сообщение # 889 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, неправильно прочитан и записан нет-пакет. Отсюда вылет, связанный со временем. Вот так нужно делать:
[cut noguest=Функция]function create_anomaly( zone_name, zone_radius, position, lv, gv )
----------------------------Создаём объект - аномалию----------------------------
local sobj = alife():create( zone_name, position, lv, gv )
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 shape_count = packet:r_u8() for i = 1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local max_power = packet:r_float() local owner_id = packet:r_s32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32() local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_s32() local last_spawn_time = packet:r_u8()
------------------------------------------Меняем данные пакета
local new_center = vector():set( 0, 0, 0 ) owner_id = bit_not( 0 ) restrictor_type = 3 max_power = 0 offline_interactive_radius = 30 artefact_spawn_count = 32 last_spawn_time = 0
------------------------------------------------Пишем в пакет
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_u8( 1 ) packet:w_u8( 0 ) packet:w_vec3( new_center ) packet:w_float( zone_radius ) packet:w_u8( restrictor_type ) packet:w_float( max_power ) packet:w_s32( owner_id ) packet:w_u32( enabled_time ) packet:w_u32( disabled_time ) packet:w_u32( start_time_shift ) packet:w_float( offline_interactive_radius ) packet:w_u16( artefact_spawn_count ) packet:w_s32( artefact_position_offset ) packet:w_u8( last_spawn_time )
packet:r_seek( 2 ) sobj:STATE_Read( packet, packet:w_tell() ) return sobj end [/cut]
Терпение...... И все получится!
Сообщение отредактировал makdm - Чт, 30.11.2017, 22:58 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Пн, 04.12.2017, 00:04 | Сообщение # 890 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Взял из СГМ функцию спавна костюмов в трупы. Адаптировал её на чистый ЗП.
local outfit_container_list={ {"stalker_neutral_1","stalker_outfit",0.90}, {"stalker_neutral_2","stalker_outfit",0.95}, {"stalker_neutral_3","scientific_outfit",0.92}, {"stalker_neutral_4","exo_outfit",0.91} }
function container_stalker_death(victim,killer) local victim_sect=victim:section() local victim_visual=victim:get_visual_name() for k,v in pairs(outfit_container_list) do if find_in_string(victim_visual,v[1]) and math.random(100)<=v[3]*100 then local sobj=alife():create(v[2],vector(),0,0,victim:id()) end end end
Функция вызывается из коллбэка на смерть сталкера. В принципе всё работает. Костюмы появляются в трупах. Встал вопрос. Как сделать костюм изношенным?
В СГМ этот костюм в момент спавна помечается отдельным флагом. Затем другая функция изнашивает костюм и удаляет флаг. Эта функция находится на постоянном апдейте.
Если ли другой способ? Можно ли задать износ костюма в момент спавна?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Пн, 04.12.2017, 08:30 | Сообщение # 891 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 (  ) Можно ли задать износ костюма в момент спавна? Возможно что - нет, все может в итоге свестись к тому, что нужно каким либо методом после спавна устанавливать костюму его новое состояние (функцией с постоянным апдейтом - плохо или зарегистрированным для этого колбеком - лучше).
Цитата sergej5500 (  ) Если ли другой способ? А почему бы и нет - положите заранее всем НПС в инвентарь нужные костюмы, а в момент отработки смерти с некоторой вероятностью оставляйте костюм в инвентаре трупа и при этом устанавливайте его состояние (как это сделано для оружия НПС в оригинале).
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| makdm | Дата: Чт, 07.12.2017, 20:11 | Сообщение # 892 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата denis2000 (  ) что нужно каким либо методом после спавна устанавливать костюму его новое состояние (функцией с постоянным апдейтом - плохо или зарегистрированным для этого колбеком - лучше). Однозначно лучше ставить колбек. sergej5500, после строки
local sobj=alife():create(v[2],vector(),0,0,victim:id())
Ставим колбек на проспавн костюма и переход его в онлайн. Пишем так:
[cut noguest]
level.add_call( function () if sobj.online then return true end end, function () local condition = ( math.random(40) + 40 )/100 level.object_by_id( sobj.id ):set_condition( condition ) end ) break
[/cut]
Терпение...... И все получится!
Сообщение отредактировал makdm - Чт, 07.12.2017, 20:20 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вт, 02.01.2018, 22:04 | Сообщение # 893 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
В СГМ есть чит-режим "бесконечные патроны". Я на досуге изучал, как он работает.
[cut=Основная функция чит-режима] if check_actor_item_in_slot(2,"self",true) or check_actor_item_in_slot(3,"self",true) then local ammo_types=sgm_functions.ReadAmmoClass(db.actor:active_item():section()) respawn_item_if_comparison("ammo_9x18_fmj",ammo_types,4) respawn_item_if_comparison("ammo_9x19_fmj",ammo_types,4) respawn_item_if_comparison("ammo_11.43x23_fmj",ammo_types,4) respawn_item_if_comparison("ammo_12x70_buck",ammo_types,4) respawn_item_if_comparison("ammo_5.45x39_fmj",ammo_types,4) respawn_item_if_comparison("ammo_9x39_pab9",ammo_types,4) respawn_item_if_comparison("ammo_5.56x45_ss190",ammo_types,4) respawn_item_if_comparison("ammo_7.62x54_7h1",ammo_types,2) respawn_item_if_comparison("ammo_og-7b",ammo_types,2) respawn_item_if_comparison("ammo_gauss",ammo_types,2) respawn_item_if_comparison("ammo_pkm_100",ammo_types,2) respawn_item_if_comparison("ammo_dumdum",ammo_types,2) end[/cut]
[cut=Вспомогательные функции] -- 'Типы патронов, поддерживаемые оружием. function ReadAmmoClass(section) local ltx = system_ini() if ltx:line_exist(section,"ammo_class") then return ltx:r_string(section,"ammo_class") else return nil end end
-- 'Проверка на наличие предмета в слоте и при необходимости, на соответствие к compare_section. function check_actor_item_in_slot(need_slot,compare_section,need_active) local currert_slot=db.actor:item_in_slot(need_slot) local active_item=db.actor:active_item() if currert_slot~=nil and currert_slot:section()~=nil then if compare_section~=nil and compare_section=="self" then compare_section=currert_slot:section() end if compare_section~=nil and currert_slot:section()==compare_section then if need_active~=true then return true else if active_item and active_item:section()==compare_section then return true end end elseif compare_section==nil then return true end end return false end
-- 'Респаун предмета при соблюдении специального условия. function respawn_item_if_comparison(need_value_and_item,comparison_value,item_count) local check_item=need_value_and_item if find_in_string(comparison_value,check_item) then check_actor_item_to_add(check_item,item_count) end end
-- 'Проверка на отсутствие предмета, и спаун предмета. function check_actor_item_to_add(target_item,count) if not db.actor:object(target_item) then give_object_to_npc(target_item,db.actor,count) end end
-- 'Создание предмета в рюкзаке НПС. function give_object_to_npc(section,npc,count) if count==nil then count=1 end for i=1, count do alife():create(section,npc:position(),npc:level_vertex_id(),npc:game_vertex_id(),npc:id()) end end
-- 'Присутствие в названии строки. function find_in_string(where,what) if where~=nil and what~=nil and string.find(where,what) then return true elseif where==nil or what==nil then return nil end return false end[/cut]
Функция не работает для РПГ. Хотя боеприпас от РПГ там прописан. В чем может быть причина?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 03.01.2018, 12:33 | Сообщение # 894 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Теоретически должна работать, а практически нужно искать какое условие не выполняется раз не работает.
Как и предполагалось не срабатывает условие find_in_string. Чтобы работало нужно поставит костыли например так:
Код respawn_item_if_comparison("ammo_7.62x54_7h1",ammo_types,2) respawn_item_if_comparison("ammo_og",ammo_types,2) respawn_item_if_comparison("ammo_gauss",ammo_types,2)
Код function respawn_item_if_comparison(need_value_and_item,comparison_value,item_count) local check_item=need_value_and_item if find_in_string(comparison_value,check_item) then if check_item=="ammo_og" then check_item="ammo_og-7b" end check_actor_item_to_add(check_item,item_count) end end
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вт, 30.01.2018, 17:10 | Сообщение # 895 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день.
Возможно ли с помощью скрипта определить бежит ли ГГ или идёт шагом? Как то так:
if условие бега then функция для бега elseif условие шага then функция для шага else функция для спокойного состояния end
Как должно выглядеть условие бега и условие шага?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| alex_xp_77 | Дата: Пт, 16.02.2018, 11:51 | Сообщение # 896 |
|
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| Всем добра!! Кто может помочь с адаптацией к движку Unrual Engine? Нужен пак скриптов, ранение, атака, хромота, присест, друг, нейтрал, враг, (НПС), то же самое но уже посложнее для монстра! Есть подвох, язык должен быть С++, а x-ray как мы помним был создан на дохлом LUA!! Сам не справлюсь, может есть грамотные люди, кто поможет?? Хотя бы основами!
|
| |
|
| Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
| Aleksn09 | Дата: Пт, 16.02.2018, 16:10 | Сообщение # 897 |
 Шаман Sigerous
Ночной Админ
Сообщений: 1339
| Цитата alex_xp_77 (  ) Есть подвох, язык должен быть С++, а x-ray как мы помним был создан на дохлом LUA!! X-ray тож на C++, это скрипты на Lua. Но суть в том, что в модмейкинге итак мало скриптеров, что уж говорить о программистах, ковыряющихся в том же C++. Посмотри документацию анриала и туторы на ютубе, щас полно такого. Возможно и сам разберешься. Или же поискать в маркете бесплатные ассеты с подобным контентом.
Что ждет тебя Сталкер, в Зоне, которая изменилась?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили Aleksn09 за это полезное сообщение: |
|
|
| alex_xp_77 | Дата: Пт, 16.02.2018, 16:58 | Сообщение # 898 |
|
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| Aleksn09 я и имел в виду логику, и скрипты, дэфолтную, эксклюзивную, сам не смогу, слишком много работы по созданию мешей( неписей) как монстров так и солдат, сталкеров, некоторые виды готовы, анимацией стал заниматься всерьез, ничего сложного вроде нет, полгода на учебу, этого хватит что бы сделать опытную анимацию !! Мне необходима логика для НПС, и скрипты для адаптацией с движком, в целом там стоит некий блюпринт в котором и происходит основное действие!!
|
| |
|
| Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вс, 11.03.2018, 01:50 | Сообщение # 899 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Хочу вернуться к вопросу, поднятому тут.
http://sigerous.ru/forum/322-2820-1566524-16-1512335060
Цитата denis2000 (  ) А почему бы и нет - положите заранее всем НПС в инвентарь нужные костюмы, а в момент отработки смерти с некоторой вероятностью оставляйте костюм в инвентаре трупа и при этом устанавливайте его состояние (как это сделано для оружия НПС в оригинале).
Попробовал это реализовать. Прописал сталкерам в инвентарь костюмы с вероятностью 0.5. Это сработало. Костюмы у каждого второго.
В функцию function keep_item(npc, item) в death_manager вставил код
if section ~= "stalker_outfit" then if not has_alife_info("opt_marauder_active") then alife():release(alife():object(item:id()), true) else item:set_condition((math.random(40)+40)/100) end end
После чего скрипт перестал работать. Из трупов вываливаются бинокли, гитары и т.д. И костюмы. В чем ошибка?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Вс, 11.03.2018, 18:49 | Сообщение # 900 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 (  ) В чем ошибка? В том, что вы не разобрались, как редактируемая вами функция работает - это раз, вписали неработоспособный код - это два. Повторюсь еще раз - посмотрите, как этот код реализован для оружия, сделайте по аналогии: death_manager.script
Код if isOutfit(item) then set_outfit_drop_condition(item) return end ... function set_outfit_drop_condition(item) local condition = (math.random(40)+40)/100 item:set_condition(condition) end...
_g.script
Код local outfit_classes = {} ... function isOutfit(object, class_id) local id = class_id or get_clsid(object) return outfit_classes[id] == true end ... function start_game_callback() ...
outfit_classes = { [clsid.equ_exo] = true, [clsid.equ_military] = true, [clsid.equ_scientific] = true, [clsid.equ_stalker_s] = true, [clsid.helmet] = true}
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|