[ 2024.11.08 TIL ] 타워 디펜스 온라인

박지영·2024년 11월 8일
0

Today I Learned

목록 보기
76/84

타워 디펜스 온라인

검증 로직 추가

version 검증

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;
};

sequence 검증

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

    • host의 초기 타워 3개 = 1, 2, 3
    • opponent 초기 타워 3개 = 4, 5, 6
  • 타워가 매우 먼 거리의 몬스터도 타격

원인 추론

  • monsterId가 같아서 생기는 문제

해결

  • 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;

자신의 몬스터만 정상적으로 공격.

profile
신입 개발자

0개의 댓글