mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-22 07:32:32 +01:00
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.
This commit is contained in:
@@ -3,7 +3,6 @@ package channelserver
|
|||||||
import (
|
import (
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network/mhfpacket"
|
"erupe-ce/network/mhfpacket"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleMsgMhfRegisterEvent(s *Session, p mhfpacket.MHFPacket) {
|
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) {}
|
func handleMsgSysNotifyRegister(s *Session, p mhfpacket.MHFPacket) {}
|
||||||
|
|||||||
118
server/channelserver/raviente.go
Normal file
118
server/channelserver/raviente.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
@@ -3,12 +3,10 @@ package channelserver
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
ps "erupe-ce/common/pascalstring"
|
|
||||||
_config "erupe-ce/config"
|
_config "erupe-ce/config"
|
||||||
"erupe-ce/network/binpacket"
|
"erupe-ce/network/binpacket"
|
||||||
"erupe-ce/network/mhfpacket"
|
"erupe-ce/network/mhfpacket"
|
||||||
@@ -79,71 +77,6 @@ type Server struct {
|
|||||||
questCacheTime map[int]time.Time
|
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.
|
// NewServer creates a new Server type.
|
||||||
func NewServer(config *Config) *Server {
|
func NewServer(config *Config) *Server {
|
||||||
s := &Server{
|
s := &Server{
|
||||||
@@ -359,38 +292,6 @@ func (s *Server) BroadcastChatMessage(message string) {
|
|||||||
}, nil)
|
}, 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) {
|
func (s *Server) DiscordChannelSend(charName string, content string) {
|
||||||
if s.erupeConfig.Discord.Enabled && s.discordBot != nil {
|
if s.erupeConfig.Discord.Enabled && s.discordBot != nil {
|
||||||
message := fmt.Sprintf("**%s**: %s", charName, content)
|
message := fmt.Sprintf("**%s**: %s", charName, content)
|
||||||
|
|||||||
Reference in New Issue
Block a user