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

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

19 минут назад, Zander_driver сказал:

Посредством скриптов добавляются

А как же команда AMK это организовала? Поправь меня, если я ошибся.

Здесь могла быть ваша реклама.

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

Именно так и организовала, добавляя скриптами через нетпакет, зоны в in/out_restrictions. Как я выше и написал. Не было тогда другого метода. Без правок движка, другого и нету.

Ну и, в 2008 году скажем, в амк не было настоящих динамических аномалий. Были "псевдо-динамические", о которых все не-разбирающиеся глубоко в механике, думали что они динамические. Суть была в том что на локации были заспавнено аномалий в несколько раз больше, чем их видно. И бОльшая часть из них была просто в неактивном состоянии, выключена. А при выбросах они включались/выключались. Но т.к. аномалии эти были на самом деле статическими, нпс их естественно обходили.

Позже емнип добавили настоящую динамику, ну и механизм обхода выше описанный. Но это уже не скажу в каком году, не следил.

  • Полезно 3

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

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

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

Ссылка на комментарий
23 минуты назад, Zander_driver сказал:

амк не было настоящих динамических аномалий

Я тебя понял

  • Нравится 1

Здесь могла быть ваша реклама.

Ссылка на комментарий
9 часов назад, Zander_driver сказал:

Были "псевдо-динамические", о которых все не-разбирающиеся глубоко в механике, думали что они динамические.

Надо же, впервые узнал. Раньше тоже считал, что динамические. А кстати, в НС-2010 уже динамические были?

Изменено пользователем AndrewMor

Сталкер - наше всё!

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

Я не копался в НС-2010, не знаю. О том что они в амк не сразу были полностью динамическими, я знаю из того факта что они были на переключаемой статике в моде "Жесть" образца 2008 - 2011 годов. А он в свою очередь был на основе как раз амк, и аномалии перенял оттуда. Но то была не последняя версия амк, из вышедших в готовом виде.

  • Спасибо 1

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

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

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

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

@Kirgudu Движок пересобирать – уровень для меня недостижимый. Создать рестриктор на месте ГГ и каким-то образом его двигать (или переспавнивать с интервалом в пару секунд) – еще можно попробовать.

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

Шпаргалка

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

В Новом Арсенале-6 есть авторазряжание дропнутого оружия. Я так понимаю, это делается средствами движка? Пробовал у себя подобное сделать скриптом, в результате на обновлении вообще всё, что у актора, разряжается...

Здесь могла быть ваша реклама.

Ссылка на комментарий
2 минуты назад, mole venomous сказал:

Я так понимаю, это делается средствами движка?

Нет, метод unload_magazine присутствует в ТЧ с исходно-бородатых времен.

3 минуты назад, mole venomous сказал:

всё, что у актора, разряжается...

Ну ведь разряжается? :rolleyes: Значит, метод работает. А уж к чему вы его применяете, :crazy2: это другой вопрос.

 

2 часа назад, Norman Eisenherz сказал:

переспавнивать с интервалом в пару секунд

Рестриктор, находящийся в памяти нпс... ну да...

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

Чтобы удалить его из чьей-то памяти, то без правок движка - надо этого кого-то уводить в оффлайн и ковырять его нетпакет.

Это у вас все неписи на локе будут каждые пару сек в онлайн-оффлайн прыгать :crazy2: каких-только костылей не выдумают...

  • Нравится 1
  • Смешно 1

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

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

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

Ссылка на комментарий
Только что, Norman Eisenherz сказал:

кроме переноса функций движка из ЗП

Есть. С нуля писать свое.

Вообще-то как бы, если ковырнуть, что такое по сути рестриктор, и что ему надо для проверок коллизии с предполагаемыми путями нпс. Это ровно два метода, Center() и Radius(). А они есть у всех вообще объектов в игре... в движке.

  • Сочувствую 1

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

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

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

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

Здрасьте.

 

[ЧН 1.5.10] Отсортировал список переходов в диалоге проводников по сюжетному порядку обхода локаций: у одних проводников список выводится в прямом порядке (Болота, Кордон, …), у других – в обратном (Военные склады, Рыжий лес, …). Чем можно объяснить такую разницу?

 

Spoiler

[scripts\guiders.script]
(–)
-- point_name
	for k,v in pairs(guiders_table.teleport_points) do
        phrase = dialog:AddPhrase("NO TEXT", k, "2", -10000)
        script = phrase:GetPhraseScript()
        script:AddPrecondition("guiders.precondition_teleport_to_point_available")
        script:SetScriptText("guiders.set_phrase_text")
        script:AddAction("guiders.select_point")
-- ready?
        phrase = dialog:AddPhrase("st_tm_guide_21", "21", k, -10000)
	end

(+)
-- point_name
	local names = {}
	local gtp = guiders_table.teleport_points
	local levels = { "marsh", "escape", "garbage", "darkvalley", "agroprom", "yantar", "red_forest", "military" }

	for i = 1, #levels do
		for name, v in pairs(gtp) do
			if v.level == levels[i] then
				names[#names +1] = name
			end
		end
	end

	for k, name in ipairs(names) do
        phrase = dialog:AddPhrase("NO TEXT", name, "2", -10000)
        script = phrase:GetPhraseScript()
        script:AddPrecondition("guiders.precondition_teleport_to_point_available")
        script:SetScriptText("guiders.set_phrase_text")
        script:AddAction("guiders.select_point")
-- ready?
        phrase = dialog:AddPhrase("st_tm_guide_21", "21", name, -10000)
	end

 

 

Изменено пользователем Norman Eisenherz
  • Сочувствую 1

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

Шпаргалка

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

Ребята, как сделать так, чтобы доступ к тайнику был только при наличии предмета в инвентаре? (Лопата нужна, а тайник планирую квестовый в могилке) 

Оц тоц перевертоц, бабушка здорова,
Оц тоц перевертоц кушает компот.
Оц тоц перевертоц и мечтает снова
Оц тоц перевертоц пережить налет!

Ссылка на комментарий
20.04.2020 в 12:00, naxac сказал:

@UriZzz, это в нет-пакете, поле object_flags.

  Например (Скрыть)

local obj = alife():create(...)

local data = netpk:get(obj)

data.object_flags = bit_and(data.object_flags, bit_not(128))

netpk:set(obj, data)

Блин, не как не соображу - как это оформить?

Вот так я сделал:

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

--' Ключем является группировка персонажа. Значением является таблица, содержашая имена секций предметов.
local item_by_community = {}

--' Множители и минимаксы для выпадения вещей в зависимости от уровня
local mul_by_level = {}
local count_by_level = {}

--' Предметы, относящиеся к патронам. Их надо спаунить другим методом.
local ammo_sections = {}

local death_ini = ini_file("misc\\ph_box_generic.ltx")

class "ph_item_box"

function ph_item_box:__init(obj)
    self.obj = obj
    

    local community_list = { "def_box", "small_box_generic", "small_box_ussr", "small_box_nato", "small_box_army", "small_box_science", "big_box_generic", "big_box_dungeons", "big_box_arsenal"}    
    
    for k,v in pairs(community_list) do
        --' Необходимо заполнить таблицу
        -- printf("pl: community = %s",v )
        item_by_community[v] = {}
        if death_ini:section_exist(v) then
            local n = death_ini:line_count(v)
            local id, value = "", ""
            for i=0,n-1 do
                result, id, value    = death_ini:r_line(v,i,"","")
                item_by_community[v][id] = 100*tonumber(value)
                -- printf("PL : id=%s  value=%s",id, value)
            end
        end
    end
 
    --' Множители и минимаксы для выпадения вещей в зависимости от уровня
    local level_name = level.name()
    
    if not death_ini:section_exist(level_name) then
        level_name = "default"
    end

    local n = death_ini:line_count(level_name)
    local id, value = "", ""
    for i=0,n-1 do
        result, id, value    = death_ini:r_line(level_name,i,"","")
        mul_by_level[id] = tonumber(value)
    end        

    local item_count_section = "item_count_" .. level.get_game_difficulty()
    local n = death_ini:line_count(item_count_section)
    for i=0,n-1 do
        result, id, value    = death_ini:r_line(item_count_section,i,"","")
        --' Нужно распарсить value в два значения
        local t = parse_nums(value)
        if t[1] == nil then
            abort("Error on [death_ini] declaration. Section [%s], line [%s]", item_count_section, tostring(id))
        end
        local min = t[1]
        local max = t[2]
        if max == nil then
            max = min
        end
        
        if mul_by_level[id] == nil then
            mul_by_level[id] = 0
        end

        min = tonumber(min) * mul_by_level[id]
        max = tonumber(max) * mul_by_level[id]

        count_by_level[id] = {min = min, max = max}
    end        
    --' Предметы, относящиеся к патронам. Их надо спаунить другим методом.
   ammo_sections = {}
    local n = death_ini:line_count("ammo_sections")
    local id, value = "", ""
    for i=0,n-1 do
        result, id, value    = death_ini:r_line("ammo_sections",i,"","")
        ammo_sections[id] = true
    end        
            
    
    
end

function ph_item_box:spawn_items()
    local spawn_items = {}
    local ini = self.obj:spawn_ini()
    local community    = utils.cfg_get_string(ini, "drop_box", "community", self.obj, false, "", "def_box")
    if r_items(ini, "drop_box", "items") ~= nil then
        local items = r_items(ini, "drop_box", "items")
        for k,v in pairs(items) do
            create_obligatory_items(self.obj, v.section, v.count)
        end
        return
    end
            
        printf(" community = %s", community)
    --' Доспавниваем необходимое количество итемов:
    --' Необходимо составить список объектов которые могут быть заспавнены для персонажа
    local spawn_items = item_by_community[community]
    --' Если комьюнити задана не верно, то ставим дефолт и срем в лог.
    if spawn_items == nil then 
        printf("xr_box: wrong community -- %s setting default def_box ", community)
        local spawn_items = {}
        local spawn_items = item_by_community["def_box"]
    end
    
    for k,v in pairs(spawn_items) do        
        --' По каждому объекту необходимо получить количество
        local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))
        --' Необходимо заспавнить нужное количество.
         create_items(self.obj, k, number, v)            
    end
end    

--' Функция спавнит необходимое число предметов
function create_items(obj, section, number, rnd)
    printf("create %s of %s", tostring(number), tostring(section))
    if ammo_sections[section] == true then
        if math.random(100) <= rnd    then
                
            if number > 0 then
                local position = vector():set(0,0,0)
                position.x = obj:position().x + math.random(-30,30)/100
                position.z = obj:position().z + math.random(-30,30)/100
                position.y = obj:position().y + math.random(30,50)/100

                se_respawn.create_ammo(section,    
                        position,
                        obj:level_vertex_id(),    
                        obj:game_vertex_id(),
                        65535,
                        number)
            end
        end
    else
        for i=1,number do
            --' Проверяем вероятность появить каждый объект в отдельности
            if math.random(100) <=  rnd then
                local position = vector():set(0,0,0)
                position.x = obj:position().x + math.random(-30,30)/100
                position.z = obj:position().z + math.random(-30,30)/100
                position.y = obj:position().y + math.random(30,50)/100

                local obj = alife():create(section,    
                        position,
                        obj:level_vertex_id(),    
                        obj:game_vertex_id())
                local pk = m_netpk.net_cse_alife_dynamic_object(obj)
                local data = pk:get(obj)
                data.object_flags = bit_and(data.object_flags, bit_not(128))
                pk:set(obj, data)
            end
        end
    end    
end

function parse_names( s )
    local t = {}
    for name in string.gfind( s, "([%w_%-.\\]+)%p*" ) do
        table.insert( t, name )
    end
    return t
end

function r_items( spawn_ini, section, line)
    if spawn_ini:line_exist( section, line ) then
        --' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini
        local t = parse_names( spawn_ini:r_string( section, line ) )
        local n = table.getn( t )
        
        local ret_table = {}
        local k = 1
        while k <= n do
            local item = {}
            item.section = t[k]
            -- Проверяем что это не последняя запись
            if t[k+1] ~= nil then
                local p = tonumber(t[k+1])
                -- проверяем что вторым числом задана вероятность, а не другая секция спавну
                if p then
                    -- забиваем число
                    item.count = p
                    k = k + 2
                else
                    -- забиваем дефолт 1
                    item.count = 1
                    k = k + 1
                end
            else
                item.count     = 1
                k = k + 1
            end
            table.insert(ret_table, item)    
        end
        return ret_table
    end
    return nil
end

function create_obligatory_items(obj, item , count)
    for i = 1,count do
                local position = vector():set(0,0,0)
                position.x = obj:position().x + math.random(-30,30)/100
                position.z = obj:position().z + math.random(-30,30)/100
                position.y = obj:position().y + math.random(30,50)/100

                local obj = alife():create(item,    
                        position,
                        obj:level_vertex_id(),    
                        obj:game_vertex_id())
                local pk = m_netpk.net_cse_alife_dynamic_object(obj)
                local data = pk:get(obj)
                data.object_flags = bit_and(data.object_flags, bit_not(128))
                pk:set(obj, data)
            end
end

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

упд. Мне кажется я не правильно с пакетами работаю.

упд2. Кажется я уловил структуру нэт пакета, но итемы, при разбитии ящика, всё равно не спавнятся:(

Изменено пользователем UriZzz

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

А можно как-то скриптом задать логику для двери или задействовать файл логики. Не хочется мне алл.спавн ковырять. Я все практически скриптами сделал. Остались двери на локации Центр Управления Монолитом. Может есть способ скриптом назначить им другую логику, а то у этих дверей в алл.спавне логика.

name = mon_door_from_monolith_control_0000

Ссылка на комментарий
1 час назад, Stalkersof сказал:

Может есть способ скриптом назначить им другую логику

Назначение логики записано в кастом-дате. А ее можно изменять через нетпакет, или движковыми методами если движок модифицирован.

Через нетпакет == скриптами. Что и требовалось.

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

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

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

Ссылка на комментарий
@Шипэтяgamedata/config/weathers/env_ambient.ltx:mda:
Изменено пользователем UriZzz
  • Спасибо 1

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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