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

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


Halford

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

Сделал плагин для распаковки игровых архивов для Total Commander-а. Живёт здесь. Протестируйте пожалуйста.

 

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

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

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

 

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


Ссылка на сообщение
Как поставить метку на тайник, во время того,как актор выкладывает в него определенный предмет?

Я пробовал в on_item_drop коллбэк ставить, а саму метку как в treasure_manager ставил:

level.map_add_object_spot_ser(box.id, "treasure", text)

или

level.map_add_object_spot(box.id, "treasure", text)

 

Результат один: метка на акторе ставится...

А откуда у тебя в этом коллбеке box взялся? Ну да ладно. Я попробовал это сделать в колбеке on_item_drop. Вышло что-то в этом роде:

 

function actor_binder:on_item_drop(obj)
    ...
    local sobj = alife():object(obj:id()) -- получаем серверный объект
    level.map_add_object_spot_ser(sobj.parent_id, "treasure", "test test test")
end

Обращаю внимание, что если попытаться получит здесь id родительского объекта через клиентский объект obj:parent():id(), то мы получим всегда 0. т.е. id актора.

 

Если предмет съеден или просто выброшен на землю, то его родитель будет 65535. Вроде бы map_add_object_spot_ser в этом случае не сбивается, но вероятно надо бы проверять это и не делать лишнего. Ну а проверить, что выложили именно в ящик - дело техники. У меня же начали ставиться метки на всё подряд =)

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

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

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

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

 

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


Ссылка на сообщение
И если вместо table.insert ставить level.map_add_object_spot_ser(box:story_id(), "treasure", "test")

 

Получается метка на акторе...

...

видимо у всех коробок в игре есть сид...

Как раз не обязательно у каждой, sid - это дополнительный необязательный идентификатор, что-то вроде специальной метки.

Я проверил и выяснил, что для всех объектов, у которых sid не установлен, и sobj.m_story_id, и cobj:story_id() выдают значение 4294967296. Если посмотреть на шестнадцатеричное представление этого числа, то увидим 0x100000000. Т.е. вообще говоря число выходит за пределы 32-х разрядов, однако младшие 32 разряда равны нулю. Ну вот скорее всего и выходит, что передаёшь ты в функцию почти всегда 0.

 

Только при чём здесь sid? Тебе нужен id коробки, а не sid.

 

А как я ранее предложил, чем не устраивает? У меня работает. Метки ставятся на всё, в чём оставишь предмет: на ящики, на живых сталкеров (после продажи им), на тушки. Осталось только проверить, что id принадлежит коробке, и твоя задача решена.

 

Где есть callback'и на партиклы и что каждый из них в отдельности представляет?

 

Партиклы - это визуальные эффекты такие. Что это такое можно почитать здесь. А как их создавать именно в сталкере написано здесь

 

Вообще говоря в списке коллбеков есть и action_particle (т.е. имеется константа callback.action_particle). Вот только не знаю, куда этот коллбек вешать. Примеров нет, надо экспериментировать.

 

Уважаемые, подскажите как вы снимаете координаты для спавна предметов и т.п. в "трудных местах"? Скажем предмет на полке или на шкафу.

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

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

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

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

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

 

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


Ссылка на сообщение
В СДК координаты не снимешь. Их там нет просто. Координаты появляются только после компиляции.

Сетки нет, возможно? Координаты есть. Ну или я что-то не понимаю. Вот на скринах левел едитора отчётливо видны всякие координаты=)

 

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

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

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

 

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


Ссылка на сообщение
class "grenade_binder" (obj)

Как минимум, ошибка здесь. В скобках должен стоять базовый класс. Т.е. должно быть так:

class "grenade_binder" (object_binder)

 

добавлено:

 

Взял тут поэкспериментировал сам. Добавил к гранате биндер и выяснил интересную вещь. Да, в самом деле когда кидаешь гранату она исчезает с концами. Однако вместо неё появляется другой объект-граната. И что самое интересное, у этого объекта нет серверной части.

 

ещё добавлено:

 

После экспериментов выяснилось, что этот второй объект ведёт себя в соответствии с параметрами explode_duration и destroy_time из профиля гранаты.

destroy_time - это время от броска до взрыва в миллисекундах

explode_duration - это время жизни гранаты после взрыва. Странный параметр. Собственно на взрыв не влияет никак. Но после взрыва граната ещё существует, хотя и не видна, идет апдейт. Только когда проходит указанное время вызывается её net_destroy и второй объект тоже исчезает. Вероятно, это надо для дымовых и газовых гранат.

Зачем было создавать вторую? Тоже непонятно. Возможно, так проще было сделать, что гранату нельзя после броска поднять.

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

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

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

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

 

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


Ссылка на сообщение
Для чего параметры:

wallmark_section

force_explode_time

up_throw_factor

в конфигах эффектов взрывов ганат для подствольника, балонов, канистр и т.п.

wallmark_section - хитмарк, текстура отметины от взрыва

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

up_throw_factor - что-то отвечающее за подкидывание вверх от взрыва.

 

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

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

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

 

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


Ссылка на сообщение
Кто-нибудь в курсе на какие файлы (и желательно параметры в них) влияет тот или иной выбор следующих компонентов при установке АМК мода:

Берешь и выясняешь сам. Для этого:

ставишь мод с дефолтовыми параметрами.

После установки переносишь каталог gamedata на другой физический диск (так сравниваться будет быстрее).

ставишь несколько раз мод с разными параметрами и смотришь, что изменилось. Установка мода со всеми патчами занимает пару минут.

После каждой установки сравниваешь два каталога с помощью Total Commandera. Там увидишь подробно, какие файлы, в каких каталогах отличаются. Там же можно посмотреть и какие строки в текстовых файлах отличаются.

Потом удаляешь gamedata и ставишь снова. Только за раз не меняй больше одного параметра.

 

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

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

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

 

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


Ссылка на сообщение
Люди подскажите подробно как сделать излома другом для сталкеров,экологов,долговцев,свободовцев,торговца а для бандюков,монолита,вояк,зомбяков был вражиной?
game_relations.ltx
не, там подробная таблица, в которой можно отрегулировать все. если сразу не получается, то поексперементируй

Народ, вы что? Излом же монстр! Монстры ко всем людям одинаково относятся. И таблица для них своя, там все люди одной строкой.

Не выйдет походу

 

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

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

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

 

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


Ссылка на сообщение
Нужно вызывать действие примерно раз в 10 секунд. (не 10 раз в секунду)

З.Ы, Забыл,я имел ввиду именно через actor_update.

как вариант, это можно реализовать таймером :)

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

last_time = 0
time_delta = 5000 -- пауза в миллисекундах
function actor_binder:update(delta)
    local tg = time_global()
    --local tg = game.time() -- а это в игровых еденицах
    if (tg - last_time) > time_delta then
        last_time = tg
        -- твоё действие
    end
    ...
end

не помогло.Надо чтобы излом атаковал солдат,бандит,монолит,зомби

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

 

local tbl = {
"a" = 1,
"b" = 2,
"c" = 3
}

Надо: получить 2е значение из таблицы при наличии у ГГ обьекта с секцией = 1му значению из таблицы.

Допустим, есть у тебя есть имя секции. Это строка, так что с кавычками - это правильно. Пусть имя секции будет "b". Теперь из таблицы можно получить число два для этого имени так:

local vvv = tbl["b"] -- в vvv запишется число 2

Таблица - это ассоциативный массив. Первое значение - это ключ (должен быть уникален), второе - любое значение. Если в таблице нет такого ключа (в данном случае имени секции), то получим nil.

 

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

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

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

 

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


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

Monnoroch

Я думаю, твой первый вариант почти правильный. Если я правильно понимаю все допущения, то достаточно вернуть первое попавшееся значение. В этом случае твой код лишь немного изменится:

function set()
    for k,v in pairs(tbl) do
        if db.actor:object(k) then
            return v -- нет смысла ждать до конца таблицы, возвращаем первое попадание
        end
    end
    return nil -- точно не помню, по дефолту кажется и так nil вернёт. Может и не надо явно return ставить.
end

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

 

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

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

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

 

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


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

типа такого

function set()
    local res = 0
    for k,v in pairs(tbl) do
        if db.actor:object(k) then
            res = math.max(res, v)
        end
    end
    return res -- вернёт 0, если попадания не было
end

 

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

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

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

 

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


Ссылка на сообщение
"k" - это счётчик, а "v" - это значения таблицы по индексу из счётчика. Так? Или наоборот?

for k,v in pairs (tbl) do

if db.actor:object(tbl[k]) then --tbl[k] равно v? Это вопрос такой

В конструкции

for k,v in pairs ...

k - это текущий ключ в таблице (собственно, потому эту переменную и называют обычно k, от key)

v - это соответствующее ему значение (опять же v - от value)

Там выше tbl[k] на самом деле равно v, но v у тебя и так есть. Зачем же получать его ещё раз?

 

Monnoroch

только что обратил внимание. В раннем посте у тебя было

local tbl = {
"a" = 1,
"b" = 2,
"c" = 3
}

Так работать не будет. Надо:

local tbl = {
["a"] = 1,
["b"] = 2,
["c"] = 3
}

С квадратными скобками. Это принципиально.

 

дополнил:

 

Если кто не знает. Конструкция вида:

t = {v1, v2, v3, и т.д.}

на самом деле эквивалентна конструкции:

t = {

[1] = v1,

[2] = v2,

[3] = v3,

и т.д.

}

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

Но ничто не мешает позже добавить в эту же таблицу значение, которое эту последовательность ключей нарушит.

 

и всё же я против того, чтобы значения (в вашем случае string) писать в ключи, а индексы в значения. структурирование кода в целом нарушается.

Мне думается, что здесь как раз такой случай, когда надо таблицу использовать именно как ассоциативный массив в чистом виде. Так что имя секции - совершенно нормальный ключ.

 

 

А как сделать бессмертие квестовым NPC, наприер Дэну?

 

Все квестовые неписи прописаны в all.spawn. Его надо разобрать, прописать им в соответствующие секции неуязвимость, собрать заново. Придётся начинать новую игру.

Можно найту тулзу, которая редактирует all.spawn без его разборки. Поищи сам на эту тему, или может кто подскажет. Опять же, придётся начать новую игру.

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

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

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

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

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

 

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


Ссылка на сообщение
malandrinus, можешь еще раз уточнить что делает функция math.max?

Разве она не выбирает из 2х значений большее?

 

В моем случае функция вполне может выбрать все 3 значения в таблице.(они все подойдут) и максимальное из них ТОЧНО будет как ты написал выбираться?

math.max на самом деле позволяет выбрать максимальное из нескольких значений. Типа такого:

local max_value = math.max(1,3,6,9)

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

 

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

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

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

 

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


Ссылка на сообщение
Но тогда почему каждый раз, когда актор попадает по неписю (в голову, руку, ногу, спину, торс, пальцы, стопы и пр.), то amount = 50?

Из разного оружия стрелял? А если попробовать методом hit?

 

А кто может поподробней расписать библиотечные функции типа math.?

Ну для них то есть расподробная документация. Это же стандартные функции Lua.

http://www.lua.ru/doc/5.html

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

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

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

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

 

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


Ссылка на сообщение
и вот ещё вещь интересная. коллбэк вызывается даже тогда, когда who не попал по obj, в данном случае amount = 0

Да, я обратил внимание. В некоторых местах есть проверка на нулёвость этого значения. Вероятно, это для хита от одного NPC к другому. Возможно, в этом случае движок вызывает этот колбек по факту выстрела "с намерением". В принципе логично, поскольку надо делать меньше проверок.

 

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

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

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

 

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


Ссылка на сообщение
Подскажите, как скриптом заставить сталекра бежать в панике, как если бы он был безоружным против вооруженного врага?
Смотрите АМК выброс=)Там заставили.

По моему, это разные задачи. Хотя бы потому, что при панике непись бежит не в конкретную точку, а куда подальше. Вроде как это схемами делается и надо просто схемы переключать. Но мне ещё самому разбираться и разбираться.

 

IQDDD,

насчёт health. Это в самом деле очень дурацкое свойство. На чтение - это здоровье, на запись - изменение здоровья.

Вообще, дизайн класса game_object просто потрясает. До знакомства со сталкером я думал, что представляю себе, как можно сделать плохо. Но я ошибался, совершенству нет предела =)

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

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

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

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

 

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


Ссылка на сообщение
Может глупый вопрос,но можно ли делать math.random(-1,-2)?

нельзя, будет ошибка с вылетом и сообщением "interval is empty".

 

Можно ли так:

local t = {2 + my_function(),3 + my_function()}

или так:

local t = {my_function(2),my_function(3)}

А что тут вообще криминального? Обычный массив, обычные значения для его инициализации. Это получится.

 

Я тебе искренне советую найти мой пост "тестирование скриптов без обрушения" и наладить подобный полигон. Для ТЧ он работает как часы. Ответ на подобные вопросы у тебя будет занимать секунд 20.

 

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

Как эти схемы вызывать, желательно из совершенно левого файла? И как потом вернуть обратно, как было?

Есть там такая вещь, называется generic схемы. Или вроде как они же называются универсальными. generic схемы как раз и отвечают за панику, бой и пр. Выброс в АМК походу тоже реализован как такая схема. Суть универсальной схемы в том, что даже если непись находится под управлением гулага или свой собственной логики он прервётся, сделает что надо и затем вернётся к выполнению старой задачи.

Схема - это весьма загадочная штука. Про схемы можно почитать здесь

Я пока не всё понял, но попробую изложить в двух словах то, что мне уже понятно.

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

Например, там должна быть функция add_to_binder с определённым списком аргументов, которая присобачит эту схему. Куда? Пока не знаю =)

далее в схеме есть два ключевых класса

первый - это условие (или евалуатор), унаследованный от property_evaluator

второй - это действие (или action), унаследованный от action_base

Точнее, там может быть набор таких классов.

в евалуаторе главным является один метод evaluate, фактически, весь класс существует ради этого метода. Метод возвращает true, если надо перейти в новое состояние. Например, начался выброс и надо делать ноги в укрытие.

action - это тоже класс, который существует главным образом ради одного своего метода execute. Это собственно то действие, которое и будет выполнено.

Действий там может быть несколько и условий несколько. Например,

выброс приближается - оглядеться

выброс начался - даём дёру

выброс продолжается - продолжаем прятаться

и т.д.

и соответственно существуют классы евалуаторов и действий на каждую пару.

Ну и как-то там эти классы регистрируются.

Это пока всё, что понял

 

добавлено:

надо ещё зарегистрировать схему в файле modules.script. Это делается функцией load_scheme

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

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

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

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

 

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


Ссылка на сообщение
IQDDD а можно его заспаунить?

Геометрию уровня динамически менять нельзя.

 

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

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

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

 

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


Ссылка на сообщение
Такая ситуация: Спавню предмет в инвентарь через alife():create(........)

Как мне тут же узнать ID заспавненного предмета?

local sobj = alife():create(...)
local id = sobj.id

 

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

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

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

 

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


Ссылка на сообщение
у всего, что находится в инвентаре есть только серверная часть.

Не совсем так. При спавне ты в принципе получаешь серверный объект, поскольку создание происходит на серверной части. Клиентской у свежезаспавленного объекта нет, ну по крайней мере до сих пор не было. Однако ничто не мешает ему перейти в онлайн при первой возможности. И вот как раз все объекты, которые я спавнил в свой инвентарь, переходили в онлайн. И никакими силами мне не удавалось их заставить в перейти оффлайн. Я это пытался сделать для принудительного навешивания аддона на ствол. Вот никак не хотели. Переводишь в оффлайн ствол в инвентаре, а он зараза не идёт =) Т.е. как бы формально переходит, но клиентский объект не удаляется. Выкидываешь его из инвентаря - вот тут и исчезает. Даже видно, как это происходит.

 

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

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

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

 

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


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

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