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

[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

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

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

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

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

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

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

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

Войти

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

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

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