mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 15:34:38 +01:00
raviente cleanup and fixes
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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) {}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user