Мануал Добавляем колесо-удачи в сборку RedAge RP (+ серверная часть) (казино)

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110
Всем привет :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

Активный участник
121
22
37
ошибка -создаем не в серверной а клиентской
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110
Еще забыл один важный момент - сам объект колеса находится в другом виртуальном мире, чтобы туда попасть можете прописать команду - /dim 1
Ну или можно сделать это в момент входа в казино (два колшейпа, один на улице, другой в интерьере).
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110
  • Like
Реакции: Evbej

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110

Taksagen

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

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
620
459
110
Привет ты написал в теме сделать два колшейпа, а как к ним привязать dim 1 на входе и dim 0 на выходе?
Посмотри как работает вход в бизнес, например в автосалон.