raviente cleanup and fixes

This commit is contained in:
wish
2022-07-29 04:55:49 +10:00
parent 2c0e7a5267
commit c0fd2f8992
5 changed files with 54 additions and 86 deletions

View File

@@ -273,8 +273,6 @@ func handleMsgSysTime(s *Session, p mhfpacket.MHFPacket) {
Timestamp: uint32(Time_Current_Adjusted().Unix()), // JP timezone Timestamp: uint32(Time_Current_Adjusted().Unix()), // JP timezone
} }
s.QueueSendMHF(resp) s.QueueSendMHF(resp)
s.notifyticker()
} }
func handleMsgSysIssueLogkey(s *Session, p mhfpacket.MHFPacket) { func handleMsgSysIssueLogkey(s *Session, p mhfpacket.MHFPacket) {

View File

@@ -194,7 +194,7 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) {
// RAVI COMMANDS V2 // RAVI COMMANDS V2
if strings.HasPrefix(chatMessage.Message, "!ravi") { if strings.HasPrefix(chatMessage.Message, "!ravi") {
if checkRaviSemaphore(s) { if getRaviSemaphore(s) != "" {
s.server.raviente.Lock() s.server.raviente.Lock()
if !strings.HasPrefix(chatMessage.Message, "!ravi ") { if !strings.HasPrefix(chatMessage.Message, "!ravi ") {
sendServerChatMessage(s, "No Raviente command specified!") sendServerChatMessage(s, "No Raviente command specified!")
@@ -203,7 +203,7 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) {
if s.server.raviente.register.startTime == 0 { if s.server.raviente.register.startTime == 0 {
s.server.raviente.register.startTime = s.server.raviente.register.postTime s.server.raviente.register.startTime = s.server.raviente.register.postTime
sendServerChatMessage(s, "The Great Slaying will begin in a moment") sendServerChatMessage(s, "The Great Slaying will begin in a moment")
s.notifyall() s.notifyRavi()
} else { } else {
sendServerChatMessage(s, "The Great Slaying has already begun!") sendServerChatMessage(s, "The Great Slaying has already begun!")
} }
@@ -213,9 +213,9 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) {
if numerr != nil || n != 1 { if numerr != nil || n != 1 {
sendServerChatMessage(s, "Error in command. Format: !ravi sm n") sendServerChatMessage(s, "Error in command. Format: !ravi sm n")
} else if s.server.raviente.state.damageMultiplier == 1 { } else if s.server.raviente.state.damageMultiplier == 1 {
if num > 65535 { if num > 32 {
sendServerChatMessage(s, "Raviente multiplier too high, defaulting to 20x") sendServerChatMessage(s, "Raviente multiplier too high, defaulting to 32x")
s.server.raviente.state.damageMultiplier = 65535 s.server.raviente.state.damageMultiplier = 32
} else { } else {
sendServerChatMessage(s, fmt.Sprintf("Raviente multiplier set to %dx", num)) sendServerChatMessage(s, fmt.Sprintf("Raviente multiplier set to %dx", num))
s.server.raviente.state.damageMultiplier = uint32(num) s.server.raviente.state.damageMultiplier = uint32(num)

View File

@@ -3,13 +3,15 @@ package channelserver
import ( import (
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/network/mhfpacket" "erupe-ce/network/mhfpacket"
"strings"
) )
func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgSysOperateRegister) pkt := p.(*mhfpacket.MsgSysOperateRegister)
bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload) bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload)
s.server.raviente.Lock() s.server.raviente.Lock()
if pkt.SemaphoreID == s.server.raviente.state.semaphoreID { switch pkt.SemaphoreID {
case 3:
resp := byteframe.NewByteFrame() resp := byteframe.NewByteFrame()
size := 6 size := 6
for i := 0; i < len(bf.Data())-1; i += size { 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) resp.WriteUint32(*ref + data)
*ref += data *ref += data
} else { } else {
resp.WriteUint32(*ref + data) resp.WriteUint32(*ref)
} }
} else { } else {
resp.WriteUint32(*ref + data*damageMultiplier) resp.WriteUint32(*ref + data*damageMultiplier)
@@ -47,7 +49,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
} }
resp.WriteUint8(0) resp.WriteUint8(0)
doAckBufSucceed(s, pkt.AckHandle, resp.Data()) doAckBufSucceed(s, pkt.AckHandle, resp.Data())
} else if pkt.SemaphoreID == s.server.raviente.support.semaphoreID { case 4:
resp := byteframe.NewByteFrame() resp := byteframe.NewByteFrame()
size := 6 size := 6
for i := 0; i < len(bf.Data())-1; i += size { for i := 0; i < len(bf.Data())-1; i += size {
@@ -72,7 +74,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
} }
resp.WriteUint8(0) resp.WriteUint8(0)
doAckBufSucceed(s, pkt.AckHandle, resp.Data()) doAckBufSucceed(s, pkt.AckHandle, resp.Data())
} else if pkt.SemaphoreID == s.server.raviente.register.semaphoreID { case 5:
resp := byteframe.NewByteFrame() resp := byteframe.NewByteFrame()
size := 6 size := 6
for i := 0; i < len(bf.Data())-1; i += size { for i := 0; i < len(bf.Data())-1; i += size {
@@ -103,7 +105,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
switch op { switch op {
case 2: case 2:
resp.WriteUint32(*ref) resp.WriteUint32(*ref)
resp.WriteUint32(*ref + uint32(data)) resp.WriteUint32(*ref + data)
*ref += data *ref += data
case 13: case 13:
resp.WriteUint32(0) resp.WriteUint32(0)
@@ -122,7 +124,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
switch op { switch op {
case 2: case 2:
resp.WriteUint32(*ref) resp.WriteUint32(*ref)
resp.WriteUint32(*ref + uint32(data)) resp.WriteUint32(*ref + data)
*ref += data *ref += data
case 13: case 13:
resp.WriteUint32(0) resp.WriteUint32(0)
@@ -137,7 +139,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
switch op { switch op {
case 2: case 2:
resp.WriteUint32(*ref) resp.WriteUint32(*ref)
resp.WriteUint32(*ref + uint32(data)) resp.WriteUint32(*ref + data)
*ref += data *ref += data
case 13: case 13:
resp.WriteUint32(0) resp.WriteUint32(0)
@@ -152,7 +154,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
switch op { switch op {
case 2: case 2:
resp.WriteUint32(*ref) resp.WriteUint32(*ref)
resp.WriteUint32(*ref + uint32(data)) resp.WriteUint32(*ref + data)
*ref += data *ref += data
case 13: case 13:
resp.WriteUint32(0) resp.WriteUint32(0)
@@ -175,7 +177,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
switch op { switch op {
case 2: case 2:
resp.WriteUint32(*ref) resp.WriteUint32(*ref)
resp.WriteUint32(*ref + uint32(data)) resp.WriteUint32(*ref + data)
*ref += data *ref += data
case 13: case 13:
resp.WriteUint32(0) resp.WriteUint32(0)
@@ -193,7 +195,7 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) {
resp.WriteUint8(0) resp.WriteUint8(0)
doAckBufSucceed(s, pkt.AckHandle, resp.Data()) doAckBufSucceed(s, pkt.AckHandle, resp.Data())
} }
s.notifyall() s.notifyRavi()
s.server.raviente.Unlock() 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 var temp mhfpacket.MHFPacket
raviNotif := byteframe.NewByteFrame() raviNotif := byteframe.NewByteFrame()
temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: s.server.raviente.support.semaphoreID} temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: 3}
raviNotif.WriteUint16(uint16(temp.Opcode())) raviNotif.WriteUint16(uint16(temp.Opcode()))
temp.Build(raviNotif, s.clientContext) temp.Build(raviNotif, s.clientContext)
temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: s.server.raviente.state.semaphoreID} temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: 4}
raviNotif.WriteUint16(uint16(temp.Opcode())) raviNotif.WriteUint16(uint16(temp.Opcode()))
temp.Build(raviNotif, s.clientContext) temp.Build(raviNotif, s.clientContext)
temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: s.server.raviente.register.semaphoreID} temp = &mhfpacket.MsgSysNotifyRegister{RegisterID: 5}
raviNotif.WriteUint16(uint16(temp.Opcode())) raviNotif.WriteUint16(uint16(temp.Opcode()))
temp.Build(raviNotif, s.clientContext) temp.Build(raviNotif, s.clientContext)
raviNotif.WriteUint16(0x0010) // End it. raviNotif.WriteUint16(0x0010) // End it.
if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { sema := getRaviSemaphore(s)
for session := range s.server.semaphore["hs_l0u3B51J9k3"].clients { if sema != "" {
session.QueueSend(raviNotif.Data()) for session := range s.server.semaphore[sema].clients {
}
} 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 {
session.QueueSend(raviNotif.Data()) session.QueueSend(raviNotif.Data())
} }
} }
} }
func checkRaviSemaphore(s *Session) bool { func getRaviSemaphore(s *Session) string {
if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { for _, semaphore := range s.server.semaphore {
return true if strings.HasPrefix(semaphore.id_semaphore, "hs_l0u3B5") && strings.HasSuffix(semaphore.id_semaphore, "3") {
} else if _, exists := s.server.semaphore["hs_l0u3B5129k3"]; exists { return semaphore.id_semaphore
return true }
} else if _, exists := s.server.semaphore["hs_l0u3B512Ak3"]; exists {
return true
} }
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) { func resetRavi(s *Session) {
s.server.raviente.Lock() s.server.raviente.Lock()
s.server.raviente.register.nextTime = 0 s.server.raviente.register.nextTime = 0
@@ -312,16 +285,4 @@ func resetRavi(s *Session) {
s.server.raviente.Unlock() 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) {} func handleMsgSysNotifyRegister(s *Session, p mhfpacket.MHFPacket) {}

View File

@@ -4,6 +4,7 @@ import (
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"fmt" "fmt"
"go.uber.org/zap" "go.uber.org/zap"
"strconv"
"strings" "strings"
"erupe-ce/network/mhfpacket" "erupe-ce/network/mhfpacket"
@@ -34,7 +35,7 @@ func destructEmptySemaphores(s *Session) {
s.server.semaphoreLock.Unlock() s.server.semaphoreLock.Unlock()
delete(s.server.semaphore, id) delete(s.server.semaphore, id)
s.server.semaphoreLock.Lock() s.server.semaphoreLock.Lock()
if strings.HasPrefix(id, "hs_l0u3B51") { if strings.HasPrefix(id, "hs_l0u3B5") {
releaseRaviSemaphore(s, sema) releaseRaviSemaphore(s, sema)
} }
s.logger.Debug("Destructed semaphore", zap.String("sema.id_semaphore", id)) 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() s.server.semaphoreLock.Lock()
for id, sema := range s.server.semaphore { for id, sema := range s.server.semaphore {
if sema.id == sem { if sema.id == sem {
if strings.HasPrefix(id, "hs_l0u3B51") { if strings.HasPrefix(id, "hs_l0u3B5") {
releaseRaviSemaphore(s, sema) releaseRaviSemaphore(s, sema)
s.server.semaphoreLock.Unlock() s.server.semaphoreLock.Unlock()
return return
@@ -86,14 +87,14 @@ func handleMsgSysCreateAcquireSemaphore(s *Session, p mhfpacket.MHFPacket) {
fmt.Printf("Got reserve stage req, StageID: %v\n\n", SemaphoreID) fmt.Printf("Got reserve stage req, StageID: %v\n\n", SemaphoreID)
if !exists { if !exists {
s.server.semaphoreLock.Lock() s.server.semaphoreLock.Lock()
if strings.HasPrefix(SemaphoreID, "hs_l0u3B51") { if strings.HasPrefix(SemaphoreID, "hs_l0u3B5") {
s.server.semaphore[SemaphoreID] = NewSemaphore(s.server, SemaphoreID, 32) suffix, _ := strconv.ParseUint(pkt.SemaphoreID[len(pkt.SemaphoreID)-1:], 10, 32)
if strings.HasSuffix(SemaphoreID, "3") { s.server.semaphore[SemaphoreID] = &Semaphore{
s.server.raviente.state.semaphoreID = s.server.semaphore[SemaphoreID].id id_semaphore: pkt.SemaphoreID,
} else if strings.HasSuffix(SemaphoreID, "4") { id: uint32(suffix),
s.server.raviente.support.semaphoreID = s.server.semaphore[SemaphoreID].id clients: make(map[*Session]uint32),
} else if strings.HasSuffix(SemaphoreID, "5") { reservedClientSlots: make(map[uint32]interface{}),
s.server.raviente.register.semaphoreID = s.server.semaphore[SemaphoreID].id maxPlayers: 32,
} }
} else { } else {
s.server.semaphore[SemaphoreID] = NewSemaphore(s.server, SemaphoreID, 1) s.server.semaphore[SemaphoreID] = NewSemaphore(s.server, SemaphoreID, 1)

View File

@@ -93,7 +93,6 @@ type Raviente struct {
} }
type RavienteRegister struct { type RavienteRegister struct {
semaphoreID uint32
nextTime uint32 nextTime uint32
startTime uint32 startTime uint32
postTime uint32 postTime uint32
@@ -105,13 +104,11 @@ type RavienteRegister struct {
} }
type RavienteState struct { type RavienteState struct {
semaphoreID uint32
damageMultiplier uint32 damageMultiplier uint32
stateData []uint32 stateData []uint32
} }
type RavienteSupport struct { type RavienteSupport struct {
semaphoreID uint32
supportData []uint32 supportData []uint32
} }
@@ -155,7 +152,7 @@ func NewServer(config *Config) *Server {
stages: make(map[string]*Stage), stages: make(map[string]*Stage),
userBinaryParts: make(map[userBinaryPartID][]byte), userBinaryParts: make(map[userBinaryPartID][]byte),
semaphore: make(map[string]*Semaphore), semaphore: make(map[string]*Semaphore),
semaphoreIndex: 0, semaphoreIndex: 5,
discordBot: config.DiscordBot, discordBot: config.DiscordBot,
name: config.Name, name: config.Name,
enable: config.Enable, enable: config.Enable,
@@ -408,6 +405,17 @@ func (s *Server) FindObjectByChar(charID uint32) *Object {
} }
func (s *Server) NextSemaphoreID() uint32 { 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 return s.semaphoreIndex
} }