From e84bdd5adf175acba3d0a0f3c697e4bf3463e47e Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 6 Aug 2022 07:02:38 +1000 Subject: [PATCH] initial quest enumeration concept --- bin/events/.gitkeep | 0 bin/quests/.gitkeep | 0 bin/scenarios/.gitkeep | 0 network/mhfpacket/msg_mhf_enumerate_quest.go | 20 +++++------ server/channelserver/handlers_quest.go | 36 +++++++++++++++++--- 5 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 bin/events/.gitkeep create mode 100644 bin/quests/.gitkeep create mode 100644 bin/scenarios/.gitkeep diff --git a/bin/events/.gitkeep b/bin/events/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/bin/quests/.gitkeep b/bin/quests/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/bin/scenarios/.gitkeep b/bin/scenarios/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/network/mhfpacket/msg_mhf_enumerate_quest.go b/network/mhfpacket/msg_mhf_enumerate_quest.go index 93b37ef28..7bf1e1355 100644 --- a/network/mhfpacket/msg_mhf_enumerate_quest.go +++ b/network/mhfpacket/msg_mhf_enumerate_quest.go @@ -1,20 +1,20 @@ package mhfpacket -import ( - "errors" +import ( + "errors" - "erupe-ce/network/clientctx" - "erupe-ce/network" "erupe-ce/common/byteframe" + "erupe-ce/network" + "erupe-ce/network/clientctx" ) // MsgMhfEnumerateQuest represents the MSG_MHF_ENUMERATE_QUEST type MsgMhfEnumerateQuest struct { AckHandle uint32 Unk0 uint8 // Hardcoded 0 in the binary - Unk1 uint8 - Unk2 uint16 - QuestList uint16 // Increments to request following batches of quests + World uint8 + Counter uint16 + Offset uint16 // Increments to request following batches of quests Unk4 uint8 // Hardcoded 0 in the binary } @@ -27,9 +27,9 @@ func (m *MsgMhfEnumerateQuest) Opcode() network.PacketID { func (m *MsgMhfEnumerateQuest) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() m.Unk0 = bf.ReadUint8() - m.Unk1 = bf.ReadUint8() - m.Unk2 = bf.ReadUint16() - m.QuestList = bf.ReadUint16() + m.World = bf.ReadUint8() + m.Counter = bf.ReadUint16() + m.Offset = bf.ReadUint16() m.Unk4 = bf.ReadUint8() return nil } diff --git a/server/channelserver/handlers_quest.go b/server/channelserver/handlers_quest.go index 86a0003b9..fdd6b95e7 100644 --- a/server/channelserver/handlers_quest.go +++ b/server/channelserver/handlers_quest.go @@ -2,6 +2,7 @@ package channelserver import ( "fmt" + "io" "io/ioutil" "os" "path/filepath" @@ -59,15 +60,42 @@ func handleMsgMhfSaveFavoriteQuest(s *Session, p mhfpacket.MHFPacket) { } func handleMsgMhfEnumerateQuest(s *Session, p mhfpacket.MHFPacket) { - // local files are easier for now, probably best would be to generate dynamically pkt := p.(*mhfpacket.MsgMhfEnumerateQuest) - data, err := ioutil.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, fmt.Sprintf("questlists/list_%d.bin", pkt.QuestList))) + var totalCount, returnedCount uint16 + bf := byteframe.NewByteFrame() + bf.WriteUint16(0) + files, err := ioutil.ReadDir(fmt.Sprintf("%s/events/", s.server.erupeConfig.BinPath)) if err != nil { - fmt.Printf("questlists/list_%d.bin", pkt.QuestList) stubEnumerateNoResults(s, pkt.AckHandle) + return } else { - doAckBufSucceed(s, pkt.AckHandle, data) + for _, file := range files { + data, err := ioutil.ReadFile(fmt.Sprintf("%s/events/%s", s.server.erupeConfig.BinPath, file.Name())) + if err != nil { + continue + } else { + if len(data) > 850 || len(data) < 400 { + continue // Could be more or less strict with size limits + } else { + totalCount++ + if totalCount > pkt.Offset && len(bf.Data()) < 64000 { + returnedCount++ + bf.WriteBytes(data) + } + } + } + } } + bf.WriteUint16(0) // Unk + bf.WriteUint16(0) // Unk + bf.WriteUint16(0) // Unk + bf.WriteUint32(0) // Unk + bf.WriteUint16(0) // Unk + bf.WriteUint16(totalCount) + bf.WriteUint16(pkt.Offset) + bf.Seek(0, io.SeekStart) + bf.WriteUint16(returnedCount) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } func handleMsgMhfEnterTournamentQuest(s *Session, p mhfpacket.MHFPacket) {}