Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
high coder
media
10 Сен 2020
2,187
1,473
196
Всем привет :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
62
ошибка -создаем не в серверной а клиентской
 

Harland David Sanders

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

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
high coder
media
10 Сен 2020
2,187
1,473
196

NightWill

Специалист
high coder
15 Сен 2020
133
48
86
Какое красивое и не лаганое колесо c:
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
high coder
media
10 Сен 2020
2,187
1,473
196

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
high coder
media
10 Сен 2020
2,187
1,473
196
  • Like
Реакции: Evbej

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
high coder
media
10 Сен 2020
2,187
1,473
196

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
high coder
media
10 Сен 2020
2,187
1,473
196

Taksagen

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

Harland David Sanders

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