initial quest enumeration concept

This commit is contained in:
wish
2022-08-06 07:02:38 +10:00
parent 0b90dfd458
commit e84bdd5adf
5 changed files with 42 additions and 14 deletions

0
bin/events/.gitkeep Normal file
View File

0
bin/quests/.gitkeep Normal file
View File

0
bin/scenarios/.gitkeep Normal file
View File

View File

@@ -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
}

View File

@@ -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) {}