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

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


Halford

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

сия хрень назвается сабклассинг

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

Хотя какая в сущности разница?!

 

Подскажите, есть спосод отследить игровые секунды аналогично часам и минутам:

Можно даже миллисекунды:

local y,m,d,h,min,sec,ms = game.get_game_time():get()

К слову сказать, экспериментировал сейчас с level.set_time_factor и выяснил забавную вещь. Можно установить фактор времени отрицательный, и часики начнут тикать в обратном направлении. Вот сижу и думаю: а не можно ли здесь нарыть решение проблемы с таймером в ТЧ.

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
как убрать ограничение на сон?

Файл amk_mod.script. Там функция test_for_need_sleep_matras (примерно строка 409). Там во второй части есть такой фрагмент:

            else
                if amk.load_variable("block_sleep_menu",0)==0 then
                    if amk.load_variable("gg_need_sleep",0)>20 then
                        local spwn=ui_cheat.cheat(get_hud())
                        level.start_stop_menu(spwn,true)
                    else
                        amk.send_tip(game.translate_string("not_need_sleep"),nil,nil,5)
                    end
                else
                    amk.send_tip(game.translate_string("not_need_sleep_nrg"),nil,nil,5)
                end
            end

Это основные проверки, которые мешают заснуть, и собственно вызов диалога сна. Между else и end Надо закомментировать всё, кроме:

local spwn=ui_cheat.cheat(get_hud())

level.start_stop_menu(spwn,true)

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
Тут подумал, а как тогда убрать этот интервал? В частности для вывода сообщения о смерти НПС.

Не обязательно пользоваться функциями АМК. Можно использовать функцию give_game_news из движка игры прямо в колбеке на смерть непися. Прописать там время задержки нулевое и всё. Я подробно описывал эту функцию в старом топике. Вот оттуда информация:

У любого клиентского объекта имеется метод give_game_news

Он и выводит сообщения на экран. Экспериментом выяснил, что сообщение можно вывести совершенно от любого клиентского объекта, хоть от куска колбасы (хвала дизайнерскому гению GSC! Ну почему не сделать просто глобальную функцию?). Однако, следуя традиции и здравому смыслу, мы таки воспользуемся для этого объектом, соответствующим ГГ, т.е. актёром.

Код

    local sactor = alife():actor() --получаем серверный объект актера
    local cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера
    cactor:give_game_news(
        "Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!", -- строка сообщение, может быть многострочной
        "ui\\ui_npc_monster",        --текстура, из которой берется аватара "отправителя"
        Frect():set(0,215,163,105),  --координаты и размеры вырезаемого из текстуры изображения
        math.random(1000, 3000),     --начало показа сообщения с текущего момента (в миллисекундах)
        5000                         --длительность показа сообщения (в миллисекундах)
        )

Доп. комментарии к аргументам give_game_news:

имя текстуры - это имя файла DDS без расширения, адресуемого относительно папки \gamedata\textures\

в этом выражении Frect():set(0,215,163,105)

0,215 - это координаты верхнего левого угла нужного изображения

163,105 - его размеры

Размеры и координаты могут быть любыми, но полученное изображение будет увеличено или уменьшено до размеров 83х47

В данном случае изображение тушкана из файла ui_npc_monster.dds было уменьшено.

Параметр времени начала показа нужен, очевидно, для внесения некоторой живости в игру. Дело в том, что код Lua получает управление только в определённые моменты, по определённым событиям. В такой момент можно сгенерить пачку сообщений и раскидать их по времени с помощью этого параметра, создав таким образом некоторую имитацию жизнедеятельности на ближайшее время. Думаю, таким же образом можно имитировать диалоги. Просто генерится пачка сообщений и им задаётся вывод с небольшим интервалом.[/code]

 

 

 

Всем доброго времени суток,вроде где то говорили, но всё же реализуема ли, то, чтобы нпц ездили на транспорте.

Скорее всего не выйдет. Вроде разработчики планировали в процессе создания игры сделать езду неписей на машинах, и даже подробно разработали анимацию посадки в машину и пр. Но потом всё повырезали в связи с уменьшением локаций и изменением многих объектов на неразрушаемые. Остался только БТР, который ездит по скриптам. Вряд ли в движке осталась логика управления автомобилем, так что даже если остались все анимации, то восстановить это не получится. Да и к чему?! Любую локацию можно пробежать за пару минут, а ездить даже ГГ может с трудом из-за многочисленных препятствий.

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение

Касательно прикручивания аддонов к стволу скриптами. Поэкспериментировал и выяснил следующее: когда устанавливаешь/снимаешь аддон, то ID ствола не меняется, а после снятия аддона его ID становится другим. Т.е. ствол с гарантией не спавнится заново, а только меняются его свойства, а вот аддон наоборот почти наверняка на время установки просто исчезает, а при снятии спавнится в инвентарь заново.

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

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
А как технически перевести объект из онлайна в оффлайн и обратно? Как-то уже интересовался этим вопросом, но ответа так и не нашел.

в запихачить в оффлайн

в онлайн - соответсвенно

Могу ещё добавить, что на возможность убрать предмет в онлайн/оффлайн влияют функции can_switch_offline и can_switch_online, которые являются методами всех классов, унаследованных от cse_alife_object. Эти методы можно перегрузить, что и сделано для некоторых классов (в частности для сталкеров и монстров). Если эти функции возвращают false, то соответствующее действие не получится.

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
итить, ну нету у них никакого ИД, обыкновенный физ. объект с визуалом кровати,

определить в принципе не сложно - перебрать все физ объекты, при помощи

нетпакета выдрать название визуала из свойства visual_name,

А как можно перебрать такие объекты?

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

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
обыкновенный цикл по объектам, чтото типа

 

в котором нуно проверить идентификатор класса объекта через функцию get_clsid,

нас интересует идентификатор 83 :)

Так всё таки есть ID =)

 

Я собственно поискал таким образом объекты и не нашел ни кроватей ни матрасов. Может модели и сохранились в архивах, но скорее всего как физические объекты они были вырезаны и остались только как элементы декора. Детектировать их вряд ли получится. Проще явно расставить рестрикторы там, где визуально лежат матрасы, и потом на них ориентироваться. Хотя я конечно могу и ошибаться.

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
Мужики, еслу кому не жалко, скиньте текстурку gamedata\textures\act\act_corp_stalker.dds

плиз :unsure:

С таким именем не нашёл. В этом каталоге есть другая act_stalker_corp.dds. вот она

Есть вообще-то замечательный распаковщик, автор которого Don Reba, который позволяет распаковывать выбранные файлы по одному

Лежит здесь

называется Database Extractor 2.0

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
За что отвечает файл map_spots.xml? И что означают описаные в нем координаты?

Есть такая функция level.map_add_object_spot_ser(se_obj.id, map_spot_name, desc)

В этой функции аргумент map_spot_name - это значок, как раз и описанный в этом файле (и включённых в него директивами #include).

Структура файла XML мне видится довольно очевидной. Например, значок для задания по защите лагеря имеет имя "defend_lager_location"

 

сначала идет эта часть. Здесь упоминаются собственно описатели значков для карты и миникарты ("defend_lager_spot" и "defend_lager_spot_mini") а также по всей видимости вид курсора при наведении на эти значки "quest_pointer".

 

    <defend_lager_location>
        <level_map spot="defend_lager_spot"        pointer="quest_pointer"/>
        <mini_map spot="defend_lager_spot_mini"    pointer="quest_pointer"/>
    </defend_lager_location>

далее по отдельности описываются сами значки:

для карты

    <defend_lager_spot  x="0" y="0" width="32" height="32" stretch="1" alignment="c" xform_anim="map_spot_new_xform" xform_anim_cyclic="0">
        <texture>ui_mapQuest_camp_defend</texture>
    </defend_lager_spot>

В теге defend_lager_spot очевидно указаны видимые размеры текстуры и (возможно) точка привязки к значку.

В данном случае в разделе <texture>...</texture> указана уже готовая именованная текстура ui_mapQuest_camp_defend. Она описана в файле ui_common.xml

 

для миникарты

    <defend_lager_spot_mini  x="0" y="0" width="11" height="11" stretch="1" alignment="c" xform_anim="map_spot_new_xform" xform_anim_cyclic="0">
        <texture>ui_sm_mapQuest_camp_defend</texture>
        <texture_below r="0" g="255" b="0">ui_mini_sn_spot_below</texture_below>
        <texture_above r="0" g="255" b="0">ui_mini_sn_spot_above</texture_above>
    </defend_lager_spot_mini>

Что здесь означают параметры texture_below и texture_above не знаю.

 

Кроме указания именованной текстуры можно и прямо здесь описать текстуру прямой ссылкой на файл текстуры и координатами фрагмента. Так сделано например для значка anomaly_zone_mini_spot.

    <anomaly_zone_mini_spot x="0" y="0" width="16" height="16" alignment="c" stretch="1"> 
        <texture x="1" y="202" width="31" height="30" r="255" g="100" b="100">ui\ui_mp_icon_kill</texture>
    </anomaly_zone_mini_spot>

Здесь идёт ссылка на файл gamedata\textures\ui\ui_mp_icon_kill.dds . Из неё берётся фрагмент с координатами (1, 202) и размерами (31, 30)

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Stalker Icon Viewer очень удобная программа для этих дела :)

Нескромно напомню о своей программе "STALKER Icon Editor". Можно не только определять координаты, но и редактировать некоторые иконки. Живёт в этой ветке

 

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

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

Рассуждая логически расчёт попадания в сферу требует вычисления трёх разниц, трёх квадратов и корня. А попадание в параллелепипед требует просто шести сравнений (т.е. по сути вычитаний). Чисто вычислительно по идее второе будет быстрее. Но опять же попадание в сферу можно оптимизировать, если заранее вычислить и хранить квадрат радиуса (корень не нужен). С другой стороны всё это такие копейки с учётом скорости современных FPU.

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

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
вопросик: подскажите название анимации: НПЦ сидит (не на корточках, а как Сидорович)

...

я имею ввду, сидит как Сидр :)

Думаю, что в этом-то и главная проблема. Анимация завязана на скелет, а он у Сидора наверняка несовместим с человеческим.

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

 

Вот кстати, забавная картинка. Ну не монстр ли?

Jq11lu73i1.jpg

 

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

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
Подскажите кто нить со скриптом, как заставить мутантов на свет фонарика бежать?

а смысл-ГГ илиНПС они атакуют и так если обнаружат все равно как по свету или по звуку

На мой взгляд, было бы интереснее напротив - заставить бежать от фонарика. Или от света вообще, в том числе от костра. В этом случае батарейки (которые могут закончиться) приобретают новый животрепещущий смысл =)

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

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
Добрый день. Не в курсе чем можно редактировать dds файл разрешением 108*8. Фотошоп отказывается сохранять из-за того что стороны не кратны 2?

Ты хотел сказать "кратны степени двойки"? ну не суть...

Сгодится Paint.NET

 

Вообще говоря для пакованных текстур (DXT1,3,5) крайне желательно иметь размеры как минимум кратными четырём, поскольку это размер блока данных (4х4). Если размеры не кратны четырём, то реально создаётся картинка с кратной стороной, но часть пикселей не используется. Эта ситуация заложена в формат текстуры, но не всегда корректно обрабатывается произвольно взятым софтом.

Кроме того, если подразумевается генерация mipmap уровней, то ещё стороны должны быть кратными степеням двойки (дабы их можно было делить пополам вплоть до размера 1).

 

А зачем надо создавать такую хитрую текстуру? Всегда же можно при её использовании указать её часть. Их так собственно и используют - "кусочно".

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
1. Как в Lua писать данные в файл, как читать данные из файла?

2. Что такое NET пакеты и зачем они нужны? (это случай не что-то по типу winAPI)

3. Что за Frect():set(0,658,83,47)?

1. Вообще говоря в стандартном Lua есть функции работы с файлами, но их наличие в конкретной реализации зависит от разработчика. Поскольку Lua фактически является частью хост-приложения, то в нём будут только те библиотеки, которые пожелает оставить разработчик. Вот в данном случае все стандартные библиотеки для работы с файлами были убраны. Если вопрос в том, есть ли способ записи в ltx файл, предоставленный в API самой игры, то походу тоже нет.

 

2. нетпакет - это класс движка игры, экспортированный в Lua. Каждый объект этого класса содержит буфер. Любой серверный объект можно записать в этот буфер и считать из него. Кроме того, в этом классе есть функции для последовательного разбора этого буфера. Техника работы с нетпакетом следующая:

а) создаем объект класса нетпакет, вот так:

local packet = net_packet()

б) читаем в него состояние объекта вот так:

sobj:STATE_Write(packet)

в) разбираем нетпакет на части, читая последовательно все его поля в переменные Lua. Здесь требуется знать внутреннее представление нетпакета для каждого класса. acdc в руки...

local game_vertex_id     = packet:r_u16()
local distance           = packet:r_float()
local direct_control     = packet:r_s32()
local level_vertex_id    = packet:r_s32()
...
и т.д.

г)меняем значения полученные переменных, как нам надо, и затем записываем обратно в нетпакет в том же порядке так:

res:w_u16(game_vertex_id)
res:w_float(distance)
res:w_s32(direct_control)
...
и т.д.

д) записываем нетпакет обратно в объект вот так:

local size  = res:w_tell()
res:r_seek(0)
sobj:STATE_Read(res,size)

Делать всё это можно только с объектами в оффлайне.

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

 

3. Frect():set(0,658,83,47) - это синтаксис создания неименованного объекта пользовательского типа, экспортированного в Lua. В данном случае Frect. Это класс для хранения координат прямоугольника. Сразу после создания для объекта вызывается его метод set, который устанавливает его значения.

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

IQDDD,

у меня ругается на то, что метод STATE_Write () неизвестен. Что делать?

Объект серверный?

в faction commander для ЧН как-то сделали запись в файл и чтение из него.

Ну значит в ЧН пространство имён io экспортировали. В ТЧ этого точно не было, я спецом проверял. Это как раз и есть стандартные функции Lua для работы с файлами. Смотри справочник по Lua, как с ними работать.

 

attempt to index global 'MyScripts' (a nil value)

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

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

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
ObjSpawn = alife():create()

...

ObjSpawn:id()

Это серверный объект, а ты пытаешься вызвать метод клиентского. Используй свойство id, а не метод id().

 

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

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

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

 

Поделиться этим сообщением


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

Уф... давай сначала. Вот код:

ObjSpawn = alife():create(...)

...

ObjSpawn:id()

Первая строка - это создание пользовательского игрового объекта с помощью вызова alife():create(...). create возвращает серверный объект. Это факт, хотя об этом и так можно догадаться - объект же создаётся на серверной стороне. Далее для этого объекта вызывается метод ObjSpawn:id(). Но у серверного объекта нет метода id, у него есть свойство. А к свойству нужно обращаться иначе: ObjSpawn.id

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
вопрос на засыпку: клиентский/серверный объекты, это не тоже самое что объект в оффлайн/онлайн?

оно родимое =)

серверный == оффлайновый

клиентский == онлайновый

я в коде обычно подчёркиваю это добавляя к имени переменной префикс 'c' - для клиентского и 's' - для серверного: cobj/sobj

 

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

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

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

 

Поделиться этим сообщением


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

Есть метод hit, у него есть единственный параметр - это объект класса hit (см. LuaHelp). У класса hit кроме типа урона и импульса есть ещё и метод bone, который очевидно отвечает за часть тела.

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
Правильно?

Посмотри пример в xr_motivator.script. У меня он начинается со строки 296. (версия АМК)

 

Есть вопрос. Каким образом повредить или наоборот "починить" предмет скриптом?

И еще один. Как добавить окошко по типу "выбросить" в инвентарь, и назначить на него действие?

Для онлайнового объекта (game_object) есть метод set_condition. Вроде бы им можно. Для оффлайнового можно использовать нетпакеты.

 

Окошко вероятно можно сделать также, как это сделано для матраса. Поищи в топике или в архиве.

 

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

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

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

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   2 пользователя

AMK-Team.ru

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