From cf3cafa929415e7db94780615bbb9bc47f55935e Mon Sep 17 00:00:00 2001 From: Andrew Gutekanst Date: Wed, 22 Jan 2020 18:17:23 -0500 Subject: [PATCH] Implement MsgSysCreateStage --- network/mhfpacket/msg_sys_create_stage.go | 17 ++++++++++++++--- server/channelserver/handlers.go | 11 ++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/network/mhfpacket/msg_sys_create_stage.go b/network/mhfpacket/msg_sys_create_stage.go index 642a3c23d..3eef61a52 100644 --- a/network/mhfpacket/msg_sys_create_stage.go +++ b/network/mhfpacket/msg_sys_create_stage.go @@ -6,7 +6,13 @@ import ( ) // MsgSysCreateStage represents the MSG_SYS_CREATE_STAGE -type MsgSysCreateStage struct{} +type MsgSysCreateStage struct { + AckHandle uint32 + Unk0 uint8 + Unk1 uint8 + StageIDLength uint8 + StageID string // NULL terminated string. +} // Opcode returns the ID associated with this packet type. func (m *MsgSysCreateStage) Opcode() network.PacketID { @@ -15,10 +21,15 @@ func (m *MsgSysCreateStage) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgSysCreateStage) Parse(bf *byteframe.ByteFrame) error { - panic("Not implemented") + m.AckHandle = bf.ReadUint32() + m.Unk0 = bf.ReadUint8() + m.Unk1 = bf.ReadUint8() + m.StageIDLength = bf.ReadUint8() + m.StageID = string(bf.ReadBytes(uint(m.StageIDLength))) + return nil } // Build builds a binary packet from the current data. func (m *MsgSysCreateStage) Build(bf *byteframe.ByteFrame) error { panic("Not implemented") -} \ No newline at end of file +} diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index 21b4bd916..a6c9f8c53 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -252,7 +252,16 @@ func handleMsgSysRecordLog(s *Session, p mhfpacket.MHFPacket) {} func handleMsgSysEcho(s *Session, p mhfpacket.MHFPacket) {} -func handleMsgSysCreateStage(s *Session, p mhfpacket.MHFPacket) {} +func handleMsgSysCreateStage(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgSysCreateStage) + + s.server.stagesLock.Lock() + s.server.stages[stripNullTerminator(s.stageID)] = &Stage{} + s.server.stagesLock.Lock() + + resp := make([]byte, 8) // Unk resp. + s.QueueAck(pkt.AckHandle, resp) +} func handleMsgSysStageDestruct(s *Session, p mhfpacket.MHFPacket) {}