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

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


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

TREWKO это для чего функция чтобы излом друг был чтоли???

 

Добавлено:

А понял для того чтобы удалить.Спасибо

 

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

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

Expression : fatal error

Function : CScriptEngine::lua_error

File : D:\xray-svn\xr_3da\xrGame\script_engine.cpp

Line : 74

Description : <no expression>

Arguments : LUA error: c:\games\stalker\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

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

Я ДатчикХабара со stalker-portal

Ссылка на комментарий

Prapor11,

Вылет при убийстве

Это знаменитая ошибка:

Arguments  : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........

Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.

Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной

local killCountProps = {...}

в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:

cat_weak = 1, cat_normal = 2, cat_strong = 3,

Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:

monster_classes = {

кошек нет и здесь, добавляем:

[clsid.cat_s] = "cat",

Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.

Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:

· is_object_monster(obj)

кошек нет, добавляем рядом с собаками:

otype == clsid.cat or

· IsMonster (object, class_id)

кошки есть, ничего не трогаем.

Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку

cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")

и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился

 

 

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий

Клас.А ещё вопрос про иконку там написана ui_npc_monster_fracture как правильно нарисовать ему иконку???Точнее как правильно узнать координаты иконок,так как я умею их рисовать

 

Добавлено:

RvP спасибо тебе

Я ДатчикХабара со stalker-portal

Ссылка на комментарий
Prapor11, только ето не последний вылет, дальше будет вылет при обыске. для иконок http://www.amk-team.ru/forum/index.php?showtopic=1506 а вообще лутше почитай еще статьи на вики и сталкер-портале

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий

RvP а с отношения так и не получилось в таблице отношений только два параметра для монстра излома хюман-человек актор-эктор меченный

 

Добавлено:

Ну излом у меня друг теперь

 

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

Всё разобрался тебе спасибо там был файл ui_npc_monster

и в него заносяться координаты

Я ДатчикХабара со stalker-portal

Ссылка на комментарий

RvP это я знаю.Я имел виду для монстряков.А расширить таблицу это увеличить разрешение?

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

Я ДатчикХабара со stalker-portal

Ссылка на комментарий

RvP я тебе про картинку излома говорил.А насчёт отношений добавить секцию с изломом в таблицу группировок я пробывал ничего не получилось.

Я ДатчикХабара со stalker-portal

Ссылка на комментарий

Prapor11

В моде ABC+ЭЮЯ в последней версии можно было "нанимать" монстров, ознакомься в тамошней реализацией, может пригодится.

И сидели бы сейчас вышеозначенные любители больших подписей в маленьких файлах, в байт-коде ковырялись, если не в машинном...

Ссылка на комментарий

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

Не подскажете,как это можно сделать?

 

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

Изменено пользователем Monnoroch
Ссылка на комментарий

Получилось сделать излома другом для human и actor,а добавление строчки fracture со своим номером в раздел

;названия группировок

communities

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

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

Я ДатчикХабара со stalker-portal

Ссылка на комментарий

local tbl = {
"a" = 1,
"b" = 2,
"c" = 3
}
function set()
local s
for k,v in pairs(tbl) do
if db.actor:object(k) then
s = v
end
end
return s
end

 

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

Я все правильно сделал? (у меня просто еще нет опыта работы с таблицами,вот и спрашиваю)

Изменено пользователем Monnoroch
Ссылка на комментарий

Monnoroch, если тебе надо получить "1" Если у ГГ есть предмет "a", ну и так далее, то все правильно, но кавычки в таблице не нужны, по-моему, у меня без кавычек работает такая фишка:

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

Изменено пользователем 8push5
Возможно всё, ну или почти всё.
Ссылка на комментарий
Нужно вызывать действие примерно раз в 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

 

Ссылка на комментарий

malandrinus, то,что ты написал я знаю.Это я б и не спросил.

Мне надо именно мой случай - так,как написал ты, там не подступишься (vvv = tbl["b"] -- вот так).

У меня придется делать for...do.

И я спрашивал,правильно ли я сделал?

 

Собственно я просто хочу заменить конструкцию:

local t = 0
if db.acror:object("a") then t = 1 end
if db.acror:object("b") then t = 2 end
if db.acror:object("c") then t = 3 end
return t

На более грамотную.И общую.

 

И еще вопрос:если я все сделал правильно,то как будет вести себя функция,если есть и "a" и "с" у ГГ?

Вышеприведенный код вернет наибольшее число(и это правильно), а что будет с обработкой таблицы?

Изменено пользователем Monnoroch
Ссылка на комментарий
Monnoroch, функция вернет последнее обработанное и удовлетворяющее условиям, то есть если есть "a" и "b" то скорее всего (если "b"=2) вернет 2, но сначала завершиться обработка таблицы.
Возможно всё, ну или почти всё.
Ссылка на комментарий

Народ, делайте как раньше (и как проще): в массивах с числовыми индексами. Вот и всё. Вместо for k,v in pairs (asd) do используйте обычный цикл for k,v do. Так надёжнее. :)

 

Monnoroch,

local t = 0
if db.acror:object("a") then t = 1 end
if db.acror:object("b") then t = 2 end
if db.acror:object("c") then t = 3 end
return t

 

Вотъ(таблица ТОЛЬКО с числовыми индексами):

 

function what_for_this_function (tbl)
    if tbl ~= nil then
        for k,v in pairs (tbl) do
            if db.actor:object(tbl[k]) then
                return tbl[2]
            end
        end
    else
        return false
    end
end

Изменено пользователем IQDDD
Ссылка на комментарий

IQDDD, return tbl[2] - это че?

Может return tbl[v] ?

Ато вдруг у меня так:

local t = 0
if db.acror:object("a") then t = 79 end
if db.acror:object("b") then t = 90 end
if db.acror:object("c") then t = 24 end
return t

Изменено пользователем Monnoroch
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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