mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 23:44:52 +01:00
230 lines
6.9 KiB
Go
230 lines
6.9 KiB
Go
package channelserver
|
|
|
|
import (
|
|
"encoding/json"
|
|
"erupe-ce/common/byteframe"
|
|
"erupe-ce/common/stringsupport"
|
|
"erupe-ce/network/mhfpacket"
|
|
"time"
|
|
)
|
|
|
|
func handleMsgMhfGetUdTacticsPoint(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsPoint)
|
|
personalPoints := make(map[uint16]int32)
|
|
var totalPoints int32
|
|
var temp []byte
|
|
s.server.db.QueryRow(`SELECT interception_points FROM guild_characters WHERE id=$1`, s.charID).Scan(&temp)
|
|
json.Unmarshal(temp, &personalPoints)
|
|
for _, i := range personalPoints {
|
|
totalPoints += i
|
|
}
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint8(0) // No error
|
|
bf.WriteInt32(totalPoints)
|
|
bf.WriteUint8(uint8(len(personalPoints)))
|
|
for i := range personalPoints {
|
|
bf.WriteUint16(i)
|
|
}
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
func handleMsgMhfAddUdTacticsPoint(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfAddUdTacticsPoint)
|
|
guild, err := GetGuildInfoByCharacterId(s, s.charID)
|
|
if err != nil || guild == nil {
|
|
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
|
|
return
|
|
}
|
|
isApplicant, _ := guild.HasApplicationForCharID(s, s.charID)
|
|
if err != nil || isApplicant {
|
|
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
|
|
return
|
|
}
|
|
var personalPoints map[uint16]int32
|
|
var temp []byte
|
|
s.server.db.QueryRow(`SELECT interception_points FROM guild_characters WHERE id=$1`, s.charID).Scan(&temp)
|
|
json.Unmarshal(temp, &personalPoints)
|
|
if personalPoints == nil {
|
|
personalPoints = make(map[uint16]int32)
|
|
personalPoints[pkt.QuestFileID] = pkt.Points
|
|
} else {
|
|
personalPoints[pkt.QuestFileID] += pkt.Points
|
|
}
|
|
val, _ := json.Marshal(personalPoints)
|
|
s.server.db.Exec(`UPDATE guild_characters SET interception_points=$1 WHERE id=$2`, val, s.charID)
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint8(0) // Unk
|
|
bf.WriteUint8(uint8(len(personalPoints)))
|
|
for i := range personalPoints {
|
|
bf.WriteUint16(i)
|
|
}
|
|
|
|
if pkt.QuestFileID < 58079 || pkt.QuestFileID > 58083 {
|
|
pkt.QuestFileID = 0
|
|
}
|
|
var mapData *InterceptionMaps
|
|
s.server.db.QueryRow(`SELECT interception_maps FROM guilds WHERE id = $1`, guild.ID).Scan(&mapData)
|
|
currID, _ := mapData.CurrPrevID()
|
|
for i := range mapData.Maps {
|
|
if mapData.Maps[i].ID == currID {
|
|
mapData.Maps[i].Points[pkt.QuestFileID] += pkt.Points
|
|
}
|
|
}
|
|
s.server.db.Exec(`UPDATE guilds SET interception_maps = $1 WHERE id = $2`, mapData, guild.ID)
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
type DivaReward struct {
|
|
Points uint32 `db:"points_req"`
|
|
ItemType uint8 `db:"item_type"`
|
|
ItemID uint16 `db:"item_id"`
|
|
Quantity uint16 `db:"quantity"`
|
|
GR bool `db:"gr"`
|
|
Repeatable bool `db:"repeatable"`
|
|
}
|
|
|
|
type DivaRankReward struct {
|
|
Unk0 uint8
|
|
Unk1 uint16
|
|
Unk2 uint16
|
|
MaxRank uint32
|
|
MinRank uint32
|
|
}
|
|
|
|
func handleMsgMhfGetUdTacticsRewardList(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsRewardList)
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint8(0) // No error
|
|
var personalRewards, guildRewards []DivaReward
|
|
var rankRewards []DivaRankReward
|
|
var tempReward DivaReward
|
|
rows, err := s.server.db.Queryx(`SELECT points_req, item_type, item_id, quantity, gr, repeatable FROM diva_prizes WHERE type='personal'`)
|
|
if err == nil {
|
|
for rows.Next() {
|
|
rows.StructScan(&tempReward)
|
|
personalRewards = append(personalRewards, tempReward)
|
|
}
|
|
}
|
|
rows, err = s.server.db.Queryx(`SELECT points_req, item_type, item_id, quantity, gr, repeatable FROM diva_prizes WHERE type='guild'`)
|
|
if err == nil {
|
|
for rows.Next() {
|
|
rows.StructScan(&tempReward)
|
|
guildRewards = append(guildRewards, tempReward)
|
|
}
|
|
}
|
|
bf.WriteUint16(uint16(len(personalRewards)))
|
|
for _, reward := range personalRewards {
|
|
bf.WriteUint32(reward.Points)
|
|
bf.WriteUint8(reward.ItemType)
|
|
bf.WriteUint16(reward.ItemID)
|
|
bf.WriteUint16(reward.Quantity)
|
|
bf.WriteBool(reward.GR)
|
|
bf.WriteBool(reward.Repeatable)
|
|
}
|
|
bf.WriteUint16(uint16(len(guildRewards)))
|
|
for _, reward := range guildRewards {
|
|
bf.WriteUint32(reward.Points)
|
|
bf.WriteUint8(reward.ItemType)
|
|
bf.WriteUint16(reward.ItemID)
|
|
bf.WriteUint16(reward.Quantity)
|
|
bf.WriteBool(reward.GR)
|
|
bf.WriteBool(reward.Repeatable)
|
|
}
|
|
bf.WriteUint16(uint16(len(rankRewards)))
|
|
for _, reward := range rankRewards {
|
|
bf.WriteUint8(reward.Unk0)
|
|
bf.WriteUint16(reward.Unk1)
|
|
bf.WriteUint16(reward.Unk2)
|
|
bf.WriteUint32(reward.MaxRank)
|
|
bf.WriteUint32(reward.MinRank)
|
|
}
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
func handleMsgMhfGetUdTacticsFollower(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsFollower)
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint16(0)
|
|
bf.WriteUint16(0)
|
|
bf.WriteUint16(0)
|
|
bf.WriteUint16(0)
|
|
bf.WriteUint32(0)
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
func handleMsgMhfGetUdTacticsBonusQuest(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsBonusQuest)
|
|
bonusQuests := []struct {
|
|
QuestFileID uint16
|
|
Start time.Time
|
|
End time.Time
|
|
Points uint16
|
|
}{}
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint8(uint8(len(bonusQuests)))
|
|
for _, quest := range bonusQuests {
|
|
bf.WriteUint16(quest.QuestFileID)
|
|
bf.WriteUint32(uint32(quest.Start.Unix()))
|
|
bf.WriteUint32(uint32(quest.End.Unix()))
|
|
bf.WriteUint16(quest.Points)
|
|
}
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
func handleMsgMhfGetUdTacticsFirstQuestBonus(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsFirstQuestBonus)
|
|
bonus := []struct {
|
|
ID uint8
|
|
Points uint32
|
|
}{
|
|
{0, 1500},
|
|
{1, 2000},
|
|
{2, 2500},
|
|
{3, 3000},
|
|
{4, 4500},
|
|
}
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint8(uint8(len(bonus)))
|
|
for i := range bonus {
|
|
bf.WriteUint8(bonus[i].ID)
|
|
bf.WriteUint32(bonus[i].Points)
|
|
}
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
func handleMsgMhfGetUdTacticsRemainingPoint(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsRemainingPoint)
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint32(0) // Points until Special Guild Hall earned
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
func handleMsgMhfGetUdTacticsRanking(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsRanking)
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint32(0) // Own Rank
|
|
bf.WriteUint32(0) // Own Score (Areas)
|
|
bf.WriteBytes(stringsupport.PaddedString("", 32, true))
|
|
bf.WriteUint8(0) // Num other ranks
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|
|
|
|
func handleMsgMhfSetUdTacticsFollower(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfSetUdTacticsFollower)
|
|
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
|
|
}
|
|
|
|
func handleMsgMhfGetUdTacticsLog(s *Session, p mhfpacket.MHFPacket) {
|
|
pkt := p.(*mhfpacket.MsgMhfGetUdTacticsLog)
|
|
bf := byteframe.NewByteFrame()
|
|
bf.WriteUint8(0) // Logs
|
|
// Log format:
|
|
// uint8 LogType, 0=addPoints, 1=tileClaimed, 5=newDate, 6=branchFinished
|
|
// uint8 Unk
|
|
// uint32 CharID
|
|
// []byte CharName[32]
|
|
// uint32 Value
|
|
// uint32 Timestamp
|
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
|
}
|