Перейти к контенту

Рекомендуемые сообщения

Доброго времени суток.
Задался для чистого Сталкера:ЗП сделать так, чтобы у НПС после смерти в инвентаре можно было скоммуниздить броник, и он бы имел прочность, отличную от 100%, ну то есть был бы разброс.

 

Скрытый текст

Вначале, в файле character_desc_general.xml я добавил некоторым неписям эти самые броники(как пример):

 

<!--  bandit novice  -->

  <specific_character id="sim_default_bandit_0_default_0" team_default = "1">
    <name>GENERATE_NAME_bandit</name>
    <icon>ui_inGame2_bandit_1</icon>
    <map_icon x="1" y="0"></map_icon>
    <bio>Опытный сталкер. Детальная информация отсутствует.</bio>

    <class>sim_default_bandit_0</class>
    <community>bandit</community> <terrain_sect>stalker_terrain</terrain_sect>
    <snd_config>characters_voice\human_01\bandit\</snd_config>

    <rank>20</rank>
    <reputation>0</reputation>
    <money min="250" max="1750" infinitive="0"/>
    <visual>actors\stalker_bandit\stalker_bandit_1</visual>
    <supplies>
      [spawn] \n
     novice_outfit \n
      wpn_bm16 \n
      ammo_12x70_buck = 1 \n
      wpn_pm  \n
      ammo_9x18_fmj = 1 \n

#include "gameplay\character_items_nd.xml"
#include "gameplay\character_food.xml"
#include "gameplay\character_drugs.xml"
    </supplies>

После старта новой игры - сработало - бандиты стали делиться чёткими плащами.

Вот что делать с их прочностью? Я хотел сделать как у оружия, для этого полез в death_manager.script:
 

--printf("item name [%s]", item:name())
    if isWeapon(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then
        set_weapon_drop_condition(item)
        return
    end
    --printf("item name [%s]", item:name())
    if isOutfit(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then
        set_outfit_drop_condition(item)
        return
    end

    if xr_corpse_detection.lootable_table[section] == true and ammo_sections[section] == nil then
        return
    end
    alife():release(alife():object(item:id()), true)

--[[
    local item_id = item:id()
    local item_in_slot = npc:item_in_slot(2)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end
    item_in_slot = npc:item_in_slot(3)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end
    item_in_slot = npc:item_in_slot(7)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end


--  npc:mark_item_dropped(item)
    local item_in_slot = npc:item_in_slot(4)
    if item_in_slot ~= nil and item_in_slot:id() == item_id    then
        return
    end
    if not npc:marked_dropped(item) then
--        printf("releasing object ["..item:name().."]")
        alife():release(alife():object(item:id()), true)
    end
    ]]
end

function set_weapon_drop_condition(item)
    local condition  = (math.random(40)+40)/100
    --printf("condition [%s]", tostring(condition))
    item:set_condition(condition)    
end

function set_outfit_drop_condition(item)
    local condition  = (math.random(40)+40)/100
    --printf("condition [%s]", tostring(condition))
    item:set_condition(condition)    
end



Часть когда, который я дополнил. По порядку.

Вначале я подумал, что хватит добавить для вычисления окончательной (посмертной) прочности брони добавлением её слота (в system.lts броня числится за 7 слотом):

 

 item_in_slot = npc:item_in_slot(7)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end

 

Ни рыба, ни мясо, ничего не изменилось. После, добавил следующее:

function set_outfit_drop_condition(item)
    local condition  = (math.random(40)+40)/100
    --printf("condition [%s]", tostring(condition))
    item:set_condition(condition)    
end

 

Аналогично. 

Далее:

 --printf("item name [%s]", item:name())
    if isOutfit(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then
        set_outfit_drop_condition(item)
        return
    end

 

Вылет Line 748, движок не понимал, что такое isOutfit. Поисковиком нашёл некий файл _g.script:

 

-------------------------------------------------------------------------------------------
local monster_classes = {}
local stalker_classes = {}
local weapon_classes = {}
local artefact_classes = {}
local outfit_classes = {}

function IsMonster (object, class_id)
        local id = class_id or get_clsid(object)
        return monster_classes[id] == true
end
function IsStalker (object, class_id)
        local id = class_id or get_clsid(object)
        return stalker_classes[id] == true
end

function isWeapon(object, class_id)
    local id = class_id or get_clsid(object)
    return weapon_classes[id] == true
end

function isArtefact(object, class_id)
        local id = class_id or get_clsid(object)
    return artefact_classes[id] == true
end

function isOutfit(object, class_id)
        local id = class_id or get_clsid(object)
    return outfit_classes[id] == true
end

 

Добавление данных кусочков убрал вылет. То есть, я видимо, добавил эту функцию. Однако кондишн остался непреклонен.
И тут я уже не знаю, что делать дальше, хотя есть чувство (мб ложное) что близок.
Не подскажете, как завершить? И вообще, правильно я хоть начал?

Поисковиком пользовался, видел, что не я один пытался выдать параметр прочности и её различность (правда, не броне), правда, ничерта толком и не понял.
Помогите, пожалуйста.



 

 

Ссылка на комментарий

@AndreySol ЧН 1.5.10, [configs\misc\technics_specialization.ltx].

В оригинале так:

[mar_csky_tech]
wpn_mp5
novice_outfit

В моде так:

Spoiler

[mar_csky_tech]
wpn_mp5
novice_outfit

st_tech_pistols_ussr
st_wpn_hpsa
st_tech_shotguns
st_tech_assault_all
st_wpn_fn2000
st_wpn_groza
st_wpn_rp

tech_outfit_jackets
stalker_outfit_name
tech_outfit_csky

 

Обработка измененной функцией из [scripts\inventory_upgrades.script]:

Spoiler

local gts = game.translate_string

function get_technic_specialization(section)
	local ini = ini_file("misc\\technics_specialization.ltx")
	local sys_ini = system_ini()
	if ini:section_exist(section) then
        local str = game.translate_string("st_technic_specialization")
		local n = ini:line_count(section)

		local main = {}
		local other_wp = {}
		local other_am = {}

		for i = 0, n -1 do
			local temp1, id, temp2 = ini:r_line(section, i, "", "")

			if string.find(id, "^st_") then
				other_wp[#other_wp +1] = id
			elseif string.find(id, "_outfit_") then
				other_am[#other_am +1] = id
			else
				main[#main +1] = id
			end
		end

		if #main == 0 then			-- только обычная прокачка
			str = str .. "\\n%c[default]" .. gts("st_technic_specialization_none")
		else
			table.sort(main)
			for i = 1, #main do
				str = str.."%c[default] \\n• "..gts(sys_ini:r_string(main[i], "inv_name"))
			end
		end

		table.sort(other_wp)		-- сортировка, потом перевод
		table.sort(other_am)

		local other_st = {}

		for i = 1, #other_wp do
			other_st[i] = "• " .. gts(other_wp[i])
		end

		for i = 1, #other_am do
			other_st[#other_wp + i] = "• " .. gts(other_am[i])
		end

		local str_other = table.concat(other_st, "\\n")
		return str .. "\\n \\n%c[ui_4]" .. gts("st_technic_spec_other") .. "\\n%c[default]" .. str_other
	else
		return gts("st_technic_specialization") .. "\\n%c[default]" .. gts("st_technic_specialization_none")
	end
end

 

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
35 минут назад, Space.Marine сказал:

@Firestarter, а прописать броню в death_items_....ltx не проще ???

@Space.Marine, Нет, не проще. Я как сам таким промышлял, так и видел наподобие моды.
Потому что:
1)Нельзя будет точно указать, у кого что из сталкеров будет выпадать (например, есть несколько внешних видов бандитов, но в данном файле нельзя будет так расписать. Можно будет конкретно группировке Бандиты расписать, что у них будет выпадать броня, но, опять же, нельзя будет подвязать её к кому-либо конкретному;
2)И, возвращаясь к моему основному вопросу, в этом файле нельзя устанавливать рандомное значение прочности предмета, хотя бы потому, что данные файлы созданы для посмертного спавна всякой мелочёвки по типу - артов, амуниции, лекарств. Но никак не брони и оружия.

Изменено пользователем Firestarter
  • Согласен 1
Ссылка на комментарий
4 часа назад, Firestarter сказал:

local outfit_classes = {}

@Firestarter, теперь надо в эту табличку добавить клсиды классов брони. Если она пустая, то isOutfit для любого предмета вернет false, и скрипт не найдет в луте нпс тех вещей, к которым надо применять set_outfit_drop_condition.

  • Спасибо 1
  • Полезно 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

@Norman Eisenherz

Непонятно, зачем Вам четкий порядок чтения строк из конфига, если есть точный признак для каждой группы предметов - "st_", "_outfit_" и остальное. Собирайте эти группы каждую в свою таблицу, а затем формируйте строку из этих таблиц в нужном порядке.

  • Согласен 1
Ссылка на комментарий

@AndreySol Ну ведь не это я спрашивал. Хочу сделать так, чтобы оружие было перечислено в порядке возрастания "полезности": пистолеты, ПП, дробовики, автоматы, снайперки. При этом не хочу вручную задавать алфавитный порядок через имена string_id.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

@AndreySol Подозреваю, что как раз правками движка можно добиться нужного порядка чтения, а вот в обычных скриптах возможности ограничены… Разве что список с числовыми ключами в отдельном файле создавать, чтобы читать его по порядку.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

В движке порядок чтения конфигов и так есть, почитайте xr_ini.cpp

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

@Norman Eisenherz, в LUA-функции table.sort есть необязательный второй аргумент - функция сортировки:

function functor_sort(a,b)
    return (< b)
end

В ней можно реализовать любые условия сортировки. В самом "тупом" случае - сделать таблицу с ключами:

Скрытый текст

key_table = {
	["st_tech_pistols_ussr"] = 1,
	["st_wpn_hpsa"] = 2,
	["st_tech_shotguns"] = 3,
	["st_tech_assault_all"] = 4,
	["st_wpn_fn2000"] = 5,
	["st_wpn_groz"] = 6,
	["st_wpn_rp tech_outfit_jackets"] = 7,
	["stalker_outfit_name"] = 8,
	["tech_outfit_csky"] = 9
}

function functor_sort(a,b)
    return (key_table[a] < key_table[b])
end

table.sort(main, functor_sort)

 

 

Изменено пользователем WinCap
  • Нравится 1
  • Полезно 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

Ссылка на комментарий

@WinCap

Это не совсем то, что нужно вопрошавшему, точнее не до конца то..

@Norman Eisenherz

Если уж так приперло, то вводить дополнительный ключ идентификации, типа "st_1", "_outfit_1", "st_2", "_outfit_2", ну и затем строить список в соответствии с номерами строк.

А вообще это по нашему: поставить себе сомнительной полезности задачу, а затем героически ее решать. Лично мне кажется, что игрокам будет совсем наплевать в каком порядке будут перечисляться объекты в пределах группы.

  • Согласен 1
Ссылка на комментарий
Только что, AndreySol сказал:

Это не совсем то, что нужно вопрошавшему,

Если я таки верно понял вопрошавшего, ему хотелось "в правильном порядке" вывести определенные текстовые элементы.

И во первых да, сложно придумать ситуацию где это было бы действительно важно, но допустим они бывают.

А во вторых, для организации такого, существует 1001 способ на любой вкус, и метод предложенный @WinCap, ничем не хуже любого другого.

Добиваться же выяснения номера строки в конфиге, для этой цели так же "нужно" как собаке пятая нога.

Не говоря уж о том, что привязка вывода к номеру строки, если таки ее реализовать тем или иным способом, чревата проблемами в будущем при необходимости правки конфигов. Добавится потом какая-то новая строка в эту секцию - и вся "верстка" "поедет".

  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Господа, а есть в двигле огср способ рандомизировать в диалоге НПС с ГГ скриптовые фразы? Именно скриптовые. В ванильке фразы меняются только после сейв/лоада

Ссылка на комментарий

@Zander_driver, Большое спасибо!!!
После такого количества времени, всё же - получилось.

 

Скрытый текст

 

Я вначале не особо понял, про какую табличку шла речь. Однако поиском local outfit_classes = {} в данном же файле как нашёл данную место, где должна была быть данная табличка, так и допёр, о чём шла речь.

 

 

monster_classes = {
        [clsid.bloodsucker_s]             = true,
        [clsid.boar_s]                     = true,
        [clsid.dog_s]                     = true,
        [clsid.flesh_s]                 = true,
        [clsid.pseudodog_s]             = true,
        [clsid.burer_s]                 = true,
--        [clsid.cat_s]                     = true,
        [clsid.chimera_s]                 = true,
        [clsid.controller_s]             = true,
--        [clsid.fracture_s]                 = true,
        [clsid.poltergeist_s]             = true,
        [clsid.gigant_s]                 = true,
--        [clsid.zombie_s]                 = true,
        [clsid.snork_s]                 = true,
        [clsid.tushkano_s]                 = true,
        [clsid.psy_dog_s]                 = true,
        [clsid.psy_dog_phantom_s]         = true}

    stalker_classes = {
        [clsid.script_actor]             = true,
        [clsid.script_stalker]             = true}

    weapon_classes = {
        [clsid.wpn_vintorez_s]             = true,
        [clsid.wpn_ak74_s]                 = true,
        [clsid.wpn_lr300_s]             = true,
        [clsid.wpn_hpsa_s]                 = true,
        [clsid.wpn_pm_s]                 = true,
        [clsid.wpn_shotgun_s]             = true,
        [clsid.wpn_auto_shotgun_s]        = true,
        [clsid.wpn_bm16_s]                 = true,
        [clsid.wpn_svd_s]                 = true,
        [clsid.wpn_svu_s]                 = true,
        [clsid.wpn_rg6_s]                 = true,
        [clsid.wpn_rpg7_s]                 = true,
        [clsid.wpn_val_s]                 = true,
        [clsid.wpn_walther_s]             = true,
        [clsid.wpn_usp45_s]             = true,
        [clsid.wpn_groza_s]             = true,
        [clsid.wpn_knife_s]             = true,
        [clsid.wpn_grenade_f1_s]         = true,
        [clsid.wpn_grenade_rgd5_s]         = true,
        [clsid.wpn_grenade_launcher]     = true,
        [clsid.wpn_grenade_fake]         = true}

    artefact_classes = {
        [clsid.art_bast_artefact]         = true,
        [clsid.art_black_drops]         = true,
        [clsid.art_dummy]                 = true,
        [clsid.art_electric_ball]         = true,
        [clsid.art_faded_ball]             = true,
        [clsid.art_galantine]             = true,
        [clsid.art_gravi]                 = true,
        [clsid.art_gravi_black]         = true,
        [clsid.art_mercury_ball]         = true,
        [clsid.art_needles]             = true,
        [clsid.art_rusty_hair]             = true,
        [clsid.art_thorn]                 = true,
        [clsid.art_zuda]                 = true,
        [clsid.artefact]                 = true,
        [clsid.artefact_s]                 = true}
    
    outfit_classes = {
        [clsid.equ_stalker_s]         = true}


Я с дуру просто добавил название брони, и получил вылет - я не глянул, что нужен именно класс. В файле outfit.ltx у всех броников единый класс - E_STLK, однако, и это добавление вызывало вылет. Поискав это слово Тотал Коммандером (Слава Тотал Коммандеру), откликнулся единственный файл - class_registrator.script, который как бы даёт расшифровку классам. Что интересно, броня почему-то названа... equ_stalker_s, "сталкер". Главное, строчкой ниже шлемы и названы шлемами.:biggrin: ну чёрт знает, "я разработчик, я так вижу".

Вот его добавление и проба игрой наконец-то позволила реализовать разброс прочности брони... Оооооох.

Ещё раз спасибо. 

Я так подробно расписываю, дабы себе сохранить + мб кому это пригодится (хотя, если мне уже посоветовали...значит, и так знают).

 

Добавлено  Опричник,

Для "Спасибо" в каждом сообщении справа-внизу есть кнопки. (п.2.1.1. правил форума)

  • Нравится 1
Ссылка на комментарий
6 hours ago, Zander_driver said:

привязка вывода к номеру строки, если таки ее реализовать тем или иным способом, чревата проблемами в будущем

Не к номеру – к порядку. Пять строк, десять – главное, чтобы они были выведены в подсказку в том же порядке, в котором перечислены. Про вариант со списком и я сам упоминал.

Что касается задач сомнительной полезности, то именно из решения таких задач я получаю больше всего информации.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
25.08.2020 в 23:39, Norman Eisenherz сказал:

я получаю больше всего информации.

Не вопрос, всем понятно, что чем сложнее задачу ты решил, тем больше опыта\удовлетворения поимел с этого.

Но Вы попробуйте мне, как потенциальному игроку в Ваш мод, объяснить, в чем разница для меня, если я буду видеть список доступных улучшений у техника в "правильном порядке"? А вдруг у меня иное понимание важности\правильности этих улучшений?

  • Нравится 3
  • Согласен 3
  • Смешно 2
Ссылка на комментарий

Доброго времени!

Вопрос - в ТЧ за ограничения по количеству одновременного спавна "живности" на локации отвечает файл se_respawn.script, а что отвечает за то же самое в ЗП? В некоторых модах на ЗП есть файл mod_params.ltx, в котором можно прописать много чего полезного. Но какие ещё файлы отвечают за количество и ограничения спавна?

Изменено пользователем mdm64
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...