mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-16 17:05:03 +01:00
Merge remote-tracking branch 'origin/feature/quest-enum' into feature/diva
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -2,12 +2,7 @@
|
|||||||
|
|
||||||
www/jp/
|
www/jp/
|
||||||
vendor/
|
vendor/
|
||||||
bin/*.bin
|
*.bin
|
||||||
bin/*.bak
|
|
||||||
bin/quests/*.bin
|
|
||||||
bin/questlists/*.bin
|
|
||||||
bin/scenarios/*.bin
|
|
||||||
bin/debug/*.bin
|
|
||||||
savedata/*/
|
savedata/*/
|
||||||
*.exe
|
*.exe
|
||||||
*.lnk
|
*.lnk
|
||||||
|
|||||||
0
bin/events/.gitkeep
Normal file
0
bin/events/.gitkeep
Normal file
0
bin/quests/.gitkeep
Normal file
0
bin/quests/.gitkeep
Normal file
0
bin/scenarios/.gitkeep
Normal file
0
bin/scenarios/.gitkeep
Normal file
@@ -3,18 +3,18 @@ package mhfpacket
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfEnumerateQuest represents the MSG_MHF_ENUMERATE_QUEST
|
// MsgMhfEnumerateQuest represents the MSG_MHF_ENUMERATE_QUEST
|
||||||
type MsgMhfEnumerateQuest struct {
|
type MsgMhfEnumerateQuest struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
Unk0 uint8 // Hardcoded 0 in the binary
|
Unk0 uint8 // Hardcoded 0 in the binary
|
||||||
Unk1 uint8
|
World uint8
|
||||||
Unk2 uint16
|
Counter uint16
|
||||||
QuestList uint16 // Increments to request following batches of quests
|
Offset uint16 // Increments to request following batches of quests
|
||||||
Unk4 uint8 // Hardcoded 0 in the binary
|
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 {
|
func (m *MsgMhfEnumerateQuest) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.Unk0 = bf.ReadUint8()
|
m.Unk0 = bf.ReadUint8()
|
||||||
m.Unk1 = bf.ReadUint8()
|
m.World = bf.ReadUint8()
|
||||||
m.Unk2 = bf.ReadUint16()
|
m.Counter = bf.ReadUint16()
|
||||||
m.QuestList = bf.ReadUint16()
|
m.Offset = bf.ReadUint16()
|
||||||
m.Unk4 = bf.ReadUint8()
|
m.Unk4 = bf.ReadUint8()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package channelserver
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -60,15 +61,47 @@ func handleMsgMhfSaveFavoriteQuest(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleMsgMhfEnumerateQuest(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)
|
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)
|
||||||
|
err := filepath.Walk(fmt.Sprintf("%s/events/", s.server.erupeConfig.BinPath), func(path string, info os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("questlists/list_%d.bin", pkt.QuestList)
|
return err
|
||||||
stubEnumerateNoResults(s, pkt.AckHandle)
|
} else if info.IsDir() {
|
||||||
} else {
|
return nil
|
||||||
doAckBufSucceed(s, pkt.AckHandle, data)
|
|
||||||
}
|
}
|
||||||
|
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) {}
|
func handleMsgMhfEnterTournamentQuest(s *Session, p mhfpacket.MHFPacket) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user