В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
LaRento, может ты всё же продемонстрируешь лог вылета? А то "меня терзают смутные сомнения..." BeeRsek, разница между функциями disable_ui_elements и disable_ui (для включения так же) в том, что в первую функцию нужно передавать параметр, который определит, какую именно часть худа нужно отключить: "weapon" - оружие, "input" - ввод с клавиатуры, "hud" - всё, что видно на экране (индикаторы, карту) и "all" - всё сразу. Вторая функция - отключает всё сразу, без передачи в неё параметров. Делать так, как предложил MesnikAnd - через рестриктор - весьма сковывает свободу действия. Но поскольку ты запускаешь постэффекты скриптом, то скриптом и отключай управление, а когда нужно - верни, всё как было.
Сообщение отредактировал ColR_iT - Вторник, 26.02.2013, 16:02
;;;;;;;;;;;;;;; ;faction может иметь значение monster, monster_predatory_day, monster_predatory_night, monster_vegetarian, monster_zombied_day, monster_zombied_night, monster_special (это только для монстров) ;;;;;;;;;;;;;;
Зарегистрируй squad в simulation_objects_props.ltx
Код
[zav_rost_dog_squad]:default sim_avail = true; разрешение собачке на симуляцию жизни
Дальше можешь создать при старте игры, то есть в файле simulation.ltx
Код
[start_position_zaton] ........ ........ ........ zav_rost_dog_squad = zat_sim_15; zat_sim_15 >>>> В данном случае смарт, откуда идут 2 чувака, когда мы появляемся на Затоне.
LaRento, "трабла" в одном из трёх: 1. То, что ты показал - это не всё, что находится у тебя в файле new_functions.script; 2. То, что ты показал - вообще не из этого файла; 3. Имя файла отличается от того, которое ты прописал в вызове в биндере. Других вариантов быть не может.
function actor_zombied() for _, zone in pairs(db.anomaly_by_name) do if string.find(zone:section(), "zone_field_psychic") then if zone:inside(db.actor:position()) and db.actor.health < 0.5 then db.actor:set_character_community("actor_zombied", 0, 0) else db.actor:set_character_community("actor", 0, 0) end end end end
И ты его через actor_binder:update(delta) в bind_stalker запускаешь вот так:
Код
имя_скрипта.update()
Если так то по пробуй вот так:
Код
if имя_скрипта then имя_скрипта .update() end
Ну как бы не в этом суть. По пробуй запустить на прямую, если через actor_binder:update(delta) в bind_stalker, то пробуй вот так:
Код
if имя_скрипта then имя_скрипта .actor_zombied() end
MODOSKEA, и что должно поменяться? Вылет ясно "говорит", что не находит файла new_functions, а не находит по двум причинам: либо данного файла не существует, либо в нём синтаксическая ошибка. Если учесть всё то, что сказал LaRento, то остаются только те варианты, что я привёл в своём предыдущем посте.
Второй день довожу ф-ции до ума. Уже мозги кипят. Задача ф-ций дропнуть второй предмет из инвентаря. Довёл ф-ции до того, что хоть вылет не происходит. Вот они:
-- поиграем честно function remove_cheat() local t = check_cheat() for k, v in pairs(item_id) do local sobj = alife():object(k) if sobj then local sect = sobj:section_name() if anti_cheat[sect] and t[sect] ~= nil and t[sect] > 0 then alife():release(sobj, true) t[sect] = t[sect] - 1 end end end end
function check_cheat() local result = {} for k, v in pairs(items) do if v > 1 then result[k] = v - 1 end end return result end
local need_update = true local inventory_open = false local separator_spawned = false local separator = "separator"
local debug = false local flag
function update()
if (need_update == false) then return end
if debug == true and belt_status == true then get_console():execute("belt_status=false") end belt_status = false if debug == true and item_status == false then get_console():execute("item_status=true") end item_status = true
-- Спавним разделяющий елемент if (separator_spawned == false) then alife():create(separator, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) separator_spawned = true if debug == true then get_console():execute("separator_spawned") end return end
-- Удаляем разделяющий елемент db.actor:inventory_for_each(del_separator) separator_spawned = false
if debug == true and belt_status == false then get_console():execute("belt_status=true") end belt_status = true if debug == true and item_status == false then get_console():execute("item_status=true") end item_status = true
if debug == true then for i,k in pairs(belt) do get_console():execute(i.."="..k) end end if debug == true then for i,k in pairs(items) do get_console():execute(i.."="..k) end end remove_duplicate() end
-- Перебор предметов инвентаря function scan_inv(item) local section = item:section()
if section == separator then flag = 1 return end
if flag == 1 then if slot_item(item) ~= nil then flag = 2 else insert_to_table(belt, section) belt_id[item:id()] = true insert_to_table(item, section) item_id[item:id()] = true end end end
-- Добавление в таблицу function insert_to_table(tbl, section) if tbl[section] == nil then tbl[section] = 1 else tbl[section] = tbl[section] + 1 end end
-- Удаление разделяющего предмета function del_separator(item) if item:section() == separator then alife():release(alife():object(item:id()), true) if debug == true then get_console():execute("separator_removed") end end end
-- Определение налечия предмета в одном из слотов function slot_item(item) for i=0,12 do local obj = db.actor:item_in_slot(i) if obj and item:id() == obj:id() then return i end end
return nil end
-- Поднятие предмета function on_item_take(item) if item:section() == separator then return end
if (inventory_open == false) then if (separator_spawned == true) then db.actor:inventory_for_each(del_separator) separator_spawned = false end
need_update = true if debug == true then get_console():execute("item_take") end end end
-- Выброс предмета function on_item_drop(item) if item:section() == separator then return end
if (inventory_open == false) then if (separator_spawned == true) then db.actor:inventory_for_each(del_separator) separator_spawned = false end
need_update = true if debug == true then get_console():execute("item_drop") end end end
-- Открытие/закрытие инвентаря function on_inventory_info(info_id) if info_id == "ui_inventory" then inventory_open = true if debug == true then get_console():execute("inventory_open") end
elseif info_id == "ui_inventory_hide" then inventory_open = false need_update = true if debug == true then get_console():execute("inventory_close") end end end
function check_blood() -- if belt_status == true then if belt["af_blood"]~=nil and belt["af_blood"]>0 then -- то есть когда параметр пояса[af_blood] равен 1, 2, 3.. Сколько навесишь Камней. amk.send_tip("Кровь Камня на поясе") end -- end end
-- Оставляет на поясе по двум артефактам каждого вида function remove_duplicate() local t = check_duplicate() for k, v in pairs(belt_id) do local sobj = alife():object(k) if sobj then local sect = sobj:section_name() --if is_unique(sobj:clsid()) and t[sect] ~= nil and t[sect] > 0 then --if is_unique(sect) and t[sect] ~= nil and t[sect] > 0 then if unique_sect[sect] and t[sect] ~= nil and t[sect] > 0 then alife():release(sobj, true) inventory.spawn_item_in_inv(sect, db.actor) t[sect] = t[sect] - 1 end end end end
-- Собирает инфу о дупликатах на поясе -- Возвращает таблицу вида [секция арта] = <количество лишних артов> function check_duplicate() local result = {} for k, v in pairs(belt) do if v > 1 then result[k] = v - 1 end end return result end
--спавним объекты на карту --для спавна неписей смотрим config\creatures\spawn_sections.ltx - там написаны имена секций для разных типов неписей function spawn_item(spawn_item, pos, gv,lv) if gv==nil then gv=db.actor:game_vertex_id() end if lv==nil then lv=db.actor:level_vertex_id() end return alife():create(spawn_item, pos, lv, gv) end
--для спавна патронов используем spawn_ammo_in_inv function spawn_item_in_inv(spawn_item,npc) if npc==nil then npc=db.actor end return alife():create(spawn_item, npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) end
--используем для спавна патронов function spawn_ammo_in_inv(spawn_item,number,npc) if npc==nil then npc=db.actor end if number > 0 then return se_respawn.create_ammo(spawn_item, npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id(), number) end end
-- поиграем честно function remove_cheat() local t = check_cheat() for k, v in pairs(item_id) do local sobj = alife():object(k) if sobj then local sect = sobj:section_name() if anti_cheat[sect] and t[sect] ~= nil and t[sect] > 0 then alife():release(sobj, true) t[sect] = t[sect] - 1 end end end end
function check_cheat() local result = {} for k, v in pairs(items) do if v > 1 then result[k] = v - 1 end end return result end
Подскажите про, что забыл? Или хоть по другому пути направьте. Мои идеи кончились. СПС.
ColR_iT, я как-то словил вылет жаловался на скрипт, я по правил сразу прямую ссылку на функцию У меня примерно так было, через одну функцию на прямую вызывался другая, а в остальном она была пуста. И не по веришь из-за этого у меня был вылит я поправил ссылку функции прямо на нее а не через еще одну почти пустую и он исчез
ColR_iT, Как я меняю функцию, всё сразу без вылета Не стоит выставлять меня посмешищем, что я что-то не дополнил, неправильно назвал скрипт и т.п. Проблема в твоей функции - я мсье очевидность.
Добавлено (26.02.2013, 17:26) --------------------------------------------- ColR_iT, Мне нравится твои 3 варианта, но Леонид, я трезв, не стал бы тебя обманывать и высылать не всё, не из того файла.
MODOSKEA, последние твои слова - ересь, просто что-то, о чём ты думаешь. LaRento, с 99.99% вероятностью утверждаю, что причина не в вызове "не той функции", а в одной из тех, что указал я. И "посмешищем" выставляешь себя ты сам, мсье. :) ins33
Цитата (ins33)
Про ЗП не скажу, но в ТЧ anomaly_by_name нет.
Я знаю, я тебе об этом говорил.
Цитата (ins33)
Вылет будет ссылаться на твой скрипт, а не на бинд.
Смотря куда разместить вызов. Если в прекондишен - то вообще получит вылет без лога, если в акшен, то всё равно получит ругань на имя файла.
Что касается твоего вопроса по "дропнуть второй предмет". Ты ведь помнишь, что правильно поставленный вопрос на 80% решает задачу? Так вот в твоём посте, особо и вопроса не прозвучало... Что тебе нужно сделать?
Добавлено (26.02.2013, 18:19) --------------------------------------------- BeeRsek, у мыши отключает только события на нажатие клавишь, "головой" вертеть будешь продолжать... вроде бы.
Сообщение отредактировал ColR_iT - Вторник, 26.02.2013, 18:20