This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

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

Harland David Sanders

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



Думаю из видео все понятно. Начнем. В клиентской части создаем новую папку - 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 лайков на этом посте - доделаю призы и выложу сюда, будет полностью готовая система.
 
Последнее редактирование:

Etader

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

Harland David Sanders

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

Harland David Sanders

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

Harland David Sanders

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

Harland David Sanders

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

Harland David Sanders

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

Harland David Sanders

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

Taksagen

Начинающий специалист
15 Сен 2020
69
35
55
Привет ты написал в теме сделать два колшейпа, а как к ним привязать dim 1 на входе и dim 0 на выходе?
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,060
2,451
219
Посмотри как работает вход в бизнес, например в автосалон.