diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index 8552828cd..62630a132 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -273,8 +273,6 @@ func handleMsgSysTime(s *Session, p mhfpacket.MHFPacket) { Timestamp: uint32(Time_Current_Adjusted().Unix()), // JP timezone } s.QueueSendMHF(resp) - - s.notifyticker() } func handleMsgSysIssueLogkey(s *Session, p mhfpacket.MHFPacket) { diff --git a/server/channelserver/handlers_cast_binary.go b/server/channelserver/handlers_cast_binary.go index d76d8f589..5029869ed 100644 --- a/server/channelserver/handlers_cast_binary.go +++ b/server/channelserver/handlers_cast_binary.go @@ -194,7 +194,7 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { // RAVI COMMANDS V2 if strings.HasPrefix(chatMessage.Message, "!ravi") { - if checkRaviSemaphore(s) { + if getRaviSemaphore(s) != "" { s.server.raviente.Lock() if !strings.HasPrefix(chatMessage.Message, "!ravi ") { sendServerChatMessage(s, "No Raviente command specified!") @@ -203,7 +203,7 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { if s.server.raviente.register.startTime == 0 { s.server.raviente.register.startTime = s.server.raviente.register.postTime sendServerChatMessage(s, "The Great Slaying will begin in a moment") - s.notifyall() + s.notifyRavi() } else { sendServerChatMessage(s, "The Great Slaying has already begun!") } @@ -213,9 +213,9 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { if numerr != nil || n != 1 { sendServerChatMessage(s, "Error in command. Format: !ravi sm n") } else if s.server.raviente.state.damageMultiplier == 1 { - if num > 65535 { - sendServerChatMessage(s, "Raviente multiplier too high, defaulting to 20x") - s.server.raviente.state.damageMultiplier = 65535 + 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) diff --git a/server/channelserver/handlers_register.go b/server/channelserver/handlers_register.go index 4da6e9a8c..3dd65cf6a 100644 --- a/server/channelserver/handlers_register.go +++ b/server/channelserver/handlers_register.go @@ -3,13 +3,15 @@ package channelserver import ( "erupe-ce/common/byteframe" "erupe-ce/network/mhfpacket" + "strings" ) func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysOperateRegister) bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload) s.server.raviente.Lock() - if pkt.SemaphoreID == s.server.raviente.state.semaphoreID { + switch pkt.SemaphoreID { + case 3: resp := byteframe.NewByteFrame() size := 6 for i := 0; i < len(bf.Data())-1; i += size { @@ -31,7 +33,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { resp.WriteUint32(*ref + data) *ref += data } else { - resp.WriteUint32(*ref + data) + resp.WriteUint32(*ref) } } else { resp.WriteUint32(*ref + data*damageMultiplier) @@ -47,7 +49,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { } resp.WriteUint8(0) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) - } else if pkt.SemaphoreID == s.server.raviente.support.semaphoreID { + case 4: resp := byteframe.NewByteFrame() size := 6 for i := 0; i < len(bf.Data())-1; i += size { @@ -72,7 +74,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { } resp.WriteUint8(0) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) - } else if pkt.SemaphoreID == s.server.raviente.register.semaphoreID { + case 5: resp := byteframe.NewByteFrame() size := 6 for i := 0; i < len(bf.Data())-1; i += size { @@ -103,7 +105,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { switch op { case 2: resp.WriteUint32(*ref) - resp.WriteUint32(*ref + uint32(data)) + resp.WriteUint32(*ref + data) *ref += data case 13: resp.WriteUint32(0) @@ -122,7 +124,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { switch op { case 2: resp.WriteUint32(*ref) - resp.WriteUint32(*ref + uint32(data)) + resp.WriteUint32(*ref + data) *ref += data case 13: resp.WriteUint32(0) @@ -137,7 +139,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { switch op { case 2: resp.WriteUint32(*ref) - resp.WriteUint32(*ref + uint32(data)) + resp.WriteUint32(*ref + data) *ref += data case 13: resp.WriteUint32(0) @@ -152,7 +154,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { switch op { case 2: resp.WriteUint32(*ref) - resp.WriteUint32(*ref + uint32(data)) + resp.WriteUint32(*ref + data) *ref += data case 13: resp.WriteUint32(0) @@ -175,7 +177,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { switch op { case 2: resp.WriteUint32(*ref) - resp.WriteUint32(*ref + uint32(data)) + resp.WriteUint32(*ref + data) *ref += data case 13: resp.WriteUint32(0) @@ -193,7 +195,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { resp.WriteUint8(0) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) } - s.notifyall() + s.notifyRavi() s.server.raviente.Unlock() } @@ -237,65 +239,36 @@ func handleMsgSysLoadRegister(s *Session, p mhfpacket.MHFPacket) { } } -func (s *Session) notifyall() { +func (s *Session) notifyRavi() { var temp mhfpacket.MHFPacket raviNotif := byteframe.NewByteFrame() - temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: s.server.raviente.support.semaphoreID} + temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: 3} raviNotif.WriteUint16(uint16(temp.Opcode())) temp.Build(raviNotif, s.clientContext) - temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: s.server.raviente.state.semaphoreID} + temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: 4} raviNotif.WriteUint16(uint16(temp.Opcode())) temp.Build(raviNotif, s.clientContext) - temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: s.server.raviente.register.semaphoreID} + temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: 5} raviNotif.WriteUint16(uint16(temp.Opcode())) temp.Build(raviNotif, s.clientContext) raviNotif.WriteUint16(0x0010) // End it. - if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { - for session := range s.server.semaphore["hs_l0u3B51J9k3"].clients { - session.QueueSend(raviNotif.Data()) - } - } else if _, exists := s.server.semaphore["hs_l0u3B5129k3"]; exists { - for session := range s.server.semaphore["hs_l0u3B5129k3"].clients { - session.QueueSend(raviNotif.Data()) - } - } else if _, exists := s.server.semaphore["hs_l0u3B512Ak3"]; exists { - for session := range s.server.semaphore["hs_l0u3B512Ak3"].clients { + sema := getRaviSemaphore(s) + if sema != "" { + for session := range s.server.semaphore[sema].clients { session.QueueSend(raviNotif.Data()) } } } -func checkRaviSemaphore(s *Session) bool { - if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { - return true - } else if _, exists := s.server.semaphore["hs_l0u3B5129k3"]; exists { - return true - } else if _, exists := s.server.semaphore["hs_l0u3B512Ak3"]; exists { - return true +func getRaviSemaphore(s *Session) string { + for _, semaphore := range s.server.semaphore { + if strings.HasPrefix(semaphore.id_semaphore, "hs_l0u3B5") && strings.HasSuffix(semaphore.id_semaphore, "3") { + return semaphore.id_semaphore + } } - return false + return "" } -//func releaseRaviSemaphore(s *Session) { -// s.server.raviente.Lock() -// if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { -// if len(s.server.semaphore["hs_l0u3B51J9k3"].reservedClientSlots) == 0 { -// resetRavi(s) -// } -// } -// if _, exists := s.server.semaphore["hs_l0u3B5129k3"]; exists { -// if len(s.server.semaphore["hs_l0u3B5129k3"].reservedClientSlots) == 0 { -// resetRavi(s) -// } -// } -// if _, exists := s.server.semaphore["hs_l0u3B512Ak3"]; exists { -// if len(s.server.semaphore["hs_l0u3B512Ak3"].reservedClientSlots) == 0 { -// resetRavi(s) -// } -// } -// s.server.raviente.Unlock() -//} - func resetRavi(s *Session) { s.server.raviente.Lock() s.server.raviente.register.nextTime = 0 @@ -312,16 +285,4 @@ func resetRavi(s *Session) { s.server.raviente.Unlock() } -// Unused -func (s *Session) notifyticker() { - if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { - s.server.semaphoreLock.Lock() - getSemaphore := s.server.semaphore["hs_l0u3B51J9k3"] - s.server.semaphoreLock.Unlock() - if _, exists := getSemaphore.reservedClientSlots[s.charID]; exists { - s.notifyall() - } - } -} - func handleMsgSysNotifyRegister(s *Session, p mhfpacket.MHFPacket) {} diff --git a/server/channelserver/handlers_semaphore.go b/server/channelserver/handlers_semaphore.go index 4040f1ec2..e7b9834ab 100644 --- a/server/channelserver/handlers_semaphore.go +++ b/server/channelserver/handlers_semaphore.go @@ -4,6 +4,7 @@ import ( "erupe-ce/common/byteframe" "fmt" "go.uber.org/zap" + "strconv" "strings" "erupe-ce/network/mhfpacket" @@ -34,7 +35,7 @@ func destructEmptySemaphores(s *Session) { s.server.semaphoreLock.Unlock() delete(s.server.semaphore, id) s.server.semaphoreLock.Lock() - if strings.HasPrefix(id, "hs_l0u3B51") { + if strings.HasPrefix(id, "hs_l0u3B5") { releaseRaviSemaphore(s, sema) } s.logger.Debug("Destructed semaphore", zap.String("sema.id_semaphore", id)) @@ -62,7 +63,7 @@ func handleMsgSysDeleteSemaphore(s *Session, p mhfpacket.MHFPacket) { s.server.semaphoreLock.Lock() for id, sema := range s.server.semaphore { if sema.id == sem { - if strings.HasPrefix(id, "hs_l0u3B51") { + if strings.HasPrefix(id, "hs_l0u3B5") { releaseRaviSemaphore(s, sema) s.server.semaphoreLock.Unlock() return @@ -86,14 +87,14 @@ func handleMsgSysCreateAcquireSemaphore(s *Session, p mhfpacket.MHFPacket) { fmt.Printf("Got reserve stage req, StageID: %v\n\n", SemaphoreID) if !exists { s.server.semaphoreLock.Lock() - if strings.HasPrefix(SemaphoreID, "hs_l0u3B51") { - s.server.semaphore[SemaphoreID] = NewSemaphore(s.server, SemaphoreID, 32) - if strings.HasSuffix(SemaphoreID, "3") { - s.server.raviente.state.semaphoreID = s.server.semaphore[SemaphoreID].id - } else if strings.HasSuffix(SemaphoreID, "4") { - s.server.raviente.support.semaphoreID = s.server.semaphore[SemaphoreID].id - } else if strings.HasSuffix(SemaphoreID, "5") { - s.server.raviente.register.semaphoreID = s.server.semaphore[SemaphoreID].id + if strings.HasPrefix(SemaphoreID, "hs_l0u3B5") { + suffix, _ := strconv.ParseUint(pkt.SemaphoreID[len(pkt.SemaphoreID)-1:], 10, 32) + s.server.semaphore[SemaphoreID] = &Semaphore{ + id_semaphore: pkt.SemaphoreID, + id: uint32(suffix), + clients: make(map[*Session]uint32), + reservedClientSlots: make(map[uint32]interface{}), + maxPlayers: 32, } } else { s.server.semaphore[SemaphoreID] = NewSemaphore(s.server, SemaphoreID, 1) diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index f954ea97a..0dd682fd2 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -93,7 +93,6 @@ type Raviente struct { } type RavienteRegister struct { - semaphoreID uint32 nextTime uint32 startTime uint32 postTime uint32 @@ -105,13 +104,11 @@ type RavienteRegister struct { } type RavienteState struct { - semaphoreID uint32 damageMultiplier uint32 stateData []uint32 } type RavienteSupport struct { - semaphoreID uint32 supportData []uint32 } @@ -155,7 +152,7 @@ func NewServer(config *Config) *Server { stages: make(map[string]*Stage), userBinaryParts: make(map[userBinaryPartID][]byte), semaphore: make(map[string]*Semaphore), - semaphoreIndex: 0, + semaphoreIndex: 5, discordBot: config.DiscordBot, name: config.Name, enable: config.Enable, @@ -408,6 +405,17 @@ func (s *Server) FindObjectByChar(charID uint32) *Object { } func (s *Server) NextSemaphoreID() uint32 { - s.semaphoreIndex = s.semaphoreIndex + 1 + for { + exists := false + s.semaphoreIndex = s.semaphoreIndex + 1 + for _, semaphore := range s.semaphore { + if semaphore.id == s.semaphoreIndex { + exists = true + } + } + if exists == false { + break + } + } return s.semaphoreIndex }