2. ‘아이펀 엔진으로 MO 게임 서버 개발하기’
2019 iFunFactory Dev Day
2
남승현 프로그래머
MO 게임 콘텐츠 채워 넣기
3. 2019 iFunFactory Dev Day
목차
• 게임 소개
• 프로젝트 생성
• 데이터베이스 처리 구현
• 기획 데이터 읽기
• 로그인 및 계정 생성
• 캐릭터 이동 (시연)
• 월드와 서버 이동 (시연)
• 캐릭터 공격 (시연)
• 인벤토리 & 랭킹
• 채팅 (시연)
3
4. 2019 iFunFactory Dev Day 4
게임 소개
• Town 과 Field 두 개의 월드로 구성
• 각 월드는 독립된 서버로 구성
• 포탈을 이용하여 두 월드(=서버)를 이동
• Field 월드 에서는 발차기 공격이 가능
• 다른 플레이어를 죽이면 경험치를 획득
• 경험치 랭킹
5. 2019 iFunFactory Dev Day 5
프로젝트 생성
• C++
• Ubuntu
• iFun Engine 의 funapi_initiator 명령어로 프로젝트 생성
6. 2019 iFunFactory Dev Day 6
데이터베이스 처리 구현
• iFun Engine ORM 이용
• DB Table, Query(Stored Procedure) 자동으로 생성, 수정, 호출됨
• 자동으로 만들어지는 C++ 인터페이스 클래스를 사용
• 주요 작업
1. “src/object_model/example.json” 에 모델 정의
2. 빌드하여 인터페이스 클래스 생성
7. 2019 iFunFactory Dev Day 7
데이터베이스 처리 구현: 1. 모델 정의
<src/object_model/example.json>
9. 2019 iFunFactory Dev Day 9
기획 데이터 읽기
• iFun Engine ResourceManager 를 이용
• 기획 데이터를 JSON 으로 표현
• 서버를 DEB, RPM 패키지에 포함되어 자동으로 설치됨
• 파일 경로 자동으로 관리
• 주요 작업
1. 기획 데이터 정의
2. 데이터 읽기
10. 2019 iFunFactory Dev Day 10
기획 데이터 읽기: 1. 기획 데이터 정의
<game_data/content_settings.json>
11. 2019 iFunFactory Dev Day 11
기획 데이터 읽기: 2. 데이터 읽기
• iFun Engine API: ResourceManager
12. 2019 iFunFactory Dev Day 12
기획 데이터 읽기: 2. 데이터 읽기
<src/devday_server.cc 의 Install() 함수>
14. 2019 iFunFactory Dev Day 14
로그인 및 계정생성
• iFun Engine SessionService 를 이용하여 TCP/JSON 통신
• AccountManager 를 이용하여 로그인 처리
• World 기능을 이용하여 캐릭터 동기화
• 주요 작업
1. 클라이언트 TCP 접속 받기
2. 로그인 메시지 핸들러: 등록
3. 로그인 메시지 핸들러: 로그인, 중복로그인 처리
4. 로그인 메시지 핸들러: 캐릭터(ORM) 불러오기/생성하기
5. 로그인 메시지 핸들러: 캐릭터를 월드에 입장시키기
15. 2019 iFunFactory Dev Day 15
로그인 및 계정생성: 1. 클라이언트 TCP 접속 받기
<src/MANIFEST.town.json>
16. 2019 iFunFactory Dev Day 16
로그인 및 계정생성: 2. 로그인 메시지 핸들러 - 등록
• iFun Engine API: SessionService
17. 2019 iFunFactory Dev Day 17
로그인 및 계정생성: 2. 로그인 메시지 핸들러 - 등록
<src/town_event_handlers.cc>
18. 2019 iFunFactory Dev Day 18
로그인 및 계정생성: 2. 로그인 메시지 핸들러 - 등록
<src/town_event_handlers.cc>
19. 2019 iFunFactory Dev Day 19
로그인 및 계정생성: 3. 로그인 메시지 핸들러 - 로그인
• iFun Engine API: AccountManager
• iFun Engine API: Event
20. 2019 iFunFactory Dev Day 20
로그인 및 계정생성: 3. 로그인 메시지 핸들러 - 로그인
<OnLogin() 메시지 핸들러 함수>
21. 2019 iFunFactory Dev Day 21
로그인 및 계정생성: 4. 로그인 메시지 핸들러 - 캐릭터 불러오기/생성하기(ORM)
<빌드 시 자동으로 생성됨>
22. 2019 iFunFactory Dev Day 22
로그인 및 계정생성: 4. 로그인 메시지 핸들러 - 캐릭터 불러오기/생성하기(ORM)
<OnLogin1() 함수>
23. 2019 iFunFactory Dev Day 23
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
<iFun Engine 의 class World::Object>
24. 2019 iFunFactory Dev Day 24
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
<src/common.h>
25. 2019 iFunFactory Dev Day 25
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
• iFun Engine API: World
26. 2019 iFunFactory Dev Day 26
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
<src/MANIFEST.town.json>
27. 2019 iFunFactory Dev Day 27
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
<OnLogin1() 함수 계속>
28. 2019 iFunFactory Dev Day 28
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
<OnLogin1() 함수 계속>
29. 2019 iFunFactory Dev Day 29
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
• iFun Engine API: World
30. 2019 iFunFactory Dev Day 30
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
<src/common.cc>
31. 2019 iFunFactory Dev Day 31
로그인 및 계정생성: 5. 로그인 메시지 핸들러 - 캐릭터 월드에 입장 시키기
<src/common.cc>
32. 2019 iFunFactory Dev Day 32
캐릭터 이동
• iFun Engine World 기능을 사용하여 캐릭터가 World 내에서 뛰어다니고
• 위치 변화를 주변에 브로드캐스팅
• 주요 작업
1. 메시지 핸들러 등록
2. 월드 내에서 캐릭터 이동
3. 주변 캐릭터(=클라이언트)에 브로드캐스팅
4. 이동 후 새롭게 시야에 들어온 캐릭터 처리
38. 2019 iFunFactory Dev Day 38
월드 이동
• iFun Engine World 를 이용하여 포탈 구역 만들고
• 이동하려는 월드를 가지고 있는 다른 월드 서버 찾기
• AccountManager 를 이용하여 클라이언트를 다른 서버로 보내기
• 주요 작업
1. (Town) 포탈 구역 만들기
2. (Town) “field” 월드 서버 찾기
3. (Town) 클라이언트를 “field” 서버로 보내기
4. (Field) “field” 월드에 입장 시키기
51. 2019 iFunFactory Dev Day 51
캐릭터 공격
• 주요 작업
1. 메시지 핸들러 등록
2. 대상 캐릭터의 HP 를 감소 시킴
3. 대상 캐릭터가 죽었을 때 처리
초기 위치에서 부활
경험치 랭킹 점수 갱신
4. 주변 캐릭터(=클라이언트)에 브로드캐스트