socket에 버전 부여해서 검증 및 클라이언트에 전달
if (!validateVersion(socket, deserializeData.version)) {
throw new Error(`버전이 일치하지 않습니다.`);
}
/**
* version 검증하는 함수
* @param {Socket} socket
* @param {String} newVersion
* @returns {boolean}
*/
export const validateVersion = (socket, newVersion) => {
socket.version = newVersion;
if (newVersion !== Config.CLIENT.VERSION) return false;
return true;
};
socket에 sequence 부여해서 검증 및 클라이언트에 전달
if (!validateSequence(socket, deserializeData.sequence)) {
throw new Error(`sequence가 변조되었습니다.`);
}
/**
* sequence 검증 함수
* @param {Socket} socket
* @param {number} newSequence
* @returns {boolean}
*/
export const validateSequence = (socket, newSequence) => {
if (!socket.sequence) {
socket.sequence = newSequence;
return true;
}
const sequenceDiff = newSequence - socket.sequence;
if (sequenceDiff > MAX_SEQUENCE_DIFF || sequenceDiff < 0) return false;
socket.sequence = newSequence;
return true;
};
타워가 사거리에 관계없이 상대방의 몬스터도 같이 공격
이후 타워 공격 처리 부분에서 에러 발생
monsterId
host의 monsterId = 1 ...
1부터 1씩 상승
opponent의 monsterId = 1 ...
1부터 1씩 상승
towerId
타워가 매우 먼 거리의 몬스터도 타격
monsterId를 host와 opponent를 나눠서 고유 번호대를 부여
host 1 ~ 100000, opponent 100001 ~ ?
host는 게임 세션의 idx가 0인 유저
// 세션에 접속 중인 유저들 조회
const users = await redis.getUsers(socket.gameId);
let monsterId = 0;
let lastId;
if (monsterData.length > 0) {
lastId = Math.max(...monsterData.map((el) => el.monsterId));
} else {
lastId = users[0] === socket.id ? 0 : 100000;
}
monsterId = ++lastId;
자신의 몬스터만 정상적으로 공격.