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

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


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

Призрак

Можно ли узнать попал ли актор в какой нибудь спейс?

А в чём проблема? Пишем:

local actor_v_zone = npc_in_zone(db.actor, zone)

где zone - это restrictor, который надо проверить.

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

_Призрак_

У разных категорий зон во первых отличаются названия:

вот например список зон из стораджа одного NPC

bar_arena_restrictor,bar_dolg_bunker_restrictor,camp_fire_0000,camp_fire_0001,ca
mp_fire_0002,camp_fire_0003,camp_fire_0004,camp_fire_0005,mil_camp_fire_res_0002

Как видишь тут не так уж сложно отделить парсингом строки рестрикторы от аномалий.

Во вторых, никто не отменял возможность применить к юзердате зоны метод section() (или section_name()) и узнать что это - smart_terrain, space_restrictor или zone_xxx (аномалия).

----------------------------------------------

Полтергейст

Не npc_in_zone(db.actor, zone), а

utils.npc_in_zone(db.actor, db.zone_by_name[sZoneName])

Изменено пользователем Garry_Galler
Не npc_in_zone(db.actor, zone), а

utils.npc_in_zone(db.actor, db.zone_by_name[sZoneName])

Это одно и то же. При вызове npc_in_zone(db.actor, zone) zone - клиентский объект restrictor'а, а не его имя. При таком обращении

db.zone_by_name[sZoneName]

мы как раз получим этот объект из таблицы.

Если "слепить", то получится так:

local zone = db.zone_by_name[sZoneName]
local actor_v_zone = npc_in_zone(db.actor, zone)

А если нам нужно имя restrictor'а, в котором находится actor, то

local inside_zones = {}
for name, zone in pairs(db.zone_by_name) do
  if npc_in_zone(db.actor, zone) == true then
    inside_zones[name] = true
  else
    inside_zones[name] = false
end

Полтергейст

Мое уточнение было сугубо практическим: если нужно узнать находится ли ГГ в определенном рестрикторе, то обратиться к его имени (которое имеется в allspawn), куда проще, чем получить его объект.(разработчики сталкера, - если глянуть скрипты, - делали именно так). При переборе таблицы db.zone_by_name уже не имеет значения данный нюанс, так как по любому в переменных-итераторах key, value будут и имя и юзердата зоны.

ЗЫ:npc_in_zone() это же не глобальная функция из _g.script , а ты уже вторично забываешь указать модуля, в котором она находится.

Это тоже было причиной моего уточнения.

--------------------------------

Кстати забыл добавить: смарт терейны находятся в табличке db.smart_terrain_by_id - отдельно от рестрикторов.

Изменено пользователем Garry_Galler
ЗЫ:npc_in_zone() это же не глобальная функция из _g.script , а ты уже вторично забываешь указать модуля, в котором она находится.

:) У меня эта функция как раз глобальная из _g.script (перенёс для удобства), вот и написал по привычке.

 

смарт терейны находятся в табличке db.smart_terrain_by_id - отдельно от рестрикторов

В таблице рестрикторов они тоже есть - в биндере смарта есть вызов db.add_zone()

_zero_cool_, Может кинешь логику с эскепа?

Жить – значит делать вещи, а не приобретать их.

 

А вот еще какой у меня есть вопрос. Почему иногда игра вылетает вот с таким логом?: [error]Description : ...:\stalker Зов Припяти\gamedata\scripts\_sdata.script:99: attempt to index field '?' (a nil value)

99 строка скрипта _сдата:

local test = db.storage[zone:id()].active_scheme

Притом я не могу понять с какого ляда это происходит.

Объект всегда в онлайне

Изменено пользователем _Призрак_

Freedom

_Призрак_

Тут все предельно просто- ты к обратился к полю db.storage[zone:id()], которого в таблице нет. Поэтому перед тем как обратиться к какому нибудь табличному полю объекта всегда проверяй и существование объекта и поля:

if zone and db.storage[zone:id()] and db.storage[zone:id()].active_scheme then

Хех, только что нашёл решение проблемы обхода аномалий. Просто им нужно присваивать restrictor_type = 2 с помощью net_packet'ов при спавне. Тогда они автоматически добавляются движком в рестрикторы ко всем npc.

 

_Призрак_

Перед этой строкой напишите так:

if db.storage[zone:id()] == nil then
  db.storage[zone:id()] = {}
end

Вылет должен исчезнуть.

Monnoroch,

Можно узнать Сколько патрон в Стволе

Узнать их секцию

И так ,по мелочи

Не более

Вот у меня вопрос - как узнать секцию?

1)Тип патронов в стволе:

Аргумент на входе - номер слота оружия

function GetAmmoType(iSlot)

local gItem = db.actor:item_in_slot(iSlot)

if gItem then

local seObj = alife():object(gItem:id())

local packet = net_packet()

seObj:STATE_Write(packet)

local iSize = packet:w_tell()

packet:r_seek(iSize - 1)

local iAmmoType = packet:r_u8()

return iAmmoType --/> (0|1|2|...)

end

end

добавить это:

Код:

--/ определяем имя секции патронов (ammo_name) по типу (ammo_type) для конкретного оружия (sSection)

function Get_AmmoSection(sSection, iAmmoType) --/< ammo_type (0|1|2|...)

local tAmmoList = fReadFromIni(system_ini(), sSection, "ammo_class", {}, "table", ",")

local iAmmo = 1 + (iAmmoType or 0)

return tAmmoList[iAmmo] --/> "ammo_section"

end

- то получим имя/название патрона в стволе.

  • Спасибо 1

Freedom

А может кто подсказать-можно-ли заставить НПС стрелять в определённую цель (БТР) ?

Prefiero morir de pie, que vivir siempre arrodillado.
 

В общем, вопрос. :)

Хочу повесить на нового НПС типовые задания (Мне нужна работа. Есть что на примете? и т.д.). Зашёл в task_manager.script, внёс своего НПС в две таблицы:

parent_by_story:

    [642] = "stariy",

story_by_parent:

    stariy                        = 642,

Далее, прописал НПС диалоги:

tm_stariy_dialog:

    <dialog id="tm_stariy_dialog" priority="-1">
        <init_func>task_manager.init_stariy_task_dialog</init_func>
    </dialog>

tm_stariy_reward:

<dialog id="tm_stariy_reward" priority="0">
        <init_func>task_manager.init_stariy_reward_dialog</init_func>
        <precondition>task_manager.has_active_vendor_task</precondition>
    </dialog>

К этим диалогам функции:

function init_stariy_task_dialog(dlg)
    get_random_task():init_task_dialog(dlg, "stariy")
end
function init_stariy_reward_dialog(dlg)
    get_random_task():init_reward_dialog(dlg, "stariy")
end

Далее, прописал квест "уничтожить лагерь" в task_manager.ltx:

В list:

stariy_eliminate_lager_1

Ниже:

[stariy_eliminate_lager_1]
type = eliminate_lager
community = actor
text = wolf_eliminate_lager_1_text
description = wolf_eliminate_lager_1_descr
parent = stariy
target = gar_old_boars
reward_money = 1000
reward_reputation = +20
reward_rank = 3
time = 86400
prior = 1

В общем, сделал всё, но вот результат:

70588d4aee919fd9be41969c58016ab1d9764082150211.jpg

 

Почему так? Почему нет работы? Нет же никаких условий там, ничего. Подскажите, пожалуйста, в чём причина?

 

Добавлено через 79 мин.:

И вот почему-то игра не видит именно квеста на работу, будто он вообще не прописан в task_manager.ltx...

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

Disord Извини что перебиваю но у меня назрел вопрос!)

Можно сделать так чтобы живой динамический объекты (нпс, монстры) проходил сквозь стены (точней сквозь статические объекты)? Ну и конечно-же тот предмет должен знать что он это может, и идти сквозь стену а по АИ сетке?

Вопрос не глупый кстати.

Мой архив

Сталкером не занимаюсь.

Disord

А ты говоришь условий нет:

<precondition>task_manager.has_active_vendor_task</precondition>

amik

Вот это ты задал вопрос. Задал так задал. А можно поинтересоваться зачем тебе это?

 

З.Ы. Может сделать этот объект на основе партиклов? Но это только предположение человека, очень далекого от всего этого

Изменено пользователем _Призрак_

Freedom

_Призрак_, да это ограничение на выдачу награды за квест. Функция проверяет - брал ли я задание у данного НПС или нет. А не высвечивается даже диалог на предложение заданий... Уже не знаю, что делать. А amik, наверное, призрака хочет сделать :)

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

3709880.th.jpg 3709883.th.jpg

Еще вопрос как отключить блодмарки определенному монстру? Collide Marcs в мат.парах отключен (пустая строчка).

И еще настройки:

3709897.th.jpg

----

_Призрак_ Можно, но я на базе живого имел в виду...

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

Мой архив

Сталкером не занимаюсь.

Почему так? Почему нет работы? Нет же никаких условий там, ничего. Подскажите, пожалуйста, в чём причина?

Ты уверен что лагерь на который ссылается квест вообще существует или заполнен?

 

И вот почему-то игра не видит именно квеста на работу, будто он вообще не прописан в task_manager.ltx...

Эммм... а как ты это определил?

 

Функция проверяет - брал ли я задание у данного НПС или нет.

Поправочка - проверяет есть ли у игрока активное задание от данного вендора. :)

 

amik, вообще-то НПСы всегда идут по АИ-сетке и им пофигу на препятствия (стенки, баррикады и т.п.).

Министр, да, смарт существует, вместимость - 12 мутантов, прописаны работы, заспавнено 12 кабанов с логикой, в которой указан смарттеррейн, к которому принадлежит кабан - gar_old_boars.

Функция:

--' Может ли вендор выдать квест
function CRandomTask:parent_can_task(actor, npc, p1, p2, p3)
    local parent = self:get_parent(npc)
    local avail = false
    self:task_avail(actor, npc, nil, nil, nil, "reset")
    for k,v in pairs(self.task_id_by_parent[parent]) do
        if self:task_avail(actor, npc, nil, nil, self.task_info[v].init_phrase_id, true) then
            avail = true
        end
    end
    return avail
end

Проверяет, может ли вендор выдать квест, и, если есть квесты для данного вендора, то функция возвращает true. Если нету, то false и тогда вылезает текст:

На данный момент ничего нет.

Я сам менял переменную avail - вместо false - поставил true. И тогда вылезает:

Есть кое-что:

А в окне, где выбираются задания, только строка:

Эти задания мне не интересны.

То есть заданий не видно. Сделал второе задание по уничтожению лагеря собак - тоже не работает.

Поправочка - проверяет есть ли у игрока активное задание от данного вендора.

Ну да :)

 

Добавлено через 288 мин.:

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

 

Добавлено через 189 мин.:

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

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

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

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

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

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

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

Войти

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

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

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