RageMP/Changelog

Материал из Pawno Info Wikipedia

Журнал изменений

Wiki note.png

Примечание

Примечание: эта страница устарела. Следите за обновлениями на наших форумах: Pawno-Info.Ru


0.3.7

События

public class EventsExample : RAGE.Events.Script
{
	public EventsExample()
	{
		// такие события получают mp.trigger, mp.events.callLocal, а также удаленные события
		RAGE.Events.AddEvent("remote_triggerable_event", SomeEvent);
		RAGE.Events.AddDataHandler("some_data", SomeDataHandler);
		RAGE.Events.Tick += Tick;
		RAGE.Events.OnPlayerChat += ChatHandler;
		// вызвать событие js
		RAGE.Events.CallLocal("eventName", 1, "someString", 1.0f);
	}
  
	public void SomeEvent(object[] args)
	{
	}
  
	public void SomeDataHandler(RAGE.Elements.Entity entity, object value)
	{
	}
  
	public void ChatHandler(string text, RAGE.Events.CancelEventArgs cancel)
	{
		if(text == "cancelme")
		{
			cancel.Cancel = true;
		}
	}
  
	// известный как "рендеринг" в JS
	public void Tick(System.Collections.Generic.List<RAGE.Events.TickNametagData> nametags)
	{
	}
}

Игровое взаимодействие

// тривиальные игровые штуки
int interior = RAGE.Game.Interior.GetInteriorFromCollision(0.0f, 0.0f, 0.0f);

// взаимодействие с игроком
RAGE.Elements.Entities.Players.GetAtRemote(1).ClearDecorations();

// взаимодействие игрока с использованием дескриптора игрового объекта
RAGE.Game.Ped.ClearPedDecorations(RAGE.Elements.Player.LocalPlayer.Handle);

// пед создание
uint freeroamHash = RAGE.Game.Misc.GetHashKey("mp_m_freemode_01");
RAGE.Elements.Ped ped = new RAGE.Elements.Ped(freeroamHash, new RAGE.Vector3(0.0f, 0.0f, 0.0f), dimension: 5);

CEF

...
  
public void OurEventHandler(object[] args)
{
	RAGE.Chat.Output("Got actually called! {0}", (string)args[0]);
}
  
public void TriggerMe()
{
  	RAGE.Events.Add("eventExample", OurEventHandler);
  
	RAGE.Ui.HtmlWindow wnd = new RAGE.Ui.HtmlWindow("package://index.html");
 	wnd.ExecuteJs("mp.trigger('eventExample', 'yep')");
  
  	// "mp.gui.execute"
  	RAGE.Ui.DefaultWindow.ExecuteJs("test()");
}

Встроенный NATIVEUI

using System;
using System.Collections.Generic;
using RAGE.NUI;

public class MenuExample
        : RAGE.Events.Script
{
    private bool ketchup = false;
    private string dish = "Banana";
    private MenuPool _menuPool;

    public void AddMenuKetchup(UIMenu menu)
    {
        var newitem = new UIMenuCheckboxItem("Добавить кетчуп?", ketchup, "Хотите добавить кетчуп?");
        menu.AddItem(newitem);
        menu.OnCheckboxChange += (sender, item, checked_) =>
        {
            if (item == newitem)
            {
                ketchup = checked_;
                Notify("~r~Ketchup status: ~b~" + ketchup);
            }
        };
    }

    public void AddMenuFoods(UIMenu menu)
    {
        var foods = new List<dynamic>
        {
            "Банан",
            "Яблоко",
            "Пицца",
            "Quartilicious",
            0xF00D, // Dynamic!
        };
        var newitem = new UIMenuListItem("Food", foods, 0);
        menu.AddItem(newitem);
        menu.OnListChange += (sender, item, index) =>
        {
            if (item == newitem)
            {
                dish = item.IndexToItem(index).ToString();
                Notify("Preparing ~b~" + dish + "~w~...");
            }

        };
    }

    public void AddMenuCook(UIMenu menu)
    {
        var newitem = new UIMenuItem("Готовить!", "Приготовьте блюдо из подходящих ингредиентов и кетчупа.");
        newitem.SetLeftBadge(UIMenuItem.BadgeStyle.Star);
        newitem.SetRightBadge(UIMenuItem.BadgeStyle.Tick);
        menu.AddItem(newitem);
        menu.OnItemSelect += (sender, item, index) =>
        {
            if (item == newitem)
            {
                string output = ketchup ? "Вы заказали ~b~{0}~w~ ~r~с~w~ кетчупом." : "Вы заказали ~b~{0}~w~ ~r~без~w~ кетчупа.";
                Notify(String.Format(output, dish));
            }
        };
        menu.OnIndexChange += (sender, index) =>
        {
            if (sender.MenuItems[index] == newitem)
                newitem.SetLeftBadge(UIMenuItem.BadgeStyle.None);
        };
    }

    public void AddMenuAnotherMenu(UIMenu menu)
    {
        var submenu = _menuPool.AddSubMenu(menu, "Another Menu");
        for (int i = 0; i < 20; i++)
            submenu.AddItem(new UIMenuItem("Заполнитель страницы", "Пример описания, занимающего более одной строки. Более того, он занимает больше двух строк, так как оно такое длинное. Вау, посмотри на эту длину!"));
    }

    public void DrawMenu(System.Collections.Generic.List<RAGE.Events.TickNametagData> nametags)
    {
        _menuPool.ProcessMenus();
    }

    public MenuExample()
    {
        _menuPool = new MenuPool();
        var mainMenu = new UIMenu("Native UI", "~b~NATIVEUI SHOWCASE");
      
      	// оригинальный NativeUI копирует "меню взаимодействия" GTA V, 
      	// изменение FreezeAllInput на true делает игрока полностью замороженным
      	// пока меню активно
        mainMenu.FreezeAllInput = true;
      
        _menuPool.Add(mainMenu);
        AddMenuKetchup(mainMenu);
        AddMenuFoods(mainMenu);
        AddMenuCook(mainMenu);
        AddMenuAnotherMenu(mainMenu);
        _menuPool.RefreshIndex();

        RAGE.Events.Tick += DrawMenu;

        mainMenu.Visible = true;
    }

    public static void Notify(string text)
    {
        RAGE.Game.Ui.SetNotificationTextEntry("STRING");
        RAGE.Game.Ui.AddTextComponentSubstringPlayerName(text);
        RAGE.Game.Ui.DrawNotification(false, false);
    }
}
  • JS: событие entityDataChange заменено на mp.events.addDataHandler (key, handler)
  • JS: добавлен mp.events.callLocal
  • Улучшения начальной загрузки сервера
  • Исправлена ошибка, из-за которой голосовой чат не очищался должным образом после установки для "voice3d" значения false
  • Улучшен механизм синхронизации потоков воспроизведения голосового чата, чтобы он не влиял ни на что другое
  • Исправлены сообщения о сбоях голосового чата
  • Бэкпорт улучшения производительности взаимодействия с игрой 0.4
  • Исправлена ошибка, из-за которой пользовательский интерфейс в игре не сохранял "последний подключенный IP-адрес" правильно
  • Исправления поддержки DataStorage UTF-8
  • Добавлена более плавная обработка потери пакетов голосового чата.
  • Исправлены сообщения о проблемах со стабильностью голосового чата
  • Исправлены некоторые определенные задачи удаленного игрока, которые зависали после завершения
  • Добавлен флаг "экспериментальные функции веб-платформы" во внутриигровой CEF.
  • Исправлены проблемы с привязкой клавиш с isDown param = false

0.3.6

Общие изменения

  • Добавлено: голосовой чат на основе сервера (опция конфигурации сервера для включения: `voice-chat`: true)
  • Обновлено: улучшения стабильности скриптов («неопределенные» ошибки должны быть исправлены сейчас, нуждаются в подтверждении)
  • Обновлено: V8 (теперь на стороне клиента используется отдельная ванильная версия, а не та, которая связана с NodeJS)
  • Обновлено: улучшения безопасности.
  • Добавлено: поддержка патча 1.45 для Grand Theft Auto V.
  • Вновь реализовано исправление "краха зоны строительства".
  • Регулировка ограничения модели автомобиля (это не реальный бэкпорт 0,4, поскольку он использует другой метод, который не полагается на функции 0,4)
  • Обновлен NodeJS
  • Встроенная защита от дурака
  • Добавлена ​​опция «разрешить ввод голосового чата» (на данный момент доступна только через реестр); значение по умолчанию: 1
  • Обновлено: CEF (Chromium 70.0.3538.77)
  • Исправлено: возможное повреждение данных синхронизации прицеливания.
  • Добавлено: больше игровых ограничений были скорректированы, поэтому теперь совместимо больше глобальных модов конверсии.
  • Исправлено: пользовательские пакеты дополнений конфликтуют с определенными пакетами дополнений к игре.
  • Исправлено: пакеты dlc некорректно работали с FQDN.
  • Разные исправления

Сценарии

  • Добавлено: mp.voiceChat.muted (на стороне клиента)
  • Добавлено: mp.voiceChat.getPreprocessingParam (param) (на стороне клиента)
  • Добавлено: mp.voiceChat.setPreprocessingParam (параметр, значение) (на стороне клиента)
  • Добавлено: player.voiceVolume (на стороне клиента)
  • Добавлено: player.voice3d (на стороне клиента)
  • Добавлено: player.voiceAutoVolume (на стороне клиента)
  • Добавлено: player.isVoiceActive (на стороне клиента)
  • Добавлено: событие: playerStartTalking (на стороне клиента)
  • Добавлено: событие: playerStopTalking (на стороне клиента)
  • Добавлено: player.enableVoiceTo (target) (на стороне сервера)
  • Добавлено: player.disableVoiceTo (target) (на стороне сервера)
  • Добавлено: player.voiceListeners (на стороне сервера)
  • Добавлено: mp.voiceChat.isAllowed (только для чтения) (на стороне клиента)
  • Добавлено: player.clearDecorations () (на стороне сервера)
  • Добавлено: player.getVoiceAttribute (атрибут) (на стороне клиента)
  • Добавлено: player.setVoiceAttribute (атрибут, значение) (на стороне клиента)
  • Исправлено: vehicle.getOccupant
  • Обновлено: перечисления C #
  • Исправлено: улучшения поддержки C # UTF-8.

0.3.4

  • Добавлено: player.getDecoration (сборник)
  • Добавлено: player.setDecoration (сборник, оверлей)
  • Обновлено: player.setHeadOverlay (overlayId, [индекс, непрозрачность, цвет, secondaryColor])
  • Обновлено: player.getHeadOverlay
  • Обновлено: mp.game.graphics.screen2dToWorld3d (x, y [, collisionTest])
  • Обновлено: теперь аргументы событий щелчка (x, y, state, mouseKey, relativeX, relativeY, 3dpos, entityHandle)
  • Исправлено: проблемы с отображением текстовых меток.
  • Исправлено: общие переменные не сбрасывались для локального игрока на стороне клиента после повторного подключения.
  • Исправлено: проблема с неверным паролем
  • Исправлено: playerWeaponShot не срабатывает, когда нет цели

RC-2

  • Обновлено: все аргументы удаленного триггера теперь должны передаваться в виде массива, например player.call ("eventName", [1, 2, 3]). Он был обновлен только для серверного API, как для RC-2.
  • Добавлено: vehicle.quaternion
  • Добавлено: vehicle.heading
  • Добавлено: «это» к событиям. Он включает свойства «отменить» и «обработчик». Установка this.cancel = true прекратит запуск следующих событий этого вызова.

RC-1

  • Добавлено: Vehicle.movable (получить)
  • Обновлено: mp.environment теперь mp.world
  • Добавлено: mp.world.requireIpl
  • Добавлено: mp.world.removeIpl
  • Добавлено: mp.world.trafficLights.locked (получение / установка)
  • Добавлено: mp.world.trafficLights.state (получение / установка)
  • Добавлен Player.removeObject

Клиентские обновления

  • Добавлено: mp.gui.cursor.show (видимость, freezeControls)
  • Добавлено: Entity.getVariable
  • Добавлено: Entity.setVariable
  • Добавлено: mp.vehicles.new
  • Добавлено: mp.objects.new
  • Добавлено: mp.pickups.new
  • Добавлено: mp.markers.new
  • Добавлено: mp.blips.new
  • Добавлено: mp.checkpoints.new
  • Добавлено: mp.labels.new
  • Обновлено: mp.game.graphics.drawText (текст, позиция [, additionalArgs])
  • Добавлено: Vehicle.setHandling (имя, значение)
  • Добавлено: mp.discord.update (подробный статус, состояние)
  • Добавлено: mp.game.cam.getGameplayCamRelativeHeading.
  • Добавлено: Entity.remoteId
  • Добавлено: pool.atRemoteId

Обновления событий

  • Добавлено: Events.getAllOf (eventName)
  • Добавлено: Events.remove (eventName [, hander])
  • Добавлено: Events.reset ()

Обновления игрока

  • Добавлено: Player.weapons (задокументировано ниже)
  • Добавлено: Player.removeWeapon (оружие)
  • Добавлено: Player.removeAllWeapons ()
  • Добавлено: Player.weapon (получить / установить)
  • Добавлено: Player.weaponAmmo (получить / установить)
  • Добавлено: Player.getWeaponAmmo (оружие)
  • Добавлено: Player.setWeaponAmmo (оружие, боеприпасы)
  • Добавлено: Player.allWeapons (получить)
  • Добавлено: Player.getHeadOverlay (id)
  • Добавлено: Player.setHeadOverlay (id, [overlayId, opacity])
  • Добавлено: Player.socialClub (получить)
  • Добавлено: Player.isStreamed (игрок)
  • Добавлено: Player.streamedPlayers (получить)
  • Добавлено: Player.isReloading (получить)
  • Добавлено: Player.isOnLadder (получить)
  • Добавлено: Player.isInMelee (получить)
  • Добавлено: Player.packetLoss (получить)

Всплывающие обновления

  • Добавлено: Blip.shortRange (получение / установка)
  • Добавлено: Blip.drawDistance (получение / установка)
  • Добавлено: Blip.rotation (получение / установка)
  • Обновлено: Blip.colour => Blip.color (получить / установить)
  • Удалено: mp.blips.newStreamed // используйте .new () с drawDistance (см. Ниже)
  • Обновления TextLabel (включая методы сущностей)
  • Добавлено: TextLabel.color (получение / установка)
  • Добавлено: TextLabel.drawDistance (получение / установка)
  • Добавлено: TextLabel.los (получение / установка)
  • Добавлено: TextLabel.text (получение / установка)

Обновления автомобилей

  • Добавлено: Vehicle.mods [id] (get / set) // также доступно как Vehicle.get / setMod (id) с версии 0.3
  • Добавлено: Vehicle.extras [id] (получить / установить)
  • Добавлено: Vehicle.isStreamed (игрок)
  • Добавлено: Vehicle.streamedPlayers.
  • Добавлено: Vehicle.dashboardColor (получение / установка)
  • Добавлено: Vehicle.pearlescentColor (получить / установить)
  • Добавлено: Vehicle.livery (получить / установить)
  • Добавлено: Vehicle.numberPlateType (получить / установить)
  • Добавлено: Vehicle.trimColor (получение / установка)
  • Добавлено: Vehicle.windowTint (получение / установка)
  • Добавлено: Vehicle.wheelColor (получение / установка)
  • Добавлено: Vehicle.wheelType (получение / установка)
  • Добавлено: Vehicle.getExtra (id)
  • Добавлено: Vehicle.setExtra (id, extra)
  • Добавлено: Vehicle.taxiLights (получение / установка)
  • Добавлено: Vehicle.dashboardColor (получение / установка)
  • Добавлено: Vehicle.trailer
  • Добавлено: Vehicle.traileredBy

Новые события

  • Добавлено: entityCreated (entity)
  • Добавлено: playerReady (игрок)
  • Добавлено: entityModelChange (entity, oldModel)
  • Обновлено: playerEnterVehicle => playerStartEnterVehicle
  • Обновлено: playerEnteredVehicle => playerEnterVehicle
  • Обновлено: playerExitVehicle => playerStartExitVehicle
  • Обновлено: playerLeftVehicle => playerExitVehicle
  • Добавлено: playerDamage (player, healthLoss, armorLoss)
  • Добавлено: playerWeaponChange (player, oldWeapon, newWeapon)
  • Добавлено: vehicleDamage (vehicle, bodyHealthLoss, engineHealthLoss)
  • Добавлено: vehicleSirenToggle (транспортное средство, состояние)
  • Добавлено: vehicleHornToggle (транспортное средство)
  • Добавлено: vehicleTrailerAttach (автомобиль, прицеп)
  • Добавлено: playerMarkWaypoint (игрок, позиция)
  • Добавлено: playerReachWaypoint (игрок)

Обновления сущностей (для всех типов сущностей)

  • Добавлено: Entity.data.name (получает / устанавливает синхронизируемую переменную точно так же, как getVariable / setVariable)
  • Добавлено: Entity.getVariable (имя)
  • Добавлено: Entity.setVariable (имя, значение)

Player.weapons

  • Добавлено: Player.weapons.all (возвращает объект точно так же, как Player.allWeapons)
  • Добавлено: Player.weapons.name / Player.weapons.hash / Player.weapons.current (получает / устанавливает боеприпасы для определенного оружия, как Player.get / setWeaponAmmo)
  • Добавлено: Player.weapons.clear ()


Примеры использования

// Добавляем события
mp.events.add(
{
    playerJoin: (player) => {},
    playerChat: (player, msg) => {}
});

//
function playerJoinHandler(player)
{
}

// Добавляем событие
mp.events.add ("playerJoin", playerJoinHandler);

// Удаляем указанный обработчик указанного события
mp.events.remove ("playerJoin", playerJoinHandler);

// Удаление обработчика(ов) указанного события(событий)
mp.events.remove ("playerJoin");
mp.events.remove (["playerJoin", "playerQuit"]);

// Сбросить весь менеджер событий
mp.events.reset ();

// Получить все обработчики указанного события
mp.events.getAllOf ("playerJoin"). forEach (_ev => _ev (null));

// 
const ev = new mp.Event("playerDeath", (player, reason, killer) =>
{
    mp.players.broadcast('First blood!');
    ev.destroy(); // этот обработчик события больше не будет вызываться, так как он уничтожен
});


ev.destroy (); // из-за этой строки событие никогда не будет выполнено, если мы вызовем это перед ним

// Индивидуальный (доступный для всех сущностей) менеджер событий
mp.events.add ("playerJoin", (player) =>
{
    player.events.push ("playerSpawn", (player) =>
    {
        mp.players.broadcast (`эй, $ {player.name}, это твое первое возрождение!`);
        return true; // возвращаем истину из события, чтобы уничтожить его для сущности после выполнения
    });
});

Новые конструкторы сущностей

mp.vehicles.new(model, position,
{
    heading: heading,
    numberPlate: numberPlate,
    alpha: alpha,
    color: color,
    locked: locked,
    engine: engine,
    dimension: dimension
});
 
mp.objects.new(model, position,
{
    rotation: rotation,
    alpha: alpha,
    dimension: dimension
});

mp.blips.new(sprite, position,
{
    name: name,
    scale: scale,
    color: color,
    alpha: alpha,
    drawDistance: drawDistance,
    shortRange: shortRange,
    rotation: rotation,
    dimension: dimension,
});

mp.checkpoints.new(type, position, radius,
{
    direction: direction,
    color: color,
    visible: visible,
    dimension: dimension
});

mp.markers.new(type, position, scale,
{
    direction: direction,
    rotation: rotation,
    color: color,
    visible: visible,
    dimension: dimension
});

mp.labels.new(text, position,
{
    los: los,
    font: font,
    drawDistance: drawDistance,
    color: color,
    dimension: dimension
});