Sign in to follow this  
Followers 0
kemperrr

Кастомная функция getData на клиенте ( для игроков )

2 posts in this topic

Posted (edited)

ВНИМАНИЕ !!! ТОЛЬКО ДЛЯ 0.2

 

Недавно понадобился getData для игроков, сделал на скорую руку простую реализацию.

 

CLIENT

 

 

 


//Держит в себе "Пропуск" и "Отклонение" от всех промисов
let promises = []

//Генерирует хеш для идентификации промиса при возвращении данных с сервера
//thx banou
const UUID = (a) => {
  return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, UUID)
}

//Функа для проверки строки на JSON
const IsJSONString = (str) => {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

//Базовый класс для отправки запроса на данные
class getDataToServer {
    /**
     * 
     * @param {String} name 
     * @param {Object} entity 
     * @param {String} type 
     */
    constructor(name, entity, type) {
        this.name = name
        this.entity = entity
        this.type = type
    }

    /**
     * @summary Запускает запрос на данные
     */
    go() {
        return new Promise((resolve, reject) => {
            //Генерируем хеш
            const uuid = UUID()
            //Записываем в массив по ключу uuid, resolve и reject от промиса
            promises[uuid] = {resolve, reject}
            //отправляем на сервер запрос на данные 
            mp.events.callRemote(`getData:server:${this.type}`, uuid, this.name, this.entity)
        })
    }
}

mp.events.add({
    'playerJoin': (player) => {
        //при коннекте записываем игроку функцию выполнения запроса на сервер
        player.getData = (name) => {
            return new Promise((resolve, reject) => {
                const getDataServer = new getDataToServer(name, player, 'players')
                getDataServer.go().then(data => {
                    if(IsJSONString(data)) 
                        data = JSON.parse(data)
                    resolve(data)
                }).catch(reject)
            })
        }
    },
    'getData:client:players': (uuid, data) => {
        //Берем resolve и reject из массива по хэшу
        const req = promises[uuid] 
        
        //Если data == undefined то промис "отказывает"
        if(data == undefined) 
            req.reject('Нет данных? Все пошло по пизде')
        //Если data не равна undefined то промис "пропускает" данные    
        else
            req.resolve(data)
    }
})

//При первом запуске скрипта проходимся по всем игрокам и записываем им функу
mp.players.forEach(item => {
    item.getData = (name) => {
        return new Promise((resolve, reject) => {
            const getDataServer = new getDataToServer(name, item, 'players')
            getDataServer.go().then(data => {
                if(IsJSONString(data)) 
                    data = JSON.parse(data)
                resolve(data)
            }).catch(reject)
        })
    }
})

 

 

SERVER

 

 

 



let globalData = []
mp.events.add({ 
    'getData:server:players': (player, hash, name, entity) => {
        let data = null;
        globalData.forEach(item => {
            if(item.entity == entity && item.name == name) {
                return data = item.data
            } 
        })
        if(typeof data == 'object') {
            data = JSON.stringify(data)
        }
        player.call('getData:client:players', hash, data)
    },
    'playerJoin': (player) => {
        player.setData = (name, data) => {
            let getID = false
            globalData.forEach((item, id) => {
                if(item.entity == player && item.name == name) {
                    return getID = id
                } 
            })

            if(typeof getID != 'boolean')
                globalData[getID].data = data
            else
                globalData.push({entity: player, name, data})
        }
    }
})

 

 

Использование

 

 

 




//==========[SERVER]==========
mp.events.add('playerJoin', player => {
	player.setData('headOverlay', [1, 2, 3])
})

//==========[CLIENT]==========
mp.events.add('entityStreamIn', entity => {
 	if(entity.getType() == 4 || entity.getType() == 5) { 
  		 entity.getData('headOverlay').then(data => {
           	entity.setHeadOverlay(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]))
         }).catch(err => mp.game.graphics.notify(`getData:ERR : ${err}`)
    }
})

 

 

 

 

Edited by kemperrr
4 people like this

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.