Files
Erupe/server/channelserver/handlers_data_paper.go
Houmgaor e5ffc4d52d refactor(channelserver): move paper data tables out of handler function
The handleMsgMhfGetPaperData function was 565 lines, but most of
it was inline data table literals. Extract tower config (case 5)
and tower scaling (case 6) slices into package-level vars in
handlers_data_paper_tables.go, reducing the handler to 73 lines
while co-locating all paper data tables in one file.
2026-02-23 18:24:54 +01:00

127 lines
3.0 KiB
Go

package channelserver
import (
"time"
"erupe-ce/common/byteframe"
"erupe-ce/network/mhfpacket"
"go.uber.org/zap"
)
// PaperMissionTimetable represents a daily mission schedule entry.
type PaperMissionTimetable struct {
Start time.Time
End time.Time
}
// PaperMissionData represents daily mission details.
type PaperMissionData struct {
Unk0 uint8
Unk1 uint8
Unk2 int16
Reward1ID uint16
Reward1Quantity uint8
Reward2ID uint16
Reward2Quantity uint8
}
// PaperMission represents a daily mission wrapper.
type PaperMission struct {
Timetables []PaperMissionTimetable
Data []PaperMissionData
}
// PaperData represents complete daily paper data.
type PaperData struct {
Unk0 uint16
Unk1 int16
Unk2 int16
Unk3 int16
Unk4 int16
Unk5 int16
Unk6 int16
}
// PaperGift represents a paper gift reward entry.
type PaperGift struct {
Unk0 uint16
Unk1 uint8
Unk2 uint8
Unk3 uint16
}
func handleMsgMhfGetPaperData(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfGetPaperData)
var data []*byteframe.ByteFrame
var paperData []PaperData
var paperMissions PaperMission
var paperGift []PaperGift
switch pkt.DataType {
case 0:
paperMissions = PaperMission{
[]PaperMissionTimetable{{TimeMidnight(), TimeMidnight().Add(24 * time.Hour)}},
[]PaperMissionData{},
}
case 5:
paperData = paperDataTower
case 6:
paperData = paperDataTowerScaling
default:
if pkt.DataType < 1000 {
s.logger.Info("PaperData request for unknown type", zap.Uint32("DataType", pkt.DataType))
}
}
if pkt.DataType > 1000 {
_, ok := paperGiftData[pkt.DataType]
if ok {
paperGift = paperGiftData[pkt.DataType]
} else {
s.logger.Info("PaperGift request for unknown type", zap.Uint32("DataType", pkt.DataType))
}
for _, gift := range paperGift {
bf := byteframe.NewByteFrame()
bf.WriteUint16(gift.Unk0)
bf.WriteUint8(gift.Unk1)
bf.WriteUint8(gift.Unk2)
bf.WriteUint16(gift.Unk3)
data = append(data, bf)
}
doAckEarthSucceed(s, pkt.AckHandle, data)
} else if pkt.DataType == 0 {
bf := byteframe.NewByteFrame()
bf.WriteUint16(uint16(len(paperMissions.Timetables)))
bf.WriteUint16(uint16(len(paperMissions.Data)))
for _, timetable := range paperMissions.Timetables {
bf.WriteUint32(uint32(timetable.Start.Unix()))
bf.WriteUint32(uint32(timetable.End.Unix()))
}
for _, mdata := range paperMissions.Data {
bf.WriteUint8(mdata.Unk0)
bf.WriteUint8(mdata.Unk1)
bf.WriteInt16(mdata.Unk2)
bf.WriteUint16(mdata.Reward1ID)
bf.WriteUint8(mdata.Reward1Quantity)
bf.WriteUint16(mdata.Reward2ID)
bf.WriteUint8(mdata.Reward2Quantity)
}
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
} else {
for _, pdata := range paperData {
bf := byteframe.NewByteFrame()
bf.WriteUint16(pdata.Unk0)
bf.WriteInt16(pdata.Unk1)
bf.WriteInt16(pdata.Unk2)
bf.WriteInt16(pdata.Unk3)
bf.WriteInt16(pdata.Unk4)
bf.WriteInt16(pdata.Unk5)
bf.WriteInt16(pdata.Unk6)
data = append(data, bf)
}
doAckEarthSucceed(s, pkt.AckHandle, data)
}
}