В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга
• Не флудить • Предварительно просматривайте раздел, ведь ответ на ваш вопрос может быть там • В своем вопросе указывайте платформу моддинга — Тень Чернобыля, Чистое небо или Зов Припяти
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Лог вылета и последние 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 - содержит секции конфигов уникального оружия и костюмов.
Скажите, можно ли в ПДА добавить новую кнопку, по аналогии в первыми тремя (карта, статистика, истори)? И в каком файл содержится скрипт ГУИ ПДА? Зараннее спасибо!
_S_k_i_F_, Кнопку добавить можно, но нажиматься она не будет (точнее реагировать на нее движек не будет). Для того чтобы реагировал есть движковые правки, самая первая правка просто выдает инфопорцию по имени кнопки, и отловив эту инфу вы скриптом должны перехватить управление и рисовать все необходимое поверх движкового ПДА.
Каким образом вычисляется отношение сквада к ГГ для вывода той или иной метки на карте?
Sim squad scripted
elseif not(is_squad_monster[self.player_id]) then local relation = game_relations.get_squad_relation_to_actor_by_id(self.id) if(relation=="friends") then spot = "alife_presentation_squad_friend" elseif(relation=="neutral") then spot = "alife_presentation_squad_neutral" end end
Game relations
function get_squad_goodwill_to_actor_by_id(squad_id)
Код
function get_squad_goodwill_to_actor_by_id(squad_id) local squad = alife():object(squad_id) if(squad==nil) then printf("No such squad %s in board", tostring(squad_id)) return false end if(squad.relationship~=nil) then --printf(" squad_relation %s", tostring(squad.relationship)) return squad.relationship else if (is_squad_monster[squad.player_id]) then return "enemy" end local goodwill = "neutral" if(relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())>=FRIENDS) then goodwill = "friend" elseif(relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())<=ENEMIES) then goodwill = "enemy" end return goodwill end end
function get_squad_relation_to_actor_by_id(squad_id)
Код
function get_squad_relation_to_actor_by_id(squad_id) local squad = alife():object(squad_id) if(squad==nil) then printf("No such squad %s in board", tostring(squad_id)) end
if (is_squad_monster[squad.player_id]) then return "enemy" end
local goodwill = 0 local npc_count = 0 local object for k in squad:squad_members() do object = db.storage[k.id] and db.storage[k.id].object or level.object_by_id(k.id) if object and db.actor then goodwill = goodwill + object:general_goodwill(db.actor) npc_count = npc_count + 1 end end if npc_count ~= 0 then local delta = goodwill/npc_count if delta <= ENEMIES then return "enemy" elseif delta >= FRIENDS then return "friends" elseif delta < FRIENDS and delta > ENEMIES then return "neutral" end end return get_squad_goodwill_to_actor_by_id(squad_id) end
Сообщение отредактировал SanyaSuicide - Вторник, 05.07.2016, 12:04
Спасибо у меня этот код тоже есть, что он означает?
Sim squad scripted
Если сквад не является монстрами по отношению к актору и отношения сквада дружеское , то спот alife_presentation_squad_friend если отношение сквада нейтральное , то спот alife_presentation_squad_neutral
Функция get_squad_goodwill_to_actor_by_id(squad_id)
Если сквад = nil то возвращаемся к squad.relationship Если сквад = монстры по отношению к актору то Возвращаем "enemy" Стандартное отношение к актору - Нейтральное Если relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())>=FRIENDS то Отношение дружеское Если relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())<=ENEMIES то Отношение враги
Если сквад = монстры по отношению к актору то Возвращаем "enemy" Количество нпс = 0 Отношение = 0 Если количество НПС ~= 0 то delta = Отношение/количество НПС Если delta <= ENEMIES то Возвращаем "enemy" Если delta >= FRIENDS то Возвращаем "friends" Если delta <friends и delta > ENEMIES то Возвращаем "neutral"
:D
Сообщение отредактировал SanyaSuicide - Вторник, 05.07.2016, 17:45
Такая ерунда: ставлю в СДК групповой объект light_sharnir_1_6m, собираю спавн - а в игре ни самой модели ни света нет. Вроде не статическая модель (пробовал к сектору добавить - не добавляется). В чем проблема? Зараннее спасибо!
Добавлено (05.07.2016, 15:44) --------------------------------------------- И еще такая маленькая проблемка: написал схему, которая отлавливает индексы костей в которые попал ГГ, если голова\живот, то убиваем НПС ф-цией kill(obj), но тогда убийство не добавлялось в статистику. После кое-каких манипуляций в статистику добавляются и убитые НПС с помощью kill(obj) и убитые правильно. Но во время боя с НПС заметил баг - заспавнил 15 НПС, а в статистике убито 17-20. Где накосячил? Вот hit_callback и death_callback из xr_motivatorа.
Код
function motivator_binder:hit_callback(obj, amount, local_direction, who, bone_index) -- FIXME: коллбеки неплохо было бы регистрировать в общем storage, а не посхемно... -- просто всегда ставить их при включении схемы и снимать при отключении. if(who:id()==db.actor:id()) then xr_statistic.set_best_weapon(amount)
--[[ local se_obj = alife():object(obj:id()) if se_obj and se_obj.m_smart_terrain_id ~= 65535 and amount > 0 then local smart_obj = alife():object(se_obj.m_smart_terrain_id) smart_obj:set_alarm()
if smart_obj.base_on_actor_control ~= nil then smart_obj.base_on_actor_control:actor_attack() end end ]] -- Ищем смарты по расстоянию if amount > 0 then for k,v in pairs(sim_board.get_sim_board().smarts) do local smart = v.smrt if smart.base_on_actor_control ~= nil then local level_id = game_graph():vertex(smart.m_game_vertex_id):level_id() local actor_level_id = game_graph():vertex(alife():actor().m_game_vertex_id):level_id() if level_id == actor_level_id and db.actor:position():distance_to_sqr(smart.position) <= 6400 then if self.object:relation(db.actor) ~= game_object.enemy then smart.base_on_actor_control:actor_attack() end end end end end end if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "hit_callback", obj, amount, local_direction, who, bone_index) end if self.st.combat_ignore then xr_logic.issue_event(self.object, self.st.combat_ignore, "hit_callback", obj, amount, local_direction, who, bone_index) end if self.st.combat then xr_logic.issue_event(self.object, self.st.combat, "hit_callback", obj, amount, local_direction, who, bone_index) end if self.st.hit then xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index) end
-- Если пришел смертельный хит, с некоторой вероятностью делаем чувака раненым. if bone_index ~= 15 and amount > self.object.health*100 then --printf("DEADLY HIT %s %s", amount, self.object.health*100) self.object.health = 0.15 end
if amount > 0 then printf("HIT_CALLBACK: %s amount=%s bone=%s", obj:name(), amount, tostring(bone_index)) -- self.need_relation_update = who:id() == db.actor:id() xr_wounded.hit_callback(obj:id()) end ------------------------ Расчет попаданий по НПС -------------------------------------- if amount > 0 and who:id() == db.actor:id() then ------------------------ если ранен в голову или грудь - убиваем --------------------------------------
if bone_index == 3 or bone_index == 12 or bone_index == 13 or bone_index == 14 or bone_index == 15 or bone_index == 16 or bone_index == 17 or bone_index == 18 or bone_index == 19 or bone_index == 20 or bone_index == 21 or bone_index == 34 then self.kill_enemy = true else --elseif bone_index ~= "from_death_callback" then --elseif bone_index == 1 or bone_index == 2 or bone_index == 4 or bone_index == 5 or bone_index == 6 or bone_index == 7 or bone_index == 8 or bone_index == 9 or bone_index == 10 or bone_index == 11 or bone_index == 22 or bone_index == 23 or bone_index == 24 or bone_index == 25 or bone_index == 26 or bone_index == 27 or bone_index == 28 or bone_index == 29 or bone_index == 30 or bone_index == 31 or bone_index == 32 or bone_index == 33 or bone_index == 35 or bone_index == 36 or bone_index == 37 or bone_index == 38 or bone_index == 39 or bone_index == 40 or bone_index == 41 or bone_index == 42 or bone_index == 43 or bone_index == 44 or bone_index == 45 or bone_index == 46 or bone_index == 47 then self.kill_enemy = false end ------------------------------------------------------------------------------------------------------------------------ ------------------------- хедшот ----------------------------------------------------------------------------------------- if bone_index == 15 or bone_index == 16 or bone_index == 17 or bone_index == 18 or bone_index == 19 then self.head_shoot = true elseif bone_index ~= "from_death_callback" then self.head_shoot = false end ---------------------------------------------------------------- ------------------------- в глаз ----------------------------------------------------------------------------------------- if bone_index == 16 or bone_index == 17 then self.eye_shoot = true elseif bone_index ~= "from_death_callback" then self.eye_shoot = false end ---------------------------------------------------------------- end local npc = self.object if self.kill_enemy == true and who:id() == db.actor:id() then npc:kill(npc) xr_statistic.inc_killed_stalkers_counter() xr_effects.inc_statistic_rank_counter() end ------------------------------------------------------------------------------------ end
function motivator_binder:death_callback(victim, who) self:hit_callback(victim, 1, vector():set(0,0,0), who, "from_death_callback")
xrs_dyn_music.npc_table[self.object:id()] = nil xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] = nil -- xrs_dyn_music.stop_combat(self.object:id()) --' Если игрок был с квестом от механика - фейлить его local st = db.storage[self.object:id()] local npc = self.object stalker_generic.remove_level_spot(npc, st) --' end -- if who:id() == db.actor:id() then xr_statistic.set_best_monster(npc) xr_statistic.inc_killed_stalkers_counter() xr_effects.inc_statistic_rank_counter() end -------------------------------------------------------------------------- ------------------------------------------ добавление хедшота в статистику ----- if self.head_shoot == true then xr_statistic.inc_head_shoot_counter() xr_effects.inc_statistic_rank_counter() end -------------------------------------------------------------------------- ------------------------------------------ добавление попаданий в глаз в статистику ----- if self.eye_shoot == true then xr_statistic.inc_eye_shoot_counter() end -------------------------------------------------------------------------- ------------------------------------------ добавление убийств ножом в статистику ----- if db.actor:active_slot() == 1 then xr_statistic.inc_knife_killed_counter() xr_effects.inc_statistic_rank_counter() end -------------------------------------------------------------------------- ------------------------------------------ добавление убийств гранатами в статистику ----- if db.actor:active_slot() == 4 then xr_statistic.inc_grenade_killed_counter() end -------------------------------------------------------------------------- -------------------------------------- Если ГГ убил НПС гранатой или РПГ... то вызываем партикл взрыва и удаляем труп (имитация разрыва тел)----------------------------------------------------------------------------- if db.actor:alive() then local act_slot = db.actor:active_slot() local act_item = db.actor:active_item() local weapon = act_item:section() local particle = particles_object("anomaly2\\body_tear_01") local npos = npc:position() local x = npos.x local y = npos.y + 2 local z = npos.z if act_slot and act_item then if weapon == "wpn_rpg7" or weapon == "wpn_rg-6" or weapon == "wpn_m79" or act_slot == 4 then alife():release(alife():object(npc:id()), true) particle:play_at_pos(vector():set(x,y,z)) end end end -----------------------------------------------------------------------------------------------------------------------
--' Загрузка историй для лагеря. local known_info = utils.cfg_get_string(st.ini,st.section_logic , "known_info", self.object, false, "", nil) printf("xr_info from death loaded!!!") xr_info.loadInfo(self.object, st.ini, known_info)
--' Принудительно обнуляем анимейшн менеджер чтобы отдетачились приатаченные объекты if self.st.state_mgr ~= nil then self.st.state_mgr.animation:set_state(nil, true) end
if self.st.reach_task then xr_logic.issue_event(self.object, self.st.reach_task, "death_callback", victim, who) end if self.st.death then xr_logic.issue_event(self.object, self.st.death, "death_callback", victim, who) end if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who) end
self:clear_callbacks() --' Наносим небольшой импульс вперед. if(actor_stats.remove_from_ranking~=nil)then local community = character_community(self.object) if community == "zombied" or community == "monolith" then else actor_stats.remove_from_ranking(self.object:id()) end
end release_body_manager.get_release_body_manager():moving_dead_body(self.object) end
SanyaSuicide, Ну вот посмеялись вы , а голову включать отказываетесь принципиально? Тогда объяснять придется мне:
for k in squad:squad_members() do ... Итерируясь по списку объектов, членов сквада, подсчитываем их количество npc_count и суммарное отношение к ГГ goodwill, только одно НО если сквад в оффлайне то НИКАКИХ объектов членов сквада нет и считать их параметры таким образом не удастся. ... end if npc_count ~= 0 then ... Итак если сквад был онлайн, то npc_count отлично от нуля и возможно рассчитать среднее отношение к ГГ НПС членов данного сквада и выдать результат ОТНОШЕНИЕ КОНКРЕТНОГО СКВАДА к ГГ ... end ... Ну а если нет, что выводить? А если ничего выводить поскольку сквад был офлайн, то выводим ОТНОШЕНИЕ ГРУППИРОВКИ к ГГ: return get_squad_goodwill_to_actor_by_id(squad_id) Которое может принципиально отличаться от отношения конкретного сквада этой группировки!
Цитата_S_k_i_F_ ()
Такая ерунда: ставлю в СДК групповой объект light_sharnir_1_6m, собираю спавн - а в игре ни самой модели ни света нет. Вроде не статическая модель (пробовал к сектору добавить - не добавляется). В чем проблема?
Групповой объект на то и групповой, что может содержать в себе объекты из разных классов, статические, спавн, источники света, статические партиклы и даже звуки. А при сборке спавна в него попали только спавн объекты из всего списка. В любом случае напротив всех составляющих частей группового объекта должны стоять галки.
Сообщение отредактировал denis2000 - Вторник, 05.07.2016, 19:15
Ну вот посмеялись вы , а голову включать отказываетесь принципиально? Тогда объяснять придется мне:
Так будет работать , прямо в sim_squad? Почемуто я когда подкючаю эту функцию , то получаю вылет Can't find variable ef_creature_type in [army_sim_squad_advanced] ef_creature_type прописан в m stalker
Функция
Код
function sim_squad_scripted:get_squad_relation() local squad = alife():object(self.id) --Для он-лайн сквадов local goodwill = 0 local npc_count = 0 for k in squad:squad_members() do local object = db.storage[k.id] and db.storage[k.id].object if object and db.actor then goodwill = goodwill + object:general_goodwill(db.actor) npc_count = npc_count + 1 end end
if npc_count ~= 0 then local delta = goodwill/npc_count if delta <= -1000 then return "enemy" elseif delta >= 1000 then return "friends" elseif delta < 1000 and delta > -1000 then return "neutral" end end
--Для оф-лайн сквадов local relation = 0 if db.actor then relation = db.actor:community_goodwill(self.player_id)+game_relations.get_factions_community(self.player_id, alife():actor():community()) else relation = game_relations.get_factions_community(self.player_id, alife():actor():community()) end
if relation >= 1000 then return "friends" elseif relation <= -1000 then return "enemy" else return "neutral" end
end
Вызов
Код
if not(is_squad_monster[self.player_id]) then local relation = self:get_squad_relation() if(relation=="friends") then spot = "alife_presentation_squad_friend" elseif(relation=="neutral") then spot = "alife_presentation_squad_neutral" elseif(relation=="enemy") then spot = "alife_presentation_squad_enemy" end else spot = "alife_presentation_squad_monster" end
Я просто полохо шарю в скриптах сталкера , занимался только скриптами армы , там попроще будет)
Сообщение отредактировал SanyaSuicide - Вторник, 05.07.2016, 19:20