From 5e4eecc3823be23cfe822e52b09345d1adfec279 Mon Sep 17 00:00:00 2001 From: MikeIsAStar <99037623+MikeIsAStar@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:40:45 -0400 Subject: [PATCH] GPCM: Kick players who drop too many frames --- gpcm/error.go | 13 +++++++++++++ gpcm/kick.go | 4 +++- gpcm/login.go | 1 - gpcm/report.go | 17 +++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/gpcm/error.go b/gpcm/error.go index 9ec12bc..84323a1 100644 --- a/gpcm/error.go +++ b/gpcm/error.go @@ -351,6 +351,19 @@ var ( "Error Code: %[1]d", }, } + + WWFCMsgTooManyFramesDropped = WWFCErrorMessage{ + ErrorCode: 22010, + MessageRMC: map[byte]string{ + LangEnglish: "" + + "Your game is dropping too many frames.\n" + + "Please remove any modifications that may\n" + + "be causing frame rate problems to avoid\n" + + "being banned from WiiLink Wi-Fi Connection.\n" + + "\n" + + "Error Code: %[1]d", + }, + } ) func (err GPError) GetMessage() string { diff --git a/gpcm/kick.go b/gpcm/kick.go index a4fe21b..8a3c712 100644 --- a/gpcm/kick.go +++ b/gpcm/kick.go @@ -25,6 +25,9 @@ func kickPlayer(profileID uint32, reason string) { case "invalid_elo": errorMessage = WWFCMsgInvalidELO + case "too_many_frames_dropped": + errorMessage = WWFCMsgTooManyFramesDropped + case "network_error": // No error message common.CloseConnection(ServerName, session.ConnIndex) @@ -37,7 +40,6 @@ func kickPlayer(profileID uint32, reason string) { Fatal: true, WWFCMessage: errorMessage, }) - common.CloseConnection(ServerName, session.ConnIndex) } } diff --git a/gpcm/login.go b/gpcm/login.go index 04a20d9..f3769e1 100644 --- a/gpcm/login.go +++ b/gpcm/login.go @@ -269,7 +269,6 @@ func (g *GameSpySession) login(command common.GameSpyCommand) { otherSession, exists := sessions[g.User.ProfileId] if exists { otherSession.replyError(ErrForcedDisconnect) - common.CloseConnection(ServerName, otherSession.ConnIndex) for i := 0; ; i++ { mutex.Unlock() diff --git a/gpcm/report.go b/gpcm/report.go index 767bf77..3df6a8c 100644 --- a/gpcm/report.go +++ b/gpcm/report.go @@ -1,6 +1,7 @@ package gpcm import ( + "fmt" "strconv" "wwfc/common" "wwfc/logging" @@ -60,6 +61,22 @@ func (g *GameSpySession) handleWWFCReport(command common.GameSpyCommand) { } logging.Warn(g.ModuleName, "Room stall caused by", aurora.BrightCyan(strconv.FormatUint(profileId, 10))) + + case "mkw_too_many_frames_dropped": + if g.GameName != "mariokartwii" { + logging.Warn(g.ModuleName, "Ignoring mkw_too_many_frames_dropped from wrong game") + continue + } + + framesDropped, err := strconv.ParseUint(value, 10, 32) + if err != nil { + logging.Error(g.ModuleName, "Error decoding mkw_too_many_frames_dropped:", err.Error()) + continue + } + + profileId := g.User.ProfileId + logging.Warn(g.ModuleName, "Kicking", aurora.BrightCyan(strconv.FormatUint(uint64(profileId), 10)), fmt.Sprintf("for dropping too many frames (%d)", framesDropped)) + kickPlayer(profileId, "too_many_frames_dropped") } } }