Merge pull request #51 from ZeruLight/feature/quest-enum

feature/quest-enum
This commit is contained in:
wish
2022-11-02 23:36:26 +11:00
committed by GitHub
4 changed files with 55 additions and 28 deletions

7
.gitignore vendored
View File

@@ -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
View File

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

View File

@@ -2,13 +2,13 @@ package channelserver
import ( import (
"fmt" "fmt"
"go.uber.org/zap" "io"
"io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/network/mhfpacket" "erupe-ce/network/mhfpacket"
"go.uber.org/zap"
) )
func handleMsgSysGetFile(s *Session, p mhfpacket.MHFPacket) { func handleMsgSysGetFile(s *Session, p mhfpacket.MHFPacket) {
@@ -26,7 +26,7 @@ func handleMsgSysGetFile(s *Session, p mhfpacket.MHFPacket) {
} }
filename := fmt.Sprintf("%d_0_0_0_S%d_T%d_C%d", pkt.ScenarioIdentifer.CategoryID, pkt.ScenarioIdentifer.MainID, pkt.ScenarioIdentifer.Flags, pkt.ScenarioIdentifer.ChapterID) filename := fmt.Sprintf("%d_0_0_0_S%d_T%d_C%d", pkt.ScenarioIdentifer.CategoryID, pkt.ScenarioIdentifer.MainID, pkt.ScenarioIdentifer.Flags, pkt.ScenarioIdentifer.ChapterID)
// Read the scenario file. // Read the scenario file.
data, err := ioutil.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, fmt.Sprintf("scenarios/%s.bin", filename))) data, err := os.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, fmt.Sprintf("scenarios/%s.bin", filename)))
if err != nil { if err != nil {
s.logger.Error(fmt.Sprintf("Failed to open file: %s/scenarios/%s.bin", s.server.erupeConfig.BinPath, filename)) s.logger.Error(fmt.Sprintf("Failed to open file: %s/scenarios/%s.bin", s.server.erupeConfig.BinPath, filename))
// This will crash the game. // This will crash the game.
@@ -36,7 +36,7 @@ func handleMsgSysGetFile(s *Session, p mhfpacket.MHFPacket) {
doAckBufSucceed(s, pkt.AckHandle, data) doAckBufSucceed(s, pkt.AckHandle, data)
} else { } else {
if _, err := os.Stat(filepath.Join(s.server.erupeConfig.BinPath, "quest_override.bin")); err == nil { if _, err := os.Stat(filepath.Join(s.server.erupeConfig.BinPath, "quest_override.bin")); err == nil {
data, err := ioutil.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, "quest_override.bin")) data, err := os.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, "quest_override.bin"))
if err != nil { if err != nil {
panic(err) panic(err)
} }
@@ -49,7 +49,7 @@ func handleMsgSysGetFile(s *Session, p mhfpacket.MHFPacket) {
) )
} }
// Get quest file. // Get quest file.
data, err := ioutil.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, fmt.Sprintf("quests/%s.bin", pkt.Filename))) data, err := os.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, fmt.Sprintf("quests/%s.bin", pkt.Filename)))
if err != nil { if err != nil {
s.logger.Error(fmt.Sprintf("Failed to open file: %s/quests/%s.bin", s.server.erupeConfig.BinPath, pkt.Filename)) s.logger.Error(fmt.Sprintf("Failed to open file: %s/quests/%s.bin", s.server.erupeConfig.BinPath, pkt.Filename))
// This will crash the game. // This will crash the game.
@@ -80,15 +80,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 := os.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) {}