Return error when player exists in dictionary Modifications to list call Debug RPC method Debug RPC method -S Include client changes
74 lines
2.6 KiB
Go
74 lines
2.6 KiB
Go
package control
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"github.com/heroiclabs/nakama-common/runtime"
|
|
)
|
|
|
|
type Match struct{}
|
|
|
|
type MatchState struct {
|
|
presences map[string]runtime.Presence
|
|
inputs map[string]string
|
|
positions map[string]string
|
|
jumps map[string]string
|
|
colors map[string]string
|
|
names map[string]string
|
|
}
|
|
|
|
func (m *Match) MatchInit(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, params map[string]interface{}) (interface{}, int, string) {
|
|
state := &MatchState{
|
|
presences: map[string]runtime.Presence{},
|
|
inputs: map[string]string{},
|
|
positions: map[string]string{},
|
|
jumps: map[string]string{},
|
|
colors: map[string]string{},
|
|
names: map[string]string{},
|
|
}
|
|
tickRate := 10
|
|
label := "{\"name\": \"Game World\"}"
|
|
|
|
return state, tickRate, label
|
|
}
|
|
|
|
func (m *Match) MatchJoinAttempt(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, dispatcher runtime.MatchDispatcher, tick int64, state interface{}, presence runtime.Presence, metadata map[string]string) (interface{}, bool, string) {
|
|
mState, _ := state.(*MatchState)
|
|
if _, ok := mState.presences[presence.GetUserId()]; ok {
|
|
return mState, false, "User already logged in."
|
|
} else {
|
|
return mState, true, ""
|
|
}
|
|
|
|
}
|
|
|
|
func (m *Match) MatchJoin(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, dispatcher runtime.MatchDispatcher, tick int64, state interface{}, presences []runtime.Presence) interface{} {
|
|
mState, _ := state.(*MatchState)
|
|
for _, precense := range presences {
|
|
mState.presences[precense.GetUserId()] = precense
|
|
}
|
|
return mState
|
|
}
|
|
|
|
func (m *Match) MatchLeave(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, dispatcher runtime.MatchDispatcher, tick int64, state interface{}, presences []runtime.Presence) interface{} {
|
|
mState, _ := state.(*MatchState)
|
|
for _, presence := range presences {
|
|
delete(mState.presences, presence.GetUserId())
|
|
}
|
|
return mState
|
|
}
|
|
|
|
func (m *Match) MatchLoop(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, dispatcher runtime.MatchDispatcher, tick int64, state interface{}, messages []runtime.MatchData) interface{} {
|
|
// Custom code to:
|
|
// - Process the messages received.
|
|
// - Update the match state based on the messages and time elapsed.
|
|
// - Broadcast new data messages to match participants.
|
|
|
|
return state
|
|
}
|
|
|
|
func (m *Match) MatchTerminate(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, dispatcher runtime.MatchDispatcher, tick int64, state interface{}, graceSeconds int) interface{} {
|
|
return state
|
|
}
|