В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга.
Не флудить
Предварительно просматривайте раздел. Ответ на ваш вопрос может быть там.
В своем вопросе указывайте платформу моддинга - Тень Чернобыля, Чистое небо или Зов Припяти.
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Конфиг компа. 5. Лог вылета и последние 25 строк (помещать под спойлер).
Структура папок и файлов в корневом каталоге игры:
...\S.T.A.L.K.E.R\gamedata\anims – папка содержит исполнительные файлы эффектов (например от ПНВ).
...\S.T.A.L.K.E.R\gamedata\config – папка содержит основные конфигурационные файлы (т. е. большинство настроек игры)
...\S.T.A.L.K.E.R\gamedata\meshes – содержит модели игровых предметов и персонажей...
...\S.T.A.L.K.E.R\gamedata\scripts – папка со скриптами (рабочими файлами содержащими в себе наборы функций) – основная папка, отвечающая за ответные действия игры и действия производимых игроком в игре.
...\S.T.A.L.K.E.R\gamedata\shaders – папка содержит в себе конфигурационные файлы шейдеров.
...\S.T.A.L.K.E.R\gamedata\sounds – здесь находятся все звуки игры (разложены по своим каталогам и папкам)
...\S.T.A.L.K.E.R\gamedata\spawns – содержит файл спавна – очень важный файл – не трогать без нужды!!!
...\S.T.A.L.K.E.R\gamedata\textures – содержит разложенные по каталогам и папкам текстуры используемые в игре.
Теперь разберем папки в каталоге «config»
...\S.T.A.L.K.E.R\gamedata\config\creatures - содержит массу конфигурационных файлов, в основном отвечающих за взаимодействие Главного героя игры (в дальнейшем ГГ) и прочего окружения в игре и ТТХ самого ГГ.
...\S.T.A.L.K.E.R\gamedata\config\gameplay – содержит конфиг. файлы персонажей игры (НПС) отвечающие за внешний вид, статус, снаряжение. Файлы: character_desc_ххх (где ххх – название локации) и character_desc_general (отвечает за зомбированного персонажа). Также содержит файлы диалогов и профилей НПС.
…\S.T.A.L.K.E.R\gamedata\config\misc – конфиг.файлы торговцев (папки с именами торговцев), артефактов, брони, квестовых предметов, уникальных предметов, файл отвечающий за награды за автозадания, файл эффектов (алкоголизма, ранения, ПНВ и прочих)...
…\S.T.A.L.K.E.R\gamedata\config\mp – среди прочих содержит важный файл mp_ranks – отвечающий за выпадение оружия и патронов из рук ГГ и НПС – без прописывания добавляемого в игру оружия в этот файл при выпадении нового оружия из рук ГГ\НПС будут следовать вылеты.
…\S.T.A.L.K.E.R\gamedata\config\text\rus – содержит файлы описаний всего и вся находящегося в игре (брони, артефактов, оружия, предметов и прочего).
…\S.T.A.L.K.E.R\gamedata\config\weapons – содержит конфиг.файлы оружия и боеприпасов используемых в игре.
…\S.T.A.L.K.E.R\gamedata\config\weathers – содержит конфиг.файлы настройки погоды на локациях.
Теперь немного подробнее о файлах.
...\S.T.A.L.K.E.R\gamedata\config\misc:
Папка shop_ххх (ххх – имя торговца) – содержит конфиг.файлы ассортимента торговца.
outfits – содержит секции конфигов костюмов.
artefacts - содержит секции конфигов артефактов.
items - содержит секции конфигов предметов.
monster_items - содержит секции конфигов частей монстров
postprocess - содержит секции конфигов пост. процессов (например: ПНВ).
quest_items - содержит секции конфигов квестовых предметов.
task_manager - содержит секции наград за автоквесты.
unique_items - содержит секции конфигов уникального оружия и костюмов.
У кого есть желание, создать FAQ по основным вопросам моддинга - обращаемся в ЛС.
if tonumber(text) == nil then level.start_stop_menu(mini_games.GameMessege("Минимальная ставка - 500, максимальная - 5000.", "Не корретная ставка или у Вас нет таких денег!"), true) return false end if tonumber(text) > 5000 or tonumber(text) < 500 or db.actor:money() < tonumber(text) then level.start_stop_menu(mini_games.GameMessege("Минимальная ставка - 500, максимальная - 5000.", "Не корретная ставка или у Вас нет таких денег!"), true) return false end
denis2000, спасибо! Вроде вылета нет! По-моему, я делал этот код наоборот:
Код
if tonumber(text) > 5000 or tonumber(text) < 500 or db.actor:money() < tonumber(text) then level.start_stop_menu(mini_games.GameMessege("Минимальная ставка - 500, максимальная - 5000.", "Не корретная ставка или у Вас нет таких денег!"), true) return false end if tonumber(text) == nil then level.start_stop_menu(mini_games.GameMessege("Минимальная ставка - 500, максимальная - 5000.", "Не корретная ставка или у Вас нет таких денег!"), true) return false end
и был вылет. Сейчас ещё вопрос по окнам, точнее, по снятию координат. Минут через пять сформулирую.
Добавлено (30.10.2015, 13:13) --------------------------------------------- Вопрос по расположению окна на экране и надписей на нём. Вроде бы неоднократно обсуждалось и надо просто поискать. В общем, надо сдвинуть картинку и надписи на ней. А то пока вот так.
Добавлено (30.10.2015, 14:45) --------------------------------------------- Да. Вылета нет. Единственное - надписи. Местоположение и цвет поменять бы. А так, сам модуль работает в Чистом небе. Может кто будет ставить себе на Чистое небо, заодно и доделает. Скачать.
ЧН. Такое впечатление, что игра не воспринимает значения вероятности выпадения артов в death_items_by_communities ниже 0.01 (да, я считаю, что если хоть иногда в трупах выпадают арты - то это никак не портит "атмосферу" ЗО, а даже наоборот) - т.е. выставлял цифры в диапазоне 0.005 -0.009 - три локации или даже больше проходил - никакого эффекту ! (в death_manager.script заменить в item_by_community[v][id] = 100*tonumber(value) на 200 например - увеличивает выпадение всего хабара). Поставил цифру 2 для самых простых артов в death_items_count - в паре ящиков попались медуза и ещё что-то, всё (в трупах так ничего и нет, щас на Янтаре, мах вероятность 0.009) У кого какие мысли, предложения ?
_S_k_i_F_ Спасибо, попробую
Сообщение отредактировал igi_vlad - Пятница, 30.10.2015, 22:18
makdm, А что все ошибки вызывают вылет? Обычно бывает что функции тихо виснут, в следствии чего, получается разнообразный букет. Даже abort срабатывает 3 раза из 10 ((
Кстати ну тут вы правы у меня действительно была ошибка
local dir = commander:direction() --' Вот это строка
Ошибка attemp to index local commander a nil value
И по моим наблюдениям алгоритм действий удаление/получение командира происходит с ошибкой...
Такой вопрос Скрипты: Получил объект в игре. Аномалия. Как получить ее радиус и силу? И еще к этому же вопрос - есть секция аномалии "..._weak" и там указывается максимальная и минимальная сила. Я правильно понимаю что это и будет сила, которая у объекта. Вот про радиус я не вижу в конфигах ничего
Добавлено (31.10.2015, 18:49) --------------------------------------------- UPD вопрос про радиус снимается, нашел вроде
Новый вопрос Я пробегаю по объектам игры в цикле и в теле цикла спавню новый объект Вопрос - почему он не появляется в игре?
if xr_conditions.actor_in_zone(actor, npc, {"zat_a2_bochka_dla_vodi_restr"})
and db.actor:object("flyaga_pystay") then
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "flyaga_pystay") and dialogs.relocate_item_section(second_speaker, "flyaga", "in") end
end
Должно провериться два условия - актор в зоне рестриктора, и есть ли к него предмет, тогда, если оба правильны, должны выполниться два действия - забрать предмет, и выдать другой. Скрипт размещен в xr_effects.script При НИ вылет с таким логом
Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....e.r. - Зов Припяти\gamedata\scripts\xr_logic.script:648: attempt to index global 'xr_effects' (a nil value)
В чем ошибка? Если убрать скрипт из xr_effects и переместить в другой скриптовый файл, то при юзании туториала происходит безлоговый вылет. Вот на всяк случай сам тутор и логика рестриктора
Зараннее спасибо за помощь! Все, разобрался, надо было скрипт так написать, мож пригодится кому
function zat_a2_bochka_dla_vodi(actor, npc)
if xr_conditions.actor_in_zone(actor, npc, {"zat_a2_bochka_dla_vodi_restr"})
and db.actor:object("flyaga_pystay") then
remove_item(actor, npc, {"flyaga_pystay"}) give_actor(db.actor,nil,{"flyaga"}) end
end
Добавлено (01.11.2015, 11:45) --------------------------------------------- Скажите, а можно при отыгрывании туториала проиграть определенный звук? Если можно то как? И еще: можно в ЗП как в ТЧ спавнить левел чейнджеры при определенном условии? Зараннее спасибо!
Сообщение отредактировал _S_k_i_F_ - Воскресенье, 01.11.2015, 11:50
_S_k_i_F_, нужно в скрипт, который при юзании туториола запускается, добавить строчки по типу таких:
Код
local sObj = sound_object([[actor\die3]]) --'путь до звукового файла sObj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
однако, иногда таким образом звуковой файл может клинить: играть слишком громко, зацикленно или прерываться на какой-то секунде. чтобы этого не было, надо файл прописать в script_sound.ltx, а в функцию добавить это:
Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ... Зов Припяти\gamedata\scripts\mod_callbacks_8.script:14: attempt to index global 'ui_gui_elements_2' (a nil value)
До этого создавал уже два таких комплекса и ничего такого не было. Вот все что делал
class "ui_razgryz" (CUIScriptWnd) --Регистрация нового класса гуи-элемента от существующего класса CUIScriptWnd
function ui_razgryz:__init(owner) super() --Иницилизируем класс, добавляем отсылки к функциям self.owner = owner self:InitControls() --Отсылка к функции регистрации элементов окна self:InitCallBacks() --Отсылка к функции регистрации коллбеков (условий) end
function ui_razgryz:__finalize() --Функция завершения работы нового класса end
function ui_razgryz:OnKeyboard(dik,keyboard_action) --Функция закрытия окна по нажатию на клавиатуре "Escape" CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) --Инициализируем нажатие кнопки на клаве if keyboard_action == ui_events.WINDOW_KEY_PRESSED then --Условие: если нажата кнопка на клаве if dik == DIK_keys.DIK_ESCAPE then --Условие: если нажата конкретно кнопка "Escape" if has_alife_info("gui_razgryz_got_grenade_f1") and has_alife_info("gui_razgryz_got_ammo_5.45x39_ap") and has_alife_info("gui_razgryz_got_ammo_9x18_pmm") and has_alife_info("gui_razgryz_got_ammo_7.62x54_7h1") and has_alife_info("gui_razgryz_got_ammo_vog_25") then self:HideDialog() --То при нажатии на кнопку - закрываем окошко disable_info("gui_razgryz_got_grenade_f1") --И деактивируем обратно инфы, чтобы потом не было глюков disable_info("gui_razgryz_got_ammo_5.45x39_ap") disable_info("gui_razgryz_got_ammo_9x18_pmm") disable_info("gui_razgryz_got_ammo_7.62x54_7h1") disable_info("gui_razgryz_got_ammo_vog_25") else --В любом другом случае self:HideDialog() --При нажатии на кнопку закрытия, закрываем окошко end end end return true end
function ui_razgryz:OnButton_grenade_f1_clicked() --Функция коллбека кнопки взятия цистамина db.actor:give_info_portion("gui_razgryz_got_grenade_f1") --Инфопорция give_object_to_actor("grenade_f1", 3) --Выдаем цистамин self.button_grenade_f1:Enable(false) --После этих действий кнопка больше не работает end
function ui_razgryz:OnButton_ammo_5.45x39_ap_clicked() --Функция коллбека кнопки взятия калиума db.actor:give_info_portion("gui_razgryz_got_ammo_5.45x39_ap") --Инфопорция give_object_to_actor("ammo_5.45x39_ap", 3) --Выдаем калиум self.button_ammo_5.45x39_ap:Enable(false) --После этих действий кнопка больше не работает end
function ui_razgryz:OnButton_ammo_9x18_pmm_clicked() --Функция коллбека кнопки взятия хлора db.actor:give_info_portion("gui_razgryz_got_ammo_9x18_pmm") --Инфопорция give_object_to_actor("ammo_9x18_pmm", 3) --Выдаем хлор self.button_ammo_9x18_pmm:Enable(false) --После этих действий кнопка больше не работает end
function ui_razgryz:OnButton_ammo_7.62x54_7h1_clicked() --Функция коллбека кнопки взятия ПШ db.actor:give_info_portion("gui_razgryz_got_ammo_7.62x54_7h1") --Инфопорция give_object_to_actor("ammo_7.62x54_7h1", 3) --Выдаем ПШ self.button_ammo_7.62x54_7h1:Enable(false) --После этих действий кнопка больше не работает end
function ui_razgryz:OnButton_ammo_vog_25_clicked() --Функция коллбека кнопки взятия сульфада db.actor:give_info_portion("gui_razgryz_got_ammo_vog_25") --Инфопорция give_object_to_actor("ammo_vog-25", 3) --Выдаем сульфад self.button_ammo_vog_25:Enable(false) --После этих действий кнопка больше не работает end
function ui_razgryz:OnButton_close_clicked() --Функция коллбека кнопки закрытия --Если все медикаменты распакованы: if has_alife_info("gui_razgryz_got_grenade_f1") and has_alife_info("gui_razgryz_got_ammo_5.45x39_ap") and has_alife_info("gui_razgryz_got_ammo_9x18_pmm") and has_alife_info("gui_razgryz_got_ammo_7.62x54_7h1") and has_alife_info("gui_razgryz_got_ammo_vog_25") then self:HideDialog() --То при нажатии на кнопку - закрываем окошко disable_info("gui_razgryz_got_grenade_f1") --И деактивируем обратно инфы, чтобы потом не было глюков disable_info("gui_razgryz_got_ammo_5.45x39_ap") disable_info("gui_razgryz_got_ammo_9x18_pmm") disable_info("gui_razgryz_got_ammo_7.62x54_7h1") disable_info("gui_razgryz_got_ammo_vog_25") else --В любом другом случае self:HideDialog() --При нажатии на кнопку закрытия (в окошке), закрываем окошко end end
function run_ui_razgryz(folder) folder:ShowDialog(true) end
function on_use_item(sect) --Переменные (пусть будут на будущее, но можно и удалить) local actor=db.actor local item_name=sect:section() local actor_pos=db.actor:position() local active_slot=db.actor:active_slot() local active_item=db.actor:active_item() local pistol_in_slot=db.actor:item_in_slot(2) local rifle_in_slot=db.actor:item_in_slot(3) local outfit_in_slot=db.actor:item_in_slot(7) local helm_in_slot=db.actor:item_in_slot(12) --Коллбеки if item_name=="razgryz" then --При использовании аптечки run_gui(ui_gui_elements_2.ui_razgryz()) --Запускаем Gui end end
mod_callbacks_8.script:14: attempt to index global 'ui_gui_elements_2' (a nil value)
Тут четко написано: скрипт mod_callbacks_8.script, строка 14, не понимаю, что такое 'ui_gui_elements_2'. Отсюда и пляши. И что за тег <gui>? По идее должен быть <w>.
Сообщение отредактировал denis2000 - Воскресенье, 01.11.2015, 17:41
До этого создавал уже два таких комплекса и ничего такого не было.
Может быть ошибка в подобных razgryz:caption_ammo_5.45x39_ap? Идёт вызов XML.файла, а дальше ошибки в скрипте. script Syntax Checker от Gun12 нет? Советую поставить. Error
Цитата
Тут четко написано: скрипт mod_callbacks_8.script, строка 14, не понимаю, что такое 'ui_gui_elements_2'. Отсюда и пляши.
Я тоже так подумал. Но почему ЛУА-чекер ругается? Я так понимаю, идёт вызов 'ui_gui_elements_2' из скрипта, а потом скрипт читается дальше до caption_ammo_5.45x39_ap и получается ошибка в скипте и вылет. Может [b]чекер[i] глючит ?
Сообщение отредактировал Arist - Воскресенье, 01.11.2015, 16:09
Поменял названия итемов типа ammo_5.45x39_ap на ammokalashbb и т.д. и все заработало. Можно на класс physic_object поставить метку как на inventory_box на личный ящик ГГ? Зараннее спасибо!
Сообщение отредактировал _S_k_i_F_ - Воскресенье, 01.11.2015, 18:03
Но почему ЛУА-чекер ругается? Я так понимаю, идёт вызов 'ui_gui_elements_2' из скрипта, а потом скрипт читается дальше до caption_ammo_5.45x39_ap и получается ошибка в скипте и вылет.
Цитата_S_k_i_F_ ()
Поменял названия итемов типа ammo_5.45x39_ap на ammokalashbb и т.д. и все заработало.
Все верно, XML пасер не мог разобраться с файлом ui_gui_elements_2.xml из-за нечитаемых с его точки зрения тегов типа caption_ammo_5.45x39_ap, вот и вылет на строке xml:ParseFile ("ui_gui_elements_2.xml").
Цитата_S_k_i_F_ ()
Можно на класс physic_object поставить метку как на inventory_box на личный ящик ГГ?
Пробуйте в аллспавне:
Код
custom_data = <<END [level_spot] my_level_spot
END
Сообщение отредактировал denis2000 - Воскресенье, 01.11.2015, 18:25