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
}
s.QueueSendMHF(resp)
s.notifyticker()
}
func handleMsgSysIssueLogkey(s *Session, p mhfpacket.MHFPacket) {

View File

@@ -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)

View File

@@ -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) {}

View File

@@ -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)

View File

@@ -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
}