From d92c2e1a43abba866c8bcd3f24d807c787c3f5bc Mon Sep 17 00:00:00 2001 From: tomas Date: Tue, 22 Oct 2024 16:03:23 +0800 Subject: [PATCH] fix coin --- gamesrv/base/slots.go | 3 + .../fortunedragon/playerdata_fortunedragon.go | 9 +- .../scenepolicy_fortunedragon.go | 117 ++++++++++++++++-- .../scenepolicy_fortunerabbit.go | 7 +- gamesrv/slotspkg/assemble/struct_.go | 1 + gamesrv/slotspkg/slots/handler.go | 5 + 6 files changed, 133 insertions(+), 9 deletions(-) diff --git a/gamesrv/base/slots.go b/gamesrv/base/slots.go index 4a02be3..e0d1e2b 100644 --- a/gamesrv/base/slots.go +++ b/gamesrv/base/slots.go @@ -43,6 +43,9 @@ func (s *SlotsSession) UID() uint64 { func (s *SlotsSession) Coin() int64 { return atomic.LoadInt64(&s.coin) } +func (s *SlotsSession) SetCoin(coin int64) { + s.coin = coin +} func (s *SlotsSession) Set(key string, value interface{}) { s.Lock() defer s.Unlock() diff --git a/gamesrv/fortunedragon/playerdata_fortunedragon.go b/gamesrv/fortunedragon/playerdata_fortunedragon.go index f262ac7..e65dd97 100644 --- a/gamesrv/fortunedragon/playerdata_fortunedragon.go +++ b/gamesrv/fortunedragon/playerdata_fortunedragon.go @@ -15,13 +15,20 @@ type FortuneDragonPlayerData struct { BetLevelIndex int64 `json:"bli"` //选中的等级下标 BetLineIndex int64 `json:"bii"` //选中的线数下标 BetMode int64 `json:"bm,optional"` //0.常规 1.必中 + + taxCoin int64 + winCoin int64 + currentLogId string + totalBet int64 } func (p *FortuneDragonPlayerData) init() { p.SlotsSession = base.NewSession(uint64(p.SnId), p.Coin*gamerule.NowByte) } func (p *FortuneDragonPlayerData) Clear() { - + p.taxCoin = 0 + p.winCoin = 0 + p.currentLogId = "" } // 需要带到world上进行数据处理 diff --git a/gamesrv/fortunedragon/scenepolicy_fortunedragon.go b/gamesrv/fortunedragon/scenepolicy_fortunedragon.go index 6255f9c..b44c3ab 100644 --- a/gamesrv/fortunedragon/scenepolicy_fortunedragon.go +++ b/gamesrv/fortunedragon/scenepolicy_fortunedragon.go @@ -2,6 +2,7 @@ package fortunedragon import ( "encoding/json" + "mongo.games.com/game/protocol/server" "time" "mongo.games.com/goserver/core" @@ -91,6 +92,7 @@ func (this *ScenePolicyFortuneDragon) OnPlayerEnter(s *base.Scene, p *base.Playe //json.Unmarshal(d.Data.([]byte), &m) playerEx.PullPlayer(m) } + playerEx.SlotsSession.SetCoin(playerEx.Coin * fortunedragon.NowByte) playerEx.Clear() @@ -109,11 +111,6 @@ func (this *ScenePolicyFortuneDragon) OnPlayerLeave(s *base.Scene, p *base.Playe return } logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerLeave, sceneId=", s.GetSceneId(), " player=", p.SnId) - if sceneEx, ok := s.ExtraData.(*FortuneDragonSceneData); ok { - s.FirePlayerEvent(p, base.PlayerEventLeave, nil) - sceneEx.OnPlayerLeave(p, reason) - } - if playerEx, ok := p.ExtraData.(*FortuneDragonPlayerData); ok { m := playerEx.PushPlayer() if m != nil && len(m) > 0 { @@ -130,6 +127,10 @@ func (this *ScenePolicyFortuneDragon) OnPlayerLeave(s *base.Scene, p *base.Playe } } } + if sceneEx, ok := s.ExtraData.(*FortuneDragonSceneData); ok { + s.FirePlayerEvent(p, base.PlayerEventLeave, nil) + sceneEx.OnPlayerLeave(p, reason) + } } // 玩家掉线 @@ -375,6 +376,11 @@ func (this *SceneStateStartFortuneDragon) OnPlayerOp(s *base.Scene, p *base.Play playerEx.BetLevelIndex = params[1] playerEx.BetLineIndex = params[2] playerEx.BetMode = params[3] + + logger.Logger.Trace("playerEx.Coin", playerEx.Coin) + playerEx.SlotsSession.SetCoin(playerEx.Coin * fortunedragon.NowByte) + + logger.Logger.Trace("coin.... ", playerEx.SlotsSession.Coin()) //get data Response, err := slots.SlotsMgrSington.Play(playerEx.SlotsSession, &base.SpinReq{ GameId: int64(sceneEx.GameId), @@ -385,11 +391,42 @@ func (this *SceneStateStartFortuneDragon) OnPlayerOp(s *base.Scene, p *base.Play Ts: time.Now().Unix(), }) var gameEndStr string + var data assemble.GameEnd if err == nil { - data := assemble.DataToCli(Response).(assemble.GameEnd) + data = assemble.DataToCli(Response).(assemble.GameEnd) + if data.Results[0].FreeStatus == 1 || data.Results[0].FreeNumMax == 0 { + logger.Logger.Error("bet....", -data.TotalBet) + //第一次触发或者正常模式 + playerEx.AddCoin(int64(-data.TotalBet), common.GainWay_HundredSceneLost, base.SyncFlag_ToClient, "system", s.GetSceneName()) + playerEx.totalBet = int64(data.TotalBet) + } + var taxCoin float64 + if data.RoundReward > 0 { + //税收比例 + taxRate := sceneEx.GetDBGameFree().GetTaxRate() + if taxRate < 0 || taxRate > 10000 { + taxRate = 500 + } + taxCoin = data.RoundReward * float64(taxRate) / 10000 + data.RoundReward = data.RoundReward - taxCoin + playerEx.AddServiceFee(int64(taxCoin)) + playerEx.taxCoin = int64(taxCoin) + playerEx.winCoin = int64(data.RoundReward) + } pi, _ := json.Marshal(data) gameEndStr = string(pi) - playerEx.Coin = Response.Coin + + if data.Results[0].FreeStatus == 3 || data.Results[0].FreeNumMax == 0 { + logger.Logger.Error("win....", data.RoundReward) + playerEx.AddCoin(int64(data.RoundReward), common.GainWay_HundredSceneWin, 0, "system", s.GetSceneName()) + //免费游戏结束或者正常模式 + sceneEx.StaticsLaba(&base.StaticLabaParam{ + SnId: playerEx.SnId, + Gain: int64(data.RoundReward - data.TotalBet), + GainTax: int64(taxCoin), + IsAddTimes: true, + }) + } } else { logger.Logger.Error("slots Play err:", err) } @@ -400,6 +437,13 @@ func (this *SceneStateStartFortuneDragon) OnPlayerOp(s *base.Scene, p *base.Play proto.SetDefaults(pack) logger.Logger.Trace("SCFortuneDragonBilled", pack.String()) playerEx.SendToClient(int(protocol.FortuneDragonPID_PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONBILLED), pack) + + if playerEx.Coin != int64(data.FinalCoin) { + logger.Logger.Error("==========playerEx.Coin != Response.Coin==============", playerEx.Coin, data.FinalCoin) + } + + // 记录本次操作 + FortunedragonAndSaveLog(sceneEx, playerEx, data) } } } @@ -434,7 +478,66 @@ func (this *ScenePolicyFortuneDragon) GetSceneState(s *base.Scene, stateid int) } return nil } +func FortunedragonAndSaveLog(sceneEx *FortuneDragonSceneData, playerEx *FortuneDragonPlayerData, data assemble.GameEnd) { + if !playerEx.IsRob { + data.SnId = playerEx.SnId + info, err := model.MarshalGameNoteByROLL(data) + if err == nil { + logid, _ := model.AutoIncGameLogId() + playerEx.currentLogId = logid + sceneEx.SaveGameDetailedLog(logid, info, &base.GameDetailedParam{}) + totalin := playerEx.totalBet + totalout := int64(data.RoundReward) + playerEx.taxCoin + totalin + validFlow := totalin + totalout + validBet := common.AbsI64(totalin - totalout) + logParam := &base.SaveGamePlayerListLogParam{ + Platform: playerEx.Platform, + Channel: playerEx.Channel, + Promoter: playerEx.BeUnderAgentCode, + PackageTag: playerEx.PackageID, + InviterId: playerEx.InviterId, + LogId: logid, + TotalIn: totalin, + TotalOut: totalout, + TaxCoin: playerEx.taxCoin, + BetAmount: playerEx.totalBet, + WinAmountNoAnyTax: int64(data.RoundReward) + playerEx.taxCoin, + ValidBet: validBet, + ValidFlow: validFlow, + IsFirstGame: sceneEx.IsPlayerFirst(playerEx.Player), + } + sceneEx.SaveGamePlayerListLog(playerEx.SnId, logParam) + } + } + //统计输下注金币数 + if !sceneEx.Testing && !playerEx.IsRob { + playerBet := &server.PlayerData{ + SnId: proto.Int32(playerEx.SnId), + Bet: proto.Int64(playerEx.CurrentBet), + Gain: proto.Int64(int64(data.RoundReward) + playerEx.taxCoin), + Tax: proto.Int64(playerEx.taxCoin), + Coin: proto.Int64(playerEx.GetCoin()), + GameCoinTs: proto.Int64(playerEx.GameCoinTs), + } + gwPlayerBet := &server.GWPlayerData{ + SceneId: sceneEx.SceneId, + GameFreeId: proto.Int32(sceneEx.GetDBGameFree().GetId()), + } + gwPlayerBet.Datas = append(gwPlayerBet.Datas, playerBet) + sceneEx.SyncPlayerDatas(&base.PlayerDataParam{ + HasRobotGaming: false, + Data: gwPlayerBet, + }) + } + + playerEx.taxCoin = 0 + playerEx.winCoin = 0 + + if sceneEx.CheckNeedDestroy() && data.Results[0].FreeNum <= 0 { + sceneEx.PlayerLeave(playerEx.Player, common.PlayerLeaveReason_OnDestroy, true) + } +} func init() { //主状态 ScenePolicyFortuneDragonSington.RegisteSceneState(&SceneStateStartFortuneDragon{}) diff --git a/gamesrv/fortunerabbit/scenepolicy_fortunerabbit.go b/gamesrv/fortunerabbit/scenepolicy_fortunerabbit.go index 7739e7a..bd90277 100644 --- a/gamesrv/fortunerabbit/scenepolicy_fortunerabbit.go +++ b/gamesrv/fortunerabbit/scenepolicy_fortunerabbit.go @@ -90,6 +90,8 @@ func (this *ScenePolicyFortuneRabbit) OnPlayerEnter(s *base.Scene, p *base.Playe playerEx.PullPlayer(m) } + playerEx.SlotsSession.SetCoin(playerEx.Coin * fortunerabbit.NowByte) + playerEx.Clear() sceneEx.players[p.SnId] = playerEx @@ -373,6 +375,9 @@ func (this *SceneStateStartFortuneRabbit) OnPlayerOp(s *base.Scene, p *base.Play playerEx.BetLevelIndex = params[1] playerEx.BetLineIndex = params[2] //playerEx.BetMode = params[3] + + playerEx.SlotsSession.SetCoin(playerEx.Coin * fortunerabbit.NowByte) + //get data Response, err := slots.SlotsMgrSington.Play(playerEx.SlotsSession, &base.SpinReq{ GameId: int64(sceneEx.GameId), @@ -387,7 +392,7 @@ func (this *SceneStateStartFortuneRabbit) OnPlayerOp(s *base.Scene, p *base.Play data := assemble.DataToCli(Response).(assemble.GameEnd) pi, _ := json.Marshal(data) gameEndStr = string(pi) - playerEx.Coin = Response.Coin + playerEx.Coin = int64(data.FinalCoin) } else { logger.Logger.Error("slots Play err:", err) } diff --git a/gamesrv/slotspkg/assemble/struct_.go b/gamesrv/slotspkg/assemble/struct_.go index b09598a..b0fa434 100644 --- a/gamesrv/slotspkg/assemble/struct_.go +++ b/gamesrv/slotspkg/assemble/struct_.go @@ -40,6 +40,7 @@ type GameEnd struct { FinalCoin float64 `json:"final_coin"` //结束 ActualBet float64 `json:"-"` ActualWin float64 `json:"-"` + SnId int32 `json:"snid,omitempty"` } type BetConfig struct { BetChangeList []float64 `json:"bet_change_list"` diff --git a/gamesrv/slotspkg/slots/handler.go b/gamesrv/slotspkg/slots/handler.go index 83f9f32..c63bdc3 100644 --- a/gamesrv/slotspkg/slots/handler.go +++ b/gamesrv/slotspkg/slots/handler.go @@ -19,6 +19,8 @@ func (sm *SlotsMgr) Enter(s *base.SlotsSession, gameId int64) (*cli.SlotsEnterRe logger.Logger.Error("[slotsMgr.Enter] gameId not exist") return nil, errors.New("gameId not exist") } + + player.Get(s).Book.Coin.Set(s.Coin()) player.Init(s) @@ -74,6 +76,9 @@ func (sm *SlotsMgr) Play(s *base.SlotsSession, req *base.SpinReq) (*cli.SlotsPla logger.Logger.Error("[slotsMgr.play] msg.BetLevelIndex < 0") return nil, errors.New("msg.BetLevelIndex < 0") } + + player.Get(s).Book.Coin.Set(s.Coin()) + theme := key.GameMap[uint(req.GameId)] m := machine.NewMachine(s, theme, DataSet(s).Shell, false) if m == nil {