mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 15:34:38 +01:00
Compare commits
4 Commits
b2768e5af8
...
test/aobp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce364720de | ||
|
|
c4ec2efde5 | ||
|
|
aad3b088b9 | ||
|
|
dd36f367a9 |
@@ -183,7 +183,6 @@ func logoutPlayer(s *Session) {
|
|||||||
delete(s.server.sessions, s.rawConn)
|
delete(s.server.sessions, s.rawConn)
|
||||||
}
|
}
|
||||||
s.rawConn.Close()
|
s.rawConn.Close()
|
||||||
delete(s.server.objectIDs, s)
|
|
||||||
s.server.Unlock()
|
s.server.Unlock()
|
||||||
|
|
||||||
for _, stage := range s.server.stages {
|
for _, stage := range s.server.stages {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ func handleMsgSysCreateObject(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
|
|
||||||
s.stage.Lock()
|
s.stage.Lock()
|
||||||
newObj := &Object{
|
newObj := &Object{
|
||||||
id: s.NextObjectID(),
|
id: s.getObjectId(),
|
||||||
ownerCharID: s.charID,
|
ownerCharID: s.charID,
|
||||||
x: pkt.X,
|
x: pkt.X,
|
||||||
y: pkt.Y,
|
y: pkt.Y,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
ps "erupe-ce/common/pascalstring"
|
ps "erupe-ce/common/pascalstring"
|
||||||
"erupe-ce/network/mhfpacket"
|
"erupe-ce/network/mhfpacket"
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -64,28 +65,24 @@ func doStageTransfer(s *Session, ackHandle uint32, stageID string) {
|
|||||||
// Confirm the stage entry.
|
// Confirm the stage entry.
|
||||||
doAckSimpleSucceed(s, ackHandle, []byte{0x00, 0x00, 0x00, 0x00})
|
doAckSimpleSucceed(s, ackHandle, []byte{0x00, 0x00, 0x00, 0x00})
|
||||||
|
|
||||||
var temp mhfpacket.MHFPacket
|
|
||||||
newNotif := byteframe.NewByteFrame()
|
newNotif := byteframe.NewByteFrame()
|
||||||
|
|
||||||
// Cast existing user data to new user
|
// Cast existing user data to new user
|
||||||
if !s.userEnteredStage {
|
if !s.loaded {
|
||||||
s.userEnteredStage = true
|
s.loaded = true
|
||||||
|
|
||||||
for _, session := range s.server.sessions {
|
for _, session := range s.server.sessions {
|
||||||
if s == session {
|
if s == session || !session.loaded {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
temp = &mhfpacket.MsgSysInsertUser{CharID: session.charID}
|
session.QueueSendMHF(&mhfpacket.MsgSysInsertUser{CharID: s.charID})
|
||||||
newNotif.WriteUint16(uint16(temp.Opcode()))
|
session.QueueSendMHF(&mhfpacket.MsgSysNotifyUserBinary{CharID: s.charID, BinaryType: 1})
|
||||||
temp.Build(newNotif, s.clientContext)
|
session.QueueSendMHF(&mhfpacket.MsgSysNotifyUserBinary{CharID: s.charID, BinaryType: 2})
|
||||||
for i := 0; i < 3; i++ {
|
session.QueueSendMHF(&mhfpacket.MsgSysNotifyUserBinary{CharID: s.charID, BinaryType: 3})
|
||||||
temp = &mhfpacket.MsgSysNotifyUserBinary{
|
s.QueueSendMHF(&mhfpacket.MsgSysInsertUser{CharID: session.charID})
|
||||||
CharID: session.charID,
|
s.QueueSendMHF(&mhfpacket.MsgSysNotifyUserBinary{CharID: session.charID, BinaryType: 1})
|
||||||
BinaryType: uint8(i + 1),
|
s.QueueSendMHF(&mhfpacket.MsgSysNotifyUserBinary{CharID: session.charID, BinaryType: 2})
|
||||||
}
|
s.QueueSendMHF(&mhfpacket.MsgSysNotifyUserBinary{CharID: session.charID, BinaryType: 3})
|
||||||
newNotif.WriteUint16(uint16(temp.Opcode()))
|
|
||||||
temp.Build(newNotif, s.clientContext)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ type Server struct {
|
|||||||
acceptConns chan net.Conn
|
acceptConns chan net.Conn
|
||||||
deleteConns chan net.Conn
|
deleteConns chan net.Conn
|
||||||
sessions map[net.Conn]*Session
|
sessions map[net.Conn]*Session
|
||||||
objectIDs map[*Session]uint16
|
|
||||||
listener net.Listener // Listener that is created when Server.Start is called.
|
listener net.Listener // Listener that is created when Server.Start is called.
|
||||||
isShuttingDown bool
|
isShuttingDown bool
|
||||||
|
|
||||||
@@ -155,7 +154,6 @@ func NewServer(config *Config) *Server {
|
|||||||
acceptConns: make(chan net.Conn),
|
acceptConns: make(chan net.Conn),
|
||||||
deleteConns: make(chan net.Conn),
|
deleteConns: make(chan net.Conn),
|
||||||
sessions: make(map[net.Conn]*Session),
|
sessions: make(map[net.Conn]*Session),
|
||||||
objectIDs: make(map[*Session]uint16),
|
|
||||||
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),
|
||||||
@@ -280,6 +278,20 @@ func (s *Server) manageSessions() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) getObjectId() uint16 {
|
||||||
|
ids := make(map[uint16]struct{})
|
||||||
|
for _, sess := range s.sessions {
|
||||||
|
ids[sess.objectID] = struct{}{}
|
||||||
|
}
|
||||||
|
for i := uint16(1); i < 100; i++ {
|
||||||
|
if _, ok := ids[i]; !ok {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.logger.Warn("object ids overflowed", zap.Int("sessions", len(s.sessions)))
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) invalidateSessions() {
|
func (s *Server) invalidateSessions() {
|
||||||
for {
|
for {
|
||||||
if s.isShuttingDown {
|
if s.isShuttingDown {
|
||||||
|
|||||||
@@ -36,8 +36,10 @@ type Session struct {
|
|||||||
clientContext *clientctx.ClientContext
|
clientContext *clientctx.ClientContext
|
||||||
lastPacket time.Time
|
lastPacket time.Time
|
||||||
|
|
||||||
objectIndex uint16
|
objectID uint16
|
||||||
userEnteredStage bool // If the user has entered a stage before
|
objectIndex uint16
|
||||||
|
loaded bool
|
||||||
|
|
||||||
stage *Stage
|
stage *Stage
|
||||||
reservationStage *Stage // Required for the stateful MsgSysUnreserveStage packet.
|
reservationStage *Stage // Required for the stateful MsgSysUnreserveStage packet.
|
||||||
stagePass string // Temporary storage
|
stagePass string // Temporary storage
|
||||||
@@ -83,12 +85,12 @@ func NewSession(server *Server, conn net.Conn) *Session {
|
|||||||
sendPackets: make(chan packet, 20),
|
sendPackets: make(chan packet, 20),
|
||||||
clientContext: &clientctx.ClientContext{}, // Unused
|
clientContext: &clientctx.ClientContext{}, // Unused
|
||||||
lastPacket: time.Now(),
|
lastPacket: time.Now(),
|
||||||
|
objectID: server.getObjectId(),
|
||||||
sessionStart: TimeAdjusted().Unix(),
|
sessionStart: TimeAdjusted().Unix(),
|
||||||
stageMoveStack: stringstack.New(),
|
stageMoveStack: stringstack.New(),
|
||||||
ackStart: make(map[uint32]time.Time),
|
ackStart: make(map[uint32]time.Time),
|
||||||
semaphoreID: make([]uint16, 2),
|
semaphoreID: make([]uint16, 2),
|
||||||
}
|
}
|
||||||
s.SetObjectID()
|
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,30 +294,9 @@ func (s *Session) logMessage(opcode uint16, data []byte, sender string, recipien
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Session) SetObjectID() {
|
func (s *Session) getObjectId() uint32 {
|
||||||
for i := uint16(1); i < 127; i++ {
|
|
||||||
exists := false
|
|
||||||
for _, j := range s.server.objectIDs {
|
|
||||||
if i == j {
|
|
||||||
exists = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !exists {
|
|
||||||
s.server.objectIDs[s] = i
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.server.objectIDs[s] = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Session) NextObjectID() uint32 {
|
|
||||||
bf := byteframe.NewByteFrame()
|
|
||||||
bf.WriteUint16(s.server.objectIDs[s])
|
|
||||||
s.objectIndex++
|
s.objectIndex++
|
||||||
bf.WriteUint16(s.objectIndex)
|
return uint32(s.objectID)<<16 | uint32(s.objectIndex)
|
||||||
bf.Seek(0, 0)
|
|
||||||
return bf.ReadUint32()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Session) GetSemaphoreID() uint32 {
|
func (s *Session) GetSemaphoreID() uint32 {
|
||||||
|
|||||||
Reference in New Issue
Block a user