[SoC] Ковыряемся в файлах - Страница 172 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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


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

malandrinus, просто хотелось бы, чтобы предмет именно висел как в HL 2

 

есть скрипт amk_target - он выводит на худ целеуказатели, которые наводятся точно на голову (точнее на кость) НПС-ам в округе

 

скрипт вообще недоделан - но самая сложная математика там есть

 

я смог допилить его до

27a93.jpg 0f9d4.jpg b1dfb.jpg

 

тут по 5 костям я вычисляю примерно в какие "рамки" можно загнать непися для отображения

+ добавил увеличение - уменьшения рамки взависимости от расстояния, FOV и прочего

+ добавил отсеивание тех НПС, которые стоят за стенами и другим препятствиями (правда если хоть чуть ноги видно - непись определяется)

 

с предметами все будет нааамного проще

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

i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх

lekzd,

я как-то думал про гравипушку. Когда с физикой развлекался, то это первое, что пришло на ум. Но там масса мелких вопросов.

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

Дальше. Допустим, ты сделал некий девайс, вероятно на основе обычного ствола. Тебе нужны три действия: поднять, отпустить и кинуть. Значит надо определять нажатость на курок (левая кнопка) и как-то ещё нажатость правой кнопки для кидания. Насколько я знаю, отдельный выстрел пока никому отследить не удалось, особенно, если патронов нет =)

Остальное по сути дело техники: уравновесить гравитацию для предмета, подтащить его, держать перед актором и дать ему пинка. Это всё нудно, но реализуемо наверняка, а вот те проблемы - без понятия как сделать, особенно с управлением.

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

malandrinus, есть кнопка tab - нажали один раз - подтянули предмет - нажали второй раз - и сколько держим - с такой силой и кинем его

i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх

lekzd,

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

Опять же остаётся проблема определения того, что перед тобой лежит предмет. На локации объектов довольно много, перебирать их все в момент нажатия - плохой вариант.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

malandrinus, речь шла только о физических объектах - а у них вроде секция только одна

 

вот еще ни одного мода не видел, где на tab что-либо вешали

 

а определние ЛКМ - можно сделать без смещения FOV - тогда расчитываем по функции math.ceil(db.actor.accuracy()*1000) если возвращает единицу - значит мы целимся, иначе число будет выше

i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх

lekzd, как не видел? О_о А мод с реалистичными радиацией и кардиограммой от Руси (точное название не помню)? А мод NewQuickSave (как-то так)?
Ничто не истина. Все дозволено.

Не подскажите, где можно посмотреть схему логики телевизора? вернее схему отобрадения картинок на экране?

Что-то кончается, что-то начинается...

malandrinus

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

(не через callback.use_object - он походу только для NPC и ящиков работает - отследить скажем использование аптечки через коллбек на юзание объекта в биндере аптечки у меня не получилось, хотя может сделал че не так). А вот через две маленькие функции которые у меня есть можно отследить использование чего угодно.

 

вчера тоже решил побаловаться методом управления физической оболочкой

взял просто пример из скрипта зомби на аэс в xr_effects.

local force = vector():set(0, 0, 0.02)

local pshell = npc:get_physics_shell() -- вот в этом месте получаю вылет что pshell равно nil - непись определяется как онлайн объект по сиду

Попробовал убить непися строчкой выше - тож самое. В скриптах игры этот метод вообще только к дверям применяется почему то.

 

а npc:set_const_force (dir, 5000, 3) вообще никак не действует на живого NPC.

 

PS: спасибо за ответ по таблицам. Я считаю что знания не относящиеся непосредственно к игре не менее важны для понимания скриптов игры.

(и вообще для развития кругозора полезны). так что кому неинтересно пусть не читает. Я же всегда рад когда умный человек делится с другими тем что знает.

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

Последовательные нажатия на ЛКМ, и какое именно нажатие по счету отследить можно, я это использовал в последней версии АИ ввертолетов, когда дошел до ПЗРК. Первое нажатие ЛКМ у меня готовит ракету к пуску, второе - собственно пуск при благоприятных условиях. При неблагоприятных - игнор, ждем третьего нажатия и т.д. Не без гемора, но все-таки сделал все, что хотел.

Применительно к грави-пушке:

Как и ПЗРК, стрелять ("честным" патроном) не должна. Значит, нужен холостой боеприпас, buck_shot = 0 в конфиге патрона. При попытке выстрелить в НПС таким патроном НПС не получает урона и не обижается.

Далее. Нам нужно отслеживать два параметра - состояние грави-пушки и количество патронов в магазине. Если в руках именно она, смотрим, сколько патронов у нее в магазине (вместимость магазина - один патрон, больше не нужно).

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

Захват предмета. Нажимаем ЛКМ. Грави-пушка стреляет, поскольку сделана на классе оружия. Патрон холостой, урона никакого, но патрнов в магазине становится 0. Далее скриптом обязательно возвращаем патрон в магазин. А состояние - по ситуации. Если предмет захватили (как именно это реализовано - другой вопрос), ставим состояние 1, если нет - оставляем 0.

То же самое с броском. Если предмет уже захвачен (состояние - 1 и патронов - 1) - можно бросать. Момент броска точно так же отслеживаем по расходу патрона, даем пинка предмету, возвращаем патрон и ставим состояние 0 - готовность к захвату следующего предмета.

 

Нажатие ПКМ - по accuracy предлагали отследить. Ну или по FOV на худой конец.

Ну и всякие нужные фишки типа звуков и т.д.

 

Все это относится только к актору, грави-пушка в руках НПС - совсем другая история.

 

В общем, с управлением решаемо. Вот как предмет выбрать... Перебирать всю, пусть даже только онлайновую, гадость на уровне? Это не сильно быстро получится. Хотя, врядли брать предметы кто-то сможет чаще раза в секунду, а вертушки у меня таким перебором цели и ищут, только раз в 5 секунд и правила отбора другие.

 

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Vano_Santuri, у телевизора нет логики, то что он отображает это всего навсего анимированая текстура, смотри в папках с текстурами.
Возможно всё, ну или почти всё.
8push5, Ясно. Так значит телик на Скадовске не объект, а элемент уровня, и снести его никак, а жаль.

Что-то кончается, что-то начинается...

Отследить отдельный выстрел можно. Точнее говоря я могу отследить хит от определенного боеприпаса либо просто использование определенного боеприпаса.
Можно про использование боеприпаса подробнее?

 

local pshell = npc:get_physics_shell() -- вот в этом месте получаю вылет что pshell равно nil - непись определяется как онлайн объект по сиду
Живые неписи управляются анимацией, потому оболочка есть только у дохлых.

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

В скриптах игры этот метод вообще только к дверям применяется почему то.
Дверь - это физический объект с костью, за которую её можно открыть. А насчёт неиспользования физики в скриптах оригинальной игры. Я думаю, там не до того было.

а npc:set_const_force (dir, 5000, 3) вообще никак не действует на живого NPC.
см. выше. Кроме того:

1. Это метод, который своему названию соответствует. Здесь речь идёт о силе.

2. Третий аргумент - время действия в миллисекундах. 3 мс - как бы маловато =)

 

Применительно к грави-пушке:
Насчёт управления понял. Родилась встречная идея, как может быть можно определить "удержание" правой кнопки. Можно попробовать дать много патронов, и заставить стрелять очередью. Если между апдейтами число патронов уменьшается - значит держим кнопку. В этом случае можно придать патронам смысл "заряда".

 

грави-пушка в руках НПС - совсем другая история.
Зачем оно им вообще надо? Думаю - это лишнее.

а вертушки у меня таким перебором цели и ищут, только раз в 5 секунд и правила отбора другие.
А цели - это только сталкеры? Почему бы не зарегистрировать в биндере сталкера и актора при выходе в онлайн каждого непися и не занести их в таблицу? Это ведь не сложно. В этой таблице будет десятка три записей максимум.

Другое дело для физических объектов так не сделать. Таскать же можно почти всё, что под физикой: собственно физические объекты, инвентарные предметы, всё оружие, арты, тушки. Регистрировать всё - можно попытаться, но как-то уж очень глобальный мод выходит. А перебор - не вариант. Это же фриз нехилый.

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Это db.storage :)

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

Monnoroch,

если не ошибаюсь, db.storage содержит все объекты, причём как записи с ключами - id.

Как там найти, скажем, сталкеров? Так что отдельная таблица для сталкеров, ну или для "целей вертолёта" не помешает.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

malandrinus

Вот эти две маленькие функции позволяют мне отслеживать все что уничтожается при использовании

вот пример их использования именно для отслеживания использования определенного боеприпаса(ов)

local item = nil

--функция вызывается из апдейта эктора
function use_item()
if item and type(item) == "number" then
if not level.object_by_id(item) then
--hit = true --это я для отыгрыша партикла на NPC флаг включал
--news_manager.send_tip(db.actor, "Использована  граната", 0, "trader", 5000)  --а это для проверки
--в общем вот сюда и вставляем любой код для активации на момент использования вещи
end
item = nil
end
if item and type(item) == "userdata" then
item = item:id()
else
item = nil
end
end


--функция вызываемая из дропа
function drop_item(obj)
if obj:section() == 'ammo_vog-25p' or obj:section() == "ammo_vog-25" or obj:section() == "ammo_5.45x39_fmj" then
item = obj --\\если наша вещь, то запомнить его userdata
end
end

 

Функцию написал не я, а один очень умный человек со сталкер портала который меня многому научил - камрад singapur22

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

 

 

Вопрос: сделал я все таки проверку на размер своей таблицы - вылетов больше нет. Если запись за гранью допустимого - то таблица не перезаписывается в объект.

Осталось только выяснить что же в объект пишется помимо моей таблицы.

Вот строки из мессиджей которые я вывел для проверки данных на экран:

 

сообщений 57  --это общее кол-во сообщений в таблице
места для записи больше нет
размер  таблицы 7832  --это размер который у меня считается перед сохранением
текущая позиция записи 1076  --вот это что за данные записаны?

сообщений 58
места для записи больше нет
размер  таблицы 7982
текущая позиция записи 1491  --и они ведь постоянно меняются - то больше то меньше становятся

(то есть как ты понял я плюсую текущий размер  таблицы и текущую позицию записи (получаемую через packet:w_tell() )  а потом перед сохранением проверяю не больше ли это чем 8192 байта. )

 

 

Насчет storage - она содержит все совокупность данных по NPC которые находятся в онлайне - можно определить все - вплоть до текущей анимации, патрульного пути, секции логики, активной схемы и т.д.

А вот скажем артефактов и аномалий (как и по видимому прочих объектов) она не содержит.

 

вот часть кода из моего скрипта который вытаскивает из storage разную инфу

function InfoNpc()
local aitem, count_inv, count_mag, cond, scheme, sec_logic, act_section
local str = ""

    for k, v in pairs (db.storage) do
        local obj = level.object_by_id(k)

--if (obj and IsStalker(obj) and obj:id()~= 0) then
--проверка IsStalker исключает Сидоровича и вероятно вообще всех торговцев
                -- поэтому используем другую

if obj and (get_clsid(obj) == clsid.script_stalker or get_clsid(obj)== clsid.script_trader) then

--определяем активную схему  - работу
        if v.active_scheme then
scheme = v.active_scheme
        else
scheme ="нет"
end

--определяем секцию логики
if v.section_logic then
sec_logic = v.section_logic
        else
sec_logic ="нет"
end

--определяем активную секцию логики
if v.active_section then
act_section = v.active_section
        else
act_section ="нет"
end

 

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

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

 

И что озачает строка tbl.sid = 48802? Я так понимаю это айди непися и не может быть 2 различных айди. Но как узнать свободен айди или нет?

 

Я понимаю что всех уже достал, но все равно прошу помощи

Freedom

_Призрак_

активация только через диалог - после любой фразы

 

поправленный вариант

function set_bandit(obj1, obj2)

if obj1:id() == db.actor:id() then

obj2:set_character_community("bandit", 0, 0)

else

obj1:set_character_community("bandit", 0, 0)

end

end

 

айди у NPC никогда не будет равным другому так как назначается ему в момент спавна автоматически движком.

А вот сид задается в произвольном порядке (в файле allspawn) - и регистрируется в файле гейм стори идс - вот там смотри и свободен он или нет.

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

Garry_Galler, извиняюсь, чем не подходит?

function test()
db.actor:set_character_community ("bandit",0,0)
end

И также вопрос, что значат нули после названия группировки?

Мой ник читается гузерус.

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

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

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

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

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

Войти

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

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

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