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

[SoC] Ковыряемся в файлах

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

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

 

function delete_conserva()
local se_obj = alife():object("conserva")
if se_obj then
    alife():release(se_obj, true)
end
alife():create("bad_conserva", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

function delete_bread()
local se_obj = alife():object("bread")
if se_obj then
    alife():release(se_obj, true)
end
alife():create("bad_bread", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

function delete_mre()
local se_obj = alife():object("mre")
if se_obj then
    alife():release(se_obj, true)
end
alife():create("bad_mre", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

function delete_oreshki()
local se_obj = alife():object("oreshki")
if se_obj then
    alife():release(se_obj, true)
end
alife():create("bad_oreshki", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

function delete_olives()
local se_obj = alife():object("olives")
if se_obj then
    alife():release(se_obj, true)
end
end

function delete_kolbasa()
local se_obj = alife():object("kolbasa")
if se_obj then
    alife():release(se_obj, true)
end
alife():create("bad_kolbasa", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

function delete_syrok()
local se_obj = alife():object("syrok")
if se_obj then
    alife():release(se_obj, true)
end
alife():create("bad_syrok", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end


function bad_food()
if db.actor.radiation > 0.2 then
HUM.delete_syrok()
HUM.delete_bread()
hum.delete_kolbasa()
end
if db.actor.radiation > 0.6 then 
HUM.delete_conserva()
HUM.delete_olives()
HUM.delete_oreshki()
end
if db.actor.radiation > 0.9 then
HUM.delete_mre()
end
end

 

Кто нибудь подскажите, что блин не так с этими функциями? Из-за них происходит вылет на каком то моменте игры.

Функции delete_вещь предназначены для удаления нормальной еды и добавления испорченной. 

И, это, может кто знает функцию на убирание (отключение)/ доставание оружия?

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

• Для удаления требуется не секция предмета, а его имя, то есть "секция + id" (номер спавна), например "medkit12531". Можно просто id.

• Удалять можно и даже нужно одной функцией, в которой имя или id будут аргументом. Обязательно надо убедиться, что этот же объект не удаляется какой-то другой штатной или новой функцией – причина вылетов может быть именно в этом.

• Спавнить тоже можно через одну функцию с аргументом в виде секции (про нули вместо координат уже писал – будь ленивым).

• Можно совместить переспавн в одну функцию: проверить секцию, получить id объекта, добавить "_bad", отспавнить новый объект, удалить старый. Примерно так:

Spoiler
(перебор инвентаря или какой-то еще способ получить ссылку на объект)
if obj then
	local sect = obj:section()

	if sect == "medkit" then
		local id = obj:id()
		alife():create(sect .. "_army", vector(), 0, 0, 0)
		alife():release( alife():object(id) )
	end
end

 

 

Оружие: db.actor:hide_weapon() и restore_weapon(). Ориентир для поиска: [xr_effects.script], самое начало. Там же отключение интерфейса и управления.

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

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

Шпаргалка

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

Вопрос по OGSR. Коллбэк level_changer_action обрабатывается, когда ГГ в зоне ЛЧ, если правильно понимаю. Есть вариант "задержки" вывода окна с выбором перехода на другую локацию? Возможно ли организовать это скриптово, использовав, например:

Скрытый текст
level.add_call(
  function()
    log3( "condition" )
    return true
  end,
  function() log3( "action" ) end
):set_pause( 3000 )

зы Нужно для автосейвов. Что бы создать адекватную паузу, прежде, чем игрок нажмёт "Да/Нет" в окне выбора.

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

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

Ссылка на комментарий
1 hour ago, mole venomous said:

Коллбэк level_changer_action обрабатывается, когда ГГ в зоне ЛЧ, если правильно понимаю.

Да. И каждые пять секунд, когда он остается в внутри ЛЧ, насколько я вижу.

 

1 hour ago, mole venomous said:

Есть вариант "задержки" вывода окна с выбором перехода на другую локацию?

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

 

1 hour ago, mole venomous said:

Возможно ли организовать это скриптово, использовав, например:

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

 

1 hour ago, mole venomous said:

Нужно для автосейвов.

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

  • Спасибо 1
Ссылка на комментарий
27 минут назад, dsh сказал:

Как это связано с автосейвами?

Я сделал сейвы типа "Покидаю уровень ...level_name", однако предположил, что сейв - нажатие кнопки "Да" - загрузка и всё это за короткое время - не есть хорошо для сейва.

 

В любом случае, игра встаёт на паузу, можно просто выждать пару секунд и соглашаться на переход.

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

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

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

xr_gulag.script:

 

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

level_groups = {l01_escape = 1, l02_garbage = 2, l03_agroprom = 3, l03u_agr_underground = 4,
                l04_darkvalley = 5, l04u_labx18 = 6, l05_bar = 7, l06_rostok = 8,
                l07_military = 9, l08_yantar = 10, l08u_brainlab = 11, l10_radar = 12,
                l10u_bunker = 13, l11_pripyat = 14, l12_stancia = 15, l12u_sarcofag = 16, 
                l12u_control_monolith = 17, l12_stancia_2 = 18}


Кто знает, за что это отвечает?

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

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

"Чтобы не ходили через Бар"

https://www.amk-team.ru/forum/topic/13078-prozektorskaya/?do=findComment&comment=1234785

В самом общем случае.

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

Накидал такое, в оригинале в принципе так же было:
 

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

function go_arena(npc, actor)  
    local point = patrol("zavros_gg_arena_walk")
    local look = patrol("zavros_gg_arena_look")
    
    db.actor:set_actor_position(point:point(0))
    local dir = look:point(0):sub(point:point(0))
    db.actor:set_actor_direction(-dir:getH())

    inv_box_2 = level_object_by_sid (5629)

    out_object = actor
    in_object  = inv_box_2
        actor:inventory_for_each(transfer_object_item)     
        
    local spawn_items = {}    

    if    has_alife_info("bar_flash_start") then
        table.insert(spawn_items, "novice_outfit")
        table.insert(spawn_items, "wpn_bm16")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "wpn_pm")
        table.insert(spawn_items, "ammo_9x18_pmm")
        table.insert(spawn_items, "ammo_9x18_pmm")
        table.insert(spawn_items, "ammo_9x18_pmm")
        table.insert(spawn_items, "wpn_knife")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        db.actor:activate_slot(2)
    elseif    has_alife_info("bar_boar_start") then
        table.insert(spawn_items, "novice_outfit")
        table.insert(spawn_items, "wpn_toz34")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "wpn_fort")
        table.insert(spawn_items, "ammo_9x18_pmm")
        table.insert(spawn_items, "ammo_9x18_pmm")
        table.insert(spawn_items, "ammo_9x18_pmm")
        table.insert(spawn_items, "wpn_knife")        
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        db.actor:activate_slot(2)
    elseif    has_alife_info("bar_zombied_start") then
        table.insert(spawn_items, "bandit_outfit")
        table.insert(spawn_items, "wpn_wincheaster1300")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "wpn_beretta")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "wpn_knife")        
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        db.actor:activate_slot(2)
    elseif    has_alife_info("bar_psy_start") then    
        table.insert(spawn_items, "stalker_outfit")    
        table.insert(spawn_items, "wpn_ak74u")
        table.insert(spawn_items, "ammo_5.45x39_ap")
        table.insert(spawn_items, "ammo_5.45x39_ap")
        table.insert(spawn_items, "ammo_5.45x39_ap")
        table.insert(spawn_items, "wpn_knife")
        table.insert(spawn_items, "wpn_glock")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        db.actor:activate_slot(2)
    elseif    has_alife_info("bar_snork_start") then    
        table.insert(spawn_items, "stalker_outfit")    
        table.insert(spawn_items, "wpn_spas12")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "ammo_12x70_buck")
        table.insert(spawn_items, "wpn_knife")
        table.insert(spawn_items, "wpn_grach")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "ammo_9x19_pbp")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        db.actor:activate_slot(2)
    elseif    has_alife_info("bar_krovo_start") then
        table.insert(spawn_items, "specors_outfit")    
        table.insert(spawn_items, "wpn_ak74")
        table.insert(spawn_items, "ammo_5.45x39_ap")
        table.insert(spawn_items, "ammo_5.45x39_ap")
        table.insert(spawn_items, "ammo_5.45x39_ap")
        table.insert(spawn_items, "wpn_knife")
        table.insert(spawn_items, "wpn_fiveseven")
        table.insert(spawn_items, "ammo_5.7x28")
        table.insert(spawn_items, "ammo_5.7x28")
        table.insert(spawn_items, "ammo_5.7x28")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        db.actor:activate_slot(2)
    elseif    has_alife_info("bar_psevd_start") then
        table.insert(spawn_items, "specors_outfit")    
        table.insert(spawn_items, "wpn_groza")
        table.insert(spawn_items, "ammo_9x39_pab9")
        table.insert(spawn_items, "ammo_9x39_pab9")
        table.insert(spawn_items, "ammo_9x39_pab9")
        table.insert(spawn_items, "ammo_9x39_pab9")
        table.insert(spawn_items, "ammo_9x39_pab9")
        table.insert(spawn_items, "wpn_knife")
        table.insert(spawn_items, "wpn_colt1911")
        table.insert(spawn_items, "ammo_11.43x23_hydro")
        table.insert(spawn_items, "ammo_11.43x23_hydro")
        table.insert(spawn_items, "ammo_11.43x23_hydro")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "medkit")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        table.insert(spawn_items, "bandage")
        db.actor:activate_slot(2)
    end
    
    local k,v = 0,0
    
    for k,v in pairs(spawn_items) do
        alife():create(v,    
                        db.actor:position(),
                        db.actor:level_vertex_id(),    
                        db.actor:game_vertex_id(), 
                        db.actor:id())
    end    
    
end

Что должно быть?
ГГ перемещается, его вещи переносятся в ящик, у него в инвентаре появляется лут.

Что имеем?
ГГ перемещается, его вещи НЕ переносятся в ящик, у него в инвентаре появляется лут, но постоянно один и тот же (самый первый из списка)

Вопрос - как править?

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

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

Ссылка на комментарий
1 hour ago, dsh said:

Есть возможность получить доступ к этому окну до того, как оно будет показано и что-то с ним сделать. Я, к примеру, меняю текст этого окна

Возможно ли такое повторить на чистом движке и как именно?

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

Шпаргалка

Ссылка на комментарий
4 hours ago, mole venomous said:

не есть хорошо для сейва.

Почему?

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

 

Потом, есть же возможность вертексы помечать и указывать, кому по каким вертексам нельзя ходить. Это что бы кто-нибудь не материализовался в бункере у Сахарова.

 

А группы - это по большей части костыль. Вот вспомним X-18, к примеру. Там псевдогигант есть и гулаг для него, насколько я помню. Так вот, без выноса X-18 в отдельную группу, туда будут приходить новые псевдогиганты, по мере убывания предыдущих. Вот и сделали отдельную группу, что бы никто в X-18 прийти не мог. Но это костыль. А не костыль, это поместить там псевдогиганта с персональной логикой, без всякого смарта. Нет смарта - никто никуда не пойдет - нет проблем.

 

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

3 hours ago, Norman Eisenherz said:

Возможно ли такое повторить на чистом движке и как именно?

Рассказываю один раз. Можно даже в какой-нибудь FAQ добавить. Берешь исходники оригинального движка. Поверх копируешь исходники OGSR, соглашаясь на замену. Собираешь. Вуаля. Не благодари.

  • Полезно 3
Ссылка на комментарий

Ребят знает кто, как самому добавить "безопасные зоны" в которых никогда не заспавнятся динамические аномалии как в амк?

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

Пытаюсь сделать ограничение на удаление каких-либо секций на арене.
 

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

local obj = {
    ["stalker"]     = true,  
    ["destroyable_object"]    = true,
    ["object"]    = true,
}
 

function purge_arena_items(name)
    local arena_zone = arena_zones[name]
    if (obj:section()~="stalker" or obj:section()~="object" or obj:section()~="destroyable_object") and arena_zone then
        arena_zone:purge_items()
    end
end


Вылетает:
 

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

[error]Expression    : FATAL ERROR
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : D:\a\OGSR-Engine\OGSR-Engine\ogsr_engine\COMMON_AI\script_engine.cpp
[error]Line          : 46
[error]Description   : [CScriptEngine::lua_pcall_failed]: .... shadow of chernobymod\gamedata\scripts\xr_zones.script:103: attempt to call method 'section' (a nil value)


В таком случае - как написать правильно функцию?

 

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

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

function purge_arena_items(name)
    local arena_zone = arena_zones[name]
    if (obj:section()~="stalker" or obj:section()~="object" or obj:section()~="destroyable_object") and arena_zone then
        arena_zone:purge_items()
    end
end

if obj[name] ~= true and arena_zone then

  • Спасибо 1
Ссылка на комментарий
14 hours ago, dsh said:

Рассказываю один раз

Ответ уровня "как получить экзо в начале игры: добежать до Припяти".

 

@imcrazyhoudini

1. Что есть obj в purge_arena_items()? Если это таблица, которая указана чуть выше, то для таблиц метода section() нет. Схема проверки для одного объекта: if not таблица[ объект:section() ]. И еще: судя по названиям, это не секции, а классы объектов – см. сверку clsid в [_g.script].

2. Даже при правильно описанной проверке обработчик [xr_zones.script] arena_zone:purge_items() пройдется по внутренней таблице self.saved_obj и удалит все объекты – проверку надо добавлять именно в этот обработчик, сразу после if obj ~= nil then.

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

Шпаргалка

Ссылка на комментарий
27 минут назад, Norman Eisenherz сказал:

2. Даже при правильно описанной проверке обработчик [xr_zones.script] arena_zone:purge_items() пройдется по внутренней таблице self.saved_obj и удалит все объекты – проверку надо добавлять именно в этот обработчик, сразу после if obj ~= nil then.

Тут?
 

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

local arena_zones = {}
class "arena_zone_binder" (object_binder)
function arena_zone_binder:__init(obj) super(obj)
    self.saved_obj = {"stalker","destroyable_object","object"}
    arena_zones[obj:name()] = self
end


Если да, то не помогло, но, возможно я не правильно вписал.

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

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

Внимательнее, пожалуйста:

function arena_zone_binder:purge_items()
	local alife = alife()
	for k,v in pairs(self.saved_obj) do
		local obj = alife:object(k)
		if obj ~= nil then
			-- тут

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

Шпаргалка

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

@Norman Eisenherz надеюсь я не натупил и правильно понял, но всё же:
 

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

function arena_zone_binder:purge_items()
    local alife = alife()
    for k,v in pairs(self.saved_obj) do
        local obj = alife:object(k)
        if obj ~= nil then
            self.saved_obj = {"destroyable_object","stalker","object"}
            printf("release object %s, id %s", obj:name(), k)
            alife:release(obj, true)
        end
    end    
end


Такую конструкцию ты имел ввиду?

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

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

народ, вопрос на засыпку

заспавнил раненого сталкера и монтсра через СДК

прописал монстру такую логику

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

[logic]
active = mob_home

 

[mob_home]
path_home = agr_fracture_home
combat_ignore_cond = {=check_fighting(355)}

НПС имеет стори-ид 355, и по идее, строка в логике монстра (combat_ignore_cond = {=check_fighting(355)}) должна заставлять монстра игнорировать НПС, но он всё равно его добивает.

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

Лучше сделать мод с 0, чем пытаться залатать багованный.

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

@DarkSnowder такие оверрайды для монстров не поддерживаются.
friendly = true (до первого хита)
braindead = true (полный игнор)

Тут уж 100% варик переводить мутанта в другую группировку, arena_monstr вроде игнорит НПС.

Изменено пользователем imcrazyhoudini
  • Полезно 1

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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