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

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


Halford

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

-- Не забываем про патроны
Когда я спавнил стволы, они уже были с патронами. И вроде в сингле так всегда. Насчёт гранат не знаю.
 

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

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

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

 

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


Ссылка на сообщение
З.Ы. Я реализовал это с помощью amk.save_variable и amk.load_variable, мне просто интересно, существуют ли другие способы?
Нет других способов. Или точнее, нет способов, основанных на ином принципе. Если проследить, что там происходит, то мы увидим сохранение переменной нетпакетом в объекте актора. Делается это через объект-биндер. В принципе, ничто не мешает сохранять не в акторе, а в любом другом объекте. Иногда так и делается: для этого надстраивается биндер соответствующего объекта и при загрузке и сохранении там добавляется в нетпакет дополнительная информация. Но это имеет локальное применение - для дополнительных свойств конкретных объектов. А объект актора доступен всегда, поэтому в нём и удобно сохранять переменные общего характера.
 

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

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

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

 

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


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

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

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

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

 

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


Ссылка на сообщение
в ЧН можно писать данные в файл. В ТЧ только пакетом.
Если ты имеешь в виду сохранение переменных, то такой способ годится разве что для сохранения глобальных настроек мода.

Кстати, работает ли тестовый полигон для ЧН? Если работает, то надо будет оба варианта прописать в уроках по модостроению.

 

В файле character_desk_название уровня.ltx в профиле нового непися прописываем так:

Искал-искал... нашёл только \gamedata\config\gameplay\character_desc_....xml

 

if string.find(obj:section(),"medkit") then

Может лучше по clsid? Что-то вроде:

if obj:clsid() == clsid.obj_medkit) then

 

 

меченый(стрелок), ужо пробывал. При таком скрипте функция будет выполнятся как при съедении аптечки так и при ее выкидывании из рюкзака. :)

Выходит, без залезания в апдейт актора никак. Таймеры - это наверное уж слишком, но придётся делать подобно тому, как сделано в перепаковщике патронов. Там, помнится, при взятии предмета устанавливался глобальный флажок. И по этому флажку в ближайшем апдейте шла перепаковка.

Можно попробовать также и здесь:

1. по дропу предмета, если это аптечка, то ставим флажок и запоминаем id, возможно дописываем в массив. Можно ведь сразу много выкинуть.

2. в апдейте проверяем, если такого предмета нет - значит съели, если есть - значит просто выкинули.

 

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

 

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

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

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

 

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


Ссылка на сообщение
З.Ы. Видишь тут даже можно обойтись без актор_апдейта :)

А кто-нибудь знает как сделать таймер не используя функции АМК?

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

 

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

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

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

 

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


Ссылка на сообщение
вопрос такой, хочу уменьшить хэлс неписю в онлайне, это мона сделать только через нетпакет - выпихнув его в оффлайн перепаковать и обратно в онлайн? или есть другой способ? <_<

Здесь как раз всё намного проще. у game_object есть свойство health. Так что делаем так:

cobj.health = value -- именно так, с точкой

 

вот только для убийства этот метод ненадёжно работает. Даже если поставить health = -1, дохнут далеко не всегда, а иногда не сразу.

Кроме того, если непись валяется и аптечку просит, то даже если его health поднять - валяться не перестанет. Для этого есть метод game_object:wounded(boolean).

 

З.Ы.: Вообще-то, не грех бы за такими вопросами заглядывать в файл lua_help.script

 

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

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

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

 

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


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

Поставь "treasure_item"

 

Подскажите. Тут уже кто-то спрашивал про рамочки вокруг НПЦ и старую FN2000. В каком моде это реализовано ?

И еще... Если нельзя сделать в прицелах рамочки, то можно ли сделать скролинг увеличения на снайперках ?

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

 

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

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

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

 

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


Ссылка на сообщение
Как Сахарову разрешить покупку защитных костюмов,а то он не хочет покупать.

Про торговцев смотри шпаргалку из шапки.

 

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

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

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

 

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


Ссылка на сообщение
А кто бы выложил файл lua_heelp с комментариями,что какая функция\переменная значит.

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

 

Хотя конечно, подробный хелп бы не помешал. Кто бы ещё его составил? =)

 

1. Чем????????????7

2. КАК????

3. Его за это оштрафуют.....

1. Дизассемблером вестимо

2. Очень хлопотно

3. Кому это надо?

 

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

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

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

 

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


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

Rezonance, Вас не затруднит объяснить, в чём смысл Вашей подписи?

df6xsrTK75.png

 

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

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

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

 

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


Ссылка на сообщение
Есть таблица с кучей id.

Надо проверить,есть ли номер в таблице и вернуть тру\фолс.

Если надо определить принадлежность значения id к некоторому множеству (id1, id2, id3, ...), то наиболее эффективно это можно сделать так:

arr = {
id1 = true,
id2 = true,
id3 = true,
...
}
if arr[id] then

конструкция arr[id] возвращает true если такой ключ есть, и nil в противном случае. А nil в условных конструкциях интерпретируется как false.

 

Таблицы Lua - это на самом деле ассоциативные массивы. Это значит, что они представляют собой список пар (ключ, значение). Таким образом выражение

arr[k] означает "найти в таблице arr значение, соответствующее ключу k"

В частном лучае, если я создаю массив таким образом:

arr = {12, 34, 56, 78}

то ключ задаётся неявно в виде последовательности 1, 2, 3, 4, ...

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

Однако в общем случае таблица задаётся так:

arr = {
key1 = val1,
key2 = val2,
...
}

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

 

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

 

 

 

А можешь список костей вертолета выложить? И для БТР, если не сложно?

Окончательное решение вопроса с костями =)

Есть замечательная прога OGF Master. Живёт здесь. Автор DesweR. Последняя версия там не в шапке, а в одном из комментов.

Эта программа позволяет открыть ogf файл и конвертировать его в формат smd. Это текстовый формат, в начале там идёт список костей.

 

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

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

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

 

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


Ссылка на сообщение
Попробовал сделать "Тестирование скриптов ЧН без обрушения" так, как написано у вас в спойлере. Результат: вылет с пустым логом.
Я попробовал ещё раз. К сожалению должен констатировать: для ЧН методика работает плохо. Такое ощущение, что проблема в самом вызове pcall. Т.е. чанк из файла загружается, компилируется, а вот его выполнение с помощью защищённого вызова с pcall вызывает у игры тихую панику с непредсказуемыми последствиями. Вызов pcall заменить нечем - в нём сама суть методики.

Проблема также в том, что реакция на один и тот же код бывает разная. Ведёт себя как капризная невеста: иногда срабатывает, иногда тихо не срабатывает, иногда сразу после выполнения чанка идёт вылет без лога. Всё это весьма огорчительно. То, что в ТЧ работало как часы и экономило мне кучу времени, здесь не работает.

 

 

2. Как получить ближайший к точке, координаты который получены:

local a = vector()
a = db.actor:position()

level_vertex?

3. По по известному level_vertex'у определить его координаты.

level.vertex_position(id)

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

LVID Viewer (автор IG-2007)

 

4. Как перевести свободного НПС в данжер с опасностью в точке a.

5. Как перевести НПС, который находится в данжере, в свободное состояние так, чтобы он не переходил потом в данжер.

ЗЫ: как я понимаю, данжер - это универсальный комбат, так?

Да вроде универсальный комбат так и называется combat. Откровенно говоря, не до конца я разобрался с логикой. Но по моему разумению универсальные схемы срабатывают автоматом. Их там регистрируют в xr_logic.script и где-то там-же происходит их переключение по эвалуаторам. Не думаю, что правильно будет пытаться переключать универсальные схемы вручную, но наверное можно дописать дополнительные условия в эвалуатор.

 

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

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

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

 

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


Ссылка на сообщение
Как получить ближайший к точке a level_vertex? Перебирание вертексов исключено, так как очень налягает на производительность.

 

зы: нужно для того, чтобы спавнить неписей вокруг ГГ. НО: вдруг НПС стоит в какой-нибудь канаве! Тогда неписи заспавняться подземлёй! Конечно, они рано-или поздно выйдут из-под земли к ближайшему узлу в АИ сетке, но всё равно не есть айс.

Для этого есть специальные функции. Вот например:

level.vertex_in_direction(lvid, dir, rad)

game_object:vertex_in_direction(lvid, dir, rad)

lvid - вертекс, от которого ищем

dir - вектор направления

rad - радиус поиска

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

 

зы2: можно дать строго определения: класс, метод, свойство, объект?

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

Ну может здесь можно посмотреть некое краткое изложение.

 

Если по-простому:

Класс - это сложный (составной) тип данных. Наподобие сишной структуры или паскалевской записи, только содержащий не только переменные, но и функции.

Объект - это переменная типа класс.

Свойство - это переменная, содержащаяся в объекте

Метод - это функция, содержащаяся в объекте

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

 

Хороший пример - класс vector.

Имя класса - vector

Чтобы завести объект типа vector, надо выполнить конструкцию:

vec = vector()

здесь vec - это объект

теперь можно обращаться к свойствам объекта

x_coord = vec.x

vec.y = 4

или к его методам

vec:set_length(3.5)

 

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

 

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

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

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

 

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


Ссылка на сообщение
(изменено)
Народ, ЧТО я не правильно сделал:

if dik == DIK_keys.DIK_S then
            local mindist,i,obj,npc = 1000000
            for i = 1,65500 do
                obj = level.object_by_id(i)
                if obj == nil then
                    obj = alife():object(i)
                end

1. Почему только до 65500, а не до 65534? Впрочем, ошибки это не даст, просто пропустишь несколько объектов.

2. level.object_by_id(i) возвращает онлайновый объект, а alife():object(i) - офлайновый. С ними потом категорически не выйдет работать одинаково. Методы и свойства у них разные. Будет вылет на первом же не найденном свойстве/методе.

 

1. Как делать свои коллбеки.
Не совсем понятно, что ты имеешь в виду. Свои в каком смысле?

2. Как использовать self в своих скриптах? Что это мне даёт?
self - это объект, метод которого вызван.

Вообще, конструкция вида:

class_name:method_name(<список аргументов>)
    self ...
end

Синтаксически эквивалентна такой:

class_name.method_name(self, <список аргументов>)
    self ...
end

Т.е. self - это на самом деле скрытый первый аргумент

А делать с ним можно всё, что вздумается =)

 

3. У серверной аномалии класс cse_anomalous_zone. Какой класс у клиентской аномалии?

Почти у всех клиентский объектов класс один и тот же - game_object. Не стоит забывать ещё про класс биндера. который в некотором смысле расширяет game_object. Для АМК биндер находится в скрипте amk_anoms.script

4. Как проигрывать партикл, если известна точка, в которой должен проигрываться партикл?

 

Вообще партикл проигрывается с помощью класса particles_object. Собственно проигрывание начинается методом play_at_pos

Пример использования можно посмотреть в скрипте amk_particle.script

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

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

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

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

 

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


Ссылка на сообщение
1. Ну, например, коллбек на получение игроком кол-ва денег, меньшего 100 руб.
Не уверен, есть ли способ поймать именно факт получения денег. Но допустим на получение предмета и торговлю есть в биндере актора или сталкера колбеки:

on_item_drop

on_item_take

take_item_from_box

trade_perform_operation

trade_sell_buy_item

ну вот допустим купил ты пачку патронов и проверяешь в этом колбеке, сколько их там. Если меньше определённого, то выполняем некое действие.

 

2. Это чё, типа для того, чтобы методы можно было делать свои?
Это к какому вопросу относится?

 

3. Как? Сталкер и аномалия для игры одно и то же? Не видел аномалию с определённым кол-вом жизней.
=) А где ты видел сталкера, у которого есть методы get_anomaly_power() и enable_anomaly() ?

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

В общем имеем монструозный класс, у которого есть куча методов, и из этих методов применительно к конкретно взятому игровому объекту работают только некоторые. К примеру упомянутые get_anomaly_power и enable_anomaly для сталкеров работать не будут, скорее всего просто ничего не делают, а hide_weapon скорее всего не окажет никакого действия на аномалию или монстра.

 

4. Эхх... качать АМК надо. :)
Посмотри в папке scripts, может найдёшь примеры с этой функцией в родных скриптах. Я обычно использую поиск в Total Commandere файлов, содержащих нужную строку. в данном случае particles_object или play_at_pos.
 

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

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

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

 

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


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

 

Все, как узнать что онлайновый непись\монстер погиб в анамалии?
Колбек в биндере на смерть ставится в xr_motivator.script и bind_monster.script. Там вторым параметром идет объект - причина смерти.
 

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

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

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

 

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


Ссылка на сообщение
Все проще если позиция гранаты = позиции актора - значит ГГ огреб=)
Тогда уж надо рассчитывать урон в зависимости от расстояние до гранаты. И как здесь учесть возможность того, что ГГ сидит в укрытии?
 

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

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

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

 

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


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

Monnoroch, если граната у ГГ точненько под ногами, то ему уже не нужен колбек на её взрыв. Ему нужна последняя сохранёнка.

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

 

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

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

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

 

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


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

У АМК есть фунция amk_offline_alife.get_npc_weapon(npc), но во-первых она полагается на готовые таблицы из мода АМК, а кроме того там алгоритм выбирает оружие исходя из его огневой мощи, которую вычисляет там же находящейся функцией get_weapon_firepower(wpn). Так что не не факт, что этот выбор будет соответствовать действительности. И вообще, это похоже преимущественно для оффлайновых неписей.

 

Если знаешь способ узнать точно, какой ствол держит онлайновый NPC в руках, то это и будет лучшим ответом. По-моему, это обсуждалось не раз. Стоит наверное поискать.

 

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

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

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

 

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


Ссылка на сообщение
А в *.xml файлах существует чтото типа инклудов?

Разумеется в стандарте XML нет никаких инклюдов. Я так понимаю, что движок сначала прогоняет файлы через свой препроцессор, который собирает файлы в памяти, а только потом его парсит. Это относится и к LTX, и к XML файлам.

 

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

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

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

 

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


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

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

AMK-Team.ru

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