diff --git a/server/channelserver/handlers_cast_binary.go b/server/channelserver/handlers_cast_binary.go index 17a1d7858..8d9c6356c 100644 --- a/server/channelserver/handlers_cast_binary.go +++ b/server/channelserver/handlers_cast_binary.go @@ -167,8 +167,7 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { } case BroadcastTypeServer: if pkt.MessageType == 1 { - raviSema := getRaviSemaphore(s) - if raviSema != "" { + if getRaviSemaphore(s.server) != nil { s.server.BroadcastMHF(resp, s) } } else { @@ -361,7 +360,7 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { if strings.HasPrefix(chatMessage.Message, commands["Raviente"].Prefix) { if commands["Raviente"].Enabled { - if getRaviSemaphore(s) != "" { + if getRaviSemaphore(s.server) != nil { s.server.raviente.Lock() if !strings.HasPrefix(chatMessage.Message, "!ravi ") { sendServerChatMessage(s, "No Raviente command specified!") @@ -374,24 +373,8 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { } else { sendServerChatMessage(s, "The Great Slaying has already begun!") } - } else if strings.HasPrefix(chatMessage.Message, "!ravi sm") || strings.HasPrefix(chatMessage.Message, "!ravi setmultiplier") { - var num uint16 - n, numerr := fmt.Sscanf(chatMessage.Message, "!ravi sm %d", &num) - if numerr != nil || n != 1 { - sendServerChatMessage(s, "Error in command. Format: !ravi sm n") - } else if s.server.raviente.state.damageMultiplier == 1 { - if num > 32 { - sendServerChatMessage(s, "Raviente multiplier too high, defaulting to 32x") - s.server.raviente.state.damageMultiplier = 32 - } else { - sendServerChatMessage(s, fmt.Sprintf("Raviente multiplier set to %dx", num)) - s.server.raviente.state.damageMultiplier = uint32(num) - } - } else { - sendServerChatMessage(s, fmt.Sprintf("Raviente multiplier is already set to %dx!", s.server.raviente.state.damageMultiplier)) - } } else if strings.HasPrefix(chatMessage.Message, "!ravi cm") || strings.HasPrefix(chatMessage.Message, "!ravi checkmultiplier") { - sendServerChatMessage(s, fmt.Sprintf("Raviente multiplier is currently %dx", s.server.raviente.state.damageMultiplier)) + sendServerChatMessage(s, fmt.Sprintf("Raviente multiplier is currently %dx", s.server.raviente.GetRaviMultiplier(s.server))) } else if strings.HasPrefix(chatMessage.Message, "!ravi sr") || strings.HasPrefix(chatMessage.Message, "!ravi sendres") { if s.server.raviente.state.stateData[28] > 0 { sendServerChatMessage(s, "Sending resurrection support!") diff --git a/server/channelserver/handlers_register.go b/server/channelserver/handlers_register.go index 2c44cc6db..49afc594f 100644 --- a/server/channelserver/handlers_register.go +++ b/server/channelserver/handlers_register.go @@ -21,7 +21,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { resp.WriteUint8(1) resp.WriteUint8(dest) ref := &s.server.raviente.state.stateData[dest] - damageMultiplier := s.server.raviente.state.damageMultiplier + damageMultiplier := s.server.raviente.GetRaviMultiplier(s.server) switch op { case 2: resp.WriteUint32(*ref) @@ -252,21 +252,21 @@ func (s *Session) notifyRavi() { raviNotif.WriteUint16(uint16(temp.Opcode())) temp.Build(raviNotif, s.clientContext) raviNotif.WriteUint16(0x0010) // End it. - sema := getRaviSemaphore(s) - if sema != "" { - for session := range s.server.semaphore[sema].clients { + sema := getRaviSemaphore(s.server) + if sema != nil { + for session := range sema.clients { session.QueueSend(raviNotif.Data()) } } } -func getRaviSemaphore(s *Session) string { - for _, semaphore := range s.server.semaphore { +func getRaviSemaphore(s *Server) *Semaphore { + for _, semaphore := range s.semaphore { if strings.HasPrefix(semaphore.id_semaphore, "hs_l0u3B5") && strings.HasSuffix(semaphore.id_semaphore, "4") { - return semaphore.id_semaphore + return semaphore } } - return "" + return nil } func resetRavi(s *Session) { @@ -278,7 +278,6 @@ func resetRavi(s *Session) { s.server.raviente.register.ravienteType = 0 s.server.raviente.register.maxPlayers = 0 s.server.raviente.register.carveQuest = 0 - s.server.raviente.state.damageMultiplier = 1 s.server.raviente.register.register = []uint32{0, 0, 0, 0, 0} s.server.raviente.state.stateData = []uint32{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} s.server.raviente.support.supportData = []uint32{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index 7c7447dfa..e388149eb 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -92,8 +92,7 @@ type RavienteRegister struct { } type RavienteState struct { - damageMultiplier uint32 - stateData []uint32 + stateData []uint32 } type RavienteSupport struct { @@ -111,9 +110,7 @@ func NewRaviente() *Raviente { maxPlayers: 0, carveQuest: 0, } - ravienteState := &RavienteState{ - damageMultiplier: 1, - } + ravienteState := &RavienteState{} ravienteSupport := &RavienteSupport{} ravienteRegister.register = []uint32{0, 0, 0, 0, 0} ravienteState.stateData = []uint32{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} @@ -127,6 +124,23 @@ func NewRaviente() *Raviente { return raviente } +func (r *Raviente) GetRaviMultiplier(s *Server) uint32 { + raviSema := getRaviSemaphore(s) + if raviSema != nil { + var minPlayers uint32 + if r.register.maxPlayers > 8 { + minPlayers = 24 + } else { + minPlayers = 4 + } + if uint32(len(raviSema.clients)) > minPlayers { + return 1 + } + return minPlayers / uint32(len(raviSema.clients)) + } + return 0 +} + // NewServer creates a new Server type. func NewServer(config *Config) *Server { s := &Server{