package channelserver import ( "erupe-ce/internal/model" "erupe-ce/config" "erupe-ce/network/mhfpacket" "erupe-ce/utils/byteframe" ps "erupe-ce/utils/pascalstring" "erupe-ce/utils/stringsupport" "github.com/jmoiron/sqlx" ) func handleMsgMhfEnumerateCampaign(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfEnumerateCampaign) bf := byteframe.NewByteFrame() events := []model.CampaignEvent{} categories := []model.CampaignCategory{} var campaignLinks []model.CampaignLink if len(events) > 255 { bf.WriteUint8(255) bf.WriteUint16(uint16(len(events))) } else { bf.WriteUint8(uint8(len(events))) } for _, event := range events { bf.WriteUint32(event.ID) bf.WriteUint32(event.Unk0) bf.WriteInt16(event.MinHR) bf.WriteInt16(event.MaxHR) bf.WriteInt16(event.MinSR) bf.WriteInt16(event.MaxSR) if config.GetConfig().ClientID >= config.G3 { bf.WriteInt16(event.MinGR) bf.WriteInt16(event.MaxGR) } bf.WriteUint16(event.Unk1) bf.WriteUint8(event.Unk2) bf.WriteUint8(event.Unk3) bf.WriteUint16(event.Unk4) bf.WriteUint16(event.Unk5) bf.WriteUint32(uint32(event.Start.Unix())) bf.WriteUint32(uint32(event.End.Unix())) bf.WriteUint8(event.Unk6) ps.Uint8(bf, event.String0, true) ps.Uint8(bf, event.String1, true) ps.Uint8(bf, event.String2, true) ps.Uint8(bf, event.String3, true) ps.Uint8(bf, event.Link, true) for i := range event.Categories { campaignLinks = append(campaignLinks, model.CampaignLink{event.Categories[i], event.ID}) } } if len(events) > 255 { bf.WriteUint8(255) bf.WriteUint16(uint16(len(events))) } else { bf.WriteUint8(uint8(len(events))) } for _, event := range events { bf.WriteUint32(event.ID) bf.WriteUint8(1) // Always 1? bf.WriteBytes([]byte(event.Prefix)) } if len(categories) > 255 { bf.WriteUint8(255) bf.WriteUint16(uint16(len(categories))) } else { bf.WriteUint8(uint8(len(categories))) } for _, category := range categories { bf.WriteUint16(category.ID) bf.WriteUint8(category.Type) xTitle := stringsupport.UTF8ToSJIS(category.Title) xDescription := stringsupport.UTF8ToSJIS(category.Description) bf.WriteUint8(uint8(len(xTitle))) bf.WriteUint8(uint8(len(xDescription))) bf.WriteBytes(xTitle) bf.WriteBytes(xDescription) } if len(campaignLinks) > 255 { bf.WriteUint8(255) bf.WriteUint16(uint16(len(campaignLinks))) } else { bf.WriteUint8(uint8(len(campaignLinks))) } for _, link := range campaignLinks { bf.WriteUint16(link.CategoryID) bf.WriteUint32(link.CampaignID) } s.DoAckBufSucceed(pkt.AckHandle, bf.Data()) } func handleMsgMhfStateCampaign(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfStateCampaign) bf := byteframe.NewByteFrame() bf.WriteUint16(1) bf.WriteUint16(0) s.DoAckBufSucceed(pkt.AckHandle, bf.Data()) } func handleMsgMhfApplyCampaign(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfApplyCampaign) bf := byteframe.NewByteFrame() bf.WriteUint32(1) s.DoAckSimpleSucceed(pkt.AckHandle, bf.Data()) } func handleMsgMhfEnumerateItem(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfEnumerateItem) items := []struct { Unk0 uint32 Unk1 uint16 Unk2 uint16 Unk3 uint16 Unk4 uint32 Unk5 uint32 }{} bf := byteframe.NewByteFrame() bf.WriteUint16(uint16(len(items))) for _, item := range items { bf.WriteUint32(item.Unk0) bf.WriteUint16(item.Unk1) bf.WriteUint16(item.Unk2) bf.WriteUint16(item.Unk3) bf.WriteUint32(item.Unk4) bf.WriteUint32(item.Unk5) } s.DoAckBufSucceed(pkt.AckHandle, bf.Data()) } func handleMsgMhfAcquireItem(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfAcquireItem) s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4)) }