Sign in to follow this  
kemperrr

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

Recommended Posts

kemperrr    137

ВНИМАНИЕ !!! ТОЛЬКО ДЛЯ 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`, uuid, this.name, this.entity)
        })
    }
}

exports.init = () => {
	mp.events.add({
		'getData:client': (hash, data) => {
			const req = promises[hash];
			
			if(!data) 
				req.reject('Нет данных? Все пошло по пизде');
			else
				req.resolve(data);
		}
	})

global.getData = (entity, dataName) => {
	return new Promise((resolve, reject) => {
		const getDataServer = new getDataToServer(dataName, entity);
			getDataServer.go().then(data => {
				if(IsJSONString(data))
					data = JSON.parse(data);
				resolve(data);
			}).catch(reject);
		});
	}
}

 

 

SERVER

 

 

 


let globalDataPlayers = new Map();
let globalDataVehicles = new Map();

global.getData = (entity, name) => {
	const type = entity.type === 'player' ? 'globalDataPlayers' : entity.type === 'vehicle' ? 'globalDataVehicles' : null;
    if(typeof type !== 'string') return;
    return [type].get(name);
}
global.setData = (entity, name, data) => {
 	 const type = entity.type === 'player' ? 'globalDataPlayers' : entity.type === 'vehicle' ? 'globalDataVehicles' : null;
    if(typeof type !== 'string') return;
    return [type].set(name);
}
mp.events.add({ 
    'getData:server': (player, hash, name, entity) => {
      	const type = entity.type === 'player' ? 'globalDataPlayers' : entity.type === 'vehicle' ? 'globalDataVehicles' : null;
        if(typeof type !== 'string') return;
        let data = [type].get(name);
        if(typeof data == 'object')
            data = JSON.stringify(data)
        player.call('getData:client', hash, data)
    }
})

 

 

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

 

 

 



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

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

 

 

 

 

Edited by kemperrr
  • Like 6

Share this post


Link to post
Share on other sites
Leone    6

Отлично! Что то мне не верится что  ты всему этому за 8 месяцев научился. ;)

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  

  • Recently Browsing   0 members

    No registered users viewing this page.