package crash import ( "server/game" "server/pb" timewheel "github.com/liangdas/mqant/module/modules/timer" ) type Player struct { *game.Player SetAutoCashoutOdd int64 // 客户端设置的值 AutoCashoutOdd int64 // 自动下车生效倍数 IsAutoSettle bool // 是否是自动下车触发的结算 AutoCashoutTimer string } func NewPlayer(player *game.Player) *Player { p := &Player{Player: player} player.MillionSubPlayer = game.NewMillionSubPlayer(player, p) return p } func (p *Player) Reset() { p.IsAutoSettle = false p.AutoCashoutOdd = 0 p.AutoCashoutTimer = "" } func (p *Player) Enter() { p.OnEnter() } func (p *Player) OnEnter() { p.TableInfo() } func (p *Player) TableInfo() { t := p.T.SubTable.(*Table) resp := &pb.CrashMsgTableInfoResp{TableInfo: &pb.GameCommonTableInfo{}} p.PackTableInfo(resp.TableInfo) resp.AutoCashOut = p.SetAutoCashoutOdd if t.Status == pb.GameStatus_GameStatusSettle { resp.Multiple = t.Result } else if t.Status == pb.GameStatus_GameStatusSpecial { resp.Multiple = t.CalOdds() + 100 } p.Send(int(pb.GameProtocol_TableInfoResp), resp) } func (p *Player) Settle() { t := p.T.SubTable.(*Table) odds := GetOdds(int64(t.FlyTime)) shouldSettleCashout := t.Status == pb.GameStatus_GameStatusSpecial // 是否应该结算退出获利 if t.Status == pb.GameStatus_GameStatusSpecial { if p.IsAutoSettle { odds = p.AutoCashoutOdd - 100 } else { odds = t.CalOdds() } } else if p.AutoCashoutOdd-100 <= odds { odds = p.AutoCashoutOdd - 100 shouldSettleCashout = true } if odds <= 0 { shouldSettleCashout = false } if p.AutoCashoutTimer != "" { timewheel.GetTimeWheel().RemoveTimer(p.AutoCashoutTimer) } p.Debug("settle,odds:%v", odds) // 爆炸前结算或者开出jackpot时玩家还未退出,按最高倍数结算 if shouldSettleCashout { p.FinalSettle = (odds + 100) * p.TotalBet / 100 if t.Status == pb.GameStatus_GameStatusSpecial { t.Broadcast(int(pb.CrashProtocol_CrashCashOutResp), &pb.CrashMsgOtherCashOutResp{UID: uint32(p.UID), ODD: odds + 100, Nick: p.Nick}, p.UID) p.Send(int(pb.CrashProtocol_CrashCashOutResp), &pb.CrashMsgOtherCashOutResp{UID: uint32(p.UID), ODD: odds + 100, Nick: p.Nick, Amount: p.FinalSettle}) } } p.Debug("set:%v", p.FinalSettle) p.MillionSubPlayer.Settle() } func (p *Player) Leave() bool { return p.MillionLeave() } func (p *Player) CashOut() { t := p.T if t.Status != pb.GameStatus_GameStatusSpecial { return } p.Player.Settle() } func (p *Player) AutoCashOut() { t := p.T if t.Status != pb.GameStatus_GameStatusSpecial { return } if p.AutoCashoutOdd == 0 { return } p.IsAutoSettle = true p.Player.Settle() }