RageMP/Changelog
Материал из Pawno Info Wikipedia
Журнал изменений
Примечание |
Примечание: эта страница устарела. Следите за обновлениями на наших форумах: 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
});