Merge branch 'main' into feature/gacha-enum

This commit is contained in:
wish
2023-01-23 22:55:22 +11:00
8 changed files with 131 additions and 51 deletions

View File

@@ -1,27 +1,25 @@
package mhfpacket 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"
) )
// MsgMhfStampcardStamp represents the MSG_MHF_STAMPCARD_STAMP // MsgMhfStampcardStamp represents the MSG_MHF_STAMPCARD_STAMP
type MsgMhfStampcardStamp struct { type MsgMhfStampcardStamp struct {
// Field-size accurate.
AckHandle uint32 AckHandle uint32
Unk0 uint16 HR uint16
Unk1 uint16 GR uint16
Unk2 uint16 Stamps uint16
Unk3 uint16 // Hardcoded 0 in binary Reward1 uint16
Unk4 uint32 Reward2 uint16
Unk5 uint32 Item1 uint16
Unk6 uint32 Item2 uint16
Unk7 uint32 Quantity1 uint16
Unk8 uint32 Quantity2 uint16
Unk9 uint32
} }
// Opcode returns the ID associated with this packet type. // Opcode returns the ID associated with this packet type.
@@ -32,16 +30,16 @@ func (m *MsgMhfStampcardStamp) Opcode() network.PacketID {
// Parse parses the packet from binary // Parse parses the packet from binary
func (m *MsgMhfStampcardStamp) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { func (m *MsgMhfStampcardStamp) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32() m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint16() m.HR = bf.ReadUint16()
m.Unk1 = bf.ReadUint16() m.GR = bf.ReadUint16()
m.Unk2 = bf.ReadUint16() m.Stamps = bf.ReadUint16()
m.Unk3 = bf.ReadUint16() _ = bf.ReadUint16()
m.Unk4 = bf.ReadUint32() m.Reward1 = uint16(bf.ReadUint32())
m.Unk5 = bf.ReadUint32() m.Reward2 = uint16(bf.ReadUint32())
m.Unk6 = bf.ReadUint32() m.Item1 = uint16(bf.ReadUint32())
m.Unk7 = bf.ReadUint32() m.Item2 = uint16(bf.ReadUint32())
m.Unk8 = bf.ReadUint32() m.Quantity1 = uint16(bf.ReadUint32())
m.Unk9 = bf.ReadUint32() m.Quantity2 = uint16(bf.ReadUint32())
return nil return nil
} }

View File

@@ -1,18 +1,18 @@
package mhfpacket 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"
) )
// MsgMhfUpdateEtcPoint represents the MSG_MHF_UPDATE_ETC_POINT // MsgMhfUpdateEtcPoint represents the MSG_MHF_UPDATE_ETC_POINT
type MsgMhfUpdateEtcPoint struct { type MsgMhfUpdateEtcPoint struct {
AckHandle uint32 AckHandle uint32
Unk0 uint8 PointType uint8
Unk1 uint16 Delta int16
} }
// Opcode returns the ID associated with this packet type. // Opcode returns the ID associated with this packet type.
@@ -23,8 +23,8 @@ func (m *MsgMhfUpdateEtcPoint) Opcode() network.PacketID {
// Parse parses the packet from binary // Parse parses the packet from binary
func (m *MsgMhfUpdateEtcPoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { func (m *MsgMhfUpdateEtcPoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32() m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint8() m.PointType = bf.ReadUint8()
m.Unk1 = bf.ReadUint16() m.Delta = bf.ReadInt16()
return nil return nil
} }

View File

@@ -0,0 +1,9 @@
BEGIN;
ALTER TABLE characters ADD bonus_quests INT NOT NULL DEFAULT 0;
ALTER TABLE characters ADD daily_quests INT NOT NULL DEFAULT 0;
ALTER TABLE characters ADD promo_points INT NOT NULL DEFAULT 0;
END;

View File

@@ -0,0 +1,5 @@
BEGIN;
ALTER TABLE characters ADD stampcard INT NOT NULL DEFAULT 0;
END;

View File

@@ -1502,25 +1502,74 @@ func handleMsgMhfInfoScenarioCounter(s *Session, p mhfpacket.MHFPacket) {
func handleMsgMhfGetEtcPoints(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfGetEtcPoints(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfGetEtcPoints) pkt := p.(*mhfpacket.MsgMhfGetEtcPoints)
resp := byteframe.NewByteFrame() var dailyTime time.Time
resp.WriteUint8(0x3) // Maybe a count of uint32(s)? _ = s.server.db.QueryRow("SELECT COALESCE(daily_time, $2) FROM characters WHERE id = $1", s.charID, time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)).Scan(&dailyTime)
resp.WriteUint32(0) // Point bonus quests if Time_Current_Adjusted().After(dailyTime) {
resp.WriteUint32(0) // Daily quests s.server.db.Exec("UPDATE characters SET bonus_quests = 0, daily_quests = 0 WHERE id=$1", s.charID)
resp.WriteUint32(0) // HS promotion points }
var bonusQuests, dailyQuests, promoPoints uint32
_ = s.server.db.QueryRow(`SELECT bonus_quests, daily_quests, promo_points FROM characters WHERE id = $1`, s.charID).Scan(&bonusQuests, &dailyQuests, &promoPoints)
resp := byteframe.NewByteFrame()
resp.WriteUint8(3) // Maybe a count of uint32(s)?
resp.WriteUint32(bonusQuests)
resp.WriteUint32(dailyQuests)
resp.WriteUint32(promoPoints)
doAckBufSucceed(s, pkt.AckHandle, resp.Data()) doAckBufSucceed(s, pkt.AckHandle, resp.Data())
} }
func handleMsgMhfUpdateEtcPoint(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfUpdateEtcPoint(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfUpdateEtcPoint) pkt := p.(*mhfpacket.MsgMhfUpdateEtcPoint)
doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
var column string
switch pkt.PointType {
case 0:
column = "bonus_quests"
case 1:
column = "daily_quests"
case 2:
column = "promo_points"
}
var value int
err := s.server.db.QueryRow(fmt.Sprintf(`SELECT %s FROM characters WHERE id = $1`, column), s.charID).Scan(&value)
if err == nil {
if value-int(pkt.Delta) < 0 {
s.server.db.Exec(fmt.Sprintf(`UPDATE characters SET %s = 0 WHERE id = $1`, column), s.charID)
} else {
s.server.db.Exec(fmt.Sprintf(`UPDATE characters SET %s = %s + $1 WHERE id = $2`, column, column), pkt.Delta, s.charID)
}
}
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
} }
func handleMsgMhfStampcardStamp(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfStampcardStamp(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfStampcardStamp) pkt := p.(*mhfpacket.MsgMhfStampcardStamp)
// TODO: Work out where it gets existing stamp count from, its format and then bf := byteframe.NewByteFrame()
// update the actual sent values to be correct bf.WriteUint16(pkt.HR)
doAckBufSucceed(s, pkt.AckHandle, []byte{0x03, 0xe7, 0x03, 0xe7, 0x02, 0x99, 0x02, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x14, 0xf8, 0x69, 0x54}) bf.WriteUint16(pkt.GR)
var stamps uint16
_ = s.server.db.QueryRow(`SELECT stampcard FROM characters WHERE id = $1`, s.charID).Scan(&stamps)
bf.WriteUint16(stamps)
stamps += pkt.Stamps
bf.WriteUint16(stamps)
s.server.db.Exec(`UPDATE characters SET stampcard = $1 WHERE id = $2`, stamps, s.charID)
if stamps%30 == 0 {
bf.WriteUint16(2)
bf.WriteUint16(pkt.Reward2)
bf.WriteUint16(pkt.Item2)
bf.WriteUint16(pkt.Quantity2)
addWarehouseGift(s, "item", mhfpacket.WarehouseStack{ItemID: pkt.Item2, Quantity: pkt.Quantity2})
} else if stamps%15 == 0 {
bf.WriteUint16(1)
bf.WriteUint16(pkt.Reward1)
bf.WriteUint16(pkt.Item1)
bf.WriteUint16(pkt.Quantity1)
addWarehouseGift(s, "item", mhfpacket.WarehouseStack{ItemID: pkt.Item1, Quantity: pkt.Quantity1})
} else {
bf.WriteBytes(make([]byte, 8))
}
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
} }
func handleMsgMhfStampcardPrize(s *Session, p mhfpacket.MHFPacket) {} func handleMsgMhfStampcardPrize(s *Session, p mhfpacket.MHFPacket) {}

View File

@@ -52,20 +52,20 @@ func handleMsgMhfCheckDailyCafepoint(s *Session, p mhfpacket.MHFPacket) {
s.logger.Fatal("Failed to get daily_time savedata from db", zap.Error(err)) s.logger.Fatal("Failed to get daily_time savedata from db", zap.Error(err))
} }
var bondBonus, pointBonus, dailyQuests uint32 var bondBonus, bonusQuests, dailyQuests uint32
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
if t.After(dailyTime) { if t.After(dailyTime) {
addPointNetcafe(s, 5) addPointNetcafe(s, 5)
s.server.db.Exec("UPDATE characters SET daily_time=$1 WHERE id=$2", midday, s.charID) bondBonus = 5 // Bond point bonus quests
bonusQuests = 3 // HRP bonus quests?
dailyQuests = 1 // Daily quests
s.server.db.Exec("UPDATE characters SET daily_time=$1, bonus_quests = $2, daily_quests = $3 WHERE id=$4", midday, bonusQuests, dailyQuests, s.charID)
bf.WriteBool(true) // Success? bf.WriteBool(true) // Success?
bondBonus = 5 // Bond point bonus quests
pointBonus = 3 // HRP bonus quests?
dailyQuests = 1 // Daily quests
} else { } else {
bf.WriteBool(false) bf.WriteBool(false)
} }
bf.WriteUint32(bondBonus) bf.WriteUint32(bondBonus)
bf.WriteUint32(pointBonus) bf.WriteUint32(bonusQuests)
bf.WriteUint32(dailyQuests) bf.WriteUint32(dailyQuests)
doAckBufSucceed(s, pkt.AckHandle, bf.Data()) doAckBufSucceed(s, pkt.AckHandle, bf.Data())
} }

File diff suppressed because one or more lines are too long

View File

@@ -158,7 +158,9 @@ func handleMsgSysEnterStage(s *Session, p mhfpacket.MHFPacket) {
if s.stageID == "" { if s.stageID == "" {
s.stageMoveStack.Set(pkt.StageID) s.stageMoveStack.Set(pkt.StageID)
} else { } else {
s.stage.Lock()
s.stage.reservedClientSlots[s.charID] = false s.stage.reservedClientSlots[s.charID] = false
s.stage.Unlock()
s.stageMoveStack.Push(s.stageID) s.stageMoveStack.Push(s.stageID)
s.stageMoveStack.Lock() s.stageMoveStack.Lock()
} }