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

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

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

Лёха_тц.gif
Ссылка на комментарий

У меня вопрос при использовании ремарковой схемы у нпс.К примеру, анимация разговора нпс идет 4 секунды, звук идет 12.Будет ли в случае синхронизации анимации со звуком анимация и звук проигрываться нужные 12 секунд, а анимация не закончиться через 4?

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

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

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

 

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

 

А вообще лучше сам проверь, может там у схемы есть свои особенности.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Привет всем. Есть небольшой вопрос.

Допустим имеется предмет

local item = db.actor:object("ak74")

Для того чтобы заспавнить wpn_ с припиской ak74 (самопальная функция спавна в инвентарь), нужно написать так:

spawn_item_in_inv("wpn_"..item)

У нас заспавнится wpn_ + ak74, то есть wpn_ak74.

А как можно заспавнить предмет wpn_ak74 без приписки wpn_ ?

То есть если:

local item = db.actor:object("wpn_ak74")

То как отсюда отрезать wpn_ ?

 

Заранее спасибо.

 

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

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

demover123

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

 

Shadows

Не совсем понятно, что тебе требуется. заспавнить "ak74" ? или "wpn_" ?

 

AndreySol

Насколько знаю, напрямую никак. Только перебирать все элементы при чтении/записи и считать объем вручную.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Shadows

function CutWpn(name)
    return name:match('wpn_(.+)') or name
end

spawn_item_in_inv(CutWpn('wpn_ak47'))

Т.е. любое оружие с префиксом wpn_ "прогоняешь" через эту функцию.

Изменено пользователем Gun12
Ссылка на комментарий
AndreySol, получить просто - берешь декомпилятор, декомпилишь xrGame.dll и смотришь размер :) Для ТЧ - 8 Кб, для ЧН и ЗП - 16 кб. Pstor же в нет-пакет сохраняется, а других способов получить размер нет-пакета нет. Как и невозможно определить момент переполнения нет-пакета при записи.
Ссылка на комментарий

AndreySol

У GSC есть проверка на размер pstor-а. Она происходит в момент записи, и возможно, загрузки. Искать толи в xr_logic толи скорее в _g скрипте, где сейв проверяется (там есть такая функция, на слово save ищи)

 

Вот тока тебе это зачем надо? Там стоит стандартная проверка на превышение лимита. Игра вылетит сама. если такое случится.

 

Вот: _G.script

 

function set_save_marker(p, mode, check, prefix)
                ...
        if mode == "save" then
            local dif = p:w_tell() - save_markers[result]
            printf(result..": SAVE DIF: %s", dif)
            if dif >= 8000 then
                printf("WARNING! may be this is problem save point")
            end
            if dif >= 10240 then
                abort("You are saving too much")
            end

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
Вот: _G.script

function set_save_marker(p, mode, check, prefix)

чет нет у меня в _G.script такой ф-ции.

 

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

> чет нет у меня в _G.script такой ф-ции.

В ЧН точно есть. В ЗП должна быть. Про ТЧ не помню.

 

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

Да и вообще чтобы превысить лимит нужно постараться и сохранять в сейв какие то большие объёмы информации.

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

 

А вообще если не хочешь возится с пстором, можешь например напрямую в текстовые файлы всё записывать и считывать от туда при загрузке. Тут конечно свои тонкости, зато переполнения никогда не будет да и вся информация видна будет. В ЧН\ЗП есть импортированная область io для работы с файлами. в ТЧ тока с расширением движка от RvP

 

В любом случае я сказал как это делают в GSC.

Кстати сами они, по моим наблюдением, почти ничего в pstor не пишут. В ЧН я помню тока что он активно в схеме раненного используется, и в принципе всё.

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
Artos: Размер сохраняемого pstor НЕ дожен превышать ~8000 байт.

AndreySol: Значит есть способ этот размер получить ? Подскажите как ?

Уже в давние времена в моде AMK v1.xx, интенсивно использующем запись в pstor актора различных параметров мода, был написан алгоритм предварительной проверки размера сохранения относительно актора при помощи т.н. фейк-нет-пакета. Т.е. при записи вызывался алгоритм псевдо-записи и по результату этой проверки принималось решение - разгрузить pstor от избыточных данных или записывать как есть.

В ЧН и ЗП, самими разработчиками игры была введена чем-то схожая проверка, но только не как предварительная, а как часть реальной записи. Т.е. при превышении определенной квоты - игра просто вылетает с фатал-еррором (по abort'у), но не приводя к образованию испорченного сэйва.

 

Как же получить размер pstor'a, не дожидаясь фатальной ошибки или не дожидаясь собственно процесса записи?

В принципе довольно просто.

1. По кодам игры видно, что в pstor'ы объектов везде применяется структура записи каждого поля этой таблицы типа: [string] = value , т.е. ключи таблицы строго имеют тип строки, а значения - строки, числа или булева значения. Можно записывать конечно иначе - но тогда (см. п.2) произойдет фатальная ошибка при записи pstor'а.

2. Смотрим как же записывается этот pstor в сохранения в файле xr_logic.script (pstor_save_all).

Видно, что все записи из таблицы

- подсчитываются по кол-ву и это кол-во записывается в w_u32 (4 байта);

- каждый ключ записывается как строка (w_stringZ) - а это значит что кол-во байт равно кол-ву символов в строке + NULL ( str:len()+1 );

- далее, для каждого значения ключа в таблице записывается одно-байтовое значение (w_u8) типа данных этого значения (строка/число/булево);

- каждое значение в таблице соответствующего ключа записывается либо как строка (кол-во байт см. выше), либо как число (w_float) - а это 4 байта, либо как булево значение (w_bool) - это 1 байт.

Т.о. имея текущую табличку pstor'а несложно в любой момент вычислить кол-во байт потребное для хранения этой таблички в сэйвах (в нет-пакете объекта).

  local iSize = 4 --/ хранят кол-во записей в pstor
  for k,v in pairs(pstor) do
    iSize = iSize + k:len() + 1 --/ имя текущего ключа (переменной)
    local sType = type(v) --/ тип значения ключа (переменной)
    if sType == "number" then
      iSize = iSize + 1 + 4 --/ метка типа и число
    elseif sType == "string" then
      iSize = iSize +1 + v:len() + 1 --/ метка типа, строка и NULL
    elseif sType == "boolean" then
      iSize = iSize + 1 + 1 --/ метка типа и булево
    else
      printf("not saved type="..sType.." encountered")
    end
  end
  return iSize --/> кол-во потребных байт

 

 

Следует учесть, что в моих изначальных словах присутствует приближенность числа (~8000), т.е. ориентировочное значение для ТЧ. Это значение может коррелироваться в меньшую строну, т.к. в нет-пакет объекта записываются самые разные данные и их кол-во может быть значительным. Для ЧН/ЗП хотя порог максимальног значения объема pstor'а в два раза выше, но функция проверки при записи ограничивает этот порог. При >8000 байт в лог будет выдано предупреждение, а при >10240 - вызван abort() ...

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

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

 

Примечание: Ну а о том, что запись в pstor можно сжать (хотя и незначительно) - уже писал ранее.

Числа имеющие значения менее 65635 (а их в таблице немало) можно записывать не 4-мя байтами (w_float), а w_u16 или w_s16, что сэкономит по 2 байта накаждом значении. Но это потребует правки алгоритмов записи/чтения pstor'ов (о чем также ранее писал).

Также, из изложенного можно сделать выводы:

1. Имена переменным следует задавать как можно короче.

2. Строковые значения переменным также следует задавать как можно более короткими

3. Вместо 1 иль 0 в качестве флагов в pstor'e стОит применять булевы значения (true|false) , которые вместо 4-х байт требуют всего 1 при их записи.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Real Wolf

Это как я понимаю, инфа вроде такой: СВД в инвентаре лежит вверху слева, под ним АК, под ним экза. Не припоминаю методов позволяющих узнать такое. К тому же это расположение может самопроизвольно меняться движком. Пример: переодели комбез. Тот что сняли - окажется в самом низу инвентаря. Закрыли-открыли инвентарь - он уже далеко не внизу.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Real Wolf

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

Кто-то под этим понимает только рюкзак ...

Во вторых, если ты под 'расположение' понимаешь - в какой ячейке рюкзака/пояса что лежат - такое невозможно.

Все, что можно получить скриптами по данному вопросу - это использованием метода 'item_in_slot', узнать какой предмет в каком слоте и методом 'inventory_for_each' для ГГ, получить информацию - какие предметы в слотах, на поясе или в рюкзаке. Последнее возможно только специальным способом, которое подметил в свое время tolusha, т.е. спавном непосредственно перед итерацией по инвентарю специального 'сепаратора' (фейк-предмет), что позволяет разделить предметы на слотовые, поясныи и пр.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Кстати, я вот что хотел спросить по кустом дате. Как то в ЧН делал логику как вещам так и неписям. И обратил внимание что она работает тока с новой игрой (проверял на болотах, возможно не тока с новой а в момент спавна НПС но не суть), хотя сама логика вынесена в отдельный файл. Отчего это может быть? Неужели игра сохраняет всю логику в сейв, зачем это нужно?

 

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

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

*Shoker*

Есть 4 варианта прописать логику объекту:

1. Прописать ее в all.spawn в развернутом виде, т.е. указав все секции и параметры;

2. Прописать в all.spawn ссылку на файл с логикой;

3. Прописать в спавн-секции объекта (параметр 'custom_data') ссылку на файл с логикой;

4. При скриптовом спавне объекта прописать в 'custom_data' ссылку на файл с логикой;

 

При вариантах 1 и 3 вся логика прописывается в юзер-дату (нет-пакет) объекта и запоминается в сэйвах. Изменить ее возможно только 'ручками' (через нет-пакеты), т.е. правкой 'custom_data'.

При чем, в варианте 3 - при спавне объекта по указанной ссылке считывается вся логика и прописывается в 'custom_data' заспавненного объекта, т.е. прописывается не ссылка, а содержимое по указанной ссылке.

При вариантах 2 и 4 - логика может меняться простой правкой файла-логики, ссылка на который прописана в юзер-дате объекта.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

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