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

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


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

@Romann, вот это в кастом_дате, по-моему, лишнее:

bar_kornet_camp = true

esc_kornet_brigada = true

road_kornet_brigada = true

road_kornet_brigada_end = true

Получается, нпс записан одновременно в четыре смарта)

Да ещё и ниже по второму разу с условиями.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Я так и  не смог устранить ошибку...
 

Expression : fatal error


Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ...ives lost zone\gamedata\scripts\death_manager.script:139: attempt to index field '?' (a nil value)


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

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

--' Зависимости в спауне предметов. Предмет спауниться только если есть хотя бы один из зависимых.
local item_dependence = {}

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

--' Предметы, которые нельзя удалять (квестовые например)
local always_keep_item = {}

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

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


function init_drop_settings()
local community_list = { "stalker", "monolith", "dolg", "freedom", "bandit", "military", "zombied", "ecolog", "killer", "arena_enemy", "actor_dolg", "military_layt", "nebo", "inkvizitor", "nato" }

for k,v in pairs(community_list) do
--' Необходимо заполнить таблицу
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)
end
end
end

--' Заполняем таблицу зависимостей
local n = death_ini:line_count("item_dependence")
local id, value = "", ""
for i=0,n-1 do
result, id, value = death_ini:r_line("item_dependence",i,"","")
item_dependence[id] = {}
local vvv = parse_names(value)
for k,v in pairs(vvv) do
item_dependence[id][v] = true
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

--' Предметы, которые нельзя удалять (квестовые например)
local n = death_ini:line_count("keep_items")
for i=0,n-1 do
result, id, value = death_ini:r_line("keep_items",i,"","")
if value == "true" then
always_keep_item[id] = true
end
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



class "drop_manager"
function drop_manager:__init(npc)
self.npc = npc
self.dropped = false
end
function drop_manager:create_release_item()
--' Спрашиваем у серверного объекта генерились ли предметы
local se_obj = alife():object(self.npc:id())
if se_obj.death_droped == true then
return
end
se_obj.death_droped = true

--' Запускаем итератор на удаление предметов
self.npc:iterate_inventory(keep_item, self.npc)

--' Проверка на отсутствие спауна лута
local ini = self.npc:spawn_ini()

if ini and ini:section_exist("dont_spawn_loot") then
return
end

--' Доспавниваем необходимое количество итемов:
--' Необходимо составить список объектов которые могут быть заспавнены для персонажа
local spawn_items = item_by_community[self.npc:character_community()]
for k,v in pairs(spawn_items) do
--' По каждому объекту необходимо получить зависимости
if check_item_dependence(self.npc, k) == true then
--' По каждому объекту необходимо получить количество
local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))
--' Необходимо заспавнить нужное количество.
create_items(self.npc, k, number, v)
end
end
end

--' Функция вызывается для каждого предмета, если вернет false то предмет удалится.
function keep_item(npc, item)
if item==nil or alife():object(item:id())==nil then return end
local section = item:section()

if section == "bolt" then
return false
end

if always_keep_item[section] == true then
return true
end

local item_id = item:id()
local item_in_slot = npc:item_in_slot(1)
if item_in_slot ~= nil and
item_in_slot:id() == item_id
then
item:unload_magazine()
--' Тут надо уменьшить кондишн оружия
item:set_condition((math.random(15)+75)/100)
return true
end
item_in_slot = npc:item_in_slot(2)
if item_in_slot ~= nil and
item_in_slot:id() == item_id
then
item:unload_magazine()
--' Тут надо уменьшить кондишн оружия
item:set_condition((math.random(15)+75)/100)
return true
end
alife():release(alife():object(item:id()), true)
end
function set_weapon_drop_condition(item)
local condition = (math.random(15)+75)/100
--printf("condition [%s]", tostring(condition))
item:set_condition(condition)
end

--' Функция спавнит необходимое число предметов
function create_items(npc, section, number, rnd)
--'printf("create %s of %s", tostring(number), tostring(section))
if ammo_sections[section] == true then
if number > 0 then
se_respawn.create_ammo(section,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id(),
number)
end
else
for i=1,number do
--' Проверяем вероятность появить каждый объект в отдельности
if math.random(100) <= rnd then
alife():create(section,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id())
end
end
end
end


--' Функция проверяет есть ли хоть один из зависимых объектов у персонажа
function check_item_dependence(npc, section)
if item_dependence[section] == nil then
return true
end

local d_flag = true
for k,v in pairs(item_dependence[section]) do
local obj = npc:object(k)
if obj ~= nil and npc:marked_dropped(obj) ~= true then
return true
end
d_flag = false
end

return d_flag
end


 
С другими группировками все нормально...

Если строка 139 - вот эта:
local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))
- то очевидно не существует какой-то count_by_level[k]
добавить проверку и вывести в лог k, либо проверку непосредственно при загрузке. dc

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

@AndrewMor, у меня нпс исправно забегают в вагончик. Аи-сетка оригинальная, ничего не правил, схема поведения при выбросе, думаю, та же (blowout_sheme.script).

 

Файл с укрытиями в АМК (и в НС тоже): amk_hideouts.script

 

И, по поводу аи-сетки: нпс без разницы, на каком ноды расстоянии друг от друга, главное, чтоб между ними связь была. На ЧАЭС-2 они, бывает, даже по воздуху "летают", чтоб до следующей ноды добраться XD

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

 

 

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

Так в Солянке и у меня исправно бегут. У меня мод на базе ОГСМ ФАЕ с маппаком локаций от Кости. Так вот там - не бегут, хоть застрелись, на месте стоят. Хотя мне парни говорили, что и в ОГСМ, и в ФАЕ забегали в вагончик.


 

 

пойдет один непись в вагончик нормально или нет ?

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

 

А если родной файл level.gct прописать, вылетает с логом:

FATAL ERROR

[error]Expression : cross_table().header().game_guid() == game_graph().header().guid()
[error]Function : CAI_Space::load
[error]File : E:\stalker\sources\trunk\xr_3da\xrGame\ai_space.cpp
[error]Line : 121
[error]Description : graph doesn't correspond to the cross table

stack trace:

 

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

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

Возможно-ли как-то получить время анимации перезарядки оружия?

запускаем анимацию, засекаем время, и проверяем npc:animation_count()

dc

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

Правильно ли я понимаю, что в секции Лиса в all.spawn:

[spawner]
cond = {+escape_stalker_help}

[smart_terrains]
esc_stalker_camp = true

[known_info]
escape_stalker_give
escape_stalker_done
END
story_id = 5

 

 

1. условием спавна является выдача поршня escape_stalker_help?

2. а что после строки known_info - тоже поршни? И условие для онлайна - наличие обоих этих поршней?

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

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

1. alife():object("esc_fox") ;)

2. known_info - теоретически - выдается при разговоре/обшаривании трупа. На практике - "есть нюанс" ©

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

@AndrewMor, сверху указано где посмотреть для условий выхода в онлайн/оффлайн Проводника и Лиса:

    if type == "esc_stalker_camp" then
        return function(gulag)
            if has_alife_info("yan_provodnik_spawn") then
                return 1
            else
                return 0
            end
        end
    end

@Wolkodav, статистика, все квесты желательно прогонять через task_manager. Ну или если хочется поизвращатся можно и вручную писать.

 

Признайся как называется метод телепортации в ТЧ и как его прикрутить в логику, я нашел только телепортацию для ГГ по координатам. И есть ли необходимость присваивать SID???

 

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

 

 

 

выдается при разговоре

 

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

Изменено пользователем Struck
  • Не нравится 1
Ссылка на комментарий

@AndrewMor, ты посмотреть не можешь что-ли? Скрипта нет? Да, не могут они вместе в онлайне быть, и в оффлайне тоже.

 

@losiara, есть много модулей для работы с нет-пакетами. У разрабов подобного нет. Советую брать m_netpk от Artos'a.

 

@AndrewMor, ты издеваешься?

 

 

    if type == "esc_stalker_camp" then
        t = { section = "logic@esc_stalker_camp_provodnik",
            idle = 0,
            prior = 10, state = {0},
            online = false,
            in_rest = "", out_rest = "",
            predicate = function(obj_info)
                            return obj_info.profile_name == "esc_provodnik"
                        end
        }
        table.insert(sj, t)
        t = { section = "logic@esc_stalker_fox",
            idle = 0,
            prior = 10, state = {0},
            in_rest = "", out_rest = "",
            predicate = function(obj_info)
                            return obj_info.profile_name == "esc_fox"
                        end
        }
        table.insert(sj, t)

        t = { section = "logic@esc_stalker_camp_provodnik",
            idle = 0,
            prior = 10, state = {1},
            in_rest = "", out_rest = "",
            predicate = function(obj_info)
                            return obj_info.profile_name == "esc_provodnik"
                        end
        }
        table.insert(sj, t)
        t = { section = "logic@esc_stalker_camp1",
            idle = 0,
            prior = 8, state = {1},
            online = false,
            in_rest = "", out_rest = "",
            predicate = function(obj_info)
                            return obj_info.profile_name == "esc_fox"
                        end
        }
        table.insert(sj, t)
    end

 

Изменено пользователем Struck
  • Не нравится 1
Ссылка на комментарий

Уважаемые аксакалы и всезнающие помогите разобраться, возможно не туда пишу. Но честное слово не знаю куда, и поиском не смог найти ответ, возможно не сообразил как сформулировать вопрос. Собственно сам вопрос 44662649da0850ea7182bd0f2aaf483325d53619 как сместить позицию строчки координат на экране вниз? Монитор 1920х1080.

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

Кто-нибудь знает, из-за чего эта байда:

Открытие потока...
* phase time: 4 ms
* phase cmem: 214575 K
Загрузка формы объектов...
* phase time: 233 ms
* phase cmem: 224784 K
Загрузка шейдеров...
stack trace:

0023:0049FF36 XR_3DA.exe, CEffect_Rain::Render()
0023:00493DD0 XR_3DA.exe, CKinematicsAnimated::BoneChain_Calculate()

Происходит после добавления новой локации в игру. Спавн ГГ на ней же. Может ли быть подобное как-то связано с не добавленной частью статичной модели к сектору, в котором та находится?

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

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

 

Помню, где-то попадалось что-то на тему: move_offline, но не могу найти.

Очередной заумный вопрос :D

 

Флаг no_move_in_offline выключи, и будет тебе счастье.

Изменено пользователем Struck
Ссылка на комментарий
Флаг no_move_in_offline выключи, и будет тебе счастье

Данный флаг - это из SDK?

А если непись спавнится скриптом, то надо править object_flags с помощью нет-пакета ?

Попробовал так:

local ser_obj = alife():create("gar_stalker_breakthrough", vector():set(-41.7293,2.1,8.4143), 146514, 295)
  if ser_obj then
   local pk = m_netpk.get(ser_obj)
   if pk and pk:isOk() then
    local data = pk:get()
    if data then
     data.object_flags = bit_not(64)
     pk:set(data)
    end
   end
end

64 - это

flOfflineNoMove  0000001000000  64 - по идее должен отвечать за отсутствие движения в оффлайне, но не используется

 

Вот только не помогло - неписи все одно, пока в офф-лайне, не идут куда им прописано.

 

 

 

то артефакт попросту не ставится в слот

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

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

 

 

Возможно ли реализовать "активацию артефактов" только после выдачи ИНФОпорции?

Можно попробовать использовать метод объекта set_nonscript_usable(bool), который устанавливает для объекта возможность взаимодействия с актором.

Например, при помещении объекта в инвентарь запрещать, а одновременно с выдачей инфопоршня - разрешать. Должно получиться.

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

Вот только не помогло - неписи все одно, пока в офф-лайне, не идут куда им прописано.

"Куда им прописано" указано в логике, а логика действует только в онлайне. Если ты не хочешь видеть, как они идут, заспавнь их сразу в точке назначения.
  • Согласен 1
Ссылка на комментарий

 

 

"Куда им прописано" указано в логике, а логика действует только в онлайне

это не верное утверждение...

 

Проблема в том, чтоб разрешить неписям движение в офф-лайне.


 

 

Можно попробовать использовать метод объекта set_nonscript_usable(bool),

Заинтересовало, решил проверить. В actor_binder:on_item_take добавил:

if obj:section() == "af_vyvert" then
   obj:set_nonscript_usable(false) -- пробовал и false и true
end

результат отрицательный - после взятия в инвентарь, арт спокойно вешается на пояс и дает прописанные ему эффекты.

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

@AndreySol

Можно попробовать по другому. В actor_binder:on_use для данного объекта проверить инфопорщень. Если нет, то объет удалить и сразу заспавнить его обратно в инвентарь. Может так получиться.

По поводу set_nonscript_usable(bool) - странно.

Ссылка на комментарий
это не верное утверждение...

Да ладно? Поверь, ты их спавнишь, но на деле их нету. Они в оффлайне, т.е. теоретически говоря если ты туда переместишься в оффлайне, то там будет пусто и две твоих метки ;)

 

По поводу set_nonscript_usable(bool) - странно.

Что тут странного? Смотрите тайники...

 

Если нет, то объет удалить и сразу заспавнить его обратно в инвентарь. Может так получиться.

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

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

bbb86147ba622ff1cb38dec1dec3b31ebcfe7e19

На АЭС2  есть вот такое место,мне нужно заспавнить нпс и мобов, они спанятся. но бегут к эстакаде. Что им мешает остаться на своем месте, может кто знает, что там мешает,?

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

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

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

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

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

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

Войти

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

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

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