RAGE Multiplayer 1.0 Developer Preview #1 Релиз

Lev Angel

Developer
Команда форума
Скриптер
rage-mp.png
Это вольный перевод последней на данный момент новости с официального форума RAGE MP. Она вышла 6 ноября 2019 года.

Developer Preview #1? Что будет в #2?
К сожалению версия Developer Preview #1 не содержит всех возможностей, которые планируются для версии 1.0. Их слишком много, чтобы сделать все их сразу. С новой синхронизацией, новыми API и кучей внутренних доработок - нам нужно получить больше обратной связи от сообщества. Вот почему в версии DP #1 содержится 90% того, что больше всего ждали, а остальная часть будет уже в DP #2, включая следующие возможности (но не ограничиваясь ими):
  • Графическое API: 3D и 2D; 3D было полностью интегрировано в игру, чтобы отрисовывать вещи в игровом мире (кастомные картинки, шрифты, примитивы и т. п.).
image.png.a3e0945a2c0b13e346781ee646d74233.png
  • Аудио API: Клиентские 2D и 3D источники звука основанные на звуковых файлах из клиентских пакетов.
  • Переработка API транспорта: пользовательские настройки физики, API колес и др.
  • API оружия: получение и изменение характеристик всего оружия.
  • API воды: изменения воды в процессе выполнения.
Development preview #2 выйдет через неделю и это последний запланированный релиз перед версией 1.0.

UI
  • Новый интерфейс лаунчера
  • Новый интерфейс игрового меню, основан на лаунчере, с несколькими доработками для улучшения отображения в полноэкранном режиме.
  • Добавлена вкладка Избранное.
  • Добавлена вкладка История.
  • Список серверов в лаунчере теперь корректно отображает названия в юникоде.
  • Интерфейс теперь поддерживает более 25 языков.
  • Окно лаунчера теперь можно перетягивать👈.
  • Добавлен новый загрузочный экран. В будущем его можно будет кастомизировать под каждый сервер отдельно.
  • Браузер серверов теперь показывает пинг только до серверов которые есть во вкладках История и Избранное.
  • Доступ к микрофону и отладочный порт CEF теперь настраиваются в UI.
  • Добавлен режим совместимости в Red Dead Redemption 2!

Синхронизация
Была переработана синхронизация ходьбы и стрельбы: больше не должно быть дерганий, рассинхронов в определенных сценариях и большинства других проблем. Синхронизация транспорта была расширена на незанятый транспорт (урон и статус дверей).


Client console
  • Добавлено: client-side mp.console.clear()
  • Добавлено: client-side mp.console.reset()
  • Добавлено: client-side mp.console.verbosity
  • Добавлено: client-side mp.console.logInfo/logWarning/logError/logFatal(message[, save = false[, saveAsync = true]]);
  • Добавлено: client-side event "consoleCommand"
JavaScript:
mp.events.add('consoleCommand', command => {
  mp.console.verbosity = 'info';
  mp.console.logInfo(`Received a command: ${command}`, true, true);
});

P2P
Частичная поддержка P2P соединений присутствует в версии 1.0. Хотя эта функция отлично подходит для частных лобби (например, в Европе есть сервер, но вы и ваш американский друг играете из одного города, в этих случаях задержка должна резко уменьшиться), по умолчанию она отключена из-за соображений конфиденциальности пользователя, по крайней мере, пока мы не добавим поддержку сетей серверов ретрансляции. Триггеры P2P работают, даже если P2P отключен, а запросы отправляются через сервер.
  • Добавлено: client-side Player.call
  • Добавлено: client-side Player.p2pEnabled
  • Добавлено: client-side Player.p2pConnected
JavaScript:
// client 2
mp.events.add("private_message", (player, msg) =>
{
    mp.gui.chat.push(`${player.name} [${player.remoteId}]: ${msg}`);
});

// client 1
let receiver = mp.players.atRemoteId(playerId);

if(mp.players.local.p2pEnabled) // check if the player (local player in that case) allows p2p connections
{
  if(receiver.p2pConnected) // check if direct client-to-client connection is established
  {
      receiver.call("private_message", ["hello beast"]);
  }
}


Стример
Стример клиентских объектов, который вы уже вероятно видели, был портирован в эту ветку. Благодаря интенсивным тестам он получил ряд улучшений. В нем также добавлен клиентский API, который позволяет изменять настройки стриминга для каждого объекта отдельно. Существуют также некоторые настройки, позволяющие ускорить потоковую передачу огромных карт, состоящих из множества различных моделей, или, по крайней мере, обеспечить нулевой эффект для потоковой передачи игрока и транспортного средства.


Обновления подсистемы ресурсов
  • В дополнение к внутриигровому загрузчику ресурсов, мы добавили другой загрузчик прямо в лаунчер. Он на самом деле даже быстрее чем внутриигровой, так как не должен делиться ресурсами ПК с игрой. Не беспокойтесь: внутриигровой загрузчик остается на месте!
  • Добавлено шифрование.
  • Добавлено сжатие ресурсов с настраиваемым уровнем сжатия. Это уменьшает не только нагрузку на сеть, но и занимает меньше места на жестком диске!
  • Механизм CDN для клиентских пакетов был переработан. Теперь его удобно использовать!
  • Добавлено удаление устаревших ресурсов: после завершения загрузки в лаунчере также проверяется вся папка с ресурсами на наличие просроченных файлов.

Обновления API в Development Preview #1
  • Добавлено: bool OnIncomingConnection(ip, serial, rgscName, rgscId) которое выполняется перед финальным рукопожатием
  • Добавлено: Событие "serverShutdown" для корректного выключения, в JS вы можете использовать mp.events.delayShutdown чтобы позволить всем асинхронным вызовам выполниться (в C#/C++ вам это не нужно по объективным причинам):
JavaScript:
mp.events.add("serverShutdown", async () =>
{
  mp.events.delayShutdown = true;
  await yourAsyncFunction();
  mp.events.delayShutdown = false;
});

  • Добавлено: ненадежные триггеры событий, которые потенциально подвержены потере пакетов, но намного быстрее, когда вам нужны частые триггеры.
JavaScript:
// Server-side
player.callUnreliable(eventName[, args]);

mp.players.callUnreliable([players,] eventName, ...);
mp.players.callUnreliableInRange(eventName, ...);
mp.players.callUnreliableInDimension(eventName, ...);
// Client-side
mp.events.callRemoteUnreliable(eventName, args);

  • Добавлено: клиентское API для триггеров между игроками
  • Добавлено: dummy сущности. Вот пример создания простых серверных педов:
JavaScript:
// client-side
function initializeStaticPeds()
{
    mp.dummies.forEachByType(1337, (entity) => // loop though dummy entities with "dummy" id 1337
    {
      if(!entity.pedInstance)
      {
        entity.pedInstance = mp.peds.newLegacy(entity.getVariable("position"), entity.getVariable("heading"), (function(ped)
        {
          ped.taskPlayAnim(this.getVariable("animationDict"), this.getVariable("animation"), 8.0, 1.0, -1, this.getVariable("animationFlag"), 1.0, true, true, true);
        }).bind(entity), entity.dimension);
     
        entity.pedInstance.parentEntity = entity;
      }
    });
}

// server-side
function addStaticPed(model, position, heading, animationDict, animationFlag, animation, dimension)
{
  let entity = mp.dummies.new(1337, // dummy entity type
    dimension,
    { // initial shared variables
        heading: heading,
        animationDict: animationDict,
        animationFlag: animationFlag,
        animation: animation
      });

  entity.playAnimation = function(dict, anim) { this.setVariables({ animationDict: dict, animation: animation }); };

  return entity;
}

  • Добавлено: mp.objects.newWeak (client-side)
  • Добавлено: bool mp.Object.hidden (client-side)
  • Добавлено: float mp.Object.streamingRange (client-side)
  • Добавлено: bool mp.Object.notifyStreaming (client-side)
  • Добавлено: bool mp.Object.isWeak (client-side)
  • Добавлено: player.rgscId (не путать с player.socialClub которое является именем, а не ID)
  • Добавлено: mp.game.graphics.enableLights (client-side)
  • Добавлено: entity.forceStreamingUpdate() (для сущности)
  • Добавлено: mp.game.streaming.forceStreamingUpdate() (для всего потока)
  • Добавлено: player.setOwnVariable(key, value) - альтернатива к entity.setVariable, которая позволяет хранить данные только у игрока. На стороне игрока они обрабатываются как обычные данные, при помощи обычных методов и событий.
  • Добавлено: player.setOwnVariables(keyValuesObject)
  • Добавлено: player.getOwnVariable(key)
  • Добавлено: локальные межсерверные вызовы на стороне сервера (по аналогии с клиентскими):
Код:
// JS
mp.events.callLocal("event_name", [0, 5]);

// C#
NAPI.LocalEvents.Trigger("event_name", 0, 5);
  • Обновлено: API одежды теперь поддерживает весь модельный ряд
  • Добавлено: player.setHeadBlendPaletteColor(rgbColor, type); тип это значение от 0 до 3
  • Добавлено: player.getHeadBlendPaletteColor(type)
  • Добавлено: vehicle.customTires
  • Обновлено: объекты на стороне клиента теперь обрабатываются стримером на фрейме после создания, чтобы сделать несколько вещей более предсказуемыми для разработчиков ресурсов. Используйте entity.forceStreamingUpdate () для немедленной обработки.
  • Обновлено: обработчики изменения данных теперь содержат аргумент с старым значением, который добавляется после нового значения.
  • Добавлено: теперь вы можете передавать бинарные буферы (ArrayBuffer для JS, byte[] для C#) посредством триггеров и общих данных.
  • Добавлено: теперь можно передавать 64 битные числа (BigInt для JS, long для C#) посредством триггеров и общих данных.
  • Добавлено: Client-side: mp.game.gxt.add(labelNameOrHash, newLabelValue)
  • Добавлено: Client-side: mp.game.gxt.get(labelNameOrHash)
  • Добавлено: Client-side: mp.game.gxt.getDefault(labelNameOrHash)
  • Добавлено: Client-side: mp.game.gxt.reset()
  • Добавлено: mp.Pool.getClosest(position[, num])
JavaScript:
let player = mp.players.getClosest([0,0,0]);
console.log(player.id);

let players = mp.players.getClosest([0,0,0], 2);
console.log(players[0].id);

let allPlayersSortedByDistanceToPoint = mp.players.getClosest([0,0,0], mp.players.length);
  • Был переработан API серверного оружия игроков для правильной работы с пользовательскими модами, а также для устранения связанных с этим проблем. Все изменения были внутренними и не нарушили совместимости в ресурсами.
  • Работа с пассажирами на стороне сервера была также переработана для повышения безопасности и надежности. Все связанные с этим ошибки были исправлены. Ключевые изменения: setOccupant (seat, null) теперь выкидывает игрока с указанного места, если оно указано; обновлена обработка габаритов транспорта; лимит пассажиров увеличен до 16 на транспорт для покрытия автобусов; id сидений теперь начинается с 0 вместо -1, как это было раньше.

Обновления CEF
Была добавлена система событий CEF, аналогичная существующей системе событий JS API, которая является более безопасной и более эффективной (хотя и не в каждом конкретном случае) альтернативой Browser.execute.
  • Добавлено: CEF: mp.events.add(string eventName, function handler)
  • Добавлено: CEF: mp.events.reset()
  • Добавлено: CEF: mp.events.remove(string eventName)
  • Добавлено: CEF: mp.events.call(string eventName) (псевдоним к mp.trigger)
  • Добавлено: Client-side: Browser.call(eventName, arguments...)
Также теперь есть возможность кешировать ваш выполненный браузерный код, так что в текущем браузере JS код не будет перекомпилировать каждый раз.
  • Добавлено: Client-side: Browser.executeCached(string code)





Источник: rage mp
 
Последнее редактирование:
Яндекс.Метрика
Верх