• Из-за обновления 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) последний раз были обновлены:

Мануал Система квестов для RAGE:MP 1.1

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
ВИДЕО МАНУАЛ


Описание: Игрок получает задание от Харри после чего едет к Нику и там решает мат. задания после чего обратно возвращается к Харри и получает свой приз.


Серверная часть: kwest_SV > index.js
JavaScript:
let colshapeOfBrowser = mp.colshapes.newRectangle(-1644.35, -995.62, 1.5, 1.5);
let DBHANDLE = require("../dbconnection.js")

//FACTS
///     marker
mp.markers.new(1, new mp.Vector3(-1644.35, -995.62, 12.01), 1.2, {
    "color": [0, 255, 0, 150],
    "dimension": 0
})
///     ped
mp.peds.new(
    mp.joaat('s_m_m_dockwork_01'),
    [-1649.72, -997.56, 13.01, 1],
    {
        dynamic: false,
        frozen: true,
        invincible: true
    }
);

mp.events.add("playerEnterColshape", (player, colshape) => {
    if(colshapeOfBrowser == colshape){
        let UID = player.getVariable("UserID")
        DBHANDLE.connection.query("SELECT * FROM accounts WHERE ID = ?",[UID], function(error, results){
            if(results[0].EVENT_WAS == "0"){
                player.call("ShowEventBrowser")
            }
            else if(results[0].EVENT_WAS == "3"){
                player.call("ClassicNotify", ["Ты уже проходил этот квест"])
            }
            else{
                player.call("ClassicNotify", ["Молодец, держи 15000$"])
                let bf = player.getVariable('cash');
                let af = 15000;
            
                let equa = Number(bf) + Number(af);
            
                player.setVariable('cash', equa);

                mp.events.call("SET_DONE_EVENT_NICK", UID)
            }
        })
    }
})

mp.events.add("playerExitColshape", (player, colshape) => {
    if(colshapeOfBrowser == colshape){
        player.call("HideEventBrowser")
    }
})

mp.events.add("EVENT_startDBwaiting", (player) => {
    let UID = player.getVariable("UserID")
    DBHANDLE.connection.query("SELECT * FROM accounts WHERE ID = ?",[UID], function(error, results){
        
    })
})




//Nick
let colshapeOfNick = mp.colshapes.newRectangle(-1623, -992.14, 1.5, 1.5);

mp.markers.new(1, new mp.Vector3(-1623, -992.14, 12), 1.2, {
    "color": [0, 255, 0, 150],
    "dimension": 0
})

mp.events.add("playerEnterColshape", (player, colshape) => {
    if(colshapeOfNick == colshape){
        let UID = player.getVariable("UserID")
        DBHANDLE.connection.query("SELECT * FROM accounts WHERE ID = ?",[UID], function(error, results){
            if(results[0].EVENT_WAS == "2"){
                player.call("ShowNickEVENTBrowser")
            }else{
                player.call("ClassicNotify", ["Мне кажется мы знакомы с тобой"])
            }
        })
    }
})

mp.events.add("setDoneZadanie", (player) => {
    let UID = player.getVariable("UserID")

    DBHANDLE.connection.query("UPDATE accounts SET EVENT_WAS = ? WHERE ID = ?",[1 ,UID], function(error, results){
        
    })
})

mp.events.add("SETdbPD_EVENT_NICK", (player) => {
    let UID = player.getVariable("UserID")
    DBHANDLE.connection.query("UPDATE accounts SET EVENT_WAS = ? WHERE ID = ?",[2,UID], function(error, results){
        
    })
})

mp.events.add("SET_DONE_EVENT_NICK", (UID) => {
    DBHANDLE.connection.query("UPDATE accounts SET EVENT_WAS = ? WHERE ID = ?",[3 ,UID], function(error, results){
        
    })
})

Клиентская часть: CLkwest > index.js
JavaScript:
let browser = null;

mp.events.add("ShowEventBrowser", () => {
    if(browser == null){
      browser = mp.browsers.new("package://CLkwest/index.html");
      browser.execute("mp.invoke('focus', true)");
      mp.game.ui.displayHud(false);
      mp.gui.chat.activate(false);
      mp.gui.cursor.show(true, true);
    }
})

mp.events.add("HideEventBrowser", () => {
    if(browser != null){
        mp.game.ui.displayHud(true);
        mp.gui.chat.activate(true);
        mp.gui.cursor.show(false, false);
        browser.destroy();
        browser = null;
    }
})

mp.events.add("StartEventForPlayer", () => {
    mp.events.call("HideEventBrowser");
    mp.events.call("ClassicNotify", "Езжай к Нику в район Burton, на месте договоритесь.");
    mp.events.callRemote("SETdbPD_EVENT_NICK")
})


//Nick
let browserNick = null;
let selectArray = [
    {
    Quest: "25 + 25",
    Ans: 50,
    },
    {
    Quest: "15 + 25",
    Ans: 40,
    },
]

let randomQST

mp.events.add("ShowNickEVENTBrowser", () => {
    randomQST = selectArray[Math.floor(Math.random()*selectArray.length)];
    if(browserNick == null){
        browserNick = mp.browsers.new("package://CLkwest/NickBrowser.html");
        browserNick.execute(`setPrimer("${randomQST.Quest}")`);
        mp.game.ui.displayHud(false);
        mp.gui.chat.activate(false);
        mp.gui.cursor.show(true, true);
    }
})

mp.events.add("HideNickEVENTBrowser", () => {
    if(browserNick != null){
        mp.game.ui.displayHud(true);
        mp.gui.chat.activate(true);
        mp.gui.cursor.show(false, false);
        browserNick.destroy();
        browserNick = null;
    }
})

mp.events.add("VL", (inputed) => {
    if(/[a-zA-Z]/.test(inputed)){
        mp.events.call("ClassicNotify", "Можно использовать только цифры, буквы запрещены.")
    }else{
        if(randomQST.Ans == inputed){
            mp.events.call("ClassicNotify", "Молодец, езжай к Харри на пирс")
            mp.events.callRemote("setDoneZadanie")
        }else{
            mp.events.call("ClassicNotify", "Кажется твой ответ не правильный, попробуй взять другое задание.")
        }
    }
})


index.html

HTML:
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <link rel="stylesheet" href="style.css">
   <script src="index.js"></script>
</head>

<body>

  <div class="BTN1" onclick="StartEVENT()">Начать</div>
  <div class="BTN2">Отказаться</div>

</body>

<script>

  function StartEVENT(){
    mp.trigger("StartEventForPlayer")
  }

</script>
</html>

NickBrowser.html

HTML:
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <link rel="stylesheet" href="style.css">
   <script src="index.js"></script>
</head>

<body>

  <div class="Cont">
    <div class="TextZAGL">Привет, ты наверное от Харри. Реши математический пример после чего получишь вознаграждение от Харри.</div>
    <div class="Primer" id="Primer">2+2 = ?</div>
    <div class="PoleVVoda" contenteditable="true" id="PoleVVoda">
    </div>
    <div class="BTNDecline" onclick="DECLINEfunc()">Decline</div>
    <div class="BTNAccept"  onclick="Acceptfunc()">Accept</div>
  </div>

</body>

<script>
  function setPrimer(setTEKST){
    document.getElementById("Primer").textContent = setTEKST;
  }

  function DECLINEfunc(){
    mp.trigger("HideNickEVENTBrowser")
  }

  function Acceptfunc(){
    let inputed = document.getElementById("PoleVVoda").textContent;

    mp.trigger("VL", inputed)
    mp.trigger("HideNickEVENTBrowser")
  }

</script>
</html>

style.css

CSS:
new-color-palette {background: #d97884;}
new-color-palette {background: #557cd2;}
new-color-palette {background: #eab743;}
new-color-palette {background: #272d2e;}
new-color-palette {background: #dbd2c4;}


new-color-palette {background:#DBD2C4}
new-color-palette {background:#4E4637}
new-color-palette {background:#BCA987}
body {   
    margin: 0;
    padding: 0;
    user-select: none;
/*
    background-size: cover;
    background-image: url(./NgAsb1b_ygVzrpVRhUTKR4TAE1DPr8XS1eC4FKjKiRk.webp);
*/
}

@font-face {
    font-family: PTL;
    src: url(./FONTS/PTC55F.ttf);
}

@font-face {
    font-family: PTB;
    src: url(./FONTS/PTC75F.ttf);
}

.BTN1{
    color: green;
}

.BTN2{
    color: red;
}







/*
-
--
---Nick
--
-
*/

.Cont{
    position: fixed;
    width: 50vw;
    height: 50vh;
    top: 25vh;
    left: 25vw;
    background-color: #0076B7;
    border-radius: 20px;
    color: #FFFFFF;
}

.TextZAGL{
    text-align: center;
    position: relative;
    font-family: PTL;
    font-size: 125%;
    width: 90%;
    left: 5%;
}

.Primer{
    text-align: center;
    position: relative;
    font-family: PTB;
    font-size: 250%;
    width: 90%;
    left: 5%;
}

.PoleVVoda{
    position: relative;
    background-color: #009FBA;
    width: 80%;
    height: 25%;
    top: 5%;
    left: 10%;
}

.BTNDecline{
    position: relative;
    background-color: #272d2e;
    width: 25%;
    height: 15%;
    top: 20%;
    left: 12.5%;
    color: #DBD2C4;
    font-family: PTL;
    font-size: 125%;
}

.BTNAccept{
    position: relative;
    background-color: #272d2e;
    width: 25%;
    height: 15%;
    top: 5%;
    left: 62.5%;
    color: #DBD2C4;
    font-family: PTL;
    font-size: 125%;
}
 
Последнее редактирование:
  • Like
Реакции: vv_vova, XDDDD и PATRIOT

JJIGolem

Гуру
high coder
19 Окт 2020
211
270
142
Сделай лучше сразу так, чтобы легко было дополнить другими квестами. Плюс зачем использовать метод Query для обращения к бд, если тебе не нужно что-то вернуть с бд.
Плюс, что за dbconnection.js?

1656851127765.png



Не понятно что там внутри, самого файла среди других файлов нет. Неужели нет каких-то Execute методов для таких случаев, которые я описал выше.

Соблюдай один код-стайл. Где-то переносишь, где-то нет.
1656851204987.png


Зачем лишнее поле, которое нигде не используется?
1656851291154.png


Также, если какое-то поле у тебя инициализируется и больше не меняется, лучше используй const
1656851369348.png
1656851391755.png


Данные имена переменных не несут никакого смысла хоть и понятно, что тут происходит, но всё же лучше давать какие-то несущие названия
1656851564832.png


Опять же вопрос к форматированию, забыл отступы
1656851706582.png


Используй return в условиях, чтобы не плодить матрешку из условий
1656851765152.png


Ничего плохого не произошло бы, напиши ты слово EVENT как все другие слова -> Event
Выглядит некрасиво и неправильно. Не стоит так слова выделять из общего названия
Также здесь можно было бы после проверки на browserNick сделать return, если нам не подходит условие и не делать ненужный отступ нашему коду ниже
1656851850679.png



Ни в коем случае я не имею ничего плохого насчет тебе или кого-то/чего-то ещё. Наоборот, я надеюсь, что это поможет тебе писать немного получше. Если у кого-то ещё есть какие-то замечания, то оставляйте, быть может и я был где-то не прав
 

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
Сделай лучше сразу так, чтобы легко было дополнить другими квестами. Плюс зачем использовать метод Query для обращения к бд, если тебе не нужно что-то вернуть с бд.
Плюс, что за dbconnection.js?

Посмотреть вложение 4447


Не понятно что там внутри, самого файла среди других файлов нет. Неужели нет каких-то Execute методов для таких случаев, которые я описал выше.

Соблюдай один код-стайл. Где-то переносишь, где-то нет.
Посмотреть вложение 4448

Зачем лишнее поле, которое нигде не используется?
Посмотреть вложение 4449

Также, если какое-то поле у тебя инициализируется и больше не меняется, лучше используй const
Посмотреть вложение 4450 Посмотреть вложение 4451


Данные имена переменных не несут никакого смысла хоть и понятно, что тут происходит, но всё же лучше давать какие-то несущие названия
Посмотреть вложение 4452

Опять же вопрос к форматированию, забыл отступы
Посмотреть вложение 4453

Используй return в условиях, чтобы не плодить матрешку из условий
Посмотреть вложение 4454

Ничего плохого не произошло бы, напиши ты слово EVENT как все другие слова -> Event
Выглядит некрасиво и неправильно. Не стоит так слова выделять из общего названия
Также здесь можно было бы после проверки на browserNick сделать return, если нам не подходит условие и не делать ненужный отступ нашему коду ниже
Посмотреть вложение 4455


Ни в коем случае я не имею ничего плохого насчет тебе или кого-то/чего-то ещё. Наоборот, я надеюсь, что это поможет тебе писать немного получше. Если у кого-то ещё есть какие-то замечания, то оставляйте, быть может и я был где-то не прав
Спасибо, следующий раз учту ;)
 

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
ВИДЕО МАНУАЛ

 
Последнее редактирование:
  • Like
Реакции: DonParuyr

filecore

Специалист
high coder
6 Окт 2020
227
86
82
Сделай лучше сразу так, чтобы легко было дополнить другими квестами. Плюс зачем использовать метод Query для обращения к бд, если тебе не нужно что-то вернуть с бд.
Плюс, что за dbconnection.js?

Посмотреть вложение 4447


Не понятно что там внутри, самого файла среди других файлов нет. Неужели нет каких-то Execute методов для таких случаев, которые я описал выше.

Соблюдай один код-стайл. Где-то переносишь, где-то нет.
Посмотреть вложение 4448

Зачем лишнее поле, которое нигде не используется?
Посмотреть вложение 4449

Также, если какое-то поле у тебя инициализируется и больше не меняется, лучше используй const
Посмотреть вложение 4450 Посмотреть вложение 4451


Данные имена переменных не несут никакого смысла хоть и понятно, что тут происходит, но всё же лучше давать какие-то несущие названия
Посмотреть вложение 4452

Опять же вопрос к форматированию, забыл отступы
Посмотреть вложение 4453

Используй return в условиях, чтобы не плодить матрешку из условий
Посмотреть вложение 4454

Ничего плохого не произошло бы, напиши ты слово EVENT как все другие слова -> Event
Выглядит некрасиво и неправильно. Не стоит так слова выделять из общего названия
Также здесь можно было бы после проверки на browserNick сделать return, если нам не подходит условие и не делать ненужный отступ нашему коду ниже
Посмотреть вложение 4455


Ни в коем случае я не имею ничего плохого насчет тебе или кого-то/чего-то ещё. Наоборот, я надеюсь, что это поможет тебе писать немного получше. Если у кого-то ещё есть какие-то замечания, то оставляйте, быть может и я был где-то не прав
Т.е. тебя смутило все кроме самого главного) при входе в колшейп дергать базу постоянно)
Запиши в player значечение статуса квеста один раз при входе когда ты грузить все данные игрока
 

JJIGolem

Гуру
high coder
19 Окт 2020
211
270
142
Т.е. тебя смутило все кроме самого главного) при входе в колшейп дергать базу постоянно)
Запиши в player значечение статуса квеста один раз при входе когда ты грузить все данные игрока
честно, не обратил на это внимание, но ты прав, это очень плохая практика