From e84bdd5adf175acba3d0a0f3c697e4bf3463e47e Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 6 Aug 2022 07:02:38 +1000 Subject: [PATCH 1/4] 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) {} From 40f5744a7b1881c06857bf423fe48290004ce063 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 6 Aug 2022 19:59:45 +1000 Subject: [PATCH 2/4] recurse quest enum into dirs --- server/channelserver/handlers_quest.go | 39 +++++++++++++++----------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/server/channelserver/handlers_quest.go b/server/channelserver/handlers_quest.go index fdd6b95e7..816152072 100644 --- a/server/channelserver/handlers_quest.go +++ b/server/channelserver/handlers_quest.go @@ -64,27 +64,32 @@ func handleMsgMhfEnumerateQuest(s *Session, p mhfpacket.MHFPacket) { 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 { - stubEnumerateNoResults(s, pkt.AckHandle) - return - } else { - for _, file := range files { - data, err := ioutil.ReadFile(fmt.Sprintf("%s/events/%s", s.server.erupeConfig.BinPath, file.Name())) - if err != nil { - continue + 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 { - 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) - } + 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 From 057e598cbcfde039683369a324b36a21240cca82 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 6 Aug 2022 21:54:22 +1000 Subject: [PATCH 3/4] retire questlists dir --- bin/questlists/psql.txt | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 bin/questlists/psql.txt diff --git a/bin/questlists/psql.txt b/bin/questlists/psql.txt deleted file mode 100644 index 7429718e4..000000000 --- a/bin/questlists/psql.txt +++ /dev/null @@ -1,16 +0,0 @@ -BEGIN; - -CREATE TABLE questlists ( - ind int NOT NULL PRIMARY KEY, - questlist bytea -); - -END; - -INSERT INTO questlists (ind, questlist) VALUES ('0', pg_read_binary_file('c:\save\quest_0_0.bin')); -INSERT INTO questlists (ind, questlist) VALUES ('42', pg_read_binary_file('c:\save\quest_42_2A.bin')); -INSERT INTO questlists (ind, questlist) VALUES ('84', pg_read_binary_file('c:\save\quest_84_54.bin')); -INSERT INTO questlists (ind, questlist) VALUES ('126', pg_read_binary_file('c:\save\quest_126_7E.bin')); -INSERT INTO questlists (ind, questlist) VALUES ('168', pg_read_binary_file('c:\save\quest_168_A8.bin')); - - From d993a095a088345091f4d5767a9b972cc3c6763b Mon Sep 17 00:00:00 2001 From: wish Date: Sun, 7 Aug 2022 20:49:15 +1000 Subject: [PATCH 4/4] update gitignore --- .gitignore | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) 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