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

Скриптование


Svoboда

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

Доброго времени суток.
Задался для чистого Сталкера:ЗП сделать так, чтобы у НПС после смерти в инвентаре можно было скоммуниздить броник, и он бы имел прочность, отличную от 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

 

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

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



 

 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
35 минут назад, Space.Marine сказал:

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

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

Изменено пользователем Firestarter
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@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: ну чёрт знает, "я разработчик, я так вижу".

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

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

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

 

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

Здравствуйте. 
Не подскажете, есть ли возможность в ТЧ сделать тайники изначально заполненными, без надобности обшаривать каждый труп на наличие записи о тайнике? Ну то есть - ты сам должен будешь искать тайники, обшаривать каждый угол, нет никаких пометок на мини-карте/карте, нет такого, что какой-либо труп даёт заметку о каком-либо тайнике? 
Просто всегда раздражала фигня, что пока не получишь наводку, тайник останется пустовать. Много больше нравилась система как в ЗП, хотя там как таковых тайников в виде сундучков/ящиков нету, все предметы валяются.

Поделиться этим сообщением


Ссылка на сообщение
1 час назад, mole venomous сказал(а):

Можно выдать тайники где-нибудь в начале новой игры.

Т.е., то, что я описал - нереализуемо? Только лишь выбрать конкретно один ящик, и туда всё содержимое всех тайников запихать?
Разве вообще никак нельзя сделать так, как я описал?

  • Сомнительно 1

Поделиться этим сообщением


Ссылка на сообщение
1 час назад, mole venomous сказал(а):

Я вроде, так и написал в начале предыдущего поста.

Значит я не понял, виноват, буду пробовать.

3 часа назад, mole venomous сказал(а):

Можно ещё подавить выдачу СМС и метки тайника, закомментировав строки

Большое Вам спасибо за помощь. Особенно за цитируемое спасибо. 
Просто ранее играл с модом, который позволял, осмотрев одно конкретное тело, получить наводки на все тайники. Не очень круто было, слишком тогда просто становилось играть.
А так хоть будет резон всё обыскивать.

Поделиться этим сообщением


Ссылка на сообщение

Я прошу прощения заранее, если это обсуждалось где, пожалуйста не бейте  я честно пользовался поисковиком в данной теме по контрольным словам Борода; Артефакты на Заказ; b29
 

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

 

Здравствуйте. Давеча заинтересовался вопросом касательно квеста "Артефакты на заказ" от Бороды, что на Затоне.
До сегодняшнего дня единственным верным для меня этот квест существовал только если у меня есть в карманах подходящий арт. Но, т.к. решил перепройти сталкер и мб даже открыть для себя что новое. И решил я таки попытать счастье с этим квестом, хоть и не нравился он мне (не получалось найти нужный арт). 
Обнаружил некую закономерность, что должно пройти некоторое время после взятия квеста. Отметил, что выброс может в этом плане помочь, "обновляя" содержимое аномалии (это знаю лишь из собственных наблюдений + википедии, в файлах пока не находил).
Плюс, пару раз удавалось поймать сигнал группы, что либо ищет/либо уже нашла нужный арт.

Начал рыться по файлам.
В файле dialogs_zaton.script обнаружил много интересного - какие арты нужны для поиска (прямо не указано, но банальная сверка с википедией это подтвердила):

 

]]--
    [16] = "af_gravi",
    [17] = "af_eye",
    [18] = "af_baloon",
    [19] = "af_dummy_dummy",
    [20] = "af_gold_fish",
    [21] = "af_fire",
    [22] = "af_glass",
    [23] = "af_ice",
}


Какие "стволы" группы соперников примут в обмен на искомый арт:

 

function is_good_gun(npc, item)
    local section = item:section()
    local wpn_table = {
                        [1] = "wpn_sig550",
                        [2] = "wpn_g36",
                        [3] = "wpn_val",
                        [4] = "wpn_groza",
                        [5] = "wpn_vintorez",
                        [6] = "wpn_fn2000",
                        }

 

Стало понятно, что квест заставляет искомый арт появиться именно на Затоне:

local anomalies_names_tbl = {
                                ["gravi"] = {
                                            [1] = "zat_b14_anomal_zone",
                                            [2] = "zat_b55_anomal_zone",
                                            [3] = "zat_b44_anomal_zone_gravi",
                                            },
                                ["thermal"] = {
                                            [1] = "zat_b20_anomal_zone",
                                            [2] = "zat_b53_anomal_zone",
                                            [3] = "zaton_b56_anomal_zone",
                                            },
                                ["acid"] = {
                                            [1] = "zat_b39_anomal_zone",
                                            [2] = "zat_b101_anomal_zone",
                                            [3] = "zat_b44_anomal_zone_acid",
                                            },
                                ["electra"] = {
                                            [1] = "zat_b54_anomal_zone",
                                            [2] = "zat_b100_anomal_zone",
                                            },
                                }

 

Ну и название квеста:
-- Zaton B29, при поиске использовал:
zat_b29

 

Поиск по этому ключевому слову толком ничего в понимании не дал. Нашлась куча файлов, но ничерта не понял, кроме того, что групп - две, что есть некие таймеры поиска артефактов/простоя у этих групп, что группы - вроде как неубиваемы (другими неписями), не реагируют на стрельбу в них (со стороны других НПС).
Вопросы:
1)Есть ли закономерность в поиске артов? Т.е. взял квест, и сколько нужно ждать времени/выбросом для 100% нахождения нужного арта/как влияет количество часов/выбросов? Есть ли рандом в этих значениях (исходя из личного наблюдения, видимо, есть)?
1.1)Влияет ли выброс на этот квест и является ли он ключевым для него - то есть - стоит искать арт только после выброса, т.к. обновятся аномалии? (честно сказать, всё ещё в поиске файла, который опишет обновление аномалий на наличие артов);
2)Если есть, то какая закономерность появления групп на поиск? Я пробовал тупо спать чуть ли не каждый час в попытке выловить сигнал и направиться к ним, из многих таких попыток лишь дважды я не проспал.

 

 

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение
12 минут назад, Space.Marine сказал:

А ты уверен, что у тебя "чистый" ЗП? 

Не понял, к чему вопрос? Да, чистый. 
В чистом ЗП можно успеть выловить группу сталкеров, что уже нашли арт и несут на базу, и предложить им обменяться на хороший ствол. Стволы перечислены в вашем цитировании.

Поделиться этим сообщением


Ссылка на сообщение
Только что, Space.Marine сказал:

Как-то так )

Ну, по порядку:

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

 

1)Если я правильно понял, то первый выброс, исходя из файла surge_manager.script, это:

local START_MIN_SURGE_TIME     = 2*60*60
local START_MAX_SURGE_TIME     = 4*60*60

т.е. это от двух до четырёх часов игрового времени? Судя по личному опыту - так и есть, первый выброс относительно быстро после старта случается. А вот уже в дальнейшем:

local MIN_SURGE_TIME         = 12*60*60
local MAX_SURGE_TIME         = 24*60*60

Что тоже верно, исходя из игры.
2)По поводу влияния взятого квеста на шанс появления того или иного арта, скорее всего, я ошибался. Чуть погуглив, по пути:
...\gamedata\configs\scripts\zaton\anomaly
можно обнаружить файлы аномалий, а в них:

[anomal_zone]
layers_count = 3
respawn_tries = 1
max_artefacts = 2
;applying_force_xz = 200
;applying_force_y = 400 
artefacts = af_medusa, af_cristall_flower, af_night_star, af_vyvert, af_gravi, af_gold_fish
start_artefact = af_night_star
coeff = 3, 3, 2, 2, 1, 1
artefact_ways = zat_b14_af_way, zat_b14_af_way_2, zat_b14_af_way_3
field_name = zat_b14_zone_field_radioactive_weak

Ну это как одна из аномалий, zaton_b14. 
Самое интересующее, это конечно же:

 

coeff = 3, 3, 2, 2, 1, 1

То есть это коэффициенты, которые соответствуют артефактам (6 коэф. = 6 артов), и чем выше число, тем выше шанс выпадения арта. 
Но хотелось бы большего понимания - что это цифры значат? Т.е. конкретика - сколько 3 в процентах (думал, что 30, но в каждом файле по-разному есть соотношение этих коэффициентов.)

3)Пока не нашёл файла влияния выбросов на появление артов. Перерою весь сталкер по ключевым словам, надеюсь, найду...и буду признателен вам, если вспомните/поищете этот скрипт.

4)про обмен у групп сталкеров оружия на арты, если честно, слышу впервые, но, судя по скрипту, имеет место быть. Хотя, ИМХО, это совершенно бесполезная штука
Отнюдь. Борода даёт максимальную цену за артефакты на заказ - от 18000 до 24000 рублей. Поэтому имеет смысл выловить вовремя группу соперников и толкнуть им хороший ствол (особенно на Затоне если такое провернуть). 
Также, с начала игры на Скадовске, мы ограничены детектором Медведь, который поможет нам найти малое кол-во артов из запрашиваемых Бородой
Всё несколько иначе. Медведь не позволяет найти ни одного артефакта, что заказывает Борода - нужен Велес. 
Велес можно получить, как минимум, тремя способами:
1)От Бороды в качестве награды за уничтожение логова кровососов - и это ближайший и быстрейший путь получения Велеса.
2)Если убивать группы сталкеров, что идут к Бороде с найденным артефактом (если убить две группы, Борода прекратит выдавать задания на поиск артов, так что надо быть поаккуратнее. Да и такое это дело...мочить сталкеров.)
3)Когда есть квест "Артефакт на заказ" от Бороды, группы соперников можно будет обнаружить в различных аномалиях (чаще в тех, где теоретически может появиться искомый арт). Как минимум у главаря будет Велес. И, если я правильно понял, за убийство таких сталкеров Борода ничего не скажет (не проверял). Да и такое это дело...мочить сталкеров.
(4)(возможно) Будет продавать Сыч после получения достижения "Состоятельный клиент". Точно не уверен, не понял влияния этой ачивки на шансы в торговле (там что-то связано с припиской scientific, и то ли это ачивка "Научный сотрудник" влияет, то ли выполнение квеста Сыча по доставке трёх Велесов учёным).

Поясню, зачем вообще весь этот сыр-бор учинил. Т.к. шанс найти редкий артефакт - низок, а очень хочется уже сразу иметь Золотую Рыбку, ведь я любитель мародёрить всё что плохо лежит, то я предположил, что это можно будет сделать через соперников. Взял у Бороды квест на арт, и стал ждать. Предварительно я сбегал на Сгоревший хутор (вроде так локация называется), где забрал ВСС Винторез, что является тайником (он же как раз "good_gun"). В этот раз как нельзя быстро артефакт был ими найден. В таком случае, задание обновляется, и можно успеть перехватить эту группу - будет на карте указано их местоположение, и даже будет видно их передвижение. И тут уже что хочешь делай - обменяйся, убей, можно даже выкупить (ну за Светляк они просили что-то около 39000 р, офигеть).
Артефакт я у них благополучно выменял, но не стал отдавать Бороде - самому нужнее, хороший реген. Вот только забавный баг произошёл - тот самый командир соперников зачем-то пришёл на баржу и постоянно там отсиживается в разных местах на корточках. Вроде бы, если отоспаться, то задание будет провалено и сталкер исчезнет, ну да и бог с ним. 

Таким образом можно на самом старте, если бы мне повезло, получить вожделенную рыбку. Но ничто не мешает вновь и вновь брать задания и просто ждать сталкеров. Хороших пушек, правда, раз-два и обчёлся, но! Их продажа принесёт куда меньше денег/пользы, чем деньги/польза от полученного арта. 

 

 

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
12 часов назад, Space.Marine сказал:

Тыц. Там для Misery, но какая разница.
bind_anomaly_zone.script:
if math.random(1,100) > 17 then

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

Поделиться этим сообщением


Ссылка на сообщение
7 часов назад, Space.Marine сказал:

В оригинале вероятность появления новых артов в аномалиях после выброса 17%. 

 

 

Что интересно, в скинутом вами файле этого куска кода просто нет. И, если верить описанию мода, это даёт 100% вероятность спавна. 
Опять же, нихрена бы этого не понял без разъяснений - спасибо.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...