PySupercell Core: Supercell 게임 서버 구축 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
소프트웨어 개발
대상자
- Python 및 네트워크 프로그래밍에 익숙한 개발자
- Supercell 게임 서버 아키텍처 구현을 원하는 중급 이상 개발자
- 게임 서버 핵심 로직 개발에 관심 있는 프로그래머
- 난이도: 중급 (Python 기초 및 네트워크 프로토콜 이해 필요)
핵심 요약
- PySupercell Core(PSC)는 Supercell 게임의 서버 기반 아키텍처를 구현한 Python 기반 서버 핵심으로, 완전한 서버가 아닌 로직 구현이 필요한 프레임워크입니다.
PiranhaMessage
클래스를 상속받아decode()
및encode()
메서드를 구현해야 하며,MessageManager.receive_message()
를 통해 패킷을 처리합니다.- 예시:
LoginMessage
와LoginOkMessage
클래스는 각각 클라이언트 로그인 요청 및 응답을 처리합니다.
섹션별 세부 요약
1. PySupercell Core 설치 및 설정
- repo 클론 및 의존성 설치:
```bash
git clone
cd pysupercell-core
pip install -r requirements.txt
```
- 게임별 매직 코드 설정:
- logic_magic_message_factory.py
에서 게임의 codename(magic
, laser
등)을 변경해야 합니다.
- 구성 파일 설정:
- config.toml
에서 major_version
, build
, content_version
, environment
등을 설정합니다.
2. 메시지 클래스 구현
LoginMessage
클래스 구조:
- PiranhaMessage
상속:
```python
class LoginMessage(PiranhaMessage):
def __init__(self):
super().__init__()
self.account_id = LogicLong()
self.pass_token = ""
self.major_version = 0
```
- decode()
메서드: 스트림에서 account_id
, pass_token
, major_version
을 읽어옵니다.
- get_message_type()
메서드: 메시지 타입 10101
을 반환합니다.
LoginOkMessage
클래스 구조:
- encode()
메서드: 서버 응답을 위한 account_id
, home_id
, pass_token
을 스트림에 씁니다.
- 메시지 타입: 20104
를 반환합니다.
3. 메시지 처리 및 응답 전송
MessageManager
클래스 설계:
- receive_message()
메서드에서 메시지 타입에 따라 on_login()
과 같은 핸들러를 호출합니다.
- 예시:
```python
async def receive_message(self, message):
match message.get_message_type():
case 10101:
await self.on_login(message)
```
on_login()
메서드:
- LoginOkMessage
인스턴스를 생성하고, account_id
, pass_token
을 채우고, send_message()
로 클라이언트에 전송합니다.
- ```python
async def on_login(self, message: LoginMessage):
response = LoginOkMessage()
response.account_id = ...
await self.connection.send_message(response)
```
결론
- PSC는 서버 핵심만 제공하므로, 개발자는
PiranhaMessage
상속 및MessageManager
기반의 메시지 처리 로직을 반드시 구현해야 합니다. - 핵심 팁:
decode()
및encode()
메서드의 구현이 정확해야 클라이언트-서버 통신이 정상적으로 작동합니다. - 실무 적용 시 주의 사항: 게임별 매직 코드와 구성 파일(
config.toml
) 설정이 필수적이며, 메시지 타입(10101
,20104
등)에 대한 정확한 이해가 필요합니다.