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

Мануал Система квестов для 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%;
}
 
Последнее редактирование:
Реакции: vv_vova, XDDDD и PATRIOT

JJIGolem

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




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

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


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


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


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


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


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


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



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

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
Спасибо, следующий раз учту
 

og sofly

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

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

filecore

Специалист
high coder
6 Окт 2020
227
87
82
Т.е. тебя смутило все кроме самого главного) при входе в колшейп дергать базу постоянно)
Запиши в player значечение статуса квеста один раз при входе когда ты грузить все данные игрока
 

JJIGolem

Гуру
high coder
19 Окт 2020
217
275
142
честно, не обратил на это внимание, но ты прав, это очень плохая практика