diff --git a/.gitignore b/.gitignore index 38fdf2e18..a36e91559 100644 --- a/.gitignore +++ b/.gitignore @@ -2,12 +2,7 @@ www/jp/ vendor/ -bin/*.bin -bin/*.bak -bin/quests/*.bin -bin/questlists/*.bin -bin/scenarios/*.bin -bin/debug/*.bin +*.bin savedata/*/ *.exe *.lnk 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 7ee552232..c01b0e006 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" @@ -60,15 +61,47 @@ 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))) - if err != nil { - fmt.Printf("questlists/list_%d.bin", pkt.QuestList) - stubEnumerateNoResults(s, pkt.AckHandle) - } else { - doAckBufSucceed(s, pkt.AckHandle, data) + var totalCount, returnedCount uint16 + bf := byteframe.NewByteFrame() + bf.WriteUint16(0) + err := filepath.Walk(fmt.Sprintf("%s/events/", s.server.erupeConfig.BinPath), func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } else if info.IsDir() { + return nil + } + data, err := ioutil.ReadFile(path) + if err != nil { + return err + } else { + if len(data) > 850 || len(data) < 400 { + return nil // Could be more or less strict with size limits + } else { + totalCount++ + if totalCount > pkt.Offset && len(bf.Data()) < 64000 { + returnedCount++ + bf.WriteBytes(data) + return nil + } + } + } + return nil + }) + if err != nil || totalCount == 0 { + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 18)) + return } + 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) {}