mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 15:34:38 +01:00
180 lines
14 KiB
Go
180 lines
14 KiB
Go
package channelserver
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"erupe-ce/common/byteframe"
|
|
"erupe-ce/network/mhfpacket"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func handleMsgSysGetFile(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgSysGetFile)
|
|
|
|
if pkt.IsScenario {
|
|
if s.server.erupeConfig.DevModeOptions.QuestDebugTools && s.server.erupeConfig.DevMode {
|
|
s.logger.Debug(
|
|
"Scenario",
|
|
zap.Uint8("CategoryID", pkt.ScenarioIdentifer.CategoryID),
|
|
zap.Uint32("MainID", pkt.ScenarioIdentifer.MainID),
|
|
zap.Uint8("ChapterID", pkt.ScenarioIdentifer.ChapterID),
|
|
zap.Uint8("Flags", pkt.ScenarioIdentifer.Flags),
|
|
)
|
|
}
|
|
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.
|
|
data, err := os.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, fmt.Sprintf("scenarios/%s.bin", filename)))
|
|
if err != nil {
|
|
s.logger.Error(fmt.Sprintf("Failed to open file: %s/scenarios/%s.bin", s.server.erupeConfig.BinPath, filename))
|
|
// This will crash the game.
|
|
doAckBufSucceed(s, pkt.AckHandle, data)
|
|
return
|
|
}
|
|
doAckBufSucceed(s, pkt.AckHandle, data)
|
|
} else {
|
|
if _, err := os.Stat(filepath.Join(s.server.erupeConfig.BinPath, "quest_override.bin")); err == nil {
|
|
data, err := os.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, "quest_override.bin"))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
doAckBufSucceed(s, pkt.AckHandle, data)
|
|
} else {
|
|
if s.server.erupeConfig.DevModeOptions.QuestDebugTools && s.server.erupeConfig.DevMode {
|
|
s.logger.Debug(
|
|
"Quest",
|
|
zap.String("Filename", pkt.Filename),
|
|
)
|
|
}
|
|
// Get quest file.
|
|
data, err := os.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, fmt.Sprintf("quests/%s.bin", pkt.Filename)))
|
|
if err != nil {
|
|
s.logger.Error(fmt.Sprintf("Failed to open file: %s/quests/%s.bin", s.server.erupeConfig.BinPath, pkt.Filename))
|
|
// This will crash the game.
|
|
doAckBufSucceed(s, pkt.AckHandle, data)
|
|
return
|
|
}
|
|
doAckBufSucceed(s, pkt.AckHandle, data)
|
|
}
|
|
}
|
|
}
|
|
|
|
func handleMsgMhfLoadFavoriteQuest(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfLoadFavoriteQuest)
|
|
var data []byte
|
|
err := s.server.db.QueryRow("SELECT savefavoritequest FROM characters WHERE id = $1", s.charID).Scan(&data)
|
|
if err == nil && len(data) > 0 {
|
|
doAckBufSucceed(s, pkt.AckHandle, data)
|
|
} else {
|
|
doAckBufSucceed(s, pkt.AckHandle, []byte{0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
|
|
}
|
|
}
|
|
|
|
func handleMsgMhfSaveFavoriteQuest(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfSaveFavoriteQuest)
|
|
dumpSaveData(s, pkt.Data, "favquest")
|
|
s.server.db.Exec("UPDATE characters SET savefavoritequest=$1 WHERE id=$2", pkt.Data, s.charID)
|
|
doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00})
|
|
}
|
|
|
|
func handleMsgMhfEnumerateQuest(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfEnumerateQuest)
|
|
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 := 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()) < 60000 {
|
|
returnedCount++
|
|
bf.WriteBytes(data)
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil || totalCount == 0 {
|
|
doAckBufSucceed(s, pkt.AckHandle, make([]byte, 18))
|
|
return
|
|
}
|
|
|
|
vsQuestItems := []uint16{1580, 1581, 1582, 1583, 1584, 1585, 1587, 1588, 1589, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604}
|
|
vsQuestBets := []struct {
|
|
IsTicket bool
|
|
Quantity uint32
|
|
}{
|
|
{true, 5},
|
|
{false, 1000},
|
|
{false, 5000},
|
|
{false, 10000},
|
|
}
|
|
|
|
data, _ := hex.DecodeString("7F2301CF7CD17F23111111007E0F7B357F23111111007F407CD07F23111111007E0F7CD77F23111111007E0F7CD67F23111111007E0F7B197F23111111007F277B1D7F23111111007F277B617F23111111007F207BAD7F23111111007F267BB17F23111111007F267BB57F23111111007F217BA07F23111111007F237B257F23111111007F2B7B227F23111111007F2272857F23111111007F237B277F23111111007F477B207F23111111007F477F027F23111111007F227F737F23111111007F227F127F23111111007F227F377F23111111007F227F187F23111111007F227F167F23111111007F227F397F23111111007F227F7D7F23111111007F227F0B7F23111111007F227F387F23111111007F227F607F23111111007F227CDC7F23111111007F2B7B237F23111111007FB572847F23111111007F23728B7F23111111007F23728A7F23111111007F2372897F23111111007F2372887F23111111007F23728F7F23111111007F23728E7F23111111007F23728D7F23111111007F23728C7F23111111007F2372937F23111111007F2372927F23111111007F2372917F23111111007F2372E37F23111111007F2372E27F23111111007F237B1B7F23111111007F227B1A7F23111111007F2272E17F23111111007F2372E07F23111111007F2373F57F23111111007FEB73F47F23111111007FEB73FB7F23111111007FEB72E77F23111111007F2372E67F23111111007F2372E57F23111111007F2372E47F23111111007F2372EB7F23111111007F2372EA7F23111111007F237CDF7F23111111007F477CDE7F23111111007EB37B087F23111111007F7972E97F23111111007F2373FA7F23111111007FEB73F97F23111111007FEB73F87F23111111007FEB73FF7F23111111007FEB73FE7F23111111007FEB73FD7F23111111007FEB73FC7F23111111007FEB73C37F23111111007FEB73C27F23111111007FEB73C17F23111111007FEB73C07F23111111007FEB73C77F23111111007FEB73C67F23111111007FEB73C57F23111111007FEB73C47F23111111007FEB73CB7F23111111007FEB73CA7F23111111007FEB73C97F23111111007FEB73C87F23111111007FEB73CF7F23111111007FEB73CE7F23111111007FEB73CD7F23111111007FEB73CC7F23111111007FEB73D37F23111111007E0F73D27F23111111007E0F73D17F23111111007E0F73D07F23111111007E0F73D77F23111111007E0F73D67F23111111007E0F73D57F23111111007E0F73D47F23111111007E0F73DB7F23111111007E0F73DA7F23111111007E0F73D97F23111111007E0F73D87F23111111007E0F73DF7F23111111007E0F73DE7F23111111007E0F73DD7F23111111007E0F73DC7F23111111007E0F72237F23111111007E0F72227F23111111007E0F72217F23111111007E0F72207F23111111007E0F72277F23111111007E0F72E87F23111111007F2372EF7F23111111007F2372267F23111111007E0F7B137F23111111007E0F7B5A7F23111111007FEB72517F23111111007F4772257F23111111007E0F72247F23111111007E0F722B7F23111111007E0F722A7F23111111007E0F7B047F2311111100BC737B0B7F2311111100BC737B0A7F23111111001E8B7B097F23111111001E8B7CD57F23111111007FEB7B3F7F23111111007FEB7B0F7F23111111007F737B0E7F23111111007F657CD47F23111111007FEB7B387F23111111007FEB72507F23111111007F4772577F23111111007F4772567F23111111007F4772557F23111111007F4772547F23111111007F47725B7F23111111007F47725A7F23111111007F4772297F23111111007F4772287F23111111007F47722F7F23111111007F47722E7F23111111007F47722D7F23111111007F47722C7F23111111007F4772337F23111111007F4772327F23111111007F4772317F23111111007F4772307F23111111007F4772377F23111111007F4772367F23111111007F4772357F23111111007F4772347F23111111007F477B1E7F23111111007F2272597F23111111007F47723B7F23111111007F47723A7F23111111007F477B627F23111111007F2272587F23111111007F4772397F23111111007F477B147F23111111007F227B187F23111111007F217B1F7F23111111007F297B1C7F23111111007F217B637F23111111007F297B607F23111111007F217B677F23111111007F297B647F23111111007F217B6B7F23111111007F297B687F23111111007F217B6F7F23111111007F297B6C7F23111111007F217B737F23111111007F2972387F23111111007F47723F7F23111111007F47723E7F23111111007F47723D7F23111111007F47723C7F23111111007F4772037F23111111007F4772027F23111111007F4772017F23111111007F4772007F23111111007F4772077F23111111007F4772067F23111111007F4772057F23111111007F4772047F23111111007F47720B7F23111111007F47720A7F23111111007F4772097F23111111007F4772087F23111111007F47720F7F23111111007F47720E7F23111111007F47720D7F23111111007F47720C7F23111111007F4772137F23111111007F4772127F23111111007F4772117F23111111007F4772107F23111111007F4772177F23111111007F4772167F23111111007F4772157F23111111007F4772147F23111111007F47721B7F23111111007F47721A7F23111111007F4772197F23111111007F4772187F23111111007F47721F7F23111111007F47721E7F23111111007F47725F7F23111111007F47721D7F23111111007F47721C7F23111111007F4772637F23111111007F4772627F23111111007F4772617F23111111007F4772607F23111111007F4772677F23111111007F4772667F23111111007F4772657F23111111007F4772647F23111111007F47726B7F23111111007F47726A7F23111111007F4772697F23111111007F47727B7F23111111007F47727A7F23111111007F4772797F23111111007F4772787F23111111007F47727F7F23111111007F47727E7F23111111007F47727D7F23111111007F47727C7F23111111007F4772437F23111111007F4772427F23111111007F4772417F23111111007F4772407F23111111007F4772477F23111111007F477B127F23111111007E0F7B117F23111111007E0F7BAB7F23111111007E0F725E7F23111111007F47725D7F23111111007F4772AF7F23111111007F4772AE7F23111111007F477B597F23111111007F2372AD7F23111111007F477B587F23111111007F2372AC7F23111111007F477B217F23111111007CC47B157F23111111007F237BA37F23111111007B497BA97F23111111007F227BA87F23111111007F207BAF7F23111111007F267BAE7F23111111007F227BAC7F23111111007F227BB37F23111111007F207BB27F23111111007F207BB07F23111111007F227BB77F23111111007F227BB67F23111111007F22738A7F23111111007F2173897F23111111007F2173887F23111111007F21738F7F23111111007F217B5B7F23111111007F23738E7F23111111007F21738D7F23111111007F217B667F23111111007F217B657F23111111007F267B6A7F23111111007F217B697F23111111007F267B6E7F23111111007F217B6D7F23111111007F267BB47F23111111007F277BBB7F23111111007F297BBA7F23111111007F277BB97F23111111007F297BB87F23111111007F2172B37F23111111007F4772B27F23111111007F4772B17F23111111007F4772B07F23111111007F4772B77F23111111007F4772B67F23111111007F4772B57F23111111007F4772B47F23111111007F4772BB7F23111111007F4772F97F23111111007F2372F87F23111111007F237BA27F23111111007F237B267F23111111007F29749B7F23111111007ED7749A7F23111111007ED774997F23111111007ED774987F23111111007ED7749F7F23111111007ED7749E7F23111111007ED77B247F23111111007F47749D7F23111111007ED7749C7F23111111007ED774E37F23111111007ED774E27F23111111007ED774E17F23111111007ED774E07F23111111007ED774E77F23111111007ED774E67F23111111007ED774E57F23111111007ED774E47F23111111007ED774EB7F23111111007ED774EA7F23111111007ED774E97F23111111007ED774E87F23111111007ED774EF7F23111111007ED774EE7F23111111007ED774ED7F23111111007ED774EC7F23111111007ED77B717F23111111007F2374F37F23111111007ED774F27F23111111007ED774F17F23111111007ED77BA17F23111111007F2372FF7F23111111007F2373777F23111111007F2372FE7F23111111007F2373767F23111111007F2373757F23111111007F2373747F23111111007F23737B7F23111111007F23737A7F23111111007F2373797F23111111007F2373787F23111111007F23737F7F23111111007F23737E7F23111111007F23737D7F23111111007F23737C7F23111111007F2373437F23111111007F23734D7F23111111007F23734C7F23111111007F2373537F23111111007F2373527F23111111007F2373517F23111111007F2373507F23111111007F2373577F23111111007F2373567F23111111007F2373557F23111111007F2373547F23111111007F23735B7F23111111007F23735A7F23111111007F2373597F23111111007F2372FD7F23111111007F2372FC7F23111111007F2372C37F23111111007F2372C27F23111111007F2372C17F23111111007F2372C07F23111111007F2372C77F23111111007F2372C67F23111111007F2372C57F23111111007F2372D77F23111111007F2372D67F23111111007F2372D57F23111111007F2372D47F23111111007F2372DB7F23111111007F2372DA7F23111111007F2372D97F23111111007F2372D87F23111111007F2372DF7F23111111007F2372DE7F23111111007F2372DD7F23111111007F2372DC7F23111111007F2371237F23111111007F237B5E7F23111111007F3774F07F23111111007ED774F77F23111111007ED774F67F23111111007ED77BA57F23111111007F2274F57F23111111007ED774F47F23111111007ED774FB7F23111111007ED774FA7F23111111007ED774F97F23111111007ED774F87F23111111007ED774FF7F23111111007ED774FE7F23111111007ED774FD7F23111111007ED774FC7F23111111007ED774C37F23111111007ED774C27F23111111007ED774C17F23111111007ED774C07F23111111007ED774C77F23111111007ED774C67F23111111007ED774C57F23111111007ED774C47F23111111007ED774CB7F23111111007ED774CA7F23111111007ED774C97F23111111007ED774C87F23111111007ED774CF7F23111111007EB374CE7F23111111007EB374CD7F23111111007EB374CC7F23111111007EB374D37F23111111007EB374D27F23111111007EB374D17F23111111007EB374D07F23111111007EB374D77F23111111007EB374D67F23111111007EB374D57F23111111007EB374D47F23111111007EB374DB7F23111111007EB37BBF7F23111111007F2673257F23111111007EB373247F23111111007EB3732B7F23111111007EB3732A7F23111111007EB373297F23111111007EB373287F23111111007EB3732F7F23111111007EB3732E7F23111111007EB3732D7F23111111007EB3732C7F23111111007EB373337F23111111007EB373327F23111111007EB373317F23111111007EB373037F23111111007CCB73027F23111111007CCB73017F23111111007CCB73007F23111111007CCB73077F23111111007CCB73067F23111111007CCB73057F23111111007CCB73047F23111111007CCB730B7F23111111007CCB730A7F23111111007CCB73097F23111111007CCB73087F23111111007CCB730F7F23111111007CCB73197F23111111007CCB73187F23111111007CCB731F7F23111111007CCB731E7F23111111007CCB731D7F23111111007CCB731C7F23111111007CCB73637F23111111007CCB73627F23111111007CCB73617F23111111007CCB73607F23111111007CCB73677F23111111007CCB73667F23111111007CCB73657F23111111007CCB73AB7F23111111007F2173AA7F23111111007F2173A97F23111111007F2173A87F23111111007F2173AF7F23111111007F2173AE7F23111111007F2173AD7F23111111007F2173AC7F23111111007F2173B37F23111111007F2173B27F23111111007F2173B17F23111111007F2173B07F23111111007F2173B77F23111111007F2173817F23111111007F2173807F23111111007F2173877F23111111007F2173867F23111111007F2173857F23111111007F2173847F23111111007F21738B7F23111111007F21")
|
|
bf.WriteBytes(data)
|
|
|
|
bf.WriteUint16(uint16(len(vsQuestItems)))
|
|
bf.WriteUint32(uint32(len(vsQuestBets)))
|
|
bf.WriteUint16(0) // Unk
|
|
|
|
for i := range vsQuestItems {
|
|
bf.WriteUint16(vsQuestItems[i])
|
|
}
|
|
for i := range vsQuestBets {
|
|
bf.WriteBool(vsQuestBets[i].IsTicket)
|
|
bf.WriteUint8(9)
|
|
bf.WriteUint16(7)
|
|
bf.WriteUint32(vsQuestBets[i].Quantity)
|
|
}
|
|
|
|
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 handleMsgMhfGetUdBonusQuestInfo(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdBonusQuestInfo)
|
|
|
|
udBonusQuestInfos := []struct {
|
|
Unk0 uint8
|
|
Unk1 uint8
|
|
StartTime uint32 // Unix timestamp (seconds)
|
|
EndTime uint32 // Unix timestamp (seconds)
|
|
Unk4 uint32
|
|
Unk5 uint8
|
|
Unk6 uint8
|
|
}{} // Blank stub array.
|
|
|
|
resp := byteframe.NewByteFrame()
|
|
resp.WriteUint8(uint8(len(udBonusQuestInfos)))
|
|
for _, q := range udBonusQuestInfos {
|
|
resp.WriteUint8(q.Unk0)
|
|
resp.WriteUint8(q.Unk1)
|
|
resp.WriteUint32(q.StartTime)
|
|
resp.WriteUint32(q.EndTime)
|
|
resp.WriteUint32(q.Unk4)
|
|
resp.WriteUint8(q.Unk5)
|
|
resp.WriteUint8(q.Unk6)
|
|
}
|
|
|
|
doAckBufSucceed(s, pkt.AckHandle, resp.Data())
|
|
}
|