• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается RAGE Multiplayer.
    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Вопрос rgb цвет в lsc

toshikytg111

Новый участник
26 Май 2025
5
0
3
я добавил себе rgb палитру в lsc всё бы хорошо цвета работают и ставятся на машину, но если я выбираю тип цвета например матовый, он не применяется, у меня возник вопрос можно ли это вообще сделать чтобы матовый цвет работал с этой палитрой, если да то потом я скину код и хочу узнать почему у меня это не работает
 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
2,307
236
100
Да, можно использовать матовые цвета с RGB палитрой в LSC. Пожалуйста, скиньте свой код, чтобы мы могли рассмотреть возможные причины проблемы.
 

toshikytg111

Новый участник
26 Май 2025
5
0
3
Да, можно использовать матовые цвета с RGB палитрой в LSC. Пожалуйста, скиньте свой код, чтобы мы могли рассмотреть возможные причины проблемы.
серверная часть
C#:
using GTANetworkAPI;
using System;
using System.Collections.Generic;

public class LSCServer : Script
{
    private readonly Vector3 lscPosition = new Vector3(-337.0, -136.0, 39.0);
    private ColShape lscColshape;

    private static readonly HashSet<uint> usedDimensions = new HashSet<uint>();

    private uint GetRandomDimension()
    {
        long ticks = DateTime.Now.Ticks;
        return (uint)((ticks % 10000) + 10000);
    }

    [ServerEvent(Event.ResourceStart)]
    public void OnResourceStart()
    {
        lscColshape = NAPI.ColShape.CreateCylinderColShape(lscPosition, 5f, 3f);
        lscColshape.SetData("LSC", true);

        NAPI.TextLabel.CreateTextLabel("~g~LS Customs\n~w~Заезжайте для тюнинга", lscPosition + new Vector3(0, 0, 1.5), 10f, 1f, 4, new Color(255, 255, 255));
        NAPI.Marker.CreateMarker(1, lscPosition - new Vector3(0, 0, 1), new Vector3(), new Vector3(), 3f, new Color(0, 255, 0, 100));
        NAPI.Blip.CreateBlip(72, lscPosition, 1f, 3, "LS Customs", 255, 0, true, 0, 0);

        Console.WriteLine("[LSC DEBUG] LSC ресурс запущен.");
    }

    [ServerEvent(Event.PlayerEnterColshape)]
    public void OnEnterLSC(ColShape shape, Player player)
    {
        if (shape.HasData("LSC") && player.IsInVehicle && !player.HasData("IN_LSC"))
        {
            player.SetData("IN_LSC", true);

            uint oldDimension = player.Dimension;
            player.SetData("OLD_DIMENSION", oldDimension);

            uint newDimension;
            do
            {
                newDimension = GetRandomDimension();
            } while (usedDimensions.Contains(newDimension));

            usedDimensions.Add(newDimension);

            player.Dimension = newDimension;
            player.Vehicle.Dimension = newDimension;

            player.Vehicle.Position = lscPosition + new Vector3(0, 0, 0.2);
            NAPI.Vehicle.SetVehicleEngineStatus(player.Vehicle, false);
            player.TriggerEvent("LSC_Freeze", true);

            Console.WriteLine("[LSC DEBUG] {0} заехал в LSC (dimension {1}).", player.Name, newDimension);
            player.SendChatMessage("~g~Вы заехали в LS Customs");
            player.TriggerEvent("LSC_ShowMenu");
        }
    }

    [RemoteEvent("LSC_UpgradeSelected")]
    public void OnUpgradeSelected(Player player, string data)
    {
        Console.WriteLine("[LSC DEBUG] Событие LSC_UpgradeSelected от {0} с данными: {1}", player.Name, data);

        if (!player.IsInVehicle)
        {
            player.SendChatMessage("~r~Вы должны быть в машине для тюнинга.");
            return;
        }

        if (string.IsNullOrWhiteSpace(data) || !data.Contains(":"))
        {
            player.SendChatMessage("~r~Неверные данные для апгрейда.");
            return;
        }

        var parts = data.Split(':');
        if (parts.Length < 2)
        {
            player.SendChatMessage("~r~Неверный формат данных.");
            return;
        }

        string category = parts[0];

        Vehicle vehicle = player.Vehicle;

        switch (category)
        {
            case "engine":
            case "brakes":
                if (!int.TryParse(parts[1], out int level))
                {
                    player.SendChatMessage("~r~Неверный уровень апгрейда.");
                    return;
                }
                int modType = category == "engine" ? 11 : 12;
                NAPI.Vehicle.SetVehicleMod(vehicle, modType, level);
                player.TriggerEvent("LSC_UpgradeSuccess", category, level);
                player.SendChatMessage(string.Format("~g~Установлен тюнинг: {0} уровень {1}", category, level + 1));
                break;

            case "turbo":
                if (!int.TryParse(parts[1], out int turboLevel))
                {
                    player.SendChatMessage("~r~Неверный уровень турбо.");
                    return;
                }
                bool turboOn = turboLevel == 1;
                NAPI.Vehicle.SetVehicleMod(vehicle, 18, turboOn ? 1 : -1);
                player.TriggerEvent("LSC_UpgradeSuccess", "turbo", turboOn ? 1 : 0);
                player.SendChatMessage($"~g~Турбонаддув {(turboOn ? "включён" : "выключен")}");
                break;

            case "color":
                // data: color:<intRGB>:<finish>
                if (parts.Length < 3)
                {
                    player.SendChatMessage("~r~Неверные данные цвета.");
                    return;
                }
                if (!int.TryParse(parts[1], out int colorInt))
                {
                    player.SendChatMessage("~r~Неверный цвет.");
                    return;
                }
                string finish = parts[2];

                int r = (colorInt >> 16) & 0xFF;
                int g = (colorInt >> 8) & 0xFF;
                int b = colorInt & 0xFF;

                NAPI.Vehicle.SetVehicleCustomPrimaryColor(vehicle, r, g, b);

                int paintType = 0;
                switch (finish)
                {
                    case "matte":
                        paintType = 3;
                        vehicle.SetSharedData("matteRGB", true); // <--- добавлено
                        break;
                    case "metallic":
                        paintType = 1;
                        vehicle.ResetSharedData("matteRGB");
                        break;
                    case "pearl":
                        paintType = 2;
                        vehicle.ResetSharedData("matteRGB");
                        break;
                    case "glossy":
                    default:
                        paintType = 0;
                        vehicle.ResetSharedData("matteRGB");
                        break;
                }
                player.TriggerEvent("LSC_SetPaintType", paintType);

                player.TriggerEvent("LSC_UpgradeSuccess", "color", colorInt);
                player.SendChatMessage($"~g~Цвет изменён на #{colorInt.ToString("X6")} с покрытием {finish}");
                break;

            default:
                player.SendChatMessage("~r~Неизвестная категория тюнинга.");
                break;
        }
    }

    // --- Добавить обработку починки авто ---
    [RemoteEvent("LSC_RepairVehicle")]
    public void OnRepairVehicle(Player player)
    {
        if (!player.IsInVehicle)
        {
            player.SendChatMessage("~r~Вы должны быть в машине для починки.");
            return;
        }
        Vehicle veh = player.Vehicle;
        veh.Repair();
        veh.Health = 1000;
        NAPI.Vehicle.SetVehicleEngineHealth(veh, 1000.0f);
        NAPI.Vehicle.SetVehicleBodyHealth(veh, 1000.0f);
        NAPI.Vehicle.SetVehicleEngineStatus(veh, true);
        player.SendChatMessage("~g~Машина полностью отремонтирована!");
        player.TriggerEvent("LSC_UpgradeSuccess", "repair", 1);
    }

    [RemoteEvent("LSC_Exit")]
    public void OnExitLSC(Player player)
    {
        if (!player.HasData("IN_LSC"))
        {
            player.SendChatMessage("~r~Вы не в LS Customs.");
            return;
        }

        player.ResetData("IN_LSC");

        if (player.HasData("OLD_DIMENSION"))
        {
            uint oldDim = player.GetData<uint>("OLD_DIMENSION");

            usedDimensions.Remove(player.Dimension);
            usedDimensions.Remove(oldDim);

            player.Dimension = oldDim;

            if (player.Vehicle != null)
            {
                player.Vehicle.Dimension = oldDim;

                var rot = player.Vehicle.Rotation;
                player.Vehicle.Rotation = new Vector3(rot.X, rot.Y, (rot.Z + 180f) % 360f);

                // Добавлено: включить двигатель и разморозить машину
                NAPI.Vehicle.SetVehicleEngineStatus(player.Vehicle, true);
                player.TriggerEvent("LSC_Freeze", false);
            }
        }

        player.SendChatMessage("~g~Вы покинули LS Customs.");
        Console.WriteLine("[LSC DEBUG] {0} вышел из LSC.", player.Name);
    }
}
клиентская

JavaScript:
const currentUpgrades = {
  color: '#00ff55',
  finish: 'glossy'
};

let paletteVisible = false;
let hue = 0;
let selectorX = 320;
let selectorY = 0;

function toggleCustomPalette() {
  paletteVisible = !paletteVisible;
  const palette = document.getElementById('custom-palette');
  palette.style.display = paletteVisible ? 'flex' : 'none';
}

function toggleSubmenu(name) {
  if (name === 'colorandfinish') {
    const colorPanel = document.getElementById('color-panel');
    const finishOptions = document.getElementById('finish-options');
    if (!colorPanel || !finishOptions) {
      console.error('color-panel or finish-options element not found');
      return;
    }
    // Всегда показываем панели выбора цвета и покрытия при нажатии на кнопку
    colorPanel.classList.add('active');
    finishOptions.classList.add('active');
    clearMessage();
    return;
  }

  const submenus = document.querySelectorAll('.submenu');
  let isClosingActive = false;
  submenus.forEach(s => {
    if (s.id === name + '-submenu') {
      if (s.classList.contains('active')) {
        s.classList.remove('active');
        // При закрытии активной вкладки скрываем палитру и панель покрытия
        hideColorPanel();
        hideFinishOptions();
        isClosingActive = true;
        return;
      }
      s.classList.add('active');
    } else {
      s.classList.remove('active');
    }
  });

  if (!isClosingActive) {
    // При переключении на другую вкладку скрываем палитру и панель покрытия
    hideColorPanel();
    hideFinishOptions();
  }

  clearMessage();
}

document.addEventListener('DOMContentLoaded', () => {
  const colorAndFinishBtn = document.getElementById('colorandfinish-btn');
  if (colorAndFinishBtn) {
    colorAndFinishBtn.addEventListener('click', () => {
      toggleSubmenu('colorandfinish');
    });
  } else {
    console.error('colorandfinish-btn element not found');
  }
});

function hideFinishOptions() {
  const finishOptions = document.getElementById('finish-options');
  const colorPanel = document.getElementById('color-panel');
  if (finishOptions) finishOptions.classList.remove('active');
  if (colorPanel) colorPanel.classList.remove('active');
}

function upgrade(type, level) {
  updateMessage(`Вы выбрали апгрейд: ${type}, уровень ${level + 1}`);
  if (type === 'color') return;
  if (type === 'turbo') {
    mp.trigger('LSC_UpgradeSelected', `turbo:${level}`);
  } else {
    mp.trigger('LSC_UpgradeSelected', `${type}:${level}`);
  }
}

function exitLSC() {
  updateMessage('Выход из меню...');
  mp.trigger('LSC_Exit');
}

function showColorPanel() {
  document.getElementById('color-panel').classList.add('active');
  document.getElementById('custom-palette').style.display = 'flex';
  paletteVisible = true;
}

function hideColorPanel() {
  document.getElementById('color-panel').classList.remove('active');
  document.getElementById('custom-palette').style.display = 'none';
  paletteVisible = false;
}

function showColorPicker() {
  // Функция отключена, так как переключение между цветом и покрытием убрано
  // и оба блока всегда показываются
}

function showFinishOptions() {
  // Убрано переключение между цветом и покрытием, всегда показываем оба блока
}

function onFinishChange() {
  const radios = document.querySelectorAll('#finish-options input[name="finish"]');
  radios.forEach(radio => {
    if (radio.checked) {
      currentUpgrades.finish = radio.value;
      updateMessage(`Выбрали покрытие: ${formatFinishName(radio.value)}`);
    }
  });
}

function hexToIntRGB(hex) {
  hex = hex.replace('#', '');
  return parseInt(hex, 16);
}

function applyColorFinish() {
  updateMessage(`Применяем цвет ${currentUpgrades.color} с покрытием ${formatFinishName(currentUpgrades.finish)}`);
  const colorInt = hexToIntRGB(currentUpgrades.color);
  mp.trigger('LSC_UpgradeSelected', `color:${colorInt}:${currentUpgrades.finish}`);
}

function formatFinishName(value) {
  switch (value) {
    case 'glossy': return 'Глянцевый';
    case 'matte': return 'Матовый';
    case 'metallic': return 'Металлик';
    case 'pearl': return 'Перламутр';
    case 'chrome': return 'Хром';
    default: return value;
  }
}

function updateMessage(msg) {
  const el = document.getElementById('message');
  el.textContent = msg;
}

function clearMessage() {
  updateMessage('');
}

function hsvToRgb(h, s, v) {
  let c = v * s;
  let x = c * (1 - Math.abs((h / 60) % 2 - 1));
  let m = v - c;
  let r = 0, g = 0, b = 0;

  if (0 <= h && h < 60) { r = c; g = x; b = 0; }
  else if (60 <= h && h < 120) { r = x; g = c; b = 0; }
  else if (120 <= h && h < 180) { r = 0; g = c; b = x; }
  else if (180 <= h && h < 240) { r = 0; g = x; b = c; }
  else if (240 <= h && h < 300) { r = x; g = 0; b = c; }
  else if (300 <= h && h < 360) { r = c; g = 0; b = x; }

  r = Math.round((r + m) * 255);
  g = Math.round((g + m) * 255);
  b = Math.round((b + m) * 255);

  return { r, g, b };
}

document.addEventListener('DOMContentLoaded', () => {
  const colorStrip = document.getElementById('color-strip');
  colorStrip.style.backgroundColor = currentUpgrades.color;
  // colorStrip.onclick = null; // отключаем клик, чтобы палитра не открывалась по клику на полоску

  const canvas = document.getElementById('palette-canvas');
  const ctx = canvas.getContext('2d');

  // Жестко задаем размеры canvas, чтобы совпадали с CSS
  const width = canvas.width = 320;
  const height = canvas.height = 300;

  const hueSlider = document.getElementById('hue-slider');
  hueSlider.disabled = false; // Активируем слайдер, если был заблокирован
  hueSlider.value = hue; // Устанавливаем значение слайдера в текущий hue

  function drawPalette(hue) {
    ctx.clearRect(0, 0, width, height);

    // Создаем градиент по горизонтали (оттенки от белого до цвета)
    const color = hsvToRgb(hue, 1, 1);
    const rgbColor = `rgb(${color.r},${color.g},${color.b})`;

    const gradientH = ctx.createLinearGradient(0, 0, width, 0);
    gradientH.addColorStop(0, 'white');
    gradientH.addColorStop(1, rgbColor);
    ctx.fillStyle = gradientH;
    ctx.fillRect(0, 0, width, height);

    // Создаем вертикальный градиент (от прозрачного до черного)
    const gradientV = ctx.createLinearGradient(0, 0, 0, height);
    gradientV.addColorStop(0, 'rgba(0,0,0,0)');
    gradientV.addColorStop(1, 'rgba(0,0,0,1)');
    ctx.fillStyle = gradientV;
    ctx.fillRect(0, 0, width, height);

    // Рисуем круг выбора цвета
    ctx.beginPath();
    ctx.strokeStyle = '#fff';
    ctx.lineWidth = 2;
    ctx.shadowColor = 'black';
    ctx.shadowBlur = 4;
    ctx.arc(selectorX, selectorY, 8, 0, 2 * Math.PI);
    ctx.stroke();
  }

  drawPalette(hue);

  hueSlider.addEventListener('input', () => {
    // Убираем инверсию значения, чтобы цвет соответствовал положению ползунка
    hue = parseInt(hueSlider.value);
    drawPalette(hue);
  });

  hueSlider.addEventListener('change', () => {
    hue = parseInt(hueSlider.value);
    drawPalette(hue);
  });

  canvas.addEventListener('click', (e) => {
    const rect = canvas.getBoundingClientRect();
    selectorX = e.clientX - rect.left;
    selectorY = e.clientY - rect.top;

    const imageData = ctx.getImageData(selectorX, selectorY, 1, 1).data;

    function componentToHex(c) {
      const hex = c.toString(16);
      return hex.length == 1 ? "0" + hex : hex;
    }
    function rgbToHex(r, g, b) {
      return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
    }
    const hexColor = rgbToHex(imageData[0], imageData[1], imageData[2]);

    currentUpgrades.color = hexColor;
    colorStrip.style.backgroundColor = hexColor;
    updateMessage(`Выбрали цвет: ${hexColor}`);

    function rgbToHsv(r, g, b) {
      r /= 255; g /= 255; b /= 255;
      let max = Math.max(r, g, b), min = Math.min(r, g, b);
      let h, s, v = max;
      let d = max - min;
      s = max === 0 ? 0 : d / max;
      if (max === min) {
        h = 0;
      } else {
        switch (max) {
          case r: h = (g - b) / d + (g < b ? 6 : 0); break;
          case g: h = (b - r) / d + 2; break;
          case b: h = (r - g) / d + 4; break;
        }
        h /= 6;
      }
      return { h: h * 360, s: s, v: v };
    }

    const hsv = rgbToHsv(imageData[0], imageData[1], imageData[2]);
    hue = Math.round(hsv.h);
    hueSlider.value = hue;
    drawPalette(hue);
  });
});

function repairVehicle() {
  updateMessage('Починка авто...');
  mp.trigger('LSC_RepairVehicle');
}
есть ещё клиентский но он вроде как не нужен

JavaScript:
// Инициализация браузера
let lscBrowser = null;

// Открыть меню
mp.events.add("LSC_ShowMenu", () => {
    if (!lscBrowser) {
        lscBrowser = mp.browsers.new("package://lsc/ui/lsc.html");
    }
    mp.gui.cursor.show(true, true);
});

// Закрыть меню
mp.events.add("LSC_Exit", () => {
    if (lscBrowser) {
        lscBrowser.destroy();
        lscBrowser = null;
    }
    mp.gui.cursor.show(false, false);
    mp.events.callRemote("LSC_Exit");
});

// Заморозить/разморозить машину
mp.events.add('LSC_Freeze', (freeze) => {
    const player = mp.players.local;
    player.freezePosition(freeze);
    player.setInvincible(freeze);
    mp.game.controls.enableControlAction(0, 59, !freeze); // example: enable vehicle control

    if (!freeze) {
        // Включить управление транспортом и камерой
        mp.gui.cursor.visible = false;
        mp.players.local.setCollision(true, true);
    } else {
        mp.gui.cursor.visible = true;
        mp.players.local.setCollision(false, false);
    }
});

// Из браузера приходит апгрейд
mp.events.add("LSC_UpgradeSelected", (data) => {
    mp.events.callRemote("LSC_UpgradeSelected", data);
});

// Обработка цвета и покрытия
mp.events.add("LSC_ColorFinishSelected", (data) => {
    try {
        const obj = JSON.parse(data);
        if (!obj.color || !obj.finish) return;
        const colorInt = parseInt(obj.color.replace('#', ''), 16);
        const sendData = `color:${colorInt}:${obj.finish}`;
        mp.events.callRemote("LSC_UpgradeSelected", sendData);
    } catch (e) {
        mp.gui.chat.push("Ошибка обработки цвета и покрытия");
    }
});

mp.events.add("setEntityVisible", (entity, visible) => {
    if (entity && entity.exists) {
        entity.setAlpha(visible ? 255 : 0);
    }
});

// Починка авто из браузера
mp.events.add("LSC_RepairVehicle", () => {
    mp.events.callRemote("LSC_RepairVehicle");
});

// Установка типа покрытия (paintType) через клиента
mp.events.add("LSC_SetPaintType", (paintType) => {
    const veh = mp.players.local.vehicle;
    if (!veh) return;
    mp.game.invoke("0x43FEB945EE7F85B8", veh.handle, paintType, 111, 0);
});

// Автоматически применять матовый, если нужно (пример для всех своих машин)
mp.events.add("entityStreamIn", (entity) => {
    if (entity && entity.type === "vehicle" && entity.getVariable("matteRGB")) {
        mp.game.invoke("0x43FEB945EE7F85B8", entity.handle, 3, 111, 0);
    }
});