오늘은 제가 맡은 몬스터 생성 및 몬스터 죽음 요청을 처리하는 로직을 작성해 보았습니다.
몬스터 생성 요청이 들어올때 실행할 handler함수입니다.
import Monster from '../../classes/models/monster.class.js';
import { PacketType } from '../../constants/header.js';
import { getUserBySocket } from '../../sessions/user.session.js';
import { createResponse } from '../../utils/response/createRespose.js';
export const spawnMonsterHandler = async ({ packetType, data, socket }) => {
try {
const user = getUserBySocket(socket); // 게임세션에 참여한 user찾기
if (!user) {
throw new Error('해당 유저가 존재하지 않습니다.');
}
const gameSession = user.getGameSession(); // 게임 세션 조회
if (!gameSession) {
throw new Error('해당 게임 세션이 존재하지 않습니다.');
}
// 세션 저장
const monster = user.createMonster();
const responseData = {
monsterId: monster.id,
monsterNumber: monster.monsterNumber,
};
const spawnMonsterResponse = createResponse(
PacketType.SPAWN_MONSTER_RESPONSE,
responseData,
socket,
);
socket.write(spawnMonsterResponse);
// 내가 생성한 몬스터 정보 다른 상대(클라)에게 알려주기
gameSession.getAllSpawnEnemyMonster(user.id, monster);
} catch (e) {
console.error(e);
// handlerError(socket, e);
}
};
몬스터 죽음 요청이 들어올때 실행할 handler함수입니다.
import { getUserBySocket } from '../../sessions/user.session.js';
export const monsterDeathNotifyHandler = async ({ packetType, data, socket }) => {
try {
const { monsterId } = data;
const user = getUserBySocket(socket); // 게임세션에 참여한 user찾기
if (!user) {
throw new Error('해당 유저가 존재하지 않습니다.');
}
const gameSession = user.getGameSession(); // 게임 세션 조회
if (!gameSession) {
throw new Error('해당 게임 세션이 존재하지 않습니다.');
}
const monster = user.getMonster(monsterId); // 저장된 몬스터 조회
if (!monster) {
console.log(monster);
console.log(user.monster);
throw new Error('몬스터 정보가 존재하지 않습니다.');
}
// 해당 몬스터 세션에 저장된 정보 삭제
user.removeMonster(monsterId);
user.score += 100;
user.gold += 100;
// 이제 다른 유저에게 나의 몬스터상황 알려주기
gameSession.notifyEnemyMonsterDeath(user.id, monsterId);
//user.getAllState();
gameSession.getAllState(user.id);
} catch (e) {
console.error(e);
}
};
일단 현재 game클래스(게임세션)안에 작성하였습니다.
// game.class.js
// 현재 생성한 몬스터 정보를 다른유저에게 알리는 함수
getAllSpawnEnemyMonster(userId, monster) {
const monsterData = {
monsterId: monster.id,
monsterNumber: monster.monsterNumber,
};
this.users
.filter((user) => user.id !== userId)
.forEach((otherUser) => {
const notification = makeNotification(
PacketType.SPAWN_ENEMY_MONSTER_NOTIFICATION,
monsterData,
otherUser.socket,
);
otherUser.socket.write(notification); // 다른 유저에게 새 몬스터 정보 알림
});
}
// 이거는 자기 몬스터 상황을 다른 유저들에게 알리는 함수
notifyEnemyMonsterDeath(userId, monsterId) {
this.users
.filter((user) => user.id !== userId)
.forEach((otherUser) => {
const notification = makeNotification(
PacketType.ENEMY_MONSTER_DEATH_NOTIFICATION,
{ monsterId },
otherUser.socket,
);
otherUser.socket.write(notification);
}); // 여기서 다른 유저들(다른 클라이언트)에게 상황을 전달
}
사실 처음에 이게 notification할때 나한테 상대의 정보를 알려주는 것인지 아님 내 상황을 다른 상대한테 알려주는 것인지 아님 나 또한 notification을 받아야 하는지 순간 순간 많이 헷갈렸던거 같습니다. 여러 시행착오를 하다가 알맞는 코드를 찾은 것 같아 다행인 것 같습니다.
오늘도 화이팅!