diff --git a/server/channelserver/handlers_shop_gacha.go b/server/channelserver/handlers_shop_gacha.go index 2648bd889..df993a8ca 100644 --- a/server/channelserver/handlers_shop_gacha.go +++ b/server/channelserver/handlers_shop_gacha.go @@ -264,21 +264,15 @@ func spendGachaCoin(s *Session, quantity uint16) { } } -func handleMsgMhfPlayNormalGacha(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfPlayNormalGacha) - bf := byteframe.NewByteFrame() - var gachaEntries []GachaEntry - var entry GachaEntry - var rewards []GachaItem - var reward GachaItem - var totalWeight float64 - - err := s.server.db.QueryRowx(`SELECT item_type, item_number, rolls FROM gacha_entries WHERE gacha_id = $1 AND entry_type = $2`, pkt.GachaID, pkt.RollType).StructScan(&entry) +func transactGacha(s *Session, gachaID uint32, rollID uint8) (error, int) { + var itemType uint8 + var itemNumber uint16 + var rolls int + err := s.server.db.QueryRowx(`SELECT item_type, item_number, rolls FROM gacha_entries WHERE gacha_id = $1 AND entry_type = $2`, gachaID, rollID).Scan(&itemType, &itemNumber, &rolls) if err != nil { - doAckBufSucceed(s, pkt.AckHandle, make([]byte, 1)) - return + return err, 0 } - switch entry.ItemType { + switch itemType { /* valid types that need manual savedata manipulation: - Ryoudan Points @@ -289,16 +283,30 @@ func handleMsgMhfPlayNormalGacha(s *Session, p mhfpacket.MHFPacket) { - Festa Points */ case 17: - _ = addPointNetcafe(s, int(entry.ItemNumber)*-1) + _ = addPointNetcafe(s, int(itemNumber)*-1) case 19: fallthrough case 20: - spendGachaCoin(s, entry.ItemNumber) + spendGachaCoin(s, itemNumber) case 21: - s.server.db.Exec("UPDATE users u SET frontier_points=frontier_points-$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", entry.ItemNumber, s.charID) + s.server.db.Exec("UPDATE users u SET frontier_points=frontier_points-$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", itemNumber, s.charID) } - rolls := int(entry.Rolls) + return nil, rolls +} +func handleMsgMhfPlayNormalGacha(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfPlayNormalGacha) + bf := byteframe.NewByteFrame() + var gachaEntries []GachaEntry + var entry GachaEntry + var rewards []GachaItem + var reward GachaItem + var totalWeight float64 + err, rolls := transactGacha(s, pkt.GachaID, pkt.RollType) + if err != nil { + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 1)) + return + } entries, err := s.server.db.Queryx(`SELECT id, weight, rarity FROM gacha_entries WHERE gacha_id = $1 AND entry_type = 100 ORDER BY weight DESC`, pkt.GachaID) if err != nil { doAckBufSucceed(s, pkt.AckHandle, make([]byte, 1))