From 264b0ced6bc89b34858c098cde5162940522c19c Mon Sep 17 00:00:00 2001 From: Houmgaor Date: Wed, 18 Feb 2026 19:38:22 +0100 Subject: [PATCH] refactor(channelserver): extract Raviente struct and methods into raviente.go Consolidate Raviente-related code from sys_channel_server.go and handlers_register.go into a dedicated file for better organization. --- server/channelserver/handlers_register.go | 10 -- server/channelserver/raviente.go | 118 +++++++++++++++++++++ server/channelserver/sys_channel_server.go | 99 ----------------- 3 files changed, 118 insertions(+), 109 deletions(-) create mode 100644 server/channelserver/raviente.go diff --git a/server/channelserver/handlers_register.go b/server/channelserver/handlers_register.go index 9decfc27f..fbb1e8680 100644 --- a/server/channelserver/handlers_register.go +++ b/server/channelserver/handlers_register.go @@ -3,7 +3,6 @@ package channelserver import ( "erupe-ce/common/byteframe" "erupe-ce/network/mhfpacket" - "strings" ) func handleMsgMhfRegisterEvent(s *Session, p mhfpacket.MHFPacket) { @@ -140,13 +139,4 @@ func (s *Session) notifyRavi() { } } -func (s *Server) getRaviSemaphore() *Semaphore { - for _, semaphore := range s.semaphore { - if strings.HasPrefix(semaphore.name, "hs_l0") && strings.HasSuffix(semaphore.name, "3") { - return semaphore - } - } - return nil -} - func handleMsgSysNotifyRegister(s *Session, p mhfpacket.MHFPacket) {} diff --git a/server/channelserver/raviente.go b/server/channelserver/raviente.go new file mode 100644 index 000000000..881f962f5 --- /dev/null +++ b/server/channelserver/raviente.go @@ -0,0 +1,118 @@ +package channelserver + +import ( + "strings" + "sync" + + "erupe-ce/common/byteframe" + ps "erupe-ce/common/pascalstring" + "erupe-ce/network/mhfpacket" + + "go.uber.org/zap" +) + +type Raviente struct { + sync.Mutex + id uint16 + register []uint32 + state []uint32 + support []uint32 +} + +func (s *Server) resetRaviente() { + for _, semaphore := range s.semaphore { + if strings.HasPrefix(semaphore.name, "hs_l0") { + return + } + } + s.logger.Debug("All Raviente Semaphores empty, resetting") + s.raviente.id = s.raviente.id + 1 + s.raviente.register = make([]uint32, 30) + s.raviente.state = make([]uint32, 30) + s.raviente.support = make([]uint32, 30) +} + +func (s *Server) GetRaviMultiplier() float64 { + raviSema := s.getRaviSemaphore() + if raviSema != nil { + var minPlayers int + if s.raviente.register[9] > 8 { + minPlayers = 24 + } else { + minPlayers = 4 + } + if len(raviSema.clients) > minPlayers { + return 1 + } + return float64(minPlayers / len(raviSema.clients)) + } + return 0 +} + +func (s *Server) UpdateRavi(semaID uint32, index uint8, value uint32, update bool) (uint32, uint32) { + var prev uint32 + var dest *[]uint32 + switch semaID { + case 0x40000: + switch index { + case 17, 28: // Ignore res and poison + break + default: + value = uint32(float64(value) * s.GetRaviMultiplier()) + } + dest = &s.raviente.state + case 0x50000: + dest = &s.raviente.support + case 0x60000: + dest = &s.raviente.register + default: + return 0, 0 + } + if update { + (*dest)[index] += value + } else { + (*dest)[index] = value + } + return prev, (*dest)[index] +} + +func (s *Server) BroadcastRaviente(ip uint32, port uint16, stage []byte, _type uint8) { + bf := byteframe.NewByteFrame() + bf.SetLE() + bf.WriteUint16(0) // Unk + bf.WriteUint16(0x43) // Data len + bf.WriteUint16(3) // Unk len + var text string + switch _type { + case 2: + text = s.i18n.raviente.berserk + case 3: + text = s.i18n.raviente.extreme + case 4: + text = s.i18n.raviente.extremeLimited + case 5: + text = s.i18n.raviente.berserkSmall + default: + s.logger.Error("Unk raviente type", zap.Uint8("_type", _type)) + } + ps.Uint16(bf, text, true) + bf.WriteBytes([]byte{0x5F, 0x53, 0x00}) + bf.WriteUint32(ip) // IP address + bf.WriteUint16(port) // Port + bf.WriteUint16(0) // Unk + bf.WriteBytes(stage) + s.WorldcastMHF(&mhfpacket.MsgSysCastedBinary{ + BroadcastType: BroadcastTypeServer, + MessageType: BinaryMessageTypeChat, + RawDataPayload: bf.Data(), + }, nil, s) +} + +func (s *Server) getRaviSemaphore() *Semaphore { + for _, semaphore := range s.semaphore { + if strings.HasPrefix(semaphore.name, "hs_l0") && strings.HasSuffix(semaphore.name, "3") { + return semaphore + } + } + return nil +} diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index abdc1093e..25c2ea7c8 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -3,12 +3,10 @@ package channelserver import ( "fmt" "net" - "strings" "sync" "time" "erupe-ce/common/byteframe" - ps "erupe-ce/common/pascalstring" _config "erupe-ce/config" "erupe-ce/network/binpacket" "erupe-ce/network/mhfpacket" @@ -79,71 +77,6 @@ type Server struct { questCacheTime map[int]time.Time } -type Raviente struct { - sync.Mutex - id uint16 - register []uint32 - state []uint32 - support []uint32 -} - -func (s *Server) resetRaviente() { - for _, semaphore := range s.semaphore { - if strings.HasPrefix(semaphore.name, "hs_l0") { - return - } - } - s.logger.Debug("All Raviente Semaphores empty, resetting") - s.raviente.id = s.raviente.id + 1 - s.raviente.register = make([]uint32, 30) - s.raviente.state = make([]uint32, 30) - s.raviente.support = make([]uint32, 30) -} - -func (s *Server) GetRaviMultiplier() float64 { - raviSema := s.getRaviSemaphore() - if raviSema != nil { - var minPlayers int - if s.raviente.register[9] > 8 { - minPlayers = 24 - } else { - minPlayers = 4 - } - if len(raviSema.clients) > minPlayers { - return 1 - } - return float64(minPlayers / len(raviSema.clients)) - } - return 0 -} - -func (s *Server) UpdateRavi(semaID uint32, index uint8, value uint32, update bool) (uint32, uint32) { - var prev uint32 - var dest *[]uint32 - switch semaID { - case 0x40000: - switch index { - case 17, 28: // Ignore res and poison - break - default: - value = uint32(float64(value) * s.GetRaviMultiplier()) - } - dest = &s.raviente.state - case 0x50000: - dest = &s.raviente.support - case 0x60000: - dest = &s.raviente.register - default: - return 0, 0 - } - if update { - (*dest)[index] += value - } else { - (*dest)[index] = value - } - return prev, (*dest)[index] -} - // NewServer creates a new Server type. func NewServer(config *Config) *Server { s := &Server{ @@ -359,38 +292,6 @@ func (s *Server) BroadcastChatMessage(message string) { }, nil) } -func (s *Server) BroadcastRaviente(ip uint32, port uint16, stage []byte, _type uint8) { - bf := byteframe.NewByteFrame() - bf.SetLE() - bf.WriteUint16(0) // Unk - bf.WriteUint16(0x43) // Data len - bf.WriteUint16(3) // Unk len - var text string - switch _type { - case 2: - text = s.i18n.raviente.berserk - case 3: - text = s.i18n.raviente.extreme - case 4: - text = s.i18n.raviente.extremeLimited - case 5: - text = s.i18n.raviente.berserkSmall - default: - s.logger.Error("Unk raviente type", zap.Uint8("_type", _type)) - } - ps.Uint16(bf, text, true) - bf.WriteBytes([]byte{0x5F, 0x53, 0x00}) - bf.WriteUint32(ip) // IP address - bf.WriteUint16(port) // Port - bf.WriteUint16(0) // Unk - bf.WriteBytes(stage) - s.WorldcastMHF(&mhfpacket.MsgSysCastedBinary{ - BroadcastType: BroadcastTypeServer, - MessageType: BinaryMessageTypeChat, - RawDataPayload: bf.Data(), - }, nil, s) -} - func (s *Server) DiscordChannelSend(charName string, content string) { if s.erupeConfig.Discord.Enabled && s.discordBot != nil { message := fmt.Sprintf("**%s**: %s", charName, content)