From 19aadc6e10807c5cd2dec613a86d52a2c3cdf045 Mon Sep 17 00:00:00 2001 From: wish Date: Sun, 10 Mar 2024 19:50:21 +1100 Subject: [PATCH] enforce Stage.maxPlayers on MoveStage & BackStage --- server/channelserver/handlers_stage.go | 27 +++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/server/channelserver/handlers_stage.go b/server/channelserver/handlers_stage.go index 33bc014fe..e3196bc44 100644 --- a/server/channelserver/handlers_stage.go +++ b/server/channelserver/handlers_stage.go @@ -148,14 +148,19 @@ func removeSessionFromStage(s *Session) { destructEmptySemaphores(s) } +func isStageFull(s *Session, StageID string) bool { + if stage, exists := s.server.stages[StageID]; exists { + return len(stage.reservedClientSlots)+len(stage.clients) >= int(stage.maxPlayers) + } + return false +} + func handleMsgSysEnterStage(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysEnterStage) - if stage, exists := s.server.stages[pkt.StageID]; exists { - if len(stage.reservedClientSlots)+len(stage.clients) == int(stage.maxPlayers) { - doAckSimpleFail(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x01}) - return - } + if isStageFull(s, pkt.StageID) { + doAckSimpleFail(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x01}) + return } // Push our current stage ID to the movement stack before entering another one. @@ -182,6 +187,12 @@ func handleMsgSysBackStage(s *Session, p mhfpacket.MHFPacket) { backStage = "sl1Ns200p0a0u0" } + if isStageFull(s, backStage) { + s.stageMoveStack.Push(backStage) + doAckSimpleFail(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x01}) + return + } + if _, exists := s.stage.reservedClientSlots[s.charID]; exists { delete(s.stage.reservedClientSlots, s.charID) } @@ -195,6 +206,12 @@ func handleMsgSysBackStage(s *Session, p mhfpacket.MHFPacket) { func handleMsgSysMoveStage(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysMoveStage) + + if isStageFull(s, pkt.StageID) { + doAckSimpleFail(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x01}) + return + } + doStageTransfer(s, pkt.AckHandle, pkt.StageID) }