이곳의 내용을 번역(약간의 의역)한 것입니다.
오늘은 SMAPI에서 제공하는 Multiplayer 이벤트들을 알아보도록 하자.
멀티플레이어 메세지와 connection 관련하여 this.Helper.Events.Multiplayer가 여러 이벤트를 지니고 있다.
| event | summary |
| PeerContextReceived | 플레이어가 mod context를 받으면 발생한다. 호스트, 클라이언트(framhand) 상관 없이 모든 플레이어에게 적용된다. SMAPI가 설치되어있지 않아도 해당된다. 이 이벤트는 SMAPI로 플레이어에게 메세지를 보낼 수 있는 가장 초기 시점이라 보면 된다. 게임이 연결을 승인하기 직전 이 이벤트가 발생하기 때문에, 그 시점에 플레이어는 아직 게임에 없다. 호스트에 연결할 때 Game1.isMasterGame, Context.IsMultiplayer 같은 contextual 필드가 초기화되지 않았을 수도 있다. 대신 호스트 context는 가장 빨리 수신되므로 e.Peer.isHost을 이용하여 현재 플레이어가 클라이언트(framhand)인지 검사할 수 있다. 다른 모드가 연결을 방해하지 않는다는 가정 하에 연결(connection)은 이 이벤트 다음 시점(직후)에 승인된다. Event arguments: |
| PeerConnected | 다른 플레이어의 연결이 게임에서 승인되었을 때 발생한다. (호스트, 클라이언트 상관 없이) 모든 플레이어에게 적용된다. SMAPI를 설치하지 않은 플레이어도 해당된다. 이 이벤트는 PeerContextReceived 이후에 발생한다.
플레이어가 이 시점에 게임에 연결되므로 Game1.server.kick같은 메서드가 실행될 것이다. Event arguments: |
| ModMessageReceived | mod message가 네트워크를 통해 수신되었을 때 발생한다.
Event arguments: | event arg | type | description | | e.FromPlayerID | long | 메시지를 보낸 플레이어의 unique ID. | | e.FromModID | string | 메시지를 보낸 mod의 unique ID. | | e.Type | string | 핸들링해야할지 결정할 때 사용하는 메시지 타입. 전역적으로 unique하다는 보장이 없기 때문에 FromModID 필드도 검사해야 한다. | | e.ReadAs<TModel>() | method returns TModel | e.ReadAs<MyMessageClass>() or e.ReadAs<string>()과 같이 주어진 타입으로 메시지 데이터를 읽어들인다. 또한 데이터를 읽어들일때마다 새로운 인스턴스를 리턴한다. | |
| PeerDisconnected | 플레이어의 접속이 끊겼을 때 발생한다. Event arguments: |
이제 무엇을 해야 하나?
지금까지 정해진건 이렇다.
어떤 서버를 사용하는가
- Amazon Web Services EC2 t3a.small 인스턴스
- 8 GB EBS Storage
- Amazon Linux 2 (레드햇 기반)
서버에서 무엇을 돌리는가
- Stardew Valley!
- SMAPI를 이용한 관리 모드
- Node.js를 이용한 웹서버 (관리페이지, SMAPI 모드와 통신)
- Redis 데이터베이스. SQL은 싫어🙄 Redis를 메인 데이터베이스로 쓸거다.
어떻게 접속할 수 있는가
- 클라이언트에서 굳이 SMAPI를 설치할 필요는 없다. 관리페이지에 접속해서 로그인하고 서버 접속 버튼을 눌러놓으면, 잠시 뒤 서버가 자동으로 여러분에게 (Stardew Valley) 멀티플레이 초대를 한다. 게임 초대를 승인하면 클라이언트가 서버에서 실행중인 Stardew Valley와 통신하기 시작한다.
예상 비용은?
한 달 총 비용 2400원이 목표. 사람을 더 모으면 1인당 몇백원대로 떨어질거다. 그 전까지는 열심히 서비스에 다이어트를 시키자.
그래서 무엇을 해야 하나?

Node.js는 나머지 파트를 계속 배우면 되고, SMAPI용 모드를 만들려면 C#도 학습해야 한다. C#은 Java와 비슷한 점이 너무 많아서 하루에 100페이지씩 나가도 될 것 같다. C# 이거는 2019년에 산 책인데... 이제는 그만 놀고 좀 읽어야 하지 않겠니?
예상 외로 SMAPI가 멀티플레이 관련해서 제공하는 기능이 너무 적었다. 그래서 Steam API쪽도 더 훑어볼 필요가 있다. 생각보다 Node.js에 더 많은 작업을 끼얹을 것 같은 느낌이다.😶
사무실에 gpu 달린 서버가 있는데 테스트 해볼 수 있을까요??