• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в 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/ru/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


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

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219
Всем привет :devilish:



Думаю из видео все понятно. Начнем. В клиентской части создаем новую папку - casino и в ней создаем новый файл - luckywheel.js
(Не забудьте подключить новый файл с помощью require в index.js)

Содержимое файла:
JavaScript:
let isInLuckySheelShape = false;
let playerMovingDisabled = false;

// Подгружаем интерьер казино
let interior = mp.game.interior.getInteriorAtCoords(1100.000, 220.000, -50.000);
mp.game.streaming.requestIpl("vw_casino_main");
mp.game.interior.refreshInterior(interior);

// Создаем объект колеса
let wheel = mp.objects.new(mp.game.joaat('vw_prop_vw_luckywheel_02a'), new mp.Vector3(1111.05, 229.81, -49.15), { dimension: 1 });
wheel.setHeading(-30);

mp.events.add({
    "casino.luckywheel.roll": (playerId, index) => {
        wheel.setRotation(0.0, 0.0, 0.0, 1, true);
        let player = mp.players.atRemoteId(playerId);
        let pos = new mp.Vector3(1109.55, 228.88, -49.64);
        let dict = getAnimDict(player);
        mp.game.streaming.requestAnimDict(dict);
        player.taskGoStraightToCoord(pos.x, pos.y, pos.z, 1.0, -1, 312.2, 0.0);

        setTimeout(() => {
            if (player === mp.players.local)
            {
                //mp.utils.disablePlayerMoving(true);
                playerMovingDisabled = true;
            }
            player.taskPlayAnim(dict, 'enter_right_to_baseidle', 8.0, -8.0, -1, 0, 0, false, false, false);
            let ready = false;
            while (!ready) {
                //if (!mp.utils.isEntityPlayingAnim(player, dict, 'enter_right_to_baseidle')) {
                if (!mp.game.invoke('0x1F0B79228E461EC9', player, dict, 'enter_right_to_baseidle')) {
                    ready = true;
                }
            }
            player.taskPlayAnim(dict, 'enter_to_armraisedidle', 8.0, -8.0, -1, 0, 0, false, false, false);
            ready = false;
            while (!ready) {
                //if (!mp.utils.isEntityPlayingAnim(player, dict, 'enter_to_armraisedidle')) {
                if (!mp.game.invoke('0x1F0B79228E461EC9', player, dict, 'enter_to_armraisedidle')) {
                    ready = true;
                }
            }
            player.taskPlayAnim(dict, 'armraisedidle_to_spinningidle_high', 8.0, -8.0, -1, 0, 0, false, false, false);
            player.freezePosition(true);
            let y = 0;
            let count = 60 + index;
            let val = 1;
            let rollTimer = null;
            rollTimer = setInterval(() => {
                if (count > 0) {
                    if (count < 8) val = 4;
                    else if (count < 30) val = 2;
                    y += 18 / val;
                    count -= 1 / val;
                    wheel.setRotation(0.0, y, 0.0, 1, true);
                } else {
                    clearInterval(rollTimer);
                    rollTimer = null
                    player.freezePosition(false);
                    if (player === mp.players.local) {
                        playerMovingDisabled = false;
                        mp.events.callRemote('casino.luckywheel.roll.finish');
                    }
                }
            }, 50);
        }, 2000);
    },
    "casino.luckywheel.enter": (enter) => {
        isInLuckySheelShape = enter;
    }
});

mp.keys.bind(0x45, true, () => {
    if (!isInLuckySheelShape) return;
    mp.events.callRemote('casino.luckywheel.roll');
});

function getAnimDict(player) {
    return mp.game.joaat("mp_m_freemode_01") == player.model ?
        'anim_casino_a@amb@casino@games@lucky7wheel@male' : 'anim_casino_a@amb@casino@games@lucky7wheel@female';
}

/// Отключение движения игрока
mp.events.add('render', () => {
    if (playerMovingDisabled) {
        mp.game.controls.disableControlAction(0, 21, true); /// бег
        mp.game.controls.disableControlAction(0, 22, true); /// прыжок
        mp.game.controls.disableControlAction(0, 31, true); /// вперед назад
        mp.game.controls.disableControlAction(0, 30, true); /// влево вправо
        mp.game.controls.disableControlAction(0, 24, true); /// удары
        mp.game.controls.disableControlAction(0, 25, true); /// INPUT_AIM
        mp.game.controls.disableControlAction(0, 257, true); /// стрельба
        mp.game.controls.disableControlAction(1, 200, true); // esc
        mp.game.controls.disableControlAction(0, 140, true); /// удары R
        mp.game.controls.disableControlAction(24, 37, true); /// Tab
        mp.game.controls.disableControlAction(0, 257, true); // INPUT_ATTACK2
    }
});


Следующий шаг. В серверной части (Visual Studio), в папке MoneySystem создаем новый файл - Casino.cs
Содержимое файла:
C#:
using System;
using GTANetworkAPI;
using Redage.SDK;

namespace NeptuneEvo.MoneySystem
{
    class Casino : Script
    {
        private static nLog Log = new nLog("Casino");
        private static Random Rnd = new Random();

        [ServerEvent(Event.ResourceStart)]
        public void onResourceStart()
        {
            try
            {
                ColShape shape = NAPI.ColShape.CreateCylinderColShape(new Vector3(1111.05, 229.81, -49.15), 2f, 2f, 1);

                shape.OnEntityEnterColShape += (s, entity) =>
                {
                    try
                    {
                        Trigger.ClientEvent(entity, "casino.luckywheel.enter", true);
                    }
                    catch (Exception e) { Console.WriteLine("shape.OnEntityEnterColshape: " + e.Message); }
                };
                shape.OnEntityExitColShape += (s, entity) =>
                {
                    try
                    {
                        Trigger.ClientEvent(entity, "casino.luckywheel.enter", false);
                    }
                    catch (Exception e) { Console.WriteLine("shape.OnEntityExitColShape: " + e.Message); }
                };

            }
            catch (Exception e) { Log.Write("ResourceStart: " + e.Message, nLog.Type.Error); }
        }

        [RemoteEvent("casino.luckywheel.roll")]
        public static void CasinoLuckywheelRoll(Player player)
        {
            try
            {
                int result = Rnd.Next(0, 20);
                player.SetData("luckywheel.value", result);

                Trigger.ClientEvent(player, "casino.luckywheel.roll", player.Value, result);

                Log.Write("CasinoLuckywheelRoll.Event: " + true, nLog.Type.Info);
            }
            catch (Exception e)
            {
                Log.Write("CasinoLuckywheelRoll.Event: " + e.Message, nLog.Type.Error);
            }
        }

        [RemoteEvent("casino.luckywheel.roll.finish")]
        public static void CasinoLuckywheelFinish(Player player)
        {
            try
            {
                int result = player.GetData<int>("luckywheel.value");
                string resultName;

                switch (result)
                {
                    default:
                        resultName = "Нихуя =(";
                        break;
                    case 0:
                        resultName = "Одежда";
                        break;
                    case 1:
                        resultName = "Деньги (50.000$)";
                        break;
                    case 2:
                        resultName = "Машина";
                        break;
                    case 3:
                        resultName = "RP (15.000)";
                        break;
                    case 4:
                        resultName = "Одежда";
                        break;
                    case 5:
                        resultName = "Coins (25.000)";
                        break;
                    case 6:
                        resultName = "Money (40.000$)";
                        break;
                    case 7:
                        resultName = "RP (10.000)";
                        break;
                    case 8:
                        resultName = "Одежда";
                        break;
                    case 9:
                        resultName = "MYSTERY";
                        break;
                    case 10:
                        resultName = "Coins (20.000)";
                        break;
                    case 11:
                        resultName = "RP (7.500)";
                        break;
                    case 12:
                        resultName = "Одежда";
                        break;
                    case 13:
                        resultName = "Coins (15.000)";
                        break;
                    case 14:
                        resultName = "Money (30.000$)";
                        break;
                    case 15:
                        resultName = "RP (5.000)";
                        break;
                    case 16:
                        resultName = "DISCOUNT";
                        break;
                    case 17:
                        resultName = "Coins (10.000)";
                        break;
                    case 18:
                        resultName = "Money (20.000$)";
                        break;
                    case 19:
                        resultName = "RP (2.500)";
                        break;
                    case 20:
                        resultName = "Одежда";
                        break;
                }

                Notify.Send(player, NotifyType.Success, NotifyPosition.BottomCenter, $"В колесе выпало: {resultName} ({result})", 3000);
            }
            catch (Exception e)
            {
                Log.Write("CasinoLuckywheelFinish.Event: " + e.Message, nLog.Type.Error);
            }
        }
    }
}

Призы настраивайте сами (код на серверной части уже подготовлен).

Ну и небольшое условие: если соберем 25 лайков на этом посте - доделаю призы и выложу сюда, будет полностью готовая система. :p
 
Последнее редактирование:

Etader

Специалист
15 Сен 2020
130
23
82
ошибка -создаем не в серверной а клиентской
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219
Еще забыл один важный момент - сам объект колеса находится в другом виртуальном мире, чтобы туда попасть можете прописать команду - /dim 1
Ну или можно сделать это в момент входа в казино (два колшейпа, один на улице, другой в интерьере).
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219

Taksagen

Начинающий специалист
15 Сен 2020
69
35
55
Еще забыл один важный момент - сам объект колеса находится в другом виртуальном мире, чтобы туда попасть можете прописать команду - /dim 1
Ну или можно сделать это в момент входа в казино (два колшейпа, один на улице, другой в интерьере).
Привет ты написал в теме сделать два колшейпа, а как к ним привязать dim 1 на входе и dim 0 на выходе?
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,058
2,443
219
Привет ты написал в теме сделать два колшейпа, а как к ним привязать dim 1 на входе и dim 0 на выходе?
Посмотри как работает вход в бизнес, например в автосалон.