From 09812fa81b220769a06a012c59f65b0f4b8ce4ea Mon Sep 17 00:00:00 2001 From: wish Date: Fri, 5 Aug 2022 16:38:42 +1000 Subject: [PATCH] stage improvements --- network/mhfpacket/msg_sys_enumerate_stage.go | 20 ++++++++-------- server/channelserver/handlers_stage.go | 24 +++++++++++--------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/network/mhfpacket/msg_sys_enumerate_stage.go b/network/mhfpacket/msg_sys_enumerate_stage.go index 802b385f5..925f8944d 100644 --- a/network/mhfpacket/msg_sys_enumerate_stage.go +++ b/network/mhfpacket/msg_sys_enumerate_stage.go @@ -1,19 +1,19 @@ package mhfpacket -import ( - "errors" +import ( + "errors" + "erupe-ce/common/stringsupport" - "erupe-ce/network/clientctx" - "erupe-ce/network" "erupe-ce/common/byteframe" + "erupe-ce/network" + "erupe-ce/network/clientctx" ) // MsgSysEnumerateStage represents the MSG_SYS_ENUMERATE_STAGE type MsgSysEnumerateStage struct { - AckHandle uint32 - Unk0 uint8 // Hardcoded 1 in the binary - StageIDLength uint8 - StageID string // NULL terminated string. + AckHandle uint32 + Unk0 uint8 // Hardcoded 1 in the binary + StageID string // NULL terminated string. } // Opcode returns the ID associated with this packet type. @@ -25,8 +25,8 @@ func (m *MsgSysEnumerateStage) Opcode() network.PacketID { func (m *MsgSysEnumerateStage) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() m.Unk0 = bf.ReadUint8() - m.StageIDLength = bf.ReadUint8() - m.StageID = string(bf.ReadBytes(uint(m.StageIDLength))) + bf.ReadUint8() + m.StageID = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) return nil } diff --git a/server/channelserver/handlers_stage.go b/server/channelserver/handlers_stage.go index 4fcdcbfc2..81ddb36f4 100644 --- a/server/channelserver/handlers_stage.go +++ b/server/channelserver/handlers_stage.go @@ -2,6 +2,7 @@ package channelserver import ( "fmt" + "strings" "time" "erupe-ce/common/byteframe" @@ -198,22 +199,24 @@ func handleMsgSysLeaveStage(s *Session, p mhfpacket.MHFPacket) {} func handleMsgSysLockStage(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysLockStage) // TODO(Andoryuuta): What does this packet _actually_ do? + // I think this is supposed to mark a stage as no longer able to accept client reservations doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) } func handleMsgSysUnlockStage(s *Session, p mhfpacket.MHFPacket) { - s.reservationStage.RLock() - defer s.reservationStage.RUnlock() + if s.reservationStage != nil { + s.reservationStage.RLock() + defer s.reservationStage.RUnlock() - for charID := range s.reservationStage.reservedClientSlots { - session := s.server.FindSessionByCharID(charID) - session.QueueSendMHF(&mhfpacket.MsgSysStageDestruct{}) + for charID := range s.reservationStage.reservedClientSlots { + session := s.server.FindSessionByCharID(charID) + session.QueueSendMHF(&mhfpacket.MsgSysStageDestruct{}) + } + + delete(s.server.stages, s.reservationStage.id) } - s.server.Lock() - defer s.server.Unlock() - - delete(s.server.stages, s.reservationStage.id) + destructEmptyStages(s) } func handleMsgSysReserveStage(s *Session, p mhfpacket.MHFPacket) { @@ -366,8 +369,7 @@ func handleMsgSysEnumerateStage(s *Session, p mhfpacket.MHFPacket) { continue } - // Check for valid stage type - if sid[3:5] != "Qs" && sid[3:5] != "Ms" && sid[3:5] != "Ls" { + if !strings.Contains(stage.id, pkt.StageID) { continue }