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

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

Zander_driver, теперь немного попонятнее из какой области твой вопрос и куда стоит 'копать'.

 

Несложно найти, что clsid у подобных разрушающихся ящиков и пр. (секция из конфига [physic_destroyable_object]) - P_DSTRBL / clsid.obj_phys_destroyable.

Если среди подобных объектов встречаются не нужные тебе - придется фильтровать по маскам имени.

 

С "ящиками поменьше" (т.е. железными и иже ...) посложнее тебе будет (clsid.inventory_box), т.к. коллбэк на хит или разрушение для них не обрабатывается.

 

Логика (точнее секция 'drop_box') - подразумевает обработку данного объекта схемой 'xr_box.script' и конечно же подразумевает что-то дропить ...

Но(!) ни что не мешает замутить что-то типа 'фейк-дропа', т.е. спавн фейкового предмета или даже спавн 'ничего'. Ведь даже изначально секция дефолтного спавна подразумевает спавн предметов в кол-ве 0. Запретив рандомный спавн (по какой-дибо метке/признаку/условию/...), можно получить просто всегда разрушаемые ящики без спавна.

 

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Можно конечно и не увлекаться. Но, если уж основная часть урона, наносимого оружием, высчитывается скриптом а не движком - а у меня именно так - то приходится :)

А то получается, ящик в котором что-то есть, разваливается с 2 пуль ПМ, а ящик в котором ничего нет - не разломать и за 10, При том что внешне они выглядят абсолютно одинаково и игрок может изначально и не знать, в каком из них что-то есть.

Спасибо за ответы :) буду размышлять над разными вариантами.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Svoboда

При прописывании своего НПС в all.spawn'е ты допустил ошибку НЕ указав ничего про 'smart_terrains', а только указал наличие секции.

Дополни пустую секцию до:

 

[smart_terrains]

none = true

 

и тогда твой НПС не будет попадать под гулаги, получая там иную работу, чем ты ему предписываешь.

 

Или же можешь включить 'свое патрулирование' в работы (например ближайшего к точкам) гулага, обусловив 'именно для твоего НПС', и пусть патрулирует, заодно и может чего еще надумаешь в контексте гулага (не все ж ему разгуливать ...).

 

---

Zander_driver

ИМХО, схожесть визуалов далеко не основной критерий одинаковости для разрушения.

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

Для меня, например, более странным будет, если каждый ящик будет разрушаться всегда с одного и того же кол-ва выстрелов (если более 1).

Но это уже лирика пошла ... :-)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Теперь еще один вопрос, уже не от меня, а.. от нашего квестовика.

У менє проблема. Facepalm.gif . создал гулаг..но не могу его проверить тк игра зависает после нескольких минут игры dry.gif (максимум 1,5)..

Зависает с таким логом:

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...r. - shadow of chernobyl\gamedata\scripts\amk.script:1795: attempt to index local 'respawner' (a function value)


stack trace:

 

Не могу раздуплить.. этот скрипт я даже не трогал. unsure.gif . но когда попытался изменить данные о респауне сталкеров то ничего не изменилось..

 

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

Вобщем, я конечно понимаю что информации маловато... но сам не располагаю. Надеюсь на подсказки, в какую сторону копать, где может быть причина вылета.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Zander_driver

Задавая вопрос озаботься тем, чтобы предоставить достаточную информацию для ответа.

Упомянутый в логе 'amk.script' явно отличен от оригинального (из чистого АМК) и далее только погадалки предстоят ... В таких случаях стОит предоставлять 'неизвестный' скрипт или хотя бы ссылку на 'где его увидеть можно' (может кто и поможет ...).

 

Лог ошибки говорит, что переменная/аргумент 'respawner' в 1795-ой строке является функцией, а от нее хотят нечто иное. В АМК-моде это должен быть объект (юзердата класса "se_respawn").

Не помню достаточно точно всего амк-алгоритма респавна, могу только предположить, что кто-то накосячил в 'se_respawn.script', в коем и организован амк-контроль за респавном объектов (неписи/монстры) и вызов из 'amk.script' перевода объекта в он(офф)лайн.

Если ваш квестовик оперирует своими неписями/монстрами (не прописанными в конфигах респавна) и они у него ... исчезают - то пусть не методом тыка ковыряет скрипты. Это не конфиги с цифирьками, нахрапом тут не пройдет.

Варианта два: а) отключать мешающий амк'шный контроль или б) корректно прописывать своих неписей/монстров в конфиги респавна (благо примеров предостаточно).

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Zander_driver, возможно стоит посмотреть еще и это: http://www.amk-team.ru/forum/index.php?s=&...st&p=451270

Это правка по аналогичному вылету в Солянке. Может поможет...

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

Artos,

У него - 100% косяк в написании гулага. Если гулаги, прописанные в данном гулажном скрипте (при условии, что это не индивидуальный скрипт) не разбредаются и новый гулаг спавнится без кондишена - 100% ошибка в алл спавне. Если неписи разбредаются - это ошибка прописи в скрипте. При иных вариантах - вылет в винду. Если не прописан смарт - да, непися засосёт в свободный гулаг на любой локе, пусть она буде даже через полЗоны. Но иногда - можно сделать спецом такую ошибочку - и непись как Семецкий будет таскаться по зоне - в любом направлении. Если назначить такому гулаг - он рано или поздно осядет навсегда в последнем смарте.

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

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

Я создал нпц а они сидят и не встают.Какую логику им нужно написать чтобы они не садились? :ny_ph34r_1:

Создаю глобальный мод с новыми локациямЭ

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

Создал - это хорошо. А под какой схемой логики они "не встают"? Они walker'ы? Camper'ы? Или сидят вокруг костра? Что прописано у них в путях в all.spawn (анимации)?

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

Приветствую всех, возник вопрос: может ли быть такая функция и как она будет выглядеть?

Проверка-обьект ли пси пес

Если да то есть у него в радиусе собаки

Если есть + им к урону и скорости?

Не соответствует. N6260

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

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

[logic]

active = remark1

danger = danger_ignore

 

[danger_ignore]

ignore_distance = 5

 

[remark1]

no_move = true

Но когда они встречают врагов они приседают и начинают стрелять а потом не встают

Создаю глобальный мод с новыми локациямЭ

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

strelok200

 

[logic]

active = walker

 

[walker]

path_walk = ....._...... (полное наименование точки пути wAy в ал спавне)

 

это самое простое остальные параметры будут использованны по умолчанию.

 

 

 

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

ZeeK

Функция такая может быть, но выглядеть будет сложно.

1. Проверка-обьект ли пси пес - я так понял, имеется в виду является ли объект определенной разновидностью моба.

Если у него нет разных профилей, то просто по его секции можно опознать. Если профили разные, то наподобие этого:

  if string.find(self.object:section(),"chimera") then

2. Если да то есть у него в радиусе собаки - перебор всех объектов на уровне, с аналогичной проверкой - является ли объект собакой (а у них профили разные). Если является, узнаем дистанцию

local chimera_dist = nte:position():distance_to(self.object:bone_position("bip01_spine"))

тут вместо nte надо будет подставлять объект пси пса.

Дальше начинается более муторная часть... вышеуказанными способами получится отобрать набор объектов, являющихся собаками и расположенных на нужной дистанции от пси-собаки. запихиваем их в список (лучше записывать их id).

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

3. Если есть + им к урону и скорости? насчет скорости не могу ничего придумать, а насчет урона можно.

В хит-коллбэк всех объектов, которых могут кусать собаки (актор, нпс, мобы) - вводим проверку, кто нанес хит - не обнаружится ли его ид в списке "усиленных собак". Если да, то наносим пострадавшему от собаки дополнительный хит скриптом.

                     local ch_h = hit() 
                        ch_h.impulse = 50 
                        ch_h.draftsman = self.object
                        ch_h.direction = vector():set(1,0,0) 
                        --ch_h:bone("bip01_spine") -- хитовать будет и без указания костей
                        ch_h.power = 0.85
                        ch_h.type = hit.wound
                        nte:hit(ch_h)

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

Вот как то таким образом.

 

Вопросик у меня созрел. пустяковый, но терзающий.

методом alife():create("все что полагается") можно ли спавнить объекты за пределами онлайн-радиуса?

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Zander_driver, ну фантом ли объект определяется гораздо проще:

local obj_clsid == self.object:clsid()
if obj_clsid == clsid.psy_dog_phantom_s then

 

Являются ли окружающие неписи собаками также очень просто проверяются по clsid.

С помощью alife():create() можно спавнить вне онлайн-радиуса, да.

Изменено пользователем KD87
Ссылка на комментарий
Я прописал им простую логику:

[logic]

active = remark1

danger = danger_ignore

 

[danger_ignore]

ignore_distance = 5

 

[remark1]

no_move = true

Но когда они встречают врагов они приседают и начинают стрелять а потом не встают

Это "не логика", такую я обычно использую только для тестов (так как при малейшей опасности НПС теряют управление прописанное в remark1 и переходят на пародию "универсального комбата").

Поэтому, ты определись чего от них хочешь (патруль - walker или снайпер - camper) и можешь им прописать в кастомдате эти "универсальные для всех локаций" (только снайпер там одноразовый - из расчёта, что ты всё же дашь ему бой при первой встрече иначе вставляй ему свои пути path_walk = ... path_look = ... )

1. Патруль который при виде врага или друга сперва говорит по рации (в зависимости от дистанции) и после атакует (бывает сразу):

[logic]

active = remark@raciya

danger = danger_condition

meet = meet

 

[remark@raciya]

anim = backoff2

snd = killer_vrag_enemy

no_move = true

target = actor

meet = meet@raciya

on_signal = sound_end| walker@patrol

danger = danger_condition

 

[meet@raciya]

meet_state = 35|guard_rac@killer_vrag_enemy

meet_state_wpn = 45|guard_rac@killer_vrag_enemy

victim = 35|actor

victim_wpn = 35|actor

use = true

use_wpn = true

meet_dialog = escape_lager_guard_start_dialog

 

[walker@patrol]

path_walk = bar_dolg_veterans_guard_bunker_1_walk

path_look = bar_dolg_veterans_guard_bunker_1_look

def_state_moving1 = patrol_fire

def_state_moving2 = patrol_fire

def_state_moving3 = patrol_fire

on_info = {=npc_distance_to_waypoint(bar_dolg_veterans_guard_bunker_1_walk:60)} nil

danger = danger_condition

show_spot = false ;true

 

[danger_condition]

ignore_distance_corpse = 0

ignore_distance = 0

 

[smart_terrains]

none = true

 

2. Снайпер (сидячий-стоячий), тоже при виде врага говорит по рации (от дистанции к цели), затем атакует - да и постоянно держит ГГ на мушке

[smart_terrains]

none = true

 

[logic]

active = remark@start

combat_ignor = combat_ignore

meet = meet

 

[remark@start]

no_move = true

radius = 0

anim = hide

snd = cit_jail_guard_sneer

target = actor

;on_info = {=health_le(0.5)} remark@search

;on_timer = 80000| remark@search

on_signal = sound_end| remark@search

wounded = wounded@work

meet = meet

danger = danger_condition

 

[remark@search]

anim = hide

target = actor

on_info = {=see_actor} camper@snyper

wounded = wounded@work

 

[meet]

meet_state = 28|hide_s_left@wait| 4|hide_s_right@wait

meet_state_wpn = 28|hide_rac@mil_ara_ambush

victim = 28|actor

victim_wpn = 28|actor

use = true

use_wpn = true

meet_dialog = escape_lager_guard_start_dialog

 

[wounded@work]

hp_state = 0|wounded_heavy@help_heavy

hp_state_see = 0|wounded_heavy@help_heavy

hp_victim = 0|nil

hp_fight = 0|false

hp_cover = 0|false

 

[camper@snyper]

path_walk = mil_zomb_stalker_walk1

path_look = mil_zomb_stalker_look1

sniper = true

def_state_moving = assault

def_state_campering = hide_na ;threat_na

def_state_campering_fire = threat_sniper_fire

radius = 60

no_retreat = true

shoot = always

danger = danger_ignore

show_spot = false ;true

 

[combat_ignore]

combat_ignore_cond = {!actor_enemy}

combat_ignore_keep_when_attacked = false

 

[danger_ignore]

ignore_distance = 5

 

[danger_condition]

ignore_distance_corpse = 0

ignore_distance = 0

 

;)

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

strelok200, в секции [logic] указывают обычно:

inv_max_weight = 10000

trade = <путь к конфигурационному ltx-файлу настроек торговли NPC>

И укажи в профиле непися минимальное и максимальное кол-во денег у торговца. И чтобы у NPC деньги не заканчивались, укажи там же infinitive = "1".

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

Как можно скриптом "вскрыть" ltx файл? Я смотрел примеры но чтото так и не понял. Мне надо чтото вроде "предмет" = "x", "y", "z", "lv", "gv" = "вероятнось". Такое можно устроить вообще? Если да то как?

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

Пример скрипта, который парсит ltx файл и выбирает случайные строчки:

--//-- парсим файл со списком хабара
function parse_list()
local ini = ini_file("misc\\items_link.ltx")
    if not ini then ini=system_ini() end
    if ini:section_exist("generic_list") then
         local n = ini:line_count("generic_list")
                local key = math.random(0,n-1)
                    local result, item, num = ini:r_line("generic_list",key,"","")
        return item, num
    end
end

пример файла, из которого читаются данные

[generic_list]

af_dummy_pellicle = 0.3

af_dummy_battery = 0.3

af_dummy_dummy = 0.3

af_dummy_spring = 0.3

af_fuzz_kolobok = 0.3

wpn_addon_scope = 0.4

wpn_addon_scope_susat = 0.4

wpn_addon_silencer = 0.4

wpn_addon_grenade_launcher = 0.4

wpn_addon_grenade_launcher_m203 = 0.4

novice_outfit = 0.2

bandit_outfit = 0.2

killer_outfit = 0.2

monolit_outfit = 0.2

soldier_outfit = 0.2

 

Методы чтения ltx описаны в справочнике malandrinus'a с предельно простыми и понятными примерами.

ЗЫ:а вот все это - "предмет" = "x", "y", "z", "lv", "gv" = "вероятнось" - гораздо проще засунуть в обычный lua-массив. И не лазить ни в какие ltx.

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

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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