RAGE Multiplayer 1.0 Developer Preview #1 - Анонс обновления
Разработчики RAGE Multiplayer выпустили долгожданный анонс масштабного обновления. В которое войдёт новая синхронизация, загрузка серверных файлов, прорисовка объектов.

1.0. Developer Preview #1
Что будет показано в Developer Preview #2?

К сожалению, Developer Preview #1 не содержит всего материала 1.0 потому что он слишком большой, чтобы выпустить его сразу. С новой синхронизацией, новыми API и внутренними обновлениями. Нам нужно получить обратную связь от сообщества, и именно поэтому Developer Preview #1 включает 90% того, что ожидалось дольше всего, а Developer Preview #2 предоставит остальное, включая:

  • Graphics API: 3D и 2D;
С выходом обновления, графические файлы будут более «глубоко» встроены в игру, что позволит отображать материал в реальном мире. Например, пользовательские изображения, шрифты и т.д.
Примеры:
Пример #1, Пример #2

  • Audio API: клиентские источники звука 2D и 3D на основе звуковых файлов в клиентских пакетах.
  • Vehicles API overhaul: переработанный кастомный механизм; колеса API и многое другое;
  • Weapons API: получение и обновление параметров оружия; также поддерживает все виды оружия, а не только те, что из DLC
  • Water API: обновления воды через API во время выполнения
Developer Preview #2 выходит через неделю, и это единственный оставшийся релиз Developer Preview, который мы планируем для 1.0. Эти выходные являются предпочтительной датой, которые зависят от обратной связи для Developer Preview #1.

UI
  • Новый лаунчер

Видео

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

Видео

Синхронизация

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


Client console
Некоторые из вас, использовали ресурс клиентской консоли от @Kasimir, выпущенный еще в 2018 году. Он был интегрирован в новый пользовательский интерфейс, с некоторыми удобными файлами синхронизации/асинхронного ведения журнала API добавлено:
  • Добавлено: 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"
mp.events.add('consoleCommand', command => {
  mp.console.verbosity = 'info';
  mp.console.logInfo(`Received a command: ${command}`, true, true);
});
P2P
Partial Peer To Peer теперь присутствует в версии 1.0. Хотя эта функция отлично подходит для частных лобби (например, есть сервер, размещенный в Европе, но вы и ваш американский друг играете из одного города, в этих случаях задержка должна резко уменьшиться), она отключена по умолчанию из-за соображений конфиденциальности пользователей, по крайней мере, пока мы не добавим поддержку сетей ретрансляционных серверов. Триггеры P2P работают, даже если P2P отключен, и запросы отправляются через сервер.
  • Добавлено: client-side Player.call
  • Добавлено: client-side Player.p2pEnabled
  • Добавлено: client-side Player.p2pConnected
// 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"]);
  }
}

Прорисовка объектов

Благодаря интенсивному тестированию предыдущей версии «стримера», разработчикам удалось его улучшить. Теперь сервера смогут настраивать прорисовку отдельных объектов, изменять подачу огромных карт и управлять загрузкой транспорта.


Загрузка файлов сервера

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

  • Добавлено шифрование. Примечание: Вы должны учитывать, что как только данные загружаются на сторонний компьютер, вы никогда не можете быть уверены, что они будут расшифрованы, поэтому вы не должны делиться какими-либо конфиденциальными данными.
  • Добавлено сжатие ресурсов с настраиваемым уровнем сжатия. Это уменьшает не только пропускную способность передачи данных, но и занимаемое место на жестком диске!
  • Механизм CDN клиентских пакетов был переопределен, теперь его можно использовать!
  • Добавлено удаление устаревших ресурсов: после завершения загрузки в лаунчере он также проверяет всю папку ресурсов на наличие файлов с истекшим сроком действия.
Developer Preview #1 Обновления API
  • Добавлено: bool OnIncomingConnection(ip, serial, rgscName, rgscId), который вызывается перед окончательным подключием
  • Добавлено: "serverShutdown" событие для корректного завершения работы, в JS можно использовать mp.events.delayShutdown, чтобы все асинхронные вызовы были выполнены (в C# / C++ вам это не нужно по очевидным причинам):
mp.events.add("serverShutdown", async () =>
{
  mp.events.delayShutdown = true;
  await yourAsyncFunction();
  mp.events.delayShutdown = false;
});
  • Добавлено: ненадежные триггеры событий, на которые влияет потенциальная потеря пакетов, но они намного быстрее, когда вам нужны частые триггеры
// 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 entities. Вот пример использования dummy entities для создания простых серверных peds:
// 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 (клиентская сторона)
  • Добавлено: bool mp.Object.hidden (клиентская сторона)
  • Добавлено: float mp.Object.streamingRange (клиентская сторона)
  • Добавлено: bool mp.Object.notifyStreaming (клиентская сторона)
  • Добавлено: bool mp.Object.isWeak (клиентская сторона)
  • Добавлено: player.rgscId (не путайте с player.socialClub, который является именем, а не идентификатором)
  • Добавлено: mp.game.graphics.enableLights (клиентская сторона)
  • Добавлено: entity.forceStreamingUpdate() (для entity)
  • Добавлено: mp.game.streaming.forceStreamingUpdate() (для прорисовки)
  • Добавлено: player.setOwnVariable(key, value) - альтернатива entity.setVariable, что делает данные исключительно известными игроку. На стороне клиента игрока он обрабатывается как обычные общие данные, с помощью обычных методов и событий.
  • Добавлено: player.setOwnVariables(keyValuesObject)
  • Добавлено: player.getOwnVariable(key)
  • Добавлено: локальные межпространственные вызовы на стороне сервера (аналогично тому, что клиентская сторона получила с введением 0.3.7 C#):
// 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() для обработки
  • Обновлено: изменение данных обработчики имеют значение param после того, как добавлено через одно новое значение
  • Добавлено: теперь вы можете передавать двоичные буферы (ArrayBuffer для JS, byte[] для C#) через триггеры и общие данные
  • Добавлено: теперь вы можете передавать 64 битные целые числа (BigInt для JS, long для C#) через триггеры и общие данные
  • Добавлено: Клиентская сторона: mp.game.gxt.add(labelNameOrHash, newLabelValue)
  • Добавлено: Клиентская сторона: mp.game.gxt.get(labelNameOrHash)
  • Добавлено: Клиентская сторона: mp.game.gxt.getDefault(labelNameOrHash)
  • Добавлено: Клиентская сторона: mp.game.gxt.reset()
  • Добавлено: mp.Pool.getClosest(position[, num])
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 на автомобиль, чтобы покрыть шины; идентификаторы сидений теперь начинаются с 0 вместо -1, как это было раньше.
API: Обновления 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) (an alias of mp.trigger, for API design consistency purposes)
  • Добавлено: Клиентская сторона: Browser.call(eventName, arguments...)
Теперь также есть возможность кэшировать ваш код браузера, чтобы не перекомпилировать один и тот же код jаvascript браузера снова и снова:
  • Добавлено: Client-side: Browser.executeCached(string code)
API: Обновления JS
  • Общая оптимизация среды выполнения jаvascript, особенно синтаксический в API, пулы и многое другое
  • Исправлено player.eval когда среда выполнения JS отключена
  • Исправлено vehicle.dimension setter
  • Обновлено: entity.setVariable теперь поддерживает объекты для установки нескольких переменных одновременно
  • Добавлено: массив свойств только для чтения на стороне клиента mp.vehicles/players/markers/checkpoints/labels/colshapes.streamed
  • Модули ES6 теперь поддерживаются: используйте расширение файла mjs, чтобы включить его для сценариев, например index.mjs. "require()" по-прежнему совместим и работает даже в контексте модуля "ES6".
  • Добавлено: событие "packagesLoaded" для лучшей точки входа, когда все пакеты загружены и приступают к работе, используйте mp.события.delayInitialization, чтобы убедиться, что ваши асинхронные вызовы завершены до запуска "packagesLoaded":
// packages/module/index.js
mp.events.delayInitialization = true;

let asyncDone = false;

getAsync(() => 
{
    // async calls done, now let it invoke "packagesLoaded"
    mp.events.delayInitialization = true;

    asyncDone = true;
});

mp.events.add('packagesLoaded', () =>
{
    console.log(`async done: ${asyncDone}`);
});
  • Обновлено: mp.game.invoke был значительно переработан и теперь поддерживает различные возвращаемые значения и типы переменных (мы по-прежнему рекомендуем использовать *official* API, когда это возможно, для лучшей стабильности и производительности)
//
let phoneGestureAnimTime = mp.game.invokeFloat('0x47619ABE8B268C60', mp.players.local.handle);
let stateString = mp.game.invokeString('0x717E4D1F2048376D', mp.players.local.handle);
let bonePosVector = mp.game.invokeVector('0x44A8FCB8ED227738', mp.players.local.handle, boneId);

// You should use arrays with one element of required type to pass variable as a reference
let posixTime = { year: [0], month: [0], day: [0], hour: [0], minute: [0], second: [0] };
mp.game.invoke('0xDA488F299A5B164E', posixTime.year, posixTime.month, posixTime.hour, posixHour.minute, posixHour.second);

mp.gui.chat.push(`Year: ${posixTime.year[0]}`);

// that works for all types
let matrix = { r: [[0, 0, 0]], f: [[0, 0, 0]], u: [[0, 0, 0]], p: [[0, 0, 0]] };
mp.game.invoke('0xECB2FC7235A7D137', handle, matrix.r, matrix.f, matrix.u, matrix.p);

// ArrayBuffers could be used too
let outDataBuffer = [new ArrayBuffer(256)];
mp.game.invoke('0x79923CD21BECE14E', 0, outDataBuffer);
API: Обновления C#
  • На стороне сервера .NET Core dependency был обновлен до .NET Core 3.0; на стороне клиента .NET Core еще не обновлены из-за sand-boxed .NET Core fork
  • "Устаревшие" методы были удалены; некоторые из них возвращаются, хотя и с новой реализацией
  • Ядро API C# было перемещено в кодовую базу сервера для достижения большей гибкости и использования лучших реализаций API везде, где это возможно. Папка "Bridge" была переименована в "dotnet", имейте это в виду. C# API по-прежнему является необязательным, хотя и вы должны включить его через файлы конфигурации сервера в первую очередь.
  • Система Entity была повторно реализована и теперь на клиентской системе Entity C#, которая является более производительной. Это изменение не повлияло на пользовательский API.
  • Обновлено: улучшена производительность системы событий
  • Обновлено: entity.ResetData теперь возвращает логическое значение в соответствии с наличием данных с заданным ключом
  • Обновлено: entity != и == операторы теперь сравнивают ссылку на объект вместо идентификатора
  • Добавлено: entity.IsInstanceAlive (получает значение false, когда "entity" объект уничтожается)
  • Добавлено: entity.SetVariable не объектные перегрузки для определения типа времени компиляции
  • Обновлено: API Entity данных NAPI теперь использует Entity вместо NetHandle. NetHandle. OOP не изменился
  • Обновлено: триггеры/общие объекты данных теперь сериализуются через MsgPack, а не сериализатор Json, который мы использовали раньше. Обязательно обновите все свои классы с соответствующими атрибутами. Бонусная функция: вы можете использовать новую функцию передачи byte[], чтобы использовать типизированную сериализацию MsgPack для лучшей производительности
  • Обновлено: данные entity были обновлены для использования возможностей новой системы entity и теперь работают лучше
  • Добавлено: внешние данные для каждого объекта (до 16 объектов) для максимально быстрого и простого доступа к данным:
//
MyGamemodePlayerData obj = new MyGamemodePlayerData();

obj.level = 10;
obj.uid = 512;
obj.faction = 12;

player.SetExternalData(0, obj);

//
MyGamemodePlayerData obj = player.GetExternalData<MyGamemodePlayerData>(0);
  • Исправлено: player.SetClothes (dictionary variant)
  • Добавлено: Методы регистрации команд во время выполнения с помощью NAPI.Command.Register и NAPI.Command.Unregister
  • Добавлено: Возможность регистрации RemoteEvents во время выполнения с помощью NAPI.ClientEvent.Register и NAPI.ClientEvent.Unregister
  • Обновлено: все перечисления обновлены в настоящее время
  • Исправлено: несколько сбоев, связанных с keybind
  • Обновлено: мировые данные, данные entity и общие данные entity получили улучшения производительности благодаря множеству оптимизаций более низкого уровня, особенно в случае общих данных, что означает передачу сервера C++ в C# API.
Примечание: 1KK означает 1kk эталонных итераций, это не связано с количеством используемых данных. Каждый тип данных имеет свой собственный тестовый код.
  • Обновлено: удаленные события выполняются быстрее как для входящих, так и для исходящих триггеров
  • Обновлено: API пулов NetHandle на стороне сервера, отмеченные как устаревшие с версии 0.3.3, были удалены
  • Добавлено: потокобезопасная реализация триггеров удаленных событий была добавлена для: 1) глобальной трансляции; 2) конкретных игроков; 3) конкретного игрока. Обратите внимание, что это не только потокобезопасная реализация с внутренними блокировками, но и фактическая реализация без накладных расходов.
NetHandle netHandle = client.HandleCopy;

Task.Run(() =>
{
  // ....
  NAPI.ClientEvents.ThreadSafe.TriggerForAll("test_event", 0);
  NAPI.ClientEvents.ThreadSafe.TriggerFor(netHandle, "test_event", 1);
  NAPI.ClientEvents.ThreadSafe.TriggerToPlayers(netHandles, "test_event", 1);
});
  • Обновлено: C# улучшена производительность обработки команд
  • Добавлено: NAPI.Server.SetLogCommandParamParserExceptions
  • Добавлено: NAPI.Server.SetLogRemoteEventParamParserExceptions
  • Обновлено: NAPI.Vector3 был изменен с "class" на"struct"
  • Исправлено: одежда через SetCustomization
API: Обновления Client-side C#
  • Клиентский C# теперь включен по умолчанию!
  • Наш внутренний "sand-boxed" .NET Core fork был обновлен, чтобы доставить sand-boxing на низкую производительность
  • Для подробного руководства по устранению неполадок C# было добавлено всплывающее предупреждение в случае, если клиентское ядро .NET Core не удалось инициализировать
  • Исправлено: RAGE.Game.Invoker.Invoke
  • Добавлено: RAGE.NUI.UIMenuSliderItem
  • Исправлено: опечатка в marker.Visble на C#
  • Исправлено: client-side C# entity в удаленных событиях
  • Исправлено: pool.GetAtHandle
  • Исправлено: pool.Streamed
  • Добавлено: entity.ResetData
  • Добавлено: entity.HasData
  • Обновлено: добавлены дополнительные функции API игры, проверьте rage-sharp.xml для получения дополнительной информации
Server-sided Modding
  • Шифрование OpenIV-ish RPF теперь совместимо с RAGE Multiplayer, без дополнительного ручного перекодирования.
  • Server-sided DLC Pack loader был переписан, чтобы сделать загрузку быстрее. Теперь он должен загрузить все серверные моды в одно мгновение
  • Все файлы, связанные с игровым моддингом, теперь перемещаются в /game_resources. Например, путь к пакету DLC должен выглядеть следующим образом: /client_packages/game_resources/dlcpacks/customdlcpack/dlc.rpf
  • Был добавлен Server-Sided Modding™: теперь вы можете редактировать каждый файл игры и загружать его так же, как обычную игру *С модами* перед началом игры. Ваши игроки должны будут перезапустить игру при каждом обновлении контента, если эта функция включена на вашем сервере. Пример: /server/client_packages/game_resources/mods/common/data/gameconfig.xml
  • Добавлена локальная клиентская функция настройки лимита игрового движка. Использование "pool_overrides.ml" в ragempfolder/clientdata можно настроить любой лимит игры, который вы хотите, по его имени или хэшу. Вы не можете уменьшить существующие ограничения. Вот краткий пример:
<overrides>
  <pool name="fwLodNode">30000</pool>
  <pool hash="B81A5FEA">10000</pool>
</overrides>
ДИАГНОСТИКА
Лаунчер теперь имеет встроенный инструмент диагностики для автоматического обнаружения:
  • Конфликты программного обеспечения
  • Плохая установка
  • Плохие client-side файлы
  • Еще несколько вопросов, связанных с пользователем
В случае обнаружения проблемы вам будут предложены шаги по ее устранению.

РАЗНОЕ
  • Исправлены "undefined" ошибки jаvascript, не связанные с клиентскими скриптами или многопользовательским режимом RAGE Multiplayer
  • Рендеринг CEF был оптимизирован
  • Зависимость NodeJS была обновлена до 13.0.1
  • Client-side V8 зависимость была обновлена до версии 7.8
  • CEF зависимость обновлена до CEF 78.2.10 (Chromium 78.0.3904.70)
  • Оптимизация внутреннего пула entity, приводящая к повышению производительности наших внутренних компонентов, но также и некоторых связанных с entity API
  • Добавлен "node-commandline-flags" параметр конфигурации сервера, например: "node-commandline-flags": "--inspect"
  • Добавлен "resources-compression-level" параметр конфигурации сервера. Значение по умолчанию 1. Используйте 0 для локального сервера или более высокое значение для оптимизации пропускной способности.
  • Добавлен "fqdn" параметр конфигурации сервера, например "fqdn": "game-srv.rage.mp". Благодаря этой опции ваши игроки не заметят никаких изменений IP сервера, включая повторное использование загруженных файлов.
  • Добавлен "api-threading-debugging" параметр конфигурации сервера, например "api-threading-debugging": true. Если установлено значение true, он будет сообщать о каждом использовании API из правильного потока. Используйте его только для отладки, так как он добавляет некоторые накладные расходы процессора.
  • Реализация игрового нативного вызова функций была оптимизирована: теперь она в 2 раза эффективнее! Вот сравнительная таблица, которую мы опубликовали в нашем Discord несколько месяцев назад:
  • Запись голосового чата была повторно реализована для обеспечения лучшей производительности и стабильности
  • Внутренний рефакторинг был сделан для подготовки JS scripting runtime codebase для обновленного игрового API в следующих обновлениях (тот, который в настоящее время используется в C#)
  • Клиентская часть потоковой прорисовки игроков и транспортных средств была улучшена, чтобы уменьшить временной интервал от уведомления "прорисовки" до фактического физического создания, особенно когда речь заходит об обработке многих объектов одновременно
  • Исправлен вылет у Rockstar Editor
  • Обработка ввода CEF была улучшена для устранения конкретных проблем с кодировкой
Что нужно обновить в моих ресурсах, чтобы сделать его совместимым с обновлением?
  1. Убедитесь, что ваши ресурсы используют правильные идентификаторы(ID) сиденья (он начинается с 0, а не -1 больше)
  2. Только C#: убедитесь, что вы обновили синтаксис GetData
  3. убедитесь, что вы используете идентификаторы RGSC вместо никнеймов RGSC
  4. Может быть больше, обязательно проверьте это снова, если вы обнаружите проблемы несовместимости.
Загрузки:
  • Client (includes Windows Server)
  • Linux Server (не доступен для тестирования)
  • C# Package (Windows)
  • C# Package (Linux) (не доступен для тестирования)
Ссылки для скачивания будут доступны начиная с 6 ноября, 8 вечера!

Публичная сборка находится на пути к публикации.

UPD:
Сборка сервера, новый лаунчер с включенными ссылками на DLL C# доступны в ветке 10_experimental.

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

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наши сервисы
20 посетителей на сайте. Из них:
Пользователи7
Гости10
Роботы3
Список пользователей
hoklok Сейчас на сайте
TheRealTai Сейчас на сайте
ioioioii Сейчас на сайте
Alexey87 Сейчас на сайте
Wolfswerk Сейчас на сайте
archp Был(a) в сети 4 минуты назад
valera88 Был(a) в сети 14 минут назад

Как вы нас нашли?
Информация

Добро пожаловать на RAGE-MULTIPLAYER.RU!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт
Яндекс.Метрика
18+